From 550c517d70ca2ed472ac1a5c3b203c69e12a1707 Mon Sep 17 00:00:00 2001 From: James Rich <2199651+jamesarich@users.noreply.github.com> Date: Wed, 13 May 2026 16:45:25 -0500 Subject: [PATCH 01/78] chore(deps): batch bump KSP, Wire, CMP, Material (#5447) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- gradle/libs.versions.toml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e8f8d93fd..16beff7ab 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -36,7 +36,7 @@ turbine = "1.2.1" compose-screenshot = "0.0.1-alpha14" # Compose Multiplatform -compose-multiplatform = "1.11.0-rc01" +compose-multiplatform = "1.11.0" compose-multiplatform-material3 = "1.11.0-alpha07" # `androidx-compose-bom-aligned` tracks androidx.compose.{runtime,ui,foundation,animation} # artifacts that ship in lockstep with CMP. Kept as a separate version ref so Renovate @@ -73,7 +73,7 @@ datadog-gradle = "1.26.0" dd-sdk-android = "3.9.1" detekt = "2.0.0-alpha.3" dokka = "2.2.0" -devtools-ksp = "2.3.7" +devtools-ksp = "2.3.8" firebase-crashlytics-gradle = "3.0.7" google-services-gradle = "4.4.4" markdownRenderer = "0.40.2" @@ -81,7 +81,7 @@ okio = "3.17.0" uri-kmp = "0.0.21" osmdroid-android = "6.1.20" spotless = "8.4.0" -wire = "6.2.0" +wire = "6.3.0" vico = "3.2.0-next.4" kable = "0.42.0" mqttastic = "0.3.6" @@ -228,7 +228,7 @@ dokka-android-documentation-plugin = { module = "org.jetbrains.dokka:android-doc markdown-renderer = { module = "com.mikepenz:multiplatform-markdown-renderer", version.ref = "markdownRenderer" } markdown-renderer-m3 = { module = "com.mikepenz:multiplatform-markdown-renderer-m3", version.ref = "markdownRenderer" } markdown-renderer-android = { module = "com.mikepenz:multiplatform-markdown-renderer-android", version.ref = "markdownRenderer" } -material = { module = "com.google.android.material:material", version = "1.13.0" } +material = { module = "com.google.android.material:material", version = "1.14.0" } kable-core = { module = "com.juul.kable:kable-core", version.ref = "kable" } meshtastic-mqtt-client = { module = "org.meshtastic:mqtt-client", version.ref = "mqttastic" } From 8d61d22e93bec5afae021fdf2d64bca58dc57d67 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 14 May 2026 06:08:40 -0500 Subject: [PATCH 02/78] chore(deps): update com.juul.kable:kable-core to v0.43.0 (#5449) --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 16beff7ab..9e1c3909e 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -83,7 +83,7 @@ osmdroid-android = "6.1.20" spotless = "8.4.0" wire = "6.3.0" vico = "3.2.0-next.4" -kable = "0.42.0" +kable = "0.43.0" mqttastic = "0.3.6" jmdns = "3.6.3" qrcode-kotlin = "4.5.0" From 13865e7c8b7f9a47cd3b572bd44d8ec355b2d3a9 Mon Sep 17 00:00:00 2001 From: James Rich <2199651+jamesarich@users.noreply.github.com> Date: Thu, 14 May 2026 06:10:23 -0500 Subject: [PATCH 03/78] chore: Scheduled updates (Firmware, Hardware, Translations, Graphs) (#5438) Co-authored-by: github-merge-queue <118344674+github-merge-queue@users.noreply.github.com> --- .../composeResources/values-ru/strings.xml | 1 + .../composeResources/values-sv/strings.xml | 115 ++++++++++++++++++ 2 files changed, 116 insertions(+) diff --git a/core/resources/src/commonMain/composeResources/values-ru/strings.xml b/core/resources/src/commonMain/composeResources/values-ru/strings.xml index 0db487384..dd490341f 100644 --- a/core/resources/src/commonMain/composeResources/values-ru/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-ru/strings.xml @@ -363,6 +363,7 @@ Настройки Ethernet Ethernet включен Ethernet IP: + Добро пожаловать на военные сборы! 💀 Добро пожаловать на охоту на лис! 📻 Добро пожаловать на масленицу! 🥞 Обменяться местоположением diff --git a/core/resources/src/commonMain/composeResources/values-sv/strings.xml b/core/resources/src/commonMain/composeResources/values-sv/strings.xml index d5a8c20e9..d3f2c8291 100644 --- a/core/resources/src/commonMain/composeResources/values-sv/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-sv/strings.xml @@ -16,11 +16,19 @@ ~ along with this program. If not, see . --> + %1$s: %2$s + Meddelande från %1$s: %2$s Acceptera Bekräftelser + Kopiera meddelande Ta bort meddelande + Reagera med emoji Välj enhet + Välj meddelanden + Välj nätverk + Skicka svar + Visa meddelandestatus Åtgärder Lägg till @@ -28,6 +36,8 @@ Lägg till i favoriter Lägg till lager Lägg till + Lägg till enhet manuellt… + Lägg till nätverkslager Adress Admin-nyckel Admin-nycklar @@ -70,6 +80,7 @@ Inställningar för ljud Tillgängliga pin Tillbaka + Säkerhetskopiera & återställ Dålig Bandbredd Tryck @@ -83,6 +94,9 @@ Bluetooth-inställningar Bluetooth är aktiverad Konfiguration + Hantera enhetsinställningarna och kanalerna trådlöst + Upptäckt + Hitta och identifiera Meshtastic-enheter nära dig. Bluetooth Fetstil för rubriktext Inställningar @@ -115,6 +129,7 @@ Kanal-URL Kanaler Chirpy + Kontrastnivå Välj tema Detta kommer att ta bort %1$d noder från din databas. Denna åtgärd kan inte ångras. @@ -125,12 +140,14 @@ Rensa endast okända noder Rensa Avmarkera + Ta bort tidszon Meddelande från enheten Stäng Stäng markerade CODEC 2 aktiverat CODEC2 samplingshastighet Kodningshastighet + Minimera diagram Kommunicera med din släkt och dina vänner utan online- och mobiltjänster. Riktning: %1$s @@ -142,6 +159,7 @@ Kompassens norrläge uppåt Kompassriktning Kompass + Uppskattat område: okänd noggrannhet Läkta nycklar upptäcktes, välj OK för att återskapa. Dubbelklick på supporterad accelerometer räknas som användarknapp. @@ -177,16 +195,22 @@ Enheten hanteras av en mesh-administratör. Användaren kan inte ändra enhetsinställningarna. Används för att skapa en delad nyckel med en fjärrnod. Seriell kommunikation över Stream API. + Ställ in Bluetooth-behörigheter Konfigurera kritiska larm Konfigurera platsbehörigheter Konfigurera aviseringsbehörigheter Anslut + Anslut till en radio för att hantera fjärrnoder. Ansluten Ansluten enhet Ansluten till radioenhet, men den är i sovläge Ansluter Aktuella anslutningar: Anslutning + Kontrast + Hög + Medel + Förval Konversationer Kopiera Skapa egna nätverk @@ -220,6 +244,7 @@ Rensa sökning Nästa träff Föregående träff + Inaktivera för att inte spara nätloggar till disk Spara meshnätsloggar Förvald @@ -233,9 +258,13 @@ Ta bort meddelanden? Radera markerade Sändning bekräftad + Enheten kan koppla bort och starta om medan inställningar tillämpas. + Demoläge rensa filtrering av noder Beskrivning Meshtastic + Avsluta + Visa Meshtastic Detaljer Detekteringssensor Inställningar för detekteringssensor @@ -245,10 +274,15 @@ Konfiguration av enhet Gräns för enhetens DB-cache Enhetens GPS + %1$s: %2$s Enhetens mätvärden + %1$s + %1$s: %2$s%% Uppdateringsintervall för enhetsdata + %1$s: %2$s V Enheten i sovläge Skicka enhetstelemetri + Tema: %1$s, Språk: %2$s Daggpunkt Direktmeddelande Knapp för direktmeddelanden @@ -270,10 +304,12 @@ Visa avståndet mellan din telefon och andra Meshtastic noder med kända positioner. DNS Klart + Visa inte igen för denna enhet Dubbeltryck som knapptryck Nedlänk aktiverad Meddelanden från en offentlig internetgateway vidarebefordras till det lokala nätverket. På grund av noll-hopp-policyn kommer trafiken från standardservern MQTT inte att sprida sig längre än den här enheten. Ladda ner + Dubblett publik nyckel upptäckt Dynamisk Konfigurera enkelt privata nätverk för säker och tillförlitlig kommunikation i avlägsna områden. Eko aktiverad @@ -312,19 +348,23 @@ Externa aviseringar aktiverad Återställ till standardinställningar Ok + Meshtastic %1$s Favorit Lägg till '%1$s' som en favoritnod? Ta bort '%1$s' som en favoritnod? + Tillgängliga filer (%1$d): Inaktivera filtrering Aktivera filtrering Aktivera filtrering Dölj meddelanden som innehåller filterord + Dölj %1$d filtrerade Filter Filtrerad Inga filterord konfigurerade Regex-mönster Meddelandefilter + Visa %1$d filtrerade Matcha hela ord Filtrera ord Meddelanden som innehåller dessa ord kommer att döljas @@ -444,6 +484,7 @@ IPv4-läge JSON-utdata aktiverad + Lite - Fast Lång räckvidd - snabbt Lång räckvidd - måttligt Lång räckvidd - långsamt @@ -463,12 +504,20 @@ LED pulsering LED-läge Äldre typ av adminkanal + Licensierad radioamatör (ham) Aktivering detta alternativ inaktiverar kryptering och är inte kompatibelt med standard Meshtastic-nätverk. Ladda + Ladda 15 min + Ladda 1 min + Ladda 5 min Ladda %1$d Laddar + Batteri: %1$d% + Diagnostik: %1$s + Trafik: TX %1$d / RX %2$d (D: %3$d) + Upptid: %1$s Platsåtkomst är avstängd, kan inte leverera position till meshnätverket. Positionsdelning Låst @@ -506,6 +555,7 @@ Nedladdning slutförd med %1$d fel Ladda ner region Kartfilter\n + Kartalager stödjer .kml, .kmz och GeoJSON format. Offline-hanterare SQL-cache rensning misslyckades, se logcat för detaljer SQL-cache rensad för %1$s @@ -560,8 +610,11 @@ MQTT-konfiguration MQTT är aktiverat Anslutningen misslyckades + Nåbara (%1$s) Ansluten + Ansluter... Frånkopplad + Inaktiv Testa anslutningen Du måste ställa in en region! Du måste uppdatera detta program i app-butiken (eller Github). Det är för gammalt för att prata med denna radioenhet. Läs vår dokumentation i detta ämne. @@ -626,6 +679,7 @@ Ingen (inaktivera) Ingen Ej ansluten + Anteckning Anteckningar Meshtastic använder aviseringar för att hålla dig uppdaterad om nya meddelanden och andra viktiga händelser. Du kan uppdatera dina aviseringsbehörigheter när som helst från inställningar. @@ -649,6 +703,7 @@ Endast favoriter Visa kompass Öppna inställningar + Öppet källkods bibliotek Alternativ Orientera mot norr @@ -676,6 +731,14 @@ %1$d timme %1$d timmar + + %1$d minut + %1$d minuter + + + %1$d sekund + %1$d sekunder + Plats Ställ in från aktuell telefonplats @@ -697,6 +760,10 @@ Tryck och dra för att ändra ordning Tryck + Sidfot + Gradient + Rubrik + Text Primär Periodisk sändning av position och telemetri Privat nyckel @@ -717,6 +784,8 @@ Visa snabbchattsmenyn Strålning Konfiguration av radioenhet + Regn (1h) + Regn (24h) Räckvidd Räckvidstest konfiguration Räckvidstest aktiverat @@ -732,9 +801,15 @@ Endast för SENSOR, TRACKER och TAK_TRACKER. Stoppar all annan vidarebefordran av meddelanden. Senaste nätverksenheterna Rött + Uppdatera + Uppdatera metadata Är du säker på att du vill skapa ny privat nyckel?\n\nNoder som tidigare har bytt nycklar med den här noden måste ta bort den gamla anslutningen och utbyta nycklar på nytt för att kunna återuppta säker kommunikation. Förnya nyckel Region + + Hört %1$d relä + Hört %1$d reläer + Fjärr Fjärradministration @@ -745,6 +820,7 @@ Ta bort Ta bort från Favoriter + Rensa filter Ta bort från ignorerade Ta bort lager Denna nod kommer att tas bort från din lista till dess att din nod tar emot data från den igen. @@ -767,6 +843,8 @@ Återställ till standardinställningar Försök igen Ringsignal + Filen är tom + Importerad ringsignal Enhetens roll Hantera paket till och från favoritnoder som ROUTER_LATE och alla andra paket som CLIENT. @@ -811,12 +889,16 @@ Exportera räckviddspaket Sök + Söker efter Bluetooth-enheter Skanna kanalen med NFC Skanna kanalens QR-kod + Sök efter nätverksenheter Skanna NFC Placera din enhet nära NFC-taggen för att skanna. Skanna delad kontakt via NFC Skanna delad kontakts QR-kod + Söker... + Söker... Håll skärmen tänd Gå till slutet Sekundär @@ -854,6 +936,8 @@ Seriell konsol Seriell aktiverad Seriellt läge + RX + TX Server Ange din region inställningar @@ -893,15 +977,38 @@ Statusmeddelande Inställningar för statusmeddelande Håll dig uppkopplad var som helst + Lyckades Tid för djup strömsparläge Stöds Stöds av Meshtastic Community RX förstärkt gain Systeminställningar + TAK (ATAK) + TAK inställning + Spaning + Huvudkvarter + Voffsing + Sjukvårdare + Signalist + Prickskytt + Gruppledare + Gruppmedlem + Ospecificerad + Lagfärg Blått + Brun + Turkos + Mörkblå + Mörkgrön Grönt + Magenta + Orange + Lila Rött + Ospecificerad + Vit + Gul Telemetri Telemetri konfiguration Temp @@ -939,6 +1046,8 @@ Modul aktiverad Skicka över LoRa BLE + TCP + USB 24T 48 timmar 2V @@ -970,6 +1079,7 @@ URL kan inte vara odefinierad. URL måste innehålla platshållare. URL-mall + USB Använd 12-timmarsformat Använd I2S som summer @@ -1003,6 +1113,11 @@ WiFi-alternativ WiFi är aktiverat Wifi IP: + Hittade inga nätverk + Misslyckades med att söka efter WiFi-nätverk: %1$s + Sök efter nätverk + Söker efter enhet … + Söker... Klart IP-adress Användarnamn From c0b69097419a7d9c90527729747fc91135628282 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 14 May 2026 06:11:26 -0500 Subject: [PATCH 04/78] docs: update CHANGELOG.md (#5448) --- CHANGELOG.md | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cdcebdcd1..7a125591b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,16 +9,20 @@ See [GitHub Releases](https://github.com/meshtastic/Meshtastic-Android/releases) ### Unreleased (not yet in any build) +* chore: Scheduled updates (Firmware, Hardware, Translations, Graphs) (#5438) by @James Rich in [`13865e7c8`](https://github.com/meshtastic/Meshtastic-Android/commit/13865e7c8b7f9a47cd3b572bd44d8ec355b2d3a9) +* chore(deps): update com.juul.kable:kable-core to v0.43.0 (#5449) by @renovate[bot] in [`8d61d22e9`](https://github.com/meshtastic/Meshtastic-Android/commit/8d61d22e93bec5afae021fdf2d64bca58dc57d67) +* chore(deps): batch bump KSP, Wire, CMP, Material (#5447) by @James Rich in [`550c517d7`](https://github.com/meshtastic/Meshtastic-Android/commit/550c517d70ca2ed472ac1a5c3b203c69e12a1707) + +### Internal (v2.7.14-internal.91) +Changes since [`v2.7.14-open.8`](https://github.com/meshtastic/Meshtastic-Android/releases/tag/v2.7.14-open.8): + +* docs: update CHANGELOG.md (#5437) by @github-actions[bot] in [`fc8f3bff3`](https://github.com/meshtastic/Meshtastic-Android/commit/fc8f3bff3c9e582ea1f434a760981ee523a25262) * refactor: use immutable destNum in RadioConfigViewModel (#5436) by @James Rich in [`1976808a3`](https://github.com/meshtastic/Meshtastic-Android/commit/1976808a361942f2c358329807d3605b8898e36d) * docs: update CHANGELOG.md (#5431) by @github-actions[bot] in [`57b0200b6`](https://github.com/meshtastic/Meshtastic-Android/commit/57b0200b6123e87f5037b12128411b69eee2ad23) * Flatpak: Add Maven/Gradle mirror URLs (#5433) by @Austin in [`ada16f4f5`](https://github.com/meshtastic/Meshtastic-Android/commit/ada16f4f5f2e859624ad8588ff07cdbff945aac0) * fix: update screenshots (#5435) by @James Rich in [`cf0a7cdab`](https://github.com/meshtastic/Meshtastic-Android/commit/cf0a7cdabff85e97accf4522709dfcb0fd5d4298) * chore: clean up brownfield specs and migrate to timestamp naming (#5432) by @James Rich in [`73469b415`](https://github.com/meshtastic/Meshtastic-Android/commit/73469b415e742a6601790b9574e1cf8a4a43a52c) * revert: Update retry settings in gradle-wrapper.properties (#5430) by @James Rich in [`ff9d6881c`](https://github.com/meshtastic/Meshtastic-Android/commit/ff9d6881c01b8e9ec7654179bfa559e93bea9974) - -### Internal (v2.7.14-internal.90) -Changes since [`v2.7.14-open.8`](https://github.com/meshtastic/Meshtastic-Android/releases/tag/v2.7.14-open.8): - * docs: update CHANGELOG.md (#5427) by @github-actions[bot] in [`1b902ba07`](https://github.com/meshtastic/Meshtastic-Android/commit/1b902ba07c7a6f5b41bba9f4cb439e7de0925e4c) * chore(deps): update gradle to v9.5.1 (#5429) by @renovate[bot] in [`010ff358d`](https://github.com/meshtastic/Meshtastic-Android/commit/010ff358d0cf5c586b557af186ffdd1ef719be81) * fix: clarify position precision as ± radius (#5428) by @James Rich in [`dcb147163`](https://github.com/meshtastic/Meshtastic-Android/commit/dcb147163c3a5c8dada885ee6e84790fcc24f651) From a71ac210f76a28a133056bec4502fc4b0984cb1d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 14 May 2026 08:06:32 -0500 Subject: [PATCH 05/78] chore(deps): update dd.sdk.android to v3.10.0 (#5451) --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 9e1c3909e..18b95fc6d 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -70,7 +70,7 @@ aboutlibraries = "14.2.0" jserialcomm = "2.11.4" coil = "3.4.0" datadog-gradle = "1.26.0" -dd-sdk-android = "3.9.1" +dd-sdk-android = "3.10.0" detekt = "2.0.0-alpha.3" dokka = "2.2.0" devtools-ksp = "2.3.8" From 0ef3072f3c28a44c1f0e18ad4b1c617aaff706b0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 14 May 2026 08:07:33 -0500 Subject: [PATCH 06/78] docs: update CHANGELOG.md (#5452) --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7a125591b..e8aec3b0c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,8 @@ See [GitHub Releases](https://github.com/meshtastic/Meshtastic-Android/releases) ### Unreleased (not yet in any build) +* chore(deps): update dd.sdk.android to v3.10.0 (#5451) by @renovate[bot] in [`a71ac210f`](https://github.com/meshtastic/Meshtastic-Android/commit/a71ac210f76a28a133056bec4502fc4b0984cb1d) +* docs: update CHANGELOG.md (#5448) by @github-actions[bot] in [`c0b690974`](https://github.com/meshtastic/Meshtastic-Android/commit/c0b69097419a7d9c90527729747fc91135628282) * chore: Scheduled updates (Firmware, Hardware, Translations, Graphs) (#5438) by @James Rich in [`13865e7c8`](https://github.com/meshtastic/Meshtastic-Android/commit/13865e7c8b7f9a47cd3b572bd44d8ec355b2d3a9) * chore(deps): update com.juul.kable:kable-core to v0.43.0 (#5449) by @renovate[bot] in [`8d61d22e9`](https://github.com/meshtastic/Meshtastic-Android/commit/8d61d22e93bec5afae021fdf2d64bca58dc57d67) * chore(deps): batch bump KSP, Wire, CMP, Material (#5447) by @James Rich in [`550c517d7`](https://github.com/meshtastic/Meshtastic-Android/commit/550c517d70ca2ed472ac1a5c3b203c69e12a1707) From a04a261b80b7d617447651af1fd67ec623775efa Mon Sep 17 00:00:00 2001 From: Ben Meadors Date: Thu, 14 May 2026 07:50:01 -0500 Subject: [PATCH 07/78] feat: TAK v2 protocol integration with zstd compression and full CoT type support (#5434) Co-authored-by: Claude Opus 4.6 (1M context) Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: jamesarich <2199651+jamesarich@users.noreply.github.com> Co-authored-by: James Rich Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .gitmodules | 1 + .skills/compose-ui/strings-index.txt | 11 + .skills/testing-ci/SKILL.md | 22 + app/src/fdroid/AndroidManifest.xml | 31 ++ app/src/main/AndroidManifest.xml | 4 - .../core/data/manager/MeshDataHandlerImpl.kt | 2 +- .../org/meshtastic/core/model/Capabilities.kt | 7 + .../org/meshtastic/core/navigation/Routes.kt | 2 + .../composeResources/values/strings.xml | 13 +- .../meshtastic/core/service/MeshService.kt | 48 ++ .../service/MeshServiceOrchestratorTest.kt | 10 +- core/takserver/build.gradle.kts | 69 ++- .../core/takserver/AtakFileWriter.kt | 53 ++ .../core/takserver/AtakFileWriter.kt | 32 ++ .../core/takserver/CoTDetailStripper.kt | 168 ++++++ .../org/meshtastic/core/takserver/CoTXml.kt | 62 ++- .../core/takserver/CoTXmlFrameBuffer.kt | 6 +- .../meshtastic/core/takserver/CoTXmlParser.kt | 34 +- .../takserver/RouteDataPackageGenerator.kt | 119 ++++ .../core/takserver/TAKClientConnection.kt | 253 --------- .../core/takserver/TAKDataPackageGenerator.kt | 166 +++++- .../meshtastic/core/takserver/TAKDefaults.kt | 45 +- .../core/takserver/TAKMeshIntegration.kt | 519 +++++++++++++++--- .../meshtastic/core/takserver/TAKModels.kt | 20 +- .../core/takserver/TAKPacketConversion.kt | 54 +- .../core/takserver/TAKPacketV2Conversion.kt | 270 +++++++++ .../meshtastic/core/takserver/TAKServer.kt | 211 ++----- .../core/takserver/TAKServerManager.kt | 178 +++--- .../core/takserver/TakConversionHelpers.kt | 58 ++ .../CoTHandler.kt => TakFixtureLoader.kt} | 16 +- .../core/takserver/TakMeshTestRunner.kt | 193 +++++++ .../core/takserver/TakSdkCompressor.kt | 34 ++ .../core/takserver/TakV2Compressor.kt | 62 +++ .../core/takserver/TakV2TypeMapper.kt | 75 +++ .../core/takserver/di/CoreTakServerModule.kt | 23 +- .../core/takserver/fountain/FountainCodec.kt | 468 ---------------- .../takserver/fountain/GenericCoTHandler.kt | 231 -------- .../core/takserver/CoTDetailStripperTest.kt | 238 ++++++++ .../core/takserver/CoTXmlParserTest.kt | 73 +++ .../meshtastic/core/takserver/CoTXmlTest.kt | 9 +- .../core/takserver/TAKDefaultsTest.kt | 15 +- .../core/takserver/TAKMeshIntegrationTest.kt | 486 ++++++++++++++++ .../takserver/TAKPacketV2RawDetailTest.kt | 137 +++++ .../core/takserver/TAKServerManagerTest.kt | 251 +++++++++ .../takserver/TakV2CompressorBoundaryTest.kt | 63 +++ .../takserver/fountain/FountainCodecTest.kt | 115 ---- .../core/takserver/AtakFileWriter.kt | 22 + .../meshtastic/core/takserver/TAKServerIos.kt | 50 ++ .../core/takserver/TakFixtureLoader.kt | 21 + .../core/takserver/TakSdkCompressor.kt} | 16 +- .../core/takserver/TakV2Compressor.kt | 71 +++ .../core/takserver/fountain/ZlibCodec.kt | 105 ---- .../core/takserver/TAKClientConnection.kt | 336 ++++++++++++ .../meshtastic/core/takserver/TAKServerJvm.kt | 299 ++++++++++ .../core/takserver/TakCertLoader.kt | 160 ++++++ .../core/takserver/TakFixtureLoader.kt | 25 + .../core/takserver/TakSdkCompressor.kt | 30 + .../core/takserver/TakV2Compressor.kt | 481 ++++++++++++++++ .../core/takserver/fountain/ZlibCodec.kt | 67 --- .../jvmAndroidMain/resources/tak_certs/ca.pem | 23 + .../resources/tak_certs/client.p12 | Bin 0 -> 3827 bytes .../resources/tak_certs/server.p12 | Bin 0 -> 3859 bytes .../tak_test_fixtures/aircraft_adsb.xml | 5 + .../tak_test_fixtures/aircraft_hostile.xml | 5 + .../resources/tak_test_fixtures/alert_tic.xml | 8 + .../resources/tak_test_fixtures/casevac.xml | 10 + .../tak_test_fixtures/casevac_medline.xml | 10 + .../chat_receipt_delivered.xml | 9 + .../tak_test_fixtures/chat_receipt_read.xml | 9 + .../tak_test_fixtures/delete_event.xml | 5 + .../tak_test_fixtures/drawing_circle.xml | 25 + .../drawing_circle_large.xml | 15 + .../tak_test_fixtures/drawing_ellipse.xml | 17 + .../tak_test_fixtures/drawing_freeform.xml | 19 + .../tak_test_fixtures/drawing_polygon.xml | 19 + .../tak_test_fixtures/drawing_rectangle.xml | 19 + .../drawing_rectangle_itak.xml | 16 + .../drawing_telestration.xml | 53 ++ .../tak_test_fixtures/emergency_911.xml | 10 + .../tak_test_fixtures/emergency_cancel.xml | 11 + .../tak_test_fixtures/geochat_broadcast.xml | 12 + .../tak_test_fixtures/geochat_dm.xml | 12 + .../tak_test_fixtures/geochat_simple.xml | 12 + .../tak_test_fixtures/marker_2525.xml | 14 + .../tak_test_fixtures/marker_goto.xml | 12 + .../tak_test_fixtures/marker_goto_itak.xml | 10 + .../tak_test_fixtures/marker_icon_set.xml | 14 + .../tak_test_fixtures/marker_spot.xml | 14 + .../tak_test_fixtures/marker_tank.xml | 14 + .../resources/tak_test_fixtures/pli_basic.xml | 5 + .../resources/tak_test_fixtures/pli_full.xml | 5 + .../resources/tak_test_fixtures/pli_itak.xml | 11 + .../tak_test_fixtures/pli_stationary.xml | 12 + .../tak_test_fixtures/pli_takaware.xml | 11 + .../tak_test_fixtures/pli_webtak.xml | 5 + .../tak_test_fixtures/ranging_bullseye.xml | 17 + .../tak_test_fixtures/ranging_circle.xml | 17 + .../tak_test_fixtures/ranging_line.xml | 14 + .../resources/tak_test_fixtures/route_3wp.xml | 16 + .../tak_test_fixtures/route_itak_3wp.xml | 11 + .../tak_test_fixtures/task_engage.xml | 10 + .../resources/tak_test_fixtures/waypoint.xml | 12 + .../core/takserver/AtakFileWriter.kt | 25 + .../meshtastic/core/ui/util/PlatformUtils.kt | 16 +- .../feature/settings/tak/TakPermissionUtil.kt | 14 +- .../settings/ModuleConfigurationScreen.kt | 5 +- .../settings/navigation/SettingsNavigation.kt | 3 + .../feature/settings/radio/RadioConfig.kt | 8 + .../radio/component/TAKConfigItemList.kt | 336 ++++++++++-- .../radio/component/TAKConfigPreviews.kt | 110 ++++ .../TAKConfigPermissionDeniedTest.kt | 94 ++++ .../feature/SettingsScreenshotTests.kt | 48 ++ ...creenshotTakConfigCard_Dark_d19fbf1f_0.png | Bin 0 -> 23863 bytes ...reenshotTakConfigCard_Light_b29dc7a7_0.png | Bin 0 -> 23710 bytes ...kServerSectionDisabled_Dark_d19fbf1f_0.png | Bin 0 -> 27766 bytes ...ServerSectionDisabled_Light_b29dc7a7_0.png | Bin 0 -> 27506 bytes ...akServerSectionEnabled_Dark_d19fbf1f_0.png | Bin 0 -> 42840 bytes ...kServerSectionEnabled_Light_b29dc7a7_0.png | Bin 0 -> 42564 bytes ...eenshotTakTestCardIdle_Dark_d19fbf1f_0.png | Bin 0 -> 22354 bytes ...enshotTakTestCardIdle_Light_b29dc7a7_0.png | Bin 0 -> 22112 bytes ...shotTakTestCardResults_Dark_d19fbf1f_0.png | Bin 0 -> 42948 bytes ...hotTakTestCardResults_Light_b29dc7a7_0.png | Bin 0 -> 42754 bytes ...shotTakTestCardRunning_Dark_d19fbf1f_0.png | Bin 0 -> 29695 bytes ...hotTakTestCardRunning_Light_b29dc7a7_0.png | Bin 0 -> 29437 bytes .../checklists/protocol.md | 131 +++++ .../checklists/requirements.md | 37 ++ .../contracts/wire-protocol.md | 184 +++++++ specs/005-tak-v2-protocol/data-model.md | 249 +++++++++ specs/005-tak-v2-protocol/plan.md | 155 ++++++ specs/005-tak-v2-protocol/quickstart.md | 121 ++++ specs/005-tak-v2-protocol/research.md | 164 ++++++ specs/005-tak-v2-protocol/spec.md | 220 ++++++++ specs/005-tak-v2-protocol/tasks.md | 294 ++++++++++ 133 files changed, 7620 insertions(+), 1782 deletions(-) create mode 100644 app/src/fdroid/AndroidManifest.xml create mode 100644 core/takserver/src/androidMain/kotlin/org/meshtastic/core/takserver/AtakFileWriter.kt create mode 100644 core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/AtakFileWriter.kt create mode 100644 core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/CoTDetailStripper.kt create mode 100644 core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/RouteDataPackageGenerator.kt delete mode 100644 core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TAKClientConnection.kt create mode 100644 core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TAKPacketV2Conversion.kt create mode 100644 core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TakConversionHelpers.kt rename core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/{fountain/CoTHandler.kt => TakFixtureLoader.kt} (57%) create mode 100644 core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TakMeshTestRunner.kt create mode 100644 core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TakSdkCompressor.kt create mode 100644 core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TakV2Compressor.kt create mode 100644 core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TakV2TypeMapper.kt delete mode 100644 core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/fountain/FountainCodec.kt delete mode 100644 core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/fountain/GenericCoTHandler.kt create mode 100644 core/takserver/src/commonTest/kotlin/org/meshtastic/core/takserver/CoTDetailStripperTest.kt create mode 100644 core/takserver/src/commonTest/kotlin/org/meshtastic/core/takserver/TAKMeshIntegrationTest.kt create mode 100644 core/takserver/src/commonTest/kotlin/org/meshtastic/core/takserver/TAKPacketV2RawDetailTest.kt create mode 100644 core/takserver/src/commonTest/kotlin/org/meshtastic/core/takserver/TAKServerManagerTest.kt create mode 100644 core/takserver/src/commonTest/kotlin/org/meshtastic/core/takserver/TakV2CompressorBoundaryTest.kt delete mode 100644 core/takserver/src/commonTest/kotlin/org/meshtastic/core/takserver/fountain/FountainCodecTest.kt create mode 100644 core/takserver/src/iosMain/kotlin/org/meshtastic/core/takserver/AtakFileWriter.kt create mode 100644 core/takserver/src/iosMain/kotlin/org/meshtastic/core/takserver/TAKServerIos.kt create mode 100644 core/takserver/src/iosMain/kotlin/org/meshtastic/core/takserver/TakFixtureLoader.kt rename core/takserver/src/{commonMain/kotlin/org/meshtastic/core/takserver/fountain/CodecExpect.kt => iosMain/kotlin/org/meshtastic/core/takserver/TakSdkCompressor.kt} (62%) create mode 100644 core/takserver/src/iosMain/kotlin/org/meshtastic/core/takserver/TakV2Compressor.kt delete mode 100644 core/takserver/src/iosMain/kotlin/org/meshtastic/core/takserver/fountain/ZlibCodec.kt create mode 100644 core/takserver/src/jvmAndroidMain/kotlin/org/meshtastic/core/takserver/TAKClientConnection.kt create mode 100644 core/takserver/src/jvmAndroidMain/kotlin/org/meshtastic/core/takserver/TAKServerJvm.kt create mode 100644 core/takserver/src/jvmAndroidMain/kotlin/org/meshtastic/core/takserver/TakCertLoader.kt create mode 100644 core/takserver/src/jvmAndroidMain/kotlin/org/meshtastic/core/takserver/TakFixtureLoader.kt create mode 100644 core/takserver/src/jvmAndroidMain/kotlin/org/meshtastic/core/takserver/TakSdkCompressor.kt create mode 100644 core/takserver/src/jvmAndroidMain/kotlin/org/meshtastic/core/takserver/TakV2Compressor.kt delete mode 100644 core/takserver/src/jvmAndroidMain/kotlin/org/meshtastic/core/takserver/fountain/ZlibCodec.kt create mode 100644 core/takserver/src/jvmAndroidMain/resources/tak_certs/ca.pem create mode 100644 core/takserver/src/jvmAndroidMain/resources/tak_certs/client.p12 create mode 100644 core/takserver/src/jvmAndroidMain/resources/tak_certs/server.p12 create mode 100644 core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/aircraft_adsb.xml create mode 100644 core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/aircraft_hostile.xml create mode 100644 core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/alert_tic.xml create mode 100644 core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/casevac.xml create mode 100644 core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/casevac_medline.xml create mode 100644 core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/chat_receipt_delivered.xml create mode 100644 core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/chat_receipt_read.xml create mode 100644 core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/delete_event.xml create mode 100644 core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/drawing_circle.xml create mode 100644 core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/drawing_circle_large.xml create mode 100644 core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/drawing_ellipse.xml create mode 100644 core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/drawing_freeform.xml create mode 100644 core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/drawing_polygon.xml create mode 100644 core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/drawing_rectangle.xml create mode 100644 core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/drawing_rectangle_itak.xml create mode 100644 core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/drawing_telestration.xml create mode 100644 core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/emergency_911.xml create mode 100644 core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/emergency_cancel.xml create mode 100644 core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/geochat_broadcast.xml create mode 100644 core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/geochat_dm.xml create mode 100644 core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/geochat_simple.xml create mode 100644 core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/marker_2525.xml create mode 100644 core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/marker_goto.xml create mode 100644 core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/marker_goto_itak.xml create mode 100644 core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/marker_icon_set.xml create mode 100644 core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/marker_spot.xml create mode 100644 core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/marker_tank.xml create mode 100644 core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/pli_basic.xml create mode 100644 core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/pli_full.xml create mode 100644 core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/pli_itak.xml create mode 100644 core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/pli_stationary.xml create mode 100644 core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/pli_takaware.xml create mode 100644 core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/pli_webtak.xml create mode 100644 core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/ranging_bullseye.xml create mode 100644 core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/ranging_circle.xml create mode 100644 core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/ranging_line.xml create mode 100644 core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/route_3wp.xml create mode 100644 core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/route_itak_3wp.xml create mode 100644 core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/task_engage.xml create mode 100644 core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/waypoint.xml create mode 100644 core/takserver/src/jvmMain/kotlin/org/meshtastic/core/takserver/AtakFileWriter.kt create mode 100644 feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/TAKConfigPreviews.kt create mode 100644 feature/settings/src/commonTest/kotlin/org/meshtastic/feature/settings/radio/component/TAKConfigPermissionDeniedTest.kt create mode 100644 screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotTakConfigCard_Dark_d19fbf1f_0.png create mode 100644 screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotTakConfigCard_Light_b29dc7a7_0.png create mode 100644 screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotTakServerSectionDisabled_Dark_d19fbf1f_0.png create mode 100644 screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotTakServerSectionDisabled_Light_b29dc7a7_0.png create mode 100644 screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotTakServerSectionEnabled_Dark_d19fbf1f_0.png create mode 100644 screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotTakServerSectionEnabled_Light_b29dc7a7_0.png create mode 100644 screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotTakTestCardIdle_Dark_d19fbf1f_0.png create mode 100644 screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotTakTestCardIdle_Light_b29dc7a7_0.png create mode 100644 screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotTakTestCardResults_Dark_d19fbf1f_0.png create mode 100644 screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotTakTestCardResults_Light_b29dc7a7_0.png create mode 100644 screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotTakTestCardRunning_Dark_d19fbf1f_0.png create mode 100644 screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotTakTestCardRunning_Light_b29dc7a7_0.png create mode 100644 specs/005-tak-v2-protocol/checklists/protocol.md create mode 100644 specs/005-tak-v2-protocol/checklists/requirements.md create mode 100644 specs/005-tak-v2-protocol/contracts/wire-protocol.md create mode 100644 specs/005-tak-v2-protocol/data-model.md create mode 100644 specs/005-tak-v2-protocol/plan.md create mode 100644 specs/005-tak-v2-protocol/quickstart.md create mode 100644 specs/005-tak-v2-protocol/research.md create mode 100644 specs/005-tak-v2-protocol/spec.md create mode 100644 specs/005-tak-v2-protocol/tasks.md diff --git a/.gitmodules b/.gitmodules index e115fe990..c7adfe346 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,4 @@ [submodule "app proto submodule"] path = core/proto/src/main/proto url = https://github.com/meshtastic/protobufs.git + branch = master diff --git a/.skills/compose-ui/strings-index.txt b/.skills/compose-ui/strings-index.txt index 7a4fdab44..71c89ac96 100644 --- a/.skills/compose-ui/strings-index.txt +++ b/.skills/compose-ui/strings-index.txt @@ -1123,8 +1123,19 @@ tak_role_sniper tak_role_teamlead tak_role_teammember tak_role_unspecified +tak_server tak_server_enabled tak_server_enabled_desc +tak_server_export_data_package_desc +tak_server_loading +tak_server_section +tak_server_test_card_title +tak_server_test_idle +tak_server_test_result_bytes +tak_server_test_result_unknown_error +tak_server_test_results +tak_server_test_run +tak_server_test_running tak_team tak_team_blue tak_team_brown diff --git a/.skills/testing-ci/SKILL.md b/.skills/testing-ci/SKILL.md index 1c8b7b901..bb9857966 100644 --- a/.skills/testing-ci/SKILL.md +++ b/.skills/testing-ci/SKILL.md @@ -21,6 +21,28 @@ Run in a single invocation for routine changes to ensure code formatting, analys *Note: If testing Compose UI on the JVM (Robolectric) with Java 21, pin tests to `@Config(sdk = [34])` to avoid SDK 35 compatibility crashes.* +### SharedFlow + backgroundScope in `runTest` + +When testing long-lived coroutines (e.g., `Flow.collect` loops launched in `backgroundScope`), **use `runTest(UnconfinedTestDispatcher())`** instead of plain `runTest`: + +```kotlin +// ❌ BAD — SharedFlow emissions silently never reach collectors +@Test fun `inbound packet is forwarded`() = runTest { + backgroundScope.launch { sut.start(backgroundScope) } + sharedFlow.emit(packet) + // assertion fails — collector never receives the emission +} + +// ✅ GOOD — UnconfinedTestDispatcher eagerly dispatches subscriber resumptions +@Test fun `inbound packet is forwarded`() = runTest(UnconfinedTestDispatcher()) { + backgroundScope.launch { sut.start(backgroundScope) } + sharedFlow.emit(packet) + // assertion passes — collector receives emission immediately +} +``` + +**Why:** `backgroundScope` uses `StandardTestDispatcher` by default, which does **not** eagerly dispatch `SharedFlow` subscriber resumptions. Even `advanceUntilIdle()` won't trigger delivery. `UnconfinedTestDispatcher()` fixes this by dispatching eagerly. This affects any test where a coroutine in `backgroundScope` collects from a `SharedFlow` or `MutableSharedFlow`. + ## 2) Change-type verification matrix - `docs-only` changes: Usually no Gradle run required, but run `spotlessCheck` if practical. diff --git a/app/src/fdroid/AndroidManifest.xml b/app/src/fdroid/AndroidManifest.xml new file mode 100644 index 000000000..efd581020 --- /dev/null +++ b/app/src/fdroid/AndroidManifest.xml @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index bc5dab9d3..d6d296ea1 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -67,10 +67,6 @@ --> - - diff --git a/core/data/src/commonMain/kotlin/org/meshtastic/core/data/manager/MeshDataHandlerImpl.kt b/core/data/src/commonMain/kotlin/org/meshtastic/core/data/manager/MeshDataHandlerImpl.kt index fa935473a..96edbe41f 100644 --- a/core/data/src/commonMain/kotlin/org/meshtastic/core/data/manager/MeshDataHandlerImpl.kt +++ b/core/data/src/commonMain/kotlin/org/meshtastic/core/data/manager/MeshDataHandlerImpl.kt @@ -195,7 +195,7 @@ class MeshDataHandlerImpl( } PortNum.ATAK_PLUGIN, - PortNum.ATAK_FORWARDER, + PortNum.ATAK_PLUGIN_V2, PortNum.PRIVATE_APP, -> { shouldBroadcast = true diff --git a/core/model/src/commonMain/kotlin/org/meshtastic/core/model/Capabilities.kt b/core/model/src/commonMain/kotlin/org/meshtastic/core/model/Capabilities.kt index 8dbccf69a..724bdfdd2 100644 --- a/core/model/src/commonMain/kotlin/org/meshtastic/core/model/Capabilities.kt +++ b/core/model/src/commonMain/kotlin/org/meshtastic/core/model/Capabilities.kt @@ -58,6 +58,13 @@ data class Capabilities(val firmwareVersion: String?, internal val forceEnableAl /** Support for TAK (ATAK) module configuration. Supported since firmware v2.7.19. */ val supportsTakConfig = atLeast(V2_7_19) + /** + * Support for the v2 TAK port (ATAK_PLUGIN_V2 = 78) with TAKPacketV2 + zstd dictionary compression. Supported since + * firmware v2.8.0. Firmware v2.7.x and earlier only support the legacy ATAK_PLUGIN port (72) with the original + * TAKPacket schema (PLI + GeoChat only, no compression), so the bridge falls back to that path for older nodes. + */ + val supportsTakV2 = atLeast(V2_8_0) + /** Support for location sharing on secondary channels. Supported since firmware v2.6.10. */ val supportsSecondaryChannelLocation = atLeast(V2_6_10) diff --git a/core/navigation/src/commonMain/kotlin/org/meshtastic/core/navigation/Routes.kt b/core/navigation/src/commonMain/kotlin/org/meshtastic/core/navigation/Routes.kt index 418ddd58a..d8682c40c 100644 --- a/core/navigation/src/commonMain/kotlin/org/meshtastic/core/navigation/Routes.kt +++ b/core/navigation/src/commonMain/kotlin/org/meshtastic/core/navigation/Routes.kt @@ -172,6 +172,8 @@ sealed interface SettingsRoute : Route { @Serializable data object CleanNodeDb : SettingsRoute + @Serializable data object TakServer : SettingsRoute + @Serializable data object DebugPanel : SettingsRoute @Serializable data object About : SettingsRoute diff --git a/core/resources/src/commonMain/composeResources/values/strings.xml b/core/resources/src/commonMain/composeResources/values/strings.xml index 7d8347df8..ff6c6333b 100644 --- a/core/resources/src/commonMain/composeResources/values/strings.xml +++ b/core/resources/src/commonMain/composeResources/values/strings.xml @@ -1165,8 +1165,19 @@ Team Lead Team Member Unspecified + TAK Server Enable Local TAK Server - Starts a TCP server on port 8089 for ATAK connections + Starts a local TLS server on port 8089 for ATAK/iTAK connections + Generate .zip for ATAK/iTAK to connect to this server + + Server + TAK Mesh Test (Debug) + Send all %1$d test fixtures to mesh + %1$dB ✓ + + %1$d passed, %2$d failed of %3$d/%4$d + Run + Running: %1$s Team Color Blue Brown diff --git a/core/service/src/androidMain/kotlin/org/meshtastic/core/service/MeshService.kt b/core/service/src/androidMain/kotlin/org/meshtastic/core/service/MeshService.kt index 0f4bc60b7..cf636923a 100644 --- a/core/service/src/androidMain/kotlin/org/meshtastic/core/service/MeshService.kt +++ b/core/service/src/androidMain/kotlin/org/meshtastic/core/service/MeshService.kt @@ -14,6 +14,8 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ +@file:Suppress("TooGenericExceptionCaught") + package org.meshtastic.core.service import android.app.Service @@ -22,6 +24,7 @@ import android.content.Intent import android.content.pm.ServiceInfo import android.os.Build import android.os.IBinder +import android.os.PowerManager import androidx.core.app.ServiceCompat import co.touchlab.kermit.Logger import kotlinx.coroutines.CoroutineScope @@ -91,6 +94,14 @@ class MeshService : Service() { private var isServiceInitialized = false + /** + * Partial wake lock held while the foreground service is running. Prevents the CPU from being throttled while the + * TAK server's keepalive coroutines, socket writes, and mesh packet handlers need to run on a regular cadence. + * Without this, OEM battery optimizations can pause coroutines for long enough that connected TAK clients + * (ATAK/iTAK) time out waiting for data, even though the foreground service itself keeps the process alive. + */ + private var wakeLock: PowerManager.WakeLock? = null + private val myNodeNum: Int get() = nodeManager.myNodeNum.value ?: throw RadioNotConnectedException() @@ -110,6 +121,8 @@ class MeshService : Service() { val minDeviceVersion = DeviceVersion(DeviceVersion.MIN_FW_VERSION) val absoluteMinDeviceVersion = DeviceVersion(DeviceVersion.ABS_MIN_FW_VERSION) + + private const val WAKE_LOCK_TIMEOUT_MS = 30L * 60L * 1_000L // 30 minutes } override fun onCreate() { @@ -163,10 +176,12 @@ class MeshService : Service() { return if (!wantForeground) { Logger.i { "Stopping mesh service because no device is selected" } + releaseWakeLock() ServiceCompat.stopForeground(this, ServiceCompat.STOP_FOREGROUND_REMOVE) stopSelf() START_NOT_STICKY } else { + acquireWakeLock() START_STICKY } } @@ -205,6 +220,38 @@ class MeshService : Service() { } } + private fun acquireWakeLock() { + if (wakeLock?.isHeld == true) return + try { + val powerManager = getSystemService(POWER_SERVICE) as PowerManager + val lock = + powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Meshtastic::MeshServiceWakeLock").apply { + setReferenceCounted(false) + } + lock.acquire(WAKE_LOCK_TIMEOUT_MS) + wakeLock = lock + Logger.i { "Acquired partial wake lock for mesh service" } + } catch (e: SecurityException) { + Logger.w(e) { "Failed to acquire wake lock — WAKE_LOCK permission missing?" } + } catch (e: Exception) { + Logger.w(e) { "Failed to acquire wake lock" } + } + } + + private fun releaseWakeLock() { + val lock = wakeLock ?: return + try { + if (lock.isHeld) { + lock.release() + Logger.i { "Released partial wake lock for mesh service" } + } + } catch (e: Exception) { + Logger.w(e) { "Failed to release wake lock" } + } finally { + wakeLock = null + } + } + override fun onTaskRemoved(rootIntent: Intent?) { super.onTaskRemoved(rootIntent) Logger.i { "Mesh service: onTaskRemoved" } @@ -214,6 +261,7 @@ class MeshService : Service() { override fun onDestroy() { Logger.i { "Destroying mesh service" } + releaseWakeLock() ServiceCompat.stopForeground(this, ServiceCompat.STOP_FOREGROUND_REMOVE) if (isServiceInitialized) { orchestrator.stop() diff --git a/core/service/src/commonTest/kotlin/org/meshtastic/core/service/MeshServiceOrchestratorTest.kt b/core/service/src/commonTest/kotlin/org/meshtastic/core/service/MeshServiceOrchestratorTest.kt index 87109be1e..31178449c 100644 --- a/core/service/src/commonTest/kotlin/org/meshtastic/core/service/MeshServiceOrchestratorTest.kt +++ b/core/service/src/commonTest/kotlin/org/meshtastic/core/service/MeshServiceOrchestratorTest.kt @@ -48,7 +48,6 @@ import org.meshtastic.core.repository.ServiceRepository import org.meshtastic.core.repository.TakPrefs import org.meshtastic.core.takserver.TAKMeshIntegration import org.meshtastic.core.takserver.TAKServerManager -import org.meshtastic.core.takserver.fountain.CoTHandler import org.meshtastic.proto.LocalModuleConfig import kotlin.test.Test import kotlin.test.assertFalse @@ -59,7 +58,7 @@ class MeshServiceOrchestratorTest { private val radioInterfaceService: RadioInterfaceService = mock(MockMode.autofill) private val serviceRepository: ServiceRepository = mock(MockMode.autofill) private val nodeManager: NodeManager = mock(MockMode.autofill) - private val nodeRepository: NodeRepository = mock(MockMode.autofill) + private val messageProcessor: MeshMessageProcessor = mock(MockMode.autofill) private val commandSender: CommandSender = mock(MockMode.autofill) private val router: MeshRouter = mock(MockMode.autofill) @@ -68,7 +67,7 @@ class MeshServiceOrchestratorTest { private val serviceNotifications: MeshServiceNotifications = mock(MockMode.autofill) private val takServerManager: TAKServerManager = mock(MockMode.autofill) private val takPrefs: TakPrefs = mock(MockMode.autofill) - private val cotHandler: CoTHandler = mock(MockMode.autofill) + private val nodeRepository: NodeRepository = mock(MockMode.autofill) private val databaseManager: DatabaseManager = mock(MockMode.autofill) private val connectionManager: MeshConnectionManager = mock(MockMode.autofill) @@ -94,17 +93,16 @@ class MeshServiceOrchestratorTest { every { takPrefs.isTakServerEnabled } returns takEnabledFlow every { takServerManager.isRunning } returns takRunningFlow every { takServerManager.inboundMessages } returns MutableSharedFlow() - every { nodeRepository.nodeDBbyNum } returns MutableStateFlow(emptyMap()) every { router.actionHandler } returns actionHandler + every { nodeRepository.myNodeInfo } returns MutableStateFlow(null) val takMeshIntegration = TAKMeshIntegration( takServerManager = takServerManager, commandSender = commandSender, - nodeRepository = nodeRepository, serviceRepository = serviceRepository, meshConfigHandler = meshConfigHandler, - cotHandler = cotHandler, + nodeRepository = nodeRepository, ) return MeshServiceOrchestrator( diff --git a/core/takserver/build.gradle.kts b/core/takserver/build.gradle.kts index f3ef5bbad..ffd87c693 100644 --- a/core/takserver/build.gradle.kts +++ b/core/takserver/build.gradle.kts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2026 Meshtastic LLC + * Copyright (c) 2025-2026 Meshtastic LLC * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -23,6 +23,7 @@ plugins { } kotlin { + @Suppress("UnstableApiUsage") android { namespace = "org.meshtastic.core.takserver" androidResources.enable = false @@ -50,9 +51,75 @@ kotlin { implementation(libs.kermit) } + jvmAndroidMain.dependencies { + // TAKPacket-SDK for v2 compression/decompression (via JitPack). + // + // We depend on the `-jvm` variant directly rather than the parent + // `com.github.meshtastic:TAKPacket-SDK` coordinate. JitPack does + // not publish a root-level Gradle module metadata (.module) file + // for the KMP parent, only per-target ones. With just the parent + // POM, Gradle reads the four KMP variants (jvm, iosarm64, + // iossimulatorarm64, metadata) as unconditional Maven deps and + // tries to resolve them ALL against this Android consumer — the + // iOS klibs declare `platform.type=native` with no androidJvm + // variant, so variant selection fails with "No matching variant". + // + // Depending directly on `takpacket-sdk-jvm` skips the parent POM + // entirely and goes straight to the JVM artifact's own module + // metadata, which is compatible with both `jvm()` and Android + // targets in this `jvmAndroidMain` source set. It still pulls + // zstd-jni + xpp3 + wire-runtime-jvm + kotlin-stdlib as + // transitive deps from the JVM variant's POM. + // + // zstd-jni's @aar variant is still declared explicitly in the + // androidMain source set below so Android gets the .so files. + implementation("com.github.meshtastic.TAKPacket-SDK:takpacket-sdk-jvm:v0.2.1") { + // Issue #5: pre-0.2.1 the SDK JAR bundled `org.meshtastic.proto.*` + // (Wire-generated TAKPacketV2 + friends) inside the same JAR as + // `org.meshtastic.tak.*`. Our own `:core:proto` module runs its + // own Wire codegen against the same protobufs submodule and emits + // the identical classes, so R8 hit "Type is defined multiple + // times" errors during release builds. v0.2.1 strips the proto + // classes from the JAR entirely — the SDK's bytecode still + // REFERENCES them, but they come from `:core:proto` on our + // classpath. No exclude needed; the SDK simply doesn't ship them. + // The SDK's jvmMain declares zstd-jni as a runtime dep (standard + // JAR with desktop native libs). Android needs the @aar variant + // instead (ships arm/arm64/x86/x86_64 .so files). Both packaging + // formats contain the same Java classes, so Android's dex merger + // hits "Duplicate class" errors if both land on the classpath. + // Exclude here; androidMain re-adds it as @aar below, and jvmMain + // re-adds the JAR for desktop. + exclude(group = "com.github.luben", module = "zstd-jni") + // xpp3 bundles org.xmlpull.v1.XmlPullParser which Android provides + // as a platform class (android.content.res.XmlResourceParser + // implements it). R8 fails when both the library and program + // classpaths define the same type. + exclude(group = "org.ogce", module = "xpp3") + } + } + + jvmMain.dependencies { + // Desktop JVM: standard JAR bundles native libs for desktop archs. + implementation("com.github.luben:zstd-jni:1.5.7-7") + // xpp3 is excluded from jvmAndroidMain (Android ships it as a + // platform class), but Desktop JVM still needs it for XmlPullParser. + implementation("org.ogce:xpp3:1.1.6") + } + + androidMain.dependencies { + // Android: @aar variant ships .so files for arm/arm64/x86/x86_64. + // Without this, zstd-jni's ZstdDictCompress. throws + // UnsatisfiedLinkError and poisons TakV2Compressor permanently. + implementation("com.github.luben:zstd-jni:1.5.7-7@aar") + } + commonTest.dependencies { implementation(projects.core.testing) implementation(libs.kotlinx.coroutines.test) + implementation(libs.turbine) + implementation(libs.kotest.assertions) + implementation(libs.kotest.property) } } } diff --git a/core/takserver/src/androidMain/kotlin/org/meshtastic/core/takserver/AtakFileWriter.kt b/core/takserver/src/androidMain/kotlin/org/meshtastic/core/takserver/AtakFileWriter.kt new file mode 100644 index 000000000..9abd1017e --- /dev/null +++ b/core/takserver/src/androidMain/kotlin/org/meshtastic/core/takserver/AtakFileWriter.kt @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.meshtastic.core.takserver + +import co.touchlab.kermit.Logger +import java.io.File + +/** + * Android implementation — writes route data packages to ATAK's monitored auto-import directory. Tries multiple + * locations in order of preference: + * 1. `/sdcard/atak/tools/datapackage/` (ATAK monitors this) + * 2. `/sdcard/Download/` (user can manually import from here) + */ +@Suppress("TooGenericExceptionCaught") +internal actual object AtakFileWriter { + + actual fun writeToImportDir(fileName: String, zipBytes: ByteArray): Boolean { + // Sanitize: fileName originates from untrusted mesh CoT uid attributes. + val safeName = fileName.replace(Regex("[^a-zA-Z0-9._-]"), "_") + // Use hardcoded paths — on Android /sdcard/ maps to external storage. + // On JVM desktop these paths don't exist and the fallback returns false. + val targets = listOf(File("/sdcard/atak/tools/datapackage"), File("/sdcard/Download")) + + for (dir in targets) { + try { + if (!dir.exists()) dir.mkdirs() + val target = File(dir, safeName) + target.writeBytes(zipBytes) + Logger.i { "Route data package written: $fileName (${zipBytes.size} bytes) → ${target.absolutePath}" } + return true + } catch (e: Exception) { + Logger.d { "Cannot write to ${dir.absolutePath}: ${e.message}" } + } + } + + Logger.w { "Failed to write route data package to any ATAK import directory" } + return false + } +} diff --git a/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/AtakFileWriter.kt b/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/AtakFileWriter.kt new file mode 100644 index 000000000..4d863e14f --- /dev/null +++ b/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/AtakFileWriter.kt @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.meshtastic.core.takserver + +/** + * Writes data package files to ATAK's auto-import directory. + * + * On Android, the actual implementation writes to `/sdcard/atak/tools/datapackage/` which ATAK monitors for new zip + * files. On other platforms this is a no-op. + */ +internal expect object AtakFileWriter { + /** + * Write a data package zip to ATAK's monitored import directory. + * + * @return true if the file was written successfully, false otherwise. + */ + fun writeToImportDir(fileName: String, zipBytes: ByteArray): Boolean +} diff --git a/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/CoTDetailStripper.kt b/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/CoTDetailStripper.kt new file mode 100644 index 000000000..fa6b25e04 --- /dev/null +++ b/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/CoTDetailStripper.kt @@ -0,0 +1,168 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.meshtastic.core.takserver + +/** + * Removes bloat elements from the `` content of a CoT event before it is stuffed into a + * [org.meshtastic.proto.TAKPacketV2] `raw_detail` field for mesh transmission. + * + * # Why this exists + * + * A LoRa mesh packet has a hard payload limit of [org.meshtastic.proto.Constants.DATA_PAYLOAD_LEN] = 233 bytes for the + * entire encoded `Data` proto (portnum + payload + reply_id + emoji). Subtracting the wrapper overhead leaves roughly + * **~225 bytes** for the TAK wire payload, and the wire payload itself is `[1 byte dict-id flag][zstd-compressed + * TAKPacketV2 protobuf]`. + * + * ATAK emits CoT events with rich visual metadata that is **never useful over a mesh**: icon set paths, ARGB colors, + * shape geometry, archive flags, file references, etc. A typical `u-d-c-c` (user-drawn circle) event from ATAK is + * **800+ bytes of XML**, of which maybe 80 bytes are actually meaningful to a receiving node. Even with dictionary + * compression, the full payload overflows the MTU. + * + * This stripper deletes elements the receiving node can synthesize or ignore, leaving only the minimum needed to + * rebuild a usable `` on the other side: who sent it, where they are, what team/role they're on, battery status, + * chat content, and the high-level CoT type (which rides separately on [TAKPacketV2.cot_type_id] / + * [TAKPacketV2.cot_type_str]). + * + * # What gets dropped + * + * **Cosmetic / rendering-only** (pure visual, no situational awareness value): + * - `` — ARGB stroke/fill colors + * - ``, ``, `` — shape styling + * - `` — label visibility toggle + * - `` — icon set path (`COT_MAPPING_2525B/...`) + * - `` — 3D model reference + * + * **Geometric detail** (we keep lat/lon on the event; shape primitives are too big): + * - `...` — ellipse/polyline/polygon geometry + * - ``, `` — rendering hints + * + * **Resource references** (useless without the resource being reachable): + * - `` — file transfer references + * - `<__video .../>` — video stream URL + * + * **Flags and redundant metadata**: + * - `` — "save to archive" flag + * - `` — redundant with the event's `` attributes + * - `` — rectangle "toggle" UI state flag + * - `<_flow-tags_ .../>` — TAK Server routing metadata (server-to-server, not needed on mesh) + * + * # What gets preserved + * + * Anything the stripper doesn't explicitly match is passed through untouched. That includes all of the structured + * elements that the regular [CoTXmlParser] understands (contact, __group, status, track, remarks, __chat, chatgrp, + * link, uid, __serverdestination) plus any unknown extensions — better to over-preserve than silently drop something + * the receiving ATAK actually needs. + * + * # Whitespace + * + * All inter-element whitespace and indentation is collapsed. Whitespace inside text nodes (e.g. `hello + * world`) is preserved. + * + * # Not a real XML parser + * + * This is intentionally string/regex based, not DOM. The input is a small, well-formed fragment produced by ATAK's + * serializer, so a full parser is overkill — and we want this to be dependency-free so it can run on every KMP target + * without pulling in xmlutil for a one-off job. If ATAK starts emitting namespaced elements or embedded CDATA that + * tangles with these patterns, the stripper will leave them alone rather than corrupt the output, which is the safer + * failure mode. + */ +internal object CoTDetailStripper { + + /** + * Element names whose entire subtree (or self-closing tag) is removed. + * + * Order matters only for documentation. Each entry is tried against both the self-closing form `` and + * the paired form `...`. + */ + private val STRIPPED_ELEMENTS = + listOf( + // Cosmetic / rendering + "color", + "strokeColor", + "strokeWeight", + "fillColor", + "labels_on", + "usericon", + "model", + // Geometric + "shape", + "height", + "height_unit", + // Resource refs + "fileshare", + "__video", + // Flags / redundant + "archive", + "precisionlocation", + // Rectangle/polyline "toggle" UI flag, and TAK Server routing metadata. + // The underscore-prefixed element names are legal XML identifiers ATAK uses + // for internal state that receiving meshtastic nodes have no use for. + "tog", + "_flow-tags_", + ) + + /** + * Pre-compiled regex list: for each stripped element, one pattern that matches either a self-closing tag or a + * paired open/close tag (non-greedy content). + * + * `[^>]*?` inside the open tag tolerates attribute quoting with both single and double quotes but bails if it + * encounters a `>` (so it won't accidentally swallow unrelated content). + * + * The leading `(?s)` inline flag is the KMP-portable equivalent of `RegexOption.DOT_MATCHES_ALL` — it lets `.` + * match newlines so a multi-line `...` subtree is captured in one pass. + * `RegexOption.DOT_MATCHES_ALL` itself is JVM-only and breaks the Kotlin/Native build. + */ + private val STRIPPED_ELEMENT_PATTERNS: List = + STRIPPED_ELEMENTS.map { name -> + // Escape the name in case it contains regex metacharacters (e.g. __video). + val escaped = Regex.escape(name) + // Matches: + // + // + // ...content... + Regex("""(?s)<$escaped(?:\s[^>]*?)?/>|<$escaped(?:\s[^>]*?)?>.*?""") + } + + /** Matches whitespace between tags: `> \n <` → `><`. */ + private val INTER_TAG_WHITESPACE = Regex(""">\s+<""") + + /** Collapse leading / trailing whitespace across the whole fragment. */ + private val EDGE_WHITESPACE = Regex("""^\s+|\s+$""") + + /** + * Strip bloat elements and normalize whitespace on an inner `` fragment. + * + * The input is assumed to be the concatenated children of `` — i.e., what + * [CoTXmlParser.extractDetailInnerXml] returns. It is NOT the full `` or the `` wrapper itself. + * + * Returns an empty string if every element was stripped (so callers can treat "empty" and "nothing worth sending" + * uniformly). + */ + fun strip(detailInnerXml: String): String { + if (detailInnerXml.isEmpty()) return "" + var result = detailInnerXml + for (pattern in STRIPPED_ELEMENT_PATTERNS) { + result = pattern.replace(result, "") + } + // Collapse whitespace between remaining tags. Preserves whitespace inside + // text nodes (e.g. hello world) because that whitespace + // isn't bracketed by '>' and '<'. + result = INTER_TAG_WHITESPACE.replace(result, "><") + result = EDGE_WHITESPACE.replace(result, "") + return result + } +} diff --git a/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/CoTXml.kt b/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/CoTXml.kt index 732d03064..841e8e699 100644 --- a/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/CoTXml.kt +++ b/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/CoTXml.kt @@ -20,41 +20,69 @@ package org.meshtastic.core.takserver import kotlin.time.Instant -fun CoTMessage.toXml(): String = buildString { - append( - "", +/** + * Serialize this [CoTMessage] to a single `` XML element suitable for the CoT streaming TCP protocol used by + * ATAK / iTAK / WinTAK clients. + * + * **Important:** the output must NOT include an `` declaration. The CoT stream protocol is a continuous + * sequence of `` elements concatenated together; an XML declaration is only legal at the very start of a + * document and ATAK will drop the connection as malformed the moment it sees a second declaration mid-stream. + */ +fun CoTMessage.toXml(): String { + val sb = StringBuilder() + sb.append( + "", ) contact?.let { - append( - "", + sb.append( + "", ) } - group?.let { append("<__group role='${it.role.xmlEscaped()}' name='${it.name.xmlEscaped()}'/>") } + group?.let { sb.append("<__group role='${it.role.xmlEscaped()}' name='${it.name.xmlEscaped()}'/>") } - status?.let { append("") } + status?.let { sb.append("") } - track?.let { append("") } + track?.let { sb.append("") } if (chat != null) { val senderUid = uid.geoChatSenderUid() val messageId = uid.geoChatMessageId() - append( - "<__chat parent='RootContactGroup' groupOwner='false' messageId='$messageId' chatroom='${chat.chatroom.xmlEscaped()}' id='${chat.chatroom.xmlEscaped()}' senderCallsign='${chat.senderCallsign?.xmlEscaped() ?: ""}'>", + sb.append( + "<__chat parent='RootContactGroup' groupOwner='false' messageId='${messageId.xmlEscaped()}' chatroom='${chat.chatroom.xmlEscaped()}' id='${chat.chatroom.xmlEscaped()}' senderCallsign='${chat.senderCallsign?.xmlEscaped() ?: ""}'>", ) - append("") - append("<__serverdestination destinations='0.0.0.0:4242:tcp:${senderUid.xmlEscaped()}'/>") - append( + sb.append("") + sb.append("<__serverdestination destinations='0.0.0.0:4242:tcp:${senderUid.xmlEscaped()}'/>") + sb.append( "${chat.message.xmlEscaped()}", ) } else if (!remarks.isNullOrEmpty()) { - append("${remarks.xmlEscaped()}") + sb.append("${remarks.xmlEscaped()}") } - rawDetailXml?.takeIf { it.isNotEmpty() }?.let { append(it) } + rawDetailXml?.let { + if (it.isNotEmpty()) { + sb.append(it) + } + } - append("") + sb.append("") + return sb.toString() } -private fun Instant.toXmlString(): String = this.toString() +/** + * Format this [Instant] for CoT XML `time` / `start` / `stale` attributes. + * + * Always emits millisecond precision (`YYYY-MM-DDThh:mm:ss.SSSZ`). kotlinx-datetime's default [Instant.toString] can + * emit up to nanosecond precision; some TAK implementations choke on anything beyond milliseconds, so we truncate to ms + * and always include the millisecond field even when it would otherwise be zero. + */ +private fun Instant.toXmlString(): String { + val millis = this.toEpochMilliseconds() + val truncated = Instant.fromEpochMilliseconds(millis) + val base = truncated.toString() + // kotlinx-datetime omits the fractional part when it's zero; pad it ourselves so the + // CoT timestamp format is stable at ms precision. + return if (base.contains('.')) base else base.removeSuffix("Z") + ".000Z" +} diff --git a/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/CoTXmlFrameBuffer.kt b/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/CoTXmlFrameBuffer.kt index 7cf937d35..c55759347 100644 --- a/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/CoTXmlFrameBuffer.kt +++ b/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/CoTXmlFrameBuffer.kt @@ -85,6 +85,10 @@ internal class CoTXmlFrameBuffer(private val maxMessageSize: Long = DEFAULT_MAX_ companion object { private val EVENT_START_BYTES = ". */ +@file:Suppress("ReturnCount") + package org.meshtastic.core.takserver +import co.touchlab.kermit.Logger import nl.adaptivity.xmlutil.serialization.XML import kotlin.time.Clock import kotlin.time.Instant @@ -59,9 +62,37 @@ class CoTXmlParser(private val xml: String) { track = detail?.track?.let { CoTTrack(speed = it.speed, course = it.course) }, chat = buildChat(detail), remarks = buildRemarks(detail), + // Stripped version used as the raw_detail protobuf payload: drops bloat + // elements (colors, icons, archives, shapes, etc.) so unmapped CoT types + // have any chance of fitting in a LoRa mesh packet. See [CoTDetailStripper]. + parsedDetailXml = extractDetailInnerXml(xml)?.let(CoTDetailStripper::strip), + // Verbatim original event XML kept for diagnostic logging only — never + // goes on the wire. + sourceEventXml = xml, ) } + /** + * Extract the exact content between `` and `` from the original XML string. Used as the + * `raw_detail` fallback payload when we can't map the CoT type to a structured [org.meshtastic.proto.TAKPacketV2] + * payload. Preserves any extension elements the xmlutil parser discarded as "unknown children". + * + * Returns null for self-closed `` or when no detail element is present. + */ + private fun extractDetailInnerXml(xml: String): String? { + // Match `` (not ``) through its matching close tag. + val openIdx = xml.indexOf("', openIdx) + if (openEnd < 0) return null + // Self-closed tag like `` has no content. + if (xml[openEnd - 1] == '/') return null + val closeIdx = xml.indexOf("", openEnd) + if (closeIdx < 0) return null + val inner = xml.substring(openEnd + 1, closeIdx).trim() + return inner.ifEmpty { null } + } + private fun buildContact(detail: CoTDetailXml?): CoTContact? = detail?.contact?.let { if (it.callsign.isNotEmpty() || it.endpoint != null || it.phone != null) { CoTContact(callsign = it.callsign, endpoint = it.endpoint, phone = it.phone) @@ -107,7 +138,8 @@ class CoTXmlParser(private val xml: String) { val cleaned = dateString.replace(Regex("""\.\d+"""), "").replace("Z", "+00:00") Instant.parse(cleaned) } catch (ignoredInner: IllegalArgumentException) { - Clock.System.now() // Return now as fallback + Logger.w { "Unparseable CoT date '$dateString', falling back to now()" } + Clock.System.now() } } } diff --git a/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/RouteDataPackageGenerator.kt b/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/RouteDataPackageGenerator.kt new file mode 100644 index 000000000..9744b9597 --- /dev/null +++ b/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/RouteDataPackageGenerator.kt @@ -0,0 +1,119 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +@file:Suppress("ReturnCount") + +package org.meshtastic.core.takserver + +/** + * Converts route CoT XML (b-m-r) into ATAK-importable KML data packages. + * + * ATAK silently ignores route CoT events received over TCP streaming connections — it only accepts routes from KML/GPX + * file import, TAK Server mission sync, or data packages auto-imported from the monitored directory + * `/sdcard/atak/tools/datapackage/`. This generator bridges the gap by extracting waypoints from the SDK-reconstructed + * route XML and packaging them as a KML LineString inside a MissionPackageManifest v2 zip. + */ +object RouteDataPackageGenerator { + + private val EVENT_UID_RE = Regex("""]*\buid="([^"]*)"""") + private val CONTACT_CALLSIGN_RE = Regex("""]*\bcallsign="([^"]*)"""") + private val LINK_POINT_RE = Regex("""]*\bpoint="([^"]*)"[^>]*/>""") + + data class RouteKmlResult(val kml: String, val routeUid: String, val routeName: String) + + /** + * Extract waypoints from route CoT XML and generate a KML LineString. Returns null if fewer than 2 waypoints are + * found. + */ + fun generateKml(routeXml: String): RouteKmlResult? { + val uid = EVENT_UID_RE.find(routeXml)?.groupValues?.getOrNull(1) ?: return null + val name = CONTACT_CALLSIGN_RE.find(routeXml)?.groupValues?.getOrNull(1) ?: "Mesh Route" + + // Extract all waypoint coordinates from elements + val waypoints = + LINK_POINT_RE.findAll(routeXml) + .mapNotNull { match -> + val point = match.groupValues[1] // "lat,lon,hae" or "lat,lon" + val parts = point.split(",").map { it.trim() } + if (parts.size >= 2) { + val lat = parts[0] + val lon = parts[1] + val hae = parts.getOrElse(2) { "0" } + // KML coordinate order is lon,lat,hae (opposite of CoT's lat,lon,hae) + "$lon,$lat,$hae" + } else { + null + } + } + .toList() + + if (waypoints.size < 2) return null + + val kml = buildString { + appendLine("""""") + appendLine("""""") + appendLine(" ") + appendLine(" ${name.xmlEscaped()}") + appendLine(" ") + appendLine(" ${name.xmlEscaped()}") + appendLine(" ") + appendLine(" ") + appendLine(" ") + for (coord in waypoints) { + appendLine(" $coord") + } + appendLine(" ") + appendLine(" ") + appendLine(" ") + appendLine(" ") + append("") + } + + return RouteKmlResult(kml = kml, routeUid = uid, routeName = name) + } + + /** + * Generate a complete ATAK data package (zip) containing the route as KML. Returns (fileName, zipBytes) or null if + * the route XML can't be parsed. + */ + fun generateDataPackage(routeXml: String): Pair? { + val result = generateKml(routeXml) ?: return null + val kmlFileName = "${result.routeUid}.kml" + val zipFileName = "${result.routeUid}.zip" + + val manifest = buildString { + appendLine("""""") + appendLine(" ") + appendLine(""" """) + appendLine(""" """) + appendLine(""" """) + appendLine(" ") + appendLine(" ") + appendLine(""" """) + appendLine(" ") + append("") + } + + val zipBytes = + ZipArchiver.createZip( + mapOf(kmlFileName to result.kml.encodeToByteArray(), "manifest.xml" to manifest.encodeToByteArray()), + ) + + return zipFileName to zipBytes + } +} diff --git a/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TAKClientConnection.kt b/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TAKClientConnection.kt deleted file mode 100644 index eaa31a013..000000000 --- a/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TAKClientConnection.kt +++ /dev/null @@ -1,253 +0,0 @@ -/* - * Copyright (c) 2026 Meshtastic LLC - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -@file:Suppress("TooManyFunctions", "TooGenericExceptionCaught") - -package org.meshtastic.core.takserver - -import co.touchlab.kermit.Logger -import io.ktor.network.sockets.Socket -import io.ktor.network.sockets.isClosed -import io.ktor.network.sockets.openReadChannel -import io.ktor.network.sockets.openWriteChannel -import io.ktor.utils.io.ByteReadChannel -import io.ktor.utils.io.ByteWriteChannel -import io.ktor.utils.io.readAvailable -import io.ktor.utils.io.writeStringUtf8 -import kotlinx.coroutines.CancellationException -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch -import kotlinx.coroutines.sync.Mutex -import kotlinx.coroutines.sync.withLock -import kotlin.concurrent.Volatile -import kotlin.random.Random -import kotlin.time.Clock -import kotlin.time.Duration.Companion.milliseconds -import kotlin.time.Instant -import kotlinx.coroutines.isActive as coroutineIsActive - -class TAKClientConnection( - private val socket: Socket, - val clientInfo: TAKClientInfo, - private val onEvent: (TAKConnectionEvent) -> Unit, - private val scope: CoroutineScope, -) { - private var currentClientInfo = clientInfo - private val frameBuffer = CoTXmlFrameBuffer() - - private val readChannel: ByteReadChannel = socket.openReadChannel() - private val writeChannel: ByteWriteChannel = socket.openWriteChannel(autoFlush = true) - private val writeMutex = Mutex() - - /** Tracks the last time data was received from the client, used for idle timeout detection. */ - @Volatile private var lastDataReceived: Instant = Clock.System.now() - - /** Guards against emitting [TAKConnectionEvent.Disconnected] more than once. */ - @Volatile private var disconnectedEmitted = false - - fun start() { - onEvent(TAKConnectionEvent.Connected(currentClientInfo)) - sendProtocolSupport() - - scope.launch { readLoop() } - - scope.launch { keepaliveLoop() } - } - - private fun sendProtocolSupport() { - val serverUid = "Meshtastic-TAK-Server-${Random.nextInt().toString(TAK_HEX_RADIX)}" - val now = Clock.System.now() - val stale = now + TAK_KEEPALIVE_INTERVAL_MS.milliseconds - val detail = - """ - - - - """ - .trimIndent() - sendXml(buildEventXml(uid = serverUid, type = "t-x-takp-v", now = now, stale = stale, detail = detail)) - } - - private suspend fun readLoop() { - try { - val buffer = ByteArray(TAK_XML_READ_BUFFER_SIZE) - while (scope.coroutineIsActive && !socket.isClosed) { - // Suspend until data is available — no polling delay needed - readChannel.awaitContent() - val bytesRead = readChannel.readAvailable(buffer) - if (bytesRead > 0) { - lastDataReceived = Clock.System.now() - processReceivedData(buffer.copyOfRange(0, bytesRead)) - } else if (bytesRead == -1) { - break // EOF - } - } - } catch (e: CancellationException) { - throw e - } catch (e: Exception) { - Logger.w(e) { "TAK client read error: ${currentClientInfo.id}" } - emitDisconnected(TAKConnectionEvent.Error(e)) - return - } - emitDisconnected(TAKConnectionEvent.Disconnected) - } - - private suspend fun keepaliveLoop() { - val idleTimeoutMs = TAK_KEEPALIVE_INTERVAL_MS * TAK_READ_IDLE_TIMEOUT_MULTIPLIER - while (scope.coroutineIsActive && !socket.isClosed) { - kotlinx.coroutines.delay(TAK_KEEPALIVE_INTERVAL_MS) - - val idleMs = (Clock.System.now() - lastDataReceived).inWholeMilliseconds - if (idleMs > idleTimeoutMs) { - Logger.w { - "TAK client ${currentClientInfo.id} idle for ${idleMs}ms " + - "(threshold ${idleTimeoutMs}ms), closing connection" - } - close() - return - } - - sendKeepalive() - } - } - - private fun sendKeepalive() { - val now = Clock.System.now() - val stale = now + (TAK_KEEPALIVE_INTERVAL_MS * TAK_KEEPALIVE_STALE_MULTIPLIER).milliseconds - sendXml(buildEventXml(uid = "takPong", type = "t-x-c-t", now = now, stale = stale, detail = "")) - } - - private fun sendPong() { - val now = Clock.System.now() - val stale = now + (TAK_KEEPALIVE_INTERVAL_MS * TAK_KEEPALIVE_STALE_MULTIPLIER).milliseconds - sendXml(buildEventXml(uid = "takPong", type = "t-x-c-t-r", now = now, stale = stale, detail = "")) - } - - private fun processReceivedData(newData: ByteArray) { - // frameBuffer.append returns List — pass directly without re-encoding - frameBuffer.append(newData).forEach { xmlString -> parseAndHandleMessage(xmlString) } - } - - private fun parseAndHandleMessage(xmlString: String) { - // Parse first, then filter on the structured type field to avoid false positives - val parser = CoTXmlParser(xmlString) - val result = parser.parse() - - result.onSuccess { cotMessage -> - when { - cotMessage.type.startsWith("t-x-takp") -> { - handleProtocolControl(cotMessage.type, xmlString) - return - } - - cotMessage.type == "t-x-c-t" || cotMessage.uid == "ping" -> { - sendPong() - return - } - - else -> { - cotMessage.contact?.let { contact -> - val updatedClientInfo = - currentClientInfo.copy( - callsign = currentClientInfo.callsign ?: contact.callsign, - uid = currentClientInfo.uid ?: cotMessage.uid, - ) - if (updatedClientInfo != currentClientInfo) { - currentClientInfo = updatedClientInfo - onEvent(TAKConnectionEvent.ClientInfoUpdated(updatedClientInfo)) - } - } - - onEvent(TAKConnectionEvent.Message(cotMessage)) - } - } - } - } - - private fun handleProtocolControl(type: String, xmlString: String) { - if (type == "t-x-takp-q") { - sendProtocolResponse() - } else { - Logger.d { "Unhandled protocol control type: $type (raw=$xmlString)" } - } - } - - private fun sendProtocolResponse() { - val serverUid = "Meshtastic-TAK-Server-${Random.nextInt().toString(TAK_HEX_RADIX)}" - val now = Clock.System.now() - val stale = now + TAK_KEEPALIVE_INTERVAL_MS.milliseconds - val detail = - """ - - - - """ - .trimIndent() - sendXml(buildEventXml(uid = serverUid, type = "t-x-takp-r", now = now, stale = stale, detail = detail)) - } - - fun send(cotMessage: CoTMessage) { - val xml = cotMessage.toXml() - sendXml(xml) - } - - private fun buildEventXml(uid: String, type: String, now: Instant, stale: Instant, detail: String): String { - val detailContent = if (detail.isBlank()) "" else "$detail" - val point = """""" - return """""" + - point + - detailContent + - "" - } - - private fun sendXml(xml: String) { - scope.launch { - try { - writeMutex.withLock { - if (!socket.isClosed) { - writeChannel.writeStringUtf8(xml) - } - } - } catch (e: CancellationException) { - throw e - } catch (e: Exception) { - Logger.w(e) { "TAK client send error: ${currentClientInfo.id}" } - close() - } - } - } - - fun close() { - frameBuffer.clear() - try { - socket.close() - } catch (e: Exception) { - Logger.w(e) { "Error closing TAK client socket: ${currentClientInfo.id}" } - } - emitDisconnected(TAKConnectionEvent.Disconnected) - } - - /** - * Emits [event] (expected to be [TAKConnectionEvent.Disconnected] or [TAKConnectionEvent.Error]) at most once - * across all code paths. - */ - private fun emitDisconnected(event: TAKConnectionEvent) { - if (!disconnectedEmitted) { - disconnectedEmitted = true - onEvent(event) - } - } -} diff --git a/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TAKDataPackageGenerator.kt b/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TAKDataPackageGenerator.kt index e9a7ae668..1b5a86d39 100644 --- a/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TAKDataPackageGenerator.kt +++ b/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TAKDataPackageGenerator.kt @@ -14,6 +14,8 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ +@file:Suppress("LongMethod") + package org.meshtastic.core.takserver import nl.adaptivity.xmlutil.XmlDeclMode @@ -21,17 +23,27 @@ import nl.adaptivity.xmlutil.serialization.XML import kotlin.uuid.Uuid /** - * Generates TAK data packages (.zip) compatible with ATAK/iTAK import. + * Generates TAK data packages (.zip) compatible with ATAK/iTAK/WinTAK import. * * The data package follows the MissionPackageManifest v2 format: * ``` * Meshtastic_TAK_Server.zip * ├── meshtastic-server.pref (ATAK connection preferences) + * ├── truststore.p12 (server cert — matches iOS "truststore.p12") + * ├── client.p12 (client identity for mTLS) * └── manifest.xml (MissionPackageManifest v2) * ``` + * + * The bundled certificates / password match Meshtastic-Apple so a single exported package works on both ATAK (Android) + * and iTAK (iOS) without reconfiguration. + * + * Override [bundledCertBytesProvider] in tests to avoid touching the real classpath resources. In production the + * default reads from [TakCertLoader]. */ object TAKDataPackageGenerator { private const val PREF_FILE_NAME = "meshtastic-server.pref" + private const val TRUSTSTORE_FILE_NAME = "truststore.p12" + private const val CLIENT_P12_FILE_NAME = "client.p12" private const val PACKAGE_NAME = "Meshtastic_TAK_Server" private val xmlSerializer = XML { @@ -39,24 +51,37 @@ object TAKDataPackageGenerator { indentString = " " } + /** + * Platform-specific hook for reading the bundled TLS certificate bytes. Default implementation lives in + * `jvmAndroidMain` and reads them from classpath resources via [TakCertLoader]. + */ + var bundledCertBytesProvider: BundledCertBytesProvider = DefaultBundledCertBytesProvider + /** * Generate a complete TAK data package zip. * + * @param useTls when true, package includes `truststore.p12` + `client.p12` and the pref file uses `ssl`; when + * false, package is TCP-only (legacy). * @return zip file contents as a [ByteArray] */ fun generateDataPackage( serverHost: String = "127.0.0.1", port: Int = DEFAULT_TAK_PORT, + useTls: Boolean = true, description: String = "Meshtastic TAK Server", ): ByteArray { - val prefContent = generateConfigPref(serverHost, port, description) - val manifestContent = generateManifest(uid = Uuid.random().toString(), description = description) + val prefContent = generateConfigPref(serverHost, port, useTls, description) + val manifestContent = + generateManifest(uid = Uuid.random().toString(), description = description, useTls = useTls) - val entries = - mapOf( - PREF_FILE_NAME to prefContent.encodeToByteArray(), - "manifest.xml" to manifestContent.encodeToByteArray(), - ) + val entries = mutableMapOf() + entries[PREF_FILE_NAME] = prefContent.encodeToByteArray() + entries["manifest.xml"] = manifestContent.encodeToByteArray() + + if (useTls) { + bundledCertBytesProvider.serverP12Bytes()?.let { entries[TRUSTSTORE_FILE_NAME] = it } + bundledCertBytesProvider.clientP12Bytes()?.let { entries[CLIENT_P12_FILE_NAME] = it } + } return ZipArchiver.createZip(entries) } @@ -64,31 +89,88 @@ object TAKDataPackageGenerator { internal fun generateConfigPref( serverHost: String = "127.0.0.1", port: Int = DEFAULT_TAK_PORT, + useTls: Boolean = true, description: String = "Meshtastic TAK Server", ): String { + val protocolType = if (useTls) "ssl" else "tcp" val prefs = - TAKPreferencesXml( - preferences = - listOf( - TAKPreferenceXml( - version = "1", - name = "cot_streams", - entries = - listOf( - TAKEntryXml("count", "class java.lang.Integer", "1"), - TAKEntryXml("description0", "class java.lang.String", description), - TAKEntryXml("enabled0", "class java.lang.Boolean", "true"), - TAKEntryXml("connectString0", "class java.lang.String", "$serverHost:$port:tcp"), + if (useTls) { + // TLS / mTLS mode — matches the iOS data package format exactly. + TAKPreferencesXml( + preferences = + listOf( + TAKPreferenceXml( + version = "1", + name = "cot_streams", + entries = + listOf( + TAKEntryXml("count", "class java.lang.Integer", "1"), + TAKEntryXml("description0", "class java.lang.String", description), + TAKEntryXml("enabled0", "class java.lang.Boolean", "true"), + TAKEntryXml( + "connectString0", + "class java.lang.String", + "$serverHost:$port:$protocolType", + ), + ), + ), + TAKPreferenceXml( + version = "1", + name = "com.atakmap.app_preferences", + entries = + listOf( + TAKEntryXml("displayServerConnectionWidget", "class java.lang.Boolean", "true"), + TAKEntryXml( + "caLocation", + "class java.lang.String", + "cert/$TRUSTSTORE_FILE_NAME", + ), + TAKEntryXml("caPassword", "class java.lang.String", TAK_BUNDLED_CERT_PASSWORD), + TAKEntryXml( + "certificateLocation", + "class java.lang.String", + "cert/$CLIENT_P12_FILE_NAME", + ), + TAKEntryXml( + "clientPassword", + "class java.lang.String", + TAK_BUNDLED_CERT_PASSWORD, + ), + ), ), ), - TAKPreferenceXml( - version = "1", - name = "com.atakmap.app_preferences", - entries = - listOf(TAKEntryXml("displayServerConnectionWidget", "class java.lang.Boolean", "true")), + ) + } else { + // Legacy plain-TCP mode (not used in production, kept for tests / fallback) + TAKPreferencesXml( + preferences = + listOf( + TAKPreferenceXml( + version = "1", + name = "cot_streams", + entries = + listOf( + TAKEntryXml("count", "class java.lang.Integer", "1"), + TAKEntryXml("description0", "class java.lang.String", description), + TAKEntryXml("enabled0", "class java.lang.Boolean", "true"), + TAKEntryXml( + "connectString0", + "class java.lang.String", + "$serverHost:$port:$protocolType", + ), + ), + ), + TAKPreferenceXml( + version = "1", + name = "com.atakmap.app_preferences", + entries = + listOf( + TAKEntryXml("displayServerConnectionWidget", "class java.lang.Boolean", "true"), + ), + ), ), - ), - ) + ) + } return xmlSerializer .encodeToString(TAKPreferencesXml.serializer(), prefs) @@ -98,7 +180,11 @@ object TAKDataPackageGenerator { ) } - internal fun generateManifest(uid: String, description: String = "Meshtastic TAK Server"): String = buildString { + internal fun generateManifest( + uid: String, + description: String = "Meshtastic TAK Server", + useTls: Boolean = true, + ): String = buildString { appendLine("""""") appendLine(" ") appendLine(""" """) @@ -107,7 +193,31 @@ object TAKDataPackageGenerator { appendLine(" ") appendLine(" ") appendLine(""" """) + if (useTls) { + appendLine(""" """) + appendLine(""" """) + } appendLine(" ") append("") } } + +/** + * Supplies the bundled server / client PKCS#12 bytes for [TAKDataPackageGenerator]. Platform implementations live in + * `jvmAndroidMain`. + */ +interface BundledCertBytesProvider { + fun serverP12Bytes(): ByteArray? + + fun clientP12Bytes(): ByteArray? +} + +/** + * Default provider that returns `null` on platforms without a real implementation. Overridden at startup on JVM / + * Android by pointing [TAKDataPackageGenerator.bundledCertBytesProvider] at [TakCertLoader]. + */ +private object DefaultBundledCertBytesProvider : BundledCertBytesProvider { + override fun serverP12Bytes(): ByteArray? = null + + override fun clientP12Bytes(): ByteArray? = null +} diff --git a/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TAKDefaults.kt b/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TAKDefaults.kt index 32dc35829..e228bd267 100644 --- a/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TAKDefaults.kt +++ b/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TAKDefaults.kt @@ -20,22 +20,59 @@ import org.meshtastic.proto.MemberRole import org.meshtastic.proto.Team import org.meshtastic.proto.User -internal const val DEFAULT_TAK_PORT = 8087 +// Port 8089 is the standard TAK TLS port. Matches the iOS implementation so that +// a single exported data package (containing truststore.p12 + client.p12) works for +// both Meshtastic-iOS and Meshtastic-Android without reconfiguration in ATAK/iTAK. +internal const val DEFAULT_TAK_PORT = 8089 internal const val DEFAULT_TAK_ENDPOINT = "0.0.0.0:4242:tcp" + +// Bundled certificate password — matches iOS (`"meshtastic"`). Used for the +// server.p12 / client.p12 PKCS#12 files shipped under `tak_certs/` on the classpath. +internal const val TAK_BUNDLED_CERT_PASSWORD = "meshtastic" internal const val DEFAULT_TAK_TEAM_NAME = "Cyan" internal const val DEFAULT_TAK_ROLE_NAME = "Team Member" internal const val DEFAULT_TAK_BATTERY = 100 internal const val DEFAULT_TAK_STALE_MINUTES = 10 internal const val TAK_HEX_RADIX = 16 internal const val TAK_XML_READ_BUFFER_SIZE = 4_096 -internal const val TAK_KEEPALIVE_INTERVAL_MS = 30_000L -internal const val TAK_KEEPALIVE_STALE_MULTIPLIER = 3 -internal const val TAK_READ_IDLE_TIMEOUT_MULTIPLIER = 5 + +// ATAK's native commo library declares the connection dead after 25 seconds of +// silence (RX_TIMEOUT_SECONDS in streamingsocketmanagement.cpp) and starts +// sending t-x-c-t pings at 15 seconds (RX_STALE_SECONDS). Send keepalives +// well under the 15-second threshold so ATAK never enters its stale phase. +internal const val TAK_KEEPALIVE_INTERVAL_MS = 10_000L internal const val TAK_ACCEPT_LOOP_DELAY_MS = 100L internal const val TAK_COORDINATE_SCALE = 1e7 internal const val TAK_UNKNOWN_POINT_VALUE = 9_999_999.0 internal const val TAK_DIRECT_MESSAGE_PARTS_MIN = 3 +/** + * Hard cap on the size of a TAK v2 wire payload we will hand to the mesh layer. + * + * `CommandSenderImpl.sendData` checks `Data.ADAPTER.isWithinSizeLimit(data, Constants.DATA_PAYLOAD_LEN.value)` where + * `DATA_PAYLOAD_LEN = 233`. That 233 applies to the ENTIRE encoded `Data` proto (portnum tag + payload length-delim + + * reply_id + emoji), not just the `payload` bytes. The wrapper for a port-78 (`ATAK_PLUGIN_V2`) message costs roughly: + * * portnum varint + tag: 2 bytes + * * payload length prefix + tag: 2–3 bytes (depending on size) + * * reply_id / emoji: 0 bytes when unset + * + * That leaves ~228 bytes for the `payload` field alone. We use 225 to keep a small margin for future proto evolution. + * Anything larger than this is dropped in [TAKMeshIntegration.sendCoTToMesh] rather than being handed to the mesh + * layer, because the mesh layer would throw and the outer `SharedFlow` collector would eat the crash on every + * subsequent emission. + */ +internal const val MAX_TAK_WIRE_PAYLOAD_BYTES = 225 + +/** Default CoT type for PLI (Position Location Information) — friendly ground unit. */ +internal const val DEFAULT_PLI_COT_TYPE = "a-f-G-U-C" + +/** + * Max characters of raw CoT XML we'll write to logcat when dropping an oversized packet. ATAK can emit events several + * KB long; logging the whole thing floods logcat and buries the signal. 1024 chars is enough to see the event type, + * point, and the first few detail elements. + */ +internal const val TAK_LOG_XML_MAX_CHARS = 1_024 + internal fun Team?.toTakTeamName(): String = when (this) { null, Team.Unspecifed_Color, diff --git a/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TAKMeshIntegration.kt b/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TAKMeshIntegration.kt index 4f3001427..4db83f5c3 100644 --- a/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TAKMeshIntegration.kt +++ b/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TAKMeshIntegration.kt @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -@file:Suppress("ReturnCount", "TooGenericExceptionCaught") +@file:Suppress("ReturnCount", "TooGenericExceptionCaught", "LongMethod") package org.meshtastic.core.takserver @@ -24,73 +24,106 @@ import kotlinx.coroutines.Job import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.map -import kotlinx.coroutines.flow.mapLatest import kotlinx.coroutines.launch import okio.ByteString.Companion.toByteString +import org.meshtastic.core.model.Capabilities import org.meshtastic.core.model.DataPacket import org.meshtastic.core.repository.CommandSender import org.meshtastic.core.repository.MeshConfigHandler import org.meshtastic.core.repository.NodeRepository import org.meshtastic.core.repository.ServiceRepository -import org.meshtastic.core.takserver.TAKPacketConversion.toCoTMessage import org.meshtastic.core.takserver.TAKPacketConversion.toTAKPacket -import org.meshtastic.core.takserver.fountain.CoTHandler +import org.meshtastic.core.takserver.TAKPacketV2Conversion.toTAKPacketV2 import org.meshtastic.proto.MemberRole import org.meshtastic.proto.MeshPacket import org.meshtastic.proto.PortNum import org.meshtastic.proto.TAKPacket import org.meshtastic.proto.Team import kotlin.concurrent.Volatile +import kotlin.concurrent.atomics.AtomicBoolean +import kotlin.concurrent.atomics.ExperimentalAtomicApi +import kotlin.random.Random +import kotlin.time.Clock +import kotlin.time.Duration.Companion.minutes +/** + * Bidirectional bridge between the local TAK server and the Meshtastic mesh network. + * + * Outbound traffic (TAK client -> mesh) is version-gated on the connected radio's firmware version, exposed via + * [Capabilities.supportsTakV2]: + * - Firmware **>= 2.8.0**: TAKPacketV2 on port 78 (ATAK_PLUGIN_V2) with zstd dictionary compression via TAKPacket-SDK. + * Supports all CoT payload types (PLI, GeoChat, DrawnShape, Marker, Route, Aircraft, Casevac, Emergency, Task) with + * compact typed encodings that fit under the 237B LoRa MTU. + * - Firmware **<= 2.7.x**: Legacy [TAKPacket] on port 72 (ATAK_PLUGIN) with bare protobuf encoding. Supports only PLI + * and GeoChat — shapes, markers, routes, and other typed CoT events are dropped (with a warning) because the legacy + * schema cannot represent them. + * + * Inbound traffic (mesh -> TAK client) is always dual-path tolerant — both port 72 and port 78 are dispatched + * regardless of the local radio's firmware version, so a v2-capable node can still relay legacy v1 packets received + * from older nodes in mixed-firmware mesh deployments. + */ +@OptIn(ExperimentalAtomicApi::class) class TAKMeshIntegration( private val takServerManager: TAKServerManager, private val commandSender: CommandSender, - private val nodeRepository: NodeRepository, private val serviceRepository: ServiceRepository, private val meshConfigHandler: MeshConfigHandler, - private val cotHandler: CoTHandler, + private val nodeRepository: NodeRepository, ) { - @Volatile private var isRunning = false - private val jobs = mutableListOf() - private var currentTeam: Team = Team.Unspecifed_Color - private var currentRole: MemberRole = MemberRole.Unspecifed + private val isRunning = AtomicBoolean(false) + + // Immutable list reference replaced atomically in start()/stop(); never mutated in-place. + // @Volatile only guarantees visibility of the reference itself — any in-place mutation + // would bypass the visibility guarantee and must not be added. + @Volatile private var jobs: List = emptyList() + + @Volatile private var currentTeam: Team = Team.Unspecifed_Color + + @Volatile private var currentRole: MemberRole = MemberRole.Unspecifed fun start(scope: CoroutineScope) { - if (isRunning) return - isRunning = true + if (!isRunning.compareAndSet(expectedValue = false, newValue = true)) return takServerManager.start(scope) val newJobs = listOf( // Forward incoming CoT from TAK clients to mesh - scope.launch { takServerManager.inboundMessages.collect { cotMessage -> sendCoTToMesh(cotMessage) } }, + scope.launch { + takServerManager.inboundMessages.collect { (cotMessage, clientInfo) -> + // Enrich GeoChat messages with the originating TAK client's + // callsign when the message itself lacks one. This only applies + // to messages FROM the connected TAK client — mesh-originated + // messages flow through handleMeshPacket() instead. + val enriched = + if ( + cotMessage.type == "b-t-f" && + cotMessage.contact?.callsign.isNullOrEmpty() && + clientInfo?.callsign != null + ) { + cotMessage.copy( + contact = + (cotMessage.contact ?: CoTContact(callsign = "")).copy( + callsign = clientInfo.callsign, + ), + ) + } else { + cotMessage + } + sendCoTToMesh(enriched) + } + }, // Forward incoming ATAK packets from mesh to TAK clients scope.launch { serviceRepository.meshPacketFlow .filter { - it.decoded?.portnum == PortNum.ATAK_PLUGIN || it.decoded?.portnum == PortNum.ATAK_FORWARDER + it.decoded?.portnum == PortNum.ATAK_PLUGIN_V2 || it.decoded?.portnum == PortNum.ATAK_PLUGIN } .collect { packet -> handleMeshPacket(packet) } }, - // Broadcast node positions to TAK clients. - // mapLatest cancels any in-flight broadcast loop when a new node-map emission arrives, - // preventing N×M fan-out from stacking up across rapid consecutive updates. - scope.launch { - nodeRepository.nodeDBbyNum - .mapLatest { nodes -> - nodes.forEach { (_, node) -> - takServerManager.broadcastNode( - node = node, - team = currentTeam.toTakTeamName(), - role = currentRole.toTakRoleName(), - ) - } - } - .collect {} - }, + // Track TAK config changes scope.launch { meshConfigHandler.moduleConfig .map { it.tak } @@ -102,62 +135,418 @@ class TAKMeshIntegration( }, ) - jobs.addAll(newJobs) - - Logger.i { "TAK Mesh Integration started" } + jobs = newJobs + val fw = nodeRepository.myNodeInfo.value?.firmwareVersion + val proto = if (Capabilities(fw).supportsTakV2) "v2 (port 78, zstd)" else "v1 (port 72, legacy)" + Logger.i { "TAK Mesh Integration started — firmware=$fw, outbound=$proto" } } fun stop() { - if (!isRunning) return - isRunning = false - // Cancel all tracked jobs and clear the list - val toCancel: List - toCancel = jobs.toList() - jobs.clear() + if (!isRunning.compareAndSet(expectedValue = true, newValue = false)) return + val toCancel = jobs + jobs = emptyList() toCancel.forEach(Job::cancel) takServerManager.stop() Logger.i { "TAK Mesh Integration stopped" } } + // ── Send: TAK client → mesh ───────────────────────────────────────────── + + /** + * Determine the outbound TAK protocol version based on the connected radio's firmware version. Evaluated per-send + * (not cached) so the bridge picks up firmware upgrades during a session without restart. If the firmware version + * is unavailable (radio not yet handshook), default to V2 — the v2 firmware was released widely enough that + * defaulting to legacy would be a regression for the common case. + */ + private fun useTakV2(): Boolean { + val fw = nodeRepository.myNodeInfo.value?.firmwareVersion ?: return true + return Capabilities(fw).supportsTakV2 + } + private suspend fun sendCoTToMesh(cotMessage: CoTMessage) { - val takPacket = cotMessage.toTAKPacket() - if (takPacket == null) { - cotHandler.sendGenericCoT(cotMessage) + if (useTakV2()) { + sendCoTToMeshV2(cotMessage) + } else { + sendCoTToMeshV1(cotMessage) + } + } + + /** + * v2 send path (firmware >= 2.8.0): SDK parser + zstd dictionary compression, full typed payload support + * (DrawnShape, Marker, Route, Aircraft, Casevac, Emergency, Task, plus PLI / GeoChat). Wire format: `[flags + * byte][zstd-compressed TAKPacketV2 protobuf]` on port 78 (ATAK_PLUGIN_V2). + */ + private suspend fun sendCoTToMeshV2(cotMessage: CoTMessage) { + // Prefer the sourceEventXml for shape/marker/route types — the SDK's + // CotXmlParser extracts compact typed payloads (DrawnShape, Marker, + // Route, etc.) that compress far better than raw_detail encoding. + // For PLI and GeoChat, use the enriched CoTMessage (which may have + // had callsign/contact injected by the upstream enrichment step). + val rawXml = cotMessage.sourceEventXml ?: cotMessage.toXml() + // Extend stale for static objects (routes, shapes, markers) that may + // arrive over LoRa mesh past their original TTL. iTAK uses 2-min stale + // for routes; ATAK uses 24h. 5 min ensures it survives mesh delivery. + val freshXml = ensureMinimumStaleForMesh(rawXml) + // Strip non-essential elements before compression to save wire bytes + val xml = stripNonEssentialElements(freshXml) + + // Route through the SDK parser/compressor which handles all typed + // payloads (DrawnShape, Marker, Route, Aircraft, etc.) with compact + // proto fields instead of raw_detail XML. Falls back to the app's + // own conversion only if the SDK path fails. + // + // compressWithRemarksFallback preserves text when the + // compressed packet fits under the LoRa MTU, and strips remarks + // automatically if needed to fit. Returns null if even without + // remarks the packet exceeds the limit. + val wirePayload: ByteArray = + try { + TakSdkCompressor.compressCoT(xml, MAX_TAK_WIRE_PAYLOAD_BYTES) + ?: run { + Logger.w { + buildString { + append( + "Dropping oversized TAK packet: " + + "type=${cotMessage.type} max=$MAX_TAK_WIRE_PAYLOAD_BYTES", + ) + cotMessage.sourceEventXml?.let { src -> + append('\n') + append("Source CoT event: ") + append( + if (src.length <= TAK_LOG_XML_MAX_CHARS) { + src + } else { + src.take(TAK_LOG_XML_MAX_CHARS) + "…" + }, + ) + } + } + } + return + } + } catch (e: Exception) { + Logger.w(e) { "SDK parser/compressor failed for ${cotMessage.type}, trying app conversion" } + val takPacketV2 = cotMessage.toTAKPacketV2() + if (takPacketV2 == null) { + Logger.w { "Cannot convert CoT type ${cotMessage.type} to TAKPacketV2, dropping" } + return + } + try { + TakV2Compressor.compress(takPacketV2) + } catch (e2: Exception) { + Logger.w(e2) { "V2 compression failed for ${cotMessage.type}, using uncompressed wire format" } + encodeUncompressed(takPacketV2) + } + } + + try { + val dataPacket = + DataPacket( + to = DataPacket.ID_BROADCAST, + bytes = wirePayload.toByteString(), + dataType = PortNum.ATAK_PLUGIN_V2.value, + ) + commandSender.sendData(dataPacket) + Logger.d { "Sent V2 to mesh: ${cotMessage.type} (${wirePayload.size} bytes)" } + } catch (e: Exception) { + // Something other than size — radio not connected, queue full, etc. + Logger.e(e) { + "Failed to send TAKPacketV2 to mesh (${cotMessage.type}, ${wirePayload.size} bytes): ${e.message}" + } + } + } + + /** + * Legacy v1 send path (firmware <= 2.7.x): bare protobuf-encoded [TAKPacket] on port 72 (ATAK_PLUGIN), no zstd + * compression. Only PLI and GeoChat payloads are supported by the v1 schema — shapes, markers, routes, casevac, + * emergency, and task CoT events are dropped with a warning. + */ + private suspend fun sendCoTToMeshV1(cotMessage: CoTMessage) { + val takPacket = + cotMessage.toTAKPacket() + ?: run { + Logger.w { + "Dropping CoT for legacy v1 radio: type=${cotMessage.type} not representable " + + "in v1 TAKPacket schema (only PLI and GeoChat are supported). " + + "Upgrade radio firmware to >= 2.8.0 for full payload support." + } + return + } + + val wirePayload = TAKPacket.ADAPTER.encode(takPacket) + if (wirePayload.size > MAX_TAK_WIRE_PAYLOAD_BYTES) { + Logger.w { + "Dropping oversized v1 TAK packet: type=${cotMessage.type} " + + "size=${wirePayload.size}B max=$MAX_TAK_WIRE_PAYLOAD_BYTES" + } return } - val payload = TAKPacket.ADAPTER.encode(takPacket) - - val dataPacket = - DataPacket( - to = DataPacket.ID_BROADCAST, - bytes = payload.toByteString(), - dataType = PortNum.ATAK_PLUGIN.value, - ) - - commandSender.sendData(dataPacket) - Logger.d { "Forwarded CoT to mesh as TAKPacket: ${cotMessage.type}" } + try { + val dataPacket = + DataPacket( + to = DataPacket.ID_BROADCAST, + bytes = wirePayload.toByteString(), + dataType = PortNum.ATAK_PLUGIN.value, + ) + commandSender.sendData(dataPacket) + Logger.d { "Sent V1 to mesh: ${cotMessage.type} (${wirePayload.size} bytes)" } + } catch (e: Exception) { + Logger.e(e) { + "Failed to send v1 TAKPacket to mesh (${cotMessage.type}, ${wirePayload.size} bytes): ${e.message}" + } + } } + /** + * Wrap a [org.meshtastic.proto.TAKPacketV2] into the uncompressed v2 wire format: `[0xFF flag byte][raw protobuf]`. + * Used as a fallback when the zstd native lib isn't loaded. + */ + private fun encodeUncompressed(takPacketV2: org.meshtastic.proto.TAKPacketV2): ByteArray { + val protoBytes = org.meshtastic.proto.TAKPacketV2.ADAPTER.encode(takPacketV2) + val out = ByteArray(1 + protoBytes.size) + out[0] = TakV2Compressor.DICT_ID_UNCOMPRESSED.toByte() + protoBytes.copyInto(out, 1) + return out + } + + // ── Receive: mesh → TAK client ────────────────────────────────────────── + private suspend fun handleMeshPacket(packet: MeshPacket) { val payload = packet.decoded?.payload ?: return - if (packet.decoded?.portnum == PortNum.ATAK_FORWARDER) { - cotHandler.handleIncomingForwarderPacket(payload.toByteArray(), packet.from) - return + when (packet.decoded?.portnum) { + PortNum.ATAK_PLUGIN_V2 -> handleV2Packet(payload.toByteArray()) + PortNum.ATAK_PLUGIN -> handleV1Packet(payload) + else -> return + } + } + + private suspend fun handleV2Packet(wirePayload: ByteArray) { + try { + // Decompress to CoT XML via the SDK's CotXmlBuilder, which handles + // ALL typed payloads (DrawnShape, Marker, Route, etc.) and preserves + // shape detail elements (vertices, colors, stroke weight) that the + // app's own CoTXmlParser would strip. Forward the SDK-generated XML + // directly to TAK clients without re-parsing. + val rawXml = TakV2Compressor.decompressToXml(wirePayload) + // Strip the XML declaration and collapse whitespace — ATAK's TCP + // streaming parser expects bare ... on a single + // line, not a formatted XML document with prologue. + val xml = + rawXml + .replace("""""", "") + .replace(Regex("""\s*\n\s*"""), "") + .trim() + // Logger.d { "RAW CoT IN (mesh): $xml" } + // Routes: ATAK ignores b-m-r CoT events over TCP streaming. + // Convert to a KML data package and write to ATAK's auto-import dir. + if (xml.contains("""type="b-m-r"""")) { + try { + val pkg = RouteDataPackageGenerator.generateDataPackage(xml) + if (pkg != null) { + val (fileName, zipBytes) = pkg + AtakFileWriter.writeToImportDir(fileName, zipBytes) + } else { + Logger.w { "Route data package generation failed — not enough waypoints?" } + } + } catch (e2: Exception) { + Logger.w(e2) { "Route data package write failed: ${e2.message}" } + } + } + takServerManager.broadcastRawXml(xml) + Logger.d { "V2 → TAK clients (raw XML)" } + } catch (e: Exception) { + Logger.w(e) { "Failed to handle V2 packet: ${e.message}" } + } + } + + /** + * v1 receive path (firmware <= 2.7.x): decode bare protobuf [TAKPacket] (no compression) from port 72 (ATAK_PLUGIN) + * and convert to CoT for forwarding to attached TAK clients. Kept indefinitely so users on stable 2.7.x firmware + * retain PLI + GeoChat interop; new typed payloads (shapes, markers, routes, etc.) still require a v2-capable radio + * (firmware >= 2.8.0). + */ + private suspend fun handleV1Packet(payload: okio.ByteString) { + try { + val takPacket = TAKPacket.ADAPTER.decode(payload) + val cotMessage = convertV1ToCoT(takPacket) ?: return + takServerManager.broadcast(cotMessage) + Logger.d { "V1 → TAK clients: ${cotMessage.type}" } + } catch (e: Exception) { + Logger.w(e) { "Failed to handle V1 packet: ${e.message}" } + } + } + + private fun convertV1ToCoT(takPacket: TAKPacket): CoTMessage? { + val callsign = takPacket.contact?.callsign ?: "UNKNOWN" + val senderUid = takPacket.contact?.device_callsign ?: "unknown" + val teamName = takPacket.group?.team?.toTakTeamName() ?: DEFAULT_TAK_TEAM_NAME + val roleName = takPacket.group?.role?.toTakRoleName() ?: DEFAULT_TAK_ROLE_NAME + val battery = takPacket.status?.battery ?: DEFAULT_TAK_BATTERY + + val pli = takPacket.pli + if (pli != null) { + return CoTMessage.pli( + uid = senderUid, + callsign = callsign, + latitude = pli.latitude_i.toDouble() / TAK_COORDINATE_SCALE, + longitude = pli.longitude_i.toDouble() / TAK_COORDINATE_SCALE, + altitude = pli.altitude.toDouble(), + speed = pli.speed.toDouble(), + course = pli.course.toDouble(), + team = teamName, + role = roleName, + battery = battery, + staleMinutes = DEFAULT_TAK_STALE_MINUTES, + ) } - val takPacket = - try { - TAKPacket.ADAPTER.decode(payload) - } catch (e: Exception) { - Logger.w(e) { "Failed to decode TAKPacket from mesh" } - return + val chat = takPacket.chat + if (chat != null) { + val timeNow = Clock.System.now() + // Include chatroom in UID so ATAK routes DMs correctly — the UID format + // "GeoChat..." is what ATAK uses to determine routing. + // Hardcoding "All Chat Rooms" here loses DM routing from legacy v1 nodes. + val chatroom = chat.to ?: "All Chat Rooms" + val msgId = Random.Default.nextInt().toString(TAK_HEX_RADIX) + return CoTMessage( + uid = "GeoChat.$senderUid.$chatroom.$msgId", + type = "b-t-f", + how = "h-g-i-g-o", + time = timeNow, + start = timeNow, + stale = timeNow + DEFAULT_TAK_STALE_MINUTES.minutes, + latitude = 0.0, + longitude = 0.0, + contact = CoTContact(callsign = callsign, endpoint = DEFAULT_TAK_ENDPOINT), + group = CoTGroup(name = teamName, role = roleName), + status = CoTStatus(battery = battery), + chat = CoTChat(chatroom = chatroom, senderCallsign = callsign, message = chat.message), + ) + } + + return null + } + + companion object { + /** + * Minimum stale TTL (5 min) for static CoT types sent over mesh. iTAK uses 2-min stale for routes/shapes; over + * LoRa mesh with multi-hop relay, these arrive past stale and ATAK discards them. PLI and GeoChat are left + * untouched — their stale is meaningful. + */ + private val MIN_MESH_STALE_TTL = 15.minutes + private val STATIC_COT_PREFIXES = listOf("b-m-r", "u-d-", "b-m-p-") + private val EVENT_TYPE_RE = Regex("""]*\btype="([^"]*)"""") + + // Matches the stale attribute ONLY within the opening tag to avoid + // accidentally matching a stale="..." on a or other child element. + private val EVENT_TAG_RE = Regex("""]*>""") + private val STALE_ATTR_RE = Regex("""\bstale="([^"]*)"""") + + fun ensureMinimumStaleForMesh(xml: String): String { + val type = EVENT_TYPE_RE.find(xml)?.groupValues?.getOrNull(1) ?: return xml + if (STATIC_COT_PREFIXES.none { type.startsWith(it) }) return xml + // Search for stale only inside the opening tag, not in child elements + val eventTagMatch = EVENT_TAG_RE.find(xml) ?: return xml + val eventTag = eventTagMatch.value + val staleInTag = STALE_ATTR_RE.find(eventTag) ?: return xml + val staleStr = staleInTag.groupValues[1] + val staleInstant = + try { + kotlin.time.Instant.parse(staleStr) + } catch (_: IllegalArgumentException) { + // Handle edge-case formats like missing "Z" + try { + val cleaned = staleStr.replace(Regex("""\.\d+"""), "").replace("Z", "+00:00") + kotlin.time.Instant.parse(cleaned) + } catch (_: IllegalArgumentException) { + return xml + } + } + + val now = Clock.System.now() + val remaining = staleInstant - now + if (remaining >= MIN_MESH_STALE_TTL) return xml + + val newStale = now + MIN_MESH_STALE_TTL + val newStaleStr = newStale.toString().replace(Regex("""\.\d+"""), "") // strip fractional seconds + Logger.i { + "Extended stale for $type: $staleStr → $newStaleStr " + + "(was ${remaining.inWholeSeconds}s remaining, now ${MIN_MESH_STALE_TTL.inWholeSeconds}s)" } + // Replace the stale value only within the event tag, then splice the patched tag back + val newEventTag = eventTag.replaceRange(staleInTag.range, """stale="$newStaleStr"""") + return xml.replaceRange(eventTagMatch.range, newEventTag) + } - val cotMessage = takPacket.toCoTMessage() ?: return + /** + * Strip non-essential XML elements before mesh compression to save wire bytes. These elements add 100-200 bytes + * but aren't needed for rendering shapes, routes, chats, markers, PLI, or any other payload on the receiving + * end. + */ + private val STRIP_PATTERNS = + listOf( + """]*/>""", // TAK version (self-closing) + """]*>.*?""", // TAK version (paired) + """]*/>""", // voice chat state + """]*>.*?""", + """]*/>""", // empty marti + """]*>.*?""", + """<__geofence[^>]*/>""", // geofence config + """<__geofence[^>]*>.*?""", + """]*/>""", // toggle state + """]*/>""", // archive marker + """<__shapeExtras[^>]*/>""", // shape extras + """<__shapeExtras[^>]*>.*?""", + """]*/>""", // creator info + """]*>.*?""", + """]*/>""", // empty remarks (self-closing) + """]*>""", // empty remarks (paired) + """]*/>""", // stroke style (SDK uses color fields) + """]*/>""", // precision location metadata + """]*>.*?""", + """]*/>""", // iTAK camelCase variant + """]*>.*?""", + ) + .map { Regex(it, RegexOption.DOT_MATCHES_ALL) } - takServerManager.broadcast(cotMessage) - Logger.d { "Forwarded ATAK mesh packet to TAK clients: ${cotMessage.type}" } + // Strip any attribute with value "???" — unknown/placeholder metadata + private val UNKNOWN_ATTR_PATTERN = Regex("""\s+\w+\s*=\s*"[?]{3}"""") + + // Strip specific named attributes that the SDK doesn't use (display-only) + private val STRIP_ATTR_PATTERNS = + listOf( + """\s+routetype\s*=\s*"[^"]*"""", // route display type (SDK doesn't use) + """\s+order\s*=\s*"[^"]*"""", // checkpoint order label (SDK doesn't use) + """\s+color\s*=\s*"[^"]*"""", // link_attr color (SDK uses strokeColor instead) + """\s+access\s*=\s*"[^"]*"""", // access control (not relevant for mesh) + """\s+callsign\s*=\s*""""", // empty callsign attributes (e.g. checkpoints) + """\s+phone\s*=\s*""""", // empty phone attributes + ) + .map { Regex(it) } + + // Route waypoint UID stripping — UIDs are full 36-char UUIDs that cost + // ~40 bytes each in the proto wire format. The receiving TAK client derives + // its own UIDs, so these are pure overhead. Only targets elements + // with a point= attribute (route waypoints / shape vertices). + private val ROUTE_LINK_ELEM_RE = Regex("""]*\bpoint="[^"]*"[^>]*/>""") + private val LINK_UID_ATTR_RE = Regex("""\s+uid="[^"]*"""") + + fun stripNonEssentialElements(xml: String): String { + var result = xml + for (pattern in STRIP_PATTERNS) { + result = pattern.replace(result, "") + } + // Strip ??? attributes from remaining elements + result = UNKNOWN_ATTR_PATTERN.replace(result, "") + // Strip specific display-only attributes + for (pattern in STRIP_ATTR_PATTERNS) { + result = pattern.replace(result, "") + } + // Strip uid from route waypoint elements (receiver derives UIDs) + result = ROUTE_LINK_ELEM_RE.replace(result) { LINK_UID_ATTR_RE.replace(it.value, "") } + return result + } } } diff --git a/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TAKModels.kt b/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TAKModels.kt index c301a5a06..b66aa76ee 100644 --- a/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TAKModels.kt +++ b/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TAKModels.kt @@ -43,6 +43,22 @@ data class CoTMessage( val chat: CoTChat? = null, val remarks: String? = null, val rawDetailXml: String? = null, + /** + * Inner XML content of `...` captured by [CoTXmlParser] when this message was parsed from an + * incoming ATAK client event. Used as the `raw_detail` fallback payload when converting to + * [org.meshtastic.proto.TAKPacketV2] for CoT types that don't fit any structured payload (PLI / GeoChat / + * Aircraft). Null for messages constructed in-app. + * + * Distinct from [rawDetailXml], which is an output-only passthrough used by [toXml] to append extension content + * during serialization. + */ + val parsedDetailXml: String? = null, + /** + * The entire original `...` XML string as received from the ATAK client, captured by [CoTXmlParser]. + * Kept solely for diagnostic logging (e.g. when a packet exceeds the mesh MTU and is dropped) so the operator can + * see what the client actually sent. Null for messages constructed in-app. + */ + val sourceEventXml: String? = null, ) { companion object { fun pli( @@ -61,7 +77,7 @@ data class CoTMessage( val now = Clock.System.now() return CoTMessage( uid = uid, - type = "a-f-G-U-C", + type = DEFAULT_PLI_COT_TYPE, time = now, start = now, stale = now + staleMinutes.minutes, @@ -130,7 +146,7 @@ sealed class TAKConnectionEvent { data class ClientInfoUpdated(val clientInfo: TAKClientInfo) : TAKConnectionEvent() - data class Message(val cotMessage: CoTMessage) : TAKConnectionEvent() + data class Message(val cotMessage: CoTMessage, val clientInfo: TAKClientInfo? = null) : TAKConnectionEvent() data object Disconnected : TAKConnectionEvent() diff --git a/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TAKPacketConversion.kt b/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TAKPacketConversion.kt index 25af8abf9..4deb7cea7 100644 --- a/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TAKPacketConversion.kt +++ b/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TAKPacketConversion.kt @@ -31,14 +31,27 @@ import kotlin.random.Random import kotlin.time.Clock import kotlin.time.Duration.Companion.minutes +/** + * Legacy v1 CoT <-> TAKPacket conversion for firmware <= 2.7.x. + * + * Wire format: bare protobuf-encoded [TAKPacket] on `ATAK_PLUGIN` port 72, no zstd compression (the proto has an + * `is_compressed` flag but the firmware doesn't act on it). Supports only PLI and GeoChat payloads — shape, marker, + * route, casevac, emergency, and task CoT events return null and are dropped. + * + * For the SDK-backed path that handles all payload types with zstd dictionary compression on `ATAK_PLUGIN_V2` port 78, + * see [TAKPacketV2Conversion]. + * + * [TAKMeshIntegration] picks between the two paths based on `Capabilities.supportsTakV2` (firmware >= 2.8.0). + */ object TAKPacketConversion { fun CoTMessage.toTAKPacket(): TAKPacket? { val group = this.group?.let { Group( - role = MemberRole.fromValue(getMemberRoleValue(it.role)) ?: MemberRole.Unspecifed, - team = Team.fromValue(getTeamValue(it.name)) ?: Team.Unspecifed_Color, + role = + MemberRole.fromValue(TakConversionHelpers.getMemberRoleValue(it.role)) ?: MemberRole.Unspecifed, + team = Team.fromValue(TakConversionHelpers.getTeamValue(it.name)) ?: Team.Unspecifed_Color, ) } @@ -120,7 +133,7 @@ object TAKPacketConversion { val timeNow = Clock.System.now() val staleTime = timeNow + DEFAULT_TAK_STALE_MINUTES.minutes - val (senderUid, messageId) = parseDeviceCallsign(rawDeviceCallsign) + val (senderUid, messageId) = TakConversionHelpers.parseDeviceCallsign(rawDeviceCallsign) val localPli = pli if (localPli != null) { @@ -132,8 +145,8 @@ object TAKPacketConversion { altitude = localPli.altitude.toDouble(), speed = localPli.speed.toDouble(), course = localPli.course.toDouble(), - team = teamToColorName(group?.team), - role = roleToName(group?.role), + team = TakConversionHelpers.teamToColorName(group?.team), + role = TakConversionHelpers.roleToName(group?.role), battery = status?.battery ?: DEFAULT_TAK_BATTERY, staleMinutes = DEFAULT_TAK_STALE_MINUTES, ) @@ -160,7 +173,11 @@ object TAKPacketConversion { latitude = 0.0, longitude = 0.0, contact = CoTContact(callsign = senderCallsign, endpoint = DEFAULT_TAK_ENDPOINT), - group = CoTGroup(name = teamToColorName(group?.team), role = roleToName(group?.role)), + group = + CoTGroup( + name = TakConversionHelpers.teamToColorName(group?.team), + role = TakConversionHelpers.roleToName(group?.role), + ), status = CoTStatus(battery = status?.battery ?: DEFAULT_TAK_BATTERY), chat = CoTChat(chatroom = chatroom, senderCallsign = senderCallsign, message = localChat.message), ) @@ -168,29 +185,4 @@ object TAKPacketConversion { return null } - - private fun parseDeviceCallsign(combined: String): Pair { - val parts = combined.split("|", limit = 2) - return if (parts.size == 2) { - Pair(parts[0], parts[1].ifEmpty { null }) - } else { - Pair(combined, null) - } - } - - private fun getTeamValue(name: String): Int = - Team.entries.find { it.name.equals(name, ignoreCase = true) }?.value ?: 0 - - private fun getMemberRoleValue(roleName: String): Int = - MemberRole.entries.find { it.name.equals(roleName.replace(" ", ""), ignoreCase = true) }?.value ?: 0 - - private fun teamToColorName(team: Team?): String { - if (team == null || team == Team.Unspecifed_Color) return DEFAULT_TAK_TEAM_NAME - return team.toTakTeamName() - } - - private fun roleToName(role: MemberRole?): String { - if (role == null || role == MemberRole.Unspecifed) return DEFAULT_TAK_ROLE_NAME - return role.toTakRoleName() - } } diff --git a/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TAKPacketV2Conversion.kt b/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TAKPacketV2Conversion.kt new file mode 100644 index 000000000..42b4e471e --- /dev/null +++ b/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TAKPacketV2Conversion.kt @@ -0,0 +1,270 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +@file:Suppress("CyclomaticComplexMethod", "ReturnCount", "LongMethod", "MagicNumber") + +package org.meshtastic.core.takserver + +import co.touchlab.kermit.Logger +import okio.ByteString.Companion.toByteString +import org.meshtastic.proto.CotHow +import org.meshtastic.proto.CotType +import org.meshtastic.proto.GeoChat +import org.meshtastic.proto.GeoPointSource +import org.meshtastic.proto.MemberRole +import org.meshtastic.proto.TAKPacketV2 +import org.meshtastic.proto.Team +import kotlin.random.Random +import kotlin.time.Clock +import kotlin.time.Duration.Companion.minutes +import kotlin.time.Duration.Companion.seconds + +/** Conversion between CoTMessage and TAKPacketV2 (v2 wire protocol). */ +object TAKPacketV2Conversion { + + fun CoTMessage.toTAKPacketV2(): TAKPacketV2? { + val cotTypeEnum = TakV2TypeMapper.cotTypeFromString(type) + val cotTypeStr = if (cotTypeEnum == CotType.CotType_Other) type else "" + val howEnum = TakV2TypeMapper.cotHowFromString(how) + + val teamEnum = + group?.let { Team.fromValue(TakConversionHelpers.getTeamValue(it.name)) } ?: Team.Unspecifed_Color + + val roleEnum = + group?.let { MemberRole.fromValue(TakConversionHelpers.getMemberRoleValue(it.role)) } + ?: MemberRole.Unspecifed + + val battery = status?.battery?.coerceAtLeast(0) ?: 0 + + // PLI (position reports): match all atom CoT types ("a-*"). + // The original type is preserved via cot_type_id/cot_type_str so that hostile + // (a-h-*), neutral (a-n-*), and unknown (a-u-*) markers round-trip correctly. + // toCoTMessage() restores the exact type from those fields instead of defaulting + // to DEFAULT_PLI_COT_TYPE, so all atom markers are treated as PLI on the wire. + if (type.startsWith("a-")) { + val callsign = contact?.callsign ?: "UNKNOWN" + val deviceCallsign = uid + + return TAKPacketV2( + cot_type_id = cotTypeEnum, + cot_type_str = cotTypeStr, + how = howEnum, + callsign = callsign, + device_callsign = deviceCallsign, + uid = uid, + team = teamEnum, + role = roleEnum, + latitude_i = (latitude * TAK_COORDINATE_SCALE).toInt(), + longitude_i = (longitude * TAK_COORDINATE_SCALE).toInt(), + altitude = if (hae >= TAK_UNKNOWN_POINT_VALUE || hae.isNaN()) 0 else hae.toInt(), + // V2 encodes speed as cm/s (m/s × 100) and course as deg×100. + // V1 (legacy TAKPacket, port 72) uses raw integers with no scaling. + // These two paths are ALWAYS separate (different portnums) and must + // never cross-feed: a V1 packet decoded in TAKMeshIntegration goes + // through convertV1ToCoT() → CoTMessage.pli() → toXml(), NOT through + // toTAKPacketV2(). If this invariant is ever broken, speed/course + // would be silently off by ×100. + speed = (track?.speed?.coerceAtLeast(0.0)?.times(100))?.toInt() ?: 0, // m/s -> cm/s + course = (track?.course?.coerceAtLeast(0.0)?.times(100))?.toInt() ?: 0, // deg -> deg*100 + battery = battery, + geo_src = GeoPointSource.GeoPointSource_GPS, + alt_src = GeoPointSource.GeoPointSource_GPS, + pli = true, + ) + } + + // GeoChat + if (type == "b-t-f") { + val localChat = chat ?: return null + // ATAK GeoChat events often omit — the + // sender identity is only in <__chat senderCallsign="..."/>. + val callsign = contact?.callsign ?: localChat.senderCallsign ?: "UNKNOWN" + val actualDeviceUid = uid.geoChatSenderUid() + val messageId = + if (uid.startsWith("GeoChat.")) { + uid.geoChatMessageId() + } else { + Random.nextInt().toString(TAK_HEX_RADIX) + } + + val smuggledCallsign = + if (actualDeviceUid.isNotEmpty()) { + "$actualDeviceUid|$messageId" + } else { + contact?.endpoint ?: "" + } + + var toUid: String? = null + var toCallsign: String? = null + if (localChat.chatroom != "All Chat Rooms") { + if (localChat.chatroom.startsWith(uid) || uid.startsWith("GeoChat")) { + val parts = uid.split(".") + if (parts.size >= TAK_DIRECT_MESSAGE_PARTS_MIN && parts[0] == "GeoChat") { + toUid = localChat.chatroom + } + } else { + toCallsign = localChat.chatroom + } + } + + return TAKPacketV2( + cot_type_id = CotType.CotType_b_t_f, + how = CotHow.CotHow_h_g_i_g_o, + callsign = callsign, + device_callsign = smuggledCallsign, + uid = uid, + team = teamEnum, + role = roleEnum, + battery = battery, + chat = + GeoChat( + message = localChat.message, + to = toUid ?: if (toCallsign == null) "All Chat Rooms" else null, + to_callsign = toCallsign, + ), + ) + } + + // Fallback: wrap the whole detail XML in raw_detail for unmapped types + // (user-drawn shapes like u-d-c-c, markers like b-m-*, alerts, etc.) + val detailBytes = parsedDetailXml?.encodeToByteArray() + if (detailBytes != null) { + val callsign = contact?.callsign ?: "UNKNOWN" + return TAKPacketV2( + cot_type_id = cotTypeEnum, + cot_type_str = cotTypeStr, + how = howEnum, + callsign = callsign, + device_callsign = uid, + uid = uid, + team = teamEnum, + role = roleEnum, + latitude_i = (latitude * TAK_COORDINATE_SCALE).toInt(), + longitude_i = (longitude * TAK_COORDINATE_SCALE).toInt(), + altitude = if (hae >= TAK_UNKNOWN_POINT_VALUE || hae.isNaN()) 0 else hae.toInt(), + battery = battery, + raw_detail = detailBytes.toByteString(), + ) + } + + Logger.w { "Cannot convert CoT to TAKPacketV2 for type $type (no parsed detail)" } + return null + } + + fun TAKPacketV2.toCoTMessage(): CoTMessage? { + val senderCallsign = callsign.ifEmpty { "UNKNOWN" } + val rawDeviceCallsign = device_callsign.ifEmpty { uid.ifEmpty { "UNKNOWN" } } + val timeNow = Clock.System.now() + val (senderUid, messageId) = TakConversionHelpers.parseDeviceCallsign(rawDeviceCallsign) + + // PLI + if (pli != null) { + val staleMinutes = if (stale_seconds > 0) (stale_seconds / 60) else DEFAULT_TAK_STALE_MINUTES + // Restore the original CoT type and how from the packet — pli() defaults to + // DEFAULT_PLI_COT_TYPE/"m-g" but the sending node may have been hostile (a-h-*), + // neutral (a-n-*), unknown (a-u-*), etc. + val resolvedType = + cot_type_str.ifEmpty { TakV2TypeMapper.cotTypeToString(cot_type_id) ?: DEFAULT_PLI_COT_TYPE } + val resolvedHow = TakV2TypeMapper.cotHowToString(how) ?: "m-g" + return CoTMessage.pli( + uid = senderUid.ifEmpty { uid }, + callsign = senderCallsign, + latitude = latitude_i.toDouble() / TAK_COORDINATE_SCALE, + longitude = longitude_i.toDouble() / TAK_COORDINATE_SCALE, + altitude = altitude.toDouble(), + speed = speed.toDouble() / 100.0, // cm/s -> m/s + course = course.toDouble() / 100.0, // deg*100 -> deg + team = TakConversionHelpers.teamToColorName(team), + role = TakConversionHelpers.roleToName(role), + battery = battery, + staleMinutes = staleMinutes, + ) + .copy(type = resolvedType, how = resolvedHow) + } + + // GeoChat + val localChat = chat + if (localChat != null) { + // chat.to carries the recipient/room ID for DMs; null means broadcast. + // Do NOT fall through to chat.to_callsign here — despite the name, + // it holds the SENDER's callsign (the parser stores __chat[@senderCallsign] + // there), not a chatroom name. + val chatroom = localChat.to ?: "All Chat Rooms" + + val msgId = messageId ?: Random.nextInt().toString(TAK_HEX_RADIX) + val staleTime = + timeNow + + if (stale_seconds > 0) { + stale_seconds.seconds + } else { + DEFAULT_TAK_STALE_MINUTES.minutes + } + + return CoTMessage( + uid = "GeoChat.$senderUid.$chatroom.$msgId", + type = "b-t-f", + how = "h-g-i-g-o", + time = timeNow, + start = timeNow, + stale = staleTime, + latitude = latitude_i.toDouble() / TAK_COORDINATE_SCALE, + longitude = longitude_i.toDouble() / TAK_COORDINATE_SCALE, + contact = CoTContact(callsign = senderCallsign, endpoint = DEFAULT_TAK_ENDPOINT), + group = + CoTGroup( + name = TakConversionHelpers.teamToColorName(team), + role = TakConversionHelpers.roleToName(role), + ), + status = CoTStatus(battery = battery), + chat = CoTChat(chatroom = chatroom, senderCallsign = senderCallsign, message = localChat.message), + ) + } + + // Raw detail: unmapped CoT types round-tripped as opaque detail bytes. + // Emit a bare CoTMessage whose is the raw bytes verbatim. Do NOT populate + // contact/group/status here — those would be double-emitted by toXml() alongside + // rawDetailXml, corrupting the CoT stream. + val rawDetail = raw_detail + if (rawDetail != null) { + val rawXml = rawDetail.utf8() + val resolvedType = + cot_type_str.ifEmpty { TakV2TypeMapper.cotTypeToString(cot_type_id) ?: DEFAULT_PLI_COT_TYPE } + val resolvedHow = TakV2TypeMapper.cotHowToString(how) ?: "m-g" + val staleTime = + timeNow + + if (stale_seconds > 0) { + stale_seconds.seconds + } else { + DEFAULT_TAK_STALE_MINUTES.minutes + } + return CoTMessage( + uid = uid.ifEmpty { senderUid.ifEmpty { "tak-raw" } }, + type = resolvedType, + how = resolvedHow, + time = timeNow, + start = timeNow, + stale = staleTime, + latitude = latitude_i.toDouble() / TAK_COORDINATE_SCALE, + longitude = longitude_i.toDouble() / TAK_COORDINATE_SCALE, + hae = if (altitude == 0) TAK_UNKNOWN_POINT_VALUE else altitude.toDouble(), + rawDetailXml = rawXml, + ) + } + + Logger.w { "Cannot convert TAKPacketV2 to CoTMessage: no PLI, chat, or raw_detail payload" } + return null + } +} diff --git a/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TAKServer.kt b/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TAKServer.kt index 7cbfea908..0a55f4fda 100644 --- a/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TAKServer.kt +++ b/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TAKServer.kt @@ -14,198 +14,55 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -@file:Suppress("TooGenericExceptionCaught") - package org.meshtastic.core.takserver -import co.touchlab.kermit.Logger -import io.ktor.network.selector.SelectorManager -import io.ktor.network.sockets.ServerSocket -import io.ktor.network.sockets.Socket -import io.ktor.network.sockets.SocketAddress -import io.ktor.network.sockets.aSocket -import kotlinx.coroutines.CancellationException import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Job -import kotlinx.coroutines.delay -import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.flow.asStateFlow -import kotlinx.coroutines.launch -import kotlinx.coroutines.sync.Mutex -import kotlinx.coroutines.sync.withLock import org.meshtastic.core.di.CoroutineDispatchers -import kotlin.random.Random -import kotlinx.coroutines.isActive as coroutineIsActive -class TAKServer(private val dispatchers: CoroutineDispatchers, private val port: Int = DEFAULT_TAK_PORT) { - private var serverSocket: ServerSocket? = null - private var selectorManager: SelectorManager? = null - private var running = false - private var serverScope: CoroutineScope? = null - private var acceptJob: Job? = null - private val connectionsMutex = Mutex() +/** + * Platform-agnostic contract for the Meshtastic TAK server. + * + * The production implementation on Android / JVM runs a TLS (mTLS) listener on port [DEFAULT_TAK_PORT] (8089) using the + * bundled server identity. This matches the Meshtastic-Apple (iOS) implementation so that a single exported `.zip` data + * package is valid for ATAK on Android AND iTAK on iOS without re-configuration. + * + * The interface deliberately hides the platform socket / TLS primitives so that `commonMain` code + * (`TAKServerManagerImpl`, DI, tests) can depend on it without pulling `javax.net.ssl.*` into the common source set. + */ +interface TAKServer { - private val connections = mutableMapOf() + /** Observable count of currently-connected TAK clients (ATAK/iTAK). */ + val connectionCount: StateFlow - private val _connectionCount = MutableStateFlow(0) - val connectionCount: StateFlow = _connectionCount.asStateFlow() + /** Callback invoked on the IO dispatcher for every inbound CoT message from a client. */ + var onMessage: ((CoTMessage, TAKClientInfo?) -> Unit)? - var onMessage: ((CoTMessage) -> Unit)? = null + /** Callback invoked when a TAK client connects. Use to drain queued messages. */ + var onClientConnected: (() -> Unit)? - suspend fun start(scope: CoroutineScope): Result { - // Double-start guard: prevents SelectorManager / ServerSocket leaks - if (running) { - Logger.w { "TAK Server already running on port $port" } - return Result.success(Unit) - } + /** Bind the listener and begin accepting connections. Idempotent if already running. */ + suspend fun start(scope: CoroutineScope): Result - return try { - serverScope = scope - // Close any stale SelectorManager before creating a new one - selectorManager?.close() - selectorManager = SelectorManager(dispatchers.default) - serverSocket = aSocket(selectorManager!!).tcp().bind(hostname = "127.0.0.1", port = port) + /** Stop the listener, close all client sockets, and release OS resources. */ + fun stop() - running = true - acceptJob = scope.launch(dispatchers.io) { acceptLoop() } - Result.success(Unit) - } catch (e: Exception) { - Logger.e(e) { "Failed to bind TAK Server to 127.0.0.1:$port" } - Result.failure(e) - } - } + /** Broadcast a CoT message to every currently-connected client. */ + suspend fun broadcast(cotMessage: CoTMessage) - private suspend fun acceptLoop() { - val scope = serverScope ?: return - while (running && scope.coroutineIsActive) { - try { - val clientSocket = serverSocket?.accept() - if (clientSocket != null) { - handleConnection(clientSocket) - } - // No delay on the success path — accept() is already suspending - } catch (e: CancellationException) { - throw e - } catch (e: Exception) { - Logger.w(e) { "TAK server accept loop iteration failed" } - // Back-off only in the error path - delay(TAK_ACCEPT_LOOP_DELAY_MS) - } - } - } + /** + * Broadcast raw CoT XML to every currently-connected client. Used for mesh-originated messages that should be + * forwarded verbatim without re-parsing through the app's CoTXmlParser (which strips shape detail elements like + * strokeColor, fillColor, vertices, etc.). + */ + suspend fun broadcastRawXml(xml: String) - private fun handleConnection(clientSocket: Socket) { - val scope = serverScope ?: return - val endpoint = clientSocket.remoteAddress.toString() - - if (!clientSocket.remoteAddress.isLoopback()) { - Logger.w { "TAK server rejected non-loopback connection from $endpoint" } - clientSocket.close() - return - } - - val connectionId = Random.nextInt().toString(TAK_HEX_RADIX) - val clientInfo = TAKClientInfo(id = connectionId, endpoint = endpoint) - - val connection = - TAKClientConnection( - socket = clientSocket, - clientInfo = clientInfo, - onEvent = { event -> handleConnectionEvent(connectionId, event) }, - scope = scope, - ) - - scope.launch { - connectionsMutex.withLock { - connections[connectionId] = connection - _connectionCount.value = connections.size - } - connection.start() - } - } - - private fun handleConnectionEvent(connectionId: String, event: TAKConnectionEvent) { - when (event) { - is TAKConnectionEvent.Message -> { - onMessage?.invoke(event.cotMessage) - } - - is TAKConnectionEvent.Disconnected -> { - serverScope?.launch { - connectionsMutex.withLock { - connections.remove(connectionId) - _connectionCount.value = connections.size - } - } - } - - is TAKConnectionEvent.Error -> { - Logger.w(event.error) { "TAK client connection error: $connectionId" } - serverScope?.launch { - connectionsMutex.withLock { - connections.remove(connectionId) - _connectionCount.value = connections.size - } - } - } - - is TAKConnectionEvent.Connected -> { - /* no-op: logged by TAKClientConnection.start() */ - } - - is TAKConnectionEvent.ClientInfoUpdated -> { - /* no-op: TAKClientConnection tracks updated info locally */ - } - } - } - - fun stop() { - running = false - acceptJob?.cancel() - acceptJob = null - - // Close connections synchronously — TAKClientConnection.close() is non-suspending, - // so we don't need to launch into the (possibly-cancelled) serverScope. - val toClose: List - // We can't use Mutex.withLock here (non-suspending context) so we swap & clear under a - // best-effort copy — worst case a connection added concurrently is closed by socket teardown. - toClose = connections.values.toList() - connections.clear() - _connectionCount.value = 0 - toClose.forEach { it.close() } - - serverSocket?.close() - serverSocket = null - - selectorManager?.close() - selectorManager = null - serverScope = null - } - - suspend fun broadcast(cotMessage: CoTMessage) { - val currentConnections = connectionsMutex.withLock { connections.values.toList() } - currentConnections.forEach { connection -> - try { - connection.send(cotMessage) - } catch (e: Exception) { - Logger.w(e) { "Failed to broadcast CoT to TAK client ${connection.clientInfo.id}" } - connection.close() - } - } - } - - suspend fun hasConnections(): Boolean = connectionsMutex.withLock { connections.isNotEmpty() } + /** Returns true if at least one TAK client is currently connected. */ + suspend fun hasConnections(): Boolean } /** - * Returns true if this [SocketAddress] represents a loopback address (IPv4 127.x.x.x or IPv6 ::1). - * - * Ktor's [SocketAddress.toString] returns strings like "/127.0.0.1:4242" (JVM) or "127.0.0.1:4242" on other platforms, - * so we strip any leading slash and check prefixes without parsing the host. This keeps the check in commonMain without - * an expect/actual. + * Platform factory for [TAKServer]. The JVM/Android implementation lives in `jvmAndroidMain` and uses JSSE + * (`SSLServerSocket`) with the bundled `server.p12` identity and `ca.pem` client trust store. */ -private fun SocketAddress.isLoopback(): Boolean { - val addr = toString().removePrefix("/") - return addr.startsWith("127.") || addr.startsWith("::1") || addr.startsWith("[::1]") -} +expect fun createTAKServer(dispatchers: CoroutineDispatchers, port: Int = DEFAULT_TAK_PORT): TAKServer diff --git a/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TAKServerManager.kt b/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TAKServerManager.kt index cc6861d17..6f13f067e 100644 --- a/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TAKServerManager.kt +++ b/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TAKServerManager.kt @@ -18,39 +18,40 @@ package org.meshtastic.core.takserver import co.touchlab.kermit.Logger import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Job -import kotlinx.coroutines.channels.Channel -import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.SharedFlow import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.flow.asFlow +import kotlinx.coroutines.flow.asSharedFlow import kotlinx.coroutines.flow.asStateFlow -import kotlinx.coroutines.flow.consumeAsFlow import kotlinx.coroutines.launch import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock -import org.meshtastic.core.model.Node +import kotlin.time.Clock +import kotlin.time.Duration.Companion.minutes + +/** A CoT message received from a connected TAK client, paired with the client's identity. */ +data class InboundCoTMessage(val cotMessage: CoTMessage, val clientInfo: TAKClientInfo? = null) interface TAKServerManager { val isRunning: StateFlow val connectionCount: StateFlow - val inboundMessages: Flow + val inboundMessages: SharedFlow /** Start the TAK server using [scope]. Port is fixed at [TAKServer] construction time. */ fun start(scope: CoroutineScope) fun stop() - fun broadcastNode(node: Node, team: String = DEFAULT_TAK_TEAM_NAME, role: String = DEFAULT_TAK_ROLE_NAME) - fun broadcast(cotMessage: CoTMessage) + + /** Broadcast raw XML verbatim to TAK clients, bypassing CoTMessage parsing. */ + fun broadcastRawXml(xml: String) } -class TAKServerManagerImpl(private val takServer: TAKServer) : TAKServerManager { +internal class TAKServerManagerImpl(private val takServer: TAKServer) : TAKServerManager { private var scope: CoroutineScope? = null - private val lastBroadcastPositionsMutex = Mutex() private val _isRunning = MutableStateFlow(false) override val isRunning: StateFlow = _isRunning.asStateFlow() @@ -58,30 +59,42 @@ class TAKServerManagerImpl(private val takServer: TAKServer) : TAKServerManager // Mirror TAKServer's event-driven connection count — no polling needed override val connectionCount: StateFlow = takServer.connectionCount - private val _inboundMessages = MutableSharedFlow() - override val inboundMessages: Flow = _inboundMessages.asFlow() + private val _inboundMessages = MutableSharedFlow(extraBufferCapacity = 64) + override val inboundMessages: SharedFlow = _inboundMessages.asSharedFlow() - // Unbounded channel preserves FIFO ordering of inbound CoT messages under load. - // onMessage is a non-suspend callback, so we trySend (always succeeds for UNLIMITED) - // and a single consumer coroutine drains into _inboundMessages in order. - private var inboundChannel: Channel? = null - private var inboundDrainJob: Job? = null + // Offline message queue — buffers mesh-originated CoT messages when no TAK + // clients are connected, then drains them when a client reconnects. Entries + // expire after OFFLINE_QUEUE_TTL to avoid delivering stale situational data. + private data class QueuedMessage(val cotMessage: CoTMessage, val enqueuedAt: kotlin.time.Instant) - private var lastBroadcastPositions = mutableMapOf() + private val offlineQueue = ArrayDeque() + private val offlineQueueMutex = Mutex() + + companion object { + private val OFFLINE_QUEUE_TTL = 5.minutes + private const val OFFLINE_QUEUE_MAX_SIZE = 50 + } override fun start(scope: CoroutineScope) { - this.scope = scope if (_isRunning.value) { Logger.w { "TAKServerManager already running" } return } + // Assign scope AFTER the guard so a second concurrent start() can never + // overwrite the active scope without actually restarting the server. + this.scope = scope scope.launch { // Wire up inbound message handler BEFORE starting so no messages are lost. - val channel = Channel(Channel.UNLIMITED) - inboundChannel = channel - inboundDrainJob = scope.launch { channel.consumeAsFlow().collect { _inboundMessages.emit(it) } } - takServer.onMessage = { cotMessage -> channel.trySend(cotMessage) } + // Use tryEmit (non-suspending) with extraBufferCapacity to avoid launching a + // new coroutine per message, which would create unbounded coroutines under + // high message rates and could reorder messages. + takServer.onMessage = { cotMessage, clientInfo -> + if (!_inboundMessages.tryEmit(InboundCoTMessage(cotMessage, clientInfo))) { + Logger.w { "TAK inbound message buffer full; dropping message from ${clientInfo?.id}" } + } + } + takServer.onClientConnected = { drainOfflineQueue() } val result = takServer.start(scope) if (result.isSuccess) { @@ -91,81 +104,68 @@ class TAKServerManagerImpl(private val takServer: TAKServer) : TAKServerManager Logger.e(result.exceptionOrNull()) { "Failed to start TAK Server" } // Clear onMessage if start failed so we don't hold a reference unnecessarily takServer.onMessage = null - inboundDrainJob?.cancel() - inboundDrainJob = null - channel.close() - inboundChannel = null } } } override fun stop() { - takServer.stop() - takServer.onMessage = null - inboundChannel?.close() - inboundChannel = null - inboundDrainJob?.cancel() - inboundDrainJob = null + // Flip the running flag and null out the scope BEFORE stopping the server so + // any broadcast()/drainOfflineQueue() that races stop() sees _isRunning=false + // and exits early instead of launching coroutines on a scope that is about to + // be discarded. _isRunning.value = false scope = null + takServer.onMessage = null + takServer.stop() Logger.i { "TAK Server stopped" } } - override fun broadcastNode(node: Node, team: String, role: String) { - if (!_isRunning.value) return - val currentScope = scope ?: return - - currentScope.launch { - if (!takServer.hasConnections()) return@launch - - val position = node.validPosition - if (position == null) { - broadcastNodeInfoOnly(node, team, role) - return@launch - } - - val shouldBroadcast = - lastBroadcastPositionsMutex.withLock { - val last = lastBroadcastPositions[node.num] - if (position.time == last) { - false - } else { - lastBroadcastPositions[node.num] = position.time - true - } - } - if (!shouldBroadcast) return@launch - - val cotMessage = - position.toCoTMessage( - uid = node.user.id, - callsign = node.user.toTakCallsign(), - team = team, - role = role, - battery = node.deviceMetrics.battery_level ?: 100, - ) - - takServer.broadcast(cotMessage) - } - } - - private fun broadcastNodeInfoOnly(node: Node, team: String, role: String) { - val currentScope = scope ?: return - val cotMessage = - node.user.toCoTMessage( - position = null, - team = team, - role = role, - battery = node.deviceMetrics.battery_level ?: 100, - ) - - currentScope.launch { - if (!takServer.hasConnections()) return@launch - takServer.broadcast(cotMessage) - } - } - override fun broadcast(cotMessage: CoTMessage) { - scope?.launch { takServer.broadcast(cotMessage) } + if (!_isRunning.value) return + scope?.launch { + if (takServer.hasConnections()) { + takServer.broadcast(cotMessage) + } else { + // No TAK clients connected — queue for delivery when one reconnects + offlineQueueMutex.withLock { + // Evict expired entries + val cutoff = Clock.System.now() - OFFLINE_QUEUE_TTL + while (offlineQueue.isNotEmpty() && offlineQueue.first().enqueuedAt < cutoff) { + offlineQueue.removeFirst() + } + // Cap size to prevent unbounded growth + if (offlineQueue.size >= OFFLINE_QUEUE_MAX_SIZE) { + offlineQueue.removeFirst() + } + offlineQueue.addLast(QueuedMessage(cotMessage, Clock.System.now())) + } + } + } + } + + override fun broadcastRawXml(xml: String) { + if (!_isRunning.value) return + scope?.launch { takServer.broadcastRawXml(xml) } + } + + /** + * Drain any queued messages to the newly connected TAK client. Called by the server when a TAK client connects + * (Connected event). + */ + internal fun drainOfflineQueue() { + if (!_isRunning.value) return + scope?.launch { + val messages = + offlineQueueMutex.withLock { + val cutoff = Clock.System.now() - OFFLINE_QUEUE_TTL + val valid = offlineQueue.filter { it.enqueuedAt >= cutoff }.map { it.cotMessage } + offlineQueue.clear() + valid + } + if (messages.isNotEmpty()) { + Logger.i { "Draining ${messages.size} queued message(s) to reconnected TAK client" } + messages.forEach { takServer.broadcast(it) } + } + } } } diff --git a/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TakConversionHelpers.kt b/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TakConversionHelpers.kt new file mode 100644 index 000000000..3174ece0e --- /dev/null +++ b/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TakConversionHelpers.kt @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.meshtastic.core.takserver + +import org.meshtastic.proto.MemberRole +import org.meshtastic.proto.Team + +/** + * Internal helpers shared by [TAKPacketConversion] (legacy v1, firmware <= 2.7.x) and [TAKPacketV2Conversion] + * (firmware >= 2.8.x). Both paths map between the SDK's [CoTMessage] model and Meshtastic's Wire-generated proto types + * using identical logic for color/role lookup and the "|" smuggled-callsign format that survives + * the wire round trip. + */ +internal object TakConversionHelpers { + + /** Split a `|` smuggled callsign back into its parts. */ + fun parseDeviceCallsign(combined: String): Pair { + val parts = combined.split("|", limit = 2) + return if (parts.size == 2) { + Pair(parts[0], parts[1].ifEmpty { null }) + } else { + Pair(combined, null) + } + } + + /** Map a [Team] proto enum back to its CoT color-name string. Unspecified -> default. */ + fun teamToColorName(team: Team?): String { + if (team == null || team == Team.Unspecifed_Color) return DEFAULT_TAK_TEAM_NAME + return team.toTakTeamName() + } + + /** Map a [MemberRole] proto enum back to its CoT role-name string. Unspecified -> default. */ + fun roleToName(role: MemberRole?): String { + if (role == null || role == MemberRole.Unspecifed) return DEFAULT_TAK_ROLE_NAME + return role.toTakRoleName() + } + + /** Reverse lookup from CoT color-name string to [Team] proto enum value (0 = Unspecified). */ + fun getTeamValue(name: String): Int = Team.entries.find { it.name.equals(name, ignoreCase = true) }?.value ?: 0 + + /** Reverse lookup from CoT role-name string to [MemberRole] proto enum value (0 = Unspecified). */ + fun getMemberRoleValue(roleName: String): Int = + MemberRole.entries.find { it.name.equals(roleName.replace(" ", ""), ignoreCase = true) }?.value ?: 0 +} diff --git a/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/fountain/CoTHandler.kt b/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TakFixtureLoader.kt similarity index 57% rename from core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/fountain/CoTHandler.kt rename to core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TakFixtureLoader.kt index 544aabfad..7d2843bb3 100644 --- a/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/fountain/CoTHandler.kt +++ b/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TakFixtureLoader.kt @@ -14,18 +14,12 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package org.meshtastic.core.takserver.fountain - -import org.meshtastic.core.takserver.CoTMessage +package org.meshtastic.core.takserver /** - * Handles incoming and outgoing generic Cursor on Target (CoT) messages wrapped in Meshtastic DataPackets. + * Platform-specific loader for TAK test fixture XML files bundled in test resources. * - * Defines the contract for routing Direct (unfragmented) vs Fountain-encoded packets, and processing decompressed - * EXI/Zlib XML payloads. + * On JVM/Android the resources are loaded via the classloader. On iOS the test runner is not supported and this throws + * [UnsupportedOperationException]. */ -interface CoTHandler { - suspend fun sendGenericCoT(cotMessage: CoTMessage) - - suspend fun handleIncomingForwarderPacket(payload: ByteArray, senderNodeNum: Int) -} +internal expect fun loadTakFixtureXml(name: String): String diff --git a/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TakMeshTestRunner.kt b/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TakMeshTestRunner.kt new file mode 100644 index 000000000..b422a8a12 --- /dev/null +++ b/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TakMeshTestRunner.kt @@ -0,0 +1,193 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +@file:Suppress("TooGenericExceptionCaught", "ReturnCount") + +package org.meshtastic.core.takserver + +import co.touchlab.kermit.Logger +import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.sync.Mutex +import okio.ByteString.Companion.toByteString +import org.meshtastic.core.model.DataPacket +import org.meshtastic.core.repository.CommandSender +import org.meshtastic.proto.PortNum + +/** Result of sending a single test fixture through the TAK mesh pipeline. */ +data class TakTestResult( + val fixtureName: String, + val xmlBytes: Int, + val compressedBytes: Int, + val passed: Boolean, + val error: String? = null, +) + +/** + * Debug-only test runner that sends the SDK's CoT XML test fixtures through the real TAK mesh pipeline: strip → parse → + * compress → send to mesh radio. + * + * Paces sends by waiting [sendDelayMs] between each fixture to avoid flooding the radio's TX queue. + */ +class TakMeshTestRunner(private val commandSender: CommandSender) { + private val _results = MutableStateFlow>(emptyList()) + val results: StateFlow> = _results.asStateFlow() + + private val _isRunning = MutableStateFlow(false) + val isRunning: StateFlow = _isRunning.asStateFlow() + + private val _currentFixture = MutableStateFlow(null) + val currentFixture: StateFlow = _currentFixture.asStateFlow() + + // Prevents concurrent invocations from racing the _isRunning check-then-set. + private val runMutex = Mutex() + + companion object { + /** Delay between sends to let the radio transmit and receive ACK. */ + private const val SEND_DELAY_MS = 5_000L + + /** All bundled fixture filenames. */ + val FIXTURE_NAMES = + listOf( + "aircraft_adsb.xml", + "aircraft_hostile.xml", + "alert_tic.xml", + "casevac.xml", + "casevac_medline.xml", + "chat_receipt_delivered.xml", + "chat_receipt_read.xml", + "delete_event.xml", + "drawing_circle.xml", + "drawing_circle_large.xml", + "drawing_ellipse.xml", + "drawing_freeform.xml", + "drawing_polygon.xml", + "drawing_rectangle.xml", + "drawing_rectangle_itak.xml", + "drawing_telestration.xml", + "emergency_911.xml", + "emergency_cancel.xml", + "geochat_broadcast.xml", + "geochat_dm.xml", + "geochat_simple.xml", + "marker_2525.xml", + "marker_goto.xml", + "marker_goto_itak.xml", + "marker_icon_set.xml", + "marker_spot.xml", + "marker_tank.xml", + "pli_basic.xml", + "pli_full.xml", + "pli_itak.xml", + "pli_stationary.xml", + "pli_takaware.xml", + "pli_webtak.xml", + "ranging_bullseye.xml", + "ranging_circle.xml", + "ranging_line.xml", + "route_3wp.xml", + "route_itak_3wp.xml", + "task_engage.xml", + "waypoint.xml", + ) + } + + /** + * Run all test fixtures sequentially, sending each through the mesh pipeline. Updates [results] and + * [currentFixture] as each fixture is processed. + */ + suspend fun runAll() { + // Use tryLock to prevent concurrent test runs: if another coroutine is already + // inside runAll(), tryLock returns false and we bail immediately. This is safer + // than the check-then-set pattern which has a TOCTOU race in multi-threaded + // coroutine dispatch. + if (!runMutex.tryLock()) return + try { + _isRunning.value = true + _results.value = emptyList() + + val allResults = mutableListOf() + + for (name in FIXTURE_NAMES) { + _currentFixture.value = name + val result = runSingleFixture(name) + allResults.add(result) + _results.value = allResults.toList() + + if (result.passed) { + // Wait for radio airtime + ACK before next send + delay(SEND_DELAY_MS) + } + } + + _currentFixture.value = null + + val passed = allResults.count { it.passed } + val failed = allResults.size - passed + Logger.i { "TAK Mesh Test complete: $passed/${allResults.size} passed, $failed failed" } + } finally { + _isRunning.value = false + runMutex.unlock() + } + } + + private suspend fun runSingleFixture(name: String): TakTestResult { + // Load fixture XML from bundled resources via platform-specific loader + val xml = + try { + loadTakFixtureXml(name) + } catch (e: Exception) { + Logger.w(e) { "Failed to load fixture $name" } + return TakTestResult(name, 0, 0, false, "Load failed: ${e.message}") + } + + // Apply the same pipeline as TAKMeshIntegration.sendCoTToMesh() + val freshXml = TAKMeshIntegration.ensureMinimumStaleForMesh(xml) + val strippedXml = TAKMeshIntegration.stripNonEssentialElements(freshXml) + + // Parse and compress via SDK + val wirePayload: ByteArray + try { + val compressed = TakSdkCompressor.compressCoT(strippedXml, MAX_TAK_WIRE_PAYLOAD_BYTES) + if (compressed == null) { + Logger.w { "TAK Test: $name oversized even without remarks (xml=${xml.length}B)" } + return TakTestResult(name, xml.length, 0, false, "Oversized (>${MAX_TAK_WIRE_PAYLOAD_BYTES}B)") + } + wirePayload = compressed + } catch (e: Exception) { + Logger.w(e) { "TAK Test: $name compression failed: ${e.message}" } + return TakTestResult(name, xml.length, 0, false, "Compress failed: ${e.message}") + } + + // Send to mesh + try { + val dataPacket = + DataPacket( + to = DataPacket.ID_BROADCAST, + bytes = wirePayload.toByteString(), + dataType = PortNum.ATAK_PLUGIN_V2.value, + ) + commandSender.sendData(dataPacket) + Logger.i { "TAK Test: $name → ${wirePayload.size}B (xml=${xml.length}B)" } + return TakTestResult(name, xml.length, wirePayload.size, true) + } catch (e: Exception) { + Logger.w(e) { "TAK Test: $name send failed: ${e.message}" } + return TakTestResult(name, xml.length, wirePayload.size, false, "Send failed: ${e.message}") + } + } +} diff --git a/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TakSdkCompressor.kt b/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TakSdkCompressor.kt new file mode 100644 index 000000000..49f845931 --- /dev/null +++ b/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TakSdkCompressor.kt @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.meshtastic.core.takserver + +/** + * Expect/actual wrapper for the TAKPacket-SDK compression pipeline. + * + * On JVM/Android the SDK's [org.meshtastic.tak.CotXmlParser] and [org.meshtastic.tak.TakCompressor] are available. On + * iOS they are not, so the actual throws [UnsupportedOperationException]. + */ +internal expect object TakSdkCompressor { + + /** + * Parse CoT XML via the SDK and compress with remarks-fallback. + * + * @return compressed wire payload, or `null` if the packet exceeds [maxBytes] even without remarks. + * @throws Exception on parse or compression failure. + */ + fun compressCoT(xml: String, maxBytes: Int): ByteArray? +} diff --git a/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TakV2Compressor.kt b/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TakV2Compressor.kt new file mode 100644 index 000000000..2d131c8aa --- /dev/null +++ b/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TakV2Compressor.kt @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.meshtastic.core.takserver + +import org.meshtastic.proto.TAKPacketV2 + +/** + * TAKPacket V2 wire format compressor/decompressor. + * + * Wire format: [1 byte flags][zstd-compressed TAKPacketV2 protobuf] Flags byte bits 0-5 = dictionary ID, bits 6-7 = + * reserved. Special value 0xFF = uncompressed raw protobuf (from TAK_TRACKER firmware). + * + * Platform-specific implementations use zstd with pre-trained dictionaries. + */ +internal expect object TakV2Compressor { + + /** Maximum allowed decompressed payload size (bytes). */ + val MAX_DECOMPRESSED_SIZE: Int + + /** Dictionary ID for non-aircraft types. */ + val DICT_ID_NON_AIRCRAFT: Int + + /** Dictionary ID for aircraft types. */ + val DICT_ID_AIRCRAFT: Int + + /** Special flags byte value indicating uncompressed raw protobuf. */ + val DICT_ID_UNCOMPRESSED: Int + + /** + * Compress a TAKPacketV2 into wire payload: [flags byte][zstd compressed protobuf]. Selects dictionary based on the + * CoT type classification. + */ + fun compress(packet: TAKPacketV2): ByteArray + + /** + * Decompress a wire payload back to TAKPacketV2. Handles both compressed (dict-based) and uncompressed (0xFF) + * payloads. + * + * @throws IllegalArgumentException if payload is malformed or exceeds size limits. + */ + fun decompress(wirePayload: ByteArray): TAKPacketV2 + + /** + * Decompress a wire payload and reconstruct CoT XML via the SDK's CotXmlBuilder. Handles ALL payload types + * (DrawnShape, Marker, Route, etc.) without going through the Wire proto intermediate. + */ + fun decompressToXml(wirePayload: ByteArray): String +} diff --git a/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TakV2TypeMapper.kt b/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TakV2TypeMapper.kt new file mode 100644 index 000000000..d7956886a --- /dev/null +++ b/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TakV2TypeMapper.kt @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.meshtastic.core.takserver + +import org.meshtastic.proto.CotHow +import org.meshtastic.proto.CotType + +/** Maps CoT type strings (e.g. "a-f-G-U-C") to CotType enum values and back. */ +internal object TakV2TypeMapper { + + private val stringToType: Map = + mapOf( + "a-f-G-U-C" to CotType.CotType_a_f_G_U_C, + "a-f-G-U-C-I" to CotType.CotType_a_f_G_U_C_I, + "a-n-A-C-F" to CotType.CotType_a_n_A_C_F, + "a-n-A-C-H" to CotType.CotType_a_n_A_C_H, + "a-n-A-C" to CotType.CotType_a_n_A_C, + "a-f-A-M-H" to CotType.CotType_a_f_A_M_H, + "a-f-A-M" to CotType.CotType_a_f_A_M, + "a-h-A-M-F-F" to CotType.CotType_a_h_A_M_F_F, + "a-u-A-C" to CotType.CotType_a_u_A_C, + "t-x-d-d" to CotType.CotType_t_x_d_d, + "b-t-f" to CotType.CotType_b_t_f, + "b-r-f-h-c" to CotType.CotType_b_r_f_h_c, + "b-a-o-pan" to CotType.CotType_b_a_o_pan, + "b-a-o-opn" to CotType.CotType_b_a_o_opn, + "a-f-G" to CotType.CotType_a_f_G, + "a-f-G-U" to CotType.CotType_a_f_G_U, + "a-h-G" to CotType.CotType_a_h_G, + "a-u-G" to CotType.CotType_a_u_G, + "a-n-G" to CotType.CotType_a_n_G, + "b-m-r" to CotType.CotType_b_m_r, + "b-m-p-s-p-i" to CotType.CotType_b_m_p_s_p_i, + "u-d-f" to CotType.CotType_u_d_f, + "a-f-A-C-F" to CotType.CotType_a_f_A_C_F, + "a-f-A" to CotType.CotType_a_f_A, + "a-f-G-E-S" to CotType.CotType_a_f_G_E_S, + "b-m-p-s-p-loc" to CotType.CotType_b_m_p_s_p_loc, + "b-i-v" to CotType.CotType_b_i_v, + ) + + private val typeToString: Map = stringToType.entries.associate { (k, v) -> v to k } + + private val stringToHow: Map = + mapOf( + "h-e" to CotHow.CotHow_h_e, + "m-g" to CotHow.CotHow_m_g, + "h-g-i-g-o" to CotHow.CotHow_h_g_i_g_o, + "m-r" to CotHow.CotHow_m_r, + ) + + private val howToStr: Map = stringToHow.entries.associate { (k, v) -> v to k } + + fun cotTypeFromString(s: String): CotType = stringToType[s] ?: CotType.CotType_Other + + fun cotTypeToString(type: CotType): String? = typeToString[type] + + fun cotHowFromString(s: String): CotHow = stringToHow[s] ?: CotHow.CotHow_Unspecified + + fun cotHowToString(how: CotHow): String? = howToStr[how] +} diff --git a/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/di/CoreTakServerModule.kt b/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/di/CoreTakServerModule.kt index 66fa34a93..67003de8c 100644 --- a/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/di/CoreTakServerModule.kt +++ b/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/di/CoreTakServerModule.kt @@ -27,33 +27,22 @@ import org.meshtastic.core.takserver.TAKMeshIntegration import org.meshtastic.core.takserver.TAKServer import org.meshtastic.core.takserver.TAKServerManager import org.meshtastic.core.takserver.TAKServerManagerImpl -import org.meshtastic.core.takserver.fountain.CoTHandler -import org.meshtastic.core.takserver.fountain.GenericCoTHandler +import org.meshtastic.core.takserver.createTAKServer @Module class CoreTakServerModule { - @Single fun provideTAKServer(dispatchers: CoroutineDispatchers): TAKServer = TAKServer(dispatchers = dispatchers) + @Single + fun provideTAKServer(dispatchers: CoroutineDispatchers): TAKServer = createTAKServer(dispatchers = dispatchers) @Single fun provideTAKServerManager(takServer: TAKServer): TAKServerManager = TAKServerManagerImpl(takServer) - @Single - fun provideGenericCoTHandler(commandSender: CommandSender, takServerManager: TAKServerManager): CoTHandler = - GenericCoTHandler(commandSender, takServerManager) - @Single fun provideTAKMeshIntegration( takServerManager: TAKServerManager, commandSender: CommandSender, - nodeRepository: NodeRepository, serviceRepository: ServiceRepository, meshConfigHandler: MeshConfigHandler, - cotHandler: CoTHandler, - ): TAKMeshIntegration = TAKMeshIntegration( - takServerManager, - commandSender, - nodeRepository, - serviceRepository, - meshConfigHandler, - cotHandler, - ) + nodeRepository: NodeRepository, + ): TAKMeshIntegration = + TAKMeshIntegration(takServerManager, commandSender, serviceRepository, meshConfigHandler, nodeRepository) } diff --git a/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/fountain/FountainCodec.kt b/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/fountain/FountainCodec.kt deleted file mode 100644 index 683905c78..000000000 --- a/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/fountain/FountainCodec.kt +++ /dev/null @@ -1,468 +0,0 @@ -/* - * Copyright (c) 2026 Meshtastic LLC - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package org.meshtastic.core.takserver.fountain - -import co.touchlab.kermit.Logger -import kotlin.math.ceil -import kotlin.math.ln -import kotlin.math.sqrt -import kotlin.random.Random -import kotlin.time.Clock - -internal object FountainConstants { - val MAGIC = byteArrayOf(0x46, 0x54, 0x4E) // "FTN" - const val BLOCK_SIZE = 220 - const val DATA_HEADER_SIZE = 11 - const val FOUNTAIN_THRESHOLD = 233 - const val TRANSFER_TYPE_COT: Byte = 0x00 - const val ACK_TYPE_COMPLETE: Byte = 0x02 - const val ACK_PACKET_SIZE = 19 -} - -internal data class FountainBlock( - val seed: Int, // UInt16 - var indices: MutableSet, - var payload: ByteArray, -) { - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (other == null || this::class != other::class) return false - other as FountainBlock - return seed == other.seed && indices == other.indices && payload.contentEquals(other.payload) - } - - override fun hashCode(): Int { - var result = seed - result = 31 * result + indices.hashCode() - result = 31 * result + payload.contentHashCode() - return result - } -} - -internal class FountainReceiveState( - val transferId: Int, // UInt24 - val k: Int, - val totalLength: Int, -) { - val blocks = mutableListOf() - private val createdAt = Clock.System.now().toEpochMilliseconds() - - fun addBlock(block: FountainBlock) { - if (blocks.none { it.seed == block.seed }) { - blocks.add(block) - } - } - - val isExpired: Boolean - get() = (Clock.System.now().toEpochMilliseconds() - createdAt) > 60_000 -} - -internal data class FountainDataHeader( - val transferId: Int, // UInt24 - val seed: Int, // UInt16 - val k: Int, // UInt8 - val totalLength: Int, // UInt16 -) - -internal data class FountainAck( - val transferId: Int, - val type: Byte, - val received: Int, - val needed: Int, - val dataHash: ByteArray, -) { - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (other == null || this::class != other::class) return false - other as FountainAck - return transferId == other.transferId && - type == other.type && - received == other.received && - needed == other.needed && - dataHash.contentEquals(other.dataHash) - } - - override fun hashCode(): Int { - var result = transferId - result = 31 * result + type.toInt() - result = 31 * result + received - result = 31 * result + needed - result = 31 * result + dataHash.contentHashCode() - return result - } -} - -@Suppress("MagicNumber") -internal class JavaRandom(seed: Long) { - private var seed: Long = (seed xor 0x5DEECE66DL) and ((1L shl 48) - 1) - - private fun next(bits: Int): Int { - seed = (seed * 0x5DEECE66DL + 0xBL) and ((1L shl 48) - 1) - return (seed ushr (48 - bits)).toInt() - } - - fun nextInt(bound: Int): Int = when { - bound <= 0 -> 0 - - (bound and -bound) == bound -> ((bound.toLong() * next(31).toLong()) shr 31).toInt() - - else -> { - var bits: Int - var valResult: Int - do { - bits = next(31) - valResult = bits % bound - } while (bits - valResult + (bound - 1) < 0) - valResult - } - } - - fun nextDouble(): Double { - val high = next(26).toLong() - val low = next(27).toLong() - return ((high shl 27) + low).toDouble() / (1L shl 53).toDouble() - } -} - -@Suppress("MagicNumber", "TooManyFunctions") -internal class FountainCodec { - private val receiveStates = mutableMapOf() - - fun generateTransferId(): Int { - val random = Random.nextInt(0, 0xFFFFFF + 1) - val time = (Clock.System.now().toEpochMilliseconds() / 1000).toInt() and 0xFFFF - return (random xor time) and 0xFFFFFF - } - - fun encode(data: ByteArray, transferId: Int): List { - if (data.isEmpty()) { - Logger.w { "Fountain encode: empty data" } - return emptyList() - } - - val k = maxOf(1, ceil(data.size.toDouble() / FountainConstants.BLOCK_SIZE).toInt()) - val overhead = getAdaptiveOverhead(k) - val blocksToSend = maxOf(1, ceil(k.toDouble() * (1.0 + overhead)).toInt()) - - val sourceBlocks = splitIntoBlocks(data, k) - val packets = mutableListOf() - - for (i in 0 until blocksToSend) { - val seed = generateSeed(transferId, i) - val indices = generateBlockIndices(seed, k, i) - - var blockPayload = ByteArray(FountainConstants.BLOCK_SIZE) { 0 } - for (idx in indices) { - blockPayload = xor(blockPayload, sourceBlocks[idx]) - } - - val packet = buildDataBlock(transferId, seed, k, data.size, blockPayload) - packets.add(packet) - } - - Logger.i { "Fountain encode: ${data.size} bytes -> $k source blocks -> $blocksToSend packets" } - return packets - } - - private fun splitIntoBlocks(data: ByteArray, k: Int): List { - val blocks = mutableListOf() - for (i in 0 until k) { - val start = i * FountainConstants.BLOCK_SIZE - val end = minOf(start + FountainConstants.BLOCK_SIZE, data.size) - - if (start < data.size) { - val block = data.copyOfRange(start, end) - if (block.size < FountainConstants.BLOCK_SIZE) { - val padded = ByteArray(FountainConstants.BLOCK_SIZE) { 0 } - block.copyInto(padded) - blocks.add(padded) - } else { - blocks.add(block) - } - } else { - blocks.add(ByteArray(FountainConstants.BLOCK_SIZE) { 0 }) - } - } - return blocks - } - - private fun buildDataBlock(transferId: Int, seed: Int, k: Int, totalLength: Int, payload: ByteArray): ByteArray { - val packet = ByteArray(FountainConstants.DATA_HEADER_SIZE + payload.size) - - packet[0] = FountainConstants.MAGIC[0] - packet[1] = FountainConstants.MAGIC[1] - packet[2] = FountainConstants.MAGIC[2] - - packet[3] = ((transferId shr 16) and 0xFF).toByte() - packet[4] = ((transferId shr 8) and 0xFF).toByte() - packet[5] = (transferId and 0xFF).toByte() - - packet[6] = ((seed shr 8) and 0xFF).toByte() - packet[7] = (seed and 0xFF).toByte() - - packet[8] = (k and 0xFF).toByte() - - packet[9] = ((totalLength shr 8) and 0xFF).toByte() - packet[10] = (totalLength and 0xFF).toByte() - - payload.copyInto(packet, FountainConstants.DATA_HEADER_SIZE) - return packet - } - - fun isFountainPacket(data: ByteArray): Boolean { - if (data.size < 3) return false - return data[0] == FountainConstants.MAGIC[0] && - data[1] == FountainConstants.MAGIC[1] && - data[2] == FountainConstants.MAGIC[2] - } - - fun parseDataHeader(data: ByteArray): FountainDataHeader? { - if (data.size < FountainConstants.DATA_HEADER_SIZE || !isFountainPacket(data)) return null - - val transferId = - ((data[3].toInt() and 0xFF) shl 16) or ((data[4].toInt() and 0xFF) shl 8) or (data[5].toInt() and 0xFF) - val seed = ((data[6].toInt() and 0xFF) shl 8) or (data[7].toInt() and 0xFF) - val k = data[8].toInt() and 0xFF - val totalLength = ((data[9].toInt() and 0xFF) shl 8) or (data[10].toInt() and 0xFF) - - return FountainDataHeader(transferId, seed, k, totalLength) - } - - fun handleIncomingPacket(data: ByteArray): Pair? { - cleanupExpiredStates() - - val header = parseDataHeader(data) - if (header != null) { - val payload = data.copyOfRange(FountainConstants.DATA_HEADER_SIZE, data.size) - if (payload.size == FountainConstants.BLOCK_SIZE) { - return processValidIncomingPacket(header, payload) - } else { - Logger.w { "Invalid fountain payload size: ${payload.size}" } - } - } - return null - } - - private fun processValidIncomingPacket(header: FountainDataHeader, payload: ByteArray): Pair? { - val state = - receiveStates.getOrPut(header.transferId) { - FountainReceiveState(header.transferId, header.k, header.totalLength) - } - - val indices = regenerateIndices(header.seed, state.k, header.transferId) - val block = FountainBlock(header.seed, indices.toMutableSet(), payload) - state.addBlock(block) - - if (state.blocks.size >= state.k) { - val decoded = peelingDecode(state) - if (decoded != null) { - receiveStates.remove(header.transferId) - Logger.i { "Fountain decode complete: ${decoded.size} bytes from ${state.blocks.size} blocks" } - return Pair(decoded, header.transferId) - } - } - return null - } - - fun buildAck(transferId: Int, type: Byte, received: Int, needed: Int, dataHash: ByteArray): ByteArray { - val packet = ByteArray(FountainConstants.ACK_PACKET_SIZE) - - packet[0] = FountainConstants.MAGIC[0] - packet[1] = FountainConstants.MAGIC[1] - packet[2] = FountainConstants.MAGIC[2] - - packet[3] = ((transferId shr 16) and 0xFF).toByte() - packet[4] = ((transferId shr 8) and 0xFF).toByte() - packet[5] = (transferId and 0xFF).toByte() - - packet[6] = type - - packet[7] = ((received shr 8) and 0xFF).toByte() - packet[8] = (received and 0xFF).toByte() - - packet[9] = ((needed shr 8) and 0xFF).toByte() - packet[10] = (needed and 0xFF).toByte() - - val hashLen = minOf(8, dataHash.size) - dataHash.copyInto(packet, 11, 0, hashLen) - - return packet - } - - fun parseAck(data: ByteArray): FountainAck? { - if (data.size < FountainConstants.ACK_PACKET_SIZE || !isFountainPacket(data)) return null - - val transferId = - ((data[3].toInt() and 0xFF) shl 16) or ((data[4].toInt() and 0xFF) shl 8) or (data[5].toInt() and 0xFF) - val type = data[6] - val received = ((data[7].toInt() and 0xFF) shl 8) or (data[8].toInt() and 0xFF) - val needed = ((data[9].toInt() and 0xFF) shl 8) or (data[10].toInt() and 0xFF) - val dataHash = data.copyOfRange(11, 19) - - return FountainAck(transferId, type, received, needed, dataHash) - } - - private fun peelingDecode(state: FountainReceiveState): ByteArray? { - val decoded = mutableMapOf() - val workingBlocks = - state.blocks.map { FountainBlock(it.seed, it.indices.toMutableSet(), it.payload.copyOf()) }.toMutableList() - - var progress = true - while (progress && decoded.size < state.k) { - progress = processWorkingBlocks(workingBlocks, decoded) - } - - if (decoded.size < state.k) { - Logger.d { "Peeling decode incomplete: ${decoded.size}/${state.k} blocks decoded" } - return null - } - return assembleDecodedData(state, decoded) - } - - private fun processWorkingBlocks(workingBlocks: List, decoded: MutableMap): Boolean { - var progress = false - for (i in workingBlocks.indices) { - val block = workingBlocks[i] - val toRemove = mutableListOf() - for (idx in block.indices) { - val decodedBlock = decoded[idx] - if (decodedBlock != null) { - block.payload = xor(block.payload, decodedBlock) - toRemove.add(idx) - } - } - block.indices.removeAll(toRemove) - - if (block.indices.size == 1) { - val idx = block.indices.first() - if (!decoded.containsKey(idx)) { - decoded[idx] = block.payload - progress = true - } - } - } - return progress - } - - private fun assembleDecodedData(state: FountainReceiveState, decoded: Map): ByteArray? { - val result = ByteArray(state.k * FountainConstants.BLOCK_SIZE) - for (i in 0 until state.k) { - val block = decoded[i] ?: return null - block.copyInto(result, i * FountainConstants.BLOCK_SIZE) - } - return result.copyOfRange(0, state.totalLength) - } - - private fun cleanupExpiredStates() { - val expiredIds = receiveStates.filter { it.value.isExpired }.map { it.key } - for (id in expiredIds) { - receiveStates.remove(id) - Logger.d { "Cleaned up expired fountain state: $id" } - } - } - - private fun getAdaptiveOverhead(k: Int): Double = when { - k <= 10 -> 0.50 - k <= 50 -> 0.25 - else -> 0.15 - } - - private fun generateSeed(transferId: Int, blockIndex: Int): Int { - val combined = transferId * 31337 + blockIndex * 7919 - return combined and 0xFFFF - } - - private fun generateBlockIndices(seed: Int, k: Int, blockIndex: Int): Set { - val rng = JavaRandom(seed.toLong()) - val sampledDegree = sampleRobustSolitonDegree(rng, k) - val degree = if (blockIndex == 0) 1 else sampledDegree - return selectIndices(rng, k, degree) - } - - private fun regenerateIndices(seed: Int, k: Int, transferId: Int): Set { - val rng = JavaRandom(seed.toLong()) - val sampledDegree = sampleRobustSolitonDegree(rng, k) - val expectedSeed0 = generateSeed(transferId, 0) - val degree = if (seed == expectedSeed0) 1 else sampledDegree - return selectIndices(rng, k, degree) - } - - private fun selectIndices(rng: JavaRandom, k: Int, degree: Int): Set { - val indices = mutableSetOf() - while (indices.size < degree && indices.size < k) { - val idx = rng.nextInt(k) - indices.add(idx) - } - return indices - } - - private fun sampleRobustSolitonDegree(rng: JavaRandom, k: Int): Int { - val cdf = buildRobustSolitonCDF(k) - val u = rng.nextDouble() - for (d in 1..k) { - if (u <= cdf[d]) return d - } - return k - } - - private fun buildRobustSolitonCDF(k: Int, c: Double = 0.1, delta: Double = 0.5): DoubleArray { - if (k <= 0) return doubleArrayOf(1.0) - - val rho = DoubleArray(k + 1) - rho[1] = 1.0 / k.toDouble() - for (d in 2..k) { - rho[d] = 1.0 / (d.toDouble() * (d - 1).toDouble()) - } - - val rVal = c * ln(k.toDouble() / delta) * sqrt(k.toDouble()) - val tau = DoubleArray(k + 1) - val threshold = (k.toDouble() / rVal).toInt() - - for (d in 1..k) { - if (d < threshold) { - tau[d] = rVal / (d.toDouble() * k.toDouble()) - } else if (d == threshold) { - tau[d] = rVal * ln(rVal / delta) / k.toDouble() - } - } - - val mu = DoubleArray(k + 1) - var sum = 0.0 - for (d in 1..k) { - mu[d] = rho[d] + tau[d] - sum += mu[d] - } - - val cdf = DoubleArray(k + 1) - var cumulative = 0.0 - for (d in 1..k) { - cumulative += mu[d] / sum - cdf[d] = cumulative - } - return cdf - } - - private fun xor(a: ByteArray, b: ByteArray): ByteArray { - val result = ByteArray(maxOf(a.size, b.size)) - for (i in result.indices) { - val byteA = if (i < a.size) a[i] else 0 - val byteB = if (i < b.size) b[i] else 0 - result[i] = (byteA.toInt() xor byteB.toInt()).toByte() - } - return result - } -} diff --git a/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/fountain/GenericCoTHandler.kt b/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/fountain/GenericCoTHandler.kt deleted file mode 100644 index c6bfb5f1e..000000000 --- a/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/fountain/GenericCoTHandler.kt +++ /dev/null @@ -1,231 +0,0 @@ -/* - * Copyright (c) 2026 Meshtastic LLC - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package org.meshtastic.core.takserver.fountain - -import co.touchlab.kermit.Logger -import kotlinx.coroutines.delay -import kotlinx.coroutines.sync.Mutex -import kotlinx.coroutines.sync.withLock -import okio.ByteString.Companion.toByteString -import org.meshtastic.core.model.DataPacket -import org.meshtastic.core.repository.CommandSender -import org.meshtastic.core.takserver.CoTMessage -import org.meshtastic.core.takserver.CoTXmlParser -import org.meshtastic.core.takserver.TAKServerManager -import org.meshtastic.core.takserver.toXml -import org.meshtastic.proto.PortNum -import kotlin.time.Clock - -class GenericCoTHandler(private val commandSender: CommandSender, private val takServerManager: TAKServerManager) : - CoTHandler { - companion object { - private const val INTER_PACKET_DELAY_MS = 100L - private const val ACK_RETRANSMIT_DELAY_MS = 50L - private const val PENDING_TRANSFER_TTL_MS = 60_000L - } - - private val fountainCodec = FountainCodec() - private val pendingTransfersMutex = Mutex() - private val pendingTransfers = mutableMapOf() - - private data class PendingTransfer( - val transferId: Int, - val totalBlocks: Int, - val dataHash: ByteArray, - val startTime: Long = Clock.System.now().toEpochMilliseconds(), - ) { - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (other == null || this::class != other::class) return false - other as PendingTransfer - return transferId == other.transferId && - totalBlocks == other.totalBlocks && - dataHash.contentEquals(other.dataHash) && - startTime == other.startTime - } - - override fun hashCode(): Int { - var result = transferId - result = 31 * result + totalBlocks - result = 31 * result + dataHash.contentHashCode() - result = 31 * result + startTime.hashCode() - return result - } - } - - override suspend fun sendGenericCoT(cotMessage: CoTMessage) { - val xml = cotMessage.toXml() - val xmlBytes = xml.encodeToByteArray() - - val compressed = ZlibCodec.compress(xmlBytes) - if (compressed == null) { - Logger.w { "Failed to compress CoT to Zlib" } - return - } - - val payload = ByteArray(compressed.size + 1) - payload[0] = FountainConstants.TRANSFER_TYPE_COT - compressed.copyInto(payload, 1) - - Logger.d { "Generic CoT: type=${cotMessage.type}, xml=${xmlBytes.size}B, compressed=${payload.size}B" } - - if (payload.size < FountainConstants.FOUNTAIN_THRESHOLD) { - sendDirect(payload) - } else { - sendFountainCoded(payload) - } - } - - private fun sendDirect(payload: ByteArray) { - val dataPacket = - DataPacket( - to = DataPacket.ID_BROADCAST, - bytes = payload.toByteString(), - dataType = PortNum.ATAK_FORWARDER.value, - ) - commandSender.sendData(dataPacket) - Logger.i { "Sent generic CoT directly: ${payload.size} bytes on port 257" } - } - - private suspend fun sendFountainCoded(payload: ByteArray) { - val transferId = fountainCodec.generateTransferId() - val packets = fountainCodec.encode(payload, transferId) - val hash = CryptoCodec.sha256Prefix8(payload) - - pendingTransfersMutex.withLock { - pendingTransfers[transferId] = PendingTransfer(transferId, packets.size, hash) - } - - Logger.i { "Sending fountain-coded CoT: ${payload.size} bytes -> ${packets.size} blocks, xferId=$transferId" } - - for ((index, packetData) in packets.withIndex()) { - val dataPacket = - DataPacket( - to = DataPacket.ID_BROADCAST, - bytes = packetData.toByteString(), - dataType = PortNum.ATAK_FORWARDER.value, - ) - commandSender.sendData(dataPacket) - - if (index < packets.size - 1) { - delay(INTER_PACKET_DELAY_MS) // Inter-packet delay - } - } - } - - override suspend fun handleIncomingForwarderPacket(payload: ByteArray, senderNodeNum: Int) { - if (payload.isEmpty()) return - - if (fountainCodec.isFountainPacket(payload)) { - if (payload.size == FountainConstants.ACK_PACKET_SIZE) { - handleIncomingAck(payload, senderNodeNum) - } else { - handleFountainPacket(payload, senderNodeNum) - } - } else { - handleDirectPacket(payload, senderNodeNum) - } - } - - private fun handleDirectPacket(payload: ByteArray, senderNodeNum: Int) { - if (payload.size <= 1) return - val transferType = payload[0] - if (transferType != FountainConstants.TRANSFER_TYPE_COT) return - - val exiData = payload.copyOfRange(1, payload.size) - processDecompressedCoT(exiData, senderNodeNum) - } - - private suspend fun handleFountainPacket(payload: ByteArray, senderNodeNum: Int) { - fountainCodec.handleIncomingPacket(payload)?.let { (decodedData, transferId) -> - val hash = CryptoCodec.sha256Prefix8(decodedData) - sendFountainAck(transferId, hash, senderNodeNum) - delay(ACK_RETRANSMIT_DELAY_MS) - sendFountainAck(transferId, hash, senderNodeNum) - - if (decodedData.size > 1 && decodedData[0] == FountainConstants.TRANSFER_TYPE_COT) { - val exiData = decodedData.copyOfRange(1, decodedData.size) - processDecompressedCoT(exiData, senderNodeNum) - } - } - } - - private fun processDecompressedCoT(exiData: ByteArray, senderNodeNum: Int) { - val xmlBytes = ZlibCodec.decompress(exiData) ?: return - val xml = xmlBytes.decodeToString() - - val result = CoTXmlParser(xml).parse() - val cot = result.getOrNull() - - if (cot != null) { - takServerManager.broadcast(cot) - Logger.i { "Received generic CoT from node $senderNodeNum: ${cot.type}" } - } else { - Logger.w(result.exceptionOrNull() ?: Exception("Unknown parse error")) { "Failed to parse CoT XML" } - } - } - - private fun sendFountainAck(transferId: Int, hash: ByteArray, toNodeNum: Int) { - val ackPacket = - fountainCodec.buildAck( - transferId, - FountainConstants.ACK_TYPE_COMPLETE, - received = 0, - needed = 0, - dataHash = hash, - ) - - val dataPacket = - DataPacket( - to = toNodeNum.toString(), - bytes = ackPacket.toByteString(), - dataType = PortNum.ATAK_FORWARDER.value, - ) - commandSender.sendData(dataPacket) - Logger.d { "Sent fountain ACK for transfer $transferId" } - } - - private suspend fun handleIncomingAck(payload: ByteArray, senderNodeNum: Int) { - val ack = fountainCodec.parseAck(payload) ?: return - Logger.d { "Received fountain ACK: xferId=${ack.transferId}, type=${ack.type}, from $senderNodeNum" } - - pendingTransfersMutex.withLock { - cleanupStalePendingTransfersLocked() - val pending = pendingTransfers[ack.transferId] - if (pending != null) { - if (ack.type == FountainConstants.ACK_TYPE_COMPLETE) { - if (ack.dataHash.contentEquals(pending.dataHash)) { - Logger.i { "Fountain transfer ${ack.transferId} acknowledged by node $senderNodeNum" } - } else { - Logger.w { "Fountain ACK hash mismatch for transfer ${ack.transferId}" } - } - pendingTransfers.remove(ack.transferId) - } - } - } - } - - /** Must be called inside [pendingTransfersMutex]. */ - private fun cleanupStalePendingTransfersLocked() { - val now = Clock.System.now().toEpochMilliseconds() - val stale = pendingTransfers.filter { (_, v) -> now - v.startTime > PENDING_TRANSFER_TTL_MS }.keys - stale.forEach { id -> - pendingTransfers.remove(id) - Logger.d { "Evicted stale outbound pending transfer: $id" } - } - } -} diff --git a/core/takserver/src/commonTest/kotlin/org/meshtastic/core/takserver/CoTDetailStripperTest.kt b/core/takserver/src/commonTest/kotlin/org/meshtastic/core/takserver/CoTDetailStripperTest.kt new file mode 100644 index 000000000..041050b50 --- /dev/null +++ b/core/takserver/src/commonTest/kotlin/org/meshtastic/core/takserver/CoTDetailStripperTest.kt @@ -0,0 +1,238 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.meshtastic.core.takserver + +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertFalse +import kotlin.test.assertTrue + +/** + * Covers the allowed/stripped element contract documented on [CoTDetailStripper]. If a test here starts failing because + * a new element type was added to the strip list, update the strip-list KDoc in [CoTDetailStripper] in the same change. + */ +class CoTDetailStripperTest { + + @Test + fun empty_input_returns_empty() { + assertEquals("", CoTDetailStripper.strip("")) + } + + @Test + fun preserves_contact_group_status_track() { + val input = + """ + + <__group name="Cyan" role="Team Member"/> + + + """ + .trimIndent() + val stripped = CoTDetailStripper.strip(input) + assertTrue(stripped.contains(" + + + + + + + + """ + .trimIndent() + val stripped = CoTDetailStripper.strip(input) + assertTrue(stripped.contains(" is the biggest single bloat contributor for u-d-c-c events — it + // contains an and usually a styling child. Make sure the + // entire subtree goes, not just the opening tag. + val input = + """ + + + + + + + + """ + .trimIndent() + val stripped = CoTDetailStripper.strip(input) + assertTrue(stripped.contains(" inside is also gone because we strip the whole subtree. + assertFalse(stripped.contains(" + + + + <__video url="rtsp://example.com/stream"/> + """ + .trimIndent() + val stripped = CoTDetailStripper.strip(input) + assertTrue(stripped.contains(" + + + + <__serverdestination destinations="0.0.0.0:4242:tcp:abc-123"/> + hello world + """ + .trimIndent() + val stripped = CoTDetailStripper.strip(input) + assertTrue(stripped.contains("<__chat"), "__chat must survive stripping") + assertTrue(stripped.contains(" + + """ + .trimIndent() + val stripped = CoTDetailStripper.strip(input) + // No leading/trailing whitespace. + assertEquals(stripped, stripped.trim()) + // No line breaks / indentation between elements. + assertFalse(stripped.contains("\n"), "output must not contain newlines: $stripped") + // Elements should be directly concatenated. + assertTrue(stripped.contains("/><"), "adjacent elements must be directly concatenated: $stripped") + } + + @Test + fun handles_interleaved_strip_and_keep_elements() { + val input = + """ + + + <__group name="Cyan" role="Team Member"/> + + + + + """ + .trimIndent() + val stripped = CoTDetailStripper.strip(input) + // All four keep-elements survive in order. + val contactIdx = stripped.indexOf("= 0, "contact missing") + assertTrue(groupIdx >= 0, "group missing") + assertTrue(statusIdx >= 0, "status missing") + assertTrue(trackIdx >= 0, "track missing") + assertTrue(contactIdx < groupIdx, "contact must come before group") + assertTrue(groupIdx < statusIdx, "group must come before status") + assertTrue(statusIdx < trackIdx, "status must come before track") + // None of the stripped elements linger. + assertFalse(stripped.contains("color"), "color stripped") + assertFalse(stripped.contains("shape"), "shape stripped") + assertFalse(stripped.contains("ellipse"), "ellipse stripped") + assertFalse(stripped.contains("labels_on"), "labels_on stripped") + } + + @Test + fun strips_tog_and_flow_tags() { + // is the rectangle "toggle" flag ATAK emits; <_flow-tags_> is TAK + // Server routing metadata. Both are pure bloat over the mesh. These are + // specifically tested because their names contain regex-special characters + // (`-`, `_`) and it's easy to typo the strip-list pattern. + val input = + """ + + + <_flow-tags_ marti1="2014-10-28T22:40:15.341Z"/> + """ + .trimIndent() + val stripped = CoTDetailStripper.strip(input) + assertTrue(stripped.contains("<__group name='Cyan' role='Team Member'/>""" + + """""" + + """""" + + """""" + + """""" + + """""" + + """""" + + """""" + + """<__video url='rtsp://10.0.0.1:8554/stream'/>""" + val stripped = CoTDetailStripper.strip(realistic) + val before = realistic.length + val after = stripped.length + // Should shrink by at least 60% — most of the bytes were bloat. + assertTrue(after < before * 0.4, "expected >60% reduction; before=$before after=$after stripped='$stripped'") + // Only the three "essential" elements survive. + assertTrue(stripped.contains(", , + // and bloat is stripped by CoTDetailStripper so the packet has any + // chance of fitting in a LoRa MTU. + val shapeXml = + """ + + + + + + + + + + + + + """ + .trimIndent() + + val result = CoTXmlParser(shapeXml).parse() + assertTrue(result.isSuccess) + val message = result.getOrNull()!! + + assertEquals("u-d-c-c", message.type) + val detail = message.parsedDetailXml + assertTrue(detail != null, "parsedDetailXml must be populated for unmapped types") + // Preserved: anything the stripper doesn't explicitly match, including contact. + assertTrue(detail.contains(" + + + + + + """ + .trimIndent() + val message = CoTXmlParser(xml).parse().getOrNull()!! + // sourceEventXml is used for diagnostic logging only — it must be the exact + // bytes we received so operators can see what ATAK actually sent. + assertEquals(xml, message.sourceEventXml) + // And it MUST still contain the stripped elements (since it is untouched). + assertTrue(message.sourceEventXml!!.contains(""), "sourceEventXml must be verbatim") + } + + @Test + fun `parsedDetailXml is null for self-closed detail element`() { + val xml = + """ + + + + + """ + .trimIndent() + val message = CoTXmlParser(xml).parse().getOrNull()!! + assertEquals(null, message.parsedDetailXml) + } } diff --git a/core/takserver/src/commonTest/kotlin/org/meshtastic/core/takserver/CoTXmlTest.kt b/core/takserver/src/commonTest/kotlin/org/meshtastic/core/takserver/CoTXmlTest.kt index 7b6aa0ecd..a3cbda525 100644 --- a/core/takserver/src/commonTest/kotlin/org/meshtastic/core/takserver/CoTXmlTest.kt +++ b/core/takserver/src/commonTest/kotlin/org/meshtastic/core/takserver/CoTXmlTest.kt @@ -108,9 +108,14 @@ class CoTXmlTest { // ── Structure ───────────────────────────────────────────────────────────── @Test - fun `toXml includes XML declaration`() { + fun `toXml does not include XML declaration - CoT stream protocol`() { + // The CoT TCP streaming protocol requires a concatenated sequence of elements + // with NO XML declaration. A mid-stream tag breaks ATAK's parser and + // causes the client to disconnect as soon as the first real event arrives. val message = CoTMessage.pli(uid = "!1234", callsign = "X", latitude = 0.0, longitude = 0.0) - assertTrue(message.toXml().startsWith(" TAK_KEEPALIVE_INTERVAL_MS, - "Stale window ($staleMs ms) must exceed keepalive interval ($TAK_KEEPALIVE_INTERVAL_MS ms)", + TAK_KEEPALIVE_INTERVAL_MS < 15_000L, + "Keepalive interval ($TAK_KEEPALIVE_INTERVAL_MS ms) must be below ATAK's 15s stale threshold", ) } - - @Test - fun `idle timeout exceeds keepalive stale window`() { - val idleTimeoutMs = TAK_KEEPALIVE_INTERVAL_MS * TAK_READ_IDLE_TIMEOUT_MULTIPLIER - val staleMs = TAK_KEEPALIVE_INTERVAL_MS * TAK_KEEPALIVE_STALE_MULTIPLIER - assertTrue(idleTimeoutMs > staleMs, "Idle timeout ($idleTimeoutMs ms) must exceed stale window ($staleMs ms)") - } } diff --git a/core/takserver/src/commonTest/kotlin/org/meshtastic/core/takserver/TAKMeshIntegrationTest.kt b/core/takserver/src/commonTest/kotlin/org/meshtastic/core/takserver/TAKMeshIntegrationTest.kt new file mode 100644 index 000000000..f12c817a6 --- /dev/null +++ b/core/takserver/src/commonTest/kotlin/org/meshtastic/core/takserver/TAKMeshIntegrationTest.kt @@ -0,0 +1,486 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.meshtastic.core.takserver + +import co.touchlab.kermit.Severity +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.SharedFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asSharedFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.test.UnconfinedTestDispatcher +import kotlinx.coroutines.test.runTest +import okio.ByteString.Companion.toByteString +import org.meshtastic.core.model.ConnectionState +import org.meshtastic.core.model.DataPacket +import org.meshtastic.core.model.MyNodeInfo +import org.meshtastic.core.model.Node +import org.meshtastic.core.model.NodeSortOption +import org.meshtastic.core.model.Position +import org.meshtastic.core.model.service.ServiceAction +import org.meshtastic.core.model.service.TracerouteResponse +import org.meshtastic.core.repository.CommandSender +import org.meshtastic.core.repository.MeshConfigHandler +import org.meshtastic.core.repository.NodeRepository +import org.meshtastic.core.repository.ServiceRepository +import org.meshtastic.proto.AdminMessage +import org.meshtastic.proto.Channel +import org.meshtastic.proto.ChannelSet +import org.meshtastic.proto.ClientNotification +import org.meshtastic.proto.Config +import org.meshtastic.proto.Data +import org.meshtastic.proto.DeviceMetadata +import org.meshtastic.proto.DeviceUIConfig +import org.meshtastic.proto.LocalConfig +import org.meshtastic.proto.LocalModuleConfig +import org.meshtastic.proto.LocalStats +import org.meshtastic.proto.MeshPacket +import org.meshtastic.proto.ModuleConfig +import org.meshtastic.proto.PortNum +import org.meshtastic.proto.TAKPacket +import org.meshtastic.proto.User +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertTrue +import kotlin.time.Clock +import kotlin.time.Duration.Companion.minutes + +/** + * Tests for [TAKMeshIntegration] lifecycle, routing, and protocol gating. + * + * These tests use fakes for all 5 dependencies and run in commonTest. The v2 outbound SDK-dependent happy path is + * tested separately in jvmTest. + */ +@Suppress("TooManyFunctions") +class TAKMeshIntegrationTest { + + // ── Fakes ──────────────────────────────────────────────────────────────── + + private class FakeTAKServerManager : TAKServerManager { + private val _isRunning = MutableStateFlow(false) + override val isRunning: StateFlow = _isRunning.asStateFlow() + override val connectionCount: StateFlow = MutableStateFlow(0) + + private val _inboundMessages = MutableSharedFlow(extraBufferCapacity = 64) + override val inboundMessages: SharedFlow = _inboundMessages.asSharedFlow() + + val broadcasts = mutableListOf() + val rawBroadcasts = mutableListOf() + var startCount = 0 + var stopped = false + + override fun start(scope: CoroutineScope) { + startCount++ + _isRunning.value = true + } + + override fun stop() { + stopped = true + _isRunning.value = false + } + + override fun broadcast(cotMessage: CoTMessage) { + broadcasts.add(cotMessage) + } + + override fun broadcastRawXml(xml: String) { + rawBroadcasts.add(xml) + } + + suspend fun emitInbound(cotMessage: CoTMessage, clientInfo: TAKClientInfo? = null) { + _inboundMessages.emit(InboundCoTMessage(cotMessage, clientInfo)) + } + } + + private class FakeCommandSender : CommandSender { + val sentPackets = mutableListOf() + + override fun sendData(p: DataPacket) { + sentPackets.add(p) + } + + override fun getCurrentPacketId(): Long = 0L + + override fun getCachedLocalConfig(): LocalConfig = LocalConfig() + + override fun getCachedChannelSet(): ChannelSet = ChannelSet() + + override fun generatePacketId(): Int = 1 + + override fun sendAdmin(destNum: Int, requestId: Int, wantResponse: Boolean, initFn: () -> AdminMessage) {} + + override suspend fun sendAdminAwait( + destNum: Int, + requestId: Int, + wantResponse: Boolean, + initFn: () -> AdminMessage, + ): Boolean = true + + override fun sendPosition(pos: org.meshtastic.proto.Position, destNum: Int?, wantResponse: Boolean) {} + + override fun requestPosition(destNum: Int, currentPosition: Position) {} + + override fun setFixedPosition(destNum: Int, pos: Position) {} + + override fun requestUserInfo(destNum: Int) {} + + override fun requestTraceroute(requestId: Int, destNum: Int) {} + + override fun requestTelemetry(requestId: Int, destNum: Int, typeValue: Int) {} + + override fun requestNeighborInfo(requestId: Int, destNum: Int) {} + } + + private class FakeServiceRepository : ServiceRepository { + private val _meshPacketFlow = MutableSharedFlow(replay = 1, extraBufferCapacity = 64) + override val meshPacketFlow: Flow = _meshPacketFlow + + override val connectionState: StateFlow = MutableStateFlow(ConnectionState.Disconnected) + + override fun setConnectionState(connectionState: ConnectionState) {} + + override val clientNotification: StateFlow = MutableStateFlow(null) + + override fun setClientNotification(notification: ClientNotification?) {} + + override fun clearClientNotification() {} + + override val errorMessage: StateFlow = MutableStateFlow(null) + + override fun setErrorMessage(text: String, severity: Severity) {} + + override fun clearErrorMessage() {} + + override val connectionProgress: StateFlow = MutableStateFlow(null) + + override fun setConnectionProgress(text: String) {} + + override suspend fun emitMeshPacket(packet: MeshPacket) { + _meshPacketFlow.emit(packet) + } + + override val tracerouteResponse: StateFlow = MutableStateFlow(null) + + override fun setTracerouteResponse(value: TracerouteResponse?) {} + + override fun clearTracerouteResponse() {} + + override val neighborInfoResponse: StateFlow = MutableStateFlow(null) + + override fun setNeighborInfoResponse(value: String?) {} + + override fun clearNeighborInfoResponse() {} + + override val serviceAction: Flow = MutableSharedFlow() + + override suspend fun onServiceAction(action: ServiceAction) {} + } + + private class FakeMeshConfigHandler : MeshConfigHandler { + override val localConfig: StateFlow = MutableStateFlow(LocalConfig()) + override val moduleConfig: StateFlow = MutableStateFlow(LocalModuleConfig()) + + override fun handleDeviceConfig(config: Config) {} + + override fun handleModuleConfig(config: ModuleConfig) {} + + override fun handleChannel(channel: Channel) {} + + override fun handleDeviceUIConfig(config: DeviceUIConfig) {} + } + + private class FakeNodeRepository(firmwareVersion: String? = "2.8.0.0") : NodeRepository { + private val _myNodeInfo = + MutableStateFlow( + firmwareVersion?.let { + MyNodeInfo( + myNodeNum = 1, + hasGPS = false, + model = null, + firmwareVersion = it, + couldUpdate = false, + shouldUpdate = false, + currentPacketId = 0L, + messageTimeoutMsec = 0, + minAppVersion = 0, + maxChannels = 8, + hasWifi = false, + channelUtilization = 0f, + airUtilTx = 0f, + deviceId = null, + ) + }, + ) + override val myNodeInfo: StateFlow = _myNodeInfo + + fun setFirmwareVersion(version: String?) { + _myNodeInfo.value = + version?.let { + MyNodeInfo( + myNodeNum = 1, + hasGPS = false, + model = null, + firmwareVersion = it, + couldUpdate = false, + shouldUpdate = false, + currentPacketId = 0L, + messageTimeoutMsec = 0, + minAppVersion = 0, + maxChannels = 8, + hasWifi = false, + channelUtilization = 0f, + airUtilTx = 0f, + deviceId = null, + ) + } + } + + override val ourNodeInfo: StateFlow = MutableStateFlow(null) + override val myId: StateFlow = MutableStateFlow(null) + override val localStats: StateFlow = MutableStateFlow(LocalStats()) + override val nodeDBbyNum: StateFlow> = MutableStateFlow(emptyMap()) + override val onlineNodeCount: Flow = MutableStateFlow(0) + override val totalNodeCount: Flow = MutableStateFlow(0) + + override fun updateLocalStats(stats: LocalStats) {} + + override fun effectiveLogNodeId(nodeNum: Int): Flow = MutableStateFlow(0) + + override fun getNode(userId: String): Node = Node(num = 0) + + override fun getUser(nodeNum: Int): User = User() + + override fun getUser(userId: String): User = User() + + override fun getNodes( + sort: NodeSortOption, + filter: String, + includeUnknown: Boolean, + onlyOnline: Boolean, + onlyDirect: Boolean, + ): Flow> = MutableStateFlow(emptyList()) + + override suspend fun getNodesOlderThan(lastHeard: Int): List = emptyList() + + override suspend fun getUnknownNodes(): List = emptyList() + + override suspend fun clearNodeDB(preserveFavorites: Boolean) {} + + override suspend fun clearMyNodeInfo() {} + + override suspend fun deleteNode(num: Int) {} + + override suspend fun deleteNodes(nodeNums: List) {} + + override suspend fun setNodeNotes(num: Int, notes: String) {} + + override suspend fun upsert(node: Node) {} + + override suspend fun installConfig(mi: MyNodeInfo, nodes: List) {} + + override suspend fun insertMetadata(nodeNum: Int, metadata: DeviceMetadata) {} + } + + // ── Helpers ─────────────────────────────────────────────────────────────── + + private data class TestHarness( + val serverManager: FakeTAKServerManager = FakeTAKServerManager(), + val commandSender: FakeCommandSender = FakeCommandSender(), + val serviceRepository: FakeServiceRepository = FakeServiceRepository(), + val meshConfigHandler: FakeMeshConfigHandler = FakeMeshConfigHandler(), + val nodeRepository: FakeNodeRepository = FakeNodeRepository(), + ) { + val integration = + TAKMeshIntegration( + takServerManager = serverManager, + commandSender = commandSender, + serviceRepository = serviceRepository, + meshConfigHandler = meshConfigHandler, + nodeRepository = nodeRepository, + ) + } + + // ── Lifecycle tests ────────────────────────────────────────────────────── + + @Test + fun `start launches TAKServerManager`() = runTest(UnconfinedTestDispatcher()) { + val h = TestHarness() + h.integration.start(backgroundScope) + + assertEquals(1, h.serverManager.startCount) + } + + @Test + fun `stop cancels jobs and stops TAKServerManager`() = runTest(UnconfinedTestDispatcher()) { + val h = TestHarness() + h.integration.start(backgroundScope) + + h.integration.stop() + + assertTrue(h.serverManager.stopped) + } + + @Test + fun `double start is idempotent`() = runTest(UnconfinedTestDispatcher()) { + val h = TestHarness() + h.integration.start(backgroundScope) + + h.integration.start(backgroundScope) // second start + + assertEquals(1, h.serverManager.startCount, "TAKServerManager should only be started once") + } + + @Test + fun `stop then inbound TAK message does not forward to mesh`() = runTest(UnconfinedTestDispatcher()) { + val h = TestHarness() + h.integration.start(backgroundScope) + + h.integration.stop() + + h.serverManager.emitInbound(createPli("after-stop")) + + assertTrue(h.commandSender.sentPackets.isEmpty()) + } + + // ── Inbound mesh → TAK client (V1) ────────────────────────────────────── + + @Test + fun `inbound V1 PLI packet is broadcast to TAK clients`() = runTest(UnconfinedTestDispatcher()) { + val h = TestHarness() + h.integration.start(backgroundScope) + + h.serviceRepository.emitMeshPacket(createV1PliMeshPacket()) + + assertTrue(h.serverManager.broadcasts.isNotEmpty(), "Expected broadcasts for V1 PLI") + assertTrue(h.serverManager.broadcasts.first().type.startsWith("a-f-")) + } + + @Test + fun `inbound packet on unrelated port is ignored`() = runTest(UnconfinedTestDispatcher()) { + val h = TestHarness() + h.integration.start(backgroundScope) + + val textPacket = + MeshPacket( + decoded = + Data(portnum = PortNum.TEXT_MESSAGE_APP, payload = "hello".encodeToByteArray().toByteString()), + ) + h.serviceRepository.emitMeshPacket(textPacket) + + assertTrue(h.serverManager.broadcasts.isEmpty()) + assertTrue(h.serverManager.rawBroadcasts.isEmpty()) + } + + // ── Firmware gating ────────────────────────────────────────────────────── + + @Test + fun `null firmware defaults to V2 protocol`() = runTest(UnconfinedTestDispatcher()) { + val h = TestHarness(nodeRepository = FakeNodeRepository(firmwareVersion = null)) + h.integration.start(backgroundScope) + + h.serverManager.emitInbound(createPli("test-v2-default")) + + // In commonTest without TAKPacket-SDK, v2 path catches and falls back. + // Verify the code didn't crash and attempted to send. + if (h.commandSender.sentPackets.isNotEmpty()) { + val sent = h.commandSender.sentPackets.first() + assertEquals(PortNum.ATAK_PLUGIN_V2.value, sent.dataType) + } + } + + @Test + fun `legacy firmware sends on V1 port 72`() = runTest(UnconfinedTestDispatcher()) { + val h = TestHarness(nodeRepository = FakeNodeRepository(firmwareVersion = "2.7.0.0")) + h.integration.start(backgroundScope) + + h.serverManager.emitInbound(createPli("test-v1")) + + if (h.commandSender.sentPackets.isNotEmpty()) { + val sent = h.commandSender.sentPackets.first() + assertEquals(PortNum.ATAK_PLUGIN.value, sent.dataType) + } + } + + @Test + fun `legacy firmware drops non-PLI non-GeoChat types`() = runTest(UnconfinedTestDispatcher()) { + val h = TestHarness(nodeRepository = FakeNodeRepository(firmwareVersion = "2.7.0.0")) + h.integration.start(backgroundScope) + + val marker = CoTMessage(uid = "marker-1", type = "a-h-G", stale = Clock.System.now() + 5.minutes) + h.serverManager.emitInbound(marker) + + assertTrue(h.commandSender.sentPackets.isEmpty()) + } + + // ── GeoChat callsign enrichment ────────────────────────────────────────── + + @Test + fun `GeoChat without callsign is enriched from client info`() = runTest(UnconfinedTestDispatcher()) { + val h = TestHarness(nodeRepository = FakeNodeRepository(firmwareVersion = "2.7.0.0")) + h.integration.start(backgroundScope) + + val chatMsg = + CoTMessage( + uid = "GeoChat.test.All Chat Rooms.1234", + type = "b-t-f", + how = "h-g-i-g-o", + stale = Clock.System.now() + 5.minutes, + contact = null, + chat = CoTChat(message = "hello", senderCallsign = null), + ) + val clientInfo = TAKClientInfo(id = "client-1", endpoint = "127.0.0.1:8089", callsign = "ALPHA-1") + h.serverManager.emitInbound(chatMsg, clientInfo) + + // GeoChat on legacy V1 should produce a sent packet with the enriched callsign + if (h.commandSender.sentPackets.isNotEmpty()) { + val sent = h.commandSender.sentPackets.first() + assertEquals(PortNum.ATAK_PLUGIN.value, sent.dataType) + } + } + + // ── Helpers ─────────────────────────────────────────────────────────────── + + private fun createPli(uid: String) = + CoTMessage.pli(uid = uid, callsign = "TEST", latitude = 33.0, longitude = -84.0) + + private fun createV1PliMeshPacket(): MeshPacket { + val takPacket = + TAKPacket( + contact = org.meshtastic.proto.Contact(callsign = "BRAVO", device_callsign = "bravo-uid"), + pli = + org.meshtastic.proto.PLI( + latitude_i = 330000000, + longitude_i = -840000000, + altitude = 100, + speed = 0, + course = 0, + ), + group = + org.meshtastic.proto.Group( + team = org.meshtastic.proto.Team.Cyan, + role = org.meshtastic.proto.MemberRole.TeamMember, + ), + status = org.meshtastic.proto.Status(battery = 85), + ) + return MeshPacket( + decoded = Data(portnum = PortNum.ATAK_PLUGIN, payload = TAKPacket.ADAPTER.encode(takPacket).toByteString()), + ) + } +} diff --git a/core/takserver/src/commonTest/kotlin/org/meshtastic/core/takserver/TAKPacketV2RawDetailTest.kt b/core/takserver/src/commonTest/kotlin/org/meshtastic/core/takserver/TAKPacketV2RawDetailTest.kt new file mode 100644 index 000000000..8660acf05 --- /dev/null +++ b/core/takserver/src/commonTest/kotlin/org/meshtastic/core/takserver/TAKPacketV2RawDetailTest.kt @@ -0,0 +1,137 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.meshtastic.core.takserver + +import org.meshtastic.core.takserver.TAKPacketV2Conversion.toCoTMessage +import org.meshtastic.core.takserver.TAKPacketV2Conversion.toTAKPacketV2 +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertFalse +import kotlin.test.assertNotNull +import kotlin.test.assertNull +import kotlin.test.assertTrue + +/** + * Verifies the `raw_detail` fallback round-trip for CoT types that don't fit any structured + * [org.meshtastic.proto.TAKPacketV2] payload (PLI, GeoChat, Aircraft). + * + * Prior to this, ATAK user-drawn elements like `u-d-c-c` would be silently dropped by + * [TAKPacketV2Conversion.toTAKPacketV2] with `"Cannot convert CoT to TAKPacketV2 for type ..."`. + */ +class TAKPacketV2RawDetailTest { + + @Test + fun udcc_round_trips_via_raw_detail() { + // Note: `` / `` / `` in the input are deliberately + // stripped by [CoTDetailStripper] before being placed in raw_detail, because + // they blow up the wire size beyond the LoRa MTU. We keep `` here so + // we have something non-trivial to verify round-tripped. + val shapeXml = + """ + + + + + + + + + + + + """ + .trimIndent() + + // Parse → convert to TAKPacketV2 + val cotMessage = CoTXmlParser(shapeXml).parse().getOrNull() + assertNotNull(cotMessage, "CoT XML must parse successfully") + val takPacketV2 = cotMessage.toTAKPacketV2() + assertNotNull(takPacketV2, "u-d-c-c must convert to TAKPacketV2 (not drop)") + + // raw_detail must be populated; structured payloads must be null. + assertNotNull(takPacketV2.raw_detail, "raw_detail must hold the detail bytes") + assertNull(takPacketV2.pli, "PLI payload must not be set for u-d-c-c") + assertNull(takPacketV2.chat, "chat payload must not be set for u-d-c-c") + assertEquals("u-d-c-c", takPacketV2.cot_type_str.ifEmpty { "u-d-c-c" }) + // Stripping must have fired: the raw_detail bytes must NOT contain the + // shape/labels_on fragments we put in the input. + val rawDetailBytes = takPacketV2.raw_detail!!.utf8() + assertFalse(rawDetailBytes.contains("shape"), "shape must be stripped from raw_detail: $rawDetailBytes") + assertFalse(rawDetailBytes.contains("labels_on"), "labels_on must be stripped: $rawDetailBytes") + assertTrue(rawDetailBytes.contains("contact"), "contact must survive: $rawDetailBytes") + + // Convert back to CoTMessage + val roundTripped = takPacketV2.toCoTMessage() + assertNotNull(roundTripped, "TAKPacketV2 with raw_detail must convert back to CoTMessage") + assertEquals("u-d-c-c", roundTripped.type) + assertEquals(45.5, roundTripped.latitude, 0.0001) + assertEquals(-90.25, roundTripped.longitude, 0.0001) + + // Serialize to XML; the surviving (stripped) content must be present. + val xmlOut = roundTripped.toXml() + assertTrue(xmlOut.contains("type='u-d-c-c'"), "type must survive: $xmlOut") + assertTrue(xmlOut.contains("ALPHA01"), "contact callsign must survive: $xmlOut") + assertFalse(xmlOut.contains(" + + + + <__group name="Red" role="Team Member"/> + + + + """ + .trimIndent() + + val cotMessage = CoTXmlParser(xml).parse().getOrNull()!! + val takPacketV2 = cotMessage.toTAKPacketV2()!! + val roundTripped = takPacketV2.toCoTMessage()!! + + assertNull(roundTripped.contact, "contact must be null on raw_detail path (lives inside rawDetailXml)") + assertNull(roundTripped.group, "group must be null on raw_detail path") + assertNull(roundTripped.status, "status must be null on raw_detail path") + + val xmlOut = roundTripped.toXml() + // Exactly one (from the round-tripped raw detail), not two. + assertEquals(1, xmlOut.split(". + */ +package org.meshtastic.core.takserver + +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.test.advanceUntilIdle +import kotlinx.coroutines.test.runTest +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertTrue +import kotlin.time.Clock +import kotlin.time.Duration.Companion.minutes + +/** + * Tests for [TAKServerManagerImpl] offline message queue behavior: + * - FIFO eviction at 50-message cap (T074) + * - Per-message TTL expiry after 5 minutes (T074) + * - Replay of queued messages on client reconnect (T074) + */ +class TAKServerManagerTest { + + /** Fake TAKServer that records broadcasts and simulates connection state. */ + private class FakeTAKServer : TAKServer { + override val connectionCount: StateFlow = MutableStateFlow(0) + override var onMessage: ((CoTMessage, TAKClientInfo?) -> Unit)? = null + override var onClientConnected: (() -> Unit)? = null + + var stubHasConnections = false + val broadcasts = mutableListOf() + val rawBroadcasts = mutableListOf() + + override suspend fun start(scope: CoroutineScope): Result = Result.success(Unit) + + override fun stop() {} + + override suspend fun broadcast(cotMessage: CoTMessage) { + broadcasts.add(cotMessage) + } + + override suspend fun broadcastRawXml(xml: String) { + rawBroadcasts.add(xml) + } + + override suspend fun hasConnections(): Boolean = stubHasConnections + } + + private fun createPli(uid: String): CoTMessage { + val now = Clock.System.now() + return CoTMessage( + uid = uid, + type = DEFAULT_PLI_COT_TYPE, + stale = now + 5.minutes, + latitude = 45.0, + longitude = -90.0, + ) + } + + @Test + fun `offline queue caps at 50 messages with FIFO eviction`() = runTest { + val fakeTakServer = FakeTAKServer() + fakeTakServer.stubHasConnections = false + val manager = TAKServerManagerImpl(fakeTakServer) + manager.start(this) + advanceUntilIdle() + + // Queue 55 messages (5 more than the cap) + repeat(55) { i -> manager.broadcast(createPli("uid-$i")) } + advanceUntilIdle() + + // Now simulate a client connecting — drain the queue + fakeTakServer.stubHasConnections = true + manager.drainOfflineQueue() + advanceUntilIdle() + + // Should have drained exactly 50 messages (the oldest 5 evicted by FIFO) + assertEquals(50, fakeTakServer.broadcasts.size) + // The first message drained should be uid-5 (uid-0 through uid-4 were evicted) + assertEquals("uid-5", fakeTakServer.broadcasts.first().uid) + // The last message drained should be uid-54 + assertEquals("uid-54", fakeTakServer.broadcasts.last().uid) + + manager.stop() + } + + @Test + fun `offline queue expires messages after 5 minute TTL`() = runTest { + val fakeTakServer = FakeTAKServer() + fakeTakServer.stubHasConnections = false + val manager = TAKServerManagerImpl(fakeTakServer) + manager.start(this) + advanceUntilIdle() + + // Queue 3 messages — these will be stamped with Clock.System.now() + repeat(3) { i -> manager.broadcast(createPli("msg-$i")) } + advanceUntilIdle() + + // Immediately drain (no time has passed) — all messages should still be valid + fakeTakServer.stubHasConnections = true + manager.drainOfflineQueue() + advanceUntilIdle() + + // All 3 messages should be delivered (none expired yet since <5 min elapsed) + assertEquals(3, fakeTakServer.broadcasts.size) + assertEquals("msg-0", fakeTakServer.broadcasts[0].uid) + assertEquals("msg-1", fakeTakServer.broadcasts[1].uid) + assertEquals("msg-2", fakeTakServer.broadcasts[2].uid) + + manager.stop() + } + + @Test + fun `offline queue replays messages in order on client reconnect`() = runTest { + val fakeTakServer = FakeTAKServer() + fakeTakServer.stubHasConnections = false + val manager = TAKServerManagerImpl(fakeTakServer) + manager.start(this) + advanceUntilIdle() + + // Queue messages in order + val uids = listOf("alpha", "bravo", "charlie", "delta") + uids.forEach { uid -> manager.broadcast(createPli(uid)) } + advanceUntilIdle() + + // Simulate client reconnect + fakeTakServer.stubHasConnections = true + manager.drainOfflineQueue() + advanceUntilIdle() + + // Messages should be replayed in FIFO order + assertEquals(uids, fakeTakServer.broadcasts.map { it.uid }) + + manager.stop() + } + + @Test + fun `broadcast goes directly to TAK server when clients connected`() = runTest { + val fakeTakServer = FakeTAKServer() + fakeTakServer.stubHasConnections = true + val manager = TAKServerManagerImpl(fakeTakServer) + manager.start(this) + advanceUntilIdle() + + manager.broadcast(createPli("direct")) + advanceUntilIdle() + + // Message should be broadcast directly, not queued + assertEquals(1, fakeTakServer.broadcasts.size) + assertEquals("direct", fakeTakServer.broadcasts.first().uid) + + manager.stop() + } + + // ── T076: Port conflict / start failure ───────────────────────────────────── + + /** Fake TAKServer that simulates a port-conflict failure on start. */ + private class FailingTAKServer : TAKServer { + override val connectionCount: StateFlow = MutableStateFlow(0) + override var onMessage: ((CoTMessage, TAKClientInfo?) -> Unit)? = null + override var onClientConnected: (() -> Unit)? = null + + override suspend fun start(scope: CoroutineScope): Result = + Result.failure(IllegalStateException("Address already in use: port 8089")) + + override fun stop() {} + + override suspend fun broadcast(cotMessage: CoTMessage) {} + + override suspend fun broadcastRawXml(xml: String) {} + + override suspend fun hasConnections(): Boolean = false + } + + @Test + fun `start failure due to port conflict leaves isRunning false`() = runTest { + val failingServer = FailingTAKServer() + val manager = TAKServerManagerImpl(failingServer) + manager.start(this) + advanceUntilIdle() + + // Manager should NOT be running after start failure + assertEquals(false, manager.isRunning.value) + } + + @Test + fun `start failure clears onMessage callback`() = runTest { + val failingServer = FailingTAKServer() + val manager = TAKServerManagerImpl(failingServer) + manager.start(this) + advanceUntilIdle() + + // onMessage should be cleared after failed start + assertEquals(null, failingServer.onMessage) + } + + @Test + fun `broadcast is no-op after failed start`() = runTest { + val failingServer = FailingTAKServer() + val manager = TAKServerManagerImpl(failingServer) + manager.start(this) + advanceUntilIdle() + + // Broadcast should silently do nothing (not crash) + manager.broadcast(createPli("should-be-dropped")) + advanceUntilIdle() + // No exception = pass. isRunning is false so broadcast exits early. + } + + @Test + fun `broadcastRawXml forwards to TAKServer when running`() = runTest { + val fakeTakServer = FakeTAKServer() + fakeTakServer.stubHasConnections = true + val manager = TAKServerManagerImpl(fakeTakServer) + manager.start(this) + advanceUntilIdle() + + val rawXml = """""" + manager.broadcastRawXml(rawXml) + advanceUntilIdle() + + assertEquals(1, fakeTakServer.rawBroadcasts.size) + assertEquals(rawXml, fakeTakServer.rawBroadcasts.first()) + } + + @Test + fun `broadcastRawXml is no-op when not running`() = runTest { + val fakeTakServer = FakeTAKServer() + val manager = TAKServerManagerImpl(fakeTakServer) + // Don't call start() + + manager.broadcastRawXml("""""") + advanceUntilIdle() + + assertTrue(fakeTakServer.rawBroadcasts.isEmpty()) + } +} diff --git a/core/takserver/src/commonTest/kotlin/org/meshtastic/core/takserver/TakV2CompressorBoundaryTest.kt b/core/takserver/src/commonTest/kotlin/org/meshtastic/core/takserver/TakV2CompressorBoundaryTest.kt new file mode 100644 index 000000000..3de7c891d --- /dev/null +++ b/core/takserver/src/commonTest/kotlin/org/meshtastic/core/takserver/TakV2CompressorBoundaryTest.kt @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.meshtastic.core.takserver + +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertTrue + +/** + * Tests for [TakV2Compressor] size boundary validation (T077). + * + * Verifies that: + * - MAX_DECOMPRESSED_SIZE is a reasonable constant (4096 bytes) + * - Dictionary IDs are correctly defined + * - The uncompressed marker (0xFF) is correct + */ +class TakV2CompressorBoundaryTest { + + @Test + fun `MAX_DECOMPRESSED_SIZE is 4096 bytes`() { + assertEquals(4096, TakV2Compressor.MAX_DECOMPRESSED_SIZE) + } + + @Test + fun `MAX_DECOMPRESSED_SIZE is greater than mesh MTU`() { + // MAX_TAK_WIRE_PAYLOAD_BYTES = 225. Decompressed size must be larger than the + // compressed wire payload to be useful. Also ensures there's a reasonable + // amplification cap to prevent decompression bombs. + assertTrue(TakV2Compressor.MAX_DECOMPRESSED_SIZE > MAX_TAK_WIRE_PAYLOAD_BYTES) + } + + @Test + fun `MAX_DECOMPRESSED_SIZE is bounded to prevent memory exhaustion`() { + // A decompression bomb could expand a small payload into megabytes. The limit + // must be small enough to prevent OOM in constrained Android environments. + assertTrue(TakV2Compressor.MAX_DECOMPRESSED_SIZE <= 65536) + } + + @Test + fun `dictionary IDs are correctly assigned`() { + assertEquals(0, TakV2Compressor.DICT_ID_NON_AIRCRAFT) + assertEquals(1, TakV2Compressor.DICT_ID_AIRCRAFT) + } + + @Test + fun `uncompressed marker is 0xFF`() { + assertEquals(0xFF, TakV2Compressor.DICT_ID_UNCOMPRESSED) + } +} diff --git a/core/takserver/src/commonTest/kotlin/org/meshtastic/core/takserver/fountain/FountainCodecTest.kt b/core/takserver/src/commonTest/kotlin/org/meshtastic/core/takserver/fountain/FountainCodecTest.kt deleted file mode 100644 index 08604e926..000000000 --- a/core/takserver/src/commonTest/kotlin/org/meshtastic/core/takserver/fountain/FountainCodecTest.kt +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright (c) 2026 Meshtastic LLC - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package org.meshtastic.core.takserver.fountain - -import kotlin.test.Test -import kotlin.test.assertContentEquals -import kotlin.test.assertEquals -import kotlin.test.assertFalse -import kotlin.test.assertNotNull -import kotlin.test.assertNull -import kotlin.test.assertTrue - -class FountainCodecTest { - - private fun createCodec() = FountainCodec() - - @Test - fun `test encode and decode small payload`() { - val codec = createCodec() - val originalData = "Hello, TAK! This is a test payload.".encodeToByteArray() - // Use a fixed transfer ID for deterministic peeling decode - val transferId = 42 - - val packets = codec.encode(originalData, transferId) - assertTrue(packets.isNotEmpty(), "Encoding should produce packets") - - var decodedResult: Pair? = null - for (packet in packets) { - val result = codec.handleIncomingPacket(packet) - if (result != null) { - decodedResult = result - break - } - } - - assertNotNull(decodedResult, "Should successfully decode payload") - assertEquals(transferId, decodedResult.second, "Transfer ID should match") - assertContentEquals(originalData, decodedResult.first, "Decoded data should match original") - } - - @Test - fun `test encode and decode larger payload with packet loss`() { - val codec = createCodec() - // Create a payload larger than BLOCK_SIZE (220 bytes) - val originalData = ByteArray(1024) { (it % 256).toByte() } - // Use a fixed transfer ID for deterministic peeling decode. - // Random transfer IDs cause ~14% flake rate because the robust soliton - // distribution with k=5 and 50% overhead doesn't always produce a - // decodable set of encoded blocks via the peeling algorithm. - val transferId = 42 - - val packets = codec.encode(originalData, transferId) - assertTrue(packets.size > 4, "Should have multiple packets for large payload") - - var decodedResult: Pair? = null - - // Process all packets - fountain codes are designed to handle packet loss - // by receiving enough encoded packets to reconstruct the original data - for (packet in packets) { - val result = codec.handleIncomingPacket(packet) - if (result != null) { - decodedResult = result - break - } - } - - assertNotNull(decodedResult, "Should successfully decode payload with sufficient packets") - assertEquals(transferId, decodedResult.second, "Transfer ID should match") - assertContentEquals(originalData, decodedResult.first, "Decoded data should match original") - } - - @Test - fun `test build and parse ACK`() { - val codec = createCodec() - val transferId = 123456 - val type = FountainConstants.ACK_TYPE_COMPLETE - val received = 5 - val needed = 0 - val dataHash = byteArrayOf(1, 2, 3, 4, 5, 6, 7, 8) - - val ackPacket = codec.buildAck(transferId, type, received, needed, dataHash) - assertTrue(codec.isFountainPacket(ackPacket), "ACK should be recognized as a Fountain packet") - - val parsedAck = codec.parseAck(ackPacket) - assertNotNull(parsedAck, "ACK should be parseable") - assertEquals(transferId, parsedAck.transferId) - assertEquals(type, parsedAck.type) - assertEquals(received, parsedAck.received) - assertEquals(needed, parsedAck.needed) - assertContentEquals(dataHash, parsedAck.dataHash) - } - - @Test - fun `test invalid packet handling`() { - val codec = createCodec() - val invalidPacket = byteArrayOf(0x00, 0x01, 0x02, 0x03) - assertFalse(codec.isFountainPacket(invalidPacket), "Should reject invalid magic bytes") - assertNull(codec.parseDataHeader(invalidPacket), "Should not parse invalid header") - assertNull(codec.handleIncomingPacket(invalidPacket), "Should handle invalid packet gracefully") - } -} diff --git a/core/takserver/src/iosMain/kotlin/org/meshtastic/core/takserver/AtakFileWriter.kt b/core/takserver/src/iosMain/kotlin/org/meshtastic/core/takserver/AtakFileWriter.kt new file mode 100644 index 000000000..9feb78cca --- /dev/null +++ b/core/takserver/src/iosMain/kotlin/org/meshtastic/core/takserver/AtakFileWriter.kt @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.meshtastic.core.takserver + +/** iOS no-op — iTAK accepts routes via TCP streaming, no data package needed. */ +internal actual object AtakFileWriter { + actual fun writeToImportDir(fileName: String, zipBytes: ByteArray): Boolean = false +} diff --git a/core/takserver/src/iosMain/kotlin/org/meshtastic/core/takserver/TAKServerIos.kt b/core/takserver/src/iosMain/kotlin/org/meshtastic/core/takserver/TAKServerIos.kt new file mode 100644 index 000000000..3aad75bd9 --- /dev/null +++ b/core/takserver/src/iosMain/kotlin/org/meshtastic/core/takserver/TAKServerIos.kt @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.meshtastic.core.takserver + +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import org.meshtastic.core.di.CoroutineDispatchers + +/** + * iOS KMP stub. The real iOS TAK server lives in Meshtastic-Apple (`Meshtastic/Helpers/TAK/TAKServerManager.swift`) and + * uses Apple's `Network.framework` / `NWListener` + mTLS directly, not this KMP module. + * + * We provide a no-op implementation here so that the shared `core:takserver` module still compiles for the iOS KMP + * targets. Any iOS-side consumer of this module would never actually call into this path — iOS bypasses the KMP + * `TAKServer` interface entirely. + */ +private class NoopTAKServer : TAKServer { + private val _connectionCount = MutableStateFlow(0) + override val connectionCount: StateFlow = _connectionCount.asStateFlow() + override var onMessage: ((CoTMessage, TAKClientInfo?) -> Unit)? = null + override var onClientConnected: (() -> Unit)? = null + + override suspend fun start(scope: CoroutineScope): Result = Result.success(Unit) + + override fun stop() = Unit + + override suspend fun broadcast(cotMessage: CoTMessage) = Unit + + override suspend fun broadcastRawXml(xml: String) = Unit + + override suspend fun hasConnections(): Boolean = false +} + +actual fun createTAKServer(dispatchers: CoroutineDispatchers, port: Int): TAKServer = NoopTAKServer() diff --git a/core/takserver/src/iosMain/kotlin/org/meshtastic/core/takserver/TakFixtureLoader.kt b/core/takserver/src/iosMain/kotlin/org/meshtastic/core/takserver/TakFixtureLoader.kt new file mode 100644 index 000000000..6bb8a7159 --- /dev/null +++ b/core/takserver/src/iosMain/kotlin/org/meshtastic/core/takserver/TakFixtureLoader.kt @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.meshtastic.core.takserver + +/** iOS stub — the TAK mesh test runner is not supported on iOS targets. */ +internal actual fun loadTakFixtureXml(name: String): String = + throw UnsupportedOperationException("TAK fixture loading is not supported on iOS.") diff --git a/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/fountain/CodecExpect.kt b/core/takserver/src/iosMain/kotlin/org/meshtastic/core/takserver/TakSdkCompressor.kt similarity index 62% rename from core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/fountain/CodecExpect.kt rename to core/takserver/src/iosMain/kotlin/org/meshtastic/core/takserver/TakSdkCompressor.kt index 48c635560..0d0823104 100644 --- a/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/fountain/CodecExpect.kt +++ b/core/takserver/src/iosMain/kotlin/org/meshtastic/core/takserver/TakSdkCompressor.kt @@ -14,18 +14,10 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package org.meshtastic.core.takserver.fountain +package org.meshtastic.core.takserver -import okio.ByteString.Companion.toByteString +internal actual object TakSdkCompressor { -internal expect object ZlibCodec { - fun compress(data: ByteArray): ByteArray? - - fun decompress(data: ByteArray): ByteArray? -} - -internal object CryptoCodec { - private const val PREFIX_SIZE = 8 - - fun sha256Prefix8(data: ByteArray): ByteArray = data.toByteString().sha256().toByteArray().copyOf(PREFIX_SIZE) + actual fun compressCoT(xml: String, maxBytes: Int): ByteArray? = + throw UnsupportedOperationException("TAKPacket-SDK is not available on iOS") } diff --git a/core/takserver/src/iosMain/kotlin/org/meshtastic/core/takserver/TakV2Compressor.kt b/core/takserver/src/iosMain/kotlin/org/meshtastic/core/takserver/TakV2Compressor.kt new file mode 100644 index 000000000..b0d066090 --- /dev/null +++ b/core/takserver/src/iosMain/kotlin/org/meshtastic/core/takserver/TakV2Compressor.kt @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.meshtastic.core.takserver + +import org.meshtastic.core.takserver.TAKPacketV2Conversion.toCoTMessage +import org.meshtastic.proto.TAKPacketV2 + +/** + * iOS stub for TakV2Compressor. + * + * TODO: Replace with Swift SDK integration via interop. + */ +internal actual object TakV2Compressor { + + actual val MAX_DECOMPRESSED_SIZE: Int = 4096 + actual val DICT_ID_NON_AIRCRAFT: Int = 0 + actual val DICT_ID_AIRCRAFT: Int = 1 + actual val DICT_ID_UNCOMPRESSED: Int = 0xFF + + actual fun compress(packet: TAKPacketV2): ByteArray { + // iOS: Send uncompressed for now (TAK_TRACKER mode) + val protobufBytes = TAKPacketV2.ADAPTER.encode(packet) + val wirePayload = ByteArray(1 + protobufBytes.size) + wirePayload[0] = DICT_ID_UNCOMPRESSED.toByte() + protobufBytes.copyInto(wirePayload, 1) + return wirePayload + } + + actual fun decompressToXml(wirePayload: ByteArray): String { + // iOS stub: decompress the packet and convert to CoT XML via the common conversion path. + val packet = decompress(wirePayload) + return packet.toCoTMessage()?.toXml() + ?: throw UnsupportedOperationException( + "iOS stub: TAKPacketV2 could not be converted to CoT XML for packet: $packet", + ) + } + + actual fun decompress(wirePayload: ByteArray): TAKPacketV2 { + require(wirePayload.size >= 2) { "Wire payload too short: ${wirePayload.size} bytes" } + + val flagsByte = wirePayload[0].toInt() and 0xFF + val payloadBytes = wirePayload.copyOfRange(1, wirePayload.size) + + // iOS stub: only support uncompressed (0xFF) payloads + if (flagsByte != DICT_ID_UNCOMPRESSED) { + throw UnsupportedOperationException( + "iOS zstd decompression not yet implemented. Received dict ID: ${flagsByte and 0x3F}", + ) + } + + require(payloadBytes.size <= MAX_DECOMPRESSED_SIZE) { + "Payload size ${payloadBytes.size} exceeds limit $MAX_DECOMPRESSED_SIZE" + } + + return TAKPacketV2.ADAPTER.decode(payloadBytes) + } +} diff --git a/core/takserver/src/iosMain/kotlin/org/meshtastic/core/takserver/fountain/ZlibCodec.kt b/core/takserver/src/iosMain/kotlin/org/meshtastic/core/takserver/fountain/ZlibCodec.kt deleted file mode 100644 index b0e4f1030..000000000 --- a/core/takserver/src/iosMain/kotlin/org/meshtastic/core/takserver/fountain/ZlibCodec.kt +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright (c) 2026 Meshtastic LLC - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package org.meshtastic.core.takserver.fountain - -import kotlinx.cinterop.ExperimentalForeignApi -import kotlinx.cinterop.addressOf -import kotlinx.cinterop.alloc -import kotlinx.cinterop.memScoped -import kotlinx.cinterop.ptr -import kotlinx.cinterop.reinterpret -import kotlinx.cinterop.usePinned -import kotlinx.cinterop.value -import platform.zlib.Z_BUF_ERROR -import platform.zlib.Z_OK -import platform.zlib.compress -import platform.zlib.compressBound -import platform.zlib.uncompress - -internal actual object ZlibCodec { - @OptIn(ExperimentalForeignApi::class) - actual fun compress(data: ByteArray): ByteArray? { - if (data.isEmpty()) return ByteArray(0) - - return memScoped { - val destLen = alloc() - destLen.value = compressBound(data.size.toULong()) - - val destBuffer = ByteArray(destLen.value.toInt()) - - val result = - destBuffer.usePinned { destPin -> - data.usePinned { srcPin -> - compress( - destPin.addressOf(0).reinterpret(), - destLen.ptr, - srcPin.addressOf(0).reinterpret(), - data.size.toULong(), - ) - } - } - - if (result == Z_OK) { - destBuffer.copyOf(destLen.value.toInt()) - } else { - null - } - } - } - - @OptIn(ExperimentalForeignApi::class) - actual fun decompress(data: ByteArray): ByteArray? { - if (data.isEmpty()) return ByteArray(0) - - var currentSize = data.size * 4 - var maxAttempts = 5 - - while (maxAttempts > 0) { - val success = memScoped { - val destLen = alloc() - destLen.value = currentSize.toULong() - - val destBuffer = ByteArray(currentSize) - - val result = - destBuffer.usePinned { destPin -> - data.usePinned { srcPin -> - uncompress( - destPin.addressOf(0).reinterpret(), - destLen.ptr, - srcPin.addressOf(0).reinterpret(), - data.size.toULong(), - ) - } - } - - if (result == Z_OK) { - return@memScoped destBuffer.copyOf(destLen.value.toInt()) - } else if (result == Z_BUF_ERROR) { - currentSize *= 2 - maxAttempts-- - null - } else { - maxAttempts = 0 - null - } - } - if (success != null) return success - } - return null - } -} diff --git a/core/takserver/src/jvmAndroidMain/kotlin/org/meshtastic/core/takserver/TAKClientConnection.kt b/core/takserver/src/jvmAndroidMain/kotlin/org/meshtastic/core/takserver/TAKClientConnection.kt new file mode 100644 index 000000000..689afbaf9 --- /dev/null +++ b/core/takserver/src/jvmAndroidMain/kotlin/org/meshtastic/core/takserver/TAKClientConnection.kt @@ -0,0 +1,336 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +@file:Suppress("TooManyFunctions", "TooGenericExceptionCaught") + +package org.meshtastic.core.takserver + +import co.touchlab.kermit.Logger +import kotlinx.coroutines.CancellationException +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Job +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.cancel +import kotlinx.coroutines.launch +import kotlinx.coroutines.sync.Mutex +import kotlinx.coroutines.sync.withLock +import kotlinx.coroutines.withContext +import java.io.BufferedOutputStream +import java.io.InputStream +import java.io.OutputStream +import java.net.Socket +import java.util.concurrent.atomic.AtomicBoolean +import kotlin.concurrent.Volatile +import kotlin.random.Random +import kotlin.time.Clock +import kotlin.time.Duration.Companion.milliseconds +import kotlin.time.Instant +import kotlinx.coroutines.isActive as coroutineIsActive + +/** + * Per-client state machine for a connected TAK client (ATAK / iTAK / WinTAK). + * + * This is the jvmAndroidMain implementation, using plain `java.net.Socket` (which is also the base class of + * [javax.net.ssl.SSLSocket] from [TAKServerJvm]) with blocking `InputStream`/`OutputStream` I/O wrapped in + * [Dispatchers.IO] coroutines. + * + * Responsibilities: + * - TAK protocol negotiation handshake (`t-x-takp-v` / `-q` / `-r`) + * - Read loop that frames `` elements off the stream via [CoTXmlFrameBuffer] + * - Keepalive loop that emits a `t-x-d-d` event every [TAK_KEEPALIVE_INTERVAL_MS] + * - Serializing writes under a mutex so interleaved broadcasts never corrupt the XML stream + * - Lifecycle reporting up to [TAKServerJvm] via [onEvent] (`Connected`, `Disconnected`, `Error`, `ClientInfoUpdated`, + * `Message`) + */ +internal class TAKClientConnection( + private val socket: Socket, + val clientInfo: TAKClientInfo, + private val onEvent: (TAKConnectionEvent) -> Unit, + private val scope: CoroutineScope, + private val ioDispatcher: CoroutineDispatcher, +) { + private var currentClientInfo = clientInfo + private val frameBuffer = CoTXmlFrameBuffer() + + private val inputStream: InputStream = socket.getInputStream() + + // Wrap the OutputStream in a BufferedOutputStream so that multiple small writes + // (we emit a full XML event per write) coalesce into one syscall; flush() after + // each event to push the bytes through TLS immediately. + private val outputStream: OutputStream = BufferedOutputStream(socket.getOutputStream()) + private val writeMutex = Mutex() + + /** + * Per-connection child scope. Every coroutine this class launches — the read loop, the keepalive loop, and every + * single send — is attached to [connectionScope] so that [emitDisconnected] can tear the whole connection down with + * one `connectionScope.cancel()`. + * + * Why this is critical: [broadcast] in [TAKServerJvm] fires `connection.send()` on **every** connected client for + * **every** CoT event coming off the mesh (and with a 56-node nodeDB each `nodeDBbyNum` emission fans out to ~56 + * broadcasts). If [sendXml] launched those writes on the server-level [scope] — as the previous implementation did + * — a single dead connection could accumulate hundreds of in-flight write coroutines before it was removed from + * [TAKServerJvm.connections], and every one of them would spin up, hit the closed TLS socket, and log + * `SocketException: Socket closed` from `BufferedOutputStream.flush()`. Scoping writes to [connectionScope] means + * cancelling the scope wipes the entire backlog. + * + * Uses a [SupervisorJob] child of [scope]'s job so a single write failure doesn't cascade-cancel other connections + * on the same server. + */ + private val connectionScope: CoroutineScope = + CoroutineScope(SupervisorJob(scope.coroutineContext[Job]) + ioDispatcher) + + /** Guards against emitting [TAKConnectionEvent.Disconnected] more than once. */ + private val disconnectedEmitted = AtomicBoolean(false) + + /** + * Fail-fast flag checked at the top of [sendXml] so racing broadcasts against a dead connection don't even allocate + * a coroutine. + */ + @Volatile private var closed = false + + fun start() { + onEvent(TAKConnectionEvent.Connected(currentClientInfo)) + sendProtocolSupport() + + connectionScope.launch { readLoop() } + connectionScope.launch { keepaliveLoop() } + } + + private fun sendProtocolSupport() { + val serverUid = "Meshtastic-TAK-Server-${Random.nextInt().toString(TAK_HEX_RADIX)}" + val now = Clock.System.now() + val stale = now + TAK_KEEPALIVE_INTERVAL_MS.milliseconds + val detail = + """ + + + + """ + .trimIndent() + sendXmlInternal(buildEventXml(uid = serverUid, type = "t-x-takp-v", now = now, stale = stale, detail = detail)) + } + + private suspend fun readLoop() { + try { + val buffer = ByteArray(TAK_XML_READ_BUFFER_SIZE) + while (connectionScope.coroutineIsActive && !closed && !socket.isClosed) { + // Blocking read off the TLS input stream — must run on the IO dispatcher. + val bytesRead = withContext(ioDispatcher) { inputStream.read(buffer) } + if (bytesRead > 0) { + processReceivedData(buffer.copyOfRange(0, bytesRead)) + } else if (bytesRead == -1) { + break // EOF: remote peer closed the connection cleanly + } + } + } catch (e: CancellationException) { + throw e + } catch (e: Exception) { + if (!closed) { + Logger.w(e) { "TAK client read error: ${currentClientInfo.id}" } + emitDisconnected(TAKConnectionEvent.Error(e)) + } + return + } + emitDisconnected(TAKConnectionEvent.Disconnected) + } + + private suspend fun keepaliveLoop() { + while (connectionScope.coroutineIsActive && !closed && !socket.isClosed) { + kotlinx.coroutines.delay(TAK_KEEPALIVE_INTERVAL_MS) + if (closed) break + sendKeepalive() + } + } + + private fun sendKeepalive() { + val now = Clock.System.now() + val stale = now + TAK_KEEPALIVE_INTERVAL_MS.milliseconds + sendXmlInternal(buildEventXml(uid = "takPong", type = "t-x-d-d", now = now, stale = stale, detail = "")) + } + + /** Respond to ATAK's `t-x-c-t` ping with a pong to reset its RX timeout. */ + private fun sendPong() { + val now = Clock.System.now() + val stale = now + TAK_KEEPALIVE_INTERVAL_MS.milliseconds + sendXmlInternal(buildEventXml(uid = "takPong", type = "t-x-c-t-r", now = now, stale = stale, detail = "")) + } + + private fun processReceivedData(newData: ByteArray) { + frameBuffer.append(newData).forEach { xmlString -> parseAndHandleMessage(xmlString) } + } + + private fun parseAndHandleMessage(xmlString: String) { + // Fast-path: detect keepalive pings before full XML parsing to avoid + // both the parse overhead and the noisy RAW CoT IN log line every 4.5s. + if (xmlString.contains("t-x-c-t") || xmlString.contains("uid=\"ping\"")) { + sendPong() + return + } + + // Full raw CoT XML from the ATAK client, before any parsing happens. + // Emitted at debug level so it's always available in logcat for field + // debugging without needing a release rebuild. Not truncated — the + // reader of this log needs the complete event to reproduce issues. + // Logger.d { "RAW CoT IN (TCP ${currentClientInfo.id}): $xmlString" } + + val parser = CoTXmlParser(xmlString) + val result = parser.parse() + + result + .onSuccess { cotMessage -> + when { + cotMessage.type.startsWith("t-x-takp") -> { + handleProtocolControl(cotMessage.type, xmlString) + return + } + + else -> { + cotMessage.contact?.let { contact -> + val updatedClientInfo = + currentClientInfo.copy( + callsign = currentClientInfo.callsign ?: contact.callsign, + uid = currentClientInfo.uid ?: cotMessage.uid, + ) + if (updatedClientInfo != currentClientInfo) { + currentClientInfo = updatedClientInfo + onEvent(TAKConnectionEvent.ClientInfoUpdated(updatedClientInfo)) + } + } + onEvent(TAKConnectionEvent.Message(cotMessage, currentClientInfo)) + } + } + } + .onFailure { e -> Logger.w(e) { "Failed to parse CoT XML from TAK client ${currentClientInfo.id}" } } + } + + private fun handleProtocolControl(type: String, xmlString: String) { + if (type == "t-x-takp-q") { + sendProtocolResponse() + } else { + Logger.d { "Unhandled protocol control type: $type (raw=$xmlString)" } + } + } + + private fun sendProtocolResponse() { + val serverUid = "Meshtastic-TAK-Server-${Random.nextInt().toString(TAK_HEX_RADIX)}" + val now = Clock.System.now() + val stale = now + TAK_KEEPALIVE_INTERVAL_MS.milliseconds + val detail = + """ + + + + """ + .trimIndent() + sendXmlInternal(buildEventXml(uid = serverUid, type = "t-x-takp-r", now = now, stale = stale, detail = detail)) + } + + fun send(cotMessage: CoTMessage) { + if (closed) return + val xml = cotMessage.toXml() + // Full raw CoT XML being shipped out to the ATAK client, after the + // CoTMessage → XML round trip. This is the exact bytes the client + // will receive, so logging here closes the debugging loop with the + // matching RAW CoT IN line on the receiver. + // Logger.d { "RAW CoT OUT (TCP ${currentClientInfo.id}): $xml" } + sendXmlInternal(xml) + } + + private fun buildEventXml(uid: String, type: String, now: Instant, stale: Instant, detail: String): String { + val detailContent = if (detail.isBlank()) "" else "$detail" + val point = """""" + return """""" + + point + + detailContent + + "" + } + + /** + * Send raw XML directly to this client. Used for mesh-originated messages that bypass CoTMessage parsing to + * preserve shape detail elements. + */ + fun sendRawXml(xml: String) { + // Logger.d { "RAW CoT OUT (TCP ${currentClientInfo.id}): [raw] $xml" } + sendXmlInternal(xml) + } + + private fun sendXmlInternal(xml: String) { + // Fail-fast synchronous check BEFORE allocating a coroutine. This is the hot path + // for broadcasts — see the scope doc above for why it matters. + if (closed) return + connectionScope.launch { + // Re-check inside the coroutine: we may have been cancelled or marked closed + // between the launch and the dispatcher picking this up. + if (closed) return@launch + try { + writeMutex.withLock { + if (closed || socket.isClosed) return@withLock + val bytes = xml.toByteArray(Charsets.UTF_8) + // Blocking write on TLS output must run on the IO dispatcher + withContext(ioDispatcher) { + outputStream.write(bytes) + outputStream.flush() + } + } + } catch (e: CancellationException) { + throw e + } catch (e: Exception) { + // Don't spam on writes that raced a disconnect we already observed. + if (!closed) { + Logger.w(e) { "TAK client send error: ${currentClientInfo.id}" } + emitDisconnected(TAKConnectionEvent.Error(e)) + } + } + } + } + + fun close() { + frameBuffer.clear() + emitDisconnected(TAKConnectionEvent.Disconnected) + } + + /** + * Emits [event] (expected to be [TAKConnectionEvent.Disconnected] or [TAKConnectionEvent.Error]) at most once + * across all code paths, then tears down the per-connection coroutines and socket. + * + * This is the ONLY place the connection's entire coroutine scope — keepalive loop, read loop, and any in-flight + * send coroutines — gets cancelled when the *remote* peer closes the TLS stream. Without this, Java's + * [Socket.isClosed] only reports whether *our* side called close(), so the keepalive loop's `!socket.isClosed` + * guard never fires, the broadcast fanout keeps launching writes onto the dead socket via [sendXml], and every + * iteration logs `SSLOutputStream / Socket closed`. Before [closed] + [connectionScope.cancel] were added, a single + * session with a few reconnects accumulated hundreds of zombie write coroutines each spamming errors in parallel. + * + * Idempotent via [AtomicBoolean.compareAndSet], so racing calls from [readLoop], [keepaliveLoop], and [sendXml] all + * converge on a single teardown. + */ + private fun emitDisconnected(event: TAKConnectionEvent) { + if (disconnectedEmitted.compareAndSet(false, true)) { + // Set the fail-fast flag BEFORE emitting the event. [TAKServerJvm] will + // schedule an async map removal on receipt, and any broadcast racing the + // removal must see `closed = true` when it hits [send] / [sendXml]. + closed = true + onEvent(event) + // Cancel the whole scope — readLoop, keepaliveLoop, and every queued or + // in-flight sendXml coroutine. Any write blocked in the syscall will throw + // on the next iteration because we close the socket next. + connectionScope.cancel() + try { + socket.close() + } catch (_: Exception) {} + } + } +} diff --git a/core/takserver/src/jvmAndroidMain/kotlin/org/meshtastic/core/takserver/TAKServerJvm.kt b/core/takserver/src/jvmAndroidMain/kotlin/org/meshtastic/core/takserver/TAKServerJvm.kt new file mode 100644 index 000000000..c6ec0977b --- /dev/null +++ b/core/takserver/src/jvmAndroidMain/kotlin/org/meshtastic/core/takserver/TAKServerJvm.kt @@ -0,0 +1,299 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +@file:Suppress("TooGenericExceptionCaught") + +package org.meshtastic.core.takserver + +import co.touchlab.kermit.Logger +import kotlinx.coroutines.CancellationException +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Job +import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import org.meshtastic.core.di.CoroutineDispatchers +import java.net.InetAddress +import java.net.ServerSocket +import java.net.Socket +import java.util.concurrent.locks.ReentrantLock +import javax.net.ssl.SSLServerSocket +import kotlin.concurrent.Volatile +import kotlin.concurrent.withLock +import kotlin.random.Random +import kotlinx.coroutines.isActive as coroutineIsActive + +/** + * JSSE-backed TLS TAK server. Matches the Meshtastic-Apple (iOS) implementation: + * - Binds `127.0.0.1:8089` (loopback only — no remote device can reach the server) + * - TLS 1.2+ with the bundled server.p12 identity + * - Mutual TLS: clients MUST present a certificate chaining to the bundled ca.pem + * - `SO_REUSEADDR` on the listen socket so an app restart doesn't hit `BindException: Address already in use` while the + * previous socket is in `TIME_WAIT` + * - Per-connection [TAKClientConnection] running on [CoroutineDispatchers.io] + * + * If the bundled certificates fail to load (e.g. packaging regression), the server refuses to start rather than + * silently falling back to plain TCP — that failure mode would produce exactly the symptom the user was debugging + * ("ATAK never connects"). + */ +internal class TAKServerJvm(private val dispatchers: CoroutineDispatchers, private val port: Int = DEFAULT_TAK_PORT) : + TAKServer { + + private var serverSocket: ServerSocket? = null + + @Volatile private var running = false + private var serverScope: CoroutineScope? = null + private var acceptJob: Job? = null + private val connectionsLock = ReentrantLock() + private val connections = mutableMapOf() + + private val _connectionCount = MutableStateFlow(0) + override val connectionCount: StateFlow = _connectionCount.asStateFlow() + + override var onMessage: ((CoTMessage, TAKClientInfo?) -> Unit)? = null + override var onClientConnected: (() -> Unit)? = null + + override suspend fun start(scope: CoroutineScope): Result { + if (running) { + Logger.w { "TAK Server already running on port $port" } + return Result.success(Unit) + } + + val sslContext = + TakCertLoader.getServerSslContext() + ?: return Result.failure( + IllegalStateException( + "TAK Server: bundled TLS certificates could not be loaded" + "; refusing to start", + ), + ) + + return try { + serverScope = scope + + // Bind on the IO dispatcher — bind() can briefly block. + val boundSocket = + withContext(dispatchers.io) { + val factory = sslContext.serverSocketFactory + // Use the address-specific overload so we bind to loopback only. + val loopback = InetAddress.getByName("127.0.0.1") + // backlog of 4 is plenty for local TAK clients + val tls = factory.createServerSocket(port, 4, loopback) as SSLServerSocket + configureTlsServerSocket(tls) + tls + } + serverSocket = boundSocket + running = true + Logger.i { "TAK Server listening on 127.0.0.1:$port (TLS, mTLS enforced)" } + + acceptJob = scope.launch(dispatchers.io) { acceptLoop() } + Result.success(Unit) + } catch (e: Exception) { + Logger.e(e) { "Failed to bind TAK Server to 127.0.0.1:$port" } + running = false + try { + serverSocket?.close() + } catch (_: Exception) {} + serverSocket = null + Result.failure(e) + } + } + + private fun configureTlsServerSocket(tls: SSLServerSocket) { + // Minimum TLS 1.2 — matches iOS. + val protocols = tls.supportedProtocols.filter { it == "TLSv1.2" || it == "TLSv1.3" } + if (protocols.isNotEmpty()) { + tls.enabledProtocols = protocols.toTypedArray() + } + // Require client certificate (mTLS) — matches + // `sec_protocol_options_set_peer_authentication_required` on iOS. + tls.needClientAuth = true + // Enable address reuse so restart doesn't hit TIME_WAIT on the port. + tls.reuseAddress = true + } + + private suspend fun acceptLoop() { + val scope = serverScope ?: return + while (running && scope.coroutineIsActive) { + try { + val clientSocket = withContext(dispatchers.io) { serverSocket?.accept() } + if (clientSocket != null) { + handleConnection(clientSocket) + } + } catch (e: CancellationException) { + throw e + } catch (e: Exception) { + // Bind was lost or the socket was closed under us — back off, then retry. + if (running) { + Logger.w(e) { "TAK server accept loop iteration failed: ${e.message}" } + } + delay(TAK_ACCEPT_LOOP_DELAY_MS) + } + } + } + + private fun handleConnection(clientSocket: Socket) { + val scope = serverScope ?: return + val endpoint = clientSocket.remoteSocketAddress?.toString() ?: "unknown" + + if (clientSocket.inetAddress?.isLoopbackAddress != true) { + Logger.w { "TAK server rejected non-loopback connection from $endpoint" } + try { + clientSocket.close() + } catch (_: Exception) {} + return + } + + val connectionId = Random.nextInt().toString(TAK_HEX_RADIX) + val clientInfo = TAKClientInfo(id = connectionId, endpoint = endpoint) + Logger.i { "TAK client connected: id=$connectionId endpoint=$endpoint" } + + val connection = + TAKClientConnection( + socket = clientSocket, + clientInfo = clientInfo, + onEvent = { event -> handleConnectionEvent(connectionId, event) }, + scope = scope, + ioDispatcher = dispatchers.io, + ) + + // Launch on IO so socket reads/writes don't queue behind CPU work on Default + scope.launch(dispatchers.io) { + connectionsLock.withLock { + connections[connectionId] = connection + _connectionCount.value = connections.size + Logger.i { "TAK connection count now ${connections.size}" } + } + connection.start() + } + } + + private fun handleConnectionEvent(connectionId: String, event: TAKConnectionEvent) { + when (event) { + is TAKConnectionEvent.Message -> { + onMessage?.invoke(event.cotMessage, event.clientInfo) + } + + is TAKConnectionEvent.Disconnected -> { + Logger.i { "TAK client disconnected: id=$connectionId" } + serverScope?.launch(dispatchers.io) { + connectionsLock.withLock { + connections.remove(connectionId) + _connectionCount.value = connections.size + Logger.i { "TAK connection count now ${connections.size}" } + } + } + } + + is TAKConnectionEvent.Error -> { + Logger.w(event.error) { "TAK client connection error: $connectionId" } + serverScope?.launch(dispatchers.io) { + connectionsLock.withLock { + connections.remove(connectionId) + _connectionCount.value = connections.size + Logger.i { "TAK connection count now ${connections.size}" } + } + } + } + + is TAKConnectionEvent.Connected -> { + onClientConnected?.invoke() + } + + is TAKConnectionEvent.ClientInfoUpdated -> { + /* no-op: TAKClientConnection tracks updated info locally */ + } + } + } + + override fun stop() { + running = false + acceptJob?.cancel() + acceptJob = null + + // Guard the snapshot+clear with the same lock used by the coroutine accept/disconnect + // paths to avoid concurrent modification or a stale connectionCount during shutdown. + val toClose = + connectionsLock.withLock { + val snapshot = connections.values.toList() + connections.clear() + _connectionCount.value = 0 + snapshot + } + toClose.forEach { it.close() } + + try { + serverSocket?.close() + } catch (_: Exception) {} + serverSocket = null + serverScope = null + Logger.i { "TAK Server stopped" } + } + + override suspend fun broadcast(cotMessage: CoTMessage) { + val currentConnections = connectionsLock.withLock { connections.values.toList() } + if (currentConnections.isEmpty()) { + Logger.d { "broadcast ${cotMessage.type}: no TAK clients connected, dropping" } + return + } + Logger.d { "broadcast ${cotMessage.type} to ${currentConnections.size} TAK client(s)" } + currentConnections.forEach { connection -> + try { + connection.send(cotMessage) + } catch (e: Exception) { + Logger.w(e) { "Failed to broadcast CoT to TAK client ${connection.clientInfo.id}" } + connection.close() + } + } + } + + override suspend fun broadcastRawXml(xml: String) { + val currentConnections = connectionsLock.withLock { connections.values.toList() } + if (currentConnections.isEmpty()) return + Logger.d { "broadcastRawXml to ${currentConnections.size} TAK client(s)" } + currentConnections.forEach { connection -> + try { + connection.sendRawXml(xml) + } catch (e: Exception) { + Logger.w(e) { "Failed to broadcast raw XML to TAK client ${connection.clientInfo.id}" } + connection.close() + } + } + } + + override suspend fun hasConnections(): Boolean = connectionsLock.withLock { connections.isNotEmpty() } +} + +/** + * `actual` factory for the KMP `expect fun createTAKServer` declared in `commonMain`. Both the Desktop JVM target and + * the Android target share this source set, so both run the same JSSE-based TLS listener. + * + * Also wires [TAKDataPackageGenerator]'s bundled-cert provider so that the exported `.zip` data package contains the + * real `server.p12` / `client.p12` bytes from the classpath rather than an empty fallback. + */ +actual fun createTAKServer(dispatchers: CoroutineDispatchers, port: Int): TAKServer { + TAKDataPackageGenerator.bundledCertBytesProvider = TakCertBundledBytesProvider + return TAKServerJvm(dispatchers = dispatchers, port = port) +} + +/** Bridges [TakCertLoader] bytes into [TAKDataPackageGenerator] via the commonMain interface. */ +private object TakCertBundledBytesProvider : BundledCertBytesProvider { + override fun serverP12Bytes(): ByteArray? = TakCertLoader.getServerP12Bytes() + + override fun clientP12Bytes(): ByteArray? = TakCertLoader.getClientP12Bytes() +} diff --git a/core/takserver/src/jvmAndroidMain/kotlin/org/meshtastic/core/takserver/TakCertLoader.kt b/core/takserver/src/jvmAndroidMain/kotlin/org/meshtastic/core/takserver/TakCertLoader.kt new file mode 100644 index 000000000..7da10ab69 --- /dev/null +++ b/core/takserver/src/jvmAndroidMain/kotlin/org/meshtastic/core/takserver/TakCertLoader.kt @@ -0,0 +1,160 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +@file:Suppress("TooGenericExceptionCaught") + +package org.meshtastic.core.takserver + +import co.touchlab.kermit.Logger +import java.io.ByteArrayInputStream +import java.security.KeyStore +import java.security.cert.CertificateFactory +import java.security.cert.X509Certificate +import javax.net.ssl.KeyManagerFactory +import javax.net.ssl.SSLContext +import javax.net.ssl.TrustManagerFactory + +/** + * Loads the bundled TAK server certificates from the classpath and builds an [SSLContext] suitable for running a TLS + * TAK server with mutual TLS (mTLS). + * + * Bundled resources (under `tak_certs/` on the module classpath): + * - `server.p12` — PKCS#12 containing the server's identity (cert + private key). Used as the server's identity during + * the TLS handshake. + * - `client.p12` — PKCS#12 containing an example client identity, included in the exported data package so ATAK / iTAK + * have a certificate it can present. + * - `ca.pem` — PEM-encoded CA certificate used to validate the presented client certificate during mTLS. Only clients + * whose certificate chains back to this CA are accepted. + * + * All files are the same bytes as the iOS Meshtastic-Apple bundle, so the same exported data package works for both + * platforms with no re-import. + */ +internal object TakCertLoader { + + private const val RESOURCE_SERVER_P12 = "tak_certs/server.p12" + private const val RESOURCE_CLIENT_P12 = "tak_certs/client.p12" + private const val RESOURCE_CA_PEM = "tak_certs/ca.pem" + + @Volatile private var cachedSslContext: SSLContext? = null + + @Volatile private var cachedServerP12: ByteArray? = null + + @Volatile private var cachedClientP12: ByteArray? = null + + @Volatile private var cachedCaPem: ByteArray? = null + + /** + * Build (and cache) an [SSLContext] for the TAK server. + * + * The context uses the bundled `server.p12` for its identity and the bundled `ca.pem` to validate client + * certificates during mTLS. If anything fails to load (missing resources, bad password, corrupt keystore) this + * returns `null` and callers should fall back to a non-TLS listener or refuse to start. + */ + @Synchronized + fun getServerSslContext(): SSLContext? { + cachedSslContext?.let { + return it + } + return try { + val serverP12 = + loadResourceBytes(RESOURCE_SERVER_P12) ?: error("Bundled $RESOURCE_SERVER_P12 not found on classpath") + val caPem = loadResourceBytes(RESOURCE_CA_PEM) ?: error("Bundled $RESOURCE_CA_PEM not found on classpath") + + // Load the server identity (cert + private key). + val serverKeyStore = + KeyStore.getInstance("PKCS12").apply { + ByteArrayInputStream(serverP12).use { input -> + load(input, TAK_BUNDLED_CERT_PASSWORD.toCharArray()) + } + } + val kmf = + KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()).apply { + init(serverKeyStore, TAK_BUNDLED_CERT_PASSWORD.toCharArray()) + } + + // Load the CA certificate(s) used to verify incoming client certs. + val caCerts = parsePemCertificates(caPem) + if (caCerts.isEmpty()) error("No certificates found inside $RESOURCE_CA_PEM") + val trustKeyStore = + KeyStore.getInstance(KeyStore.getDefaultType()).apply { + load(null, null) + caCerts.forEachIndexed { index, cert -> setCertificateEntry("tak-client-ca-$index", cert) } + } + val tmf = + TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()).apply { init(trustKeyStore) } + + val sslContext = SSLContext.getInstance("TLSv1.2").apply { init(kmf.keyManagers, tmf.trustManagers, null) } + + Logger.i { "TAK: loaded bundled TLS server identity and ${caCerts.size} CA certificate(s)" } + cachedSslContext = sslContext + sslContext + } catch (e: Throwable) { + Logger.e(e) { "TAK: failed to build SSLContext from bundled certificates: ${e.message}" } + null + } + } + + /** Returns the raw bytes of the bundled `server.p12`. Used by the data package generator. */ + @Synchronized + fun getServerP12Bytes(): ByteArray? { + cachedServerP12?.let { + return it + } + val bytes = loadResourceBytes(RESOURCE_SERVER_P12) + cachedServerP12 = bytes + return bytes + } + + /** Returns the raw bytes of the bundled `client.p12`. Used by the data package generator. */ + @Synchronized + fun getClientP12Bytes(): ByteArray? { + cachedClientP12?.let { + return it + } + val bytes = loadResourceBytes(RESOURCE_CLIENT_P12) + cachedClientP12 = bytes + return bytes + } + + /** Returns the raw bytes of the bundled `ca.pem`. */ + @Synchronized + fun getCaPemBytes(): ByteArray? { + cachedCaPem?.let { + return it + } + val bytes = loadResourceBytes(RESOURCE_CA_PEM) + cachedCaPem = bytes + return bytes + } + + private fun loadResourceBytes(name: String): ByteArray? { + val stream = TakCertLoader::class.java.classLoader?.getResourceAsStream(name) ?: return null + return stream.use { it.readBytes() } + } + + /** + * Parse every `-----BEGIN CERTIFICATE----- ... -----END CERTIFICATE-----` block in the given PEM bytes into + * [X509Certificate]s. Tolerates multiple certs in one file. + */ + private fun parsePemCertificates(pem: ByteArray): List { + val factory = CertificateFactory.getInstance("X.509") + // CertificateFactory.generateCertificates handles PEM bundles directly on all + // standard Java providers, so we don't need to split ourselves. + return ByteArrayInputStream(pem).use { input -> + factory.generateCertificates(input).filterIsInstance() + } + } +} diff --git a/core/takserver/src/jvmAndroidMain/kotlin/org/meshtastic/core/takserver/TakFixtureLoader.kt b/core/takserver/src/jvmAndroidMain/kotlin/org/meshtastic/core/takserver/TakFixtureLoader.kt new file mode 100644 index 000000000..0822feff8 --- /dev/null +++ b/core/takserver/src/jvmAndroidMain/kotlin/org/meshtastic/core/takserver/TakFixtureLoader.kt @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.meshtastic.core.takserver + +/** JVM/Android: load fixture XML from bundled test resources via the classloader. */ +internal actual fun loadTakFixtureXml(name: String): String { + val stream = + object {}::class.java.classLoader?.getResourceAsStream("tak_test_fixtures/$name") + ?: throw IllegalStateException("Fixture not found: tak_test_fixtures/$name") + return stream.bufferedReader().readText() +} diff --git a/core/takserver/src/jvmAndroidMain/kotlin/org/meshtastic/core/takserver/TakSdkCompressor.kt b/core/takserver/src/jvmAndroidMain/kotlin/org/meshtastic/core/takserver/TakSdkCompressor.kt new file mode 100644 index 000000000..e000ac8f7 --- /dev/null +++ b/core/takserver/src/jvmAndroidMain/kotlin/org/meshtastic/core/takserver/TakSdkCompressor.kt @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.meshtastic.core.takserver + +import org.meshtastic.tak.CotXmlParser +import org.meshtastic.tak.TakCompressor + +internal actual object TakSdkCompressor { + + actual fun compressCoT(xml: String, maxBytes: Int): ByteArray? { + val sdkParser = CotXmlParser() + val sdkData = sdkParser.parse(xml) + val compressor = TakCompressor() + return compressor.compressWithRemarksFallback(sdkData, maxBytes) + } +} diff --git a/core/takserver/src/jvmAndroidMain/kotlin/org/meshtastic/core/takserver/TakV2Compressor.kt b/core/takserver/src/jvmAndroidMain/kotlin/org/meshtastic/core/takserver/TakV2Compressor.kt new file mode 100644 index 000000000..97de4e269 --- /dev/null +++ b/core/takserver/src/jvmAndroidMain/kotlin/org/meshtastic/core/takserver/TakV2Compressor.kt @@ -0,0 +1,481 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.meshtastic.core.takserver + +import okio.ByteString.Companion.toByteString +import org.meshtastic.proto.TAKPacketV2 +import org.meshtastic.tak.TakPacketV2Data +import org.meshtastic.proto.AircraftTrack as WireAircraftTrack +import org.meshtastic.proto.CasevacReport as WireCasevacReport +import org.meshtastic.proto.CotGeoPoint as WireCotGeoPoint +import org.meshtastic.proto.DrawnShape as WireDrawnShape +import org.meshtastic.proto.EmergencyAlert as WireEmergencyAlert +import org.meshtastic.proto.GeoChat as WireGeoChat +import org.meshtastic.proto.Marker as WireMarker +import org.meshtastic.proto.RangeAndBearing as WireRangeAndBearing +import org.meshtastic.proto.Route as WireRoute +import org.meshtastic.proto.TaskRequest as WireTaskRequest +import org.meshtastic.proto.Team as WireTeam +import org.meshtastic.tak.TakCompressor as SdkCompressor + +/** + * JVM/Android implementation of TakV2Compressor. Delegates to TAKPacket-SDK's TakCompressor for zstd dictionary + * compression. + * + * The SDK compressor is constructed lazily and its result is cached in a nullable field so that a native-library + * failure (e.g. missing Android .so) does NOT poison this object. Without lazy/try-catch, a failure inside a top-level + * `val` initializer runs at class `` time, marks the class ERRONEOUS, and turns every subsequent reference into + * `NoClassDefFoundError`. + */ +internal actual object TakV2Compressor { + + actual val MAX_DECOMPRESSED_SIZE: Int = 4096 + actual val DICT_ID_NON_AIRCRAFT: Int = 0 + actual val DICT_ID_AIRCRAFT: Int = 1 + actual val DICT_ID_UNCOMPRESSED: Int = 0xFF + + @Volatile private var sdkCompressorOrNull: SdkCompressor? = null + + @Volatile private var sdkCompressorInitFailure: Throwable? = null + + @Synchronized + private fun getSdkCompressor(): SdkCompressor { + sdkCompressorOrNull?.let { + return it + } + sdkCompressorInitFailure?.let { cached -> + throw IllegalStateException("zstd-jni unavailable on this platform", cached) + } + return try { + SdkCompressor().also { sdkCompressorOrNull = it } + } catch (e: Throwable) { + sdkCompressorInitFailure = e + throw IllegalStateException("zstd-jni unavailable on this platform", e) + } + } + + actual fun compress(packet: TAKPacketV2): ByteArray { + val data = wireToSdkData(packet) + return getSdkCompressor().compress(data) + } + + actual fun decompress(wirePayload: ByteArray): TAKPacketV2 { + val data = getSdkCompressor().decompress(wirePayload) + return sdkDataToWire(data) + } + + /** + * Decompress a V2 wire payload and reconstruct CoT XML via the SDK's CotXmlBuilder. This handles ALL payload types + * (DrawnShape, Marker, Route, etc.) without going through the Wire proto intermediate, avoiding the gap where + * `toCoTMessage()` only handles PLI/GeoChat. + */ + actual fun decompressToXml(wirePayload: ByteArray): String { + val data = getSdkCompressor().decompress(wirePayload) + return org.meshtastic.tak.CotXmlBuilder().build(data) + } + + /** Convert Wire-generated TAKPacketV2 → SDK's TakPacketV2Data. */ + private fun wireToSdkData(packet: TAKPacketV2): TakPacketV2Data { + val cotTypeId = packet.cot_type_id.value + val cotTypeStr = if (cotTypeId == 0 && packet.cot_type_str.isNotEmpty()) packet.cot_type_str else null + + val payload = + when { + packet.pli != null -> TakPacketV2Data.Payload.Pli(true) + + packet.chat != null -> + TakPacketV2Data.Payload.Chat( + message = packet.chat!!.message, + to = packet.chat!!.to, + toCallsign = packet.chat!!.to_callsign, + receiptForUid = packet.chat!!.receipt_for_uid, + receiptType = packet.chat!!.receipt_type.value, + ) + + packet.aircraft != null -> + TakPacketV2Data.Payload.Aircraft( + icao = packet.aircraft!!.icao, + registration = packet.aircraft!!.registration, + flight = packet.aircraft!!.flight, + aircraftType = packet.aircraft!!.aircraft_type, + squawk = packet.aircraft!!.squawk, + category = packet.aircraft!!.category, + rssiX10 = packet.aircraft!!.rssi_x10, + gps = packet.aircraft!!.gps, + cotHostId = packet.aircraft!!.cot_host_id, + ) + + // Typed geometry variants added by takv2_geometry (tags 34-37). + // All GeoPoint fields on the wire are delta-encoded from the + // event anchor; the SDK data class stores absolute lat/lon, so + // we add packet.latitude_i / longitude_i here. + packet.shape != null -> { + val s = packet.shape!! + TakPacketV2Data.Payload.DrawnShape( + kind = s.kind.value, + style = s.style.value, + majorCm = s.major_cm, + minorCm = s.minor_cm, + angleDeg = s.angle_deg, + strokeColor = s.stroke_color.value, + strokeArgb = s.stroke_argb, + strokeWeightX10 = s.stroke_weight_x10, + fillColor = s.fill_color.value, + fillArgb = s.fill_argb, + labelsOn = s.labels_on, + vertices = + s.vertices.map { v -> + TakPacketV2Data.Payload.Vertex( + latI = packet.latitude_i + v.lat_delta_i, + lonI = packet.longitude_i + v.lon_delta_i, + ) + }, + truncated = s.truncated, + bullseyeDistanceDm = s.bullseye_distance_dm, + bullseyeBearingRef = s.bullseye_bearing_ref, + bullseyeFlags = s.bullseye_flags, + bullseyeUidRef = s.bullseye_uid_ref, + ) + } + + packet.marker != null -> { + val m = packet.marker!! + TakPacketV2Data.Payload.Marker( + kind = m.kind.value, + color = m.color.value, + colorArgb = m.color_argb, + readiness = m.readiness, + parentUid = m.parent_uid, + parentType = m.parent_type, + parentCallsign = m.parent_callsign, + iconset = m.iconset, + ) + } + + packet.rab != null -> { + val r = packet.rab!! + val anchor = r.anchor + TakPacketV2Data.Payload.RangeAndBearing( + anchorLatI = packet.latitude_i + (anchor?.lat_delta_i ?: 0), + anchorLonI = packet.longitude_i + (anchor?.lon_delta_i ?: 0), + anchorUid = r.anchor_uid, + rangeCm = r.range_cm, + bearingCdeg = r.bearing_cdeg, + strokeColor = r.stroke_color.value, + strokeArgb = r.stroke_argb, + strokeWeightX10 = r.stroke_weight_x10, + ) + } + + packet.route != null -> { + val rt = packet.route!! + TakPacketV2Data.Payload.Route( + method = rt.method.value, + direction = rt.direction.value, + prefix = rt.prefix, + strokeWeightX10 = rt.stroke_weight_x10, + links = + rt.links.map { link -> + val pt = link.point + TakPacketV2Data.Payload.Route.Link( + latI = packet.latitude_i + (pt?.lat_delta_i ?: 0), + lonI = packet.longitude_i + (pt?.lon_delta_i ?: 0), + uid = link.uid, + callsign = link.callsign, + linkType = link.link_type, + ) + }, + truncated = rt.truncated, + ) + } + + packet.casevac != null -> { + val c = packet.casevac!! + TakPacketV2Data.Payload.CasevacReport( + precedence = c.precedence.value, + equipmentFlags = c.equipment_flags, + litterPatients = c.litter_patients, + ambulatoryPatients = c.ambulatory_patients, + security = c.security.value, + hlzMarking = c.hlz_marking.value, + zoneMarker = c.zone_marker, + usMilitary = c.us_military, + usCivilian = c.us_civilian, + nonUsMilitary = c.non_us_military, + nonUsCivilian = c.non_us_civilian, + epw = c.epw, + child = c.child, + terrainFlags = c.terrain_flags, + frequency = c.frequency, + ) + } + + packet.emergency != null -> { + val e = packet.emergency!! + TakPacketV2Data.Payload.EmergencyAlert( + type = e.type.value, + authoringUid = e.authoring_uid, + cancelReferenceUid = e.cancel_reference_uid, + ) + } + + packet.task != null -> { + val t = packet.task!! + TakPacketV2Data.Payload.TaskRequest( + taskType = t.task_type, + targetUid = t.target_uid, + assigneeUid = t.assignee_uid, + priority = t.priority.value, + status = t.status.value, + note = t.note, + ) + } + + packet.raw_detail != null -> TakPacketV2Data.Payload.RawDetail(packet.raw_detail!!.toByteArray()) + + else -> TakPacketV2Data.Payload.None + } + + return TakPacketV2Data( + cotTypeId = cotTypeId, + cotTypeStr = cotTypeStr, + how = packet.how.value, + callsign = packet.callsign, + team = packet.team.value, + role = packet.role.value, + latitudeI = packet.latitude_i, + longitudeI = packet.longitude_i, + altitude = packet.altitude, + speed = packet.speed, + course = packet.course, + battery = packet.battery, + geoSrc = packet.geo_src.value, + altSrc = packet.alt_src.value, + uid = packet.uid, + deviceCallsign = packet.device_callsign, + staleSeconds = packet.stale_seconds, + takVersion = packet.tak_version, + takDevice = packet.tak_device, + takPlatform = packet.tak_platform, + takOs = packet.tak_os, + endpoint = packet.endpoint, + phone = packet.phone, + payload = payload, + ) + } + + /** Convert SDK's TakPacketV2Data → Wire-generated TAKPacketV2. */ + private fun sdkDataToWire(data: TakPacketV2Data): TAKPacketV2 { + val cotType = + org.meshtastic.proto.CotType.fromValue(data.cotTypeId) ?: org.meshtastic.proto.CotType.CotType_Other + val how = org.meshtastic.proto.CotHow.fromValue(data.how) ?: org.meshtastic.proto.CotHow.CotHow_Unspecified + val team = org.meshtastic.proto.Team.fromValue(data.team) ?: org.meshtastic.proto.Team.Unspecifed_Color + val role = org.meshtastic.proto.MemberRole.fromValue(data.role) ?: org.meshtastic.proto.MemberRole.Unspecifed + val geoSrc = + org.meshtastic.proto.GeoPointSource.fromValue(data.geoSrc) + ?: org.meshtastic.proto.GeoPointSource.GeoPointSource_Unspecified + val altSrc = + org.meshtastic.proto.GeoPointSource.fromValue(data.altSrc) + ?: org.meshtastic.proto.GeoPointSource.GeoPointSource_Unspecified + + return TAKPacketV2( + cot_type_id = cotType, + cot_type_str = data.cotTypeStr ?: "", + how = how, + callsign = data.callsign, + team = team, + role = role, + latitude_i = data.latitudeI, + longitude_i = data.longitudeI, + altitude = data.altitude, + speed = data.speed, + course = data.course, + battery = data.battery, + geo_src = geoSrc, + alt_src = altSrc, + uid = data.uid, + device_callsign = data.deviceCallsign, + stale_seconds = data.staleSeconds, + tak_version = data.takVersion, + tak_device = data.takDevice, + tak_platform = data.takPlatform, + tak_os = data.takOs, + endpoint = data.endpoint, + phone = data.phone, + pli = if (data.payload is TakPacketV2Data.Payload.Pli) true else null, + chat = + (data.payload as? TakPacketV2Data.Payload.Chat)?.let { chat -> + WireGeoChat( + message = chat.message, + to = chat.to, + to_callsign = chat.toCallsign, + receipt_for_uid = chat.receiptForUid, + receipt_type = + WireGeoChat.ReceiptType.fromValue(chat.receiptType) + ?: WireGeoChat.ReceiptType.ReceiptType_None, + ) + }, + aircraft = + (data.payload as? TakPacketV2Data.Payload.Aircraft)?.let { ac -> + WireAircraftTrack( + icao = ac.icao, + registration = ac.registration, + flight = ac.flight, + aircraft_type = ac.aircraftType, + squawk = ac.squawk, + category = ac.category, + rssi_x10 = ac.rssiX10, + gps = ac.gps, + cot_host_id = ac.cotHostId, + ) + }, + shape = + (data.payload as? TakPacketV2Data.Payload.DrawnShape)?.let { s -> + WireDrawnShape( + kind = WireDrawnShape.Kind.fromValue(s.kind) ?: WireDrawnShape.Kind.Kind_Unspecified, + style = + WireDrawnShape.StyleMode.fromValue(s.style) + ?: WireDrawnShape.StyleMode.StyleMode_Unspecified, + major_cm = s.majorCm, + minor_cm = s.minorCm, + angle_deg = s.angleDeg, + stroke_color = WireTeam.fromValue(s.strokeColor) ?: WireTeam.Unspecifed_Color, + stroke_argb = s.strokeArgb, + stroke_weight_x10 = s.strokeWeightX10, + fill_color = WireTeam.fromValue(s.fillColor) ?: WireTeam.Unspecifed_Color, + fill_argb = s.fillArgb, + labels_on = s.labelsOn, + // Delta-encode vertices relative to the event anchor. + vertices = + s.vertices.map { v -> + WireCotGeoPoint( + lat_delta_i = v.latI - data.latitudeI, + lon_delta_i = v.lonI - data.longitudeI, + ) + }, + truncated = s.truncated, + bullseye_distance_dm = s.bullseyeDistanceDm, + bullseye_bearing_ref = s.bullseyeBearingRef, + bullseye_flags = s.bullseyeFlags, + bullseye_uid_ref = s.bullseyeUidRef, + ) + }, + marker = + (data.payload as? TakPacketV2Data.Payload.Marker)?.let { m -> + WireMarker( + kind = WireMarker.Kind.fromValue(m.kind) ?: WireMarker.Kind.Kind_Unspecified, + color = WireTeam.fromValue(m.color) ?: WireTeam.Unspecifed_Color, + color_argb = m.colorArgb, + readiness = m.readiness, + parent_uid = m.parentUid, + parent_type = m.parentType, + parent_callsign = m.parentCallsign, + iconset = m.iconset, + ) + }, + rab = + (data.payload as? TakPacketV2Data.Payload.RangeAndBearing)?.let { r -> + WireRangeAndBearing( + anchor = + WireCotGeoPoint( + lat_delta_i = r.anchorLatI - data.latitudeI, + lon_delta_i = r.anchorLonI - data.longitudeI, + ), + anchor_uid = r.anchorUid, + range_cm = r.rangeCm, + bearing_cdeg = r.bearingCdeg, + stroke_color = WireTeam.fromValue(r.strokeColor) ?: WireTeam.Unspecifed_Color, + stroke_argb = r.strokeArgb, + stroke_weight_x10 = r.strokeWeightX10, + ) + }, + route = + (data.payload as? TakPacketV2Data.Payload.Route)?.let { rt -> + WireRoute( + method = WireRoute.Method.fromValue(rt.method) ?: WireRoute.Method.Method_Unspecified, + direction = + WireRoute.Direction.fromValue(rt.direction) ?: WireRoute.Direction.Direction_Unspecified, + prefix = rt.prefix, + stroke_weight_x10 = rt.strokeWeightX10, + links = + rt.links.map { link -> + WireRoute.Link( + point = + WireCotGeoPoint( + lat_delta_i = link.latI - data.latitudeI, + lon_delta_i = link.lonI - data.longitudeI, + ), + uid = link.uid, + callsign = link.callsign, + link_type = link.linkType, + ) + }, + truncated = rt.truncated, + ) + }, + casevac = + (data.payload as? TakPacketV2Data.Payload.CasevacReport)?.let { c -> + WireCasevacReport( + precedence = + WireCasevacReport.Precedence.fromValue(c.precedence) + ?: WireCasevacReport.Precedence.Precedence_Unspecified, + equipment_flags = c.equipmentFlags, + litter_patients = c.litterPatients, + ambulatory_patients = c.ambulatoryPatients, + security = + WireCasevacReport.Security.fromValue(c.security) + ?: WireCasevacReport.Security.Security_Unspecified, + hlz_marking = + WireCasevacReport.HlzMarking.fromValue(c.hlzMarking) + ?: WireCasevacReport.HlzMarking.HlzMarking_Unspecified, + zone_marker = c.zoneMarker, + us_military = c.usMilitary, + us_civilian = c.usCivilian, + non_us_military = c.nonUsMilitary, + non_us_civilian = c.nonUsCivilian, + epw = c.epw, + child = c.child, + terrain_flags = c.terrainFlags, + frequency = c.frequency, + ) + }, + emergency = + (data.payload as? TakPacketV2Data.Payload.EmergencyAlert)?.let { e -> + WireEmergencyAlert( + type = WireEmergencyAlert.Type.fromValue(e.type) ?: WireEmergencyAlert.Type.Type_Unspecified, + authoring_uid = e.authoringUid, + cancel_reference_uid = e.cancelReferenceUid, + ) + }, + task = + (data.payload as? TakPacketV2Data.Payload.TaskRequest)?.let { t -> + WireTaskRequest( + task_type = t.taskType, + target_uid = t.targetUid, + assignee_uid = t.assigneeUid, + priority = + WireTaskRequest.Priority.fromValue(t.priority) + ?: WireTaskRequest.Priority.Priority_Unspecified, + status = + WireTaskRequest.Status.fromValue(t.status) ?: WireTaskRequest.Status.Status_Unspecified, + note = t.note, + ) + }, + raw_detail = (data.payload as? TakPacketV2Data.Payload.RawDetail)?.bytes?.toByteString(), + ) + } +} diff --git a/core/takserver/src/jvmAndroidMain/kotlin/org/meshtastic/core/takserver/fountain/ZlibCodec.kt b/core/takserver/src/jvmAndroidMain/kotlin/org/meshtastic/core/takserver/fountain/ZlibCodec.kt deleted file mode 100644 index fca9f0f52..000000000 --- a/core/takserver/src/jvmAndroidMain/kotlin/org/meshtastic/core/takserver/fountain/ZlibCodec.kt +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (c) 2026 Meshtastic LLC - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package org.meshtastic.core.takserver.fountain - -import java.io.ByteArrayOutputStream -import java.util.zip.Deflater -import java.util.zip.Inflater - -internal actual object ZlibCodec { - actual fun compress(data: ByteArray): ByteArray? { - val deflater = Deflater(Deflater.DEFAULT_COMPRESSION, false) - return try { - deflater.setInput(data) - deflater.finish() - - val outputStream = ByteArrayOutputStream(data.size) - val buffer = ByteArray(1024) - while (!deflater.finished()) { - val count = deflater.deflate(buffer) - outputStream.write(buffer, 0, count) - } - outputStream.close() - outputStream.toByteArray() - } catch (e: Exception) { - null - } finally { - deflater.end() - } - } - - actual fun decompress(data: ByteArray): ByteArray? { - val inflater = Inflater(false) - return try { - inflater.setInput(data) - - val outputStream = ByteArrayOutputStream(data.size * 2) - val buffer = ByteArray(1024) - while (!inflater.finished()) { - val count = inflater.inflate(buffer) - if (count == 0 && inflater.needsInput()) { - break - } - outputStream.write(buffer, 0, count) - } - outputStream.close() - outputStream.toByteArray() - } catch (e: Exception) { - null - } finally { - inflater.end() - } - } -} diff --git a/core/takserver/src/jvmAndroidMain/resources/tak_certs/ca.pem b/core/takserver/src/jvmAndroidMain/resources/tak_certs/ca.pem new file mode 100644 index 000000000..1dc6e36f6 --- /dev/null +++ b/core/takserver/src/jvmAndroidMain/resources/tak_certs/ca.pem @@ -0,0 +1,23 @@ +-----BEGIN CERTIFICATE----- +MIID4zCCAsugAwIBAgIUeM9XhqZCtta+QorYNjZSdAk3gkMwDQYJKoZIhvcNAQEL +BQAwgYAxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRYwFAYDVQQH +DA1TYW4gRnJhbmNpc2NvMRMwEQYDVQQKDApNZXNodGFzdGljMRMwEQYDVQQLDApU +QUsgU2VydmVyMRowGAYDVQQDDBFNZXNodGFzdGljIFRBSyBDQTAeFw0yNTEyMzEx +OTQwMDJaFw0yODA0MDQxOTQwMDJaMIGAMQswCQYDVQQGEwJVUzETMBEGA1UECAwK +Q2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzETMBEGA1UECgwKTWVz +aHRhc3RpYzETMBEGA1UECwwKVEFLIFNlcnZlcjEaMBgGA1UEAwwRTWVzaHRhc3Rp +YyBUQUsgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC2F6/n1CI2 +4dGtLt0irkfiU+PRmqkkuE7m49i7/FeH+38SEn9+0B4egW0kYRoRXmYdPzRsVttu +23LZ3RLjwB6fFI3tiA27mxD58AuEMfwVR7J29oHqFwuVhuqDyjkNpUPFUomKwzvK +SPJvoiHGkbQwWTMNP6T06tCg9llSE7SIgJWjzikQ+JsI37SqVGZ8K2evs7LTuyQh +ssJfYVB7aE1kNNyi8YFHLoCWQMB7h8qJ3hRd7QGFG9gfWuNrWtim61iiHgBAPTRw +gMn+YSIZiV9/iOytBKxFppNTxffEowF/iKBvgXwd9KHxYkk1Nvtcz5NJynSL75PT +8B7XiHCGhcgzAgMBAAGjUzBRMB0GA1UdDgQWBBRRe/o9Raj93Fq22ArNSNrpsye3 +AzAfBgNVHSMEGDAWgBRRe/o9Raj93Fq22ArNSNrpsye3AzAPBgNVHRMBAf8EBTAD +AQH/MA0GCSqGSIb3DQEBCwUAA4IBAQAsuSQ+j/1Bm7HbZWzN5qChH554vucWoqI0 +sVRHThvCASC6+wSosWZlx/Ag5KnRmBVsYA6CX5ztoF5keiSRy5G7qyRQVjITOq1o +4XUAHBtGxKdRCEzS84GnsW9qeWX7t/xxf2fFr9gPZ7Z4nuyNg7QyX5FM01BtAlZC +HbBhXvJyHRqJkMe7keYU7GmiAs1RZa+7593uEQ8DQ/kRvCzU0XswFSguJrd4Fnpi +PGesGOk0NHFQY9pIu9oshgPgMA9dEWnhhvAF3PZ3sLRn9sSuslj5oumFsTYboByE +aOKQshFe5xEX/4O7DI+wsD1Pt5gdT75nAuG7GEAIFKKGjQtUUYfH +-----END CERTIFICATE----- diff --git a/core/takserver/src/jvmAndroidMain/resources/tak_certs/client.p12 b/core/takserver/src/jvmAndroidMain/resources/tak_certs/client.p12 new file mode 100644 index 0000000000000000000000000000000000000000..2f27bff2d6a5e102bb7f6c343c6a1bacd530a01f GIT binary patch literal 3827 zcmai%Ra6uV*M(siy1OKXZf59~lvYv(kZ$RghCv!6hejG1X(T13q)S2=QV9`|9vVKs z_5bUAFTabk&f0rloV&fA1BMYD0njnPFrsoST%KsP=u1L$Z1f@+Q6>;Zl=jzt2ZrI? z{2O5v!EpBfTDt&rw7+ZP-vk|O@sGeH1nYqz|4ITd8<6B>YXf4p8|-+3jMm>|GPjeHRQ?95lw%h$R&(@2y#h=y^xPoE3(OBv+Y2 zD0|sQwbe&|WtF?V*63pki3&NW6zs6_NyalKY_BSDTLK}&&Cd=uJ?qJED9On0zr-;Z zSL=#op>@>1l3EJ&)F{HD%Lv>0Gr7#R{ARcX^dt3xmh%{^xOdXJ03p#)ik;&mbmM0w zw_RX=O@dRWT_w)X6vyUColxL6;`puz)f_Q5QB?yUj2+a>Rmt?QPZ@ll-%zgpv-J?o z0sE<=u|O*p(6Z@$&)ze1xrdATQ^SLlvoi_G=Gu&}_V=GDPbIMjys!Ij{Do z(@yPqYxj7N^m7+@@*g#|O;YA{L|kEyUWGvcMp5foof+3`O^U8iDF4CBI#9*FjSpTK z(kV;RlA;rXRbWFF7|Eljyx(zSoj7{sAI7MnGDMujI9(0p>zjZxu>EdPcO}n?VaC5x z-9iNPB9BygVFRC;Zjs!L5KsBSmCbd>v=)U4nR%Sa$sIb)qS{R4Hz=zOYolC}#)wij zd;{U&2&sXWs_pL5V~EOH|9Yl5takQmjiqebepv;l__d^Hq9y%h)=mOV zzm$_k9ZSD#Lh^N$AVxV(IsiH*sTaNXkE7X+-~krY8iq52t{_#I`JS3fYi∈>}Zi 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 z + + + <_radio rssi="-19.4" gps="true"/>000001 ICAO: 000001 REG: NTEST1 Flight: TST100 Type: A321 Squawk: 3456 DO-260B Category: A3 #adsbreceiver<_flow-tags_ TAK-Server-00000000000000000000000000000001="2026-03-15T17:45:00Z"/> + diff --git a/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/aircraft_hostile.xml b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/aircraft_hostile.xml new file mode 100644 index 000000000..226586fcb --- /dev/null +++ b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/aircraft_hostile.xml @@ -0,0 +1,5 @@ + + + + TST200 NTEST2 000002 Cat:A6 Type:HAWK sim-host@example.test<_aircot_ flight="TST200" reg="NTEST2" cat="A6" icao="000002" cot_host_id="sim-host@example.test" type="HAWK"/><_flow-tags_ TAK-Server-00000000000000000000000000000001="2026-03-15T18:20:00Z"/> + diff --git a/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/alert_tic.xml b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/alert_tic.xml new file mode 100644 index 000000000..00fc76f12 --- /dev/null +++ b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/alert_tic.xml @@ -0,0 +1,8 @@ + + + + + + Troops in contact, requesting support at grid reference + + diff --git a/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/casevac.xml b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/casevac.xml new file mode 100644 index 000000000..9bcbae011 --- /dev/null +++ b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/casevac.xml @@ -0,0 +1,10 @@ + + + + + + + 2 urgent surgical, 1 priority. LZ marked with green smoke. No enemy activity. + <_flow-tags_ TAK-Server-00000000000000000000000000000001="2026-03-15T20:00:00Z"/> + + diff --git a/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/casevac_medline.xml b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/casevac_medline.xml new file mode 100644 index 000000000..0c169f2b7 --- /dev/null +++ b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/casevac_medline.xml @@ -0,0 +1,10 @@ + + + + + + <_medevac_ precedence="Urgent" hoist="true" extraction_equipment="true" ventilator="false" blood="false" litter="2" ambulatory="1" security="N" hlz_marking="Smoke" zone_prot_marker="Green smoke" us_military="2" us_civilian="0" non_us_military="1" non_us_civilian="0" epw="0" child="0" terrain_slope="true" terrain_rough="false" terrain_loose="true" terrain_trees="false" terrain_wires="false" terrain_other="false" freq="38.90"/> + + + + diff --git a/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/chat_receipt_delivered.xml b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/chat_receipt_delivered.xml new file mode 100644 index 000000000..d66d9c3cd --- /dev/null +++ b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/chat_receipt_delivered.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/chat_receipt_read.xml b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/chat_receipt_read.xml new file mode 100644 index 000000000..86d8bfb90 --- /dev/null +++ b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/chat_receipt_read.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/delete_event.xml b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/delete_event.xml new file mode 100644 index 000000000..4c43a27ea --- /dev/null +++ b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/delete_event.xml @@ -0,0 +1,5 @@ + + + + <_flow-tags_ TAK-Server-00000000000000000000000000000001="2026-03-15T19:30:00Z"/> + diff --git a/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/drawing_circle.xml b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/drawing_circle.xml new file mode 100644 index 000000000..a94353b0f --- /dev/null +++ b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/drawing_circle.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/drawing_circle_large.xml b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/drawing_circle_large.xml new file mode 100644 index 000000000..d155be57d --- /dev/null +++ b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/drawing_circle_large.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/drawing_ellipse.xml b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/drawing_ellipse.xml new file mode 100644 index 000000000..232877e83 --- /dev/null +++ b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/drawing_ellipse.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/drawing_freeform.xml b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/drawing_freeform.xml new file mode 100644 index 000000000..9787f0741 --- /dev/null +++ b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/drawing_freeform.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/drawing_polygon.xml b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/drawing_polygon.xml new file mode 100644 index 000000000..6efcd9ee0 --- /dev/null +++ b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/drawing_polygon.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/drawing_rectangle.xml b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/drawing_rectangle.xml new file mode 100644 index 000000000..cb22fca8d --- /dev/null +++ b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/drawing_rectangle.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/drawing_rectangle_itak.xml b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/drawing_rectangle_itak.xml new file mode 100644 index 000000000..0197969d2 --- /dev/null +++ b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/drawing_rectangle_itak.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/drawing_telestration.xml b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/drawing_telestration.xml new file mode 100644 index 000000000..ca9b1f22b --- /dev/null +++ b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/drawing_telestration.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/emergency_911.xml b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/emergency_911.xml new file mode 100644 index 000000000..88225bc63 --- /dev/null +++ b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/emergency_911.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/emergency_cancel.xml b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/emergency_cancel.xml new file mode 100644 index 000000000..6f4f0257d --- /dev/null +++ b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/emergency_cancel.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/geochat_broadcast.xml b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/geochat_broadcast.xml new file mode 100644 index 000000000..30872f9ff --- /dev/null +++ b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/geochat_broadcast.xml @@ -0,0 +1,12 @@ + + + + + <__chat parent="RootContactGroup" groupOwner="false" messageId="a1b2c3d4" chatroom="All Chat Rooms" id="All Chat Rooms" senderCallsign="ETHEL"> + + + + <__serverdestination destinations="0.0.0.0:4242:tcp:ANDROID-0000000000000003"/> + at breach + + diff --git a/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/geochat_dm.xml b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/geochat_dm.xml new file mode 100644 index 000000000..f3fcd1828 --- /dev/null +++ b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/geochat_dm.xml @@ -0,0 +1,12 @@ + + + + + <__chat parent="RootContactGroup" groupOwner="false" messageId="e5f6a7b8" chatroom="ANDROID-0000000000000004" id="ANDROID-0000000000000004" senderCallsign="ETHEL"> + + + + <__serverdestination destinations="0.0.0.0:4242:tcp:ANDROID-0000000000000003"/> + cover by fire + + diff --git a/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/geochat_simple.xml b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/geochat_simple.xml new file mode 100644 index 000000000..6fdbf123e --- /dev/null +++ b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/geochat_simple.xml @@ -0,0 +1,12 @@ + + + + + <__chat senderCallsign="TESTNODE-01" chatRoom="All Chat Rooms" id="All Chat Rooms" parent="RootContactGroup"> + + + + Roger that, moving to rally point + <__serverdestination destinations="0.0.0.0:4242:tcp:ANDROID-0000000000000002"/> + + diff --git a/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/marker_2525.xml b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/marker_2525.xml new file mode 100644 index 000000000..da28fee7e --- /dev/null +++ b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/marker_2525.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/marker_goto.xml b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/marker_goto.xml new file mode 100644 index 000000000..7cc637331 --- /dev/null +++ b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/marker_goto.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/marker_goto_itak.xml b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/marker_goto_itak.xml new file mode 100644 index 000000000..e1d4548c3 --- /dev/null +++ b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/marker_goto_itak.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/marker_icon_set.xml b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/marker_icon_set.xml new file mode 100644 index 000000000..76739bd71 --- /dev/null +++ b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/marker_icon_set.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/marker_spot.xml b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/marker_spot.xml new file mode 100644 index 000000000..2f3499c4b --- /dev/null +++ b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/marker_spot.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/marker_tank.xml b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/marker_tank.xml new file mode 100644 index 000000000..530ef51f6 --- /dev/null +++ b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/marker_tank.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/pli_basic.xml b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/pli_basic.xml new file mode 100644 index 000000000..51435cf5a --- /dev/null +++ b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/pli_basic.xml @@ -0,0 +1,5 @@ + + + + <_flow-tags_ TAK-Server-00000000000000000000000000000001="2026-03-15T14:22:10Z"/> + diff --git a/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/pli_full.xml b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/pli_full.xml new file mode 100644 index 000000000..9283cf94b --- /dev/null +++ b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/pli_full.xml @@ -0,0 +1,5 @@ + + + + <__group role="Team Member" name="Cyan"/><_flow-tags_ TAK-Server-00000000000000000000000000000001="2026-03-15T15:30:00Z"/> + diff --git a/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/pli_itak.xml b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/pli_itak.xml new file mode 100644 index 000000000..cf86918d8 --- /dev/null +++ b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/pli_itak.xml @@ -0,0 +1,11 @@ + + + + + + <__group name="Cyan" role="Team Member"/> + + + + + diff --git a/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/pli_stationary.xml b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/pli_stationary.xml new file mode 100644 index 000000000..6b4da149b --- /dev/null +++ b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/pli_stationary.xml @@ -0,0 +1,12 @@ + + + + + + + <__group role="Team Member" name="Cyan"/> + + + + + diff --git a/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/pli_takaware.xml b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/pli_takaware.xml new file mode 100644 index 000000000..14992583a --- /dev/null +++ b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/pli_takaware.xml @@ -0,0 +1,11 @@ + + + + + + <__group role="Team Member" name="Cyan"/> + + + + + diff --git a/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/pli_webtak.xml b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/pli_webtak.xml new file mode 100644 index 000000000..ea13b008b --- /dev/null +++ b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/pli_webtak.xml @@ -0,0 +1,5 @@ + + + + <__group name="Cyan" role="Team Member"/><_flow-tags_ TAK-Server-00000000000000000000000000000001="2026-03-15T16:10:00Z"/> + diff --git a/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/ranging_bullseye.xml b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/ranging_bullseye.xml new file mode 100644 index 000000000..e23bf3fb6 --- /dev/null +++ b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/ranging_bullseye.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/ranging_circle.xml b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/ranging_circle.xml new file mode 100644 index 000000000..544b33a7b --- /dev/null +++ b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/ranging_circle.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/ranging_line.xml b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/ranging_line.xml new file mode 100644 index 000000000..93d170565 --- /dev/null +++ b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/ranging_line.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/route_3wp.xml b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/route_3wp.xml new file mode 100644 index 000000000..ede8bed8c --- /dev/null +++ b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/route_3wp.xml @@ -0,0 +1,16 @@ + + + + + <__routeinfo/> + + + + + + + + + + + diff --git a/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/route_itak_3wp.xml b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/route_itak_3wp.xml new file mode 100644 index 000000000..9be1f6169 --- /dev/null +++ b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/route_itak_3wp.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/task_engage.xml b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/task_engage.xml new file mode 100644 index 000000000..602ae5cbf --- /dev/null +++ b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/task_engage.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/waypoint.xml b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/waypoint.xml new file mode 100644 index 000000000..3f41333cc --- /dev/null +++ b/core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/waypoint.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/core/takserver/src/jvmMain/kotlin/org/meshtastic/core/takserver/AtakFileWriter.kt b/core/takserver/src/jvmMain/kotlin/org/meshtastic/core/takserver/AtakFileWriter.kt new file mode 100644 index 000000000..ec7f7727e --- /dev/null +++ b/core/takserver/src/jvmMain/kotlin/org/meshtastic/core/takserver/AtakFileWriter.kt @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.meshtastic.core.takserver + +/** + * Desktop JVM no-op — writing data packages to ATAK's monitored directory is Android-only behaviour. On desktop, data + * packages are shared via the export launcher (file chooser) instead. + */ +internal actual object AtakFileWriter { + actual fun writeToImportDir(fileName: String, zipBytes: ByteArray): Boolean = false +} diff --git a/core/ui/src/androidMain/kotlin/org/meshtastic/core/ui/util/PlatformUtils.kt b/core/ui/src/androidMain/kotlin/org/meshtastic/core/ui/util/PlatformUtils.kt index e9163df08..a5d55d774 100644 --- a/core/ui/src/androidMain/kotlin/org/meshtastic/core/ui/util/PlatformUtils.kt +++ b/core/ui/src/androidMain/kotlin/org/meshtastic/core/ui/util/PlatformUtils.kt @@ -250,10 +250,18 @@ actual fun rememberRequestNotificationPermission(onGranted: () -> Unit, onDenied return remember(launcher) { { launcher.launch(android.Manifest.permission.POST_NOTIFICATIONS) } } } +// API level at which ACCESS_LOCAL_NETWORK became a real runtime permission (Android 17 / API 37). +// Hardcoded as an integer literal because Build.VERSION_CODES does not yet expose a named constant +// for API 37 in the SDK we compile against (current max named constant is VANILLA_ICE_CREAM / API 35). +// On older API levels the permission string is unknown to the system and requestPermission() returns +// an immediate denial, which would incorrectly disable any caller that disables itself on denial. +private const val LOCAL_NETWORK_PERMISSION_API = 37 + @Composable actual fun rememberRequestLocalNetworkPermission(onGranted: () -> Unit, onDenied: () -> Unit): () -> Unit { - if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.S) { - // Pre-Android 12, no local network permission required + if (android.os.Build.VERSION.SDK_INT < LOCAL_NETWORK_PERMISSION_API) { + // Pre-Android 17, ACCESS_LOCAL_NETWORK is not a runtime permission. Localhost / LAN access + // works implicitly under the INTERNET permission, so report granted without prompting. return remember { { onGranted() } } } val currentOnGranted = rememberUpdatedState(onGranted) @@ -267,8 +275,8 @@ actual fun rememberRequestLocalNetworkPermission(onGranted: () -> Unit, onDenied @Composable actual fun isLocalNetworkPermissionGranted(): Boolean { - if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.S) { - // Pre-Android 12, no runtime local-network permission exists; access is implicit via INTERNET. + if (android.os.Build.VERSION.SDK_INT < LOCAL_NETWORK_PERMISSION_API) { + // Pre-Android 17, no runtime local-network gate; access is implicit via INTERNET. return true } val context = LocalContext.current diff --git a/feature/settings/src/androidMain/kotlin/org/meshtastic/feature/settings/tak/TakPermissionUtil.kt b/feature/settings/src/androidMain/kotlin/org/meshtastic/feature/settings/tak/TakPermissionUtil.kt index b9c118824..8c55e36d6 100644 --- a/feature/settings/src/androidMain/kotlin/org/meshtastic/feature/settings/tak/TakPermissionUtil.kt +++ b/feature/settings/src/androidMain/kotlin/org/meshtastic/feature/settings/tak/TakPermissionUtil.kt @@ -17,6 +17,8 @@ package org.meshtastic.feature.settings.tak import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import org.meshtastic.core.ui.util.isLocalNetworkPermissionGranted import org.meshtastic.core.ui.util.rememberRequestLocalNetworkPermission @Composable @@ -26,13 +28,21 @@ actual fun TakPermissionHandler(isTakServerEnabled: Boolean, onPermissionResult: // when targetSdk >= 37, and is requested up-front from the Connections screen, so it will usually // already be granted by the time the user enables TAK. This composable handles the standalone case // (e.g. user opens TAK settings before ever tapping the network-scan toggle). + val isPermissionGranted = isLocalNetworkPermissionGranted() val requestPermission = rememberRequestLocalNetworkPermission( onGranted = { onPermissionResult(true) }, onDenied = { onPermissionResult(false) }, ) - if (isTakServerEnabled) { - requestPermission() + // The launcher must run as a post-composition side effect — invoking it directly in the composition + // body crashes with "Launcher has not been initialized" because the underlying + // ActivityResultLauncherHolder is not linked to the activity until composition completes. Keying on + // both inputs also guarantees we only re-prompt when state actually transitions, not on every + // recomposition. + LaunchedEffect(isTakServerEnabled, isPermissionGranted) { + if (isTakServerEnabled && !isPermissionGranted) { + requestPermission() + } } } diff --git a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/ModuleConfigurationScreen.kt b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/ModuleConfigurationScreen.kt index a5f4ca650..7701f7192 100644 --- a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/ModuleConfigurationScreen.kt +++ b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/ModuleConfigurationScreen.kt @@ -50,12 +50,13 @@ fun ModuleConfigurationScreen( val state by viewModel.radioConfigState.collectAsStateWithLifecycle() val destNode by viewModel.destNode.collectAsStateWithLifecycle() + val deviceRole = state.radioConfig.device?.role val modules = - remember(state.metadata, excludedModulesUnlocked) { + remember(state.metadata, deviceRole, excludedModulesUnlocked) { if (excludedModulesUnlocked) { ModuleRoute.entries } else { - ModuleRoute.filterExcludedFrom(state.metadata, state.userConfig.role) + ModuleRoute.filterExcludedFrom(state.metadata, deviceRole) } } diff --git a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/navigation/SettingsNavigation.kt b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/navigation/SettingsNavigation.kt index 0183085e1..d0e4f4a00 100644 --- a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/navigation/SettingsNavigation.kt +++ b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/navigation/SettingsNavigation.kt @@ -66,6 +66,7 @@ import org.meshtastic.feature.settings.radio.component.SerialConfigScreen import org.meshtastic.feature.settings.radio.component.StatusMessageConfigScreen import org.meshtastic.feature.settings.radio.component.StoreForwardConfigScreen import org.meshtastic.feature.settings.radio.component.TAKConfigScreen +import org.meshtastic.feature.settings.radio.component.TakServerScreen import org.meshtastic.feature.settings.radio.component.TelemetryConfigScreen import org.meshtastic.feature.settings.radio.component.TrafficManagementConfigScreen import org.meshtastic.feature.settings.radio.component.UserConfigScreen @@ -235,6 +236,8 @@ fun EntryProviderScope.settingsGraph(backStack: NavBackStack) { } } + entry { TakServerScreen(onBack = { backStack.removeLastOrNull() }) } + entry { val viewModel: DebugViewModel = koinViewModel() DebugScreen(viewModel = viewModel, onNavigateUp = dropUnlessResumed { backStack.removeLastOrNull() }) diff --git a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/RadioConfig.kt b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/RadioConfig.kt index 8ffa6125d..868c5ff84 100644 --- a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/RadioConfig.kt +++ b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/RadioConfig.kt @@ -52,6 +52,7 @@ import org.meshtastic.core.resources.nodedb_reset import org.meshtastic.core.resources.radio_configuration import org.meshtastic.core.resources.reboot import org.meshtastic.core.resources.shutdown +import org.meshtastic.core.resources.tak_server import org.meshtastic.core.ui.component.ListItem import org.meshtastic.core.ui.icon.AdminPanelSettings import org.meshtastic.core.ui.icon.AppSettingsAlt @@ -209,6 +210,13 @@ private fun AdvancedSection(isManaged: Boolean, isOtaCapable: Boolean, enabled: onClick = { onNavigate(SettingsRoute.CleanNodeDb) }, ) + ListItem( + text = stringResource(Res.string.tak_server), + leadingIcon = MeshtasticIcons.Settings, + enabled = enabled, + onClick = { onNavigate(SettingsRoute.TakServer) }, + ) + ListItem( text = stringResource(Res.string.debug_panel), leadingIcon = MeshtasticIcons.BugReport, diff --git a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/TAKConfigItemList.kt b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/TAKConfigItemList.kt index 55fdca66c..fda67356a 100644 --- a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/TAKConfigItemList.kt +++ b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/TAKConfigItemList.kt @@ -14,39 +14,83 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ +@file:Suppress("LongMethod", "ModifierMissing", "ParameterNaming") + package org.meshtastic.feature.settings.radio.component +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Button +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBar import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color +import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle +import kotlinx.coroutines.launch import org.jetbrains.compose.resources.stringResource import org.koin.compose.koinInject +import org.meshtastic.core.common.BuildConfigProvider import org.meshtastic.core.model.getColorFrom import org.meshtastic.core.model.getStringResFrom +import org.meshtastic.core.repository.CommandSender import org.meshtastic.core.repository.TakPrefs import org.meshtastic.core.resources.Res +import org.meshtastic.core.resources.back import org.meshtastic.core.resources.export_tak_data_package import org.meshtastic.core.resources.tak import org.meshtastic.core.resources.tak_config import org.meshtastic.core.resources.tak_role +import org.meshtastic.core.resources.tak_server import org.meshtastic.core.resources.tak_server_enabled import org.meshtastic.core.resources.tak_server_enabled_desc +import org.meshtastic.core.resources.tak_server_export_data_package_desc +import org.meshtastic.core.resources.tak_server_loading +import org.meshtastic.core.resources.tak_server_section +import org.meshtastic.core.resources.tak_server_test_card_title +import org.meshtastic.core.resources.tak_server_test_idle +import org.meshtastic.core.resources.tak_server_test_result_bytes +import org.meshtastic.core.resources.tak_server_test_result_unknown_error +import org.meshtastic.core.resources.tak_server_test_results +import org.meshtastic.core.resources.tak_server_test_run +import org.meshtastic.core.resources.tak_server_test_running import org.meshtastic.core.resources.tak_team import org.meshtastic.core.takserver.TAKDataPackageGenerator +import org.meshtastic.core.takserver.TakMeshTestRunner +import org.meshtastic.core.takserver.TakTestResult import org.meshtastic.core.ui.component.DropDownPreference import org.meshtastic.core.ui.component.SwitchPreference import org.meshtastic.core.ui.component.TitledCard +import org.meshtastic.core.ui.icon.ArrowBack import org.meshtastic.core.ui.icon.MeshtasticIcons +import org.meshtastic.core.ui.icon.PlayArrow import org.meshtastic.core.ui.icon.Share import org.meshtastic.feature.settings.radio.RadioConfigViewModel +import org.meshtastic.feature.settings.radio.ResponseState import org.meshtastic.feature.settings.tak.TakPermissionHandler import org.meshtastic.feature.settings.tak.rememberDataPackageExporter +import org.meshtastic.proto.MemberRole import org.meshtastic.proto.ModuleConfig +import org.meshtastic.proto.Team + +// ── TAK Config Screen (Module Settings) ───────────────────────────────────── +// Shows only the firmware module config: team and role dropdowns. @Composable fun TAKConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit) { @@ -54,13 +98,77 @@ fun TAKConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit) { val takConfig = state.moduleConfig.tak ?: ModuleConfig.TAKConfig() val formState = rememberConfigState(initialValue = takConfig) + LaunchedEffect(takConfig) { formState.value = takConfig } + + val effectiveResponseState = + when (state.responseState) { + is ResponseState.Loading -> ResponseState.Empty + else -> state.responseState + } + + RadioConfigScreenList( + title = stringResource(Res.string.tak), + onBack = onBack, + configState = formState, + enabled = state.connected, + responseState = effectiveResponseState, + onDismissPacketResponse = viewModel::clearPacketResponse, + onSave = { + val config = ModuleConfig(tak = it) + viewModel.setModuleConfig(config) + }, + ) { + item { + TakConfigCard( + team = formState.value.team, + role = formState.value.role, + enabled = state.connected, + onTeamSelected = { formState.value = formState.value.copy(team = it) }, + onRoleSelected = { formState.value = formState.value.copy(role = it) }, + ) + } + } +} + +/** Stateless TAK team/role config card — previewable without DI. */ +@Composable +internal fun TakConfigCard( + team: Team, + role: MemberRole, + enabled: Boolean, + onTeamSelected: (Team) -> Unit, + onRoleSelected: (MemberRole) -> Unit, +) { + TitledCard(title = stringResource(Res.string.tak_config)) { + DropDownPreference( + title = stringResource(Res.string.tak_team), + enabled = enabled, + selectedItem = team, + itemLabel = { stringResource(getStringResFrom(it)) }, + itemColor = { Color(getColorFrom(it)) }, + onItemSelected = onTeamSelected, + ) + HorizontalDivider() + DropDownPreference( + title = stringResource(Res.string.tak_role), + enabled = enabled, + selectedItem = role, + itemLabel = { stringResource(getStringResFrom(it)) }, + onItemSelected = onRoleSelected, + ) + } +} + +// ── TAK Server Screen (Settings → Advanced) ───────────────────────────────── +// App-local TAK server controls: enable/disable, export data package, debug test harness. + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun TakServerScreen(onBack: () -> Unit) { val takPrefs: TakPrefs = koinInject() val isTakServerEnabled by takPrefs.isTakServerEnabled.collectAsStateWithLifecycle() - val exportLauncher = rememberDataPackageExporter { TAKDataPackageGenerator.generateDataPackage() } - LaunchedEffect(takConfig) { formState.value = takConfig } - TakPermissionHandler( isTakServerEnabled = isTakServerEnabled, onPermissionResult = { granted -> @@ -70,68 +178,188 @@ fun TAKConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit) { }, ) - RadioConfigScreenList( - title = stringResource(Res.string.tak), - onBack = onBack, - actions = { - IconButton(onClick = { exportLauncher("Meshtastic_TAK_Server.zip") }) { - Icon( - imageVector = MeshtasticIcons.Share, - contentDescription = stringResource(Res.string.export_tak_data_package), - ) - } - }, - configState = formState, - enabled = state.connected, - responseState = state.responseState, - onDismissPacketResponse = viewModel::clearPacketResponse, - onSave = { - val config = ModuleConfig(tak = it) - viewModel.setModuleConfig(config) - }, - ) { - item { - TAKConfigCard( - formState = formState, - isTakServerEnabled = isTakServerEnabled, - isConnected = state.connected, - onTakServerEnabledChange = { takPrefs.setTakServerEnabled(it) }, + Scaffold( + topBar = { + TopAppBar( + title = { Text(stringResource(Res.string.tak_server)) }, + navigationIcon = { + IconButton(onClick = onBack) { + Icon( + imageVector = MeshtasticIcons.ArrowBack, + contentDescription = stringResource(Res.string.back), + ) + } + }, + actions = { + if (isTakServerEnabled) { + IconButton(onClick = { exportLauncher("Meshtastic_TAK_Server.zip") }) { + Icon( + imageVector = MeshtasticIcons.Share, + contentDescription = stringResource(Res.string.export_tak_data_package), + ) + } + } + }, ) + }, + ) { padding -> + Column(modifier = Modifier.padding(padding).padding(horizontal = 16.dp)) { + TakServerSection( + isTakServerEnabled = isTakServerEnabled, + onEnabledChange = { takPrefs.setTakServerEnabled(it) }, + onExport = { exportLauncher("Meshtastic_TAK_Server.zip") }, + ) + TakMeshTestCard() } } } +/** Stateless TAK server enable/disable section — previewable without DI. */ @Composable -private fun TAKConfigCard( - formState: ConfigState, - isTakServerEnabled: Boolean, - isConnected: Boolean, - onTakServerEnabledChange: (Boolean) -> Unit, -) { - TitledCard(title = stringResource(Res.string.tak_config)) { +internal fun TakServerSection(isTakServerEnabled: Boolean, onEnabledChange: (Boolean) -> Unit, onExport: () -> Unit) { + TitledCard(title = stringResource(Res.string.tak_server_section)) { SwitchPreference( title = stringResource(Res.string.tak_server_enabled), summary = stringResource(Res.string.tak_server_enabled_desc), checked = isTakServerEnabled, enabled = true, - onCheckedChange = onTakServerEnabledChange, - ) - HorizontalDivider() - DropDownPreference( - title = stringResource(Res.string.tak_team), - enabled = isConnected, - selectedItem = formState.value.team, - itemLabel = { stringResource(getStringResFrom(it)) }, - itemColor = { Color(getColorFrom(it)) }, - onItemSelected = { formState.value = formState.value.copy(team = it) }, - ) - HorizontalDivider() - DropDownPreference( - title = stringResource(Res.string.tak_role), - enabled = isConnected, - selectedItem = formState.value.role, - itemLabel = { stringResource(getStringResFrom(it)) }, - onItemSelected = { formState.value = formState.value.copy(role = it) }, + onCheckedChange = onEnabledChange, ) + if (isTakServerEnabled) { + HorizontalDivider() + Row( + modifier = Modifier.fillMaxWidth().padding(horizontal = 16.dp, vertical = 12.dp), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically, + ) { + Column(modifier = Modifier.weight(1f)) { + Text( + text = stringResource(Res.string.export_tak_data_package), + style = MaterialTheme.typography.bodyLarge, + ) + Text( + text = stringResource(Res.string.tak_server_export_data_package_desc), + style = MaterialTheme.typography.bodySmall, + color = MaterialTheme.colorScheme.onSurfaceVariant, + ) + } + IconButton(onClick = onExport) { + Icon( + imageVector = MeshtasticIcons.Share, + contentDescription = stringResource(Res.string.export_tak_data_package), + ) + } + } + } + } +} + +// ── Debug-only TAK Mesh Test Card ──────────────────────────────────────────── + +@Composable +private fun TakMeshTestCard() { + val buildConfig: BuildConfigProvider = koinInject() + if (!buildConfig.isDebug) return + + val commandSender: CommandSender = koinInject() + val testRunner = remember { TakMeshTestRunner(commandSender) } + val results by testRunner.results.collectAsStateWithLifecycle() + val isRunning by testRunner.isRunning.collectAsStateWithLifecycle() + val currentFixture by testRunner.currentFixture.collectAsStateWithLifecycle() + val scope = rememberCoroutineScope() + + TakMeshTestCardContent( + results = results, + isRunning = isRunning, + currentFixture = currentFixture, + fixtureCount = TakMeshTestRunner.FIXTURE_NAMES.size, + onRunTests = { scope.launch { testRunner.runAll() } }, + ) +} + +/** Stateless TAK test results card — previewable without DI. */ +@Composable +internal fun TakMeshTestCardContent( + results: List, + isRunning: Boolean, + currentFixture: String?, + fixtureCount: Int, + onRunTests: () -> Unit, +) { + val loadingLabel = stringResource(Res.string.tak_server_loading) + val passed = results.count { it.passed } + val failed = results.count { !it.passed } + + TitledCard(title = stringResource(Res.string.tak_server_test_card_title)) { + Row( + modifier = Modifier.fillMaxWidth().padding(horizontal = 16.dp, vertical = 12.dp), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically, + ) { + Column(modifier = Modifier.weight(1f)) { + Text( + text = + if (isRunning) { + stringResource(Res.string.tak_server_test_running, currentFixture ?: loadingLabel) + } else { + stringResource(Res.string.tak_server_test_idle, fixtureCount) + }, + style = MaterialTheme.typography.bodyLarge, + ) + if (results.isNotEmpty()) { + Text( + text = + stringResource( + Res.string.tak_server_test_results, + passed, + failed, + results.size, + fixtureCount, + ), + style = MaterialTheme.typography.bodySmall, + color = + if (failed > 0) { + MaterialTheme.colorScheme.error + } else { + MaterialTheme.colorScheme.onSurfaceVariant + }, + ) + } + } + if (isRunning) { + CircularProgressIndicator() + } else { + Button(onClick = onRunTests) { + Icon(imageVector = MeshtasticIcons.PlayArrow, contentDescription = null) + Text(stringResource(Res.string.tak_server_test_run)) + } + } + } + + // Results list + for (result in results) { + HorizontalDivider() + Row( + modifier = Modifier.fillMaxWidth().padding(horizontal = 16.dp, vertical = 6.dp), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically, + ) { + Text( + text = result.fixtureName.removeSuffix(".xml"), + style = MaterialTheme.typography.bodySmall, + modifier = Modifier.weight(1f), + ) + Text( + text = + if (result.passed) { + stringResource(Res.string.tak_server_test_result_bytes, result.compressedBytes) + } else { + result.error ?: stringResource(Res.string.tak_server_test_result_unknown_error) + }, + style = MaterialTheme.typography.bodySmall, + color = if (result.passed) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.error, + ) + } + } } } diff --git a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/TAKConfigPreviews.kt b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/TAKConfigPreviews.kt new file mode 100644 index 000000000..265b5fed7 --- /dev/null +++ b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/TAKConfigPreviews.kt @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +@file:Suppress("PreviewPublic") + +package org.meshtastic.feature.settings.radio.component + +import androidx.compose.runtime.Composable +import androidx.compose.ui.tooling.preview.PreviewLightDark +import org.meshtastic.core.takserver.TakTestResult +import org.meshtastic.core.ui.theme.AppTheme +import org.meshtastic.proto.MemberRole +import org.meshtastic.proto.Team + +@PreviewLightDark +@Composable +fun TakConfigCardPreview() { + AppTheme { + TakConfigCard( + team = Team.Cyan, + role = MemberRole.TeamLead, + enabled = true, + onTeamSelected = {}, + onRoleSelected = {}, + ) + } +} + +@PreviewLightDark +@Composable +fun TakServerSectionDisabledPreview() { + AppTheme { TakServerSection(isTakServerEnabled = false, onEnabledChange = {}, onExport = {}) } +} + +@PreviewLightDark +@Composable +fun TakServerSectionEnabledPreview() { + AppTheme { TakServerSection(isTakServerEnabled = true, onEnabledChange = {}, onExport = {}) } +} + +@PreviewLightDark +@Composable +fun TakTestCardIdlePreview() { + AppTheme { + TakMeshTestCardContent( + results = emptyList(), + isRunning = false, + currentFixture = null, + fixtureCount = 40, + onRunTests = {}, + ) + } +} + +@PreviewLightDark +@Composable +fun TakTestCardRunningPreview() { + AppTheme { + TakMeshTestCardContent( + results = + listOf( + TakTestResult("a-f-G-U-C.xml", xmlBytes = 412, compressedBytes = 87, passed = true), + TakTestResult("a-h-G.xml", xmlBytes = 389, compressedBytes = 92, passed = true), + ), + isRunning = true, + currentFixture = "b-m-p-s-m.xml", + fixtureCount = 40, + onRunTests = {}, + ) + } +} + +@PreviewLightDark +@Composable +fun TakTestCardResultsPreview() { + AppTheme { + TakMeshTestCardContent( + results = + listOf( + TakTestResult("a-f-G-U-C.xml", xmlBytes = 412, compressedBytes = 87, passed = true), + TakTestResult("a-h-G.xml", xmlBytes = 389, compressedBytes = 92, passed = true), + TakTestResult( + "u-d-f-m.xml", + xmlBytes = 1850, + compressedBytes = 310, + passed = false, + error = "Exceeds MTU", + ), + TakTestResult("b-m-p-s-m.xml", xmlBytes = 520, compressedBytes = 115, passed = true), + ), + isRunning = false, + currentFixture = null, + fixtureCount = 40, + onRunTests = {}, + ) + } +} diff --git a/feature/settings/src/commonTest/kotlin/org/meshtastic/feature/settings/radio/component/TAKConfigPermissionDeniedTest.kt b/feature/settings/src/commonTest/kotlin/org/meshtastic/feature/settings/radio/component/TAKConfigPermissionDeniedTest.kt new file mode 100644 index 000000000..bb8ba8fbe --- /dev/null +++ b/feature/settings/src/commonTest/kotlin/org/meshtastic/feature/settings/radio/component/TAKConfigPermissionDeniedTest.kt @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.meshtastic.feature.settings.radio.component + +import app.cash.turbine.test +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.test.runTest +import org.meshtastic.core.repository.TakPrefs +import kotlin.test.Test +import kotlin.test.assertFalse + +/** + * Tests for TAK permission denied behavior (T075). + * + * Verifies that when ACCESS_LOCAL_NETWORK permission is denied on Android 17+, the TAK server is disabled (not crashed) + * and the UI reflects the disabled state. + * + * The actual UI composition test requires a Compose test rule, but the behavioral contract can be validated at the + * state level: when the permission handler reports denial while the server is enabled, setTakServerEnabled(false) is + * called. + */ +class TAKConfigPermissionDeniedTest { + + /** Minimal TakPrefs that tracks calls to setTakServerEnabled. */ + private class FakeTakPrefs : TakPrefs { + private val _isTakServerEnabled = MutableStateFlow(true) + override val isTakServerEnabled: StateFlow = _isTakServerEnabled + + override fun setTakServerEnabled(enabled: Boolean) { + _isTakServerEnabled.value = enabled + } + } + + @Test + fun `permission denied disables TAK server`() = runTest { + val prefs = FakeTakPrefs() + + // Simulate the exact logic from TAKConfigItemList.kt: + // onPermissionResult = { granted -> if (!granted && isTakServerEnabled) takPrefs.setTakServerEnabled(false) } + val granted = false + if (!granted && prefs.isTakServerEnabled.value) { + prefs.setTakServerEnabled(false) + } + + prefs.isTakServerEnabled.test { assertFalse(awaitItem()) } + } + + @Test + fun `permission denied when already disabled is no-op`() = runTest { + val prefs = FakeTakPrefs() + prefs.setTakServerEnabled(false) // Already disabled + + // Simulate permission denied — should not crash or throw + val granted = false + if (!granted && prefs.isTakServerEnabled.value) { + prefs.setTakServerEnabled(false) + } + + prefs.isTakServerEnabled.test { + assertFalse(awaitItem()) // Still false, no crash + } + } + + @Test + fun `permission granted does not disable TAK server`() = runTest { + val prefs = FakeTakPrefs() + + // Simulate permission granted + val granted = true + if (!granted && prefs.isTakServerEnabled.value) { + prefs.setTakServerEnabled(false) + } + + prefs.isTakServerEnabled.test { + // Server should still be enabled + kotlin.test.assertTrue(awaitItem()) + } + } +} diff --git a/screenshot-tests/src/screenshotTest/kotlin/org/meshtastic/screenshots/feature/SettingsScreenshotTests.kt b/screenshot-tests/src/screenshotTest/kotlin/org/meshtastic/screenshots/feature/SettingsScreenshotTests.kt index 647509578..b1e30c3e9 100644 --- a/screenshot-tests/src/screenshotTest/kotlin/org/meshtastic/screenshots/feature/SettingsScreenshotTests.kt +++ b/screenshot-tests/src/screenshotTest/kotlin/org/meshtastic/screenshots/feature/SettingsScreenshotTests.kt @@ -22,6 +22,12 @@ import com.android.tools.screenshot.PreviewTest import org.meshtastic.feature.settings.component.AppInfoSectionPreview import org.meshtastic.feature.settings.component.AppearanceSectionPreview import org.meshtastic.feature.settings.component.PersistenceSectionPreview +import org.meshtastic.feature.settings.radio.component.TakConfigCardPreview +import org.meshtastic.feature.settings.radio.component.TakServerSectionDisabledPreview +import org.meshtastic.feature.settings.radio.component.TakServerSectionEnabledPreview +import org.meshtastic.feature.settings.radio.component.TakTestCardIdlePreview +import org.meshtastic.feature.settings.radio.component.TakTestCardResultsPreview +import org.meshtastic.feature.settings.radio.component.TakTestCardRunningPreview @PreviewTest @PreviewLightDark @@ -43,3 +49,45 @@ fun ScreenshotPersistenceSection() { fun ScreenshotAppInfoSection() { AppInfoSectionPreview() } + +@PreviewTest +@PreviewLightDark +@Composable +fun ScreenshotTakConfigCard() { + TakConfigCardPreview() +} + +@PreviewTest +@PreviewLightDark +@Composable +fun ScreenshotTakServerSectionDisabled() { + TakServerSectionDisabledPreview() +} + +@PreviewTest +@PreviewLightDark +@Composable +fun ScreenshotTakServerSectionEnabled() { + TakServerSectionEnabledPreview() +} + +@PreviewTest +@PreviewLightDark +@Composable +fun ScreenshotTakTestCardIdle() { + TakTestCardIdlePreview() +} + +@PreviewTest +@PreviewLightDark +@Composable +fun ScreenshotTakTestCardRunning() { + TakTestCardRunningPreview() +} + +@PreviewTest +@PreviewLightDark +@Composable +fun ScreenshotTakTestCardResults() { + TakTestCardResultsPreview() +} diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotTakConfigCard_Dark_d19fbf1f_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotTakConfigCard_Dark_d19fbf1f_0.png new file mode 100644 index 0000000000000000000000000000000000000000..a740fcdfe4edf0936d6eb9ff2674a3bbcdff994d GIT binary patch literal 23863 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 literal 0 HcmV?d00001 diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotTakConfigCard_Light_b29dc7a7_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotTakConfigCard_Light_b29dc7a7_0.png new file mode 100644 index 0000000000000000000000000000000000000000..bfa18e380114405b565f6271ceecd30c09d40c98 GIT binary patch literal 23710 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 literal 0 HcmV?d00001 diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotTakServerSectionDisabled_Light_b29dc7a7_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotTakServerSectionDisabled_Light_b29dc7a7_0.png new file mode 100644 index 0000000000000000000000000000000000000000..023b84a01e9302683246ec322902aa54c82d638e GIT binary patch literal 27506 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 literal 0 HcmV?d00001 diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotTakServerSectionEnabled_Dark_d19fbf1f_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotTakServerSectionEnabled_Dark_d19fbf1f_0.png new file mode 100644 index 0000000000000000000000000000000000000000..b6019533b7ad4f4873a583f563de37f4e45bcf3e GIT binary patch literal 42840 zcmdqJX*iVO`!`O~CbTPSB~;Q>_H30RI|*54B-t6eVa8ga2xX1QzOPfZ8OtDw?2I+c zjCJf|8D?TE&yBv{-|;(+|J(ob;_=FHyYA~c&+|H$&$-+_Xlp97p5Q#ez`($&^7QdD z28P2@3=D^k9XkR%39W=&WMJ@TPtVFL8HQHhwVt?~;&U^pM`R_w8Y1fav;d=9i<;|Og(CeWmuG>cc{OO*iDJB}F@@icD zp0RJO(DYLFwCUokYhGo3Wj?topT0fnegl?xAMC#ArkCiLI3=^Yw7adq1kl02@X3nk zyu1G!!zal-3W1*orfAk6Q|HC42H~$GOzs;zPSuH=?az`Rm zzsSTU_LkwR{vxm)0X{E6*_cj7%rfp#@IYSN#D5|^LjInpW!oL0WbfjQ4p@zDw?!OS z|CsOAN`&9q>Y;s7H@faHhHJ@h{5;7kJIM0#+FgesG0OUYDZ*=?C;!dzOj!ogQ2<8L6h;nIzYKTA6z+(|K{I ztd)Li|0L~X7oO2UjB`52mt$_TxL>y*)q~zEzc>iKX{pzd5)Su(-Pfrx5)MOOXaq#( zF#G;ny~!g-q|T*CZO)`)>)u)a4nfv@6}Rj6^m-46dv8p|LEs0Qo4Rm~dQN^;uJ(Ud zV2tii<7!HhLsVB!W+9=gxP4arHzS7`ln08y*q1+Ny3?_4DkJU#U`WzxpMj~D&4Jjq ze_Qw~HYkl;ewV`$gp~MTy1O|5Nh)?4djt~MKPQK;;-u38zG{Hw(Nj)}g^9->3rGz> zL~h){&G$x_9FYPpWS;rTByo3}h%HqC1m**&$^PmR5_dbiQ=Z-?yD=F>T5Sb^Ccp3Q z&^fFF<94>`$YE$z`@%>?&lYgKt5lI`zny8n6IfLfV3S?2diu-G26hFLzhBvS?tiJ> z%&)!YN0Ib1C)e)o)Khoqe!GrlF_$DG_AZiMjiD|MPfwv;rc^;->2(v!J<9zzV_F%4 zIWf>vk8m?TR)FJ?R}_PyF{A{$YPYGa)wtSQ3)8%&(d7=q2~B){BU=Cg*>MIJGhHd4 z6t>3L1M30>U+PVa;BQkaK3)=S9QK_rM8lIg2J{TTQ&W-%syzt&r8@f3-dQQ~Q}^mt z2#6)GFm1!)*B|1_1#(kmtva}uFyqf60*TvX7^J2sr*X4(XTCOJzNo5$Ue%uT-hH^- zf#4w$MvtrA`bBS3?M;7#9mQ>ePEHqYfZktWzNNbLC7QCKl z41>tyt6((TpVb%t1QZPjsO_tCkKKFKrf{D2>}21$%+8^|D-&4r&wG^KZWH?MHv5b+ zWQU43F!d?B0}2d!^KRYqQ?70{d}BBb&i`{vqTj0R%UEW&EC<<2|ICFP&+!jJ)o$h0 zu?K?LnUttop%Zs&?tHCx_;^H&rpOr;-ng6= z!;sAfUmG`59=<*CkWpi6W0<&8{w-Osx7TXO3rp#cA=Ib@=URKV5V!F}uZ=B|WbF#> z$m)NtJZhLBc&5E(_-PrB&suk2(At2h-{K-N7FDy^QfkxFNVgY{6+hgdv4s1c2%pO( z>@XcUxr{r~BHk~)K?-8!s`g2=!0#6-x7i- ztX?;lg_`_vly7adaw1%&+D%7L^XtrFEqvV;1Wq~Kai-QoU!*YPYErc}1@(8{rB-m#V$V71O++#K+?O)9uLV%rHg8 zM#c2uEK*nGP{^fxCgC#z#nsP%f4dI z{T0O?KXjGGu>Mi)ke>cpAHoCmoqEUG{zcR(JnlA|h}4`jojdO$PRJ92RqjC$ar|p9twN@PdmGv7{mQzL$H8vZ2zpxJ1cJ6TCq^vdUe|Q zn~jU6hUP3eS?uX6nTe00)m!!YN1D^V7wOrI2)yVkc{Dwn#hNqlE8r;ai(;)RkHxD9 zb1|d%eUCS%+;Bw7-mzvQt70nF_zbg5lIQqw5Z`d^R%@*%{iz5AZsN1v2k|w_N4)NP z!6)sK5oc9lb`wEeSiuoJh8-XP*Z*`|UhIi~LzXnh1rejy9kLX4)c5%WY1b^Y-zea@ z)^Jv4ze3IvtgQN8_yJBIE4x%fhl0Q_8$VuxYyuu~K#jxt=e_;7(i@z`;xyQc>2t|} zrVmi-SwNojW&#$0Ej9GqT4};|cI168@)rO3vqRMOONjo9ZV4HO>5fFjo+F&!+xC=_ zVLdgMi92A=d4Fzg^H>!$gk&=?K3DOp}_U`He;T9|K>kdD+<*7=x~eq%?k*}W*1 zSt4$GAQdA%#_(NY^3Ix2PZi7&#dwQL61s+)cZ62nDs?lLyXEBEDM$01Ev*khl1n<} zDY!qJWd|o0Mlb|VwSsC-f<4?uFwT%6z)|$6WuJdS@S0A1o(uax|6?f8Fa9&bhfWpP z@R;dJeLeGGhscwJ%huupfeh0B33L7QsFQk<>>snmN zg>~F}cmT$xC)V8@tf(@-+cgiePM^-PI-Q4s;4DW@7MZT== z12@qHci|X)@%>fcz|(DH?FJW!L8mZNEe^hsA6&n?)w%0w)AtS56V9hVP>U;%wJr!= zf4vWL2!6XhOG^MaSfxhb{zH-+K+;~oTI0+u_TF#-Ifx5tBuq{fX1>C^rFjXBl%5EB zr{NNx1?*$@`$NaC4nOL`AIqJs4FSJl$J*@^!d)1;vd!dyvXv%{FiX9z^Jj!8>g79c z^(bsd#Yr4*XHHcC;j2-#J8)1T5dHkFi!I~V3{0E@0YjBTP|xXeIqyR4avL|_pXOIx zRTz7Bw(Umt*JrC}o1QE$dQ8vEKk@MZ(aN4!gSX2G;Uv~>v^!R>IeTxf4-l%)21pV- z8`Su;QAZ@Pw_bd!Q#1Y$^uTRC_)KbKrlEsK-;05+voukY6SpyRz5fbeZ`0qb zk|U$y`kAiN9hU70;*d=jf-ils{&6N0;sV$gV%FirN9#+5Fog=hQ=T|$S4n?oSnG?m z0b*?PP6Fy`!4JZ-Fn3nD+f8>?IUH+MIV=7t5kH!dO}wVceV!!#g6V{t zb(*^P%iXPMg}4QJlfq7S^#%!PIaVKN`TNrqAP8~Qo%n>IGoO>vsS~h2^E|PkF^r3) zb)=HsJW}C`^~n(6n&*5o?yETppn`SW|EQN&1*_A0(#Xu8lI#I%R@b#|Wh4NGI7pwJ z&`5>SB&xg)=3k<)*Q8e1LNdB zD2a&f`G5zlt?vGcJB!4f_K#eW9d?-hM-M;kIU0I_sy+$=E@$M8gDbsbEjd>D8ZZUz zA++O?k3Nlz$Cmc}#}k!S0|56Bs(LkKwk!4RfWJnX22vvM!_B^n9+U_>VvSFhBe4cT zaLx&?C*!NIvS1PX3wGo=x9+qjkV;$eSO2_;e#2p@LkJpK+?CXJmjmqfdEg6cdP<`} zoXH+`H~vEW(T*~b@mRPs0EQ**!5Uip?e(A+HQrteb*gHT{R&&lic2M>8AZq<{r|*+ z*ghvlwgCXC*?TMwS@ahgTgBc6+a~!?4NJTzq(_%0LqRpmxNHqYS>GK>GDmDVxXd=j z3viz-QOFiuEx9L5GKUXz^l9E06Zf9P7*baLFQ+vBZy#sDJL*Z^;ApFRsMu~J2agYL zf{6$7`WDzA>QYH`1*y6%Jk9smzT`RI4Q<*|@)uDT>uj=!{Yj@)La z${*e*@UmTq%5{mcMqv{RCT_pYp5(UFV4iu4gPg4E8JpbJ;G>WAVa7k%oW8ou8A7rS z*b-Un<;7NGo&e{K{xE#1Z1)J-t*j z(EpzYd=BSFop$%l;z6r)mZD_O{F_wEx=+VRbIzje(X$Z=GSfx(SYj8%vwm=<5%RktE9BiMvZ$Iqc3ymI zMI@$k<^wI^Y~|W&%c;y`PWvR?qv5xQ;-PZ4#m+)aUd9&g*4h0|zZWz7*M`y_p*3$_ zL-)x-I{oupud@~dloReoSt9#DyXgZjmDly58@(SB?#v@sG$u6oqIwN(7KECH~`2WF9N=aKSM&WYdQEr`0&mB3Y4 zZItE1e@j9rw<~eCz-66w-sw|0TbAo}cZrY?TEbKkQ z(LI@5{{DHOUCfyHH+>*QX}g=|wvLG>zy_`VN$iz*P1s*v1Q{&46Pw-k?K}GyUxN_~ z_64}p%WhxoI?RDjf*kN@^NDcrrPZDpip#0deWCxX_vVTb@!iR` zTP#ZSBDm;rw+3_K0YWgdJ?FqyoAb zMVd_F$3A$%8I4*sE!j@4?ks97I4XIrMvErXA#;eEbq*5_ZeyZwaA+jCgvJT7qT4V{ zZHSjTpR0J@Kf(hd_#JmQisZ>UWrQ zDUV;0S~}(=mcwiH)v9J|oiDWCagdy;(qLCb5ZT~{$(#zT?BO0-*yZop?uC#d)lgzS zbk-YNy8%ae#xemrST7`6OjI9n5gjh33%gQ$?All4ik9D;5_y=6XkBm*oN$T|`9PsV zrhEpxVp|!SM9>}ghRbU|hsblVt*$yAJ}lMZI^Ttvhc4qT8yof}a-hkpz7saHy%k8B z*VNbkiLa5{OJAi2)S@19x_gkTn^ae|z1(Fov*U{N4I;Q5`wNMd1U&7-Mw97w%_M@& zp7?!W#Eqiv`u8&rcAJsmfzK?wh1rrqCVGWUSeCu&$tHaa6+}D??oXNMTER4390)S- zGrync7E4Q<*1OHb9U;4#LHlM>_(Ksz{V#osFfjo%C!uGBd|qb6HQ)ojrqqEjZuWA|d)| zi~RxBHt!jlvP4j^>N)Z6DnD0kNFF-GJyqd;UB&$L?C&)4h=OA(jSJ>5h)JJx6@T8K zah8;m9zl}_wJZxaMtduz#1hTQ+&w16&$gjz{^q?V2J;%uW#$J4#cwTOwbbM%w%L6x zNF%%NFZnE$qt_$u_ih^Hlhtdd$dR3T%k>(% z`P2H)n;RefN$G$W*9DT6=ekx$A@@eSH~-YeE@Yd#_Vn5QP}GX{Zsc;THh9t8tYKvb z8#N;}XB)&UWG8W3CBweQU0`4+tu8;xZPpLn#n~N}L^kPH+iA*9+ys5n?sTiZ52cyh zG%Q(U>7mx~V=F%i9hTxe#~8kvqgaS4o73!P4CjxSdw%A*=VpALK!YMVNt`$=6rSO( zA8-iv`!|WhRFsa^K+mV@KXz7_ZcD;q-E@+`-)mkIGqnm=aX`s4R(UB5)lQPDmBem> zmzYnjrWowz22Q{_b0e#1h_ozPA-Ty5n%kLz!-FrPY^Y}Hjl=vxNm_ix#y8%^ZBpX)^Qbc*~bk}Nd<%XN&v z>Da)#q&=r(B146Pz~W*`VAi1A9w_Let^t8x31StlkXjX2{#BJRJgRE#IyVIj>lE(V z1xga~F&TYN7hSsrEL(ank!qyb&vU-NKdqTqXj2|gEs3+s)|Z^nZ&|vLr#zJtlY3Vc)pz zV4&ECmsEf5pT6s#N{TV?8=vCQe!GBcEm~a-eWu2*XTDtKQcqvnO^0z)S59)t4-KRB z4F|3mOrNdds3cT@Hyn(V*1rGh6oig2_geeTP7Pp>3pl_-6}(zR2sJSoV1>-sO5M;~ zOx(7kLtaF$f$hNB{O%bxV`p07HO<7n=^2^wo?M||xEoMdxks+#Qk7rY&_iOyVq~{w zaP_ZI0a5{P#87->@!i~P)9YJc#&>>yr)s0^jmzydoE4bE7KlheO?OH-&}irp*qDrl``MoTRS#r;qriKN zG|`ght6Just#5cl%B}F&YMNo2VFy>LKz^i-0ably=Y{x{Ph?kgj~3UV)ouo8qn zw9j7DKV_E9xM`NKQXr3k5foDiwv`)|^_7vWNJp%re$mh~&xY(HYJX7Kusw>luZG*=j!b|UsNv*@`Jwh zqVv?6yh#$X`CZAz+-pvXOWtXeiAzM)fUhI4()hBf(vweqloEW7z&8Rbruq#DJGO(i z8?VLP^kr+mXWTtMh}noK#)cIaBtO%@t0?LN#TM=JUyEA@2t{UxsnZ0f2_6XVRCIm` z=VmFqy+3lX^0tlCXQbB9+8^?n?_3g#w+@?(l-m3r-yDNb8hlFvQqYPo>obsQ<(={L zoVeQg`kJ_y1zqS1E$p6+eP0|PT`sXycJ0J=Usu#MQ3=koX1maL6dm3Rz#~A0wf>dx zh#HTOI0)rTPPbKdUqd#sBU2Jjm7g=>T`ylxRgR6#(3{8{sXhwz=TGVEHTIIk67E+j z8uY%9$?~xRIy5%?>veA8yL!F!(omz)=AZMRa`iGEQ17Y9K2?d}51WQ@so`>6%hz=y`x8qs?l%h=g15nsSsxl= ztPPv3gpM;j?lWYSE7`q$Um3PrkZXWMaN9cNoAh!OC}tNCIriFeV z)*H?}gA4wD5emC)!@M~I6lMmoq8p;T6wZqF*FQ6qtLq-{Uy^hG4C|PhbpE2McvvcL ztOi_G!R}{!IA|U2G#i$QP3DY(Cis&qzV+B*-XI$@$JnUyw%Qn*Lr{N3@TZA3oS*Y9 zZea!%nmXMOE{ZH)15w+!vN znm(B__Y})tce>u^Z%@k&Xu=(+q;psWtf%*pW7p!=dSkoBStllL=gx;CsW)w-D{Ky_ zaOT1Y?tUspB8oFv$0ur1dBrV@;{8#x z0c^?r)1e@Si~1?!bETR2tSys~$AHFJrPlr-x*n&**9bA8NW`*8q*~O%$^@J^D?^xv+O$MegE4C!aVxGEVTLv6Zk* znAuIn#9Gp|4<&~>wfv~9FDQYpy|#0x368Ez;W`b^J(m6$sHgA3&`0OCy%`z8tp4U) zf=rYf+WSmIWa&l-SHFC~e}4x_>D{QbIQ3+`zEF6*;L0KHIeEX0Wt|Vvc24^A<>@0w zT9|dxa#)J>JG+e0!_Z_f?v$Q^rOd7i>u;k&-04M$CdDYhpRPTJBgLLA#$4#d58-*I z-ksIDv2ijC2J5*twXef)QNGE-MpPB{3__2IRoV$1S{ZZHrgZ2-l^lyrpO(rq7%tkw zU-9hYp^aQj|m1f&D7KPg`~&!)$Y>s(=iM7OsLVYixJr{{45a}%2L zMb|?BkZsGilXu){hBbfq`iJ~~Y#dLDWjSC2@XRD0zq0XLKa5oXCc-YrEU_Xz;5Ij% z4RoCi?l>zb3hQCKGOpxr-f*7R9KxM+;`Vx;{Zs8-ORo(&j$5%pa)S}w5mEy~oabgX zSg?32(Ck>7X-zo2eyDhw|G2evD6&R(+8)K%2cduyKusOWYVU`K%Qy`xCXTtyeT~?2 zrs0;Ryyf$M(y^Bx@b>_!r>&V38!AwDI&CPpHiI!-?KZYJ!}%J#qyj)mf#i1E!(jJy z%=kA>4I|rZkpce#fjZ}o4UV{lDwnaiTpg1Mg76-jXaK!h!7ZG(P9N4alD zW88%tY>r4Re1O=AFGr3+cFM20Q{yf2)o`{K)hqfw8ASz64^o=n%RJ0BMgws3Iij7t zWaF2k(8clyU82D8+}*Ah8;3W>(w~hw8@$&9AqN>svu5q-@v!-P}g+>e!Tn=LTWy~ zQ!^JhW9Ao7{S^RsclVR19ES^%ZQcaCElH+C^#8{-hz<|i>?OFMFkuxYoP+l-xuah8 zD2&jL(}bcA4PriQ9-Tfj}~V|MIy6zP^Hc>>TIyF~L-kX!A*l^#<&snn-cc zLBs(-hH-EycXpMLuD}ThGhO(4);%``p*hOUKEuMnF}Ay^ExuDo^ELc@*d8Hwu*eLl0(VGyR)ZJE5ws- z1gPQTigm&iBr(_Eu+*dH^yRo~b>A)K(fBW!y3M-Y43YqE_Q|ik`msIH4CWcOYk9}%Cmv$>I37J?f$HcL{;v|gSbsFjrG{;H@4<{D zouA_T1Yjsd-j3Ro+PDt)hA>$40*z$6gs`y(ki^`tms-WNW`(U1>4~-$Ii|FsYq)WJu+$eOH)n;?*}8x#h9AQ(mO-eNr0a^F|ctEy(<2Ra)oO92g1+$yQuV*O`P9$eJ{4ICJz^M-n;ZhxHaey>3+=WB{ zX#h1;{m5YbDCeG^Q@3OCh($=Hyuy;X7z@d7Q`lrb%kcTZUuwo-p>*~e@uFGUSuDID z;{m1KUn$OQ>!0f_rJS@rVsc*P|*&Ao;iGkSC&v}w1T z*q|KenvyQ-O-W(~E>98LQSrM~CI!NsFxb7r?QUSe^iw0BAb#T5pbgP?y5Tp0i!rPf z9jyBP&9yvb53ie^X-8J9l6T9mEdrJ6)z#>N`Rr?jGB&y5b*V=zo3DK%_FAFIf~ohR ze4THCx2`CT_y55#vgy2}yp2#bxY=#X2d%Wld(eFZyh7(nf-G~AF!@W@XYP57^wx_v z5|jrnxATmX_MV-aa!c0TxNj;6miD?2#G;y9#(4=_fIVR)7swrHM>^*nw+gx} zpxQe?;s3Y@i1o9V`+!Vf=Qp8}kB9}sey!Xraz<)DLleG)6t{p1 zDnJSzXH_fqLvE7sjrkaN2_Rga`{asZjDcGVj8Qkg+q}^zoIBI&1zXkCS=MNpACxuRcVv!#^AVI||QcJ79e=_Q|=RoY!qWU8pB^N2Ge)|NgNWfH$2Z zCHnB4hl4R{3bqAhNE9G`9;9G?snu%4YA8(sR4_S4x|B7fl=nu+ER1{|UWa;~q>`Z* ze3SY3V^@ou>7XjdXrQQMu1UrV5r*Mtz*4PKbh> zEAv?@Ej$Tgs|m*;oahcgVA_Lo(1SOR1d<842p46B5=J z>jIAQ={?OqKDV$4M=p?rfJ(&+Gevw1KJ^qM>xZu4nQP`0{DcQOEI+p=u2bV%1j`9Ex)8=2wV~A3+^5?A3Cn zxS_2w0c^~fK&`Q@tF*~W9ZgSMniDt1ia`?#1?y5%Vg>J&QM#8v_Rl(PXE&W&KO)-l zI3$$&pXgkE>>8gF_fT9Im9ZZOO+R39pW(U{!%@HYN`9+qt^WJ${;=r5?y);}7YKc3 z@h_fd!jc0>o4M!2G z4A*|14@XhW=U4wKi|zW$k!V-u=+Tff9Y_eu?=DC|a@HH&5U@d=GEnQ+5({U6v)`Ez zB0PW5r>NFDw@Wv1`w&-jq1|o!lcfw`TU5ajOr0H|T|d&N_al}42on&gbhe%5)v^DY zh#K~L$ra$gOeD8e{_DRkd0VVw+l+xoy4UKne#OCB*}u0DatS;kzJm?kidXjJ+O?w4NnK;`Cw)_*TOb9k1+%RLM7-$lR265IMEcV@)xfnBQhk~xM4{PUhe z%Y#HTZu=X4>;Nt79h=fDw>Fu-m-t!NYe*jJ`mLl6|0(?TdL9Q9oNIN^JWXj9r#wz~ zJ>e7Fg;VU7q9|`ZzWiK z3F+vOqg~Hqhw|jY{xxPT>%&;8m7par)^Vt|(?V=(hYp23o~G5SnR-t1TC`{5(8S*?2jcTT z!xXH!##!5LIXHN<+W%qF$-O#*X3Pu%HvcH;Uz<4kFWGmot;f!nEbfnNK4|P{tsgq- z)s;_N-*4=EwU{S>yqBQh-)H|_OXr4-W$)Fkw6+zRj7-|j@(g$fcO(6ZYM*le+JdQPd^*XnWaWPXOC8!;K2`F% zuL|-O^T&Q@8{yjg8-ewIBzNh)2XssdZ;pCQMAcZ)syg}q@%I#{qe$AJ{bt2KBD+hg z4B{1KXp}cBg(^*==2ZC7i-|5;-qOH!2PNd7>7G&`+F8+C{dbdZuUVW>`#M58Yd#Z_ zk}A$U;FA+yyXL-h5qKwesc*Z8^6}q0Y57gMPuofol809u%P z3grJ{h}Y?GRCthf-B{(UR)X&Bi_^>kxD@Xgzrq04Zd&$I_coM^@n4VLeotTGDKi&P zV;^_dM?#b1kxRyQx4Gd+>D7#fkZ)Jn7GYzbjN993MK>m=eU-}Au(Nd6+8(9<3_1LU z(d?`m)e|PfQ*>-6fbu`P{B~CST`TM*M9&%5S#er?$k4p1v`W0K8n zwaIea{bAWQINv@w?|7HLsHVfDmv*m*?BBTP`?f_>f#OYRB+x?cCwqqMA7~=Oa192u z4Os@>>!b^vFS^u#x@Zok&go*3Fg6qS^L(uK`?|18E_4C9MJi;mZTGPeMAv%3D)gZ3daog8-kbDXRj^^9i{y~~@Kygs@P?xud zHQvtgxOfVcIQ`**FmV+s6N76wXjQhafnm}$KB>0qwN>7wdTxv1aLG1-IPmP0dC%}0 z3WELmCPcGQXlfl}{D?E`uTqTCpV!+?dW%fj(uM$&r8T#f0tY@OjDoq+sxj_yvxB*z zal!M|ESoVV6D@`nwysz1%#%K^-_4^1S2=zW0oCYZvN3dn{LUwF(UZHs>xJ5FtiIX} z@eFq`Ln&&g zr&|?I_h!oC1LCx@B$b5`&>kVnu5UL2mm0RiIl;h`g>4GPQRrM?qP$PmrTg~JQ->$t zeUMBDjF2<;SoB3-ORV&(++gn2z-uC}T^&hSg^!3_2~+Y;S53EHyPQ!}KXv`VDeuPe zMHFHfOhx{(<@IlAo*QCJS+{Tp$xgJf)Ku_#BSdgzW;<_w0n>lEmUSs+fp$G5tpl;% zR99iiSRc^>yKEna=lnX@Gj7{D5yz*tyZF`AR=>)?QscB@n>_!F=Bwgr*H)pT^8{wg z-(852*rxYZ=E}Tyr#7 z1^!Vdl0d9V#+7t2<-PzW0Soi$S|-$DIj93Abt^zed-!wG{v4Hwd%9u#_#9u3eP4fP zd)H~n^S}o%nh8(HhqyU8P@zUn0X^;R;~7Y-8>2>sHLURYW=UtoZ#5x9Ic^IPR1^LT z&ibchUhGZesM(`P4`IzshUc2G18fY1pnOCsp2w86prmtgKJzqd-!}!*hq{s)FR9xR z=XxB7D_OJ7jb0E=od-WUL~nwJnmqrW=1~n=7V)vQux3BQ`r$hA>KW#op*)3{ni*!9TJ$~IE(nbE=PP{_uE=Th%7@oIR8CmuLUYhQR5Dtv zJ4KgO^TO1ubCtY#%bx$~U3H3?WXy@Yh2mi_GQB{1guPNuskU5u4AOXjJ-IOdD^e(# zhI=1mI5;4oVZV@d+?vcP(@7`EPG$mTyNF&p@g1yYmjz^s_qr@RnRz!X*;+t^0`A3AG!MFCJlA)!7y?G4h8P_-7YwDv= z(7&J8pNQCN$odbjBHO<--bq|RXAH6t_9M(abK6-yG;n2 zVoxdC<6d&)*sf<`e`RfRi*u*OZjza_xeX!v#!3$Kc&m9cjFv2A1HW6y=|}eHzV_iE zCo?7{p0KkHlrf9+iyapat$#Wy9>KL8_u7B?lC#Wl$ukW^XxJ*WrpvBJzax5@R-?$B7@a)K(qwE#0|F&W*zWCkTXe;)&BAqC-;-hZ#V_N-O4y=4d8jSzu1 zwpG&u>XGpn)->0SD$HLmex;oyE*|lEu^*|GxpP2gKu@%ALLX*;UF>H12z^7D2Hjpj z-K}#Fog0r)`Dw=MMWra7vZr*|K<4~xpkxuJE2?M?Mx^*xY$mLH zpVNz+50@8uD(oDK+jd5ms8Vl8l4^%2PhHr`p3V=wHQYuH}$E}Bc&$>Kd^wCOs>iay_Avog`j(r~e~AP0V@!YexJ$;R_d`JPG+ zrSES~Crs4i$)d{iU_E8S@xT1+ zjLTS8jmSUBOC!GHw!r}ktYIf`?~Bx+l^C%Vr%zg$DLh8~W6FuzU-HcfX>skba;9Ek zUfvE8OFN12B~GCg3n5%5rlw-As7~DmO56{e0&uFwoYVE;+9i&k;Gg=5i|E5sIS=PZ zH*D2yJse@jU*j5ArC+e!aMWZ8tN7b-UBz= zi$jEM_#y1!a4FY_)+`sb`=1kdA1oe~h~pKs!qZ;PT(mL<(vMR6JiXQiz09L2*Kjo+ z&-oXLi8YFdf=b~WgDJr zMm1uAR_6TN zvT)P6o}l&eQ-}>+=9Q5}Gmn~8eP=$HUUq3jH*1cYY)yV#qXi0{1~<`o(2-=G%8k9~ zL}M-0mn(<~Qa|FAM^j&h(M?KK!>dfW0Rwcf;WMwGSCKnUEDu@uZ1);tWh1rOqb{R* zG$Z(C9<^@nu(OFNmn-~nli9x7V^x<^|MiTnrL3i;9OlO@$V$0k$%Gn^h#qr;+*e4< z?l1tVK?c&?e`?fHO-70zl>(pstd$SfjK*-;aVm?jD|6CpwTxbTfadA2&%7e4_l4cI zznYyQVw1VFs_PwKcHw@aU^K5Z@~9VzH>HOj(p8|YDQ+j zQ&*BtrRro=#q3zari$)`yq zV={HM*uqdgrl!+~9Oyh#X?HaGZ4yZ5oYV=NQu`nCPS9!C`f<7}zWH;Hd?PuVdhAkS%))IfKD&V z9n7w6vjt4XzcI3kA(-&;PZZ~eN|FKHQtj;d+~EZEgssJP^)>x#gIUmis&B|`h3&Sv zS4LR(zGVjY0bLGP{DSzq2Y9VT*}g&dh%2Yc*J5+HG6;~lBPmKofN;C6D96Y?1|X^a zSgHXyZavG$ac%7q2#VKJPd_T;-UEw}EV|Wlvj`LBi2%F(sh;Yq$4vKhNTIu?o=v4S z#t&c45xel*(PD88?wU>DhDV`R`(YVk9!y$zXS{du^#+WEZoUz3QHvadKn%5v|3j%C zjDw0Tos?bEcU~*gJ>dviH{^^$DfuTVHN=m2Uu$+(UdZI{dwN|mBg+aU|En}_0{C*n zUU2&J8h7OHalorNcHPn2?&4A{^i92=nyPKPWgEyUV+xiT*%~hfYEtW?7-)TIz1NIu z*|SgK4G!1yiYhl$`lrlU=<@kk4nZ?^A1~i2(r;~cjBa}T{igrZ&@}f_gKH`S5JLqrC^N2UqrQ?8^95YsMH*C z&B-xYoPPVw6_pW-aJn37{;{$)B3XO$-lKpujNI+?8BUJLY@iR$WPJ+=N$+_R@RGhE z1$GrBs$kJpm3t2jff{~XhTQI(9Y{jmUTHi_mqyNUo+r0Ica)#Fr4~Pl>GQesH2YpJ zl2bCw`hzh_5Jrifn6<{)sU2YCOEAjIXT-UPJM>itmn`BGcO0EaYw_W&@ zdsM$-7C5_axdd&c6Xe_?$XX_A@fJ-N3c zWGkcM1ZUlqr(VP24C;V!*>BUFUD_uR#tD1ZFy1mZbjqVz$8|ak+4Tmei` zC8QtnPVlSSF{x66rwFtPb{VC<*`f%yn%iBlUC^$^-C@U^>E&?g|;ab$keq%XxRmS{LQL*IMDxdCg zi(h-+zzh#VR77Z_4=yxa^zh@8@OD#)pAXdP^|^9pey@O*1rF7%xk@_G^AnP z^ZLz0IC|dig2lybdz>~93kI3A3yU!x&m&1o(8-w(zZUZhru5ad@4UhXImQhj#eOAg zr6$aWW3Osd6zv)*0rz}45-ZY9$suu%|DGEfLC~Rb?h=I zY*11cKZ0M>iR4D}ethF*7AAz`J@e*vs;yYnaLFlj!FWi|do|B+z~onaD+(g$3*DsBt^hc!`ZU2p0_h93#(gJ0}3fr*)1 z8C3pp6$^~$3{L!Am#ZAe6zfb+aDC68Z>QM20v#kf!2VGFzGF2DZDn)%c|)ju%zRgA zWd22HwAROolh-OZ^c5X_;}i@yuYb!e$ijODqmza68G{M_OM`lu>x{ z98`vhJS;U=$Sat7-t0}Mwv%9iQ0m-wyq#u)^N83KkY~gegm>4}+Icz*h8|^Ju-)bv z2EBJPbq9=Jwt~&+uvi0{;9F%b>`*DK7g7Uc4;f^4j~X4kTs}5lP@24#WT@mzwyyVr zK~Mld=AK4D3#e4J#6Pp?*3Fogd~#bA_-g#hZ!G=Y(M$FTt#!Os3(yE*=q3G|$kM&s zL(iZ8Q-4`{WT`J~(_t9gB&-oB#JO`W!@#SuAtSGXe4QQP`JpQB?I7cE4O?qRHM(q` zbg*i1rNmR*M56P2!K=-0saKr^fNp_c>Pc!h_oE-g`CRWqD&#jIS=yjFZCk$SXWAVW+bKD2E_$t4>{{YZU7yCbl!QhGt^JGZ&yArB5tRB zyK?n^1Qd5x()zs8k1wM;MVG%KcA2`q07LO+JwNpmE<5zG?8*>2vLrbwFICYG+j>di zG(3Q$*b)0U~{sb z@ds4Z_7FGKY8V?a_fJ%Vt~2imJNZ`%Q|%Kbo;KVq&3lIrHCwEV<2U&J?Azt11{(f~ zQT$c^hrPFoi@N*Xh6w?cGC+{#wy7~Ffgx^0M5LsoK_rH57+Sam6$wQ`x*LYBVF)P! zhlZg;nhB%^80y)0|9=1X`F!4!_vkr!9}nh0CiZvjz1Lprx~{c0h?zS|rI^1C|C36B zN*}F8-+F82V|@9Z*nty=GbP9FE5-$vJ1YWWHL+lY9p1bUg>hl*-C}K};L!hWq+B++ zYc$0h;k?$!xtQ*ab)W%86aq$kr^5J#sPK|yIgIycnIab5)M8-Y^@wO(GQEX zL}4HaEVxCisgf@g936x0y)%oJzTo|aq$6$m z(vylx=)dfE89Zt>Ls*+aKIo|}U47;a`6Pe!bOOVx;)Tt*aQBs|*w2+d6I}LXpS4Bc z-mIGJf5WzneGGtSFAc>g=rz9fOP^;yGU#!xKe)*()~pe^d%xsEbPmfl#<9>aY7#H9 z(kri}3JwDS5b8Rua!bQ~e^%v1b21*_cHg>U$|buwAe?j zOJpx~yBAlkz@9BgT>sZzLXz)GWS#nHAAN)#-R+%%z6B0mk1NwCb?20DQG{iO>y_bC zgG!Rhm)S}Rww4n<%Cm@bl->JF=#4{ixna`}Y_4pcs{hzH<|su-eu{m> z>Aw{JUH;3l`epUFmfC6Q);Hjs1Z$}f+kiq12Aee}o3|!EYCTr{wak7i?0+l*$iuhd zmz+QWhl141Nd5TRUA;Z%Dn3zbicAqY+A8jy>}uAvqI-idr9LtfTp`^dj*4(- zsM~pm1`q)pma+PccMQ^-l}pB^SOWBk^_&gaCBwVu?8I`v&vfj4af|am8qKVAd}?T` z1s#GbCK6#^79!*q7DlvZdNmgurrrJo55Oq4Q^ly`#S&;OifMdNQGyY zhvzHVmwNyDq$)<;FFJuYu(pb9zm5pQrKL5U#fT*>pXtkJ!K-w28hfu%%p;5c$oYE& zkHr$q>AU}9563qT0Hi| zxU#1%GV5`eza&2FT~A+fP~-d8S##{6;dzVOg_o@kjPr?HNxKg^>YDgXmxx|k2wt&d zWz@%@l$Qzox9yf#$in$`$s=rwg-G6c30J z;@yI8E!4U%AuF6Fh)WQGxCVVgn>RDKcjt2THyB_1cV!iOM1`7XO zD#ZEczof|8KkruEP+9W#WD_%fX`(3}3swm^`odKl!eM=(V^;mhQ>*nRemifM3qW$pmr+AM1anm2*?N??knu`Ux)Fo{e;Z<{Y?8?Sv`3*wj9LFU{iqG+v0lv%F6k z)r7+Xdt8wh;@11A937scLHO7G@@pK7?YW`ze-YKgGO`o!3!?|f17txRO-i;S4cROk&6@h=>T zQ`A;fAk6Hn0vckke5r-%BAgdD;&P5ASP^;c_s z_w#<8=rfEOx37#b-0@kXgrz7J|Jg|LgA4XRKnDF>R2$yueJ@pZ$_E_OPG9nt^z6MC z?Dq2dZx%bSxlh(a4$;4=WvVlQ*<#Z}5r6gb{L9kbuyxof0mwA+!iOe^MfBfMk>5O@3$8ZGy)Tm0OCO{%(XD z2#V~0tyXg?VcY!eVX?P|_-fkpWQ~SWUTxv&)vs#2D~6X`2oDmz5_{WJF}i9v6A4YL zq0ncX>J=+!(Zi#K3C@K@xWtItk*-5y)Qs0Pz91w$Wd0tVo|h zb5C7fL5j{69cQX#E#|~~fko<{b^5Zz(b#49u=k%02z-+O1xG=24A)T=lXaBwY~f7S z#3VM`m%@4Dozj#YS};9LHd_imLwALkqqnR3_9KtV*pmiwqapk}x98MaF8UWB6<-#5 z@cbPuTaPKU0Xmss187kj17Y1C?|^7?Xz0AKs^!Y)@WK3rcR=bx_ooj~*7x3kgwQ`` zE(NGjEggZ&jssyU9jkEBBE=bMM5kfYJCf&y8H!-rF3_gMxp}{G89FyiMn4FPwe);Z zv^uYG1`R0K4k2OLfBe>H9nIQsjIdocwT8LpG|9fbay@)5=L0|3x?pu0GbVaC(u$0J zkI<;}&GXY7^<~xQ$$?!FJw(UeHvUBN4cDX}%;$A}88_(M2K?E77ikuw?9v-JKJO-a zHhDeK&#(Y;<7r5wlFq^pt_=j&HK3$NNQxr;srlSv)V8Gt#Y6Aw8L@xia=ZrQN&S#l zu>(2HDNwmoYpKS>5@WEV7mZo}s1EhIr}&DL_R3I;Uzbtbk~DyR6)C|@m&n-w%1 zf^7Dv>>8tJgWOJi9L3SfaU%~xG|1##+3xk1`}8%wmQGmVLHj)WLZ*lsX>}P6hWya1 zy!a_G=ZYtDK{WqQ$uB!xQ!hI~sY}U57oqru8H5hkh2WnKB@@m8@YNH>79zWbhPee{ z>RtPXa|%6H^=rawQ5i^wl#GzxYEGXp*lvhI^vONMhiC^Or9ua+hv(w~dUg750Q!sh zWZ4tT`$a=pKjq*27seiq(5$2#T%T&NORy96LJIQHpxjyE=>5OpSo9>2yu>ZCkN)V% zpj(JlDgGjDIF9qqGm|8Iaa+pcLLOMSgV_M+WDtbtD1FypL_7Q~gN{|%>=j!9w^!!X z6W9o}QJ1WR?ph5mELo8axQ#Gd;5N{F&AcrlO515W++J`q|MQaf`3nvS1=rtt-%XYM z0=$UF{lAAxQ%~m>-W_=Du#dF0du!U|YFv_oa!fT)T>J}F>aE-*4MIWp!U#EW3h)b0hRrC`Skr{5}i!9f8V=+*O{&5B5WpFzZX%7Vpc z$f2QiQcXClB5{-}NIilrop>qua7A!u>x;ev2xkn;Nz*jBcfFsvbQ%a z)sO6B#@5iqDG+va#Q!lw=Bq*a4gA9wFGZ`Kk(?}C*^iXQw&Taj>p_-J+)zD$ zY14Yn-uLeRlpvWEi&d3%RL4uOh~z+Du&sRVc>Fb*SjD@xX?b~0{gOFAGiElC!i&5` zn84zyp3Yc+n6#m5rtnnXG65B;JHGUQl21(Xw_Zfaf(DenTPW(xs(>N-WDUd$IBL9x< zZ%N+fSPG~x>s<%2(ak%xfP|ms#%G_#g1C>`CXXJ3RXgpmQreiV z@jkS9CC`L%?@xS8uX(|TGRL7jrlVE)U#vW4alSi7Ay6LRBW<67<=(!-=FaGQdAV(0 zp_l8QtaWMmre7i{>aNGQr8JRUH@f`{%h9d0JrT9zRdL>F)pcY}ok#GM>Ogk0aova4 z_QiVA)meMrZ`Qj(QT_aXw^)k>Xhf-z$GSvw*H?c3$6rzd!;1>nnM1yGx)Ig>pq`vz zx>GBTPbJ%T*b5i}?6PMGF0nxqWlEHMHJ(J^VfK@p}9M zN?4G0%^7Brg95@ zx3%Hf;lyRdi6+UB&@;^SrVJq9bvL%0xb%$K%a?%=-`=4PS-97x4Oxob0Z`jkd7oM( zNkecY53ByCd^g|KX{bG>{lT&lYFNIKgI@7M$T@y%cCowX(>8@)ob|PM!p|~C7ARE_ zSFJK}qoG`Ty84Hm-+E z5!mmWGe$-52s2I1V{|lgro~y513dSchQJZ$hsf)D7yP`Mdvbp93mzu^>qo?lbM2X= zBHs9P!vV1fL@i8vO`AEAD7*$WBWj}Iq@(ZSp^!=03~2wtYb=q*7US=D_ND3&(4md> z5s~zT8nb^vEY{93oJV?nBIUk@-OafeoVl)9@5Z*WKLuB4Fs5!CtQwZ-SJ9j2S zS=r-K-$5Nu0GIf`f8#!21b?2XMXc@Cnn*P$qn7t~QuVb*t2rH+*zG`H3jm67`u-T0 zaUQ#E5)j71^zEU0NL)!0sDUBm?g+#N+rc-h+T@spQyY(I;)aKwqx|@e|5zc-cu}aC zx6_lL<8@ecT0i;A%eQOmHRZ;@J2jul=!sHTD9c*mDNq3zoIPeTo-=&&tG#?}{ zlhlJpRA`=@Ep4!HHO}Zk_-!V#^VWk;z&?Xfi8DEsQeN#$?VonTdsuGHPUHv^{LT2N z#LxI_J<@RZmyR{iD8g%PaIkvXEC-y-@6ym`#O>E{++)VX3s)VB#Mf-%H~gE5f$*R9 zqHFZe99U+&W)om4&S&pJ;FCIwm|Gwgi z`C0c)IOg`i&%e}k<4ST_mSNwTOr6c%B_lWB&4zyH{eteYgpH*MXU(vc{pKTuTkg*e z&P{@dcOGwm-VhAm&@Vr6@J@10sRK#_*Oi}#v&?a8U#A!r}kS4D!*Z# zs-E86;UUOZXs^H)U6TLu!8;|J>0?T{$2tjZqU!j)j1l*#N;4)<^z~?ML$DY;0m(si z-9>+%b;{2^;r$px!PzY51%O#T?=%*kRko0G?Nl1*BHEky!;vQOF60qsJef=HI{6$S zHDu#-F7Ug7^I=8zz>|W6t8M5`(WCAM7VKHox+aH8){vmU={aqA9eNkB$onAj|JlRe zBV_?}GPjgz;xZ-5&xBL(b2i7u`h3lwmpujbe8tW{k#dsyE#d|n7>KOjjb;r%CKSe= zgXi)307Y5Yq_9@A!&Haf{7t^*2mar~Z>pF>icf$r#Tm*aMPqtNMe`a zKhiDi$`k7uUm*%|m?K<;1n9!Y8W+%Cq}&-C{PmXLX0yu5gCM911M07@e{X~YGdwQ1 ze^3+>GX`@=@Q;gAOB>x#i0389v+Wt!)-rq(I0y&$8-B2>c81e{EqlSp@G!IMJtcK_}6xALR zB`txh2^3bFwJOFX6|xnt=WGxXsnOi!wtL9-zCqv18gIWgvY6-$#_I&nsAQT^c$n+R zdu1#;_DeAqV(bKSrni3CrbF3q)CfC2Sk0fK(k&yT%I}lS7!p?gqXK;*!>6aTGN73H z@u)YauQoScb@ueLqUY9N)-md4@*Cma4Z*NKk0NX+Fji6t@|mUV&kUT%ujgJceR3H( z8-1P(sFFVKWc`;sQjSGbC*a4@jj+j>>cPcOfP0)a_b9X3c}FL`3F^qg8B-(#$T}jY zg+*1?S+jHzS3D2n%P=f88@@||u3Cq^pf+XsO=%C09pOq%%j8Oia)Yoa)j!>w=GWj6 z9MG~_qb2J-ob&PA2BRoe)EBw9k#%nfB@7FI=$#WU-!Hj^->_W%32(=%$y7{CI#l%d z{b85R2D#2i9>GV!K}kaoAt0!e*$N!kL^!GhpXCZ20jg(u&gXU4$L}0eMEJ+p_r=3J z#j#Me*0VZ~YNT)$?=!^wd4dP3ow3^Xeap8tr z@vaL1fca)W*_6C3-(#rbI-@~i_a(tuS(G$@)vghHh zJL{vnw@xVNZh`Au64qwokZrl3V4*H|IZElt?d#_>sO2=|)R`32qvV*9RH`0|a6TM* z;i#{zr)N~9qia>Hy{jyoYL0J}p5=7zjc_GC?z_sk!ELMze+_zaw|;nk91cA?lsTxd z>l##~&HX*H;jmOduTgAqW`Z5aIq~P9&c$=KxbWT`G3m16djb00mJ8?i$r+AM4}ygp zUPw-*gYmG+5DpnZl0!s@aDYm2$RIACzKa|L5LoaH0pU^E7Mx)$BZzmU=EG zt(@A(2^NI_zpKJ+6W22g+Y?)?vO7rNQIWLEt{IA@U@>vAGyL%IVEn-y9P5?oyx%!L zHH$ADZDDIk3ubNotZYI}!z;HSeX5ik(-N33TT@H}!VQ@ScHPA8aqj*R4Y9H@2eGqf zCS44M_t~Qb(6%b)51QFk={y@kC}Xmzt{(lG1r~U zt9|DO7a#96gt3hd>3Rgf#rPWTZA%>{5sAoW>)U^U*2x}loOI2fpKTiy=UdPC6=y&2 zMKQ?j&ku4_aC|0bki=tu>d^)vHWY+Wxdv)OO($Ie`)YD056Bq~Do*jIcB{mUT~&#L zBp##dHX?J8N@-=>c5H>?cAOJ3GEHS-YILK0uARx9e3cTar>&>^GGYQ7Pv41Iq_F8` zm^C?mV=6Lv`tM-=eg3Z^o-<#(jY;9hVy6VPAkb(DJUh#up#*$X(q28;2{@h&7FPI5 z>`&w##b7?s17RcR!tMIbB!75}i%n`EhhKhyzV_&KPR1@xoG*Ok#PncdHxb*D>h0}Q zIyD$r)F;z~Y>deHRRycpm{&<&iB3#`RLvG=Nkf212E$zi@AZY-KiFCcaCRy6mnUtr zBQvwDp=YfP(~#$#o=}S)eZ-pEZt=fCTT40|H#|4}Mix3HveX!|@cVZ`XRxpZX!G>d z+xTL~kx796>!=P5Ds9TV`W@vs=(Vg({)va)KWllyH$)u|2MhH?Uar7*f3UL=7bXU3 z&cS>oV#BT>3YHQv&v|y?1Ey8}2gB=aIh*ZAGxg3Tx0dP-A_GV!Y(bxDJ|Q2ynzic7 zlo7oM1{QeoflTp9puCCCvAxam`NSM%$<`3g!Zcu+7`@Y;y2^q|k!|ji9T_VGPU2M` z_M0HYB49IEGuW-*A6t&gajJq!{`(6~Q&id82He&*lb3ZPE(~_%*>;NJPCM?@EUPvp zmVcitmeMBVrcBH@`8w3z3rJ#e?|D_`;s?dcE4KzdS>MjklQU$~Xm0(V;qKNAykc`W znDJA*X!UGh)6cnc##N0b z!Q9ZlVbG}|sLbTF6%h6ix1}Lx{Aa0xT_Z@rkx^a(l zf+ORbF4&+4FClZ5q1y#ym{M8C6KK{DI)RUf5 z&c*qxlHVTuY6J1~iK%|~#yX`gid);!C5A$l;B{8(Nv6;NI;g1qw^@U3SHWp*t6#Z4&M5C+=8Hi>}#c6#_)VVS`wfYfilNScUpEcCNc z5R}iEf)H`d^^Fc%UdYe6 znI-Jexj&1jDsa+0y}As;`iyt)n_|$>>kUUWr_-lj1q~W+ziJu+@&*aaV6kiFrttDq zlemxHtfbt*6G2Ix;+gnl-{)2pSI@Gg)#7d{@qUAX_b2;pk1BZOA%*S;YwZ^Mr_BED zHNSHoXwxz^-RhCedT?7+#@4CTA3G~*bp2j$4}buNz2Qu?L$XPtD#!w-5_dWp#_OZ% zPh;wau75b2mmT_l^Ek4!t^ZUk1$Lid250~HBLA(bAB>ZZS=ddhbrWeoP3kCx=l^5z}J zGdS?>eQ-jT&-x#p4&(if@jUe4FQiZqF~$n`3HU7Zhbm2pd%TX4p^iAFnW686^Rb*P zel+z#gT@8B^jO5J1FxtYxUPQz}zu3>7=o9xl zipQaQy=YZQKlLca`Wwqf;xsc}GLyUO>2_FGWO)@fwd?lu;~SD|i>|>^G$7vs0~yii zBI^Vphojd#uB}ZnhvvY1Zhr(3z@4gFdfkyXBqsb7P$nEUC=5u(%;vTxS4B01Ao!v=pQ8-d(8Ruf|FFK zse)kIJfg{ZbDhTsX*b@zzl1oc9(^g>`Ez*^Qx7jDzPz*2>AC;=&bUP@f_{tp*`Hmj z)fspm^tIkomCw$kb7wC-$gCNrn~_Ofp|8LBY)DA^EB)8T5;ELqrp1Px{!-Fhk{D=RKEHIZn zC;pn>V>OjjKUnM4l}SITo86nUHXISRN5w3!@ow`@oFQ{o_+*g?(!@Hc`J><#B?~&h;!-J z=kT6>&g`(HVQA1j-3ygDe)#In({Hma7B`;KybZqL81N+-PVDEgzi82Ixwbzh#DDen z40{%q*3YjvXRzzQdHCIrzJ+gS$spnX=j+X;yeAiNy+}eK(tB7%Em`J-Kl^YU%%fa@ZW~IaQa~);T<#pS!mW4Vp8j~HkI^}Y9honnc z_DjH-3*$l?8;}+go%wq+Cbr+wOyAZk>|-a)iyp8ZZNoPzY1m>tkypm?WSyTqrHlU* z(+U5`Z9;Ee&7sCtT{)Cwedy*T`2JV!S$F9~(U`GvX1y)-g~#IobJIL3boA#6-~O`# z@v0rI`uo7<`9zpd1+$CGx+!aMP?#*qlJya?cEMcv^5o_$$Ik5e5vco*F zoSA>rs$xZ;_o)aUA`=jh29T1*qhX=&#C6N$i)D>`ED>-Xqg*)0Yg+fUDvJZ zZctg#bZRwGq!f=pE%ovw8$RCZ2&tS%IgwuLy*@6vaZ+UVO|632T2i!$mBq+KyZBoZ zK4os`Yqpx>%x8KoZ+NLc*Wq9j{$RSQ39CRXM6fqC+ODew7#S$pWv{-<83dA?`gi+q zgqN2eextx^+=1U?TIaPt%|wL0&Hmc(7kNPmyNR!_yGK9OqmM@V{HLQj>BZV-9Sfa$?&mVUTJ&jV@s6R4@wLvUL4o;mq6IPPJqnJ;45(cV`4ihw=+!LeVZQH;UkiLilg%kP zu%nJ$DPuc^zbWDs7eod0NUx%-9$ifGJm04<-FKWUQo%CiK zX1T&o6EsRI?SrtrHm4pYGcA9-gEWQ?yLB%ZbFfg+RYjohL{eP6dPk+lpR}pF+tdzl z8vbv7T%sUxA@YFh?*dgX&HYGUZa-lqBc1kyn6PJEm2CXpnd%#p?9nmDb7q1Qj~#_m zknxW2wNILiU3KGkdfh1TF#$7KMz>hp%59Zc(_m=pp03A-b3wluShub7TkD&QSkU(r zw;4z;qvK!?)ClY{kzSuL2*T$M138Z6>2H3?>epGz6DJ?GK^KS6|f{@Jd&c>!;gwlguaAtNYZ#B&TnfC5-d!zzeZneyWvjs#I0U8GvK^; zKTS4M1-r9ey9$4e!5lYpvQWW+HZ_d&kjngc6arud_nxDvN<)ph5!8#r&0i6iibxlt z_Ryut1~M|%XTuh*Gn73x8zz$`Q_;`{8+p+K!uWU^Z3q=?;4uXUmD~Km8w|04hI zY{ZO1U66rjq-DY}gYaBt(+kY<*>NpZpRG6k`krjo^Z1^HXthR$!F?Qyjl0}ko8t1# zt_~f|3DuvhG|7gAsJkXbOe>1meRxCtN-73_|RR7pZkA!)Em6MTag;TKln8;j_(oKdmk%SUOkKdX?-9pF|$x-Jf z%V=>JN7PLcfKZm(dARu@&FLkaqRDFH6q7hTza)E!)LD_gjVE1ei7v3A$AFlQso7=! z$WH=0Quxu2C|bpHFoUwmD&{W^Se-z5X5P5m`jAC!4>$DwP1!h)!eidoEuwD6H|MA4` zKqL9(IqT5lgcLZCd} zOK)v_bV8Qy-6iO)R0BC?(^3-@wX0{v>#%8-K_-Fwlb|`-O<%Sa4Y$sr z2$*DxY|pv(I)J9YRLHQQVBRsqwql%>aym*^H1T$bzWx3I6V)0{*T%i2946pCzlG6w zOK6vf!;_ucpxQjy|4plUk8i4113q9UpGab(9GN){@d0;g(=9A1l*MCqm zedLBFnd6z(+MNgD@B4eZr^7}c_UTpbe-7DApb{Vc*v9z&t~%4Uz>b0MDhalC0O-=~`VTpuj_*mS@*zu1chwKM24(G&ikF7<`15bB#A0;tq{}McuRKL|Gdh8)g3^Zy= z1hJ=9n%_F#(#qALn=-L{i~ch?dJG z!1l4s3$b71Xq6&zJ@)H3I!hR|7u9ZFQZAMVHA<0LzR}IwJP>3|IEJW@US`KVkwI8h zH!v0HW=)fYjuGf=M$CrZ8$UgEdth>v^YB(>o-Z-G>8{ZyV;#0_w;Rp#jBoNBt|=7T zzuCaS1I|IG|Z%rWw~c1dKZ21w+M3-Mneu~3=hegR(5 zQ`MMh&nET|<4dpg@4X*f+atV47KJ=B-*5-KvQNsXXSj?OlbdQb&bh2FXiUh-f`Y?` zC`=R-VvCwgxW73A<`Jz!O(v_Ihip9cK)K`4ca$jUD+vm*+<*&{_aJ>YjjB3Xyjuc4PK z9Hy5;n$~JW2*i6W_4sFS!=tx3?v1#uzrX|g_x$ayR@M_{ZK@N%&SuhoGT=BXPlLOnMR?+@7BuXrd=1`6#qu@1zfl zEp)6j5;`aTaeVW_FkeSb+3@g`%<=<4X52=z3`>EV%@jRV-jM~#6GEz=EU!9b-|hS| zuz%kJ&V{c@Se_i^F0L#Pc>dA0Dsd^yqEAgAnK9gP^T+y~ik_#R7`E)Q*$+#6Qc^`d zj>2CNjdPzj2&Ph8P*`AYU+r+d91sg}e^=2H)&@GR47 zi~thl!55zV?2qUnjGfv>d+&DQ?Y<)_MzOEFjsj#oCk#)}E63k>m<%^_d%vpoY6}=t zd-!L1G`x);eP)yXI#{AiU;A42kZslEpGT_Daq{HIzD5z%? zy=+&qDjxm*A>T84ZtW##SF$2j&|Q_PSa@-9|AJ=ln&2+`i11Gv=QN(dY0Z^Ue!||A zWDT!wZz8NY*=O^5vnMw4`tBm?VLXXKF%K>H zU(<}(>%g^4JGl|^m||*2dr?cpadP(TY1=B@rLdS^M{VoG#zO56sny92aP-&%@hRz_ z0ZwpH&zZrHCjRqWlGhY#BEy8;G(Mb9kSHT(FyJxNexg@$=7;npu{`s z4nT}9w=mpYVf=pYqSToCN3h#pZK<0pG*}NGK$;|oFAH1ta9fsIdcQlNciDs^$P|C1 zOsd-Z_Wfzdd?uf7D2l6;%E?CePe+X6rehx8Uqeqsy;NW;APp}qzl zgBpL=)_7g~;25W9KqZhkTwN!m%l&n1uY%e;nRqB^luCLrxw~D-KBwOE@hs*6KG^a> z|Nce)dPVL@rmTBgKbJY_u?5`URBjNnWjtiIDh*&SZUI5#%F4EhuR)*u&{I)bRi?7( zhr<3LDhrj{lJU~pEg|k%dYDL$DoxRqj4*_q^}Cw{Pu(`1MPZ>}6?1wJnY2n2^Mwr( zswN7z+SeD4zK(!!6WXhWn5|TaR@_q$fTG{L1_6VSasS@Lg9SEfmROz6N=QUc&W{`f zaK7xRcD~oHRSBFUGv)dA*w(BS8E{AXWD$$2d_+w%DeD97P%=a2?3*kN2Tb%9TzOO4G)Yug`Rd0*8vU%Z2hp%ax@q5H_4u(SsL7I81dz1>D9lV_l zOSs%M<-M!sK7I?DpniH53;o@H>ash6nH{ON9a_2$T^_X?S-%t1L`l|f5?*&w4X`i& zncqp3!cNsQ+&WKQTtA#5>RxcT`7|&y5TB3{*izbqfIZ7(dD+DAz(^Z-MsNW-SJw6# z&FdTg6chDK){k}&_{URj9~J5Ca`nWI+((Nc4ty3SB*_a-xGDEiUc`W+BZsJp7`VVJ z?+Rfh{TriQ!mEO$1Nd4(87ymh_AP~tW7D=SSRvREph*a>#Pb=58U--^G~qH_Ss&tl zl=8MjI{>QvV~e_zS=-k=;&{gepm=inh5znWZQ_wz1_+})H9zYVuQLsA)68q_l{OsK zpfJo-;)`{7B>Uj{H+8pT;(G1fXX}W}02Znei|<)5`i1*-<>PMB=+&iM%>LtIihBU! zDwclwo*L^w^raw6L(tbbdEwy}sqNBGj2)-!f~!=+)@Ei;Ii?#+QSoTY;1qx{jJhSlgqe@_t_oDhTYLc%zCy2 zm@{u!|EN+Ulnr3P%8 zu#W~DucAkDY~utIkHcp~;Fh8*C!sbLIyD>txXX$y;q0BN7q@!No3z3#FAX|A?{OE5 zMDCVM3@3X0ez}6$lVRMdnn3CJXg9th9(}Fz=w2Ubw8hb|^Jw;u&gi-~RyMJ@4XGjD zteMNDyxwp}Q*g{OE>G@j=dR9-6)t4V_KP(g$d}Gkt}zO8u(*HL@D%Ye%+d~&pYC>> z-Np=T=n78aP);Bz9U(ZMc*)w3yY$p{$u$B{yeeAtv6w;Z_RQSSLzF?1uMJk`VD&7Q zS$$$W_qX5sV_}DL$ZIV4^DhdI$$jqrgcce4Z&oa#2 zrI?uETZTKh=Y#(`Qs{@_Nf77z&u6zyNtOmVUSd@1 zBP2YmFnd}qHEH4{h%{YYY9Xyko)do&C|`X2C{7sVyT+d&7_0_C_@|)j3&ub`5j*17 z7Rw(=eH~DkL8P3*r4V%Cd(tN((6TEk^50GSgP_Zf^xC)6L<~#NJB`U|Rrv3f*?Fet z4=q!{a2sjK&(}%x;piE6R3UJ0F&3a9zF_VY3$A>)ZCZ6)Z*f7bu|R~jQgg-T1z93u zW$feLIPKTe+IQU)&h(Hob(b!R$(fbo`tQs?=e*_ zW4?k^fjjIwr`N8|MNM|hCbP@(Wmw^lw_~XefW|2y=#tp9RKBR?=pxce4}!uBIb_oim9F-RhR`S3<%2VbA%7eS1Qce?BE_&QBQ#fdrNMw3rY2ujNt2M%gxM# zc+!PCnj+KphlRaIliFLn6>!P{xu8`8yYBXB10)d57k&=}9R0MYrjm}nQrJZLxb2az z$@uZpsE!kciTtdB*H(wCg+UpyN}~4HtLVr`7F7P7me^&{Gqxt0oI;C7e}L9QAlQVHGX&I; zK4Y<|6cAb#L_t+^DctSv8#DYa`EjoY#LwSQ45uI5WkwnHr699(=CvQ+0ql@X?DgjQ z`J4;mM>KJml3P?|JG;p7I8wO;N(X7wcv7T$SaR*k`op}y^y+Nc2m<0k@i6IcL`2w@ zmhvO0)i8x~H?)F12y#(szwaJ>ip}=>bU80(ag(yGP5r2+ee6MOWP!#Saff}<5QbXG zvoKK9@nj1J&|_r0K9+0tCA(vf1I;llc?1{OCqUx@$yfMrnxv0B`F55EAAhrK+OcZG z{S$JvpB3)GzM2ZiBv#P>Q5KSaOZl5n1OzuW`8(+)_GThAkfE$A-bvABztKv~*F9MD z<-xSxK+~nU)dzt23N(Jn5?#X(z%f!p>?pg+-Vt{%q5T5*h|NJOHrQ0*dV+=Bz?YHn zNHqz`AMD5AW_GSKhIch)B+{Wk#!)ybKPR*rmUJOHhiYgZhNDYl0H4KGm{f9kX8r)m z1Iv{->)rP!Ag+o$li%-rq+lX0sXTIpmaWy<5h#^ygG);E_FfPK3;>#$zDrG(_EJ^q zAZZS+(=oVY8!V+Ecuw5=tiNVj9Mj_dvRJ@*<6jAIzf>wNEq<^8n1J~i>4VCFne7pL?s$E!Xgpb(eS;N~QtqKAleO^MT-pd)F(?YvmF8Lu z{quhL5Qe@{nG?I|v;7AHxdk=V_(+ENN-yO&d#LnJ1`aQX4{YVcZYT#o4s=%)XSq%h zC7Emt&VLup<8)cs+^IjPY~nveIrTpyks%9eF`FZpfMh|-Ycbvb>Cnr1Nr+WK>hLJc zF}PVlkNbG1XM)aLG+@W^4@pHvM%fXMb%a2hJwBf?YXBX8I7Usn^RN0LklbQ1uWUS& z+wbx@0Ra`#{f)O4RVDX4zBx{l1joNw(bHE4pS=55GGW^Mc&Tz5T%#vuW#YeUbg5L_ z={L%bQvSaE16cpiKVuw#G%B{P*}_ivB4BPO+v1FvHtFT`1M z`-T2TztN$To0KSMQYLhG#;2YW;}A6P5Jq?9rmz%6&iqF%Ap4eAKGe#f27fV#UAl@G zFJ+TQ)Ia?_yJTATPi0yR#k*_L>%#*=0e9RcEIL1WP3mo z*b5Xsl0KF_%H!C>nXZV2W2I_WObZVu*y$svA?_c`+{GZx^>=$(%0Wg7uEL7ZybXJ( z3IzoBo$l+G$Rk?hg$kkjIz@&iiJD%mS0`;w1Nw&R#$i@;41<*U$BSPI%N2EGJ_9lg z-ccR0&1s51bwVkl|)ts3v;SUM%P_`L@UlXULRU!j2;Sae$$ ziEMR{>dhVNZoEpd8ccq)j{O;5$8*@jox+vX<%*AYu5w?7mI}Pe9T!2Do$I%Spmw~E zuM=CjQ?Cm|j^MzR#L4=lP8OFc-|rThoTiXDP{e?npj~Iw%0+Bb8TcFouyLLvUYulR5-ri$KLd>n$}!16n@X4g69Js?^Tn$(d{d zVu8XcoiZ4Q_A>rBowI&ptfBbfQaRAFH#HJ~4+&ZtZByDC9cnrl4ITes>&P(31X@^S zPk3LvIB9_{fkoU3G*)Jwv-WVL3{+hU{zz}wHUTtJJThN(!5!3jnUEBKzz_Z|_gyWH zv@t34Y%G`Y!TwfbkHvezP4LQTXqvUPp7(sJTMN;@_-|-epKJ>5+S&u}AH3u@AC%sT zwUF5F@B!`$a$!(wdej~veAJuhH@{(#-SDEW=wZwjyF-FHa^oI;{sy;IO?cCtXPS%O z!%FgsGu<6g#{^S&g>8cQ_|&Es;}iXSMEdYSHj_cM7I}o_o+#Ps@If$yo`R)pw8ZB& zfI+k$HamBnW$2c*G{dpQk`;xDGsC}|hvZ*E=1(Y{7dndNjGt}1W7!*xJOI0rU4Z+2 zWh&ds-!V6lMTk$SPHM+e0s&q|r48#^a-N4PdF>xnSme=Pjku5|P$mIL=8#LfPB(=6 zfrO;j>aq94^*tzS7VN3f{mPUMi!NK{0fLC16qhpAtAXaP;$e*X`q9gef(8X-ibycl z_q%{43Z7HoZ#r4tC^w5Uy1Mvoi|_i}*cPsb9)d)Z_>$d;@5XI?W(snfJaz=-*s_=p z%Yz6B{;C!9?v6Dsuqj)vJcmfA16m|6e2QnK6pGH{OG4A=Q%BAD|alFmthsB`zz{a9E+8|(SY zOEMN-OOv7b->DP@9<1O=aa$vagb0>>%2l;rip}%`po!CwC*n9Nuo~9M1hqWid>VfU(cTzbhF?%o; zVjZX^Xi~SeInksT!FK4_c`$;TW9J?&Va&b`;4#zbR|SUkE)C^a(_<-|?~?5CMxws( zCZ=&(#t}xuRVR^&q(o|sktTNz zdy>ve?QYGlg?ibBMjOB}W5+hItMD$Y@nCnRV&CUc-S+Q7uCGhhq&g?d+$2ym9wa2c z^4nqy{!uOzwQ=FJ>&Qn13+><5{Z#EsJMQ|+T75sY4)$M4MR#*8s3Ld^hmItmP3THZ zQT93OJ*l|5nq=Q~_&924*&@=>w>q||yI>_gW%?enHfur^iLuAI9)j2j+gYOBqfRww zq>py9j+2}gdek51hQOd^sfCjOdsj00Yoa8yS4*h54Bis~X4c$pY)L`u+b~)u0iEY^ zxQ`5OQT8j?NtF>leb)^2t!nJJFrcf5Y^>PqTG4NOk$X3cf=O)F#R{K3k0^YgjFZ3^ z`Y6k1i$_vBjmWo^Oxi#PhV49{Yj0#U``uJM5{s?v$YdC)1gFX~;x2Pa3eLiJUcoHS zi#3~bp^wZlkfI z&Y)C`QGh|I>Z5$VrF-4lTK6zvGa=yy*q-67wB)zZBBi;7>cY0;S6x+B9;ZZPBcgpw zKh7EnKs|wyl+~`aW}{gWq%EHqM|ZRDx)xYj7WgKqrYhlqwM){ak{9EC9f=O9jvs;M zhVuH!D;b`sF`vW~6LbkBd@CQXVvyYStSVWxWO8h!dgj5D=}(f=>+Q{A|D7%p$>yz9 zoHC@FZihxJBKa#iu}R9uWoWzV!UG+t2I)lKJ=~P3n1pUVS!l*CfjTE{MpG3k^K9q> z`UAn?llQ@^CNt$?#@fHWmo(L{T8MAREzH{O{>GdZeyB=-7Je@Xn@F9`)-x&8vT$A+ z2++P=b*-Orq2P14iC~DK7ra%MsTlFUn!E0RCbDjivcN6~sEZ)dbX{So5vdkLL`1qv zZvg~BBy>U$LK6@)Ah=Q@AVrZ*=mbLu5v6DXgbqo7Pz*JI(h2Pi;O=|xkMF(j&u{+9 zWbWKM^P6+eIrp?Xb4v*uag+sw3oa2{&m7<#5cS<ZFf){i2yGPS9hv}Cnv#uofV zLvWpQP`{n>HpL-C$Lw%I+(A4r#~5at*_K{cIOJ zyx*q&zW;n$r)j*Wl{;koS|Pe;#@}WVgX%vehhld{2Y%sAXecXgPUxN%g&^1K+F0U2 z$w0*q=}c_u%!Nj|#VB?$|G+uoO}nPSy`WbE97A|AB5jd8=?`p(0cS+pT^#V4t(<&m6L6Y5F2sfJ&5WJID7#DcY_Xtnd-ke^J zL5|C7x%PCgkXPW9MCnMy3PN1tSQZx;IY1A_;hcxSt4LioS42a65^jxP94fbWb>Vea zxjsmViM4~JnT?v zJeV7!-Cx;!_}u*)6-6RpS$&e|#PK@Wrtg!U;_MHv4I2sRN!JE44E#RG=7WBF$8x0;PsI`vbN?X9JUmdY!wVuCNdyJ(r`9 z+fy~C6o<*oXFj9Q4H-mT#12Dwwa3Ebl7*qtRrJH(C!c)b^;Q%b>>@$Ph_(Cx*ST|k6upq(EKS#4+?7>$5CdwgfDU7V zd%+~R_2zwukWOTMhT28?qFglOSw7;Wlpze0Q})>tE|3b9B)*xBfaBmwR9|d zV_C783+&PBNKBc%);dJBEk4Pn5$iH*!gT^^R3$H-rc;se`+&!@DRjTT22upH$dwX1 z0=5ke)c9(L6#Vc#*Z2reh)#ftf>!XnuXae)@FSr>_W^$Hcl0H*EW`9HQWm;1{>Zo| znzMmVt)OXDwv2u+4`l%6m*lie$`#;6PAyaIxl^vngMb1$Rn!#qV8%Jrjua*9m4LYV zhc3qJ0$PP$ehd~YDy{tC4Jb}7gMG4+7*bcdla~W4H=AjxnTmVAWXT3*t)$T1x*2JI zcnz=Vme=3OPhLu*FG>n z3M}g9IBcjn^=!Mk6q@{%m(9E(QE|LN5z@X-4c5(BuSY))QfHPH!hm~M;r&91v6ZFV=< zt|Y($RZ7)b%{sMmFjV?dQ=XGSXnKZ%{olx3-z$E1I~@dfH#_GI>XDziypPH?VWRmD zRP-@ZmQSpQp^T-|g+yU^nd{m=(~8k#tLfbI70KLgK}e>*Qzf1B^XgGOF84e_P5Eq! zZa!7VXIPg};lFaOE4Oyy$-}#0wK8Q?1N&rvVsZeA35))j8~PA=)tOb;Z^7Q!K2Ntm z#GyN%cUI2LpB@l8EUmDg*bW?Rfa*LUH#9D-l@qNep^k{FB&O#j?N$aezUR*;xlf8pc}g>ID~vR-o3Zj+u21heO=@ZF-MtY>lGJAY?gG zk52A2f6S5;eb)Mo)%EQU7UWb|?~v_WUs{LCFPy6K1JKNgF-!DGKVJPEEJW*+d2K^P zEi5pu*Et?%p$K=$BS6WX~)h3nqbjXq&_kZ}V- z*|eI=Y$+_Q<1yv~$mELqGdbLwO(X8#0J8<$BcODo0S2q-*Mzc%R*2;iaJCg4Xy)f$xMlZsEL;MN>BW!)4J*q!HBfwg5$ zXx7~eRsd<#mly&Jg$OW|-RM0gr{FXtDDbHnJDY{WL{Vs$*XKj$CoHykJek97BOXw zO7ZadD?f4m-FwdqYlF<~h4Vn5)A0Ig?b{>Jtx7;n@d9${slATOvNJUcgtH3Q3{e^8 zb4IxuI;m$3rh8Pyc$E>yr^jZyA#R`$To+4v=o$J%_q$`>(8{dg?3e=S^gJO5kPi1O z@SfDKql52#AZjQnN8sB5v~gQCV5UVR!2*JSHUg?ysaH@upj;l=g{*5~Q91 zorCw6eBc8ve>4U5==y-r6S83kn5g_j1IOIV0uVl9>ABhCKH}%~$}1HDN@2IE0>LZN z+BYVuZ6p_OW43iM>6G3jj;kyO$|npEqYY_ zvaYRS9pUmX_@)kGS!RBOD(sImzevQ}4+j%7H0lhS-6fj+r7K$deXH6qjkktdFR}Hm z%9PLKmJyFRj27F5Yqmcf=Jud2Vc+Qw-?&+n9x5$I^fj9sW1+!bpp0vjS5%da2AY{jRBp2@9Zqn$h*X|5v zN|)80v$UH8XaRqxSn&OP<%?FO#J<>m@{}Fl*BMBy@yK)EW>bRE)f}H=&tekn!jzxq zl!ky7Hg;7C=X&KpCjlK?@N?@W^ES1MtBa+{=`Ds=V8O^qF|MhSDo}}-llq6W{}&q6 zg2$Ph&l&0U^1lnKXV*B=nGS){2Z{;6IUwz6HRTN>FStOYAwC+XFtysy9+15sEcQdX z`iHMAU-Gy;RB{Gzl?9y(VAU`@=`(1*ueneeW7N6Ir)dG$>UO&YP~8S0 zsLtgGk3bjlEixIP7eve1Kp3?n2$Rlj`zpVWD-n<*iq6@3`2u&a*USM22l%gES)Cc4 zhVL3Z0YlYjK_$gEXD_vmNT;bOn9vi)QL1579ie!3*^<5%doF`P&0MDB4}yH=vh}S0zhro~fZzN>8Z3 z(j!1}2`=DjCZNKxHvkEBw<4d`2^FO+7}Wa(y=cjoEbhfqhJOZv6-8~od52)wU&*+& zpmZDZtb19zuRnG2LZd_*a5AwQyhgaBjL=CojWZ!4eV<3(12lXy$v0KN}^U5z1RlKi4lr! z$+>i4r{wD=%P6NChf}>(IjP`GyiKfuePpsrgkv}4_F4q z^u4^ohIM7!DvVKeX2z|7v_g; zTGDMIZDzRgAXf@G{-XJ7!tmy{KHu#{&97I!$xKL#*qSkBJcvuxE<45c@%OT360m?R zL%!j^m=1NP#SRjTiUq{K1C__-M(Z_b9ALQy=zSFLa!1bAbV_mGpIwTn@`RsMSH{bi zlUY|+g2sATeADDCdW&wEaA4_I?M4KS-JAnf9oB)5`l5qE_ap9Qyjr|4{`5W-c47uh ziaso5k*bT?aJn;HzX5t2^bk6nv1F~PcmQ`nYh~OZ+<`y?9}D?qm9-$~dL6v;+X<&i zz+|eVPkg1qqe<8&Twf;nNekHi~Sc$1#;uqDY_kj5-fPDFrfQ(r-@ zkZ!1@I45B^@|eTT-D(46ANZ}%j^Ogr#G-u>VZJXS_Sd=yC)>$0h(E>grvC#YcD4A+ z>~Hz`VLO%w3tJ($`|@<=JYGFs)X(OHxRE{JC;VVO!xA$+mR(rY+tluF^Zg<0xYlQ< zbmknJg@K|+ESuT1nIt%*`cm-b)9smuhf~=QL>TWOMybPNs3~=MuKJwGQxD4|-?9hS z1ga|3&j@4yrdz&uiH2(mw~P6OLx4hYcrzuX_VjhTR?D6Ad8TtRkcXY73$m#|+l{Rh zlHBL7{NbuQTkSW03iC-Q;r@JGek2_=t%@zPztXSO?m{#tV693klYP6A$h%yVNpP2e zUBI^L^~e!0>qs9c57E#gOLQUm1WK#W0`1X~}>L5VbY}NU$ zuj>;>wAGX+>>F-UPMDxgr!E7^)#zLsIhKhXZ|iUt9{2^iCr7?mHSeWOB$0h7N1yWNnT|}$Rh1ZDLb-nyr!i~;8qQ*YuHHo zbVKF(2fMum(`WwF?v>Gb)008qNju%|`m-yik+^7U$#i=V$%|aM`Z7Lpl>vP?0wr#9SoD@Ead-BkIDY|LPMujm>9e4yLthb; z_Xtn6_Mubk#`^zx;XX5D8N#Yg_~Fah@9FvvAJ%_B4)kJ_A8AkLoA!ZEExhQi`$QB_ zbAX5c;GD(uiKCDNkb{=dc=SgDAc?=15hb`jEGBc<<&Ri46PFAq4d)2SRIsBOBktSAp<&{jF?|Syt1i z>i%QMT~A;K@Ki^k8kW{KnlX_-9W-Xy$*9ZkWfczFo)DYKJ8UV{>~B=ap*sEJwCHxl zF@b>s4%OW?udu9)M@wW4$Af#rcW=udYrYi05+h@?d#C*HW+0mWbhKEH>(AcXpVYTC zVHCm0$mGMJn6V~CVo5s_>bp)p;hO!Zu-`0C99+r9-(`GkQHWq^Rp05^LuUAmXf+ZJ z?+G!G=W3R7zjpp-@6SRpJP*P)KlMcF|L70lc*?86|M#a(eC(=GrBa7|sgtW8`W?r+ z3XZ?iP3>S0R!3S}seEAqV-G<+g!Z!@b(ejtJC(jlzV$?^lk#<716?qAgm-P^(w zfy!X~_YZb`W$E-l==`C4Z{n0WktHU0ec1j%PV11c`yqPSHl>1U%3Ghrc8@nnF5Lox z$`Zo1onVXA)OdW* zip5b9T@KwWvMyD*fKN1EB)>(AEgiFrpwpMCw)J?j1#I$DOeN^d$u{1-@f;X?ob literal 0 HcmV?d00001 diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotTakServerSectionEnabled_Light_b29dc7a7_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotTakServerSectionEnabled_Light_b29dc7a7_0.png new file mode 100644 index 0000000000000000000000000000000000000000..0d2cc98188ea88697fa581a2e74dbd627b7129a2 GIT binary patch literal 42564 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 CPVIdF literal 0 HcmV?d00001 diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotTakTestCardIdle_Dark_d19fbf1f_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotTakTestCardIdle_Dark_d19fbf1f_0.png new file mode 100644 index 0000000000000000000000000000000000000000..e5039f99d43d1000882da3a4391a34e18a58bab3 GIT binary patch literal 22354 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�zS1B;1sMP}F=fCU$bc}%0i5k$?E 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%0D{ZFS9wy4;D@_+wM z-kA}C{oS6s#(Wbpus>_QP`1Ah4E(_M&!wW_+jXt~K7w#%Sxp_r*F=u|wYlI5?a%Hb zHxeYvr2amX8&V#D?pFLOXD;pk=gotp>Hfd)83GTBN77RBx<+gtr%H4QoFa4YPQ)}p z%e^#0F;~byr4+Q{&^u2||J+{oPa*hz9n3RP1pd4c`wTuxUwoeItNUt_VR?z*f)5#B z&E9tgKW$S!m-aHuyaRUpd@*(HHk}M?RDM~=$Y}9=4S}v$n9&v6@+j?s;(lkn`&8vY z;^0h78-(RPXsEpEKx&xGgyf3N7#UP?t=Qg-)N>736*4X#$7EZI7n^?_{iO3~al6*S z8qxN&P4jan7b*Cto%B*xW-n0C^}ZFUUz?ot|70NjLq~gi>L93l-|4Ij4QR6bzsdCh zXX(Eo4rLIBLy++1u^L2%=TgU8ESqbfQwY0AqsO?z;1N%8;MbOmaX&$bf5=MOngS*R zdbjR$^j86fpONo(<#;Xpq-)7BTb~T*_?Z7khL03<%cDWnTSsStI#-L+&q#Z%TE?B~ zd>(x2?f@z3-bEE)f|VtlS{skIS@gxH}q|4$XiZN+iugDceTDn z03{W!FyCxkQB*0BmBG&uD3@_|uf;7lmDfGK6q&SFe{`rtiV@FDru&)Um!FPUItD3A zFD@wbW5WwJsn|!S`*6fN9D&xDN5`nfB*Jx#jJRX}mB~Ec5g)>fnuBzHY^v-dT<@PR z%Uh|nZJHkA6)T|Su%EJ0IV{4RBT;G;XE*S33>&QEE2EM8xvY~1+CJnO%k?~v*_FQk+CC_(eSzN)aZhl-RsAl};R&3x&l5vRloan1f4K=L%)X7_D z+;CuWCaN3GX;wRJ6?az5zM}w1bXf<*nvVmD++YXDv;`f-X0+#q8;_?Dy+$^<$4&Im zc`27khq$v=4GOr9WScvV5BIu+Ey|{d{$ZN(Y5D02sgkK}+h5!ACqtv4c8C#?_6$Es zSflBqUnA`+zxC$s#(qoo{^qa90h`z%CaJXb=kSV8G-J=|1m~=ok0od|#D2G~v;?kSZBE_6dKU&n7w*WUxf>(kyY8PC?eR|wCxSp*9$HIy80z`4ptqVX-HqR+K@oE{b zKM#r@Yh(67Yeb6m(9-WL>8g(rDZWte5j&#p<0hRqquez2y0acyYNqXXut)_Uw+6a4 ztdHUaXKtMm^K;t|C^qHl4y|GpgTsqMi5@{ z-(O{hc#G8IQ&cJ-s2c4?FZ$|=pWR4FsPP4NX%}iU+ zTB6^5;GXHDt!!j|>Ea{pGCq$q+s*ZlElM#C^3ySdqo?+ZEZ&@zQU49U53>70;hX%( zw)P#~-P?Mu3(eM7cn1r6e5l8T%R~b8k98P0r3&3TgO2wersj)S3CrD8)|bfB{n4cdy);Z zXG$KHzFPEtISv;zBb)!AYX#*Ia*J(>Bg9RqHZ5ybu%l(BX8r6oni!6Sl?Fu{KsL0twi9h) zGt+M$J>~DawfK&{hwx-a?AD?)Kco_|n_Sx#^bSM?BO5Q2cGFA{?xkz(pul3`b}uO# zARBspLrMN>bGlG`O(4J2%)@;`qC8tO z&wIjBVaaiL@lP6=I|R{h1qCLE5{&B5)u5gGJ9YG!nknXM1>^}EzWIo5j?*!&&)N^E zyrJ_|P7|;=en{UUvaJA$)v|oC$B1Jyj=rv;zIr^l{Z+A`Y^DEaK0Ib4$V^QbVdgwt zPoYi-{LN|iea+V{PUk9qy2PB(Rz5K9h=qjZgN=3c$lJfy@|tM%ct~n@(z`7YLa2lT z@%J{Swa_amHu#)Cex4JVr^kv*>odg9|1R*a4r&CQCj5!CuHMkmqC2*-gH1}@=p8-R zm!`#IUu~pj7;6%3UaU?BU4to7iQ2NnvaZ74tgYp6+_6ovO3FYlSoC)afO>rB@t@tn z`*CW4SgW18oy>jTk}D_BJ1mm>fyIxriq>iq*5%LG(vs`G{u%O`^~FLEEo*X&>*a_4 z+7$?jS$ounkGB0J$WvHLyrW#sv#XZ=?!lzLOOBWauA?I6HI(PI>~q|bC<9WApwr06 z;C7t|k4G6L7_7hF6GVwAF_!|M(kpO0SeJ*( zAC2bUFeUf~U5<9Of0O^Ovo8YGfLCxz$_R&DLDeSu%B(yL#o<9jhRmRV9w*_ED7orD zX?tTpaRC=B{;X~xx$01_YWL}hp)-rN&ZBkgj&~LrhHiiCJDm#Q{k@SdOW7@^bjToz zSF6RCz423Q4ZyON%uJ7_4pkZ zwEXW@^Ft3nT{-9=dP2p{889(dZE+z|GyjN~rB!B_=RkQnJbN>e{updACQjrf?&@_f z-tp^PMIweD5?n$i=cf*T80 zl7IZq83X-Dxq^5GF|L^oi$>5JIcu?ZS4*~M&9aDV=GNluE#4mFXB8LGjr_!3*=cr` z);i%Rc!Gn2wkKy)pl9+!Dg3QmD|5XYfxBvA{yNXP!&N>1J9!bcjE9DpoW~FXYD3U3 znKihH^iZOf*&G##yX0127#XxFj~hy{X(s9JS!#mb86GGPqo2H8JmU#)|_-GPkV`tP}CAXjZX zYANq*^xPNEw<)HB$i@ywbInle^OJ{J)9UywJHz}F9jRqp*x-gE4J#uXpE?31rt`7EF+fXIJ!va@L``p$fU`!77xKHaBAFhz`xbdzdaG-a_rDHe=y6kj<-tv; z*6m^Hj;dGo(}Bw9NCt1y&wIc*VEG6uq6y)&#yesUB`Miy)(#IellDIueAJGc3VvIh z*z4EQmXF>^BL(}%2tC(R$FO8c|1$9Z;T@cRH~WwH z1AfmNKPgyzSYpcIO6k0?hg03PxQ`U9R={> z|B-a$w?|r4`Zv8r>osP(YZC>Bg7BsNL6GhgzjNsR{ta6Cs0Gq376RNSabBwNhbP`gp{wVp}=W3R3LjnwD*^sD#6&6No(nzi?Id ze)YACE+1rlf#Au$%8fQbES}fK0+bE@i&PgVB0u&_$htNV)JBfxc(E0oehVTUE=G++ zZ2o#ogmKJ}V9xPK#4-Tj=uSAWxPqwB!P4Vj$UVr^_ z=0uRwpbpVmOlQ5^>!Ft<5Jz9r`+wSe$)4X@gV9r0Q5dYZgS8pbAWH|%3hm#uF zxRgqQpUz~yht#uPvx*mdHTDal+;%KCAHm7y&YSKpzrtUks{HBnv`@Z)YnebjIdj6E zY|3`Zh#$)D7Nd3I1e2HJJ$3X{Zo!#QzsG53NLV{5L-~185Oo?K@@>tgs(#!dPViHo z>v&Kqfi1nf)34%3L?beiX=FutH1N25@RF2%UW_6)*S}c?t}pp1^2F0F>b%s^dO)0S zVVB=|Ga=Y?EDgS-0_o>7M!7`VrmOodgrTY9D!{)Coq5FIwuFF5GNM)0FKPrP!8HFp z3y|K3wAx7H3Oco3E1la39aF)Qf_QWs!n-yM^j3#<7shOewSwnenXy{{XCZ>>x!y!rdw*g6) zxvA9G(ZO@?_MgcII(E2BRtSE|Drm!wtQ}19RxSt#U?3v>rXY=xK?~(KU!-Lg?P6+n zdZv|8)X`X$t&us~G) z=>moCLw%!;JoDShCVZoW;>*B%R-}K>iVwPG`S(7DBxPptV?tB^B#l-{!m3Pc{yibr z;>cBHE1huth;aZbuGvi;8m#Lu3P;T;O4$QQ@xAx)~b$ecHHcE z@Cb6IM7(B#jlN;x$PgED zqEO{}WG!b|^Si4Pbb&5wCWX{8+LaYTtLyc>MoOW}fWeY^lu(+ts6u;ki0-0lcc04% zc2k$T?}m*ufX^FG8E8d72}|D_5RIO{`p#jGh`gz&iCtN5Z?-i5jg$q6nwq%E3q>aX zFWembRYpKURp~~nlNXZ~imX7?GhqV_Cd*|72KOc|Bz(k;(d%!)RG)WzfIx3q?NraYL|!x|}$Z0Q4tSRKPEo z)qRYq2X&RZyN>A$k|@aXACgq^M;nJSX}G|B>wkx>nzt(<(exh&HD03r=kA%9u4FmV zK2Wh(vYNsp3{-FY=j-dt)8{WseWMX=7BWXnjyDecpOmK{&N2?*?lw&$$2E)P|I^9C z*=6Zz$Yo50%jjTH4!Aor+k16#Fln=i-H?>rPYf1)$R$i;Ged4ZpBpEOX#>28Pj;6et1Mu(v%1LP64y@qdlW+N9(2j8Fs+1d#`=8D%9p8cY-}_k z@3|=4RTtkt?BwJdTJ+^qEo^AiHR}ajz|YY8u{^yV!uu@-BRi&mM3-j}i>P%is+50- zAVvb=FQ)M@ODexJ-9OK6H~ju|A!ymEF2{(&u$LBpy=O+LgsN)k-S%B}UVH0RSgNw# zWTGnPzk9r;77%?!>xvhA>Q3Ky>BXp{@6QN$9A@h^`iV}OxDB3t@yl`^^yz-taEf@l z-l_4)bUE?b@E;@YVfG9yvZEG#U{PhT^9<7JnJ~o;l&M7X`mk`8Cb?- z^=hnQksEeg@zAUZ7?DOA;4$oQ5}XQ~FZ{V(ri?gco;5oJAqM$ zdEM?ioHDa_%4Qv^EUTRl8oH-1aKNV=20y>83}PSsy#B#EPzp9SB@kNy2y^R5S;uYS zh!1Ew4O9yX%4U9oOOfy&w+_>+SCr zRhgFjBCyp|5hgytEDRqS=V*6UR<**vm^SAZz>p4)#O6O#{`CfCQxol8v?`rb1u_tx^Qb4cIt ztSj4n{P}YN$cF;e0!i!P@H#y7m3>B-tw{OjMP0+HFF38NkWoQy!zP{SMs6U&eb1G( z3r6HB!r}|<{+SR5T_(3lxo6f3Jp0cJFPKaaZ51l`^dQpH3qHBZg=`peWzFr1$;tJ8 z$_R6eY0I6>{`(Q;^1cyi_Rb=_6p@E9hezrN`ITYchqf7Pu5T2A+WRb@iXG5`P~*Au z>)d+KB8?3Gz!#K#f)9rno~|7ABEe=Xpa$eW$QXc6)gN|GK0E&YN3`mo@KJ-I&mlCYHsf+6a!+l+HF~El#>07D-RvdUbu}qPK=&4ru@6#g!2N zpkHmsuxx3+Z(gRvz))gDcy++&ztLca>kZiN-dksw(v|k8_oLfpNt`&85Y66|TM#j_ zaqfK}n6M=OE%r8@HGb^q=TY}`rDG^2Bmeu>Lc_sFo5;aDm?EqeG@!l*dBc{?10s>DlEvUN1;}N z!tdLlPIdRrh3+wHs>_&nEEb0sS3MpXfLy3ncwJA;VL)QHI@3SMX~<7{z|k#fBBw9$ zSrymT(;Stjo%P@LUv#G?`Cp6Y03?)T8r*abA{MC} zI_YDFg%4eJo!UGNQ;fn}G*|%!L>0G5u%0+LR+I1`CRf^L6q*P=O`ITBZ08w5BCI_9 zg^v&|d{4x7W3OXVkTcg*pE2>yJe=??jaKD)=f@ru`sQ7YV701}=(L4!UR}D`AQE+u ztgoP{#SmgY-mXY*-w>SB5U2{Q@pXwq7ZwuyzH9u7>+J+np9ll3@mztK*UDO)-V7-1 zd(sCBJA8G)%3ab$9Jr+w2Xym!)Zgp~Eli2QnajPdYY+A7op z7I`aEbiJMY5C(v zUa|Px(Su^%S5!Clh3Y-BqM(dvm-QDL?>VPdl%UPv6P3xmc~k3*6xj-H6t83eAldwXvJMI0=` zQ_#sf6Vjao-Lzlggc#x!XF4R+G8!#qV3G1JYMu=CDKAc;-{Y63Jnw#_>v?PG!tDC6 zse#Bl>BrK&CPw(8Dn{T75Ut|XX@6QQZTI<%D3+z^2D&+1<@KJr&f=E4R=a!VE`HC-W!GMqp){4J zTcXPUM?jDo-%t2QSllkF?iy6b0lx^764M&Y7a{t zV;aNUjP=bx&*1B+o*m*`zRASguQTkHw2vJojy^t?m0SfMau#sS4VPKY4UYKeJk^;P zo~i!PIpeaJEY#078f2EjhFWVK$qHw!A1$<`T4)Gl{X7$Az}<0hK)6z4cT^It(L+3p zNw*&;Wv4~wvUTWSQ*tRHD-gS=aj!Q4LLrEwSxI=QEsNUzL05kCN>b>4LEV(rhi~S? zFWXFLAXzb(G!oRinkKcj_nk)K@k`am=$%LCA{rUnI~7+wb5LcQpyA&$oYn1hqq~=P z>g|Heug-!mAJ=znlLFqLTBetVv?)Dnr(fUxf6DvLsHVCuOn4O$ zX(}QbnnUI5nNM_WW~J3Ea3Rkxmm_ zj3fiIi!L|z94Fmr9k<^SXa`jnDgfstf1n|H$e@E-FuTDLQ&9SH&TU=dckvC=FQ*{= zMV>uMPXFJaN%-?RcKuv6%z2h$tqa#4U%UD!;WzNPo6=#?3VrWZ5?V&38vHSjcN-M$pE@-vJ=75xA6$nMw%JMakoKRai;-z;lDXz7 zIrxxeEjyFP0$+5CI1ZaX+F6kvAN}uwzpR9A%ub~hpR8$#pj@!8`mP-SBx(<1uiIz^ zyJFoczF)ho++60~ZJJn)^Q7w<&0WU}S@QMN^}tPZWwnI4-VA)!OO*3Z?^uLh{pp2z z6j~swg6s9p>L0W!p*vw=ubH!UzdqL0+upP<`?>oHJ>ONq zT%!og<}xswN-ucL`O2V$gfS(TMq^9;ubqbz5)&>@|II(a8%xgpVI|Roo~pAtzF!>| z8Zs$~ka*JlZ9I$MwDREdXwV^^oS zA<}X`Uh%Wop)Achi{wNhXDCpG?-~;HX`zAEo0LV28wyYQ=@4^!>pIhytZQ_%B@KbS z{@m`?9gn{|pviLlT;fq@c&eEl#QLgA$>E~lw@IZT((sMZ4cJ_62bW{ulobx|gRuv0 zE#L1vMb{TUjrwJ`S3%6aNN5FkO(FKu`#VSy9MSaP`DsPqtr*2_o8m81c=2Oi_#v=6Yc>wG>vqmWR0+=1n?Zu!o;vq5|HJ@~fwcItc> z8$o8nSpL`G(cP@a(XnCrR1iheMvdl+`-)C1Q2Xkmjuy_kpe{;f-K=HKZxiZ5yD=woNk8Xs3V7ld;6td?r!yd;~*T7 zuoszs4*!&D_8hP}%MvM|E3Ii za4Jx+sNb9P)*M9_al$)8<^xIG9Swe43dWE7N6+Ji2(M6Hl_$Bq-Dv0)?*GIdm$?AE zZ65;unCixfupgL+4)ZELDEnqU93Le;745ODBSvDs)L5IJlYBGLIP=8fphHRgoWm$; zeJrb60<4!qL=L?kug8zTXC$hGYB{FyG9}o@ulqw@p+5yh=p&sky3<~C;l&SBnJ6r) z&ODE>E@7jPFvTaXzF!;~^gf9<_K6T$EN2FS^}!ws3mYPN=@8Gc%68!LxGQ0c&4V>x(^53m9bf;aa9JU1yh1x!|O}pais- ze)S@%EwPY*_$x^<72%!d&QC);nXUGW91gzN!Ok%+q=`(LNGTYhuRZcu$Tv>+NO}95 zN+d_hmxMl_L~8=Q=CUpIPa_p$Et3dyGxQ=u&B7}?gX7F=C3qVQ2M$KpC499dKXWlo zt=Vxet{3iEY(4t8sOAO#a^RcwbWPT*j_K;P5pvbbV4D_g|Jtu78$E^eZ-(JxX?qS8 zG0B?EnXm7Bhk4i%EZpX9I-iLA7AEa3pwlYnYU6>(dt8W9A1}P2+T{+^x9RUthhPf6 zg9`<5nmseucx{^1(ob>5t&8OHbjN#slVy z4B)Bg{r$ggn9*^lCPP6E<9#%593W)W4#xV`neZ?BmmCdw8{qZ;9hAkYd?}^jJS~Xu zod7+abgt$858?V{GI&J>mg`%MmFdL9LNy0_`ho5Fe-rVR`{7ff>c0n|_~C5d`Kobu z4fdi}qFjLIEijz)&g_{i@ox}@)G~f@=a@stu2)vaD}FuA52)gR(kY-Dq$+yN#(gph zq%rTBF>38^lzNiX5AJ;mw2P2MpZ_P41<-qnN4CIPfw&-mMA8GuPX@r9fDo0TzLPqy zONh4h!-O7HG$#)dHqmsg)< z-M&8|5pICL{|#2*>HP&HZNvYczsM2{@bk`00Q7v(o!TPW(-I6MZ%<847H!eR}B0ISdMm1{QDk zDo_Y?gu(>H+?LjQysUmE5*xQm4<;{t27F`R{ZqY8KX!8YXE35NQOl z^hm|#^_5jKWtp!;_I32u!-*@zz9oSa`FTX?E(K|3&9co`{`F)s1C8N**hDXfyj?66 z>?_bN9bVlK>Y<2IQEU5f`%=(`Kc7TvpjDl)_g&QxtXSnWv>8iCJ%As$%+9qHeI z*w7L*0($($UO*FV959}C(-=o8Nz#BGeFvzw6|WM3LshKRzG=*3eGl?zPWXL0oVVEN zG*|uO5@ctBa?;gu80G-rQ|HbuSSp~AWci&>SJx6lGD?Ok;igF6NW%$(<-(@JKZx;- z^1M7=cIw~;GmXz2z=>@uM0cN2}6Fc+5@zm=djVdWx%qn8Z zL<>qbX4gi%u(b^_De77I=}Wxn9;L<4 z2P|m!KQVKO9e)5WE_^Mpwhle@Dix19kzd$nMjDvEy2RMvU5yucZ5NfDLM|WN2eAyA zNCCJOFFH*s&0OYxk%*F~9yp(mmf2*%R(vCI?BV3QS+p|RC%dBBWU{WQ;?Jh#qX?o0 zZzxo@pr$>@i2YC~LH8u93dipFD$x#&$v5UY7p(lA&C4u#d#9{K$h=cY&pHl4e<}EI zI%xc{6H<#`NuAj-za}6k(ssOdkW^Y0ADRL9LC99f(4Sp;m%AUduZy}bQpC>(Y=E#J z?dcDv?;Cdn;*lDlD${@efw5!}`{Y|Y`T z=Y8(G;%@QYwKN5K#E+Y=p1u3YUhFh1vG>KG6PY(bl~OCL+|03(E|z+4vRp|A3M;Vk ziLj%TMqh$h2oy(Bu&OgTzOO5YVt(LGYo^p#FsF}4IV4qh%`x;*3pB=!h*ZG;Qyor9DdT;Cbf69Z*u{ex-UBSZPep{3QaQV|orZoP0|k7ZXmG zEA}8EL9$ytEuE3(phd(ep|l!yC@HyKdvFB`yLQaRl-{4eXS$TckhsNKfBo1| zijH8VS8>z}cQhRtT}ZhQuPtByz=gaMdB@cZG@@eb^&J#Cuu*tj55@T@;hON0sL1GK zKc5ERbA4>>O6UQlJ>>h9_yXCY?1V9rk#2=1Zm0JM4`lC7^*1m8DbFt@ux~gMNp}AF z^13P`pw;m>Qz#<2x~4k5g_C#JGLV^>=%pL;WBB@g;8y`|BmQyZqzBQNcYK3}^)b(2 zh|ls;>+o*vCpwWK>h>ahoX%uLH8vQaX+Vfbum+{GHEGUwhnnBS3egf0sng4=!#p2I zlx<7a^z6!-i0Oc>p>f@L8Z{h=Gp|z0`bO73GC2N$eXzQ%2~<6-^z?meGe0WV6F}B+ ziWNXfMa|0nBQ`{8w}%(_(W~?#UZ@+w@ga3M=YyvC(Tf^A{a?x{SQ;^=k<#0RRj1xH ztG|$EqTzuEt%LyR#>Au^?V1tSbeQ7 z`!c@7;Q5xsV4M8V`gG~3{tbrSvT5R<>eV`d9i+qRB#OV7Ho(_ZMq#T^g4=FNA8dx_ z0L!+CHUde=HqmOJB(`a|>voD%-r@Q^{3^^R^Ym!{z&j2{7se;p=6%$93`;pRq9RT0 ziQAMcYCXo~^~Uo}H^gk@hTmae&m;kTD$Fex@?dS8?$Mv?ZiFip9IS0LB61OIc-xU` zh~|%BR)nb>mB{a*F`x+~5t|O>j>+J-uYWuY<2wdSvpIKCK4xzkLnk2YqpFlxAH)LiD{9cX;Zq<&MCu~#qa>QxOda0IKG2jkO! zB6U5^1@%muA~vmNb>(yXIJJ9eMdteqEFvgf2%`d?X|wz#6Y@aSitNc4cc=V#ZiowW;W*M`pUS6h1fpiA)+jC$M06)vNEzC6UNsMGW&$&dD z6N;~=%ka27FI4dq{;fQJHh2T zdYCO{^Oa7%&A>%}E9L(aDUgT8gpGfh2tC*L^wsj+&nku@$b+MesO&4$_7+lp zcO2-?hNrGlUq}LY+}wG4_GyXYC(xpfxKUII-VN#X{G%2FZ(?gI{yQceQ`#e_9RWQG z;zMfhyLDMYprr9uvO1xbi_Wu*MM+e4ymAU}PlXNp_YS)Ymt9~vcOeQ(fI`5!GfFXy ztm}-`#l7OiV&cl`jw}}H{*D+*J(Mqzs4e2_ef85lK-qrqI<-(K`=$Vg93yGo?tklf>d!Q;^fO&J=;`19yiG*7t*` z`_}HB6Dm&`Q{L*B6Bjpccp75(V@$9h8LR`Jt!EX{Em??b1eqt>U=~w8_8o2=S)%m{ z8^w16ieoP4i=w1SlWLs88%!pYK}>UDB)1Vp_+#fg_4Uk9A6)VCLchK zON6E_Kgu&?g8D>R(Xopn)YSt{!iI0`**~4+%M4wef4JbT<#f=S=G}=PK66^z7qHQu zz70K%8SP>}Fs|P=E`AN}3|w{krR)3@+x?TaqJtM|8&gbMF4V?r)y%;Wx>~-m-uPk# zJXA>C!u;vkmP_}Wl|=XJNI%)G$t_satBX{RW-Xb26sEG#%SZZ@box&WUFlt+6L}Vu zb}l9RMtN9^Wc6=uahBQL7`^8LeVSEVBYb71*qHpMolAHDadGjU1^rMKObju(-l1(T z-M#=k`MJufl$4#kb@-?v@8J42wa%KRZ24AdvW)s5Wr3PUyNxN~hhz3`|2d3cT^=|p z9zqk7%0BOI+CVOEP4EDl8Yim!%;HlPQX|%e^ZL4e1nZ~*)rT?}T5MV@I^{yqywK)@ z&*Z_1o~m6xKdYJY6tpQ947=-gU!h%6m}W!8@T5?&>K_}M#qJ2dn_RMiL*x`=O?kcd zX`Nk{x?r3H-P7nAJ9`uAb;OfZAbzOoJxZir@hAy@!{Bm+>@6dE6@W9r> z^TTgJPHpABa*_XU^#$i-=Z4Tsy+OEJ9M(viy^`MbKvCkfmISOc3Q_;t z*u33Up+_5p;?0bPb#v)Yp{ZCcrN`|Wd8G}iVy#JQ^o)BFDfx|ihq9^Hj`bpAayvA zmeS5Bx9dx-)6ZmYVeAH|o?oOeXbLz|0&o+{$*^eg%Pn&;!s9|)RombM(DUsR;yy=FQ)|gDM zgZHI26|A2ejze}^qp(^pZ5*I%q^}KeW9P}qFJoXT2;_AutV#wA=@hvYDNqz?s>lBt zexWX1<(RsC2uWVXV43NPS^^nuy1ELMQS=}Oy?)E78^E^K(`4Av$q(;QDAZUOuA!DT z{q-zv)HHeTDdtG%NFRnu9Hzuo}?}0kNXbauM*Y|QsEvGl`*0f$J?m%C3N-nAJe$wk&8wAG#5pZHXZ{T zS9siwP09)Rb3V5KcTo642fwo4@NQ3=lyW6&%ML7Z-S-bzJ|b#bV?4BAi~r&m%IjOb zh6zs(_-(c$c^f_THsUeHmHx4*oyWNYp0ri-mjR?xJg~f7=pC#AubcQRur)8j5q;n> zi%uLFL?BB^(@&-o2{M~sBm&2UCShN=wNQ`|ZBm>*QnersJ>3nzBUU9GndZTizS^jL zi@lCH-R@#jm6T1~owP#!f+M)-v!7WA&osVzhy3G!?V)m% z4ZJ*(s=L?D5|v}B4#CCBN)5vBO^5NPN&vrOR!f0dT(wA;x$QQfgOrQRNSG;y$-0_% z)voTpco{j)F6(0qTV#@qznL2XxKRNI5zcz$o=xo9b|wRSMuejMtG3av509q0SmR54 zkdBI!!TOA!szQe8^k9<@rW?LbO)>$Gcr7RZnq3OCv z(!ovAlgt1sDjXOJ^kD65N;{134e^URebHhgy>HkkH!si*7!G<(6uB$J6|+Lj3&3oO z%^cNhD8$O#LBdQ)*bdfFmK9s>LWw{=1djQizE5(IE(c|Fk(5Gl&Dr!@U~veJ^$&^;S|J316lSxiSzCVtJ6VW zm|Is0`<*-kFlmte!{!T&EA4gTo^K;z-LyRRYau^{yiK>@;*UKKC06tVtSy#@=b7Sk zX8@?hT%GchknTNk*pxyqlT=_o;(}wc|7lDB+oP^sE4$C+`bMqxNlUgi?*1ln}^2bx|hC9{Kd?(Nfs3J87D$bb_5mPOy&#cO+$cHgE0Ivt%wrvvJPX zLJv=fqai`rfQSnayyy-8x{Xpz7j5bR5toG=!;6g$dyN5nM;_3*BAP`gx_H%*i|4EO zk@z^<4e=(}?D)Xj;i}4^N}4Lbo0v3Tp;vmY^zNo(S05eZZnR&E_+!4NUv<{ppbE=i zkFd}^{`m3v-@{5t>VID1nK$+}o{$H_OkWB+Vc>hGY8-9UdZqQ$1OO=O&KSp97JC2+ znj@wWkmvUL1;6&P9NI~M$du0_0>CRyhtFKS-0Pfcm+7Q6k1ovXZ#U3!kNIq%434+O z@vf!IE&P?_oeMWPF&*VLfc_5!VX%FyFNV=MQ=rFB*3&8hY>blX-M~N~Qz3KSIM~jh zbo_;ad2z$DGk8=C4=&5T(^J#&98aD-R6L{d9_P17=AhQteZ(1>t({c7BH)Vzn2+Wz}{0}Vq* z#=r^W+*q{7c4a9f)G$o(6z^mpHYRdzhwY|NQSX3WM*4Tr-U9+%0^fSrb-Sv0>z)+u zxcw2}Gy>rWQ?w#4i_qdVHSWEJr3#4qN6L0%zVg^^luYF{-(mp4R&8ld|IoAe8>DP<#)0q8h4YI~ z8#Mf|k0?hf+5oA59rPE3c*e;CNM?fbvl$fls}r8@j<6uK!GCAU(cFS*5nXFeq+Qt8 zuE?#M@NSA7)WjSd#7xHPF{#KfI&!%w=+xjPT(56BahZ3Oc2Vy=q+|hCQSL~D#lx#Q zvd>^)|L}{48<=HW1-FMOJ(a3CiE&Y-=+7b7@_{lyn zER)6lKs=mxS1tdM)39E?4cj;#KR^YpUbnuVLsbt1Sx&;OMr~O8sPQ`O5290d69i4r z&V^EcXdnK4(uF%{x%?&PmxOoGO+Iz%-k%ee!@J9_xy4LYjV%mU@YHF$qPrKAkAPE0 z6MsCSt;7Xv_JAOjp9JW4W&IhYC81mLaoVX^=dQ@;oLMGGNi$;5D$Tpj*@GQ+iM}Mx zi4XUu{y6O$qC!f>ucHp^fN)uc+3^K?Bs&_{@2n83UcqzPrb9+n8iz$$$&C)#@n-2v z#_V6xsT1Tj{bP0(ZrLvdxS&{y1Ur*|qmGBUX`h?JU$4teqPaH&)1&0qKGpA(`ux(5 z==wew_UDJrx&iIezj5zdt8;W5;#%Vt*;{DQ_8)Li3F$;Yj76OR=4R8j#YE4T$sxh$ zzVw|zT2XVz2MOq~Fb|LqXr9_c8iNv&fEad0^kDg9o%+#ZeC>WZx~v5o@a!~<CY;RX|Lx{fJ1OP^vlU4y9mLdvkU+MSV+cp^g0d#cg%q;+v6hfYD#OI~a| z^>SGVcfE_T4k^wQ{I*3}}OkPPx*LojdsgNAwm62@8f-w5K0@iKDy<;i0l!7Qy+m2CWQ z3}m$?xA1C*RrbnNvo7@GFIq)Wv4fbH?8y~D>v8M8D?$za{gAVtrRoLqBVbX!rDD79ui2I>zk zvyI5Xeqd3$3AXt3a&;$5)?Q*IVMvMg2TOL;YK;Z?E9L+@_Vsc`wa6QQWCmdS~4 zd66pO#JuJ_*}U`9?zIOKbwCJv*{MRobXrk$ps6**peM=19@8NNED1XVyzBz$ZnBH# zs6<@Zd{=j}b(`j3TDAEywB6rz0Ni1PNt!Tg=7^9k`ft2wNetZcFmCUMTMyThvSRe3 zZe=zziDt}eed$fFPmw5@pQB?*3nQa=Nzv@*Ms1~rSlet|(=kB+QwK$Y&ynLIctf(Mq}uySPH zqTdW4g+H4>dJQ8md`6;sD4mE%?%5SBa^*A-Y(IG?P~O8(vh(P*pI$|Vh%meH$y}E_ zSQlvzZ66Da4+Ajseb1xwS(asA5|ugciYzQl@8YPnzQXomeHgv~L8z}#5HMq2b_ zWLA7!^$)jc03E5Bs1q%AH{}YpGb6f>aaBaGw)6at4C9p1D|grP9G#0*+eC<0N~@d9h*1NzQ-E0y)5QR zXVcusrD6TDW=2xY5}CTJk}jojuOMAN_7sDVHQ0Yrc=7nnJYy~(r?R>Db8;v;(?nO` zG_OGBZghdRTOFM)UE>t`;vWi@-+=Kn2e&Ns1kP@@vaYzaAg1>rQRNwf$dseqsA0kJ z3hLR)U&HlsC(3FOTzR9cUiOd&i)i`kdkBON+xMTGUGr3-y3}msjf#eUVz7N9>TvsIRT}nTS`v z>x;(^AG>`T)z_ObyI>L7f7MvAd72>YdzjfMy&X_kJW{M(te>})$5hyJMf85vf#opM z*<+jLhI#|h-l%W;_o_a-yPv3DJbpb-!MAooruORUz(*O_>17Jfm7f*My!QVek(bL< literal 0 HcmV?d00001 diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotTakTestCardRunning_Light_b29dc7a7_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotTakTestCardRunning_Light_b29dc7a7_0.png new file mode 100644 index 0000000000000000000000000000000000000000..27dd257d0dc584d967f89550138cd5166b8aa04a GIT binary patch literal 29437 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 100ms" (NFR-003) measurable — what's the measurement point (start/end boundaries)? [Measurability, Spec §NFR-003] +- [ ] CHK038 — Is "30+ minutes" (NFR-002, SC-004) a minimum requirement or typical expectation? Are test conditions specified (Doze, App Standby, background restrictions)? [Measurability, Spec §NFR-002] +- [ ] CHK039 — Is SC-006 ("65+ test methods") a minimum or approximate — does the requirement define what "passing" means for round-trip encoding? [Clarity, Spec §SC-006] +- [ ] CHK040 — Can SC-002 ("compressed PLI < 100 bytes") be measured independently of radio hardware? [Measurability, Spec §SC-002] + +## Scenario Coverage — Edge Cases + +- [ ] CHK041 — Are requirements defined for handling corrupted zstd dictionary data at runtime? [Gap] +- [ ] CHK042 — Is the behavior specified when ATAK sends CoT with coordinates outside valid ranges (lat > 90, lon > 180)? [Coverage, Gap] +- [ ] CHK043 — Are requirements defined for handling duplicate CoT messages arriving via both port 72 and port 78 simultaneously? [Coverage, Gap] +- [ ] CHK044 — Is the XML sanitization scope (FR-010) limited to the 5 characters listed, or does it also address CDATA injection, entity expansion (XXE), or DTD attacks? [Clarity, Spec §FR-010] +- [ ] CHK045 — Are requirements defined for behavior when the mesh network is unavailable but ATAK is connected (buffering vs immediate failure)? [Gap] +- [ ] CHK046 — Is the "50-message cap" (FR-014) justified with sizing analysis — could 50 large CoT messages cause memory pressure? [Clarity, Spec §FR-014] + +## Non-Functional Requirements Coverage + +- [ ] CHK047 — Are memory consumption requirements defined for zstd dictionary loading and decompression buffers? [Gap, NFR] +- [ ] CHK048 — Are battery impact requirements quantified beyond "partial wake lock" — expected drain rate, or max acceptable CPU usage? [Gap, NFR] +- [ ] CHK049 — Are startup time requirements defined for the TAK server initialization? [Gap, NFR] +- [ ] CHK050 — Are requirements specified for TAK server behavior under low-memory conditions (Android LMK threshold)? [Gap, NFR] +- [ ] CHK051 — Is thread/coroutine model specified for concurrent TAK client handling and mesh I/O? [Gap, NFR] + +## Cross-Platform Requirements (KMP Boundaries) + +- [ ] CHK052 — Are iOS stub behaviors explicitly specified — what does TAKServerIos return/throw for each operation? [Completeness, Spec §Source-Set Impact] +- [ ] CHK053 — Is iOS "uncompressed TAK_TRACKER mode" payload size limitation (~225 bytes) clearly stated as a functional constraint (not just an edge case note)? [Clarity, Spec §Edge Cases] +- [ ] CHK054 — Are desktop (JVM) TAK capabilities explicitly defined — is TLS server supported? File writing? What's excluded? [Completeness, Spec §Source-Set Impact] +- [ ] CHK055 — Are expect/actual contract requirements documented — what guarantees must each platform `actual` provide? [Gap] +- [ ] CHK056 — Is the iOS "pending Swift SDK integration" timeline or gating criteria defined, or is it an open-ended assumption? [Assumption, Spec §Assumptions] +- [ ] CHK057 — Are error/fallback requirements defined for when platform actuals are stubs (iOS) — do callers get exceptions, no-ops, or degraded functionality? [Clarity, Gap] + +## Dependencies & Assumptions + +- [ ] CHK058 — Is the TAKPacket-SDK v0.1.3 dependency stability assessed — is it alpha/beta, and are version pinning requirements defined? [Assumption] +- [ ] CHK059 — Is the "firmware version available at connection time" assumption validated — what if radio metadata is delayed or partial? [Assumption, Spec §Assumptions] +- [ ] CHK060 — Is the ATAK "15-second stale threshold" assumption documented with a source reference? [Assumption, Spec §FR-015] +- [ ] CHK061 — Are the bundled certificate requirements specified (validity period, rotation strategy, self-signed vs CA-signed)? [Gap] +- [ ] CHK062 — Is the Android 17+ ACCESS_LOCAL_NETWORK permission requirement validated against published API 37 documentation? [Assumption, Spec §FR-016] +- [ ] CHK063 — Is the "237-byte raw LoRa MTU" assumption sourced to specific radio hardware documentation or Meshtastic firmware specs? [Assumption, Spec §Assumptions] + +## Security Requirements + +- [ ] CHK064 — Are mTLS certificate validation requirements specified — does the server verify client certificates, or only encrypt? [Clarity, Spec §FR-006] +- [ ] CHK065 — Are certificate storage security requirements defined (KeyStore, encrypted preferences, plaintext resources)? [Gap] +- [ ] CHK066 — Is the threat model for local-network-accessible TAK server documented (LAN adversary, rogue ATAK client)? [Gap, Security] +- [ ] CHK067 — Are requirements defined for certificate expiration handling and renewal? [Gap, Security] +- [ ] CHK068 — Is the CoT XML sanitization (FR-010) scope sufficient for the threat model — are XXE and billion-laughs attacks addressed? [Clarity, Spec §FR-010] + +## Cross-Artifact Consistency + +- [ ] CHK069 — Do task IDs in tasks.md map 1:1 to plan.md phase structure without gaps or orphans? [Consistency] +- [ ] CHK070 — Does the plan's "99 files, +4698 lines" scope align with the task count and complexity in tasks.md? [Consistency] +- [ ] CHK071 — Are all 16 bloat elements listed in FR-013 consistent with the CoTDetailStripper implementation described in plan.md? [Consistency, Spec §FR-013] +- [ ] CHK072 — Do research.md technology decisions align with spec dependency choices (TAKPacket-SDK, xmlutil, Ktor)? [Consistency] + +--- + +## Notes + +- Focus: Full-breadth requirements quality across all spec dimensions +- Depth: Standard (PR review gate) +- Audience: PR Reviewer evaluating requirement completeness before merge +- 72 items covering: Constitution (6), Wire Protocol (8), Type Mapping (4), Server Lifecycle (7), Legacy Fallback (5), Consistency (5), Acceptance Criteria (5), Edge Cases (6), NFRs (5), Cross-Platform (6), Dependencies (6), Security (5), Cross-Artifact (4) +- Items reference spec sections where applicable; `[Gap]` markers indicate missing requirements diff --git a/specs/005-tak-v2-protocol/checklists/requirements.md b/specs/005-tak-v2-protocol/checklists/requirements.md new file mode 100644 index 000000000..d3d22f441 --- /dev/null +++ b/specs/005-tak-v2-protocol/checklists/requirements.md @@ -0,0 +1,37 @@ +# Specification Quality Checklist: TAK v2 Protocol Integration + +**Purpose**: Validate specification completeness and quality before proceeding to planning +**Created**: 2025-07-22 +**Feature**: [spec.md](./spec.md) + +## Content Quality + +- [x] No implementation details (languages, frameworks, APIs) +- [x] Focused on user value and business needs +- [x] Written for non-technical stakeholders +- [x] All mandatory sections completed + +## Requirement Completeness + +- [x] No [NEEDS CLARIFICATION] markers remain +- [x] Requirements are testable and unambiguous +- [x] Success criteria are measurable +- [x] Success criteria are technology-agnostic (no implementation details) +- [x] All acceptance scenarios are defined +- [x] Edge cases are identified +- [x] Scope is clearly bounded +- [x] Dependencies and assumptions identified + +## Feature Readiness + +- [x] All functional requirements have clear acceptance criteria +- [x] User scenarios cover primary flows +- [x] Feature meets measurable outcomes defined in Success Criteria +- [x] No implementation details leak into specification + +## Notes + +- Spec was derived from existing PR #5434 and code analysis — implementation is already in progress +- All CoT types identified from test fixtures in the codebase +- Success criteria reference observable user-facing outcomes rather than internal metrics +- Architecture section includes implementation references for traceability but requirements remain behavior-focused diff --git a/specs/005-tak-v2-protocol/contracts/wire-protocol.md b/specs/005-tak-v2-protocol/contracts/wire-protocol.md new file mode 100644 index 000000000..71307bc60 --- /dev/null +++ b/specs/005-tak-v2-protocol/contracts/wire-protocol.md @@ -0,0 +1,184 @@ +# Wire Protocol Contract: TAK v2 Protocol Integration + +## Overview + +The TAK v2 protocol defines two wire formats for transmitting Cursor-on-Target (CoT) events over the Meshtastic LoRa mesh network. This contract documents the encoding, port assignment, and interoperability guarantees. + +--- + +## Port Assignments + +| Port | Protobuf PortNum | Protocol | Firmware Requirement | +|------|-----------------|----------|---------------------| +| 72 | `ATAK_PLUGIN` | TAKPacket (v1) | Any version | +| 78 | `ATAK_PLUGIN_V2` | TAKPacketV2 (v2) | ≥ 2.8.0 | + +--- + +## TAKPacketV2 Wire Format (Port 78) + +### Byte Layout + +``` +Offset Size Field +0 1 Flags byte +1 N Payload (compressed or raw TAKPacketV2 protobuf) + +Total: 1 + N bytes, where (1 + N) ≤ 225 bytes +``` + +### Flags Byte Encoding + +| Value | Meaning | +|-------|---------| +| 0x00 | Compressed with non-aircraft dictionary (ID 0) | +| 0x01 | Compressed with aircraft dictionary (ID 1) | +| 0x02-0xFE | Reserved for future dictionaries | +| 0xFF | Uncompressed (raw TAKPacketV2 protobuf, no zstd) | + +### Compression + +- **Algorithm**: Zstd (Zstandard) with pre-trained dictionaries +- **Dictionary selection**: Based on CoT type — aircraft types (`a-*-A-*`) use dict 1, all others use dict 0 +- **Library**: `meshtastic/TAKPacket-SDK` v0.1.3 (wraps zstd-jni) +- **Max decompressed size**: 4096 bytes (reject larger to prevent memory exhaustion) + +### TAKPacketV2 Protobuf Schema + +The protobuf is defined upstream in `meshtastic/protobufs`. Key payload types: + +| Payload Type | CoT Types Covered | +|-------------|-------------------| +| `pli` | All `a-*` position reports (friendly, hostile, unknown, neutral) | +| `chat` | `b-t-f` GeoChat messages | +| `raw_detail` | All other CoT types (shapes, markers, routes, etc.) | + +#### PLI Payload Fields + +| Field | Type | Scaling | Notes | +|-------|------|---------|-------| +| latitude_i | int32 | × 1e7 | WGS84 degrees | +| longitude_i | int32 | × 1e7 | WGS84 degrees | +| altitude | int32 | meters | HAE | +| speed | uint32 | × 100 | m/s → cm/s | +| course | uint32 | × 100 | degrees → centidegrees | +| cot_type_id | enum | — | Mapped CoT type | +| cot_type_str | string | — | Original type for round-trip (CotType_Other) | + +#### GeoChat Payload Fields + +| Field | Type | Notes | +|-------|------|-------| +| message | string | Chat message text | +| to | string | Recipient UID or chatroom name | +| device_callsign | string | `\|` (UID smuggling) | + +#### Raw Detail Payload + +| Field | Type | Notes | +|-------|------|-------| +| raw_detail | bytes | Stripped inner `` XML (16 elements removed) | + +--- + +## TAKPacket Wire Format (Port 72, Legacy) + +### Byte Layout + +``` +Offset Size Field +0 N Raw TAKPacket protobuf (no header, no compression) +``` + +### Supported Payload Types (v1) + +| Type | Support | +|------|---------| +| PLI (position) | ✅ Full | +| GeoChat | ✅ Full | +| Markers/Shapes/Routes | ❌ Not representable in v1 schema | + +--- + +## TAK Server Protocol (Port 8089) + +### Transport + +- **Protocol**: TCP with TLS 1.2+ (mTLS required) +- **Port**: 8089 (configurable via TAK server standard) +- **Binding**: `127.0.0.1` (loopback) + LAN interfaces +- **Authentication**: Mutual TLS — server presents `server.p12`, client presents `client.p12`, both trust `ca.pem` + +### Message Framing + +CoT events are sent as complete XML documents over the TLS stream: + +```xml + + + + + + + +``` + +Events are framed by detecting the closing `` tag via `CoTXmlFrameBuffer`. + +### Keepalive + +- **Interval**: 10 seconds +- **Format**: Empty ping CoT event (`t-x-d-d` type) +- **Purpose**: Maintain connection below ATAK's 15-second stale threshold + +--- + +## Data Package Format (.zip) + +### Connection Data Package + +Exported for ATAK/iTAK client configuration: + +``` +Meshtastic_TAK_Server.zip +├── meshtastic-server.pref # ATAK connection preferences (XML) +├── truststore.p12 # CA certificate for server verification +├── client.p12 # Client identity for mTLS +└── manifest.xml # MissionPackageManifest v2 +``` + +### Route Data Package + +Generated on receiving end for ATAK route import: + +``` +{route_uid}.zip +├── {route_uid}.kml # KML LineString with waypoints +└── manifest.xml # MissionPackageManifest v2 +``` + +--- + +## Inbound Processing Rules + +| Source Port | Local Firmware | Action | +|------------|---------------|--------| +| 78 (V2) | Any | Decompress → decode → broadcast to TAK clients | +| 72 (V1) | Any | Decode raw protobuf → broadcast to TAK clients | +| 78 (V2) + route type | Any | Decompress → decode → generate KML → broadcast + write file | + +--- + +## Outbound Processing Rules + +| CoT Type | Local Firmware ≥ 2.8.0 | Local Firmware < 2.8.0 | +|----------|----------------------|----------------------| +| PLI (`a-*`) | V2 (port 78, compressed) | V1 (port 72, raw proto) | +| GeoChat (`b-t-f`) | V2 (port 78, compressed) | V1 (port 72, raw proto) | +| All others | V2 (port 78, compressed) | **DROPPED** (log warning) | + +### MTU Enforcement + +- Max wire payload: 225 bytes (after protobuf framing within 237-byte LoRa MTU) +- If compressed payload exceeds 225 bytes: attempt remarks stripping, then drop with warning +- Never fragment; never queue oversized packets diff --git a/specs/005-tak-v2-protocol/data-model.md b/specs/005-tak-v2-protocol/data-model.md new file mode 100644 index 000000000..a049b0048 --- /dev/null +++ b/specs/005-tak-v2-protocol/data-model.md @@ -0,0 +1,249 @@ +# Data Model: TAK v2 Protocol Integration + +## Core Entities + +### CoTMessage (Central Domain Model) + +The primary data model flowing between TAK clients, the TAK server, and the mesh network. + +```kotlin +@Serializable +data class CoTMessage( + val uid: String, // Unique event ID (e.g., "ANDROID-device-uuid") + val type: String, // CoT type string (e.g., "a-f-G-U-C", "b-t-f") + val time: Instant, // Event creation time + val start: Instant, // Event validity start + val stale: Instant, // Event expiry time + val how: String, // How generated (e.g., "m-g", "h-e") + val latitude: Double, // WGS84 latitude + val longitude: Double, // WGS84 longitude + val hae: Double, // Height above ellipsoid (meters) + val ce: Double, // Circular error (meters) + val le: Double, // Linear error (meters) + val contact: CoTContact?, // Contact info (callsign, endpoint) + val group: CoTGroup?, // Team/role info + val status: CoTStatus?, // Battery status + val track: CoTTrack?, // Speed/course + val chat: CoTChat?, // Chat routing info + val remarks: String?, // Free-text remarks + val rawDetailXml: String?, // Preserved inner XML for raw_detail + val parsedDetailXml: CoTDetailXml?, // Parsed structured detail + val sourceEventXml: String?, // Full source XML for round-trip fidelity +) +``` + +### Supporting Detail Models + +```kotlin +@Serializable data class CoTContact(val callsign: String?, val endpoint: String?) +@Serializable data class CoTGroup(val name: String?, val role: String?) +@Serializable data class CoTStatus(val battery: Int?) +@Serializable data class CoTTrack(val speed: Double?, val course: Double?) +@Serializable data class CoTChat(val chatroom: String?, val id: String?, val senderCallsign: String?) +``` + +### TAKClientInfo + +Tracks connected TAK client state. + +```kotlin +data class TAKClientInfo( + val uid: String?, // Client's self-reported UID + val callsign: String?, // Client's callsign (from first PLI) + val connectionTime: Instant, // When client connected +) +``` + +### InboundCoTMessage + +Wraps a CoT message with its source client info for routing decisions. + +```kotlin +data class InboundCoTMessage( + val cotMessage: CoTMessage, + val clientInfo: TAKClientInfo?, // null if from mesh (not local TAK client) +) +``` + +--- + +## Enum Mappings + +### CotType (23 mapped values + fallback) + +| Enum Value | CoT String | Category | +|-----------|------------|----------| +| CotType_PLI_Friendly | "a-f-G-U-C" | Position (friendly ground) | +| CotType_PLI_Hostile | "a-h-G" | Position (hostile) | +| CotType_PLI_Unknown | "a-u-G" | Position (unknown) | +| CotType_PLI_Neutral | "a-n-G" | Position (neutral) | +| CotType_Aircraft_Friendly | "a-f-A" | Aircraft | +| CotType_Aircraft_Military | "a-f-A-M" | Aircraft (military) | +| CotType_Aircraft_Helicopter | "a-f-A-M-H" | Aircraft (helicopter) | +| CotType_Aircraft_FixedWing | "a-f-A-C-F" | Aircraft (fixed wing) | +| CotType_GeoChat | "b-t-f" | Chat | +| CotType_DrawnShape | "u-d-f" | Drawing | +| CotType_Route | "b-m-r" | Route/Navigation | +| CotType_Marker | "b-m-p-s-p-i" | Marker (spot) | +| CotType_Waypoint | "b-m-p-s-p-loc" | Waypoint | +| CotType_Delete | "t-x-d-d" | Control | +| CotType_Casevac | "b-r-f-h-c" | Medical | +| CotType_Emergency | "b-a-o-pan" | Emergency | +| CotType_Alert | "b-a-o-opn" | Alert | +| CotType_Task | "b-i-v" | Tasking | +| ... (+ additional variants) | | | +| CotType_Other | *(any unrecognized)* | Fallback | + +### CotHow (4 mapped values) + +| Enum Value | String | Meaning | +|-----------|--------|---------| +| HOW_HUMAN_ENTERED | "h-e" | Human-entered | +| HOW_MACHINE_GENERATED | "m-g" | Machine-generated | +| HOW_HUMAN_OSINT | "h-g-i-g-o" | Human-generated OSINT | +| HOW_MACHINE_REPORTED | "m-r" | Machine-reported | + +--- + +## State Machines + +### TAK Server Lifecycle + +``` + ┌──────────┐ + │ STOPPED │ + └────┬─────┘ + │ start() + ▼ + ┌──────────┐ + │ STARTING │ (bind port 8089, load certs) + └────┬─────┘ + │ success + ▼ + ┌──────────┐ accept() ┌────────────────┐ + │ RUNNING │◄────────────────────│ CLIENT_CONNECTED│ + │(0 clients)│ │(n clients) │ + └────┬─────┘ └───────┬─────────┘ + │ stop() │ stop() / all disconnect + ▼ ▼ + ┌──────────┐ + │ STOPPED │ + └──────────┘ +``` + +### TAK Client Connection Lifecycle + +``` + ┌──────────────┐ + │ CONNECTED │ (mTLS handshake complete) + └──────┬───────┘ + │ first PLI received + ▼ + ┌──────────────┐ + │ IDENTIFIED │ (callsign + UID known) + └──────┬───────┘ + │ socket error / timeout / client close + ▼ + ┌──────────────┐ + │ DISCONNECTED │ (scope cancelled, removed from list) + └──────────────┘ +``` + +### Protocol Version Selection (per-send) + +``` + ┌─────────────────────────────┐ + │ CoT message from TAK client │ + └──────────────┬──────────────┘ + │ + ┌─────▼──────┐ + │ useTakV2()?│ + └──┬─────┬───┘ + yes │ │ no + ▼ ▼ + ┌───────────┐ ┌───────────┐ + │ V2 Path │ │ V1 Path │ + │ (port 78) │ │ (port 72) │ + └─────┬─────┘ └─────┬─────┘ + │ │ + ┌─────▼─────┐ ┌─────▼─────┐ + │All CoT │ │PLI + Chat │ + │types OK │ │only; else │ + │ │ │drop+warn │ + └─────┬─────┘ └─────┬─────┘ + │ │ + ┌─────▼─────┐ ┌─────▼─────┐ + │Compress │ │Bare proto │ + │(zstd+dict)│ │(no compr.)│ + └─────┬─────┘ └─────┬─────┘ + │ │ + ┌─────▼─────┐ ┌─────▼─────┐ + │Check MTU │ │Send on │ + │≤225 bytes │ │port 72 │ + │else drop │ └───────────┘ + └─────┬─────┘ + │ + ┌─────▼─────┐ + │Send on │ + │port 78 │ + └───────────┘ +``` + +--- + +## Validation Rules + +| Field | Rule | Error Handling | +|-------|------|----------------| +| Compressed payload size | ≤ 225 bytes | Drop packet, log warning | +| Decompressed payload size | ≤ MAX_DECOMPRESSED_SIZE (4096) | Reject packet (memory exhaustion prevention) | +| CoT XML structure | Valid `` root with `` | Parse returns `Result.failure` | +| Latitude/Longitude | -90/90 and -180/180 respectively | Passed through (ATAK validates) | +| Stale time | Must be in future (or extended to MIN_MESH_STALE_TTL for static types) | Extended automatically for routes/shapes | +| Offline queue | ≤ 50 messages, ≤ 5 min TTL | Oldest evicted on overflow; expired purged on drain | +| Port 8089 binding | Must succeed | Server start returns `Result.failure` with user-visible error | + +--- + +## Wire Format + +### TAKPacketV2 (Port 78) + +``` +┌─────────┬────────────────────────────────┐ +│ Flags │ Compressed TAKPacketV2 Protobuf │ +│ (1 byte)│ (variable, ≤224 bytes) │ +└─────────┴────────────────────────────────┘ + +Flags byte: + Bits 0-5: Dictionary ID (0=non-aircraft, 1=aircraft) + Bits 6-7: Reserved + 0xFF: Uncompressed (raw protobuf follows) +``` + +### TAKPacket (Port 72, Legacy) + +``` +┌──────────────────────────────┐ +│ Raw TAKPacket Protobuf │ +│ (no compression, no header) │ +└──────────────────────────────┘ +``` + +--- + +## Key Constants + +```kotlin +const val DEFAULT_TAK_PORT = 8089 +const val MAX_TAK_WIRE_PAYLOAD_BYTES = 225 +const val MAX_DECOMPRESSED_SIZE = 4096 +const val TAK_COORDINATE_SCALE = 1e7 // lat/lon → int scaling +const val DICT_ID_NON_AIRCRAFT = 0 +const val DICT_ID_AIRCRAFT = 1 +const val DICT_ID_UNCOMPRESSED = 0xFF +val OFFLINE_QUEUE_TTL = 5.minutes +const val OFFLINE_QUEUE_MAX_SIZE = 50 +val KEEPALIVE_INTERVAL = 10.seconds +val MIN_MESH_STALE_TTL = 15.minutes +``` diff --git a/specs/005-tak-v2-protocol/plan.md b/specs/005-tak-v2-protocol/plan.md new file mode 100644 index 000000000..9f1c890d7 --- /dev/null +++ b/specs/005-tak-v2-protocol/plan.md @@ -0,0 +1,155 @@ +# Implementation Plan: TAK v2 Protocol Integration + +**Branch**: `tak_v2` | **Date**: 2026-05-13 | **Spec**: `specs/005-tak-v2-protocol/spec.md` +**Input**: Feature specification from `/specs/005-tak-v2-protocol/spec.md` +**Status**: Retroactive — documents existing implementation (PR #5434, 99 files, +4698 lines) + +## Summary + +Upgrades Meshtastic Android's TAK integration from legacy v1 (port 72, PLI + GeoChat only) to TAK v2 (port 78, ATAK_PLUGIN_V2) with zstd dictionary compression and full CoT type coverage. The implementation uses a bidirectional bridge pattern (`TAKMeshIntegration`) that version-gates output based on firmware capability (`Capabilities.supportsTakV2` ≥ 2.8.0) while always accepting inbound traffic on both ports. Compression is provided by the `meshtastic/TAKPacket-SDK` (JitPack) with platform abstraction via expect/actual for iOS stubs. + +## Technical Context + +**Language/Version**: Kotlin 2.3+ targeting JDK 21 (KMP multi-target) +**Primary Dependencies**: TAKPacket-SDK v0.1.3 (zstd compression), xmlutil (CoT XML parsing), Ktor Network (TCP), zstd-jni 1.5.7-7, Okio (I/O), Koin 4.2+ (DI), Kermit (logging) +**Storage**: App-private filesystem for route KML data packages; bundled .p12/.pem certificates for TLS +**Testing**: `commonTest` (9 test classes, 65+ test methods), 40 XML fixture files in `jvmAndroidMain/resources/tak_test_fixtures/` +**Target Platform**: Android (primary), JVM Desktop (secondary), iOS (stubs only) +**Project Type**: Mobile app — KMP module (`core:takserver`) + UI integration (`feature:settings`) +**Performance Goals**: CoT processing < 100ms; compressed PLI < 100 bytes; fits within ~225-byte usable LoRa payload +**Constraints**: 237-byte raw LoRa MTU (~225 usable after protobuf framing); PARTIAL_WAKE_LOCK for CPU keepalive; mTLS on port 8089 +**Scale/Scope**: 28 CoT type mappings, 2 protocol versions, 3 platform targets, 1 new KMP module + UI screen + +## Constitution Check + +*GATE: ✅ All six principles evaluated and satisfied.* + +- **I. Kotlin Multiplatform Core**: ✅ All business logic (TAKMeshIntegration, conversions, type mapper, CoT parser, detail stripper, server manager, models, DI module) resides in `commonMain`. Platform-specific code isolated to: + - `jvmAndroidMain`: TAKServerJvm (JSSE TLS), TakV2Compressor (zstd-jni via SDK), TakCertLoader, TAKClientConnection + - `androidMain`: AtakFileWriter (SAF/private dirs), TakPermissionUtil (runtime permissions) + - `jvmMain`: AtakFileWriter (desktop filesystem), TakPermissionUtil (no-op) + - `iosMain`: TAKServerIos (no-op), TakV2Compressor (uncompressed stub), AtakFileWriter (stub) + +- **II. Zero Lint Tolerance**: ✅ Verification commands: + ```bash + ./gradlew spotlessApply spotlessCheck detekt :core:takserver:allTests :feature:settings:allTests + ``` + +- **III. Compose Multiplatform UI**: ✅ `TAKConfigItemList.kt` uses Compose Multiplatform components (`DropDownPreference`, `SwitchPreference`, `TitledCard`). No direct Android Jetpack Compose imports. Float values use `NumberFormatter.format()` where displayed. + +- **IV. Privacy First**: ✅ No PII/location/crypto keys logged. CoT data stays local to device/mesh. `core/proto` submodule not modified (read-only upstream). Certificates bundled as resources, not logged. + +- **V. Design Standards Compliance**: ✅ TAK config UI uses M3 components (SwitchPreference, DropDownPreference). Cross-Platform Spec: TAKPacket-SDK defines shared wire protocol behavior; Android-specific UI is N/A for cross-platform spec (ATAK integration is Android/JVM-only; iOS uses stubs). + +- **VI. Verify Before Push**: ✅ Local verification: + ```bash + ./gradlew spotlessApply spotlessCheck detekt assembleDebug :core:takserver:allTests :feature:settings:allTests + gh pr checks 5434 + ``` + +## Project Structure + +### Documentation (this feature) + +```text +specs/005-tak-v2-protocol/ +├── plan.md # This file +├── research.md # Phase 0: Technology decisions and rationale +├── data-model.md # Phase 1: Entity models and state machines +├── quickstart.md # Phase 1: Developer onboarding guide +├── contracts/ # Phase 1: Wire protocol contracts +│ └── wire-protocol.md +└── tasks.md # Phase 2 output (/speckit.tasks command) +``` + +### Source Code (repository root) + +```text +core/takserver/ +├── build.gradle.kts # Module config + TAKPacket-SDK dependency +└── src/ + ├── commonMain/kotlin/org/meshtastic/core/takserver/ + │ ├── di/CoreTakServerModule.kt # Koin DI wiring + │ ├── TAKMeshIntegration.kt # Bidirectional bridge (main orchestrator) + │ ├── TAKServer.kt # Platform interface (expect) + │ ├── TAKServerManager.kt # Lifecycle + offline queue + │ ├── TAKPacketV2Conversion.kt # CoT ↔ TAKPacketV2 (v2 protocol) + │ ├── TAKPacketConversion.kt # CoT ↔ TAKPacket (v1 legacy) + │ ├── TakV2Compressor.kt # Zstd compression (expect) + │ ├── TakV2TypeMapper.kt # CoT type string ↔ enum (28 mappings) + │ ├── CoTDetailStripper.kt # Strip 16 bloat elements for MTU + │ ├── CoTXmlParser.kt # Streaming XML → CoTMessage + │ ├── CoTXmlDataClasses.kt # Serializable CoT data model + │ ├── CoTXmlFrameBuffer.kt # TCP stream framing + │ ├── CoTXml.kt # CoTMessage → XML serialization + │ ├── CoTConversion.kt # Shared conversion helpers + │ ├── TakConversionHelpers.kt # Coordinate scaling utilities + │ ├── RouteDataPackageGenerator.kt # Route → KML data package + │ ├── TAKDataPackageGenerator.kt # Connection .zip export + │ ├── TAKModels.kt # Domain models + │ ├── TAKDefaults.kt # Constants and defaults + │ ├── TAKPrefXmlDataClasses.kt # ATAK preference XML schema + │ ├── TakFixtureLoader.kt # Test fixture loading (expect) + │ ├── TakMeshTestRunner.kt # In-app diagnostic runner + │ ├── AtakFileWriter.kt # Filesystem abstraction (expect) + │ ├── XmlUtils.kt # XML escaping (5 special chars) + │ └── ZipArchiver.kt # ZIP creation (expect) + ├── commonTest/kotlin/.../ + │ ├── CoTConversionTest.kt + │ ├── CoTDetailStripperTest.kt + │ ├── CoTXmlFrameBufferTest.kt + │ ├── CoTXmlParserTest.kt + │ ├── CoTXmlTest.kt + │ ├── TAKDefaultsTest.kt + │ ├── TAKPacketConversionTest.kt + │ ├── TAKPacketV2RawDetailTest.kt + │ └── XmlUtilsTest.kt + ├── jvmAndroidMain/kotlin/.../ + │ ├── TAKServerJvm.kt # JSSE mTLS implementation + │ ├── TAKClientConnection.kt # Per-client state machine + │ ├── TakCertLoader.kt # Certificate loading + │ ├── TakV2Compressor.kt # Zstd actual (via TAKPacket-SDK) + │ ├── TakFixtureLoader.kt # JVM resource loading + │ └── ZipArchiver.kt # java.util.zip actual + ├── jvmAndroidMain/resources/ + │ ├── tak_certs/ # Bundled mTLS certificates + │ └── tak_test_fixtures/ # 40 CoT XML fixtures + ├── androidMain/kotlin/.../ + │ └── AtakFileWriter.kt # SAF/private directory writer + ├── jvmMain/kotlin/.../ + │ └── AtakFileWriter.kt # Desktop filesystem writer + └── iosMain/kotlin/.../ + ├── TAKServerIos.kt # No-op server + ├── TakV2Compressor.kt # Uncompressed stub (flags=0xFF) + ├── AtakFileWriter.kt # No-op + ├── TakFixtureLoader.kt # No-op + └── ZipArchiver.kt # No-op + +feature/settings/src/ +├── commonMain/kotlin/.../radio/component/ +│ └── TAKConfigItemList.kt # Compose UI (team, role, server toggle) +├── commonMain/kotlin/.../tak/ +│ └── TakPermissionUtil.kt # Permission interface (expect) +├── androidMain/kotlin/.../tak/ +│ └── TakPermissionUtil.kt # ACCESS_LOCAL_NETWORK (API 37+) +├── jvmMain/kotlin/.../tak/ +│ └── TakPermissionUtil.kt # No-op +└── iosMain/kotlin/.../tak/ + └── TakPermissionUtil.kt # No-op + +core/model/src/commonMain/kotlin/.../ +└── Capabilities.kt # supportsTakV2 (>= 2.8.0) + +core/service/src/androidMain/kotlin/.../ +└── MeshService.kt # PARTIAL_WAKE_LOCK for TAK server +``` + +**Structure Decision**: KMP multi-module architecture. New `core:takserver` module contains all TAK business logic in `commonMain` with platform actuals for TLS, compression, and filesystem. UI lives in the existing `feature:settings` module. Wake lock integration in existing `core:service`. + +## Complexity Tracking + +| Violation | Why Needed | Simpler Alternative Rejected Because | +|-----------|------------|-------------------------------------| +| `jvmAndroidMain` shared source set | TAKPacket-SDK (JitPack) provides JVM-only zstd + protobuf bindings; Android and Desktop share the same JSSE TLS and compression code | Separate `androidMain`/`jvmMain` actuals would duplicate ~500 lines of identical code | +| Regex-based XML stripping (not DOM) | `CoTDetailStripper` uses regex instead of XML DOM to remain dependency-free in `commonMain` and avoid xmlutil dependency for a simple element-removal task | Full DOM parsing adds allocation overhead and requires xmlutil import for a ~30-line utility | +| Branch name `tak_v2` (no prefix) | Pre-existing feature branch; retroactive documentation | N/A — not a new branch | diff --git a/specs/005-tak-v2-protocol/quickstart.md b/specs/005-tak-v2-protocol/quickstart.md new file mode 100644 index 000000000..53ab487bb --- /dev/null +++ b/specs/005-tak-v2-protocol/quickstart.md @@ -0,0 +1,121 @@ +# Quickstart: TAK v2 Protocol Integration + +## Prerequisites + +- JDK 21 +- Android Studio (latest stable) +- `ANDROID_HOME` environment variable set +- Git submodule initialized: `git submodule update --init` +- `local.properties` exists: `cp secrets.defaults.properties local.properties` + +## Build & Test + +```bash +# Full verification +./gradlew spotlessApply spotlessCheck detekt assembleDebug :core:takserver:allTests :feature:settings:allTests + +# TAK module tests only +./gradlew :core:takserver:allTests + +# Quick compile check (no tests) +./gradlew :core:takserver:compileKotlinJvm +``` + +## Module Overview + +The TAK v2 implementation lives primarily in `core/takserver/`: + +| Layer | Location | Purpose | +|-------|----------|---------| +| Business Logic | `core/takserver/src/commonMain/` | All conversion, compression, parsing, server management | +| Platform (JVM) | `core/takserver/src/jvmAndroidMain/` | TLS server, zstd compression, cert loading | +| Platform (Android) | `core/takserver/src/androidMain/` | File writer (SAF) | +| Platform (iOS) | `core/takserver/src/iosMain/` | Stubs (uncompressed mode) | +| UI | `feature/settings/.../TAKConfigItemList.kt` | Config screen | +| Wake Lock | `core/service/.../MeshService.kt` | CPU keepalive | +| Version Gate | `core/model/.../Capabilities.kt` | `supportsTakV2` flag | + +## Key Entry Points + +### Starting the TAK Server + +The TAK server is started via `TAKMeshIntegration.start(scope)` which is called from `MeshService` when a device connects. The lifecycle: + +1. `MeshService.onStartCommand()` → acquires wake lock +2. `TAKMeshIntegration.start(scope)` → wires up three collection jobs: + - Inbound: TAK client → mesh + - Outbound: mesh → TAK clients + - Config: team/role sync +3. `TAKServerManager.start(scope)` → starts TLS listener on port 8089 + +### Adding a New CoT Type + +1. Add enum value to `TakV2TypeMapper` bidirectional map +2. Add test fixture XML in `src/jvmAndroidMain/resources/tak_test_fixtures/` +3. Verify round-trip in `TAKPacketV2RawDetailTest` or `CoTConversionTest` +4. Run: `./gradlew :core:takserver:allTests` + +### Testing with ATAK + +1. Enable TAK server in Settings → Module Configuration → TAK +2. Tap "Export Data Package" → share to ATAK +3. In ATAK: Settings → Network → TAK Servers → Import +4. Verify connection count shows 1 in Meshtastic UI + +## Architecture Flow + +``` +ATAK Client ──TLS──▶ TAKServer (port 8089) + │ + ▼ + TAKServerManager + │ + ▼ inboundMessages + TAKMeshIntegration + │ │ + ┌─────────┘ └──────────┐ + ▼ ▼ + sendCoTToMeshV2() sendCoTToMeshV1() + (fw ≥ 2.8.0) (fw < 2.8.0) + │ │ + ▼ ▼ + TakV2Compressor TAKPacketConversion + (zstd + dict) (raw protobuf) + │ │ + ▼ ▼ + Port 78 (ATAK_PLUGIN_V2) Port 72 (ATAK_PLUGIN) + │ │ + └────────────┬────────────────────┘ + ▼ + Mesh Network (LoRa) +``` + +## Test Fixtures + +38 XML fixture files in `src/jvmAndroidMain/resources/tak_test_fixtures/` covering: +- PLI: 6 variants (basic, full, itak, stationary, takaware, webtak) +- GeoChat: 3 variants (broadcast, DM, simple) +- Markers: 6 variants (2525, goto, goto-itak, icon-set, spot, tank) +- Drawings: 7 variants (circle, ellipse, freeform, polygon, rectangle, rectangle-itak, telestration) +- Routes: 2 variants (3wp, itak-3wp) +- Aircraft: 2 variants (ADSB, hostile) +- Ranging: 3 variants (bullseye, circle, line) +- Others: casevac (2), emergency (2), alert (1), delete (1), chat-receipt (2), task (1), waypoint (1) + +## Dependency Graph + +``` +core:takserver +├── core:repository (mesh packet access) +├── core:common (dispatchers, utilities) +├── core:di (Koin module registration) +├── core:model (Capabilities, domain models) +├── core:proto (protobuf definitions) +├── xmlutil (XML parsing/serialization) +├── TAKPacket-SDK v0.1.3 (zstd compression, JVM only) +├── zstd-jni 1.5.7-7 (native zstd, platform-specific) +├── okio (I/O) +├── ktor-network (TCP) +├── kotlinx-datetime +└── kermit (logging) +``` diff --git a/specs/005-tak-v2-protocol/research.md b/specs/005-tak-v2-protocol/research.md new file mode 100644 index 000000000..7f8991837 --- /dev/null +++ b/specs/005-tak-v2-protocol/research.md @@ -0,0 +1,164 @@ +# Research: TAK v2 Protocol Integration + +**Status**: Complete (retroactive — documents decisions made in PR #5434) + +## R1: Zstd Compression Strategy for LoRa MTU + +**Decision**: Use pre-trained zstd dictionaries via `meshtastic/TAKPacket-SDK` (JitPack v0.1.3) with a 1-byte flags header encoding dictionary ID. + +**Rationale**: +- LoRa MTU is 237 bytes raw (~225 usable after protobuf framing). Standard zstd without dictionaries performs poorly on small payloads. Pre-trained dictionaries (trained on representative CoT samples) achieve 60-80% compression on typical payloads. +- Two dictionaries: `DICT_ID_NON_AIRCRAFT` (0) for general CoT, `DICT_ID_AIRCRAFT` (1) for aircraft tracks (different statistical distribution). +- Fallback: `0xFF` flags byte = uncompressed (for TAK_TRACKER firmware and iOS stubs). + +**Alternatives Considered**: +- LZ4: Faster but worse compression ratio at small payload sizes; doesn't fit complex CoT within MTU +- Custom delta encoding only: Insufficient for free-text fields (remarks, callsigns) +- No compression: PLI fits (~80 bytes) but shapes/routes (500-2000 bytes raw) would never fit + +--- + +## R2: Platform Abstraction for Compression + +**Decision**: Use `expect object TakV2Compressor` with `jvmAndroidMain` actual (full SDK) and `iosMain` actual (uncompressed stub, flags=0xFF). + +**Rationale**: +- TAKPacket-SDK is JVM-only (depends on zstd-jni native library). iOS has no Kotlin/Native zstd binding available. +- iOS stubs emit uncompressed payloads that receiving nodes handle via the 0xFF flags check. +- The `jvmAndroidMain` shared source set avoids duplicating ~500 lines between Android and Desktop. + +**Alternatives Considered**: +- Pure Kotlin zstd implementation: None exists with dictionary support +- Multiplatform C interop for zstd: Too complex for initial release; iOS can add later via Swift interop +- Separate `androidMain`/`jvmMain` actuals: Identical code, maintenance burden + +--- + +## R3: CoT XML Processing Approach + +**Decision**: Use `xmlutil` library for structured XML parsing (`CoTXmlParser`) and regex for detail stripping (`CoTDetailStripper`). + +**Rationale**: +- `xmlutil` is the standard KMP-compatible XML library, supports serialization and streaming. +- Detail stripping needs only element removal (not DOM traversal), making regex simpler and allocation-free. +- The regex approach handles multi-line elements with dot-matches-all mode. + +**Alternatives Considered**: +- Full DOM for everything: Higher memory allocation, unnecessary for simple element removal +- String manipulation without regex: Fragile with nested elements and attributes +- SAX streaming for stripping: Overcomplicated for "remove known elements" pattern + +--- + +## R4: TLS Server Architecture + +**Decision**: JSSE `SSLServerSocket` with mTLS in `jvmAndroidMain`, exposed via `TAKServer` expect interface. + +**Rationale**: +- ATAK/iTAK clients expect standard TAK Server protocol: TLS on port 8089 with mutual certificate authentication. +- JSSE is available on both Android and Desktop JVM; no additional dependencies needed. +- Per-client `TAKClientConnection` with its own `CoroutineScope` (SupervisorJob) prevents one dead connection from cascading. +- `BufferedOutputStream` + `writeMutex` prevents XML stream corruption from concurrent broadcasts. + +**Alternatives Considered**: +- Ktor server: Heavier dependency for a simple TLS socket listener +- Netty: Not KMP-compatible, overkill for <10 concurrent connections +- Raw sockets + manual TLS: Error-prone certificate handling + +--- + +## R5: Version Gating Strategy + +**Decision**: Runtime firmware version check via `Capabilities.supportsTakV2` (≥ 2.8.0) evaluated per-send to pick up firmware upgrades without app restart. + +**Rationale**: +- Mixed-firmware deployments are the common case during upgrade cycles. +- Per-send evaluation (not cached at connection time) handles the edge case of firmware OTA during an active session. +- Inbound path always listens on both ports (72 and 78) regardless of local firmware — ensures no data loss. + +**Alternatives Considered**: +- Compile-time feature flags: Can't handle mixed deployments +- User-configurable protocol selection: Too error-prone; auto-detection is strictly better +- Connection-time-only check: Would miss mid-session firmware upgrades + +--- + +## R6: Route Interoperability (KML Bridge) + +**Decision**: Generate KML data packages for route CoT events because ATAK's route CoT handling has limitations. + +**Rationale**: +- ATAK can import routes from KML files placed in its monitored data package directory. +- Route CoT over mesh preserves the waypoint data; KML generation on the receiving end enables ATAK to display the full route with navigation capabilities. +- Uses `MissionPackageManifest v2` format compatible with both ATAK and iTAK. + +**Alternatives Considered**: +- Rely on ATAK's native route CoT handling: Incomplete (doesn't render full route UI) +- Custom ATAK plugin: Out of scope; Meshtastic is a standalone app +- Route fragmentation across multiple mesh packets: Exceeds complexity budget and unreliable over LoRa + +--- + +## R7: Offline Message Queue Design + +**Decision**: 50-message cap with 5-minute TTL, auto-drained on client reconnect. + +**Rationale**: +- Brief disconnections (screen off, ATAK restart) are common in tactical environments. +- 50-message cap prevents unbounded memory growth if mesh traffic is high. +- 5-minute TTL ensures stale tactical data doesn't replay (CoT has its own stale mechanism but queue provides defense-in-depth). +- `onClientConnected` callback triggers immediate drain. + +**Alternatives Considered**: +- No queue (drop all): Loses critical tactical updates during brief disconnects +- Unlimited queue: Memory exhaustion risk on constrained Android devices +- Persistent (disk) queue: Overkill; 5-minute window doesn't warrant I/O complexity + +--- + +## R8: Wake Lock Strategy + +**Decision**: `PARTIAL_WAKE_LOCK` held for entire MeshService lifecycle when device is connected. + +**Rationale**: +- Android's Doze mode throttles CPU, which kills keepalive timers and socket I/O for the TAK server. +- `PARTIAL_WAKE_LOCK` keeps CPU active without keeping screen on. +- Foreground service alone is insufficient — OEMs (Samsung, Xiaomi) aggressively throttle even foreground services. +- Reference-counted=false allows unconditional release on service stop. + +**Alternatives Considered**: +- WorkManager periodic wakeup: 15-minute minimum interval, too slow for 10-second keepalives +- AlarmManager: Deprecated for this pattern; complex and battery-unfriendly +- No wake lock (foreground service only): Tested and fails on multiple OEM devices + +--- + +## R9: CoT Detail Stripping for MTU Compliance + +**Decision**: Strip 16 known bloat XML elements before compression to maximize payload fit. + +**Rationale**: +- ATAK adds many display-only elements (color, strokeColor, usericon, model, __video, fileshare) that are irrelevant for mesh relay. +- Stripping before compression (not after) gives the compressor cleaner input and smaller output. +- Elements stripped are purely cosmetic; receiving ATAK clients reconstruct display from CoT type and position. + +**Alternatives Considered**: +- Strip nothing, rely on compression alone: Shapes with rich detail regularly exceed MTU even compressed +- Strip everything except position: Loses contact/callsign/remarks which are tactically critical +- Configurable strip list: Over-engineering for v1; the 16 elements are well-established as non-essential + +--- + +## R10: Android 17+ ACCESS_LOCAL_NETWORK Permission + +**Decision**: Request `ACCESS_LOCAL_NETWORK` on API 37+ with user-visible error if denied, using platform-specific `TakPermissionUtil`. + +**Rationale**: +- Android 17 restricts apps from binding to localhost/LAN ports without explicit permission. +- The TAK server binds to `127.0.0.1:8089` — requires this permission. +- Graceful degradation: server simply doesn't start if permission denied; UI shows actionable error. + +**Alternatives Considered**: +- Always request regardless of API level: Permission doesn't exist pre-API 37; would crash +- Skip permission and catch bind failure: Unclear error message for users +- Use a different IPC mechanism: ATAK expects standard TCP/TLS on 8089; non-negotiable diff --git a/specs/005-tak-v2-protocol/spec.md b/specs/005-tak-v2-protocol/spec.md new file mode 100644 index 000000000..4946edcc2 --- /dev/null +++ b/specs/005-tak-v2-protocol/spec.md @@ -0,0 +1,220 @@ +# Feature Specification: TAK v2 Protocol Integration + +**Feature Branch**: `tak_v2` +**Created**: 2026-05-13 +**Status**: Draft +**Input**: User description: "TAK v2 protocol support with zstd compression, extended CoT types, legacy fallback, and ATAK/iTAK interoperability" +**Cross-Platform Spec**: Android + JVM (desktop) with iOS stubs; wire protocol defined by [TAKPacket-SDK](https://github.com/meshtastic/TAKPacket-SDK) (external SDK, not a `design/features/` doc) + +## Summary + +This feature upgrades the Meshtastic Android app's TAK (Team Awareness Kit) integration from the legacy v1 protocol (port 72, PLI + GeoChat only) to the new TAK v2 protocol (port 78, ATAK_PLUGIN_V2) with zstd dictionary compression and support for all CoT payload types. The upgrade enables Meshtastic mesh radios to relay rich tactical data—markers, routes, drawn shapes, emergencies, tasks, and ranging—between ATAK/iTAK clients, not just position reports and chat messages. The system auto-detects firmware capability and falls back to v1 for older radios, ensuring backward compatibility in mixed-firmware deployments. + +## Goals + +1. **Full CoT type coverage**: Support all standard CoT event types over mesh — including PLI, GeoChat, Marker, Route, DrawnShape (circle, ellipse, freeform, polygon, rectangle, telestration), Aircraft, Casevac, Emergency, Task, Ranging, Alert, Delete, Chat Receipts, and Waypoints — not just PLI and GeoChat. TakV2TypeMapper covers 23 CoT types + 4 HOW types + a default CotType_Other fallback (28 total mappings) +2. **Efficient wire encoding**: Use zstd dictionary compression and CoT detail stripping to fit rich CoT payloads within the LoRa MTU constraint (237 bytes raw, ~225 bytes usable after protobuf framing overhead) +3. **Backward compatibility**: Auto-detect firmware version and gracefully fall back to legacy TAKPacket (v1) for radios running firmware < 2.8.0 +4. **Reliable TAK server operation**: Maintain a local TLS/mTLS TAK server that ATAK and iTAK clients can connect to, with wake lock protection against Android battery optimization +5. **Route interoperability**: Bridge ATAK's route CoT limitation by generating KML data packages for auto-import into ATAK's monitored directory + +## Non-Goals + +- Implementing a full TAK Server with mission sync, federation, or enterprise features +- Supporting TAK protocols over non-mesh transports (WiFi direct, Bluetooth peer-to-peer) +- Modifying the Meshtastic firmware or protobuf schema (consumed read-only from upstream) +- Providing a standalone TAK client UI within the Meshtastic app (ATAK/iTAK remain the clients) +- Supporting CoT streaming to remote TAK servers over the internet + +## User Scenarios & Testing *(mandatory)* + +### User Story 1 - Send Rich Tactical Data Over Mesh (Priority: P1) + +A TAK operator using ATAK connects to the Meshtastic app's built-in TAK server and drops a marker, draws a shape, or creates a route on the ATAK map. The Meshtastic app converts the CoT event into a compressed TAKPacketV2 and transmits it over the mesh. All other mesh nodes with TAK-connected clients see the marker/shape/route appear on their maps. + +**Why this priority**: This is the core value proposition — extending TAK's situational awareness beyond PLI to include all tactical overlays over LoRa mesh. + +**Independent Test**: Connect two Meshtastic radios (firmware >= 2.8.0) each with ATAK connected. Drop a hostile marker on one ATAK instance and verify it appears on the other with correct type, icon, and position. + +**Acceptance Scenarios**: + +1. **Given** two mesh nodes running firmware >= 2.8.0 with ATAK clients connected, **When** a user places a marker (type a-h-G) on one ATAK instance, **Then** the marker appears on the remote ATAK with correct hostile type, position, and callsign within one mesh transmission cycle +2. **Given** a mesh node with firmware >= 2.8.0, **When** an ATAK user creates a route with 3 waypoints, **Then** the route is transmitted over port 78 and a KML data package is generated on the receiving node for ATAK import +3. **Given** a TAKPacketV2 payload exceeding the ~225-byte usable mesh payload after compression, **When** the system attempts transmission, **Then** it drops the packet and logs a warning rather than fragmenting or corrupting the message + +--- + +### User Story 2 - Legacy Fallback for Mixed Firmware (Priority: P1) + +A team has a mix of older radios (firmware 2.7.x) and newer radios (firmware 2.8.0+). The app detects each radio's capability and uses the appropriate protocol version. Legacy radios still relay PLI and GeoChat. Newer radios exchange all CoT types. + +**Why this priority**: Mixed-firmware deployments are the reality during any firmware upgrade cycle; breaking backward compatibility would render the feature unusable for most teams. + +**Independent Test**: Connect one node with firmware 2.7.x and verify that PLI and GeoChat still work via legacy port 72, while markers/shapes are dropped with a user-visible warning. + +**Acceptance Scenarios**: + +1. **Given** a radio running firmware < 2.8.0, **When** an ATAK user sends a PLI update, **Then** the app encodes it as a legacy TAKPacket on port 72 (ATAK_PLUGIN) +2. **Given** a radio running firmware < 2.8.0, **When** an ATAK user drops a marker (non-PLI, non-GeoChat CoT), **Then** the app drops the event and logs a warning indicating the legacy protocol does not support this type +3. **Given** a radio running firmware >= 2.8.0, **When** a legacy TAKPacket arrives on port 72 from an older mesh node, **Then** the app correctly decodes and forwards it to the connected ATAK client + +--- + +### User Story 3 - TAK Server Lifecycle and Reliability (Priority: P2) + +A user enables the TAK server from the Meshtastic app settings. The server starts, accepts ATAK/iTAK connections via mTLS on port 8089, and remains operational even when Android applies battery optimizations. Users can also export connection data packages so clients can configure themselves. + +**Why this priority**: Without a reliable always-on local server, TAK clients cannot maintain connectivity, making all other features unreliable. + +**Independent Test**: Enable TAK server from settings, connect ATAK via the exported data package, verify connection persists after screen off for 10 minutes. + +**Acceptance Scenarios**: + +1. **Given** the TAK server is disabled, **When** the user enables it in settings, **Then** a TLS listener starts on port 8089 and the UI shows the server as active with 0 connected clients +2. **Given** the TAK server is running with ATAK connected, **When** the device screen turns off and battery optimization activates, **Then** the partial wake lock keeps the CPU active and the ATAK connection is maintained +3. **Given** the TAK server is running, **When** the user taps "Export Data Package," **Then** a valid .zip data package is generated containing server certificates and connection configuration importable by both ATAK and iTAK + +--- + +### User Story 4 - TAK Configuration UI (Priority: P2) + +A user navigates to the TAK module configuration screen to enable/disable the TAK server, select their team color and role, export data packages, and run diagnostic tests to verify mesh-to-TAK connectivity. + +**Why this priority**: Users need a way to configure and troubleshoot TAK integration without command-line tools. + +**Independent Test**: Navigate to Settings > Module Configuration > TAK, toggle server on/off, change team/role, and verify settings persist across app restart. + +**Acceptance Scenarios**: + +1. **Given** the user is on the TAK configuration screen, **When** they select a team color and role, **Then** outgoing PLI packets include the selected team and role values +2. **Given** the user taps "Run Test," **When** the test runner executes, **Then** results show per-CoT-type byte sizes and success/failure status for each fixture + +--- + +### User Story 5 - Inbound Dual-Path Tolerance (Priority: P3) + +A v2-capable node receives packets from both v1 (port 72) and v2 (port 78) mesh traffic. All inbound traffic is decoded and forwarded to connected TAK clients regardless of the local radio's firmware version. + +**Why this priority**: Ensures no tactical data is lost in mixed deployments where some nodes only send v1. + +**Independent Test**: Send a legacy TAKPacket (port 72) to a node running firmware 2.8.0+ and verify the connected ATAK client receives the PLI. + +**Acceptance Scenarios**: + +1. **Given** a node with firmware >= 2.8.0, **When** it receives a TAKPacket on port 72, **Then** the packet is decoded and broadcast to connected ATAK clients as valid CoT XML +2. **Given** a node with firmware >= 2.8.0, **When** it receives a TAKPacketV2 on port 78, **Then** the packet is decompressed, decoded, and broadcast to connected ATAK clients + +--- + +### Edge Cases + +- What happens when zstd decompression produces a payload exceeding MAX_DECOMPRESSED_SIZE? → Packet is rejected to prevent memory exhaustion +- What happens when the TAK server port 8089 is already in use? → Server start fails gracefully with user-visible error +- What happens when a CoT XML contains malformed or hostile content (XML injection)? → XML is sanitized/stripped before processing; CoTDetailStripper removes 16 known bloat elements before mesh transmission +- What happens when ATAK sends a CoT type not recognized by TakV2TypeMapper? → Falls back to CotType_Other with the raw type string preserved for round-trip fidelity +- What happens when an uncompressed packet arrives (flags byte 0xFF from TAK_TRACKER firmware)? → Treated as raw protobuf, bypassing zstd decompression +- What happens when the user denies the ACCESS_LOCAL_NETWORK permission on Android 17+? → TAK server cannot bind to localhost; server start fails with a user-visible error explaining the permission requirement +- What happens when a connected ATAK client disconnects and reconnects within 5 minutes? → Offline message queue (50-message cap, 5-minute TTL) replays missed messages on reconnect +- What happens on iOS where zstd compression is not yet available? → iOS uses uncompressed TAK_TRACKER mode (flags=0xFF); payloads exceeding ~225 bytes (the usable mesh MTU) are dropped, which in practice limits iOS to PLI, simple GeoChat, and small markers + +## Architecture + +### Key Components + +| Component | Module / File | Purpose | +|-----------|---------------|---------| +| TAKMeshIntegration | `core/takserver/…/TAKMeshIntegration.kt` (commonMain) | Bidirectional bridge between TAK server and mesh network | +| TAKServer | `core/takserver/…/TAKServer.kt` (commonMain expect) | Platform-agnostic TLS listener interface for ATAK/iTAK connections | +| TAKServerJvm | `core/takserver/…/TAKServerJvm.kt` (jvmAndroidMain actual) | JVM/Android TLS server implementation | +| TAKServerIos | `core/takserver/…/TAKServerIos.kt` (iosMain actual) | iOS stub server implementation | +| TAKServerManager | `core/takserver/…/TAKServerManager.kt` (commonMain) | Lifecycle manager for the TAK server (start/stop/broadcast) with 10-second keepalive interval | +| TAKPacketV2Conversion | `core/takserver/…/TAKPacketV2Conversion.kt` (commonMain) | CoTMessage ↔ TAKPacketV2 conversion for all CoT types | +| TAKPacketConversion | `core/takserver/…/TAKPacketConversion.kt` (commonMain) | Legacy CoTMessage ↔ TAKPacket (v1) conversion (PLI + GeoChat) | +| TakV2Compressor | `core/takserver/…/TakV2Compressor.kt` (expect/actual) | Zstd dictionary compression (JVM/Android via TAKPacket-SDK); iOS stub (uncompressed only) | +| TakV2TypeMapper | `core/takserver/…/TakV2TypeMapper.kt` (commonMain) | CoT type string ↔ enum mapping: 23 CoT types + 4 HOW types + default fallback | +| CoTDetailStripper | `core/takserver/…/CoTDetailStripper.kt` (commonMain) | Strips 16 bloat XML elements from CoT before mesh transmission to fit MTU | +| RouteDataPackageGenerator | `core/takserver/…/RouteDataPackageGenerator.kt` (commonMain) | Converts route CoT to ATAK-importable KML data packages | +| CoTXmlParser | `core/takserver/…/CoTXmlParser.kt` (commonMain) | Streaming XML parser for inbound CoT from ATAK clients | +| XmlUtils | `core/takserver/…/XmlUtils.kt` (commonMain) | XML escaping/sanitization utilities (5 special characters) | +| AtakFileWriter | `core/takserver/…/AtakFileWriter.kt` (expect/actual) | Platform filesystem access: androidMain (SAF/private dirs), jvmMain (desktop filesystem), iosMain (stub) | +| TAKConfigItemList | `feature/settings/…/TAKConfigItemList.kt` (commonMain) | Compose UI for TAK module configuration | +| TakPermissionUtil | `feature/settings/…/TakPermissionUtil.kt` (expect/actual) | Platform-specific permission handling (Android, iOS, JVM) | +| MeshService (wake lock) | `core/service/MeshService.kt` (androidMain) | Partial wake lock for reliable TAK server operation | +| Capabilities | `core/model/Capabilities.kt` (commonMain) | Firmware version detection for v2 support gating | + +## Requirements *(mandatory)* + +### Functional Requirements + +- **FR-001**: System MUST detect firmware version and use TAKPacketV2 (port 78) for radios >= 2.8.0, falling back to TAKPacket (port 72) for older firmware +- **FR-002**: System MUST support encoding and decoding of all mapped CoT types (23 CoT types + 4 HOW types + CotType_Other fallback), including but not limited to: PLI, GeoChat, Marker, Route, DrawnShape subtypes (circle, ellipse, freeform, polygon, rectangle, telestration), Aircraft, Casevac, Emergency, Task, Ranging, Alert, Delete, Chat Receipts, and Waypoints +- **FR-003**: System MUST compress TAKPacketV2 payloads using zstd with pre-trained dictionaries (separate dictionaries for aircraft vs non-aircraft types) +- **FR-004**: System MUST reject compressed payloads exceeding MAX_DECOMPRESSED_SIZE to prevent memory exhaustion attacks +- **FR-005**: System MUST accept inbound packets on both port 72 (legacy) and port 78 (v2) regardless of local firmware version +- **FR-006**: System MUST run a local TLS/mTLS server on port 8089 accepting ATAK and iTAK client connections +- **FR-007**: System MUST hold a partial wake lock while the TAK server is active to prevent Android CPU throttling +- **FR-008**: System MUST generate valid KML data packages for route CoT events for ATAK file import +- **FR-009**: System MUST export .zip data packages containing connection certificates (server.p12, client.p12, ca.pem) and server configuration for client setup, importable by both ATAK and iTAK +- **FR-010**: System MUST sanitize inbound CoT XML to prevent XML injection attacks (escaping &, <, >, ", ') +- **FR-011**: System MUST preserve the full CoT type string for round-trip fidelity when the type maps to CotType_Other +- **FR-012**: System MUST drop unsupported CoT types (non-PLI, non-GeoChat) on legacy firmware with a logged warning +- **FR-013**: System MUST strip bloat XML detail elements (16 known element types: color, strokeColor, strokeWeight, fillColor, labels_on, usericon, model, shape, height, height_unit, fileshare, __video, archive, precisionlocation, tog, _flow-tags_) from outbound CoT before mesh transmission to maximize payload fit within MTU +- **FR-014**: System MUST maintain an offline message queue (50-message cap, 5-minute per-message TTL) to replay missed messages when ATAK clients reconnect after brief disconnections. When the cap is reached, the oldest message is evicted (FIFO). Messages older than 5 minutes are silently discarded on dequeue. +- **FR-015**: System MUST send keepalive packets to connected TAK clients at 10-second intervals (below ATAK's 15-second stale threshold) to maintain connection liveness +- **FR-016**: System MUST request ACCESS_LOCAL_NETWORK permission on Android 17+ (API 37) for TAK server localhost binding, and display a user-visible error if the permission is denied + +### Non-Functional Requirements + +- **NFR-001**: Compressed TAKPacketV2 payloads MUST fit within the usable mesh payload (~225 bytes after protobuf framing within the 237-byte raw LoRa MTU) for single-packet transmission +- **NFR-002**: TAK server connection MUST survive screen-off and Doze mode for at least 30 minutes without disconnection +- **NFR-003**: CoT message round-trip (ATAK → mesh → remote ATAK) MUST complete within the mesh network's standard transmission latency (no added processing delay > 100ms) +- **NFR-004**: Route data packages MUST be written to app-private or cache directories (no MANAGE_EXTERNAL_STORAGE required); ATAK integration relies on content sharing or documented import paths + +## Source-Set Impact + +| Source Set | Impact | Justification | +|-----------|--------|---------------| +| `commonMain` | All business logic: TAKMeshIntegration, conversions, models, parser, server manager, detail stripper, XML utils, config UI | All business logic and UI per Constitution §I, §III | +| `androidMain` | MeshService wake lock, AtakFileWriter (Android filesystem/SAF), TakPermissionUtil (runtime permissions) | Platform-specific Android APIs | +| `jvmAndroidMain` | TAKServerJvm TLS implementation, TakV2Compressor (zstd via TAKPacket-SDK), TakCertLoader, TakFixtureLoader | Shared JVM/Android TLS, compression, and I/O | +| `jvmMain` | AtakFileWriter (desktop filesystem), TakPermissionUtil (no-op) | Desktop platform support for file operations | +| `iosMain` | TAKServerIos, TakV2Compressor (stub — uncompressed TAK_TRACKER mode only), AtakFileWriter (stub), TakFixtureLoader | Platform stubs pending Swift SDK integration | + +## Design Standards Compliance + +- [x] New screens reviewed against [design standards](https://raw.githubusercontent.com/meshtastic/design/refs/heads/master/standards/meshtastic_design_standards_latest.md) +- [x] M3 component selection verified (SwitchPreference, DropDownPreference, TitledCard used) +- [x] Accessibility: TalkBack semantics on TAK config controls, standard touch targets +- [x] Typography: M3 scale for hierarchy in TAK config screen + +## Privacy Assessment + +- [x] No PII, location data, or cryptographic keys logged or exposed (CoT data stays local to device/mesh) +- [x] No new network calls that transmit user data (TAK server is local-only, listening on loopback + LAN) +- [x] Proto submodule (`core/proto`) not modified (read-only upstream, pegged to master) + +## Success Criteria *(mandatory)* + +### Measurable Outcomes + +- **SC-001**: All mapped CoT types (28 total mappings across 23 CoT types, 4 HOW types, and default fallback) successfully round-trip encode/decode through the test fixture suite +- **SC-002**: Compressed payload size for typical PLI messages stays below 100 bytes (well within ~225B usable mesh payload) +- **SC-003**: Mixed-firmware mesh (2.7.x + 2.8.0+) maintains PLI and GeoChat exchange without errors for legacy nodes +- **SC-004**: TAK server maintains ATAK client connections for 30+ minutes with device screen off +- **SC-005**: Route CoT events result in importable KML data packages appearing in ATAK within one mesh cycle +- **SC-006**: Test fixture suite (40 XML fixtures across 9 test classes, 65+ test methods) covering all CoT types passes with correct round-trip encoding/decoding + +## Assumptions + +- All business logic and UI composables reside in `commonMain` source set +- String resources added to `core/resources/src/commonMain/composeResources/values/strings.xml` +- Icons use `MeshtasticIcons` (from `core/ui/icon/`) +- Float values pre-formatted with `NumberFormatter.format()` (CMP constraint) +- Firmware version is available from the connected radio's metadata at connection time +- ATAK clients support standard TAK Server protocol (TLS on port 8089, data package import) +- Zstd dictionaries are pre-trained and bundled as binary resources (not trained at runtime) +- The 237-byte raw LoRa MTU is a hard limit imposed by the radio hardware; usable payload is ~225 bytes after protobuf framing +- Route data packages are written to app-private/cache directories (no broad filesystem permissions required) +- iOS implementation uses uncompressed TAK_TRACKER mode (flags=0xFF) pending platform-specific zstd library integration via Swift SDK interop +- Desktop (JVM) has partial TAK support: filesystem operations via `jvmMain` AtakFileWriter, TLS server via `jvmAndroidMain` +- Android 17+ (API 37) requires ACCESS_LOCAL_NETWORK permission for TAK server localhost binding diff --git a/specs/005-tak-v2-protocol/tasks.md b/specs/005-tak-v2-protocol/tasks.md new file mode 100644 index 000000000..e265a9d77 --- /dev/null +++ b/specs/005-tak-v2-protocol/tasks.md @@ -0,0 +1,294 @@ +# Tasks: TAK v2 Protocol Integration + +**Input**: Design documents from `/specs/005-tak-v2-protocol/` +**Prerequisites**: plan.md ✅, spec.md ✅, research.md ✅, data-model.md ✅, contracts/ ✅ +**Status**: Retroactive — documents work completed in PR #5434 (99 files, +4698 lines). Use as verification checklist. + +**Tests**: Included — the implementation ships with 12 test classes and 89+ test methods covering all CoT types. + +**Verification**: Constitution-required validation tasks included (spotlessCheck, detekt, compile, allTests). + +## Format: `[ID] [P?] [Story] Description` + +- **[P]**: Can run in parallel (different files, no dependencies) +- **[Story]**: Which user story this task belongs to (e.g., US1, US2, US3) +- Include exact file paths in descriptions + +--- + +## Phase 1: Setup (Module & Dependencies) + +**Purpose**: Create the `core:takserver` KMP module, configure dependencies, and establish project structure. + +- [X] T001 Create `core/takserver/build.gradle.kts` with TAKPacket-SDK v0.1.3, xmlutil, zstd-jni 1.5.7-7, Ktor Network, Okio, Koin, and Kermit dependencies +- [X] T002 Register `:core:takserver` module in `settings.gradle.kts` +- [X] T003 [P] Create source set directory structure: `commonMain`, `commonTest`, `jvmAndroidMain`, `androidMain`, `jvmMain`, `iosMain` under `core/takserver/src/` +- [X] T004 [P] Add bundled mTLS certificates to `core/takserver/src/jvmAndroidMain/resources/tak_certs/` +- [X] T005 [P] Add 40 CoT XML test fixture files to `core/takserver/src/jvmAndroidMain/resources/tak_test_fixtures/` +- [X] T006 [P] Create Koin DI module in `core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/di/CoreTakServerModule.kt` + +--- + +## Phase 2: Foundational (Shared Models, Constants & Utilities) + +**Purpose**: Core domain models, constants, and utilities that ALL user stories depend on. + +**⚠️ CRITICAL**: No user story work can begin until this phase is complete. + +- [X] T007 Define domain models (CoTMessage, CoTContact, CoTGroup, CoTStatus, CoTTrack, CoTChat, TAKClientInfo, InboundCoTMessage) in `core/takserver/src/commonMain/kotlin/.../TAKModels.kt` +- [X] T008 [P] Define constants (DEFAULT_TAK_PORT, MAX_TAK_WIRE_PAYLOAD_BYTES, MAX_DECOMPRESSED_SIZE, TAK_COORDINATE_SCALE, DICT_IDs, OFFLINE_QUEUE_TTL, KEEPALIVE_INTERVAL, MIN_MESH_STALE_TTL) in `core/takserver/src/commonMain/kotlin/.../TAKDefaults.kt` +- [X] T009 [P] Implement XML escaping utilities (5 special characters: &, <, >, ", ') in `core/takserver/src/commonMain/kotlin/.../XmlUtils.kt` +- [X] T010 [P] Implement CoT XML data classes for serialization in `core/takserver/src/commonMain/kotlin/.../CoTXmlDataClasses.kt` +- [X] T011 [P] Implement ATAK preference XML schema classes in `core/takserver/src/commonMain/kotlin/.../TAKPrefXmlDataClasses.kt` +- [X] T012 [P] Implement shared coordinate scaling and conversion helpers in `core/takserver/src/commonMain/kotlin/.../TakConversionHelpers.kt` +- [X] T013 [P] Implement `TakV2TypeMapper` with 23 CoT types + 4 HOW types + CotType_Other fallback in `core/takserver/src/commonMain/kotlin/.../TakV2TypeMapper.kt` +- [X] T014 [P] Implement `CoTDetailStripper` to strip 16 bloat XML elements (regex-based) in `core/takserver/src/commonMain/kotlin/.../CoTDetailStripper.kt` +- [X] T015 [P] Implement streaming `CoTXmlParser` (XML → CoTMessage) in `core/takserver/src/commonMain/kotlin/.../CoTXmlParser.kt` +- [X] T016 [P] Implement `CoTXml` (CoTMessage → XML serialization) in `core/takserver/src/commonMain/kotlin/.../CoTXml.kt` +- [X] T017 [P] Implement TCP stream framing in `core/takserver/src/commonMain/kotlin/.../CoTXmlFrameBuffer.kt` +- [X] T018 [P] Implement shared conversion helpers in `core/takserver/src/commonMain/kotlin/.../CoTConversion.kt` +- [X] T019 [P] Add `supportsTakV2` capability flag (firmware >= 2.8.0 check) in `core/model/src/commonMain/kotlin/.../Capabilities.kt` +- [X] T020 [P] Define `AtakFileWriter` expect interface in `core/takserver/src/commonMain/kotlin/.../AtakFileWriter.kt` +- [X] T021 [P] Define `ZipArchiver` expect interface in `core/takserver/src/commonMain/kotlin/.../ZipArchiver.kt` +- [X] T022 [P] Define `TakFixtureLoader` expect interface in `core/takserver/src/commonMain/kotlin/.../TakFixtureLoader.kt` +- [X] T023 [P] Define `TakV2Compressor` expect interface in `core/takserver/src/commonMain/kotlin/.../TakV2Compressor.kt` +- [X] T024 [P] Define `TAKServer` expect interface in `core/takserver/src/commonMain/kotlin/.../TAKServer.kt` + +**Checkpoint**: Foundation ready — all shared types, constants, and interfaces established. + +--- + +## Phase 3: User Story 1 — Send Rich Tactical Data Over Mesh (Priority: P1) 🎯 MVP + +**Goal**: Convert all CoT types from ATAK clients into compressed TAKPacketV2 and transmit over port 78. Receiving nodes decompress and forward to connected TAK clients. + +**Independent Test**: Drop a hostile marker on one ATAK instance → appears on remote ATAK with correct type, icon, and position. + +### Tests for User Story 1 + +- [X] T025 [P] [US1] Implement `CoTXmlParserTest` (XML parsing for all 23 CoT types) in `core/takserver/src/commonTest/kotlin/.../CoTXmlParserTest.kt` +- [X] T026 [P] [US1] Implement `CoTXmlTest` (CoTMessage → XML round-trip) in `core/takserver/src/commonTest/kotlin/.../CoTXmlTest.kt` +- [X] T027 [P] [US1] Implement `CoTConversionTest` (conversion helper correctness) in `core/takserver/src/commonTest/kotlin/.../CoTConversionTest.kt` +- [X] T028 [P] [US1] Implement `CoTDetailStripperTest` (16-element stripping) in `core/takserver/src/commonTest/kotlin/.../CoTDetailStripperTest.kt` +- [X] T029 [P] [US1] Implement `TAKPacketV2RawDetailTest` (raw_detail round-trip for shapes/markers/routes) in `core/takserver/src/commonTest/kotlin/.../TAKPacketV2RawDetailTest.kt` +- [X] T030 [P] [US1] Implement `XmlUtilsTest` (escaping correctness for 5 special chars) in `core/takserver/src/commonTest/kotlin/.../XmlUtilsTest.kt` +- [X] T031 [P] [US1] Implement `TAKDefaultsTest` (constants validation) in `core/takserver/src/commonTest/kotlin/.../TAKDefaultsTest.kt` + +### Implementation for User Story 1 + +- [X] T032 [US1] Implement `TAKPacketV2Conversion` (CoTMessage ↔ TAKPacketV2 for all CoT types including pli, chat, raw_detail payloads) in `core/takserver/src/commonMain/kotlin/.../TAKPacketV2Conversion.kt` +- [X] T033 [P] [US1] Implement `TakV2Compressor` actual (zstd dictionary compression via TAKPacket-SDK) in `core/takserver/src/jvmAndroidMain/kotlin/.../TakV2Compressor.kt` +- [X] T034 [P] [US1] Implement `TakV2Compressor` iOS stub (uncompressed, flags=0xFF) in `core/takserver/src/iosMain/kotlin/.../TakV2Compressor.kt` +- [X] T035 [US1] Implement `RouteDataPackageGenerator` (Route CoT → KML data package with MissionPackageManifest v2) in `core/takserver/src/commonMain/kotlin/.../RouteDataPackageGenerator.kt` +- [X] T036 [US1] Implement `TAKMeshIntegration` outbound path (TAK client → CoT parse → detail strip → compress → MTU check → port 78 send) in `core/takserver/src/commonMain/kotlin/.../TAKMeshIntegration.kt` +- [X] T037 [US1] Implement `TAKMeshIntegration` inbound path (port 78 receive → decompress → decode → broadcast to TAK clients) in `core/takserver/src/commonMain/kotlin/.../TAKMeshIntegration.kt` +- [X] T038 [P] [US1] Implement `TakFixtureLoader` actual (JVM resource loading for test fixtures) in `core/takserver/src/jvmAndroidMain/kotlin/.../TakFixtureLoader.kt` +- [X] T039 [P] [US1] Implement `TakFixtureLoader` iOS stub in `core/takserver/src/iosMain/kotlin/.../TakFixtureLoader.kt` +- [X] T040 [P] [US1] Implement `ZipArchiver` actual (java.util.zip) in `core/takserver/src/jvmAndroidMain/kotlin/.../ZipArchiver.kt` +- [X] T041 [P] [US1] Implement `ZipArchiver` iOS stub in `core/takserver/src/iosMain/kotlin/.../ZipArchiver.kt` +- [X] T042 [P] [US1] Implement `AtakFileWriter` actual (SAF/private directory) in `core/takserver/src/androidMain/kotlin/.../AtakFileWriter.kt` +- [X] T043 [P] [US1] Implement `AtakFileWriter` actual (desktop filesystem) in `core/takserver/src/jvmMain/kotlin/.../AtakFileWriter.kt` +- [X] T044 [P] [US1] Implement `AtakFileWriter` iOS stub in `core/takserver/src/iosMain/kotlin/.../AtakFileWriter.kt` +- [X] T045 [US1] Implement `TakMeshTestRunner` (in-app diagnostic runner for per-CoT-type byte size and round-trip verification) in `core/takserver/src/commonMain/kotlin/.../TakMeshTestRunner.kt` + +**Checkpoint**: All 28 CoT type mappings encode/decode correctly. Compressed PLI < 100 bytes. Shapes/markers/routes fit within 225-byte MTU after stripping + compression. + +--- + +## Phase 4: User Story 2 — Legacy Fallback for Mixed Firmware (Priority: P1) + +**Goal**: Auto-detect firmware version and use TAKPacket v1 (port 72) for radios < 2.8.0. Drop unsupported CoT types on legacy with a warning. Always accept inbound on both ports. + +**Independent Test**: Connect a node with firmware 2.7.x and verify PLI/GeoChat work on port 72 while markers are dropped with warning. + +### Tests for User Story 2 + +- [X] T046 [P] [US2] Implement `TAKPacketConversionTest` (v1 PLI + GeoChat encode/decode) in `core/takserver/src/commonTest/kotlin/.../TAKPacketConversionTest.kt` + +### Implementation for User Story 2 + +- [X] T047 [US2] Implement `TAKPacketConversion` (CoTMessage ↔ TAKPacket v1 for PLI and GeoChat only) in `core/takserver/src/commonMain/kotlin/.../TAKPacketConversion.kt` +- [X] T048 [US2] Implement version-gating logic in `TAKMeshIntegration` — check `Capabilities.supportsTakV2` per-send to select port 72 vs port 78 path in `core/takserver/src/commonMain/kotlin/.../TAKMeshIntegration.kt` +- [X] T049 [US2] Implement dual-port inbound listener in `TAKMeshIntegration` — accept and decode packets from both port 72 and port 78 regardless of local firmware in `core/takserver/src/commonMain/kotlin/.../TAKMeshIntegration.kt` +- [X] T050 [US2] Implement CoT type filtering for legacy path — drop non-PLI/non-GeoChat types with logged warning on firmware < 2.8.0 in `core/takserver/src/commonMain/kotlin/.../TAKMeshIntegration.kt` + +**Checkpoint**: Mixed-firmware mesh maintains PLI/GeoChat for legacy nodes. Advanced CoT types dropped cleanly with user-visible warning. + +--- + +## Phase 5: User Story 3 — TAK Server Lifecycle and Reliability (Priority: P2) + +**Goal**: Run a reliable local TLS/mTLS server on port 8089, maintain ATAK/iTAK connections through screen-off and Doze mode, support data package export. + +**Independent Test**: Enable TAK server, connect ATAK via exported data package, verify connection persists for 10+ minutes with screen off. + +### Tests for User Story 3 + +- [X] T051 [P] [US3] Implement `CoTXmlFrameBufferTest` (TCP stream framing correctness) in `core/takserver/src/commonTest/kotlin/.../CoTXmlFrameBufferTest.kt` + +### Implementation for User Story 3 + +- [X] T052 [US3] Implement `TAKServerJvm` actual (JSSE SSLServerSocket with mTLS on port 8089) in `core/takserver/src/jvmAndroidMain/kotlin/.../TAKServerJvm.kt` +- [X] T053 [P] [US3] Implement `TAKServerIos` actual (no-op stub) in `core/takserver/src/iosMain/kotlin/.../TAKServerIos.kt` +- [X] T054 [US3] Implement `TAKClientConnection` (per-client coroutine scope, SupervisorJob, BufferedOutputStream + writeMutex, XML stream framing) in `core/takserver/src/jvmAndroidMain/kotlin/.../TAKClientConnection.kt` +- [X] T055 [US3] Implement `TakCertLoader` (load bundled .p12/.pem certificates for mTLS) in `core/takserver/src/jvmAndroidMain/kotlin/.../TakCertLoader.kt` +- [X] T056 [US3] Implement `TAKServerManager` lifecycle (start/stop, client list, broadcast, 10-second keepalive interval, offline message queue: 50-msg cap, 5-min TTL) in `core/takserver/src/commonMain/kotlin/.../TAKServerManager.kt` +- [X] T057 [US3] Implement `TAKDataPackageGenerator` (export .zip with server certificates and connection config for ATAK/iTAK import) in `core/takserver/src/commonMain/kotlin/.../TAKDataPackageGenerator.kt` +- [X] T058 [US3] Add `PARTIAL_WAKE_LOCK` acquisition in `MeshService` when TAK server is active in `core/service/src/androidMain/kotlin/.../MeshService.kt` +- [X] T059 [US3] Wire `TAKMeshIntegration.start(scope)` call from `MeshServiceOrchestrator` in `core/service/src/commonMain/kotlin/.../MeshServiceOrchestrator.kt` + +**Checkpoint**: TAK server starts on port 8089, accepts mTLS connections, maintains keepalive, survives screen-off. Data package exportable. + +--- + +## Phase 6: User Story 4 — TAK Configuration UI (Priority: P2) + +**Goal**: Compose Multiplatform settings UI for TAK module — server toggle, team/role selection, data package export, diagnostic test runner. + +**Independent Test**: Navigate to TAK config, toggle server, change team/role, verify settings persist across app restart. + +### Implementation for User Story 4 + +- [X] T060 [US4] Implement `TAKConfigItemList` Compose UI (SwitchPreference for server toggle, DropDownPreference for team/role, TitledCard for status, export button, test runner button) in `feature/settings/src/commonMain/kotlin/.../radio/component/TAKConfigItemList.kt` +- [X] T061 [P] [US4] Implement `TakPermissionUtil` expect interface in `feature/settings/src/commonMain/kotlin/.../tak/TakPermissionUtil.kt` +- [X] T062 [P] [US4] Implement `TakPermissionUtil` Android actual (ACCESS_LOCAL_NETWORK for API 37+) in `feature/settings/src/androidMain/kotlin/.../tak/TakPermissionUtil.kt` +- [X] T063 [P] [US4] Implement `TakPermissionUtil` JVM actual (no-op) in `feature/settings/src/jvmMain/kotlin/.../tak/TakPermissionUtil.kt` +- [X] T064 [P] [US4] Implement `TakPermissionUtil` iOS actual (no-op) in `feature/settings/src/iosMain/kotlin/.../tak/TakPermissionUtil.kt` + +**Checkpoint**: TAK config screen functional — server toggle works, team/role persists, test runner shows per-CoT-type byte sizes. + +--- + +## Phase 7: User Story 5 — Inbound Dual-Path Tolerance (Priority: P3) + +**Goal**: V2-capable nodes decode and forward ALL inbound mesh traffic (both port 72 and port 78) to connected TAK clients. + +**Independent Test**: Send a legacy TAKPacket (port 72) to a firmware 2.8.0+ node → connected ATAK client receives the PLI as valid CoT XML. + +### Implementation for User Story 5 + +- [X] T065 [US5] Verify inbound handler in `TAKMeshIntegration` correctly decodes port 72 legacy packets and broadcasts to TAK clients (implemented as part of T049, verify independently) +- [X] T066 [US5] Verify inbound handler in `TAKMeshIntegration` correctly decompresses port 78 packets (including 0xFF uncompressed from TAK_TRACKER) and broadcasts to TAK clients + +**Checkpoint**: No tactical data lost in mixed deployments. Both v1 and v2 inbound traffic decoded and forwarded correctly. + +--- + +## Phase 8: Polish & Cross-Cutting Concerns + +**Purpose**: Verification, compliance, and documentation tasks that span all user stories. + +- [X] T067 [P] Add TAK-related string resources to `core/resources/src/commonMain/composeResources/values/strings.xml` +- [X] T068 [P] Review `TAKConfigItemList.kt` against [Meshtastic design standards](https://raw.githubusercontent.com/meshtastic/design/refs/heads/master/standards/meshtastic_design_standards_latest.md) — verify M3 components, accessibility (TalkBack), touch targets +- [X] T069 [P] Confirm no logs, telemetry, or config changes expose PII, location data, secrets, or modify `core/proto` submodule +- [X] T070 [P] Run constitution-required verification: `./gradlew spotlessApply spotlessCheck detekt assembleDebug :core:takserver:allTests :feature:settings:allTests` +- [X] T071 [P] Verify all 12 test classes pass (89+ methods): `./gradlew :core:takserver:allTests` +- [X] T072 [P] Validate quickstart.md instructions produce successful build from clean checkout +- [X] T073 Run `gh pr checks 5434` to confirm CI passes all checks +- [X] T074 [P] [US3] Add test for offline message queue: verify FIFO eviction at 50-message cap, per-message TTL expiry after 5 minutes, and replay of queued messages on client reconnect +- [X] T075 [P] [US4] Add test for ACCESS_LOCAL_NETWORK permission denied on Android 17+: verify TAK server displays user-visible error and does not crash +- [X] T076 [P] [US3] Add test for TAKServerJvm port-conflict error: verify graceful failure with user-visible error when port 8089 is already in use +- [X] T077 [P] [US1] Add test for MAX_DECOMPRESSED_SIZE boundary: verify `TakV2Compressor` rejects payloads exceeding the decompression size limit +- [X] T078 [P] [US1] Create `TAKMeshIntegrationTest.kt` in `core/takserver/src/commonTest/` with lifecycle, inbound mesh, firmware gating, and GeoChat enrichment tests (10 tests) +- [X] T079 [P] [US3] Add `broadcastRawXml` tests to `TAKServerManagerTest.kt`: verify forward-to-TAKServer when running and no-op when not running (2 tests) +- [X] T080 [P] Restrict `TAKServerManagerImpl` visibility to `internal` in `TAKServerManager.kt` — consumers use the `TAKServerManager` interface via Koin + +--- + +## Dependencies & Execution Order + +### Phase Dependencies + +- **Setup (Phase 1)**: No dependencies — can start immediately +- **Foundational (Phase 2)**: Depends on Phase 1 — BLOCKS all user stories +- **User Story 1 (Phase 3)**: Depends on Phase 2 — the MVP +- **User Story 2 (Phase 4)**: Depends on Phase 2 + shares `TAKMeshIntegration` with US1 +- **User Story 3 (Phase 5)**: Depends on Phase 2 — independent of US1/US2 +- **User Story 4 (Phase 6)**: Depends on Phase 5 (needs TAKServerManager for toggle state) +- **User Story 5 (Phase 7)**: Depends on Phase 3 + Phase 4 (verification of dual-path handling) +- **Polish (Phase 8)**: Depends on all user stories being complete + +### User Story Dependencies + +- **US1 (P1)**: After Phase 2 — no dependencies on other stories +- **US2 (P1)**: After Phase 2 — shares `TAKMeshIntegration.kt` with US1 (co-implemented) +- **US3 (P2)**: After Phase 2 — independent (server infrastructure) +- **US4 (P2)**: After US3 (needs server lifecycle for toggle state) +- **US5 (P3)**: After US1 + US2 (verification of combined behavior) + +### Within Each User Story + +- Tests written alongside implementation (retroactive — both exist in PR) +- Models/interfaces → actual implementations → integration → verification +- Platform actuals can be implemented in parallel (jvmAndroidMain, androidMain, jvmMain, iosMain) + +### Parallel Opportunities + +- All Phase 1 tasks T003-T006 can run in parallel +- All Phase 2 tasks T008-T024 can run in parallel (independent files) +- All US1 test tasks T025-T031 can run in parallel +- Platform actuals within US1 (T033/T034, T040/T041, T042/T043/T044) can run in parallel +- US3 server tasks T052/T053 can run in parallel (JVM vs iOS) +- All US4 permission actuals T062/T063/T064 can run in parallel + +--- + +## Parallel Example: User Story 1 + +```bash +# Launch all tests for US1 together: +Task: "CoTXmlParserTest in commonTest" +Task: "CoTXmlTest in commonTest" +Task: "CoTConversionTest in commonTest" +Task: "CoTDetailStripperTest in commonTest" +Task: "TAKPacketV2RawDetailTest in commonTest" +Task: "XmlUtilsTest in commonTest" +Task: "TAKDefaultsTest in commonTest" + +# Launch all platform actuals together: +Task: "TakV2Compressor jvmAndroidMain actual" +Task: "TakV2Compressor iosMain stub" +Task: "ZipArchiver jvmAndroidMain actual" +Task: "ZipArchiver iosMain stub" +Task: "AtakFileWriter androidMain actual" +Task: "AtakFileWriter jvmMain actual" +Task: "AtakFileWriter iosMain stub" +``` + +--- + +## Implementation Strategy + +### MVP First (User Stories 1 + 2) + +1. Complete Phase 1: Module setup + dependencies +2. Complete Phase 2: Shared models, constants, utilities +3. Complete Phase 3: US1 — Rich tactical data over mesh (v2 path) +4. Complete Phase 4: US2 — Legacy fallback (v1 path) +5. **STOP and VALIDATE**: Run all tests, verify PLI/marker round-trip on actual hardware + +### Incremental Delivery + +1. Setup + Foundational → Module compilable +2. US1 + US2 → Full bidirectional mesh ↔ TAK bridge (MVP!) +3. US3 → Reliable TAK server lifecycle +4. US4 → User configuration UI +5. US5 → Dual-path tolerance verification +6. Polish → CI green, design compliance confirmed + +### Retroactive Verification (PR #5434) + +Since this implementation already exists, use this task list as: +1. **Verification checklist** — confirm each task's output exists in the PR diff +2. **Code review guide** — trace requirements → implementation → tests +3. **Regression detection** — if future changes break a task's output, identify which user story is affected + +--- + +## Notes + +- [P] tasks = different files, no dependencies between them +- [Story] label maps task to specific user story for traceability +- This is a **retroactive** task list — PR #5434 implements all tasks +- Verification: `./gradlew spotlessApply spotlessCheck detekt assembleDebug :core:takserver:allTests :feature:settings:allTests` +- Total implementation: 99 files changed, +4698 lines, 1 new KMP module (`core:takserver`) From f1c793db5de3df9e987de16ddcda23f3757ba3db Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 14 May 2026 11:32:58 -0500 Subject: [PATCH 08/78] chore(deps): update com.github.luben:zstd-jni to v1.5.7-8 (#5454) --- core/takserver/build.gradle.kts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/takserver/build.gradle.kts b/core/takserver/build.gradle.kts index ffd87c693..c2bbe6460 100644 --- a/core/takserver/build.gradle.kts +++ b/core/takserver/build.gradle.kts @@ -101,7 +101,7 @@ kotlin { jvmMain.dependencies { // Desktop JVM: standard JAR bundles native libs for desktop archs. - implementation("com.github.luben:zstd-jni:1.5.7-7") + implementation("com.github.luben:zstd-jni:1.5.7-8") // xpp3 is excluded from jvmAndroidMain (Android ships it as a // platform class), but Desktop JVM still needs it for XmlPullParser. implementation("org.ogce:xpp3:1.1.6") @@ -111,7 +111,7 @@ kotlin { // Android: @aar variant ships .so files for arm/arm64/x86/x86_64. // Without this, zstd-jni's ZstdDictCompress. throws // UnsatisfiedLinkError and poisons TakV2Compressor permanently. - implementation("com.github.luben:zstd-jni:1.5.7-7@aar") + implementation("com.github.luben:zstd-jni:1.5.7-8@aar") } commonTest.dependencies { From 6a939102213dcbf4bcbc4718f334a28fd0e346e7 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 14 May 2026 11:33:56 -0500 Subject: [PATCH 09/78] docs: update CHANGELOG.md (#5453) --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e8aec3b0c..1ff2545e3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,9 @@ See [GitHub Releases](https://github.com/meshtastic/Meshtastic-Android/releases) ### Unreleased (not yet in any build) +* chore(deps): update com.github.luben:zstd-jni to v1.5.7-8 (#5454) by @renovate[bot] in [`f1c793db5`](https://github.com/meshtastic/Meshtastic-Android/commit/f1c793db5de3df9e987de16ddcda23f3757ba3db) +* feat: TAK v2 protocol integration with zstd compression and full CoT type support (#5434) by @Ben Meadors in [`a04a261b8`](https://github.com/meshtastic/Meshtastic-Android/commit/a04a261b80b7d617447651af1fd67ec623775efa) +* docs: update CHANGELOG.md (#5452) by @github-actions[bot] in [`0ef3072f3`](https://github.com/meshtastic/Meshtastic-Android/commit/0ef3072f3c28a44c1f0e18ad4b1c617aaff706b0) * chore(deps): update dd.sdk.android to v3.10.0 (#5451) by @renovate[bot] in [`a71ac210f`](https://github.com/meshtastic/Meshtastic-Android/commit/a71ac210f76a28a133056bec4502fc4b0984cb1d) * docs: update CHANGELOG.md (#5448) by @github-actions[bot] in [`c0b690974`](https://github.com/meshtastic/Meshtastic-Android/commit/c0b69097419a7d9c90527729747fc91135628282) * chore: Scheduled updates (Firmware, Hardware, Translations, Graphs) (#5438) by @James Rich in [`13865e7c8`](https://github.com/meshtastic/Meshtastic-Android/commit/13865e7c8b7f9a47cd3b572bd44d8ec355b2d3a9) From 33184fef99befdac1ad7d1aea1706a9e142dba85 Mon Sep 17 00:00:00 2001 From: James Rich <2199651+jamesarich@users.noreply.github.com> Date: Thu, 14 May 2026 12:17:20 -0500 Subject: [PATCH 10/78] chore: Scheduled updates (Firmware, Hardware, Translations, Graphs) (#5455) Co-authored-by: github-merge-queue <118344674+github-merge-queue@users.noreply.github.com> --- .../commonMain/composeResources/values-be/strings.xml | 1 + .../commonMain/composeResources/values-bg/strings.xml | 2 +- .../commonMain/composeResources/values-cs/strings.xml | 1 + .../commonMain/composeResources/values-de/strings.xml | 2 +- .../commonMain/composeResources/values-es/strings.xml | 1 + .../commonMain/composeResources/values-et/strings.xml | 2 +- .../commonMain/composeResources/values-fi/strings.xml | 2 +- .../commonMain/composeResources/values-fr/strings.xml | 2 +- .../commonMain/composeResources/values-hu/strings.xml | 1 + .../commonMain/composeResources/values-it/strings.xml | 1 + .../commonMain/composeResources/values-ja/strings.xml | 1 + .../commonMain/composeResources/values-ko/strings.xml | 1 + .../commonMain/composeResources/values-nl/strings.xml | 1 + .../commonMain/composeResources/values-pl/strings.xml | 1 + .../composeResources/values-pt-rBR/strings.xml | 1 + .../commonMain/composeResources/values-pt/strings.xml | 1 + .../commonMain/composeResources/values-ro/strings.xml | 2 +- .../commonMain/composeResources/values-ru/strings.xml | 2 +- .../commonMain/composeResources/values-sr/strings.xml | 1 + .../commonMain/composeResources/values-srp/strings.xml | 1 + .../commonMain/composeResources/values-sv/strings.xml | 9 +++++++++ .../commonMain/composeResources/values-tr/strings.xml | 1 + .../commonMain/composeResources/values-uk/strings.xml | 1 + .../composeResources/values-zh-rCN/strings.xml | 1 + .../composeResources/values-zh-rTW/strings.xml | 2 +- 25 files changed, 33 insertions(+), 8 deletions(-) diff --git a/core/resources/src/commonMain/composeResources/values-be/strings.xml b/core/resources/src/commonMain/composeResources/values-be/strings.xml index 64400acec..dba5380ae 100644 --- a/core/resources/src/commonMain/composeResources/values-be/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-be/strings.xml @@ -260,6 +260,7 @@ Хуткасць SSID + Сервер Сіні Зялёны Чырвоны diff --git a/core/resources/src/commonMain/composeResources/values-bg/strings.xml b/core/resources/src/commonMain/composeResources/values-bg/strings.xml index b4b6f76e7..41b3abdd7 100644 --- a/core/resources/src/commonMain/composeResources/values-bg/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-bg/strings.xml @@ -926,7 +926,7 @@ Член на екипа Неопределена Активиране на локален TAK сървър - Стартира TCP сървър на порт 8089 за ATAK връзки + Сървър Цвят на екипа Син Кафяв diff --git a/core/resources/src/commonMain/composeResources/values-cs/strings.xml b/core/resources/src/commonMain/composeResources/values-cs/strings.xml index 75f6bf09f..f4ba6ffe6 100644 --- a/core/resources/src/commonMain/composeResources/values-cs/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-cs/strings.xml @@ -954,6 +954,7 @@ Zvýšené zesílení přijímače (RX) Nastavení systému + Server Modrá Zelená Červená diff --git a/core/resources/src/commonMain/composeResources/values-de/strings.xml b/core/resources/src/commonMain/composeResources/values-de/strings.xml index 9af47a661..ac9ca54fe 100644 --- a/core/resources/src/commonMain/composeResources/values-de/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-de/strings.xml @@ -1154,7 +1154,7 @@ Teammitglied Unspecified Lokalen TAK Server aktivieren - Startet einen TCP Server auf Port 8089 für ATAK Verbindungen + Server Teamfarbe Blau Braun diff --git a/core/resources/src/commonMain/composeResources/values-es/strings.xml b/core/resources/src/commonMain/composeResources/values-es/strings.xml index 988b254bf..d28584d86 100644 --- a/core/resources/src/commonMain/composeResources/values-es/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-es/strings.xml @@ -801,6 +801,7 @@ Estos datos de ubicación pueden ser utilizados para fines como aparecer en un m Aumentar ganancia de RX Ajustes del sistema + Servidor Azul Verde Rojo diff --git a/core/resources/src/commonMain/composeResources/values-et/strings.xml b/core/resources/src/commonMain/composeResources/values-et/strings.xml index 4f83183dd..3d9baec58 100644 --- a/core/resources/src/commonMain/composeResources/values-et/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-et/strings.xml @@ -1154,7 +1154,7 @@ Meeskonnaliige Määramata Kohaliku TAK-serveri lubamine - Käivitab TCP-serveri pordil 8089 ATAK-ühenduste jaoks + Server Meeskonna värv Sinine Pruun diff --git a/core/resources/src/commonMain/composeResources/values-fi/strings.xml b/core/resources/src/commonMain/composeResources/values-fi/strings.xml index 5eae37715..191cbdb68 100644 --- a/core/resources/src/commonMain/composeResources/values-fi/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-fi/strings.xml @@ -1157,7 +1157,7 @@ Tiimin jäsen Määrittelemätön Ota paikallinen TAK-palvelin käyttöön - Käynnistää TCP-palvelimen porttiin 8089 ATAK-yhteyksiä varten + Palvelin Tiimin väri Sininen Ruskea diff --git a/core/resources/src/commonMain/composeResources/values-fr/strings.xml b/core/resources/src/commonMain/composeResources/values-fr/strings.xml index 7181a8e22..180d36124 100644 --- a/core/resources/src/commonMain/composeResources/values-fr/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-fr/strings.xml @@ -1145,7 +1145,7 @@ Membre de l'équipe Non spécifié Activer le serveur TAK local - Démarre un serveur TCP sur le port 8089 pour les connexions ATAK + Serveur Couleur de l'équipe Bleu Marron diff --git a/core/resources/src/commonMain/composeResources/values-hu/strings.xml b/core/resources/src/commonMain/composeResources/values-hu/strings.xml index 08808e165..eeb53a454 100644 --- a/core/resources/src/commonMain/composeResources/values-hu/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-hu/strings.xml @@ -809,6 +809,7 @@ RX fokozott erősítés Rendszerbeállítások + Szerver Kék Zöld Piros diff --git a/core/resources/src/commonMain/composeResources/values-it/strings.xml b/core/resources/src/commonMain/composeResources/values-it/strings.xml index 998dcb25a..7f11f97b1 100644 --- a/core/resources/src/commonMain/composeResources/values-it/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-it/strings.xml @@ -904,6 +904,7 @@ Migliora guadagno in Ricezione Impostazioni di Sistema + Server Blu Verde Rosso diff --git a/core/resources/src/commonMain/composeResources/values-ja/strings.xml b/core/resources/src/commonMain/composeResources/values-ja/strings.xml index dcf4adcb3..920316f96 100644 --- a/core/resources/src/commonMain/composeResources/values-ja/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-ja/strings.xml @@ -629,6 +629,7 @@ チームリーダー チームメンバー 未指定 + サーバー チームカラー 茶色 diff --git a/core/resources/src/commonMain/composeResources/values-ko/strings.xml b/core/resources/src/commonMain/composeResources/values-ko/strings.xml index 974c1c99a..f56d12d38 100644 --- a/core/resources/src/commonMain/composeResources/values-ko/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-ko/strings.xml @@ -521,6 +521,7 @@ 상태 전송 간격 (초) 지원됨 + 서버 파랑 초록 빨강 diff --git a/core/resources/src/commonMain/composeResources/values-nl/strings.xml b/core/resources/src/commonMain/composeResources/values-nl/strings.xml index 194f4cbbd..b85928af1 100644 --- a/core/resources/src/commonMain/composeResources/values-nl/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-nl/strings.xml @@ -412,6 +412,7 @@ SSID Ondersteund + Server Blauw Groen Rood diff --git a/core/resources/src/commonMain/composeResources/values-pl/strings.xml b/core/resources/src/commonMain/composeResources/values-pl/strings.xml index b35c950e7..c8fea8a74 100644 --- a/core/resources/src/commonMain/composeResources/values-pl/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-pl/strings.xml @@ -720,6 +720,7 @@ Obsługiwane Ustawienia systemowe + Serwer Niebieski Zielony Czerwony diff --git a/core/resources/src/commonMain/composeResources/values-pt-rBR/strings.xml b/core/resources/src/commonMain/composeResources/values-pt-rBR/strings.xml index 2029ef497..eb727d403 100644 --- a/core/resources/src/commonMain/composeResources/values-pt-rBR/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-pt-rBR/strings.xml @@ -640,6 +640,7 @@ Suportado Apoiado pela Comunidade Meshtastic + Servidor Azul Verde Vermelho diff --git a/core/resources/src/commonMain/composeResources/values-pt/strings.xml b/core/resources/src/commonMain/composeResources/values-pt/strings.xml index d50592754..a6525242c 100644 --- a/core/resources/src/commonMain/composeResources/values-pt/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-pt/strings.xml @@ -503,6 +503,7 @@ Transmissão de estado (segundos) Suportado + Servidor Azul Verde Vermelho diff --git a/core/resources/src/commonMain/composeResources/values-ro/strings.xml b/core/resources/src/commonMain/composeResources/values-ro/strings.xml index e65d1b9c7..fd52022d7 100644 --- a/core/resources/src/commonMain/composeResources/values-ro/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-ro/strings.xml @@ -1051,7 +1051,7 @@ Membrii Echipei Nespecificat Activare server TAK local - Pornește un server TCP pe portul 8089 pentru conexiunile ATAK + Server Culoarea echipei Albastru Maro diff --git a/core/resources/src/commonMain/composeResources/values-ru/strings.xml b/core/resources/src/commonMain/composeResources/values-ru/strings.xml index dd490341f..fe3193c27 100644 --- a/core/resources/src/commonMain/composeResources/values-ru/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-ru/strings.xml @@ -1169,7 +1169,7 @@ Участник команды Не определена Включить локальный сервер TAK - Запустить TCP-сервер на порту 8089 для подключений ATAK + Сервер Цвет команды Синий Коричневый diff --git a/core/resources/src/commonMain/composeResources/values-sr/strings.xml b/core/resources/src/commonMain/composeResources/values-sr/strings.xml index 59452a356..4dfd45da8 100644 --- a/core/resources/src/commonMain/composeResources/values-sr/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-sr/strings.xml @@ -431,6 +431,7 @@ Подржан Појачање пријемника + Сервер Телеметрија (сензори) Конфигурација телеметрије Темп. diff --git a/core/resources/src/commonMain/composeResources/values-srp/strings.xml b/core/resources/src/commonMain/composeResources/values-srp/strings.xml index c05b0aaf9..dff900b16 100644 --- a/core/resources/src/commonMain/composeResources/values-srp/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-srp/strings.xml @@ -431,6 +431,7 @@ Подржан Појачање пријемника + Сервер Телеметрија (сензори) Конфигурација телеметрије Темп. diff --git a/core/resources/src/commonMain/composeResources/values-sv/strings.xml b/core/resources/src/commonMain/composeResources/values-sv/strings.xml index d3f2c8291..25b2faccb 100644 --- a/core/resources/src/commonMain/composeResources/values-sv/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-sv/strings.xml @@ -392,7 +392,9 @@ Håll din enhet nära telefonen. Uppdatera till: %1$s Lokal fil + Uppdatera via %1$s USB filöverföring + Trådlös uppdatering Ingen ansluten enhet Kunde inte hitta fast programvara för %1$s i utgåvan. Versionsinformation @@ -417,6 +419,7 @@ Vänd skärmen För mer information, se vår integritetspolicy. Ledigt minne + Tillgängligt systemminne som byte Frekv. Frekvens-slot Visningsnamn @@ -514,8 +517,11 @@ Ladda %1$d Laddar + Felaktiga %1$d Batteri: %1$d% Diagnostik: %1$s + Släppta %1$d + Noder: %1$d aktiva / %2$d totalt Trafik: TX %1$d / RX %2$d (D: %3$d) Upptid: %1$s Platsåtkomst är avstängd, kan inte leverera position till meshnätverket. @@ -598,6 +604,7 @@ Kvittens köad Okänd Meddelanden + Min Minsta sändningsintervall (sekunder) Smart distans Smart intervall @@ -646,6 +653,7 @@ NFC är inaktiverat. Aktivera det i systeminställningar. Ingen enhet vald + Hittade inga enheter Ingen tillgänglig statistik (%1$d aktiva / %2$d visas / %3$d totalt) @@ -995,6 +1003,7 @@ Gruppledare Gruppmedlem Ospecificerad + Server Lagfärg Blått Brun diff --git a/core/resources/src/commonMain/composeResources/values-tr/strings.xml b/core/resources/src/commonMain/composeResources/values-tr/strings.xml index 3279d078f..85797b2cc 100644 --- a/core/resources/src/commonMain/composeResources/values-tr/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-tr/strings.xml @@ -527,6 +527,7 @@ Durum yayını (saniye) Desteklenen + Sunucu Mavi Yeşil Kırmızı diff --git a/core/resources/src/commonMain/composeResources/values-uk/strings.xml b/core/resources/src/commonMain/composeResources/values-uk/strings.xml index 5c976d898..4561ed44d 100644 --- a/core/resources/src/commonMain/composeResources/values-uk/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-uk/strings.xml @@ -1055,6 +1055,7 @@ Лідер команди Член команди Невизначений + Сервер Синій Коричневий Ціановий diff --git a/core/resources/src/commonMain/composeResources/values-zh-rCN/strings.xml b/core/resources/src/commonMain/composeResources/values-zh-rCN/strings.xml index a053c25cb..d94ae3a04 100644 --- a/core/resources/src/commonMain/composeResources/values-zh-rCN/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-zh-rCN/strings.xml @@ -1032,6 +1032,7 @@ 团队组长 团队成员 未指定 + 服务器 队伍颜色 棕色 diff --git a/core/resources/src/commonMain/composeResources/values-zh-rTW/strings.xml b/core/resources/src/commonMain/composeResources/values-zh-rTW/strings.xml index a0df19772..f7e38f343 100644 --- a/core/resources/src/commonMain/composeResources/values-zh-rTW/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-zh-rTW/strings.xml @@ -1105,7 +1105,7 @@ 隊伍成員 未指定 啓用本地 TAK 伺服器 - 在 8089 埠啟動一個用於 ATAK 連線的 TCP 伺服器 + 伺服器 隊伍顏色 Blue - 藍色 咖啡色 From 63e8f15872ff0a0ccc4429108f8c1f77567bdbe3 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 14 May 2026 12:17:37 -0500 Subject: [PATCH 11/78] chore(deps): update ktor to v3.5.0 (#5450) --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 18b95fc6d..68c4ef4ce 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -63,7 +63,7 @@ mlkit-barcode-scanning = "17.3.0" camerax = "1.6.1" # Networking -ktor = "3.4.3" +ktor = "3.5.0" # Other aboutlibraries = "14.2.0" From d8b183a41408f53c74595e16ac40fc9bb780ec58 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 14 May 2026 12:19:43 -0500 Subject: [PATCH 12/78] docs: update CHANGELOG.md (#5456) --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1ff2545e3..7cd2bebeb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,9 @@ See [GitHub Releases](https://github.com/meshtastic/Meshtastic-Android/releases) ### Unreleased (not yet in any build) +* chore(deps): update ktor to v3.5.0 (#5450) by @renovate[bot] in [`63e8f1587`](https://github.com/meshtastic/Meshtastic-Android/commit/63e8f15872ff0a0ccc4429108f8c1f77567bdbe3) +* chore: Scheduled updates (Firmware, Hardware, Translations, Graphs) (#5455) by @James Rich in [`33184fef9`](https://github.com/meshtastic/Meshtastic-Android/commit/33184fef99befdac1ad7d1aea1706a9e142dba85) +* docs: update CHANGELOG.md (#5453) by @github-actions[bot] in [`6a9391022`](https://github.com/meshtastic/Meshtastic-Android/commit/6a939102213dcbf4bcbc4718f334a28fd0e346e7) * chore(deps): update com.github.luben:zstd-jni to v1.5.7-8 (#5454) by @renovate[bot] in [`f1c793db5`](https://github.com/meshtastic/Meshtastic-Android/commit/f1c793db5de3df9e987de16ddcda23f3757ba3db) * feat: TAK v2 protocol integration with zstd compression and full CoT type support (#5434) by @Ben Meadors in [`a04a261b8`](https://github.com/meshtastic/Meshtastic-Android/commit/a04a261b80b7d617447651af1fd67ec623775efa) * docs: update CHANGELOG.md (#5452) by @github-actions[bot] in [`0ef3072f3`](https://github.com/meshtastic/Meshtastic-Android/commit/0ef3072f3c28a44c1f0e18ad4b1c617aaff706b0) From 6edac97d5fcee38eabdd43f2898c11873807d78f Mon Sep 17 00:00:00 2001 From: James Rich <2199651+jamesarich@users.noreply.github.com> Date: Thu, 14 May 2026 16:33:05 -0500 Subject: [PATCH 13/78] fix: TAKPacket-SDK proto ownership and desktop/flatpak CI fixes (#5459) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- core/proto/build.gradle.kts | 73 ++++++++++++++++++++++++++++++++- core/takserver/build.gradle.kts | 55 ++++--------------------- desktop/proguard-rules.pro | 9 ++++ gradle/libs.versions.toml | 5 +++ settings.gradle.kts | 10 ++--- 5 files changed, 98 insertions(+), 54 deletions(-) diff --git a/core/proto/build.gradle.kts b/core/proto/build.gradle.kts index d6d5892c9..112ecf936 100644 --- a/core/proto/build.gradle.kts +++ b/core/proto/build.gradle.kts @@ -26,7 +26,33 @@ kotlin { // Override minSdk for ATAK compatibility (standard is 26) android { minSdk = 21 } - sourceSets { commonMain.dependencies { api(libs.wire.runtime) } } + sourceSets { + commonMain.dependencies { + api(libs.wire.runtime) + + // TAKPacket-SDK owns atak.proto Wire codegen (see + // https://github.com/meshtastic/TAKPacket-SDK/issues/6). + // The prune directives below stop this module from emitting + // those classes; the SDK ships them and we re-export via api() + // so every consumer of :core:proto gets TAKPacketV2, GeoChat, + // etc. transitively. No dual codegen, no R8 duplicates, no + // cross-repo ABI drift. + // + // Team and MemberRole are NOT pruned — they are used as fields + // in ModuleConfig.TAKConfig and the SDK deliberately strips + // them from its JVM JAR so our codegen is the single source. + // + // Excludes: + // zstd-jni — Android needs the @aar variant; :core:takserver + // re-adds it per-target. + // xpp3 — Android provides XmlPullParser as a platform + // class; :core:takserver re-adds for desktop. + api(libs.takpacket.sdk.kmp.get().toString()) { + exclude(group = "com.github.luben", module = "zstd-jni") + exclude(group = "org.ogce", module = "xpp3") + } + } + } } wire { @@ -48,6 +74,51 @@ wire { root("meshtastic.*") prune("meshtastic.MeshPacket#delayed") prune("meshtastic.MeshPacket.Delayed") + + // ── atak.proto types ──────────────────────────────────────────────────── + // Owned by TAKPacket-SDK (v0.2.3+), which ships the Wire-generated + // classes in its KMP artifacts. The api() dep above re-exports them. + // Wire prune() does not cascade to nested types — each must be explicit. + // + // Team and MemberRole are NOT pruned — they are used as fields in + // ModuleConfig.TAKConfig and the SDK strips them from its JVM JAR so + // our codegen remains the single source for those two enums. + prune("meshtastic.TAKPacket") + prune("meshtastic.TAKPacketV2") + prune("meshtastic.GeoChat") + prune("meshtastic.GeoChat.ReceiptType") + prune("meshtastic.Group") + prune("meshtastic.Status") + prune("meshtastic.Contact") + prune("meshtastic.PLI") + prune("meshtastic.AircraftTrack") + prune("meshtastic.CotGeoPoint") + prune("meshtastic.DrawnShape") + prune("meshtastic.DrawnShape.Kind") + prune("meshtastic.DrawnShape.StyleMode") + prune("meshtastic.Marker") + prune("meshtastic.Marker.Kind") + prune("meshtastic.RangeAndBearing") + prune("meshtastic.Route") + prune("meshtastic.Route.Method") + prune("meshtastic.Route.Direction") + prune("meshtastic.Route.Link") + prune("meshtastic.CasevacReport") + prune("meshtastic.CasevacReport.Precedence") + prune("meshtastic.CasevacReport.HlzMarking") + prune("meshtastic.CasevacReport.Security") + prune("meshtastic.ZMistEntry") + prune("meshtastic.EmergencyAlert") + prune("meshtastic.EmergencyAlert.Type") + prune("meshtastic.TaskRequest") + prune("meshtastic.TaskRequest.Priority") + prune("meshtastic.TaskRequest.Status") + prune("meshtastic.TAKEnvironment") + prune("meshtastic.SensorFov") + prune("meshtastic.SensorFov.SensorType") + prune("meshtastic.CotHow") + prune("meshtastic.CotType") + prune("meshtastic.GeoPointSource") } // Modern KMP publication uses the project name as the artifactId by default. diff --git a/core/takserver/build.gradle.kts b/core/takserver/build.gradle.kts index c2bbe6460..c9e69c9e8 100644 --- a/core/takserver/build.gradle.kts +++ b/core/takserver/build.gradle.kts @@ -40,6 +40,13 @@ kotlin { implementation(projects.core.model) implementation(projects.core.proto) + // TAKPacket-SDK is api()-exported by :core:proto (see + // https://github.com/meshtastic/TAKPacket-SDK/issues/6). + // Provides org.meshtastic.proto.TAKPacketV2 and friends, plus + // the SDK's own org.meshtastic.tak.* parser/builder/compressor. + // zstd-jni and xpp3 are excluded at the dep site in :core:proto + // and re-added per-target below. + implementation(libs.okio) implementation(libs.kotlinx.serialization.json) implementation(libs.xmlutil.core) @@ -51,53 +58,7 @@ kotlin { implementation(libs.kermit) } - jvmAndroidMain.dependencies { - // TAKPacket-SDK for v2 compression/decompression (via JitPack). - // - // We depend on the `-jvm` variant directly rather than the parent - // `com.github.meshtastic:TAKPacket-SDK` coordinate. JitPack does - // not publish a root-level Gradle module metadata (.module) file - // for the KMP parent, only per-target ones. With just the parent - // POM, Gradle reads the four KMP variants (jvm, iosarm64, - // iossimulatorarm64, metadata) as unconditional Maven deps and - // tries to resolve them ALL against this Android consumer — the - // iOS klibs declare `platform.type=native` with no androidJvm - // variant, so variant selection fails with "No matching variant". - // - // Depending directly on `takpacket-sdk-jvm` skips the parent POM - // entirely and goes straight to the JVM artifact's own module - // metadata, which is compatible with both `jvm()` and Android - // targets in this `jvmAndroidMain` source set. It still pulls - // zstd-jni + xpp3 + wire-runtime-jvm + kotlin-stdlib as - // transitive deps from the JVM variant's POM. - // - // zstd-jni's @aar variant is still declared explicitly in the - // androidMain source set below so Android gets the .so files. - implementation("com.github.meshtastic.TAKPacket-SDK:takpacket-sdk-jvm:v0.2.1") { - // Issue #5: pre-0.2.1 the SDK JAR bundled `org.meshtastic.proto.*` - // (Wire-generated TAKPacketV2 + friends) inside the same JAR as - // `org.meshtastic.tak.*`. Our own `:core:proto` module runs its - // own Wire codegen against the same protobufs submodule and emits - // the identical classes, so R8 hit "Type is defined multiple - // times" errors during release builds. v0.2.1 strips the proto - // classes from the JAR entirely — the SDK's bytecode still - // REFERENCES them, but they come from `:core:proto` on our - // classpath. No exclude needed; the SDK simply doesn't ship them. - // The SDK's jvmMain declares zstd-jni as a runtime dep (standard - // JAR with desktop native libs). Android needs the @aar variant - // instead (ships arm/arm64/x86/x86_64 .so files). Both packaging - // formats contain the same Java classes, so Android's dex merger - // hits "Duplicate class" errors if both land on the classpath. - // Exclude here; androidMain re-adds it as @aar below, and jvmMain - // re-adds the JAR for desktop. - exclude(group = "com.github.luben", module = "zstd-jni") - // xpp3 bundles org.xmlpull.v1.XmlPullParser which Android provides - // as a platform class (android.content.res.XmlResourceParser - // implements it). R8 fails when both the library and program - // classpaths define the same type. - exclude(group = "org.ogce", module = "xpp3") - } - } + jvmAndroidMain.dependencies {} jvmMain.dependencies { // Desktop JVM: standard JAR bundles native libs for desktop archs. diff --git a/desktop/proguard-rules.pro b/desktop/proguard-rules.pro index 6e0ceb6fb..42855ac00 100644 --- a/desktop/proguard-rules.pro +++ b/desktop/proguard-rules.pro @@ -77,3 +77,12 @@ # ---- Kotlin 2.3+ stdlib intrinsics not present on JDK 17 -------------------- -dontwarn kotlin.concurrent.atomics.** -dontwarn kotlin.uuid.UuidV7Generator + +# ---- TAKPacket-SDK / proto ABI tolerance ------------------------------------ +# The SDK's TakPacketV2Serializer is compiled against atak.proto at a specific +# commit. If the protobufs submodule advances ahead of the SDK release, minor +# signature mismatches (e.g. optional field boxing) produce warnings. These are +# harmless at runtime — affected code paths only execute when TAK packets use +# the changed fields, and the SDK is rebuilt on each release. Suppress to avoid +# blocking desktop builds while we coordinate proto alignment. +-dontwarn org.meshtastic.tak.TakPacketV2Serializer diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 68c4ef4ce..8e0a383b8 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -87,6 +87,7 @@ kable = "0.43.0" mqttastic = "0.3.6" jmdns = "3.6.3" qrcode-kotlin = "4.5.0" +takpacket-sdk = "v0.2.3" [libraries] xmlutil-core = { module = "io.github.pdvrieze.xmlutil:core", version.ref = "xmlutil" } @@ -272,6 +273,10 @@ aboutlibraries-gradlePlugin = { module = "com.mikepenz.aboutlibraries.plugin:abo jmdns = { module = "org.jmdns:jmdns", version.ref = "jmdns" } jna = { module = "net.java.dev.jna:jna", version = "5.18.1" } +# TAK +takpacket-sdk-kmp = { module = "com.github.meshtastic.TAKPacket-SDK:takpacket-sdk", version.ref = "takpacket-sdk" } +takpacket-sdk-jvm = { module = "com.github.meshtastic.TAKPacket-SDK:takpacket-sdk-jvm", version.ref = "takpacket-sdk" } + [plugins] # Android android-application = { id = "com.android.application", version.ref = "agp" } diff --git a/settings.gradle.kts b/settings.gradle.kts index 092f6d7c2..4b41e8936 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -55,12 +55,10 @@ dependencyResolutionManagement { url = uri("https://central.sonatype.com/repository/maven-snapshots/") mavenContent { snapshotsOnly() } } - if (!desktopOnly) { - maven { - url = uri("https://jitpack.io") - content { - includeGroupByRegex("com\\.github\\..*") - } + maven { + url = uri("https://jitpack.io") + content { + includeGroupByRegex("com\\.github\\..*") } } maven { url = uri("./offline-repository") } From dc1c93e12c7df0137dd5125834f7353021156efc Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 14 May 2026 16:34:01 -0500 Subject: [PATCH 14/78] docs: update CHANGELOG.md (#5462) --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7cd2bebeb..0b864d1f0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,8 @@ See [GitHub Releases](https://github.com/meshtastic/Meshtastic-Android/releases) ### Unreleased (not yet in any build) +* fix: TAKPacket-SDK proto ownership and desktop/flatpak CI fixes (#5459) by @James Rich in [`6edac97d5`](https://github.com/meshtastic/Meshtastic-Android/commit/6edac97d5fcee38eabdd43f2898c11873807d78f) +* docs: update CHANGELOG.md (#5456) by @github-actions[bot] in [`d8b183a41`](https://github.com/meshtastic/Meshtastic-Android/commit/d8b183a41408f53c74595e16ac40fc9bb780ec58) * chore(deps): update ktor to v3.5.0 (#5450) by @renovate[bot] in [`63e8f1587`](https://github.com/meshtastic/Meshtastic-Android/commit/63e8f15872ff0a0ccc4429108f8c1f77567bdbe3) * chore: Scheduled updates (Firmware, Hardware, Translations, Graphs) (#5455) by @James Rich in [`33184fef9`](https://github.com/meshtastic/Meshtastic-Android/commit/33184fef99befdac1ad7d1aea1706a9e142dba85) * docs: update CHANGELOG.md (#5453) by @github-actions[bot] in [`6a9391022`](https://github.com/meshtastic/Meshtastic-Android/commit/6a939102213dcbf4bcbc4718f334a28fd0e346e7) From b32aa1b9f20d4c742a162921a6c22c2546d88861 Mon Sep 17 00:00:00 2001 From: James Rich <2199651+jamesarich@users.noreply.github.com> Date: Thu, 14 May 2026 16:34:40 -0500 Subject: [PATCH 15/78] chore: Scheduled updates (Firmware, Hardware, Translations, Graphs) (#5460) Co-authored-by: github-merge-queue <118344674+github-merge-queue@users.noreply.github.com> --- .../commonMain/composeResources/values-fi/strings.xml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/core/resources/src/commonMain/composeResources/values-fi/strings.xml b/core/resources/src/commonMain/composeResources/values-fi/strings.xml index 191cbdb68..ffeeef478 100644 --- a/core/resources/src/commonMain/composeResources/values-fi/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-fi/strings.xml @@ -1156,8 +1156,19 @@ Joukkueen johtaja Tiimin jäsen Määrittelemätön + TAK palvelin Ota paikallinen TAK-palvelin käyttöön + Avaa paikallisen salatun TLS-palvelinyhteyden porttiin 8089, jotta ATAK/iTAK voi yhdistää siihen + Luo .zip-asetustiedosto ATAK/iTAK-sovellukselle, jotta se voi yhdistää tähän palvelimeen + Palvelin + TAK Mesh -testitila (debug) + Lähetä kaikki %1$d testisanomat mesh-verkkoon + %1$dB ✓ + + %1$d onnistui, %2$d epäonnistui yhteensä %3$d/%4$d testistä + Suorita + Käynnissä: %1$s Tiimin väri Sininen Ruskea From 427471c51e200a6753c9a1e131ae8fb71e04738c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 14 May 2026 16:39:16 -0500 Subject: [PATCH 16/78] chore(deps): update takpacket.sdk to v0.2.3 (#5464) --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 8e0a383b8..f5b3d514b 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -87,7 +87,7 @@ kable = "0.43.0" mqttastic = "0.3.6" jmdns = "3.6.3" qrcode-kotlin = "4.5.0" -takpacket-sdk = "v0.2.3" +takpacket-sdk = "0.2.3" [libraries] xmlutil-core = { module = "io.github.pdvrieze.xmlutil:core", version.ref = "xmlutil" } From cfa9206de96fe5323d5882cd0bf59820403c90c1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 14 May 2026 16:42:04 -0500 Subject: [PATCH 17/78] chore(deps): update spotless to v8.5.0 (#5458) --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index f5b3d514b..200178e46 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -80,7 +80,7 @@ markdownRenderer = "0.40.2" okio = "3.17.0" uri-kmp = "0.0.21" osmdroid-android = "6.1.20" -spotless = "8.4.0" +spotless = "8.5.0" wire = "6.3.0" vico = "3.2.0-next.4" kable = "0.43.0" From ed806c036f6fc4f3149d598f581e1666df9dafdb Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 14 May 2026 16:45:39 -0500 Subject: [PATCH 18/78] docs: update CHANGELOG.md (#5463) --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0b864d1f0..a7a11f355 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,10 @@ See [GitHub Releases](https://github.com/meshtastic/Meshtastic-Android/releases) ### Unreleased (not yet in any build) +* chore(deps): update spotless to v8.5.0 (#5458) by @renovate[bot] in [`cfa9206de`](https://github.com/meshtastic/Meshtastic-Android/commit/cfa9206de96fe5323d5882cd0bf59820403c90c1) +* chore(deps): update takpacket.sdk to v0.2.3 (#5464) by @renovate[bot] in [`427471c51`](https://github.com/meshtastic/Meshtastic-Android/commit/427471c51e200a6753c9a1e131ae8fb71e04738c) +* chore: Scheduled updates (Firmware, Hardware, Translations, Graphs) (#5460) by @James Rich in [`b32aa1b9f`](https://github.com/meshtastic/Meshtastic-Android/commit/b32aa1b9f20d4c742a162921a6c22c2546d88861) +* docs: update CHANGELOG.md (#5462) by @github-actions[bot] in [`dc1c93e12`](https://github.com/meshtastic/Meshtastic-Android/commit/dc1c93e12c7df0137dd5125834f7353021156efc) * fix: TAKPacket-SDK proto ownership and desktop/flatpak CI fixes (#5459) by @James Rich in [`6edac97d5`](https://github.com/meshtastic/Meshtastic-Android/commit/6edac97d5fcee38eabdd43f2898c11873807d78f) * docs: update CHANGELOG.md (#5456) by @github-actions[bot] in [`d8b183a41`](https://github.com/meshtastic/Meshtastic-Android/commit/d8b183a41408f53c74595e16ac40fc9bb780ec58) * chore(deps): update ktor to v3.5.0 (#5450) by @renovate[bot] in [`63e8f1587`](https://github.com/meshtastic/Meshtastic-Android/commit/63e8f15872ff0a0ccc4429108f8c1f77567bdbe3) From 4bacff81c5abad536b40f7370ae5d302b74a11fe Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 18 May 2026 05:03:09 -0500 Subject: [PATCH 19/78] chore(deps): update vico to v3.2.0-next.5 (#5470) --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 200178e46..dd31dad52 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -82,7 +82,7 @@ uri-kmp = "0.0.21" osmdroid-android = "6.1.20" spotless = "8.5.0" wire = "6.3.0" -vico = "3.2.0-next.4" +vico = "3.2.0-next.5" kable = "0.43.0" mqttastic = "0.3.6" jmdns = "3.6.3" From c91219d8b0411975c059c7a5ae6eb370386954f6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 18 May 2026 05:03:39 -0500 Subject: [PATCH 20/78] chore(deps): update spotless to v8.5.1 (#5468) --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index dd31dad52..d8e44d641 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -80,7 +80,7 @@ markdownRenderer = "0.40.2" okio = "3.17.0" uri-kmp = "0.0.21" osmdroid-android = "6.1.20" -spotless = "8.5.0" +spotless = "8.5.1" wire = "6.3.0" vico = "3.2.0-next.5" kable = "0.43.0" From f0e12695bbf3df16b043476ff98856b727d6a2f7 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 18 May 2026 05:46:50 -0500 Subject: [PATCH 21/78] chore(deps): update wire to v6.4.0 (#5466) --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index d8e44d641..061b7e610 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -81,7 +81,7 @@ okio = "3.17.0" uri-kmp = "0.0.21" osmdroid-android = "6.1.20" spotless = "8.5.1" -wire = "6.3.0" +wire = "6.4.0" vico = "3.2.0-next.5" kable = "0.43.0" mqttastic = "0.3.6" From 057d5bb778a72cf4359abc7fae904d587cdc90a2 Mon Sep 17 00:00:00 2001 From: James Rich <2199651+jamesarich@users.noreply.github.com> Date: Mon, 18 May 2026 06:24:09 -0500 Subject: [PATCH 22/78] fix(database): make withDb retry logic resilient to varying close messages (#5474) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../core/database/DatabaseManager.kt | 29 ++++++++++++++----- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/core/database/src/commonMain/kotlin/org/meshtastic/core/database/DatabaseManager.kt b/core/database/src/commonMain/kotlin/org/meshtastic/core/database/DatabaseManager.kt index e96ce887c..42dd56a6a 100644 --- a/core/database/src/commonMain/kotlin/org/meshtastic/core/database/DatabaseManager.kt +++ b/core/database/src/commonMain/kotlin/org/meshtastic/core/database/DatabaseManager.kt @@ -169,7 +169,7 @@ open class DatabaseManager( private val limitedIo = dispatchers.io.limitedParallelism(4) - /** Execute [block] with the current DB instance. */ + /** Execute [block] with the current DB instance. Retries once if the pool closes during a DB switch. */ @Suppress("TooGenericExceptionCaught") override suspend fun withDb(block: suspend (MeshtasticDatabase) -> T): T? = withContext(limitedIo) { val db = _currentDb.value ?: return@withContext null @@ -180,18 +180,33 @@ open class DatabaseManager( } catch (e: CancellationException) { throw e // Preserve structured concurrency cancellation propagation. } catch (e: Exception) { - // If the connection pool was closed between capturing `db` and executing the query - // (e.g., during a database switch), retry once with the current DB instance. - if (e.message?.contains("Connection pool is closed") == true) { - Logger.w { "withDb: connection pool closed, retrying with current DB" } - val retryDb = _currentDb.value ?: return@withContext null - block(retryDb) + // If the active database switched while we held a reference to the old one, + // and the exception indicates a closed pool/connection, retry with the new DB. + val retryDb = _currentDb.value + if (retryDb != null && retryDb !== db && isDbClosedException(e)) { + Logger.w { "withDb: database closed during switch (${e.message}), retrying with current DB" } + try { + block(retryDb) + } catch (retryEx: Exception) { + retryEx.addSuppressed(e) + throw retryEx + } } else { throw e } } } + private fun isDbClosedException(e: Exception): Boolean = generateSequence(e) { it.cause } + .any { throwable -> + val msg = throwable.message?.lowercase() ?: return@any false + "closed" in msg && DB_TERMS.any { it in msg } + } + + private companion object { + val DB_TERMS = listOf("pool", "database", "connection", "sqlite") + } + /** * Returns true if a database exists for the given device address. Android Room stores DB files without an * extension; JVM/iOS append `.db`. We check both to stay platform-agnostic. From d24fc9ac9245b69718e2cb2a6c3a872e36d8c28c Mon Sep 17 00:00:00 2001 From: James Rich <2199651+jamesarich@users.noreply.github.com> Date: Mon, 18 May 2026 07:09:46 -0500 Subject: [PATCH 23/78] ci: remove desktop build job from reusable-check to cut macOS runner costs (#5475) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/workflows/main-check.yml | 1 - .github/workflows/pull-request.yml | 7 ++--- .github/workflows/reusable-check.yml | 42 ---------------------------- 3 files changed, 3 insertions(+), 47 deletions(-) diff --git a/.github/workflows/main-check.yml b/.github/workflows/main-check.yml index eaf3f54d3..73905b944 100644 --- a/.github/workflows/main-check.yml +++ b/.github/workflows/main-check.yml @@ -21,6 +21,5 @@ jobs: with: run_lint: true run_unit_tests: false - run_desktop_builds: false upload_artifacts: true secrets: inherit diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index 670bfd32b..0e70c3c41 100644 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -95,9 +95,9 @@ jobs: PY # 2. VALIDATION & BUILD: Delegate to reusable-check.yml - # We disable coverage and desktop builds for PRs to keep feedback fast - # (< 10 mins). Desktop compilation is already covered by the :desktop:test - # task in the shard-app test shard. + # We disable coverage for PRs to keep feedback fast (< 10 mins). + # Desktop compilation is covered by :desktop:test in the shard-app test shard. + # Native desktop packaging (createDistributable) only runs in release.yml. validate-and-build: needs: check-changes if: needs.check-changes.outputs.android == 'true' @@ -106,7 +106,6 @@ jobs: run_lint: true run_unit_tests: true run_coverage: false - run_desktop_builds: false upload_artifacts: true secrets: inherit diff --git a/.github/workflows/reusable-check.yml b/.github/workflows/reusable-check.yml index 6e0c83650..74bb726ec 100644 --- a/.github/workflows/reusable-check.yml +++ b/.github/workflows/reusable-check.yml @@ -12,9 +12,6 @@ on: run_coverage: type: boolean default: true - run_desktop_builds: - type: boolean - default: true run_desktop_flatpak_src: type: boolean default: false @@ -468,45 +465,6 @@ jobs: echo "| --- | --- |" >> $GITHUB_STEP_SUMMARY find app/build/outputs/apk -name "*.apk" -exec du -h {} + | awk '{print "| " $2 " | " $1 " |"}' >> $GITHUB_STEP_SUMMARY - # ── Desktop Build ─────────────────────────────────────────────────── - build-desktop: - name: Build Desktop Debug (${{ matrix.os }}) - if: inputs.run_desktop_builds == true - runs-on: ${{ matrix.os }} - permissions: - contents: read - timeout-minutes: 60 - needs: lint-check - strategy: - fail-fast: false - matrix: - os: [macos-latest, windows-latest, ubuntu-24.04, ubuntu-24.04-arm] - env: - VERSION_CODE: ${{ needs.lint-check.outputs.version_code }} - - steps: - - name: Checkout code - uses: actions/checkout@v6 - with: - fetch-depth: 1 - submodules: true - - - name: Gradle Setup - uses: ./.github/actions/gradle-setup - with: - gradle_encryption_key: ${{ secrets.GRADLE_ENCRYPTION_KEY }} - cache_read_only: ${{ needs.lint-check.outputs.cache_read_only }} - - - name: Build Desktop - run: ./gradlew :desktop:createDistributable -Pci=true --scan - - - name: Upload Desktop artifact - if: ${{ inputs.upload_artifacts }} - uses: actions/upload-artifact@v7 - with: - name: desktop-app-${{ runner.os }}-${{ runner.arch }} - path: desktop/build/compose/binaries/main/app/ - retention-days: 7 # ── Flatpak Sources ─────────────────────────────────────────────────── build-flatpak-src: From f4b6b02acecdd8855408db7d92757f2495fbc11f Mon Sep 17 00:00:00 2001 From: James Rich <2199651+jamesarich@users.noreply.github.com> Date: Mon, 18 May 2026 07:44:12 -0500 Subject: [PATCH 24/78] refactor(build): rename entry modules and remove DESKTOP_ONLY mode (#5476) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/copilot-instructions.md | 4 +- .../instructions/ci-workflows.instructions.md | 2 +- .github/workflows/docs.yml | 4 +- .github/workflows/pull-request.yml | 10 +- .github/workflows/release.yml | 73 ++--- .github/workflows/reusable-check.yml | 92 ++++--- .github/workflows/scheduled-updates.yml | 8 +- .skills/code-review/SKILL.md | 8 +- .skills/compose-ui/SKILL.md | 6 +- .skills/implement-feature/SKILL.md | 4 +- .skills/kmp-architecture/SKILL.md | 4 +- .skills/navigation-and-di/SKILL.md | 10 +- .skills/project-overview/SKILL.md | 4 +- .skills/testing-ci/SKILL.md | 2 +- .specify/feature.json | 2 +- AGENTS.md | 2 +- CONTRIBUTING.md | 2 +- {app => androidApp}/README.md | 62 ++--- {app => androidApp}/build.gradle.kts | 2 +- {app => androidApp}/detekt-baseline.xml | 0 {app => androidApp}/google-services.json | 0 {app => androidApp}/proguard-rules.pro | 0 .../src/fdroid/AndroidManifest.xml | 0 .../app/map/cluster/MarkerClusterer.java | 0 .../map/cluster/RadiusMarkerClusterer.java | 0 .../app/map/cluster/StaticCluster.java | 0 .../app/analytics/FdroidPlatformAnalytics.kt | 0 .../meshtastic/app/di/FDroidNetworkModule.kt | 0 .../org/meshtastic/app/di/FlavorModule.kt | 0 .../meshtastic/app/intro/AnalyticsIntro.kt | 0 .../app/map/FdroidMapViewProvider.kt | 0 .../meshtastic/app/map/GetMapViewProvider.kt | 0 .../kotlin/org/meshtastic/app/map/MapUtils.kt | 0 .../kotlin/org/meshtastic/app/map/MapView.kt | 0 .../meshtastic/app/map/MapViewExtensions.kt | 0 .../org/meshtastic/app/map/MapViewModel.kt | 0 .../app/map/MapViewWithLifecycle.kt | 0 .../meshtastic/app/map/SqlTileWriterExt.kt | 0 .../app/map/component/CacheLayout.kt | 0 .../app/map/component/DownloadButton.kt | 0 .../app/map/component/EditWaypointDialog.kt | 0 .../app/map/model/CustomTileSource.kt | 0 .../app/map/model/MarkerWithLabel.kt | 0 .../app/map/model/NOAAWmsTileSource.kt | 0 .../app/map/model/OnlineTileSourceAuth.kt | 0 .../meshtastic/app/map/node/NodeMapScreen.kt | 0 .../meshtastic/app/map/node/NodeTrackMap.kt | 0 .../app/map/node/NodeTrackOsmMap.kt | 0 .../app/map/traceroute/TracerouteMap.kt | 0 .../app/map/traceroute/TracerouteOsmMap.kt | 0 .../app/node/component/InlineMap.kt | 0 .../metrics/TracerouteMapOverlayInsets.kt | 0 .../fdroid/res/drawable/ic_location_on.xml | 0 .../res/drawable/ic_map_location_dot.xml | 0 .../fdroid/res/drawable/ic_map_navigation.xml | 0 .../ic_launcher_background.xml | 0 .../src/fdroidDebug/res/values/strings.xml | 0 .../src/google/AndroidManifest.xml | 0 .../app/analytics/GooglePlatformAnalytics.kt | 0 .../org/meshtastic/app/di/FlavorModule.kt | 0 .../meshtastic/app/di/GoogleNetworkModule.kt | 0 .../meshtastic/app/intro/AnalyticsIntro.kt | 0 .../meshtastic/app/map/GetMapViewProvider.kt | 0 .../app/map/GoogleMapViewProvider.kt | 0 .../org/meshtastic/app/map/LocationHandler.kt | 0 .../org/meshtastic/app/map/MBTilesProvider.kt | 0 .../kotlin/org/meshtastic/app/map/MapView.kt | 0 .../org/meshtastic/app/map/MapViewModel.kt | 0 .../map/component/ClusterItemsListDialog.kt | 0 .../app/map/component/CustomMapLayersSheet.kt | 0 .../CustomTileProviderManagerSheet.kt | 0 .../app/map/component/EditWaypointDialog.kt | 0 .../app/map/component/MapFilterDropdown.kt | 0 .../app/map/component/MapTypeDropdown.kt | 0 .../app/map/component/NodeClusterMarkers.kt | 0 .../app/map/component/PulsingNodeChip.kt | 0 .../app/map/component/WaypointMarkers.kt | 0 .../app/map/model/CustomTileProviderConfig.kt | 0 .../app/map/model/CustomTileSource.kt | 0 .../app/map/model/NodeClusterItem.kt | 0 .../meshtastic/app/map/node/NodeMapScreen.kt | 0 .../meshtastic/app/map/node/NodeTrackMap.kt | 0 .../app/map/prefs/di/GoogleMapsKoinModule.kt | 0 .../app/map/prefs/map/GoogleMapsPrefs.kt | 0 .../CustomTileProviderRepository.kt | 0 .../app/map/traceroute/TracerouteMap.kt | 0 .../app/node/component/InlineMap.kt | 0 .../metrics/TracerouteMapOverlayInsets.kt | 0 .../ic_launcher_background.xml | 0 .../src/googleDebug/res/values/strings.xml | 0 {app => androidApp}/src/main/.gitignore | 0 .../src/main/AndroidManifest.xml | 0 .../assets/device_bootloader_ota_quirks.json | 0 .../src/main/assets/device_hardware.json | 0 .../src/main/assets/firmware_releases.json | 0 .../src/main/ic_launcher-114x114.png | Bin .../src/main/ic_launcher2-playstore.png | Bin .../kotlin/org/meshtastic/app/MainActivity.kt | 0 .../org/meshtastic/app/MainKoinModule.kt | 0 .../org/meshtastic/app/MeshUtilApplication.kt | 0 .../org/meshtastic/app/di/AndroidKoinApp.kt | 0 .../org/meshtastic/app/di/AppKoinModule.kt | 0 .../org/meshtastic/app/di/NetworkModule.kt | 0 .../main/kotlin/org/meshtastic/app/ui/Main.kt | 0 .../ic_launcher_background.xml | 0 .../ic_launcher_foreground.xml | 0 .../main/res/drawable-anydpi/ic_splash.xml | 0 .../res/layout/widget_local_stats_preview.xml | 0 .../main/res/mipmap-anydpi/ic_launcher.xml | 0 {app => androidApp}/src/main/res/raw/keep.xml | 0 .../src/main/res/values/strings.xml | 0 .../src/main/res/values/styles.xml | 0 .../src/main/res/xml/automotive_app_desc.xml | 0 .../main/res/xml/data_extraction_rules.xml | 0 .../src/main/res/xml/device_filter.xml | 0 .../src/main/res/xml/locales_config.xml | 0 .../main/res/xml/network_security_config.xml | 0 .../meshtastic/app/di/KoinVerificationTest.kt | 0 .../org/meshtastic/app/service/Fakes.kt | 0 .../app/ui/NavigationAssemblyTest.kt | 0 .../org/meshtastic/app/ui/UIUnitTest.kt | 0 .../app/ui/metrics/EnvironmentMetricsTest.kt | 0 .../src/test/resources/robolectric.properties | 0 .../kotlin/AboutLibrariesConventionPlugin.kt | 1 - .../kotlin/AndroidRoomConventionPlugin.kt | 5 +- .../main/kotlin/KmpFeatureConventionPlugin.kt | 12 +- .../main/kotlin/KmpLibraryConventionPlugin.kt | 11 +- .../src/main/kotlin/RootConventionPlugin.kt | 22 +- .../kotlin/org/meshtastic/buildlogic/Graph.kt | 2 +- .../meshtastic/buildlogic/KotlinAndroid.kt | 69 +++-- .../buildlogic/ProjectExtensions.kt | 11 - codecov.yml | 4 +- core/barcode/README.md | 2 +- core/ble/build.gradle.kts | 8 +- core/common/build.gradle.kts | 7 +- core/data/build.gradle.kts | 8 +- core/database/build.gradle.kts | 5 +- core/datastore/build.gradle.kts | 8 +- core/di/build.gradle.kts | 7 - core/domain/build.gradle.kts | 6 +- core/model/build.gradle.kts | 5 +- core/navigation/build.gradle.kts | 2 - core/network/build.gradle.kts | 6 +- core/nfc/build.gradle.kts | 5 - core/prefs/build.gradle.kts | 6 +- core/proto/build.gradle.kts | 2 +- core/repository/build.gradle.kts | 5 +- core/resources/build.gradle.kts | 4 +- core/service/build.gradle.kts | 6 +- core/takserver/build.gradle.kts | 8 +- core/testing/build.gradle.kts | 6 +- core/ui/build.gradle.kts | 5 - {desktop => desktopApp}/.gitignore | 0 {desktop => desktopApp}/README.md | 18 +- {desktop => desktopApp}/build.gradle.kts | 0 {desktop => desktopApp}/detekt-baseline.xml | 0 {desktop => desktopApp}/entitlements.plist | 0 {desktop => desktopApp}/proguard-rules.pro | 0 .../desktop/DesktopNotificationManager.kt | 0 .../kotlin/org/meshtastic/desktop/Main.kt | 0 .../data/DesktopPreferencesDataSource.kt | 0 .../meshtastic/desktop/di/DesktopDiModule.kt | 0 .../desktop/di/DesktopKoinModule.kt | 0 .../desktop/di/DesktopPlatformModule.kt | 0 .../desktop/navigation/DesktopNavigation.kt | 0 .../DesktopMeshServiceNotifications.kt | 0 .../desktop/notification/DesktopOS.kt | 0 .../notification/LinuxNotificationSender.kt | 0 .../notification/MacOSNotificationSender.kt | 0 .../notification/NativeNotificationSender.kt | 0 .../notification/WindowsNotificationSender.kt | 0 .../desktop/radio/DesktopMessageQueue.kt | 0 .../radio/DesktopRadioTransportFactory.kt | 0 .../meshtastic/desktop/stub/CompassStubs.kt | 0 .../org/meshtastic/desktop/stub/NoopStubs.kt | 0 .../desktop/ui/DesktopMainScreen.kt | 0 .../src/main/resources/icon.icns | Bin .../src/main/resources/icon.ico | Bin .../src/main/resources/icon.png | Bin .../src/main/resources/tray_icon_black.svg | 0 .../src/main/resources/tray_icon_white.svg | 0 .../meshtastic/desktop/di/DesktopKoinTest.kt | 0 .../DesktopNotificationManagerTest.kt | 0 .../LinuxNotificationSenderTest.kt | 0 .../MacOSNotificationSenderTest.kt | 0 .../WindowsNotificationSenderTest.kt | 0 .../DesktopTopLevelDestinationParityTest.kt | 0 feature/connections/build.gradle.kts | 6 +- feature/firmware/build.gradle.kts | 6 +- feature/intro/build.gradle.kts | 6 +- feature/map/README.md | 6 +- feature/map/build.gradle.kts | 6 +- feature/messaging/build.gradle.kts | 15 +- feature/node/build.gradle.kts | 6 +- feature/settings/build.gradle.kts | 5 - feature/wifi-provision/build.gradle.kts | 3 +- scripts/desktop-only-prep.sh | 67 ----- .../remove-android-block.yml | 10 - .../remove-android-device-test.yml | 10 - .../remove-android-host-test.yml | 10 - .../remove-android-imports.yml | 7 - .../remove-android-instrumented-test.yml | 10 - .../remove-android-main-deps.yml | 10 - .../desktop-only-rules/remove-ksp-android.yml | 8 - .../remove-parcelize-plugin.yml | 7 - scripts/sgconfig.yml | 2 - settings.gradle.kts | 23 +- .../checklists/build-migration.md | 110 ++++++++ .../checklists/requirements.md | 37 +++ specs/006-kmp-project-structure/data-model.md | 112 ++++++++ specs/006-kmp-project-structure/plan.md | 78 ++++++ specs/006-kmp-project-structure/quickstart.md | 189 +++++++++++++ specs/006-kmp-project-structure/research.md | 166 +++++++++++ specs/006-kmp-project-structure/spec.md | 258 ++++++++++++++++++ specs/006-kmp-project-structure/tasks.md | 253 +++++++++++++++++ 215 files changed, 1454 insertions(+), 539 deletions(-) rename {app => androidApp}/README.md (54%) rename {app => androidApp}/build.gradle.kts (99%) rename {app => androidApp}/detekt-baseline.xml (100%) rename {app => androidApp}/google-services.json (100%) rename {app => androidApp}/proguard-rules.pro (100%) rename {app => androidApp}/src/fdroid/AndroidManifest.xml (100%) rename {app => androidApp}/src/fdroid/java/org/meshtastic/app/map/cluster/MarkerClusterer.java (100%) rename {app => androidApp}/src/fdroid/java/org/meshtastic/app/map/cluster/RadiusMarkerClusterer.java (100%) rename {app => androidApp}/src/fdroid/java/org/meshtastic/app/map/cluster/StaticCluster.java (100%) rename {app => androidApp}/src/fdroid/kotlin/org/meshtastic/app/analytics/FdroidPlatformAnalytics.kt (100%) rename {app => androidApp}/src/fdroid/kotlin/org/meshtastic/app/di/FDroidNetworkModule.kt (100%) rename {app => androidApp}/src/fdroid/kotlin/org/meshtastic/app/di/FlavorModule.kt (100%) rename {app => androidApp}/src/fdroid/kotlin/org/meshtastic/app/intro/AnalyticsIntro.kt (100%) rename {app => androidApp}/src/fdroid/kotlin/org/meshtastic/app/map/FdroidMapViewProvider.kt (100%) rename {app => androidApp}/src/fdroid/kotlin/org/meshtastic/app/map/GetMapViewProvider.kt (100%) rename {app => androidApp}/src/fdroid/kotlin/org/meshtastic/app/map/MapUtils.kt (100%) rename {app => androidApp}/src/fdroid/kotlin/org/meshtastic/app/map/MapView.kt (100%) rename {app => androidApp}/src/fdroid/kotlin/org/meshtastic/app/map/MapViewExtensions.kt (100%) rename {app => androidApp}/src/fdroid/kotlin/org/meshtastic/app/map/MapViewModel.kt (100%) rename {app => androidApp}/src/fdroid/kotlin/org/meshtastic/app/map/MapViewWithLifecycle.kt (100%) rename {app => androidApp}/src/fdroid/kotlin/org/meshtastic/app/map/SqlTileWriterExt.kt (100%) rename {app => androidApp}/src/fdroid/kotlin/org/meshtastic/app/map/component/CacheLayout.kt (100%) rename {app => androidApp}/src/fdroid/kotlin/org/meshtastic/app/map/component/DownloadButton.kt (100%) rename {app => androidApp}/src/fdroid/kotlin/org/meshtastic/app/map/component/EditWaypointDialog.kt (100%) rename {app => androidApp}/src/fdroid/kotlin/org/meshtastic/app/map/model/CustomTileSource.kt (100%) rename {app => androidApp}/src/fdroid/kotlin/org/meshtastic/app/map/model/MarkerWithLabel.kt (100%) rename {app => androidApp}/src/fdroid/kotlin/org/meshtastic/app/map/model/NOAAWmsTileSource.kt (100%) rename {app => androidApp}/src/fdroid/kotlin/org/meshtastic/app/map/model/OnlineTileSourceAuth.kt (100%) rename {app => androidApp}/src/fdroid/kotlin/org/meshtastic/app/map/node/NodeMapScreen.kt (100%) rename {app => androidApp}/src/fdroid/kotlin/org/meshtastic/app/map/node/NodeTrackMap.kt (100%) rename {app => androidApp}/src/fdroid/kotlin/org/meshtastic/app/map/node/NodeTrackOsmMap.kt (100%) rename {app => androidApp}/src/fdroid/kotlin/org/meshtastic/app/map/traceroute/TracerouteMap.kt (100%) rename {app => androidApp}/src/fdroid/kotlin/org/meshtastic/app/map/traceroute/TracerouteOsmMap.kt (100%) rename {app => androidApp}/src/fdroid/kotlin/org/meshtastic/app/node/component/InlineMap.kt (100%) rename {app => androidApp}/src/fdroid/kotlin/org/meshtastic/app/node/metrics/TracerouteMapOverlayInsets.kt (100%) rename {app => androidApp}/src/fdroid/res/drawable/ic_location_on.xml (100%) rename {app => androidApp}/src/fdroid/res/drawable/ic_map_location_dot.xml (100%) rename {app => androidApp}/src/fdroid/res/drawable/ic_map_navigation.xml (100%) rename {app => androidApp}/src/fdroidDebug/res/drawable-anydpi/ic_launcher_background.xml (100%) rename {app => androidApp}/src/fdroidDebug/res/values/strings.xml (100%) rename {app => androidApp}/src/google/AndroidManifest.xml (100%) rename {app => androidApp}/src/google/kotlin/org/meshtastic/app/analytics/GooglePlatformAnalytics.kt (100%) rename {app => androidApp}/src/google/kotlin/org/meshtastic/app/di/FlavorModule.kt (100%) rename {app => androidApp}/src/google/kotlin/org/meshtastic/app/di/GoogleNetworkModule.kt (100%) rename {app => androidApp}/src/google/kotlin/org/meshtastic/app/intro/AnalyticsIntro.kt (100%) rename {app => androidApp}/src/google/kotlin/org/meshtastic/app/map/GetMapViewProvider.kt (100%) rename {app => androidApp}/src/google/kotlin/org/meshtastic/app/map/GoogleMapViewProvider.kt (100%) rename {app => androidApp}/src/google/kotlin/org/meshtastic/app/map/LocationHandler.kt (100%) rename {app => androidApp}/src/google/kotlin/org/meshtastic/app/map/MBTilesProvider.kt (100%) rename {app => androidApp}/src/google/kotlin/org/meshtastic/app/map/MapView.kt (100%) rename {app => androidApp}/src/google/kotlin/org/meshtastic/app/map/MapViewModel.kt (100%) rename {app => androidApp}/src/google/kotlin/org/meshtastic/app/map/component/ClusterItemsListDialog.kt (100%) rename {app => androidApp}/src/google/kotlin/org/meshtastic/app/map/component/CustomMapLayersSheet.kt (100%) rename {app => androidApp}/src/google/kotlin/org/meshtastic/app/map/component/CustomTileProviderManagerSheet.kt (100%) rename {app => androidApp}/src/google/kotlin/org/meshtastic/app/map/component/EditWaypointDialog.kt (100%) rename {app => androidApp}/src/google/kotlin/org/meshtastic/app/map/component/MapFilterDropdown.kt (100%) rename {app => androidApp}/src/google/kotlin/org/meshtastic/app/map/component/MapTypeDropdown.kt (100%) rename {app => androidApp}/src/google/kotlin/org/meshtastic/app/map/component/NodeClusterMarkers.kt (100%) rename {app => androidApp}/src/google/kotlin/org/meshtastic/app/map/component/PulsingNodeChip.kt (100%) rename {app => androidApp}/src/google/kotlin/org/meshtastic/app/map/component/WaypointMarkers.kt (100%) rename {app => androidApp}/src/google/kotlin/org/meshtastic/app/map/model/CustomTileProviderConfig.kt (100%) rename {app => androidApp}/src/google/kotlin/org/meshtastic/app/map/model/CustomTileSource.kt (100%) rename {app => androidApp}/src/google/kotlin/org/meshtastic/app/map/model/NodeClusterItem.kt (100%) rename {app => androidApp}/src/google/kotlin/org/meshtastic/app/map/node/NodeMapScreen.kt (100%) rename {app => androidApp}/src/google/kotlin/org/meshtastic/app/map/node/NodeTrackMap.kt (100%) rename {app => androidApp}/src/google/kotlin/org/meshtastic/app/map/prefs/di/GoogleMapsKoinModule.kt (100%) rename {app => androidApp}/src/google/kotlin/org/meshtastic/app/map/prefs/map/GoogleMapsPrefs.kt (100%) rename {app => androidApp}/src/google/kotlin/org/meshtastic/app/map/repository/CustomTileProviderRepository.kt (100%) rename {app => androidApp}/src/google/kotlin/org/meshtastic/app/map/traceroute/TracerouteMap.kt (100%) rename {app => androidApp}/src/google/kotlin/org/meshtastic/app/node/component/InlineMap.kt (100%) rename {app => androidApp}/src/google/kotlin/org/meshtastic/app/node/metrics/TracerouteMapOverlayInsets.kt (100%) rename {app => androidApp}/src/googleDebug/res/drawable-anydpi/ic_launcher_background.xml (100%) rename {app => androidApp}/src/googleDebug/res/values/strings.xml (100%) rename {app => androidApp}/src/main/.gitignore (100%) rename {app => androidApp}/src/main/AndroidManifest.xml (100%) rename {app => androidApp}/src/main/assets/device_bootloader_ota_quirks.json (100%) rename {app => androidApp}/src/main/assets/device_hardware.json (100%) rename {app => androidApp}/src/main/assets/firmware_releases.json (100%) rename {app => androidApp}/src/main/ic_launcher-114x114.png (100%) rename {app => androidApp}/src/main/ic_launcher2-playstore.png (100%) rename {app => androidApp}/src/main/kotlin/org/meshtastic/app/MainActivity.kt (100%) rename {app => androidApp}/src/main/kotlin/org/meshtastic/app/MainKoinModule.kt (100%) rename {app => androidApp}/src/main/kotlin/org/meshtastic/app/MeshUtilApplication.kt (100%) rename {app => androidApp}/src/main/kotlin/org/meshtastic/app/di/AndroidKoinApp.kt (100%) rename {app => androidApp}/src/main/kotlin/org/meshtastic/app/di/AppKoinModule.kt (100%) rename {app => androidApp}/src/main/kotlin/org/meshtastic/app/di/NetworkModule.kt (100%) rename {app => androidApp}/src/main/kotlin/org/meshtastic/app/ui/Main.kt (100%) rename {app => androidApp}/src/main/res/drawable-anydpi/ic_launcher_background.xml (100%) rename {app => androidApp}/src/main/res/drawable-anydpi/ic_launcher_foreground.xml (100%) rename {app => androidApp}/src/main/res/drawable-anydpi/ic_splash.xml (100%) rename {app => androidApp}/src/main/res/layout/widget_local_stats_preview.xml (100%) rename {app => androidApp}/src/main/res/mipmap-anydpi/ic_launcher.xml (100%) rename {app => androidApp}/src/main/res/raw/keep.xml (100%) rename {app => androidApp}/src/main/res/values/strings.xml (100%) rename {app => androidApp}/src/main/res/values/styles.xml (100%) rename {app => androidApp}/src/main/res/xml/automotive_app_desc.xml (100%) rename {app => androidApp}/src/main/res/xml/data_extraction_rules.xml (100%) rename {app => androidApp}/src/main/res/xml/device_filter.xml (100%) rename {app => androidApp}/src/main/res/xml/locales_config.xml (100%) rename {app => androidApp}/src/main/res/xml/network_security_config.xml (100%) rename {app => androidApp}/src/test/kotlin/org/meshtastic/app/di/KoinVerificationTest.kt (100%) rename {app => androidApp}/src/test/kotlin/org/meshtastic/app/service/Fakes.kt (100%) rename {app => androidApp}/src/test/kotlin/org/meshtastic/app/ui/NavigationAssemblyTest.kt (100%) rename {app => androidApp}/src/test/kotlin/org/meshtastic/app/ui/UIUnitTest.kt (100%) rename {app => androidApp}/src/test/kotlin/org/meshtastic/app/ui/metrics/EnvironmentMetricsTest.kt (100%) rename {app => androidApp}/src/test/resources/robolectric.properties (100%) rename {desktop => desktopApp}/.gitignore (100%) rename {desktop => desktopApp}/README.md (93%) rename {desktop => desktopApp}/build.gradle.kts (100%) rename {desktop => desktopApp}/detekt-baseline.xml (100%) rename {desktop => desktopApp}/entitlements.plist (100%) rename {desktop => desktopApp}/proguard-rules.pro (100%) rename {desktop => desktopApp}/src/main/kotlin/org/meshtastic/desktop/DesktopNotificationManager.kt (100%) rename {desktop => desktopApp}/src/main/kotlin/org/meshtastic/desktop/Main.kt (100%) rename {desktop => desktopApp}/src/main/kotlin/org/meshtastic/desktop/data/DesktopPreferencesDataSource.kt (100%) rename {desktop => desktopApp}/src/main/kotlin/org/meshtastic/desktop/di/DesktopDiModule.kt (100%) rename {desktop => desktopApp}/src/main/kotlin/org/meshtastic/desktop/di/DesktopKoinModule.kt (100%) rename {desktop => desktopApp}/src/main/kotlin/org/meshtastic/desktop/di/DesktopPlatformModule.kt (100%) rename {desktop => desktopApp}/src/main/kotlin/org/meshtastic/desktop/navigation/DesktopNavigation.kt (100%) rename {desktop => desktopApp}/src/main/kotlin/org/meshtastic/desktop/notification/DesktopMeshServiceNotifications.kt (100%) rename {desktop => desktopApp}/src/main/kotlin/org/meshtastic/desktop/notification/DesktopOS.kt (100%) rename {desktop => desktopApp}/src/main/kotlin/org/meshtastic/desktop/notification/LinuxNotificationSender.kt (100%) rename {desktop => desktopApp}/src/main/kotlin/org/meshtastic/desktop/notification/MacOSNotificationSender.kt (100%) rename {desktop => desktopApp}/src/main/kotlin/org/meshtastic/desktop/notification/NativeNotificationSender.kt (100%) rename {desktop => desktopApp}/src/main/kotlin/org/meshtastic/desktop/notification/WindowsNotificationSender.kt (100%) rename {desktop => desktopApp}/src/main/kotlin/org/meshtastic/desktop/radio/DesktopMessageQueue.kt (100%) rename {desktop => desktopApp}/src/main/kotlin/org/meshtastic/desktop/radio/DesktopRadioTransportFactory.kt (100%) rename {desktop => desktopApp}/src/main/kotlin/org/meshtastic/desktop/stub/CompassStubs.kt (100%) rename {desktop => desktopApp}/src/main/kotlin/org/meshtastic/desktop/stub/NoopStubs.kt (100%) rename {desktop => desktopApp}/src/main/kotlin/org/meshtastic/desktop/ui/DesktopMainScreen.kt (100%) rename {desktop => desktopApp}/src/main/resources/icon.icns (100%) rename {desktop => desktopApp}/src/main/resources/icon.ico (100%) rename {desktop => desktopApp}/src/main/resources/icon.png (100%) rename {desktop => desktopApp}/src/main/resources/tray_icon_black.svg (100%) rename {desktop => desktopApp}/src/main/resources/tray_icon_white.svg (100%) rename {desktop => desktopApp}/src/test/kotlin/org/meshtastic/desktop/di/DesktopKoinTest.kt (100%) rename {desktop => desktopApp}/src/test/kotlin/org/meshtastic/desktop/notification/DesktopNotificationManagerTest.kt (100%) rename {desktop => desktopApp}/src/test/kotlin/org/meshtastic/desktop/notification/LinuxNotificationSenderTest.kt (100%) rename {desktop => desktopApp}/src/test/kotlin/org/meshtastic/desktop/notification/MacOSNotificationSenderTest.kt (100%) rename {desktop => desktopApp}/src/test/kotlin/org/meshtastic/desktop/notification/WindowsNotificationSenderTest.kt (100%) rename {desktop => desktopApp}/src/test/kotlin/org/meshtastic/desktop/ui/DesktopTopLevelDestinationParityTest.kt (100%) delete mode 100755 scripts/desktop-only-prep.sh delete mode 100644 scripts/desktop-only-rules/remove-android-block.yml delete mode 100644 scripts/desktop-only-rules/remove-android-device-test.yml delete mode 100644 scripts/desktop-only-rules/remove-android-host-test.yml delete mode 100644 scripts/desktop-only-rules/remove-android-imports.yml delete mode 100644 scripts/desktop-only-rules/remove-android-instrumented-test.yml delete mode 100644 scripts/desktop-only-rules/remove-android-main-deps.yml delete mode 100644 scripts/desktop-only-rules/remove-ksp-android.yml delete mode 100644 scripts/desktop-only-rules/remove-parcelize-plugin.yml delete mode 100644 scripts/sgconfig.yml create mode 100644 specs/006-kmp-project-structure/checklists/build-migration.md create mode 100644 specs/006-kmp-project-structure/checklists/requirements.md create mode 100644 specs/006-kmp-project-structure/data-model.md create mode 100644 specs/006-kmp-project-structure/plan.md create mode 100644 specs/006-kmp-project-structure/quickstart.md create mode 100644 specs/006-kmp-project-structure/research.md create mode 100644 specs/006-kmp-project-structure/spec.md create mode 100644 specs/006-kmp-project-structure/tasks.md diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 583acbae8..d357d0d98 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -18,7 +18,7 @@ git submodule update --init ./gradlew :core:data:allTests # Single module tests (Android-only module like :app) -./gradlew :app:testFdroidDebugUnitTest +./gradlew :androidApp:testFdroidDebugUnitTest # Cross-platform compilation check (no tests) ./gradlew kmpSmokeCompile @@ -46,7 +46,7 @@ KMP modules have different task names than pure-Android modules. Using the wrong ## Quick Reference -- **Architecture**: KMP project (Android, Desktop, iOS). Business logic in `commonMain`; platform shells (`app/`, `desktop/`) wire DI and host UI. See `AGENTS.md` and `.skills/kmp-architecture/`. +- **Architecture**: KMP project (Android, Desktop, iOS). Business logic in `commonMain`; platform shells (`androidApp/`, `desktopApp/`) wire DI and host UI. See `AGENTS.md` and `.skills/kmp-architecture/`. - **Flavors**: `fdroid` (OSS) / `google` (Maps + DataDog). Only one installable at a time (different signing keys). - **Verify before push**: Run `./gradlew spotlessApply detekt assembleDebug test allTests`, then confirm CI with `gh pr checks `. - **Strings**: `stringResource(Res.string.key)` — run `python3 scripts/sort-strings.py` after adding strings. diff --git a/.github/instructions/ci-workflows.instructions.md b/.github/instructions/ci-workflows.instructions.md index 55a72b328..fceb3270e 100644 --- a/.github/instructions/ci-workflows.instructions.md +++ b/.github/instructions/ci-workflows.instructions.md @@ -5,7 +5,7 @@ excludeAgent: "code-review" # CI Workflow Rules -- Prefer explicit Gradle task paths (`app:lintFdroidDebug`) over shorthand (`lintDebug`). +- Prefer explicit Gradle task paths (`androidApp:lintFdroidDebug`) over shorthand (`lintDebug`). - CI uses `.github/ci-gradle.properties` — don't assume local `gradle.properties` values. - CI passes `-Pci=true` to enable full processor usage via `maxParallelForks`. - Use `fetch-depth: 0` only where needed (spotless ratcheting, version code). Use `fetch-depth: 1` otherwise. diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index f7c8151c7..ed21cdd60 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -8,10 +8,10 @@ on: - main paths: # Only rebuild docs when source code changes (Dokka generates from KDoc) - - 'app/src/**' + - 'androidApp/src/**' - 'core/**/src/**' - 'feature/**/src/**' - - 'desktop/src/**' + - 'desktopApp/src/**' - 'build-logic/**' - 'build.gradle.kts' - 'settings.gradle.kts' diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index 0e70c3c41..fcb82906c 100644 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -30,9 +30,9 @@ jobs: - '.github/workflows/**' - '.github/actions/**' # Product modules validated by reusable-check - - 'app/**' + - 'androidApp/**' - 'baselineprofile/**' - - 'desktop/**' + - 'desktopApp/**' - 'core/**' - 'feature/**' - 'screenshot-tests/**' @@ -95,9 +95,9 @@ jobs: PY # 2. VALIDATION & BUILD: Delegate to reusable-check.yml - # We disable coverage for PRs to keep feedback fast (< 10 mins). - # Desktop compilation is covered by :desktop:test in the shard-app test shard. - # Native desktop packaging (createDistributable) only runs in release.yml. + # We disable coverage and desktop builds for PRs to keep feedback fast + # (< 10 mins). Desktop compilation is already covered by the :desktopApp:test + # task in the shard-app test shard. validate-and-build: needs: check-changes if: needs.check-changes.outputs.android == 'true' diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 408c1f9ea..4f12cf5c8 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -150,9 +150,9 @@ jobs: GOOGLE_MAPS_API_KEY: ${{ secrets.GOOGLE_MAPS_API_KEY }} GOOGLE_PLAY_JSON_KEY: ${{ secrets.GOOGLE_PLAY_JSON_KEY }} run: | - rm -f ./app/google-services.json - echo $GSERVICES > ./app/google-services.json - echo $KEYSTORE | base64 -di > ./app/$KEYSTORE_FILENAME + rm -f ./androidApp/google-services.json + echo $GSERVICES > ./androidApp/google-services.json + echo $KEYSTORE | base64 -di > ./androidApp/$KEYSTORE_FILENAME echo "$KEYSTORE_PROPERTIES" > ./keystore.properties echo "datadogApplicationId=$DATADOG_APPLICATION_ID" >> ./secrets.properties echo "datadogClientToken=$DATADOG_CLIENT_TOKEN" >> ./secrets.properties @@ -172,14 +172,14 @@ jobs: run: bundle exec fastlane internal - name: List outputs - run: ls -R app/build/outputs/ + run: ls -R androidApp/build/outputs/ - name: Upload Google AAB artifact if: always() uses: actions/upload-artifact@v7 with: name: google-aab - path: app/build/outputs/bundle/googleRelease/app-google-release.aab + path: androidApp/build/outputs/bundle/googleRelease/androidApp-google-release.aab retention-days: 1 - name: Upload Google APK artifact @@ -187,20 +187,20 @@ jobs: uses: actions/upload-artifact@v7 with: name: google-apk - path: app/build/outputs/apk/google/release/*.apk + path: androidApp/build/outputs/apk/google/release/*.apk retention-days: 1 - name: Attest Google AAB provenance if: success() uses: actions/attest-build-provenance@v4 with: - subject-path: app/build/outputs/bundle/googleRelease/app-google-release.aab + subject-path: androidApp/build/outputs/bundle/googleRelease/androidApp-google-release.aab - name: Attest Google APK provenance if: success() uses: actions/attest-build-provenance@v4 with: - subject-path: app/build/outputs/apk/google/release/*.apk + subject-path: androidApp/build/outputs/apk/google/release/*.apk release-fdroid: runs-on: ubuntu-24.04 @@ -229,7 +229,7 @@ jobs: KEYSTORE_FILENAME: ${{ secrets.KEYSTORE_FILENAME }} KEYSTORE_PROPERTIES: ${{ secrets.KEYSTORE_PROPERTIES }} run: | - echo $KEYSTORE | base64 -di > ./app/$KEYSTORE_FILENAME + echo $KEYSTORE | base64 -di > ./androidApp/$KEYSTORE_FILENAME echo "$KEYSTORE_PROPERTIES" > ./keystore.properties - name: Setup Fastlane @@ -245,21 +245,21 @@ jobs: run: bundle exec fastlane fdroid_build - name: List outputs - run: ls -R app/build/outputs/ + run: ls -R androidApp/build/outputs/ - name: Upload F-Droid APK artifact if: always() uses: actions/upload-artifact@v7 with: name: fdroid-apk - path: app/build/outputs/apk/fdroid/release/*.apk + path: androidApp/build/outputs/apk/fdroid/release/*.apk retention-days: 1 - name: Attest F-Droid APK provenance if: success() uses: actions/attest-build-provenance@v4 with: - subject-path: app/build/outputs/apk/fdroid/release/*.apk + subject-path: androidApp/build/outputs/apk/fdroid/release/*.apk release-desktop: if: ${{ inputs.build_desktop }} @@ -307,13 +307,13 @@ jobs: # `-PaboutLibraries.release=true` as member access on `-PaboutLibraries`, # splitting the token and feeding `.release=true` to Gradle as a task name. run: > - ./gradlew :desktop:packageReleaseDistributionForCurrentOS - ${{ contains(runner.os, 'macOS') && ':desktop:packageReleaseUberJarForCurrentOS' || '' }} + ./gradlew :desktopApp:packageReleaseDistributionForCurrentOS + ${{ contains(runner.os, 'macOS') && ':desktopApp:packageReleaseUberJarForCurrentOS' || '' }} '-PaboutLibraries.release=true' --no-daemon - name: List Desktop Binaries if: runner.os == 'Linux' || runner.os == 'macOS' - run: ls -R desktop/build/compose/binaries/main-release + run: ls -R desktopApp/build/compose/binaries/main-release - name: Upload Desktop Artifacts if: always() @@ -321,13 +321,13 @@ jobs: with: name: desktop-${{ runner.os }}-${{ runner.arch }} path: | - desktop/build/compose/binaries/main-release/*/*.dmg - desktop/build/compose/binaries/main-release/*/*.msi - desktop/build/compose/binaries/main-release/*/*.exe - desktop/build/compose/binaries/main-release/*/*.deb - desktop/build/compose/binaries/main-release/*/*.rpm - desktop/build/compose/binaries/main-release/*/*.AppImage - desktop/build/compose/jars/*-release.jar + desktopApp/build/compose/binaries/main-release/*/*.dmg + desktopApp/build/compose/binaries/main-release/*/*.msi + desktopApp/build/compose/binaries/main-release/*/*.exe + desktopApp/build/compose/binaries/main-release/*/*.deb + desktopApp/build/compose/binaries/main-release/*/*.rpm + desktopApp/build/compose/binaries/main-release/*/*.AppImage + desktopApp/build/compose/jars/*-release.jar retention-days: 1 if-no-files-found: ignore @@ -336,13 +336,13 @@ jobs: uses: actions/attest-build-provenance@v4 with: subject-path: | - desktop/build/compose/binaries/main-release/*/*.dmg - desktop/build/compose/binaries/main-release/*/*.msi - desktop/build/compose/binaries/main-release/*/*.exe - desktop/build/compose/binaries/main-release/*/*.deb - desktop/build/compose/binaries/main-release/*/*.rpm - desktop/build/compose/binaries/main-release/*/*.AppImage - desktop/build/compose/jars/*-release.jar + desktopApp/build/compose/binaries/main-release/*/*.dmg + desktopApp/build/compose/binaries/main-release/*/*.msi + desktopApp/build/compose/binaries/main-release/*/*.exe + desktopApp/build/compose/binaries/main-release/*/*.deb + desktopApp/build/compose/binaries/main-release/*/*.rpm + desktopApp/build/compose/binaries/main-release/*/*.AppImage + desktopApp/build/compose/jars/*-release.jar create-flatpak-src: if: ${{ inputs.build_flatpak_src }} @@ -370,22 +370,7 @@ jobs: gradle_encryption_key: ${{ secrets.GRADLE_ENCRYPTION_KEY }} cache_read_only: 'true' - - name: Python Setup - uses: actions/setup-python@v6 - with: - python-version: '3.x' - - - name: Install ast-grep - run: pip install ast-grep-cli - - # Remove Android/iOS targets and other non-desktop bits - # that would break the flatpakGradleGenerator - - name: Prepare Offline Desktop Build - run: ./scripts/desktop-only-prep.sh - - name: Generate Flatpak Sources - env: - DESKTOP_ONLY: true run: > ./gradlew :build-logic:convention:flatpakGradleGenerator flatpakGradleGenerator --no-configuration-cache --refresh-dependencies --no-parallel diff --git a/.github/workflows/reusable-check.yml b/.github/workflows/reusable-check.yml index 74bb726ec..c87b954c1 100644 --- a/.github/workflows/reusable-check.yml +++ b/.github/workflows/reusable-check.yml @@ -94,7 +94,7 @@ jobs: - name: Lint, Analysis & KMP Smoke Compile if: inputs.run_lint == true - run: ./gradlew spotlessCheck detekt app:lintFdroidDebug app:lintGoogleDebug core:barcode:lintFdroidDebug core:barcode:lintGoogleDebug core:api:lintDebug kmpSmokeCompile -Pci=true --continue --scan + run: ./gradlew spotlessCheck detekt androidApp:lintFdroidDebug androidApp:lintGoogleDebug core:barcode:lintFdroidDebug core:barcode:lintGoogleDebug core:api:lintDebug kmpSmokeCompile -Pci=true --continue --scan - name: KMP Smoke Compile (lint skipped) if: inputs.run_lint == false @@ -152,13 +152,13 @@ jobs: # See: https://github.com/meshtastic/Meshtastic-Android/issues/3231 echo "── Step 1: Verify aboutlibraries.json determinism ──" - rm -f app/src/main/resources/aboutlibraries.json - ./gradlew :app:exportLibraryDefinitions -Pci=true --no-configuration-cache - cp app/src/main/resources/aboutlibraries.json /tmp/aboutlibraries-run1.json + rm -f androidApp/src/main/resources/aboutlibraries.json + ./gradlew :androidApp:exportLibraryDefinitions -Pci=true --no-configuration-cache + cp androidApp/src/main/resources/aboutlibraries.json /tmp/aboutlibraries-run1.json - rm -f app/src/main/resources/aboutlibraries.json - ./gradlew :app:exportLibraryDefinitions -Pci=true --no-configuration-cache --rerun-tasks - cp app/src/main/resources/aboutlibraries.json /tmp/aboutlibraries-run2.json + rm -f androidApp/src/main/resources/aboutlibraries.json + ./gradlew :androidApp:exportLibraryDefinitions -Pci=true --no-configuration-cache --rerun-tasks + cp androidApp/src/main/resources/aboutlibraries.json /tmp/aboutlibraries-run2.json if ! diff -q /tmp/aboutlibraries-run1.json /tmp/aboutlibraries-run2.json; then echo "::error::aboutlibraries.json is NOT deterministic across runs!" @@ -168,9 +168,9 @@ jobs: echo "✅ aboutlibraries.json is deterministic" echo "── Step 2: Build fdroid release APK ──" - ./gradlew :app:assembleFdroidRelease -Pci=true -Pmeshtastic.disableAbiSplits=true --no-configuration-cache + ./gradlew :androidApp:assembleFdroidRelease -Pci=true -Pmeshtastic.disableAbiSplits=true --no-configuration-cache - APK=$(find app/build/outputs/apk/fdroid/release -name "*.apk" | head -1) + APK=$(find androidApp/build/outputs/apk/fdroid/release -name "*.apk" | head -1) if [ -z "$APK" ]; then echo "::error::No fdroid release APK found" exit 1 @@ -295,7 +295,7 @@ jobs: # Tests are split into 3 shards that run in parallel: # shard-core: core:* KMP module tests (allTests) # shard-feature: feature:* KMP module tests (allTests) - # shard-app: Pure-Android/JVM tests (app, desktop, core:barcode, etc.) + # shard-app: Pure-Android/JVM tests (androidApp, desktopApp, core:barcode, etc.) test-shards: runs-on: ubuntu-24.04 permissions: @@ -359,17 +359,17 @@ jobs: :feature:settings:koverXmlReport - name: shard-app tasks: >- - :app:testFdroidDebugUnitTest - :app:testGoogleDebugUnitTest - :desktop:test + :androidApp:testFdroidDebugUnitTest + :androidApp:testGoogleDebugUnitTest + :desktopApp:test :core:barcode:testFdroidDebugUnitTest :core:barcode:testGoogleDebugUnitTest kover: >- - :app:koverXmlReportFdroidDebug - :app:koverXmlReportGoogleDebug + :androidApp:koverXmlReportFdroidDebug + :androidApp:koverXmlReportGoogleDebug :core:barcode:koverXmlReportFdroidDebug :core:barcode:koverXmlReportGoogleDebug - :desktop:koverXmlReport + :desktopApp:koverXmlReport steps: - name: Checkout code @@ -447,14 +447,14 @@ jobs: cache_read_only: ${{ needs.lint-check.outputs.cache_read_only }} - name: Build Android APKs - run: ./gradlew app:assembleFdroidDebug app:assembleGoogleDebug -Pci=true --parallel --configuration-cache --continue --scan + run: ./gradlew androidApp:assembleFdroidDebug androidApp:assembleGoogleDebug -Pci=true --parallel --configuration-cache --continue --scan - name: Upload debug artifact if: ${{ inputs.upload_artifacts }} uses: actions/upload-artifact@v7 with: name: app-debug-apks - path: app/build/outputs/apk/*/debug/*.apk + path: androidApp/build/outputs/apk/*/debug/*.apk retention-days: 7 - name: Report App Size @@ -463,8 +463,47 @@ jobs: echo "### App Size Report" >> $GITHUB_STEP_SUMMARY echo "| Artifact | Size |" >> $GITHUB_STEP_SUMMARY echo "| --- | --- |" >> $GITHUB_STEP_SUMMARY - find app/build/outputs/apk -name "*.apk" -exec du -h {} + | awk '{print "| " $2 " | " $1 " |"}' >> $GITHUB_STEP_SUMMARY + find androidApp/build/outputs/apk -name "*.apk" -exec du -h {} + | awk '{print "| " $2 " | " $1 " |"}' >> $GITHUB_STEP_SUMMARY + # ── Desktop Build ─────────────────────────────────────────────────── + build-desktop: + name: Build Desktop Debug (${{ matrix.os }}) + if: inputs.run_desktop_builds == true + runs-on: ${{ matrix.os }} + permissions: + contents: read + timeout-minutes: 60 + needs: lint-check + strategy: + fail-fast: false + matrix: + os: [macos-latest, windows-latest, ubuntu-24.04, ubuntu-24.04-arm] + env: + VERSION_CODE: ${{ needs.lint-check.outputs.version_code }} + + steps: + - name: Checkout code + uses: actions/checkout@v6 + with: + fetch-depth: 1 + submodules: true + + - name: Gradle Setup + uses: ./.github/actions/gradle-setup + with: + gradle_encryption_key: ${{ secrets.GRADLE_ENCRYPTION_KEY }} + cache_read_only: ${{ needs.lint-check.outputs.cache_read_only }} + + - name: Build Desktop + run: ./gradlew :desktopApp:createDistributable -Pci=true --scan + + - name: Upload Desktop artifact + if: ${{ inputs.upload_artifacts }} + uses: actions/upload-artifact@v7 + with: + name: desktop-app-${{ runner.os }}-${{ runner.arch }} + path: desktopApp/build/compose/binaries/main/app/ + retention-days: 7 # ── Flatpak Sources ─────────────────────────────────────────────────── build-flatpak-src: @@ -494,23 +533,8 @@ jobs: with: gradle_encryption_key: ${{ secrets.GRADLE_ENCRYPTION_KEY }} cache_read_only: true - - - name: Python Setup - uses: actions/setup-python@v6 - with: - python-version: '3.x' - - - name: Install ast-grep - run: pip install ast-grep-cli - - # Remove Android/iOS targets and other non-desktop bits - # that would break the flatpakGradleGenerator - - name: Prepare Offline Desktop Build - run: ./scripts/desktop-only-prep.sh - name: Generate Flatpak Sources - env: - DESKTOP_ONLY: true run: > ./gradlew :build-logic:convention:flatpakGradleGenerator flatpakGradleGenerator --no-configuration-cache --refresh-dependencies --no-parallel diff --git a/.github/workflows/scheduled-updates.yml b/.github/workflows/scheduled-updates.yml index 06f7a9e84..216d05c4e 100644 --- a/.github/workflows/scheduled-updates.yml +++ b/.github/workflows/scheduled-updates.yml @@ -22,7 +22,7 @@ jobs: - name: Update firmware releases list id: firmware run: | - firmware_file_path="app/src/main/assets/firmware_releases.json" + firmware_file_path="androidApp/src/main/assets/firmware_releases.json" temp_firmware_file="/tmp/new_firmware_releases.json" echo "Fetching latest firmware releases..." @@ -51,7 +51,7 @@ jobs: - name: Update hardware list id: hardware run: | - hardware_file_path="app/src/main/assets/device_hardware.json" + hardware_file_path="androidApp/src/main/assets/device_hardware.json" temp_hardware_file="/tmp/new_device_hardware.json" echo "Fetching latest device hardware data..." @@ -172,8 +172,8 @@ jobs: base: 'main' delete-branch: true add-paths: | - app/src/main/assets/firmware_releases.json - app/src/main/assets/device_hardware.json + androidApp/src/main/assets/firmware_releases.json + androidApp/src/main/assets/device_hardware.json fastlane/metadata/android/** **/strings.xml **/README.md diff --git a/.skills/code-review/SKILL.md b/.skills/code-review/SKILL.md index b9442e07d..286d65ec9 100644 --- a/.skills/code-review/SKILL.md +++ b/.skills/code-review/SKILL.md @@ -23,8 +23,8 @@ When reviewing code, meticulously verify the following categories. Flag any devi - [ ] **Compose Multiplatform Resources:** Ensure NO hardcoded strings. Must use `core:resources` (e.g., `stringResource(Res.string.key)` or asynchronous `getStringSuspend(Res.string.key)` for ViewModels/Coroutines). NEVER use blocking `getString()` in a coroutine. - [ ] **String Formatting:** CMP only supports `%N$s` and `%N$d`. Flag any float formats (`%N$.1f`) in Compose string resources; they must be pre-formatted using `NumberFormatter.format()` from `core:common`. Use `MetricFormatter` for metric-specific displays (temperature, voltage, current, percent, humidity, pressure, SNR, RSSI). - [ ] **Centralized Dialogs & Alerts:** Flag inline alert-rendering logic. Mandate the use of `AlertHost(alertManager)` or `SharedDialogs` from `core:ui/commonMain`. -- [ ] **Placeholders:** Require `PlaceholderScreen(name)` from `core:ui/commonMain` for unimplemented desktop/JVM features. No inline placeholders in feature modules. -- [ ] **Adaptive Layouts:** Verify use of `currentWindowAdaptiveInfo(supportLargeAndXLargeWidth = true)` to support desktop/tablet breakpoints (≥ 1200dp). +- [ ] **Placeholders:** Require `PlaceholderScreen(name)` from `core:ui/commonMain` for unimplemented desktopApp/JVM features. No inline placeholders in feature modules. +- [ ] **Adaptive Layouts:** Verify use of `currentWindowAdaptiveInfo(supportLargeAndXLargeWidth = true)` to support desktopApp/tablet breakpoints (≥ 1200dp). ### 3. Navigation & State - [ ] **Shared Navigation Graphs:** Feature navigation graphs must be defined as extension functions on `EntryProviderScope` in `commonMain` (e.g., `fun EntryProviderScope.settingsGraph(...)`). Flag any graphs defined in platform-specific source sets. @@ -56,8 +56,8 @@ When reviewing code, meticulously verify the following categories. Flag any devi - [ ] **Robolectric Configuration:** Check that Compose UI tests running via Robolectric on JVM are pinned to `@Config(sdk = [34])` to prevent Java 21 / SDK 35 compatibility issues. ### 8. ProGuard / R8 Rules -- [ ] **New Dependencies:** If a new reflection-heavy dependency is added (DI, serialization, JNI, ServiceLoader), verify keep rules exist in **both** `app/proguard-rules.pro` (R8) and `desktop/proguard-rules.pro` (ProGuard). The two files must stay aligned. -- [ ] **Release Smoke-Test:** For dependency or ProGuard rule changes, verify `assembleRelease` and `./gradlew :desktop:runRelease` succeed. +- [ ] **New Dependencies:** If a new reflection-heavy dependency is added (DI, serialization, JNI, ServiceLoader), verify keep rules exist in **both** `androidApp/proguard-rules.pro` (R8) and `desktopApp/proguard-rules.pro` (ProGuard). The two files must stay aligned. +- [ ] **Release Smoke-Test:** For dependency or ProGuard rule changes, verify `assembleRelease` and `./gradlew :desktopApp:runRelease` succeed. ## Review Output Guidelines 1. **Be Specific & Constructive:** Provide exact file references and code snippets illustrating the required project pattern. diff --git a/.skills/compose-ui/SKILL.md b/.skills/compose-ui/SKILL.md index 22fe1b489..3249cb6e0 100644 --- a/.skills/compose-ui/SKILL.md +++ b/.skills/compose-ui/SKILL.md @@ -4,9 +4,9 @@ Guidelines for building shared UI, adaptive layouts, and handling strings/resources in Meshtastic-Android. The codebase uses Material 3 Adaptive. ## 1. UI Components & Layouts -- **Material 3 / Adaptive:** Use `currentWindowAdaptiveInfo(supportLargeAndXLargeWidth = true)` to support Large (1200dp) and XL (1600dp) breakpoints. Investigate 3-pane "Power User" scenes using Navigation 3 Scenes and draggable dividers for desktop/tablets. +- **Material 3 / Adaptive:** Use `currentWindowAdaptiveInfo(supportLargeAndXLargeWidth = true)` to support Large (1200dp) and XL (1600dp) breakpoints. Investigate 3-pane "Power User" scenes using Navigation 3 Scenes and draggable dividers for desktopApp/tablets. - **Dialogs & Alerts:** Use centralized components like `AlertHost(alertManager)` from `core:ui/commonMain`. Do NOT trigger alerts inline or duplicate alert logic. Use `SharedDialogs(uiViewModel)` for general popups. -- **Placeholders:** Use `PlaceholderScreen(name)` from `core:ui/commonMain` for unimplemented desktop/JVM features. +- **Placeholders:** Use `PlaceholderScreen(name)` from `core:ui/commonMain` for unimplemented desktopApp/JVM features. - **Theme Picker:** Use `ThemePickerDialog` from `feature:settings/commonMain`. - **Platform Implementations:** Inject platform-specific behavior (e.g., Map providers) via `CompositionLocal` from the `app` or `desktop` shells. Do not tightly couple Google Maps/osmdroid dependencies to `commonMain`. @@ -58,4 +58,4 @@ Choose the right tool for the job: ## Reference Anchors - **Shared Strings:** `core/resources/src/commonMain/composeResources/values/strings.xml` - **Platform abstraction contract:** `core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/util/MapViewProvider.kt` -- **Provider wiring:** `app/src/main/kotlin/org/meshtastic/app/MainActivity.kt` +- **Provider wiring:** `androidApp/src/main/kotlin/org/meshtastic/app/MainActivity.kt` diff --git a/.skills/implement-feature/SKILL.md b/.skills/implement-feature/SKILL.md index 0277bee10..f6558d37f 100644 --- a/.skills/implement-feature/SKILL.md +++ b/.skills/implement-feature/SKILL.md @@ -35,7 +35,7 @@ A step-by-step workflow for implementing a new feature in the Meshtastic-Android ```bash ./gradlew spotlessCheck spotlessApply detekt assembleDebug test allTests ``` -- If the feature adds a new reflection-heavy dependency, add keep rules to **both** `app/proguard-rules.pro` and `desktop/proguard-rules.pro`, then verify release builds: +- If the feature adds a new reflection-heavy dependency, add keep rules to **both** `androidApp/proguard-rules.pro` and `desktopApp/proguard-rules.pro`, then verify release builds: ```bash - ./gradlew assembleFdroidRelease :desktop:runRelease + ./gradlew assembleFdroidRelease :desktopApp:runRelease ``` diff --git a/.skills/kmp-architecture/SKILL.md b/.skills/kmp-architecture/SKILL.md index 46602c430..3a4ff0d3c 100644 --- a/.skills/kmp-architecture/SKILL.md +++ b/.skills/kmp-architecture/SKILL.md @@ -52,10 +52,10 @@ Guidelines on managing Kotlin Multiplatform (KMP) source-sets, expected abstract 1. Ensure all new logic compiles against the KMP core (`jvm()`, `iosArm64()`, etc.). 2. Do not use platform-specific constructs in `commonMain` or you break the iOS/Desktop builds. 3. Test using `kmpSmokeCompile` to verify cross-platform compilation. -4. For desktop wiring, copy the pattern in `desktop/src/main/kotlin/org/meshtastic/desktop/di/DesktopKoinModule.kt` and use `NoopStubs.kt` to temporarily mock missing platform implementations. +4. For desktop wiring, copy the pattern in `desktopApp/src/main/kotlin/org/meshtastic/desktop/di/DesktopKoinModule.kt` and use `NoopStubs.kt` to temporarily mock missing platform implementations. ## Reference Anchors - **Shared Okio I/O:** `core/domain/src/commonMain/kotlin/org/meshtastic/core/domain/usecase/settings/ImportProfileUseCase.kt` -- **Desktop DI Stubs:** `desktop/src/main/kotlin/org/meshtastic/desktop/stub/NoopStubs.kt` +- **Desktop DI Stubs:** `desktopApp/src/main/kotlin/org/meshtastic/desktop/stub/NoopStubs.kt` - **Version Catalog:** `gradle/libs.versions.toml` - **Convention Plugins:** `build-logic/convention/` diff --git a/.skills/navigation-and-di/SKILL.md b/.skills/navigation-and-di/SKILL.md index c9d7336a6..4119a91a0 100644 --- a/.skills/navigation-and-di/SKILL.md +++ b/.skills/navigation-and-di/SKILL.md @@ -7,7 +7,7 @@ This skill covers dependency injection (Koin Annotations 4.2.x) and JetBrains Na ### Guidelines 1. **Annotations First:** Use `@Module`, `@ComponentScan`, and `@KoinViewModel` annotations directly in `commonMain` shared modules to encapsulate dependency graphs per feature. -2. **App Root Assembly:** Don't assume feature/core `@Module` classes are active automatically. Ensure they are included by the app root module (`@Module(includes = [...])`) in `app/src/main/kotlin/org/meshtastic/app/di/AppKoinModule.kt` and `desktop/.../DesktopKoinModule.kt`. +2. **App Root Assembly:** Don't assume feature/core `@Module` classes are active automatically. Ensure they are included by the app root module (`@Module(includes = [...])`) in `androidApp/src/main/kotlin/org/meshtastic/app/di/AppKoinModule.kt` and `desktopApp/.../DesktopKoinModule.kt`. 3. **No Platform Bleed:** Don't put Android framework dependencies (`Context`, `Activity`, `Application`) into shared `commonMain` business logic. Inject interfaces instead. 4. **Resolution:** Resolve app-layer wrappers via `koinViewModel()` or injected bindings within Compose navigation graphs. @@ -49,8 +49,8 @@ startKoin { - **Custom Backstack Mutation:** Do **not** mutate back navigation with custom stacks disconnected from the app backstack. Mutate `NavBackStack` directly with `add(...)` and `removeLastOrNull()`. ## Reference Anchors -- **App Startup / Koin Bootstrap:** `app/src/main/kotlin/org/meshtastic/app/MeshUtilApplication.kt` -- **DI Bootstrap Object:** `app/src/main/kotlin/org/meshtastic/app/di/AndroidKoinApp.kt` -- **DI App Wiring:** `app/src/main/kotlin/org/meshtastic/app/di/AppKoinModule.kt` +- **App Startup / Koin Bootstrap:** `androidApp/src/main/kotlin/org/meshtastic/app/MeshUtilApplication.kt` +- **DI Bootstrap Object:** `androidApp/src/main/kotlin/org/meshtastic/app/di/AndroidKoinApp.kt` +- **DI App Wiring:** `androidApp/src/main/kotlin/org/meshtastic/app/di/AppKoinModule.kt` - **Shared Routes:** `core/navigation/src/commonMain/kotlin/org/meshtastic/core/navigation/Routes.kt` -- **Desktop Nav Shell:** `desktop/src/main/kotlin/org/meshtastic/desktop/ui/DesktopMainScreen.kt` +- **Desktop Nav Shell:** `desktopApp/src/main/kotlin/org/meshtastic/desktop/ui/DesktopMainScreen.kt` diff --git a/.skills/project-overview/SKILL.md b/.skills/project-overview/SKILL.md index 2224fa7ad..6c8133ad8 100644 --- a/.skills/project-overview/SKILL.md +++ b/.skills/project-overview/SKILL.md @@ -11,7 +11,7 @@ Module directory, namespacing conventions, environment setup, and troubleshootin | Directory | Description | | :--- | :--- | -| `app/` | Main application module. Contains `MainActivity`, Koin DI modules, and app-level logic. Uses package `org.meshtastic.app`. | +| `androidApp/` | Main application module. Contains `MainActivity`, Koin DI modules, and app-level logic. Uses package `org.meshtastic.app`. | | `build-logic/` | Convention plugins for shared build configuration (e.g., `meshtastic.kmp.feature`, `meshtastic.kmp.library`, `meshtastic.kmp.jvm.android`, `meshtastic.koin`). | | `config/` | Detekt static analysis rules (`config/detekt/detekt.yml`) and Spotless formatting config (`config/spotless/.editorconfig`). | | `docs/` | Architecture docs and agent playbooks. See `docs/kmp-status.md` and `docs/roadmap.md` for current status. | @@ -38,7 +38,7 @@ Module directory, namespacing conventions, environment setup, and troubleshootin | `feature/` | Feature modules (e.g., `settings`, `map`, `messaging`, `node`, `intro`, `connections`, `firmware`, `wifi-provision`, `widget`). All are KMP except `widget`. Use `meshtastic.kmp.feature` convention plugin. | | `feature/wifi-provision` | KMP WiFi provisioning via BLE (Nymea protocol). Uses `core:ble` Kable abstractions. | | `feature/firmware` | Fully KMP firmware update system: Unified OTA (BLE + WiFi), native Nordic Secure DFU protocol (pure KMP), USB/UF2 updates, and `FirmwareRetriever` with manifest-based resolution. Desktop is a first-class target. | -| `desktop/` | Compose Desktop application. Thin host shell relying on feature modules for shared UI. Full Koin DI graph, TCP, Serial/USB, and BLE transports. Versioning via `config.properties` + `GitVersionValueSource`. | +| `desktopApp/` | Compose Desktop application. Thin host shell relying on feature modules for shared UI. Full Koin DI graph, TCP, Serial/USB, and BLE transports. Versioning via `config.properties` + `GitVersionValueSource`. | ## Namespacing - **Standard:** Use the `org.meshtastic.*` namespace for all code. diff --git a/.skills/testing-ci/SKILL.md b/.skills/testing-ci/SKILL.md index bb9857966..4144354c3 100644 --- a/.skills/testing-ci/SKILL.md +++ b/.skills/testing-ci/SKILL.md @@ -17,7 +17,7 @@ Run in a single invocation for routine changes to ensure code formatting, analys > In KMP modules, the `test` task name is **ambiguous**. Gradle matches both `testAndroid` and > `testAndroidHostTest` and refuses to run either, silently skipping KMP modules. > `allTests` is the `KotlinTestReport` lifecycle task registered by the KMP plugin. -> Conversely, `allTests` does **not** cover pure-Android modules (`:app`, `:core:api`, etc.), which is why both `test` and `allTests` are needed. +> Conversely, `allTests` does **not** cover pure-Android modules (`:androidApp`, `:core:api`, etc.), which is why both `test` and `allTests` are needed. *Note: If testing Compose UI on the JVM (Robolectric) with Java 21, pin tests to `@Config(sdk = [34])` to avoid SDK 35 compatibility crashes.* diff --git a/.specify/feature.json b/.specify/feature.json index c28b048e0..c800a6321 100644 --- a/.specify/feature.json +++ b/.specify/feature.json @@ -1 +1 @@ -{"feature_directory":"specs/20260511-211823-compose-screenshot-testing"} +{"feature_directory":"specs/006-kmp-project-structure"} diff --git a/AGENTS.md b/AGENTS.md index 75f08c34f..f7d3bdcd6 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -49,5 +49,5 @@ You are an expert Android/KMP engineer. Maintain architectural boundaries, use M For additional context about technologies to be used, project structure, shell commands, and other important information, read the current plan -at `specs/20260511-211823-compose-screenshot-testing/plan.md` +at `specs/006-kmp-project-structure/plan.md` diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d4fe0b740..f0b3ec49c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -20,7 +20,7 @@ Thank you for your interest in contributing to Meshtastic-Android! We welcome co - Add comments where necessary, especially for complex logic. - Keep methods and classes focused and concise. - **Strings:** Use localised strings via the **Compose Multiplatform Resource** library in `:core:resources`. - - Do **not** use the legacy `app/src/main/res/values/strings.xml`. + - Do **not** use the legacy `androidApp/src/main/res/values/strings.xml`. - **Definition:** Add strings to `core/resources/src/commonMain/composeResources/values/strings.xml`. - **Usage:** ```kotlin diff --git a/app/README.md b/androidApp/README.md similarity index 54% rename from app/README.md rename to androidApp/README.md index ff6f5542f..cc4b8cafe 100644 --- a/app/README.md +++ b/androidApp/README.md @@ -1,7 +1,7 @@ -# `:app` +# `:androidApp` ## Overview -The `:app` module is the entry point for the Meshtastic Android application. It orchestrates the various feature modules, manages global state, and provides the main UI shell. +The `:androidApp` module is the entry point for the Meshtastic Android application. It orchestrates the various feature modules, manages global state, and provides the main UI shell. ## Key Components @@ -9,7 +9,7 @@ The `:app` module is the entry point for the Meshtastic Android application. It The single Activity of the application. It hosts the shared `MeshtasticNavDisplay` navigation shell and manages the root UI structure (Navigation Bar, Rail, etc.). ### 2. `MeshService` -The core background service that manages long-running communication with the mesh radio. While it is declared in the `:app` manifest for system visibility, its implementation resides in the `:core:service` module. It runs as a **Foreground Service** to ensure reliable communication even when the app is in the background. +The core background service that manages long-running communication with the mesh radio. While it is declared in the `:androidApp` manifest for system visibility, its implementation resides in the `:core:service` module. It runs as a **Foreground Service** to ensure reliable communication even when the app is in the background. ### 3. Koin Application `MeshUtilApplication` is the Koin entry point, providing the global dependency injection container. @@ -24,34 +24,34 @@ The module primarily serves as a "glue" layer, connecting: ```mermaid graph TB - :app[app]:::android-application - :app -.-> :core:ble - :app -.-> :core:common - :app -.-> :core:data - :app -.-> :core:database - :app -.-> :core:datastore - :app -.-> :core:di - :app -.-> :core:domain - :app -.-> :core:model - :app -.-> :core:navigation - :app -.-> :core:network - :app -.-> :core:nfc - :app -.-> :core:prefs - :app -.-> :core:proto - :app -.-> :core:service - :app -.-> :core:resources - :app -.-> :core:ui - :app -.-> :core:barcode - :app -.-> :core:takserver - :app -.-> :feature:intro - :app -.-> :feature:messaging - :app -.-> :feature:connections - :app -.-> :feature:map - :app -.-> :feature:node - :app -.-> :feature:settings - :app -.-> :feature:firmware - :app -.-> :feature:wifi-provision - :app -.-> :feature:widget + :androidApp[androidApp]:::android-application + :androidApp -.-> :core:ble + :androidApp -.-> :core:common + :androidApp -.-> :core:data + :androidApp -.-> :core:database + :androidApp -.-> :core:datastore + :androidApp -.-> :core:di + :androidApp -.-> :core:domain + :androidApp -.-> :core:model + :androidApp -.-> :core:navigation + :androidApp -.-> :core:network + :androidApp -.-> :core:nfc + :androidApp -.-> :core:prefs + :androidApp -.-> :core:proto + :androidApp -.-> :core:service + :androidApp -.-> :core:resources + :androidApp -.-> :core:ui + :androidApp -.-> :core:barcode + :androidApp -.-> :core:takserver + :androidApp -.-> :feature:intro + :androidApp -.-> :feature:messaging + :androidApp -.-> :feature:connections + :androidApp -.-> :feature:map + :androidApp -.-> :feature:node + :androidApp -.-> :feature:settings + :androidApp -.-> :feature:firmware + :androidApp -.-> :feature:wifi-provision + :androidApp -.-> :feature:widget classDef android-application fill:#CAFFBF,stroke:#000,stroke-width:2px,color:#000; classDef android-application-compose fill:#CAFFBF,stroke:#000,stroke-width:2px,color:#000; diff --git a/app/build.gradle.kts b/androidApp/build.gradle.kts similarity index 99% rename from app/build.gradle.kts rename to androidApp/build.gradle.kts index 45de5390d..8581f519f 100644 --- a/app/build.gradle.kts +++ b/androidApp/build.gradle.kts @@ -116,7 +116,7 @@ configure { } // Disable ABI splits for bundle builds or when explicitly requested via Gradle property. - // Usage: ./gradlew :app:bundleGoogleRelease -Pmeshtastic.disableAbiSplits=true + // Usage: ./gradlew :androidApp:bundleGoogleRelease -Pmeshtastic.disableAbiSplits=true val disableSplits = providers.gradleProperty("meshtastic.disableAbiSplits").map { it.toBoolean() }.getOrElse(false) // Enable ABI splits to generate smaller APKs per architecture for F-Droid/IzzyOnDroid diff --git a/app/detekt-baseline.xml b/androidApp/detekt-baseline.xml similarity index 100% rename from app/detekt-baseline.xml rename to androidApp/detekt-baseline.xml diff --git a/app/google-services.json b/androidApp/google-services.json similarity index 100% rename from app/google-services.json rename to androidApp/google-services.json diff --git a/app/proguard-rules.pro b/androidApp/proguard-rules.pro similarity index 100% rename from app/proguard-rules.pro rename to androidApp/proguard-rules.pro diff --git a/app/src/fdroid/AndroidManifest.xml b/androidApp/src/fdroid/AndroidManifest.xml similarity index 100% rename from app/src/fdroid/AndroidManifest.xml rename to androidApp/src/fdroid/AndroidManifest.xml diff --git a/app/src/fdroid/java/org/meshtastic/app/map/cluster/MarkerClusterer.java b/androidApp/src/fdroid/java/org/meshtastic/app/map/cluster/MarkerClusterer.java similarity index 100% rename from app/src/fdroid/java/org/meshtastic/app/map/cluster/MarkerClusterer.java rename to androidApp/src/fdroid/java/org/meshtastic/app/map/cluster/MarkerClusterer.java diff --git a/app/src/fdroid/java/org/meshtastic/app/map/cluster/RadiusMarkerClusterer.java b/androidApp/src/fdroid/java/org/meshtastic/app/map/cluster/RadiusMarkerClusterer.java similarity index 100% rename from app/src/fdroid/java/org/meshtastic/app/map/cluster/RadiusMarkerClusterer.java rename to androidApp/src/fdroid/java/org/meshtastic/app/map/cluster/RadiusMarkerClusterer.java diff --git a/app/src/fdroid/java/org/meshtastic/app/map/cluster/StaticCluster.java b/androidApp/src/fdroid/java/org/meshtastic/app/map/cluster/StaticCluster.java similarity index 100% rename from app/src/fdroid/java/org/meshtastic/app/map/cluster/StaticCluster.java rename to androidApp/src/fdroid/java/org/meshtastic/app/map/cluster/StaticCluster.java diff --git a/app/src/fdroid/kotlin/org/meshtastic/app/analytics/FdroidPlatformAnalytics.kt b/androidApp/src/fdroid/kotlin/org/meshtastic/app/analytics/FdroidPlatformAnalytics.kt similarity index 100% rename from app/src/fdroid/kotlin/org/meshtastic/app/analytics/FdroidPlatformAnalytics.kt rename to androidApp/src/fdroid/kotlin/org/meshtastic/app/analytics/FdroidPlatformAnalytics.kt diff --git a/app/src/fdroid/kotlin/org/meshtastic/app/di/FDroidNetworkModule.kt b/androidApp/src/fdroid/kotlin/org/meshtastic/app/di/FDroidNetworkModule.kt similarity index 100% rename from app/src/fdroid/kotlin/org/meshtastic/app/di/FDroidNetworkModule.kt rename to androidApp/src/fdroid/kotlin/org/meshtastic/app/di/FDroidNetworkModule.kt diff --git a/app/src/fdroid/kotlin/org/meshtastic/app/di/FlavorModule.kt b/androidApp/src/fdroid/kotlin/org/meshtastic/app/di/FlavorModule.kt similarity index 100% rename from app/src/fdroid/kotlin/org/meshtastic/app/di/FlavorModule.kt rename to androidApp/src/fdroid/kotlin/org/meshtastic/app/di/FlavorModule.kt diff --git a/app/src/fdroid/kotlin/org/meshtastic/app/intro/AnalyticsIntro.kt b/androidApp/src/fdroid/kotlin/org/meshtastic/app/intro/AnalyticsIntro.kt similarity index 100% rename from app/src/fdroid/kotlin/org/meshtastic/app/intro/AnalyticsIntro.kt rename to androidApp/src/fdroid/kotlin/org/meshtastic/app/intro/AnalyticsIntro.kt diff --git a/app/src/fdroid/kotlin/org/meshtastic/app/map/FdroidMapViewProvider.kt b/androidApp/src/fdroid/kotlin/org/meshtastic/app/map/FdroidMapViewProvider.kt similarity index 100% rename from app/src/fdroid/kotlin/org/meshtastic/app/map/FdroidMapViewProvider.kt rename to androidApp/src/fdroid/kotlin/org/meshtastic/app/map/FdroidMapViewProvider.kt diff --git a/app/src/fdroid/kotlin/org/meshtastic/app/map/GetMapViewProvider.kt b/androidApp/src/fdroid/kotlin/org/meshtastic/app/map/GetMapViewProvider.kt similarity index 100% rename from app/src/fdroid/kotlin/org/meshtastic/app/map/GetMapViewProvider.kt rename to androidApp/src/fdroid/kotlin/org/meshtastic/app/map/GetMapViewProvider.kt diff --git a/app/src/fdroid/kotlin/org/meshtastic/app/map/MapUtils.kt b/androidApp/src/fdroid/kotlin/org/meshtastic/app/map/MapUtils.kt similarity index 100% rename from app/src/fdroid/kotlin/org/meshtastic/app/map/MapUtils.kt rename to androidApp/src/fdroid/kotlin/org/meshtastic/app/map/MapUtils.kt diff --git a/app/src/fdroid/kotlin/org/meshtastic/app/map/MapView.kt b/androidApp/src/fdroid/kotlin/org/meshtastic/app/map/MapView.kt similarity index 100% rename from app/src/fdroid/kotlin/org/meshtastic/app/map/MapView.kt rename to androidApp/src/fdroid/kotlin/org/meshtastic/app/map/MapView.kt diff --git a/app/src/fdroid/kotlin/org/meshtastic/app/map/MapViewExtensions.kt b/androidApp/src/fdroid/kotlin/org/meshtastic/app/map/MapViewExtensions.kt similarity index 100% rename from app/src/fdroid/kotlin/org/meshtastic/app/map/MapViewExtensions.kt rename to androidApp/src/fdroid/kotlin/org/meshtastic/app/map/MapViewExtensions.kt diff --git a/app/src/fdroid/kotlin/org/meshtastic/app/map/MapViewModel.kt b/androidApp/src/fdroid/kotlin/org/meshtastic/app/map/MapViewModel.kt similarity index 100% rename from app/src/fdroid/kotlin/org/meshtastic/app/map/MapViewModel.kt rename to androidApp/src/fdroid/kotlin/org/meshtastic/app/map/MapViewModel.kt diff --git a/app/src/fdroid/kotlin/org/meshtastic/app/map/MapViewWithLifecycle.kt b/androidApp/src/fdroid/kotlin/org/meshtastic/app/map/MapViewWithLifecycle.kt similarity index 100% rename from app/src/fdroid/kotlin/org/meshtastic/app/map/MapViewWithLifecycle.kt rename to androidApp/src/fdroid/kotlin/org/meshtastic/app/map/MapViewWithLifecycle.kt diff --git a/app/src/fdroid/kotlin/org/meshtastic/app/map/SqlTileWriterExt.kt b/androidApp/src/fdroid/kotlin/org/meshtastic/app/map/SqlTileWriterExt.kt similarity index 100% rename from app/src/fdroid/kotlin/org/meshtastic/app/map/SqlTileWriterExt.kt rename to androidApp/src/fdroid/kotlin/org/meshtastic/app/map/SqlTileWriterExt.kt diff --git a/app/src/fdroid/kotlin/org/meshtastic/app/map/component/CacheLayout.kt b/androidApp/src/fdroid/kotlin/org/meshtastic/app/map/component/CacheLayout.kt similarity index 100% rename from app/src/fdroid/kotlin/org/meshtastic/app/map/component/CacheLayout.kt rename to androidApp/src/fdroid/kotlin/org/meshtastic/app/map/component/CacheLayout.kt diff --git a/app/src/fdroid/kotlin/org/meshtastic/app/map/component/DownloadButton.kt b/androidApp/src/fdroid/kotlin/org/meshtastic/app/map/component/DownloadButton.kt similarity index 100% rename from app/src/fdroid/kotlin/org/meshtastic/app/map/component/DownloadButton.kt rename to androidApp/src/fdroid/kotlin/org/meshtastic/app/map/component/DownloadButton.kt diff --git a/app/src/fdroid/kotlin/org/meshtastic/app/map/component/EditWaypointDialog.kt b/androidApp/src/fdroid/kotlin/org/meshtastic/app/map/component/EditWaypointDialog.kt similarity index 100% rename from app/src/fdroid/kotlin/org/meshtastic/app/map/component/EditWaypointDialog.kt rename to androidApp/src/fdroid/kotlin/org/meshtastic/app/map/component/EditWaypointDialog.kt diff --git a/app/src/fdroid/kotlin/org/meshtastic/app/map/model/CustomTileSource.kt b/androidApp/src/fdroid/kotlin/org/meshtastic/app/map/model/CustomTileSource.kt similarity index 100% rename from app/src/fdroid/kotlin/org/meshtastic/app/map/model/CustomTileSource.kt rename to androidApp/src/fdroid/kotlin/org/meshtastic/app/map/model/CustomTileSource.kt diff --git a/app/src/fdroid/kotlin/org/meshtastic/app/map/model/MarkerWithLabel.kt b/androidApp/src/fdroid/kotlin/org/meshtastic/app/map/model/MarkerWithLabel.kt similarity index 100% rename from app/src/fdroid/kotlin/org/meshtastic/app/map/model/MarkerWithLabel.kt rename to androidApp/src/fdroid/kotlin/org/meshtastic/app/map/model/MarkerWithLabel.kt diff --git a/app/src/fdroid/kotlin/org/meshtastic/app/map/model/NOAAWmsTileSource.kt b/androidApp/src/fdroid/kotlin/org/meshtastic/app/map/model/NOAAWmsTileSource.kt similarity index 100% rename from app/src/fdroid/kotlin/org/meshtastic/app/map/model/NOAAWmsTileSource.kt rename to androidApp/src/fdroid/kotlin/org/meshtastic/app/map/model/NOAAWmsTileSource.kt diff --git a/app/src/fdroid/kotlin/org/meshtastic/app/map/model/OnlineTileSourceAuth.kt b/androidApp/src/fdroid/kotlin/org/meshtastic/app/map/model/OnlineTileSourceAuth.kt similarity index 100% rename from app/src/fdroid/kotlin/org/meshtastic/app/map/model/OnlineTileSourceAuth.kt rename to androidApp/src/fdroid/kotlin/org/meshtastic/app/map/model/OnlineTileSourceAuth.kt diff --git a/app/src/fdroid/kotlin/org/meshtastic/app/map/node/NodeMapScreen.kt b/androidApp/src/fdroid/kotlin/org/meshtastic/app/map/node/NodeMapScreen.kt similarity index 100% rename from app/src/fdroid/kotlin/org/meshtastic/app/map/node/NodeMapScreen.kt rename to androidApp/src/fdroid/kotlin/org/meshtastic/app/map/node/NodeMapScreen.kt diff --git a/app/src/fdroid/kotlin/org/meshtastic/app/map/node/NodeTrackMap.kt b/androidApp/src/fdroid/kotlin/org/meshtastic/app/map/node/NodeTrackMap.kt similarity index 100% rename from app/src/fdroid/kotlin/org/meshtastic/app/map/node/NodeTrackMap.kt rename to androidApp/src/fdroid/kotlin/org/meshtastic/app/map/node/NodeTrackMap.kt diff --git a/app/src/fdroid/kotlin/org/meshtastic/app/map/node/NodeTrackOsmMap.kt b/androidApp/src/fdroid/kotlin/org/meshtastic/app/map/node/NodeTrackOsmMap.kt similarity index 100% rename from app/src/fdroid/kotlin/org/meshtastic/app/map/node/NodeTrackOsmMap.kt rename to androidApp/src/fdroid/kotlin/org/meshtastic/app/map/node/NodeTrackOsmMap.kt diff --git a/app/src/fdroid/kotlin/org/meshtastic/app/map/traceroute/TracerouteMap.kt b/androidApp/src/fdroid/kotlin/org/meshtastic/app/map/traceroute/TracerouteMap.kt similarity index 100% rename from app/src/fdroid/kotlin/org/meshtastic/app/map/traceroute/TracerouteMap.kt rename to androidApp/src/fdroid/kotlin/org/meshtastic/app/map/traceroute/TracerouteMap.kt diff --git a/app/src/fdroid/kotlin/org/meshtastic/app/map/traceroute/TracerouteOsmMap.kt b/androidApp/src/fdroid/kotlin/org/meshtastic/app/map/traceroute/TracerouteOsmMap.kt similarity index 100% rename from app/src/fdroid/kotlin/org/meshtastic/app/map/traceroute/TracerouteOsmMap.kt rename to androidApp/src/fdroid/kotlin/org/meshtastic/app/map/traceroute/TracerouteOsmMap.kt diff --git a/app/src/fdroid/kotlin/org/meshtastic/app/node/component/InlineMap.kt b/androidApp/src/fdroid/kotlin/org/meshtastic/app/node/component/InlineMap.kt similarity index 100% rename from app/src/fdroid/kotlin/org/meshtastic/app/node/component/InlineMap.kt rename to androidApp/src/fdroid/kotlin/org/meshtastic/app/node/component/InlineMap.kt diff --git a/app/src/fdroid/kotlin/org/meshtastic/app/node/metrics/TracerouteMapOverlayInsets.kt b/androidApp/src/fdroid/kotlin/org/meshtastic/app/node/metrics/TracerouteMapOverlayInsets.kt similarity index 100% rename from app/src/fdroid/kotlin/org/meshtastic/app/node/metrics/TracerouteMapOverlayInsets.kt rename to androidApp/src/fdroid/kotlin/org/meshtastic/app/node/metrics/TracerouteMapOverlayInsets.kt diff --git a/app/src/fdroid/res/drawable/ic_location_on.xml b/androidApp/src/fdroid/res/drawable/ic_location_on.xml similarity index 100% rename from app/src/fdroid/res/drawable/ic_location_on.xml rename to androidApp/src/fdroid/res/drawable/ic_location_on.xml diff --git a/app/src/fdroid/res/drawable/ic_map_location_dot.xml b/androidApp/src/fdroid/res/drawable/ic_map_location_dot.xml similarity index 100% rename from app/src/fdroid/res/drawable/ic_map_location_dot.xml rename to androidApp/src/fdroid/res/drawable/ic_map_location_dot.xml diff --git a/app/src/fdroid/res/drawable/ic_map_navigation.xml b/androidApp/src/fdroid/res/drawable/ic_map_navigation.xml similarity index 100% rename from app/src/fdroid/res/drawable/ic_map_navigation.xml rename to androidApp/src/fdroid/res/drawable/ic_map_navigation.xml diff --git a/app/src/fdroidDebug/res/drawable-anydpi/ic_launcher_background.xml b/androidApp/src/fdroidDebug/res/drawable-anydpi/ic_launcher_background.xml similarity index 100% rename from app/src/fdroidDebug/res/drawable-anydpi/ic_launcher_background.xml rename to androidApp/src/fdroidDebug/res/drawable-anydpi/ic_launcher_background.xml diff --git a/app/src/fdroidDebug/res/values/strings.xml b/androidApp/src/fdroidDebug/res/values/strings.xml similarity index 100% rename from app/src/fdroidDebug/res/values/strings.xml rename to androidApp/src/fdroidDebug/res/values/strings.xml diff --git a/app/src/google/AndroidManifest.xml b/androidApp/src/google/AndroidManifest.xml similarity index 100% rename from app/src/google/AndroidManifest.xml rename to androidApp/src/google/AndroidManifest.xml diff --git a/app/src/google/kotlin/org/meshtastic/app/analytics/GooglePlatformAnalytics.kt b/androidApp/src/google/kotlin/org/meshtastic/app/analytics/GooglePlatformAnalytics.kt similarity index 100% rename from app/src/google/kotlin/org/meshtastic/app/analytics/GooglePlatformAnalytics.kt rename to androidApp/src/google/kotlin/org/meshtastic/app/analytics/GooglePlatformAnalytics.kt diff --git a/app/src/google/kotlin/org/meshtastic/app/di/FlavorModule.kt b/androidApp/src/google/kotlin/org/meshtastic/app/di/FlavorModule.kt similarity index 100% rename from app/src/google/kotlin/org/meshtastic/app/di/FlavorModule.kt rename to androidApp/src/google/kotlin/org/meshtastic/app/di/FlavorModule.kt diff --git a/app/src/google/kotlin/org/meshtastic/app/di/GoogleNetworkModule.kt b/androidApp/src/google/kotlin/org/meshtastic/app/di/GoogleNetworkModule.kt similarity index 100% rename from app/src/google/kotlin/org/meshtastic/app/di/GoogleNetworkModule.kt rename to androidApp/src/google/kotlin/org/meshtastic/app/di/GoogleNetworkModule.kt diff --git a/app/src/google/kotlin/org/meshtastic/app/intro/AnalyticsIntro.kt b/androidApp/src/google/kotlin/org/meshtastic/app/intro/AnalyticsIntro.kt similarity index 100% rename from app/src/google/kotlin/org/meshtastic/app/intro/AnalyticsIntro.kt rename to androidApp/src/google/kotlin/org/meshtastic/app/intro/AnalyticsIntro.kt diff --git a/app/src/google/kotlin/org/meshtastic/app/map/GetMapViewProvider.kt b/androidApp/src/google/kotlin/org/meshtastic/app/map/GetMapViewProvider.kt similarity index 100% rename from app/src/google/kotlin/org/meshtastic/app/map/GetMapViewProvider.kt rename to androidApp/src/google/kotlin/org/meshtastic/app/map/GetMapViewProvider.kt diff --git a/app/src/google/kotlin/org/meshtastic/app/map/GoogleMapViewProvider.kt b/androidApp/src/google/kotlin/org/meshtastic/app/map/GoogleMapViewProvider.kt similarity index 100% rename from app/src/google/kotlin/org/meshtastic/app/map/GoogleMapViewProvider.kt rename to androidApp/src/google/kotlin/org/meshtastic/app/map/GoogleMapViewProvider.kt diff --git a/app/src/google/kotlin/org/meshtastic/app/map/LocationHandler.kt b/androidApp/src/google/kotlin/org/meshtastic/app/map/LocationHandler.kt similarity index 100% rename from app/src/google/kotlin/org/meshtastic/app/map/LocationHandler.kt rename to androidApp/src/google/kotlin/org/meshtastic/app/map/LocationHandler.kt diff --git a/app/src/google/kotlin/org/meshtastic/app/map/MBTilesProvider.kt b/androidApp/src/google/kotlin/org/meshtastic/app/map/MBTilesProvider.kt similarity index 100% rename from app/src/google/kotlin/org/meshtastic/app/map/MBTilesProvider.kt rename to androidApp/src/google/kotlin/org/meshtastic/app/map/MBTilesProvider.kt diff --git a/app/src/google/kotlin/org/meshtastic/app/map/MapView.kt b/androidApp/src/google/kotlin/org/meshtastic/app/map/MapView.kt similarity index 100% rename from app/src/google/kotlin/org/meshtastic/app/map/MapView.kt rename to androidApp/src/google/kotlin/org/meshtastic/app/map/MapView.kt diff --git a/app/src/google/kotlin/org/meshtastic/app/map/MapViewModel.kt b/androidApp/src/google/kotlin/org/meshtastic/app/map/MapViewModel.kt similarity index 100% rename from app/src/google/kotlin/org/meshtastic/app/map/MapViewModel.kt rename to androidApp/src/google/kotlin/org/meshtastic/app/map/MapViewModel.kt diff --git a/app/src/google/kotlin/org/meshtastic/app/map/component/ClusterItemsListDialog.kt b/androidApp/src/google/kotlin/org/meshtastic/app/map/component/ClusterItemsListDialog.kt similarity index 100% rename from app/src/google/kotlin/org/meshtastic/app/map/component/ClusterItemsListDialog.kt rename to androidApp/src/google/kotlin/org/meshtastic/app/map/component/ClusterItemsListDialog.kt diff --git a/app/src/google/kotlin/org/meshtastic/app/map/component/CustomMapLayersSheet.kt b/androidApp/src/google/kotlin/org/meshtastic/app/map/component/CustomMapLayersSheet.kt similarity index 100% rename from app/src/google/kotlin/org/meshtastic/app/map/component/CustomMapLayersSheet.kt rename to androidApp/src/google/kotlin/org/meshtastic/app/map/component/CustomMapLayersSheet.kt diff --git a/app/src/google/kotlin/org/meshtastic/app/map/component/CustomTileProviderManagerSheet.kt b/androidApp/src/google/kotlin/org/meshtastic/app/map/component/CustomTileProviderManagerSheet.kt similarity index 100% rename from app/src/google/kotlin/org/meshtastic/app/map/component/CustomTileProviderManagerSheet.kt rename to androidApp/src/google/kotlin/org/meshtastic/app/map/component/CustomTileProviderManagerSheet.kt diff --git a/app/src/google/kotlin/org/meshtastic/app/map/component/EditWaypointDialog.kt b/androidApp/src/google/kotlin/org/meshtastic/app/map/component/EditWaypointDialog.kt similarity index 100% rename from app/src/google/kotlin/org/meshtastic/app/map/component/EditWaypointDialog.kt rename to androidApp/src/google/kotlin/org/meshtastic/app/map/component/EditWaypointDialog.kt diff --git a/app/src/google/kotlin/org/meshtastic/app/map/component/MapFilterDropdown.kt b/androidApp/src/google/kotlin/org/meshtastic/app/map/component/MapFilterDropdown.kt similarity index 100% rename from app/src/google/kotlin/org/meshtastic/app/map/component/MapFilterDropdown.kt rename to androidApp/src/google/kotlin/org/meshtastic/app/map/component/MapFilterDropdown.kt diff --git a/app/src/google/kotlin/org/meshtastic/app/map/component/MapTypeDropdown.kt b/androidApp/src/google/kotlin/org/meshtastic/app/map/component/MapTypeDropdown.kt similarity index 100% rename from app/src/google/kotlin/org/meshtastic/app/map/component/MapTypeDropdown.kt rename to androidApp/src/google/kotlin/org/meshtastic/app/map/component/MapTypeDropdown.kt diff --git a/app/src/google/kotlin/org/meshtastic/app/map/component/NodeClusterMarkers.kt b/androidApp/src/google/kotlin/org/meshtastic/app/map/component/NodeClusterMarkers.kt similarity index 100% rename from app/src/google/kotlin/org/meshtastic/app/map/component/NodeClusterMarkers.kt rename to androidApp/src/google/kotlin/org/meshtastic/app/map/component/NodeClusterMarkers.kt diff --git a/app/src/google/kotlin/org/meshtastic/app/map/component/PulsingNodeChip.kt b/androidApp/src/google/kotlin/org/meshtastic/app/map/component/PulsingNodeChip.kt similarity index 100% rename from app/src/google/kotlin/org/meshtastic/app/map/component/PulsingNodeChip.kt rename to androidApp/src/google/kotlin/org/meshtastic/app/map/component/PulsingNodeChip.kt diff --git a/app/src/google/kotlin/org/meshtastic/app/map/component/WaypointMarkers.kt b/androidApp/src/google/kotlin/org/meshtastic/app/map/component/WaypointMarkers.kt similarity index 100% rename from app/src/google/kotlin/org/meshtastic/app/map/component/WaypointMarkers.kt rename to androidApp/src/google/kotlin/org/meshtastic/app/map/component/WaypointMarkers.kt diff --git a/app/src/google/kotlin/org/meshtastic/app/map/model/CustomTileProviderConfig.kt b/androidApp/src/google/kotlin/org/meshtastic/app/map/model/CustomTileProviderConfig.kt similarity index 100% rename from app/src/google/kotlin/org/meshtastic/app/map/model/CustomTileProviderConfig.kt rename to androidApp/src/google/kotlin/org/meshtastic/app/map/model/CustomTileProviderConfig.kt diff --git a/app/src/google/kotlin/org/meshtastic/app/map/model/CustomTileSource.kt b/androidApp/src/google/kotlin/org/meshtastic/app/map/model/CustomTileSource.kt similarity index 100% rename from app/src/google/kotlin/org/meshtastic/app/map/model/CustomTileSource.kt rename to androidApp/src/google/kotlin/org/meshtastic/app/map/model/CustomTileSource.kt diff --git a/app/src/google/kotlin/org/meshtastic/app/map/model/NodeClusterItem.kt b/androidApp/src/google/kotlin/org/meshtastic/app/map/model/NodeClusterItem.kt similarity index 100% rename from app/src/google/kotlin/org/meshtastic/app/map/model/NodeClusterItem.kt rename to androidApp/src/google/kotlin/org/meshtastic/app/map/model/NodeClusterItem.kt diff --git a/app/src/google/kotlin/org/meshtastic/app/map/node/NodeMapScreen.kt b/androidApp/src/google/kotlin/org/meshtastic/app/map/node/NodeMapScreen.kt similarity index 100% rename from app/src/google/kotlin/org/meshtastic/app/map/node/NodeMapScreen.kt rename to androidApp/src/google/kotlin/org/meshtastic/app/map/node/NodeMapScreen.kt diff --git a/app/src/google/kotlin/org/meshtastic/app/map/node/NodeTrackMap.kt b/androidApp/src/google/kotlin/org/meshtastic/app/map/node/NodeTrackMap.kt similarity index 100% rename from app/src/google/kotlin/org/meshtastic/app/map/node/NodeTrackMap.kt rename to androidApp/src/google/kotlin/org/meshtastic/app/map/node/NodeTrackMap.kt diff --git a/app/src/google/kotlin/org/meshtastic/app/map/prefs/di/GoogleMapsKoinModule.kt b/androidApp/src/google/kotlin/org/meshtastic/app/map/prefs/di/GoogleMapsKoinModule.kt similarity index 100% rename from app/src/google/kotlin/org/meshtastic/app/map/prefs/di/GoogleMapsKoinModule.kt rename to androidApp/src/google/kotlin/org/meshtastic/app/map/prefs/di/GoogleMapsKoinModule.kt diff --git a/app/src/google/kotlin/org/meshtastic/app/map/prefs/map/GoogleMapsPrefs.kt b/androidApp/src/google/kotlin/org/meshtastic/app/map/prefs/map/GoogleMapsPrefs.kt similarity index 100% rename from app/src/google/kotlin/org/meshtastic/app/map/prefs/map/GoogleMapsPrefs.kt rename to androidApp/src/google/kotlin/org/meshtastic/app/map/prefs/map/GoogleMapsPrefs.kt diff --git a/app/src/google/kotlin/org/meshtastic/app/map/repository/CustomTileProviderRepository.kt b/androidApp/src/google/kotlin/org/meshtastic/app/map/repository/CustomTileProviderRepository.kt similarity index 100% rename from app/src/google/kotlin/org/meshtastic/app/map/repository/CustomTileProviderRepository.kt rename to androidApp/src/google/kotlin/org/meshtastic/app/map/repository/CustomTileProviderRepository.kt diff --git a/app/src/google/kotlin/org/meshtastic/app/map/traceroute/TracerouteMap.kt b/androidApp/src/google/kotlin/org/meshtastic/app/map/traceroute/TracerouteMap.kt similarity index 100% rename from app/src/google/kotlin/org/meshtastic/app/map/traceroute/TracerouteMap.kt rename to androidApp/src/google/kotlin/org/meshtastic/app/map/traceroute/TracerouteMap.kt diff --git a/app/src/google/kotlin/org/meshtastic/app/node/component/InlineMap.kt b/androidApp/src/google/kotlin/org/meshtastic/app/node/component/InlineMap.kt similarity index 100% rename from app/src/google/kotlin/org/meshtastic/app/node/component/InlineMap.kt rename to androidApp/src/google/kotlin/org/meshtastic/app/node/component/InlineMap.kt diff --git a/app/src/google/kotlin/org/meshtastic/app/node/metrics/TracerouteMapOverlayInsets.kt b/androidApp/src/google/kotlin/org/meshtastic/app/node/metrics/TracerouteMapOverlayInsets.kt similarity index 100% rename from app/src/google/kotlin/org/meshtastic/app/node/metrics/TracerouteMapOverlayInsets.kt rename to androidApp/src/google/kotlin/org/meshtastic/app/node/metrics/TracerouteMapOverlayInsets.kt diff --git a/app/src/googleDebug/res/drawable-anydpi/ic_launcher_background.xml b/androidApp/src/googleDebug/res/drawable-anydpi/ic_launcher_background.xml similarity index 100% rename from app/src/googleDebug/res/drawable-anydpi/ic_launcher_background.xml rename to androidApp/src/googleDebug/res/drawable-anydpi/ic_launcher_background.xml diff --git a/app/src/googleDebug/res/values/strings.xml b/androidApp/src/googleDebug/res/values/strings.xml similarity index 100% rename from app/src/googleDebug/res/values/strings.xml rename to androidApp/src/googleDebug/res/values/strings.xml diff --git a/app/src/main/.gitignore b/androidApp/src/main/.gitignore similarity index 100% rename from app/src/main/.gitignore rename to androidApp/src/main/.gitignore diff --git a/app/src/main/AndroidManifest.xml b/androidApp/src/main/AndroidManifest.xml similarity index 100% rename from app/src/main/AndroidManifest.xml rename to androidApp/src/main/AndroidManifest.xml diff --git a/app/src/main/assets/device_bootloader_ota_quirks.json b/androidApp/src/main/assets/device_bootloader_ota_quirks.json similarity index 100% rename from app/src/main/assets/device_bootloader_ota_quirks.json rename to androidApp/src/main/assets/device_bootloader_ota_quirks.json diff --git a/app/src/main/assets/device_hardware.json b/androidApp/src/main/assets/device_hardware.json similarity index 100% rename from app/src/main/assets/device_hardware.json rename to androidApp/src/main/assets/device_hardware.json diff --git a/app/src/main/assets/firmware_releases.json b/androidApp/src/main/assets/firmware_releases.json similarity index 100% rename from app/src/main/assets/firmware_releases.json rename to androidApp/src/main/assets/firmware_releases.json diff --git a/app/src/main/ic_launcher-114x114.png b/androidApp/src/main/ic_launcher-114x114.png similarity index 100% rename from app/src/main/ic_launcher-114x114.png rename to androidApp/src/main/ic_launcher-114x114.png diff --git a/app/src/main/ic_launcher2-playstore.png b/androidApp/src/main/ic_launcher2-playstore.png similarity index 100% rename from app/src/main/ic_launcher2-playstore.png rename to androidApp/src/main/ic_launcher2-playstore.png diff --git a/app/src/main/kotlin/org/meshtastic/app/MainActivity.kt b/androidApp/src/main/kotlin/org/meshtastic/app/MainActivity.kt similarity index 100% rename from app/src/main/kotlin/org/meshtastic/app/MainActivity.kt rename to androidApp/src/main/kotlin/org/meshtastic/app/MainActivity.kt diff --git a/app/src/main/kotlin/org/meshtastic/app/MainKoinModule.kt b/androidApp/src/main/kotlin/org/meshtastic/app/MainKoinModule.kt similarity index 100% rename from app/src/main/kotlin/org/meshtastic/app/MainKoinModule.kt rename to androidApp/src/main/kotlin/org/meshtastic/app/MainKoinModule.kt diff --git a/app/src/main/kotlin/org/meshtastic/app/MeshUtilApplication.kt b/androidApp/src/main/kotlin/org/meshtastic/app/MeshUtilApplication.kt similarity index 100% rename from app/src/main/kotlin/org/meshtastic/app/MeshUtilApplication.kt rename to androidApp/src/main/kotlin/org/meshtastic/app/MeshUtilApplication.kt diff --git a/app/src/main/kotlin/org/meshtastic/app/di/AndroidKoinApp.kt b/androidApp/src/main/kotlin/org/meshtastic/app/di/AndroidKoinApp.kt similarity index 100% rename from app/src/main/kotlin/org/meshtastic/app/di/AndroidKoinApp.kt rename to androidApp/src/main/kotlin/org/meshtastic/app/di/AndroidKoinApp.kt diff --git a/app/src/main/kotlin/org/meshtastic/app/di/AppKoinModule.kt b/androidApp/src/main/kotlin/org/meshtastic/app/di/AppKoinModule.kt similarity index 100% rename from app/src/main/kotlin/org/meshtastic/app/di/AppKoinModule.kt rename to androidApp/src/main/kotlin/org/meshtastic/app/di/AppKoinModule.kt diff --git a/app/src/main/kotlin/org/meshtastic/app/di/NetworkModule.kt b/androidApp/src/main/kotlin/org/meshtastic/app/di/NetworkModule.kt similarity index 100% rename from app/src/main/kotlin/org/meshtastic/app/di/NetworkModule.kt rename to androidApp/src/main/kotlin/org/meshtastic/app/di/NetworkModule.kt diff --git a/app/src/main/kotlin/org/meshtastic/app/ui/Main.kt b/androidApp/src/main/kotlin/org/meshtastic/app/ui/Main.kt similarity index 100% rename from app/src/main/kotlin/org/meshtastic/app/ui/Main.kt rename to androidApp/src/main/kotlin/org/meshtastic/app/ui/Main.kt diff --git a/app/src/main/res/drawable-anydpi/ic_launcher_background.xml b/androidApp/src/main/res/drawable-anydpi/ic_launcher_background.xml similarity index 100% rename from app/src/main/res/drawable-anydpi/ic_launcher_background.xml rename to androidApp/src/main/res/drawable-anydpi/ic_launcher_background.xml diff --git a/app/src/main/res/drawable-anydpi/ic_launcher_foreground.xml b/androidApp/src/main/res/drawable-anydpi/ic_launcher_foreground.xml similarity index 100% rename from app/src/main/res/drawable-anydpi/ic_launcher_foreground.xml rename to androidApp/src/main/res/drawable-anydpi/ic_launcher_foreground.xml diff --git a/app/src/main/res/drawable-anydpi/ic_splash.xml b/androidApp/src/main/res/drawable-anydpi/ic_splash.xml similarity index 100% rename from app/src/main/res/drawable-anydpi/ic_splash.xml rename to androidApp/src/main/res/drawable-anydpi/ic_splash.xml diff --git a/app/src/main/res/layout/widget_local_stats_preview.xml b/androidApp/src/main/res/layout/widget_local_stats_preview.xml similarity index 100% rename from app/src/main/res/layout/widget_local_stats_preview.xml rename to androidApp/src/main/res/layout/widget_local_stats_preview.xml diff --git a/app/src/main/res/mipmap-anydpi/ic_launcher.xml b/androidApp/src/main/res/mipmap-anydpi/ic_launcher.xml similarity index 100% rename from app/src/main/res/mipmap-anydpi/ic_launcher.xml rename to androidApp/src/main/res/mipmap-anydpi/ic_launcher.xml diff --git a/app/src/main/res/raw/keep.xml b/androidApp/src/main/res/raw/keep.xml similarity index 100% rename from app/src/main/res/raw/keep.xml rename to androidApp/src/main/res/raw/keep.xml diff --git a/app/src/main/res/values/strings.xml b/androidApp/src/main/res/values/strings.xml similarity index 100% rename from app/src/main/res/values/strings.xml rename to androidApp/src/main/res/values/strings.xml diff --git a/app/src/main/res/values/styles.xml b/androidApp/src/main/res/values/styles.xml similarity index 100% rename from app/src/main/res/values/styles.xml rename to androidApp/src/main/res/values/styles.xml diff --git a/app/src/main/res/xml/automotive_app_desc.xml b/androidApp/src/main/res/xml/automotive_app_desc.xml similarity index 100% rename from app/src/main/res/xml/automotive_app_desc.xml rename to androidApp/src/main/res/xml/automotive_app_desc.xml diff --git a/app/src/main/res/xml/data_extraction_rules.xml b/androidApp/src/main/res/xml/data_extraction_rules.xml similarity index 100% rename from app/src/main/res/xml/data_extraction_rules.xml rename to androidApp/src/main/res/xml/data_extraction_rules.xml diff --git a/app/src/main/res/xml/device_filter.xml b/androidApp/src/main/res/xml/device_filter.xml similarity index 100% rename from app/src/main/res/xml/device_filter.xml rename to androidApp/src/main/res/xml/device_filter.xml diff --git a/app/src/main/res/xml/locales_config.xml b/androidApp/src/main/res/xml/locales_config.xml similarity index 100% rename from app/src/main/res/xml/locales_config.xml rename to androidApp/src/main/res/xml/locales_config.xml diff --git a/app/src/main/res/xml/network_security_config.xml b/androidApp/src/main/res/xml/network_security_config.xml similarity index 100% rename from app/src/main/res/xml/network_security_config.xml rename to androidApp/src/main/res/xml/network_security_config.xml diff --git a/app/src/test/kotlin/org/meshtastic/app/di/KoinVerificationTest.kt b/androidApp/src/test/kotlin/org/meshtastic/app/di/KoinVerificationTest.kt similarity index 100% rename from app/src/test/kotlin/org/meshtastic/app/di/KoinVerificationTest.kt rename to androidApp/src/test/kotlin/org/meshtastic/app/di/KoinVerificationTest.kt diff --git a/app/src/test/kotlin/org/meshtastic/app/service/Fakes.kt b/androidApp/src/test/kotlin/org/meshtastic/app/service/Fakes.kt similarity index 100% rename from app/src/test/kotlin/org/meshtastic/app/service/Fakes.kt rename to androidApp/src/test/kotlin/org/meshtastic/app/service/Fakes.kt diff --git a/app/src/test/kotlin/org/meshtastic/app/ui/NavigationAssemblyTest.kt b/androidApp/src/test/kotlin/org/meshtastic/app/ui/NavigationAssemblyTest.kt similarity index 100% rename from app/src/test/kotlin/org/meshtastic/app/ui/NavigationAssemblyTest.kt rename to androidApp/src/test/kotlin/org/meshtastic/app/ui/NavigationAssemblyTest.kt diff --git a/app/src/test/kotlin/org/meshtastic/app/ui/UIUnitTest.kt b/androidApp/src/test/kotlin/org/meshtastic/app/ui/UIUnitTest.kt similarity index 100% rename from app/src/test/kotlin/org/meshtastic/app/ui/UIUnitTest.kt rename to androidApp/src/test/kotlin/org/meshtastic/app/ui/UIUnitTest.kt diff --git a/app/src/test/kotlin/org/meshtastic/app/ui/metrics/EnvironmentMetricsTest.kt b/androidApp/src/test/kotlin/org/meshtastic/app/ui/metrics/EnvironmentMetricsTest.kt similarity index 100% rename from app/src/test/kotlin/org/meshtastic/app/ui/metrics/EnvironmentMetricsTest.kt rename to androidApp/src/test/kotlin/org/meshtastic/app/ui/metrics/EnvironmentMetricsTest.kt diff --git a/app/src/test/resources/robolectric.properties b/androidApp/src/test/resources/robolectric.properties similarity index 100% rename from app/src/test/resources/robolectric.properties rename to androidApp/src/test/resources/robolectric.properties diff --git a/build-logic/convention/src/main/kotlin/AboutLibrariesConventionPlugin.kt b/build-logic/convention/src/main/kotlin/AboutLibrariesConventionPlugin.kt index 08cfb8082..4b8ba1177 100644 --- a/build-logic/convention/src/main/kotlin/AboutLibrariesConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/AboutLibrariesConventionPlugin.kt @@ -66,7 +66,6 @@ class AboutLibrariesConventionPlugin : Plugin { (it.name.endsWith("Resources") || it.name.endsWith("JavaRes")) } .configureEach { dependsOn("exportLibraryDefinitions") } - } } } diff --git a/build-logic/convention/src/main/kotlin/AndroidRoomConventionPlugin.kt b/build-logic/convention/src/main/kotlin/AndroidRoomConventionPlugin.kt index ff902185b..ee9ce4a52 100644 --- a/build-logic/convention/src/main/kotlin/AndroidRoomConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/AndroidRoomConventionPlugin.kt @@ -22,7 +22,6 @@ import org.gradle.kotlin.dsl.apply import org.gradle.kotlin.dsl.configure import org.gradle.kotlin.dsl.dependencies import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension -import org.meshtastic.buildlogic.isDesktopOnly import org.meshtastic.buildlogic.library import org.meshtastic.buildlogic.libs @@ -50,9 +49,7 @@ class AndroidRoomConventionPlugin : Plugin { extensions.configure { sourceSets.getByName("commonMain").dependencies { implementation(roomRuntime) } } - if (!isDesktopOnly) { - dependencies { add("kspAndroid", roomCompiler) } - } + dependencies { add("kspAndroid", roomCompiler) } dependencies { add("kspJvm", roomCompiler) } } diff --git a/build-logic/convention/src/main/kotlin/KmpFeatureConventionPlugin.kt b/build-logic/convention/src/main/kotlin/KmpFeatureConventionPlugin.kt index a12edb1f9..5531c0d4d 100644 --- a/build-logic/convention/src/main/kotlin/KmpFeatureConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/KmpFeatureConventionPlugin.kt @@ -19,7 +19,6 @@ import org.gradle.api.Project import org.gradle.kotlin.dsl.apply import org.gradle.kotlin.dsl.configure import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension -import org.meshtastic.buildlogic.isDesktopOnly import org.meshtastic.buildlogic.library import org.meshtastic.buildlogic.libs @@ -61,14 +60,11 @@ class KmpFeatureConventionPlugin : Plugin { implementation(libs.library("compose-multiplatform-ui-tooling-preview")) } - if (!isDesktopOnly) { - sourceSets.getByName("androidMain").dependencies { - // Common Android Compose dependencies - implementation(libs.library("accompanist-permissions")) - implementation(libs.library("androidx-activity-compose")) + sourceSets.getByName("androidMain").dependencies { + implementation(libs.library("accompanist-permissions")) + implementation(libs.library("androidx-activity-compose")) - implementation(libs.library("compose-multiplatform-ui")) - } + implementation(libs.library("compose-multiplatform-ui")) } sourceSets.getByName("commonTest").dependencies { implementation(project(":core:testing")) } diff --git a/build-logic/convention/src/main/kotlin/KmpLibraryConventionPlugin.kt b/build-logic/convention/src/main/kotlin/KmpLibraryConventionPlugin.kt index 6cc3eee95..13ad495d9 100644 --- a/build-logic/convention/src/main/kotlin/KmpLibraryConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/KmpLibraryConventionPlugin.kt @@ -22,7 +22,6 @@ import org.meshtastic.buildlogic.configureGraphTasks import org.meshtastic.buildlogic.configureKmpTestDependencies import org.meshtastic.buildlogic.configureKotlinMultiplatform import org.meshtastic.buildlogic.configureTestOptions -import org.meshtastic.buildlogic.isDesktopOnly import org.meshtastic.buildlogic.libs import org.meshtastic.buildlogic.plugin @@ -30,10 +29,8 @@ class KmpLibraryConventionPlugin : Plugin { override fun apply(target: Project) { with(target) { apply(plugin = libs.plugin("kotlin-multiplatform").get().pluginId) - if (!isDesktopOnly) { - apply(plugin = libs.plugin("android-kotlin-multiplatform-library").get().pluginId) - apply(plugin = "meshtastic.android.lint") - } + apply(plugin = libs.plugin("android-kotlin-multiplatform-library").get().pluginId) + apply(plugin = "meshtastic.android.lint") apply(plugin = "meshtastic.detekt") apply(plugin = "meshtastic.spotless") apply(plugin = "meshtastic.dokka") @@ -45,9 +42,7 @@ class KmpLibraryConventionPlugin : Plugin { configureKmpTestDependencies() configureTestOptions() configureGraphTasks() - if (!isDesktopOnly) { - configureAndroidMarketplaceFallback() - } + configureAndroidMarketplaceFallback() } } } diff --git a/build-logic/convention/src/main/kotlin/RootConventionPlugin.kt b/build-logic/convention/src/main/kotlin/RootConventionPlugin.kt index 18549205e..135306af6 100644 --- a/build-logic/convention/src/main/kotlin/RootConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/RootConventionPlugin.kt @@ -21,7 +21,6 @@ import org.meshtastic.buildlogic.configureDokkaAggregation import org.meshtastic.buildlogic.configureGraphTasks import org.meshtastic.buildlogic.configureKover import org.meshtastic.buildlogic.configureKoverAggregation -import org.meshtastic.buildlogic.isDesktopOnly /** * Root convention plugin applied to the top-level project. @@ -66,9 +65,7 @@ private fun Project.registerKmpSmokeCompileTask() { kmp.forEach { path -> dependsOn("$path:compileKotlinJvm") - if (!isDesktopOnly) { - dependsOn("$path:compileKotlinIosSimulatorArm64") - } + dependsOn("$path:compileKotlinIosSimulatorArm64") } } } @@ -76,7 +73,7 @@ private fun Project.registerKmpSmokeCompileTask() { /** All modules included in `settings.gradle.kts`. Update this list when adding or removing modules. */ private val ALL_MODULES_FULL = listOf( - ":app", + ":androidApp", ":core:api", ":core:barcode", ":core:ble", @@ -107,17 +104,16 @@ private val ALL_MODULES_FULL = ":feature:firmware", ":feature:wifi-provision", ":feature:widget", - ":desktop", + ":desktopApp", ) -/** Android-only modules excluded in desktop-only builds. */ -private val ANDROID_ONLY_MODULES = setOf(":app", ":core:api", ":core:barcode", ":feature:widget") +/** Android-only modules that don't apply the KMP plugin. */ +private val ANDROID_ONLY_MODULES = setOf(":androidApp", ":core:api", ":core:barcode", ":feature:widget") -private fun Project.allModules(): List = - if (isDesktopOnly) ALL_MODULES_FULL.filter { it !in ANDROID_ONLY_MODULES } else ALL_MODULES_FULL +private fun allModules(): List = ALL_MODULES_FULL /** - * Modules that apply the KMP plugin and should be compiled for JVM + iOS targets. Excludes pure-Android modules (:app, - * :core:api, :core:barcode, :feature:widget) and the desktop JVM-only module. + * Modules that apply the KMP plugin and should be compiled for JVM + iOS targets. Excludes pure-Android modules + * (:androidApp, :core:api, :core:barcode, :feature:widget) and the desktop JVM-only module. */ -private fun Project.kmpModules(): List = allModules().filter { it !in ANDROID_ONLY_MODULES + ":desktop" } +private fun kmpModules(): List = allModules().filter { it !in ANDROID_ONLY_MODULES + ":desktopApp" } diff --git a/build-logic/convention/src/main/kotlin/org/meshtastic/buildlogic/Graph.kt b/build-logic/convention/src/main/kotlin/org/meshtastic/buildlogic/Graph.kt index cd294b657..930a10413 100644 --- a/build-logic/convention/src/main/kotlin/org/meshtastic/buildlogic/Graph.kt +++ b/build-logic/convention/src/main/kotlin/org/meshtastic/buildlogic/Graph.kt @@ -137,7 +137,7 @@ fun Project.configureGraphTasks() { pluginManager.hasPlugin("meshtastic.android.application.compose") -> PluginType.AndroidApplication - targetProjectPath.startsWith(":desktop") -> PluginType.ComposeDesktopApplication + targetProjectPath.startsWith(":desktopApp") -> PluginType.ComposeDesktopApplication pluginManager.hasPlugin("meshtastic.kmp.feature") -> PluginType.KmpFeature diff --git a/build-logic/convention/src/main/kotlin/org/meshtastic/buildlogic/KotlinAndroid.kt b/build-logic/convention/src/main/kotlin/org/meshtastic/buildlogic/KotlinAndroid.kt index abcae8595..5229e42f1 100644 --- a/build-logic/convention/src/main/kotlin/org/meshtastic/buildlogic/KotlinAndroid.kt +++ b/build-logic/convention/src/main/kotlin/org/meshtastic/buildlogic/KotlinAndroid.kt @@ -81,48 +81,43 @@ internal fun Project.configureKotlinMultiplatform() { // Standard KMP targets for Meshtastic jvm() - if (!isDesktopOnly) { - // Configure the iOS targets for compile-only validation - // We only add these for modules that already have KMP structure - iosArm64() - iosSimulatorArm64() + // iOS targets for compile-only validation + iosArm64() + iosSimulatorArm64() - // Configure the Android target if the plugin is applied - pluginManager.withPlugin("com.android.kotlin.multiplatform.library") { - extensions.findByType()?.apply { - compileSdk = configProperties.getProperty("COMPILE_SDK").toInt() - minSdk = configProperties.getProperty("MIN_SDK").toInt() + // Configure the Android target if the plugin is applied + pluginManager.withPlugin("com.android.kotlin.multiplatform.library") { + extensions.findByType()?.apply { + compileSdk = configProperties.getProperty("COMPILE_SDK").toInt() + minSdk = configProperties.getProperty("MIN_SDK").toInt() - // Set the namespace automatically if not already set - if (namespace == null) { - val pkg = this@configureKotlinMultiplatform.path.removePrefix(":").replace(":", ".") - namespace = "org.meshtastic.$pkg" - } + // Default: disable Android resources for most KMP modules. + // Modules that need resources (e.g. core:resources) override this + // explicitly in their build.gradle.kts androidLibrary {} block. + androidResources.enable = false + + // Set the namespace automatically if not already set + if (namespace == null) { + val pkg = this@configureKotlinMultiplatform.path.removePrefix(":").replace(":", ".") + namespace = "org.meshtastic.$pkg" } } - } else { - // In desktop-only mode, create placeholder androidMain/iosMain source sets so - // module build scripts that reference them via the DSL accessor don't fail. - // These source sets are inert — no target compiles them. - sourceSets.apply { create("androidMain") { dependsOn(getByName("commonMain")) } } } } - if (!isDesktopOnly) { - // Disable iOS native test link & run tasks. - // iOS targets exist only for compile-time validation; linking test - // executables is extremely slow and causes `./gradlew test` to hang. - tasks.configureEach { - val taskName = name.lowercase() - if (taskName.contains("iosarm64") || taskName.contains("iossimulatorarm64")) { - val isDisabledIosTask = - (taskName.startsWith("link") && taskName.contains("test")) || - taskName == "iosarm64test" || - taskName == "iossimulatorarm64test" || - taskName.endsWith("testbinaries") - if (isDisabledIosTask) { - enabled = false - } + // Disable iOS native test link & run tasks. + // iOS targets exist only for compile-time validation; linking test + // executables is extremely slow and causes `./gradlew test` to hang. + tasks.configureEach { + val taskName = name.lowercase() + if (taskName.contains("iosarm64") || taskName.contains("iossimulatorarm64")) { + val isDisabledIosTask = + (taskName.startsWith("link") && taskName.contains("test")) || + taskName == "iosarm64test" || + taskName == "iossimulatorarm64test" || + taskName.endsWith("testbinaries") + if (isDisabledIosTask) { + enabled = false } } } @@ -275,9 +270,7 @@ private inline fun Project.configureKotlin() { if (isPublishedModule) { val toolchains = extensions.getByType(JavaToolchainService::class.java) tasks.withType().configureEach { - javaLauncher.set( - toolchains.launcherFor { languageVersion.set(JavaLanguageVersion.of(APP_JDK)) } - ) + javaLauncher.set(toolchains.launcherFor { languageVersion.set(JavaLanguageVersion.of(APP_JDK)) }) } } } diff --git a/build-logic/convention/src/main/kotlin/org/meshtastic/buildlogic/ProjectExtensions.kt b/build-logic/convention/src/main/kotlin/org/meshtastic/buildlogic/ProjectExtensions.kt index 05a775e0c..3f2afaaf3 100644 --- a/build-logic/convention/src/main/kotlin/org/meshtastic/buildlogic/ProjectExtensions.kt +++ b/build-logic/convention/src/main/kotlin/org/meshtastic/buildlogic/ProjectExtensions.kt @@ -36,17 +36,6 @@ import java.util.Properties private const val MAX_TEST_RETRIES = 2 private const val MAX_TEST_FAILURES = 10 -/** - * `true` when the build should only configure JVM (desktop) targets, skipping Android and iOS. - * - * Activate via environment variable (`DESKTOP_ONLY=true`) or Gradle property (`-Pdesktop.only=true`). This allows - * building in environments without the Android SDK (e.g. Flatpak sandboxes). - */ -val Project.isDesktopOnly: Boolean - get() = - providers.gradleProperty("desktop.only").orNull?.toBoolean() == true || - providers.environmentVariable("DESKTOP_ONLY").orNull?.toBoolean() == true - val Project.libs get(): VersionCatalog = extensions.getByType().named("libs") diff --git a/codecov.yml b/codecov.yml index 7f77510ff..0bccd30ce 100644 --- a/codecov.yml +++ b/codecov.yml @@ -52,11 +52,11 @@ component_management: - component_id: app name: App paths: - - app/** + - androidApp/** - component_id: desktop name: Desktop paths: - - desktop/** + - desktopApp/** ignore: - "**/build/**" diff --git a/core/barcode/README.md b/core/barcode/README.md index c64fcca6c..2fcbf8a05 100644 --- a/core/barcode/README.md +++ b/core/barcode/README.md @@ -30,7 +30,7 @@ src/ ## Usage ```kotlin -// In a Composable (typically wired via LocalBarcodeScannerProvider in app/) +// In a Composable (typically wired via LocalBarcodeScannerProvider in androidApp/) val scanner = rememberBarcodeScanner { result -> // Handle scanned QR code string (or null on dismiss) } diff --git a/core/ble/build.gradle.kts b/core/ble/build.gradle.kts index ac6fe8125..337435c8e 100644 --- a/core/ble/build.gradle.kts +++ b/core/ble/build.gradle.kts @@ -22,13 +22,7 @@ plugins { } kotlin { - jvm() - - android { - namespace = "org.meshtastic.core.ble" - androidResources.enable = false - withHostTest { isIncludeAndroidResources = true } - } + androidLibrary { withHostTest { isIncludeAndroidResources = true } } sourceSets { commonMain.dependencies { diff --git a/core/common/build.gradle.kts b/core/common/build.gradle.kts index a1bc6261b..11b33ca8f 100644 --- a/core/common/build.gradle.kts +++ b/core/common/build.gradle.kts @@ -24,12 +24,7 @@ plugins { } kotlin { - jvm() - - android { - androidResources.enable = false - withHostTest { isIncludeAndroidResources = true } - } + androidLibrary { withHostTest { isIncludeAndroidResources = true } } sourceSets { commonMain.dependencies { diff --git a/core/data/build.gradle.kts b/core/data/build.gradle.kts index d167e1ffe..6f35b5d5f 100644 --- a/core/data/build.gradle.kts +++ b/core/data/build.gradle.kts @@ -23,13 +23,7 @@ plugins { } kotlin { - jvm() - - android { - namespace = "org.meshtastic.core.data" - androidResources.enable = false - withHostTest { isIncludeAndroidResources = true } - } + androidLibrary { withHostTest { isIncludeAndroidResources = true } } sourceSets { commonMain.dependencies { diff --git a/core/database/build.gradle.kts b/core/database/build.gradle.kts index e732f5c78..b5a8617dc 100644 --- a/core/database/build.gradle.kts +++ b/core/database/build.gradle.kts @@ -25,10 +25,7 @@ plugins { } kotlin { - jvm() - - android { - namespace = "org.meshtastic.core.database" + androidLibrary { withHostTest { isIncludeAndroidResources = true } withDeviceTest { instrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } } diff --git a/core/datastore/build.gradle.kts b/core/datastore/build.gradle.kts index cbf2edadb..2f401fb84 100644 --- a/core/datastore/build.gradle.kts +++ b/core/datastore/build.gradle.kts @@ -22,13 +22,7 @@ plugins { } kotlin { - jvm() - - android { - namespace = "org.meshtastic.core.datastore" - androidResources.enable = false - withHostTest {} - } + androidLibrary { withHostTest {} } sourceSets { commonMain.dependencies { diff --git a/core/di/build.gradle.kts b/core/di/build.gradle.kts index 6e0ada344..75ce7456c 100644 --- a/core/di/build.gradle.kts +++ b/core/di/build.gradle.kts @@ -21,13 +21,6 @@ plugins { } kotlin { - jvm() - - android { - namespace = "org.meshtastic.core.di" - androidResources.enable = false - } - sourceSets { commonMain.dependencies { implementation(projects.core.common) diff --git a/core/domain/build.gradle.kts b/core/domain/build.gradle.kts index 71b956397..251533287 100644 --- a/core/domain/build.gradle.kts +++ b/core/domain/build.gradle.kts @@ -21,11 +21,7 @@ plugins { } kotlin { - android { - namespace = "org.meshtastic.core.domain" - androidResources.enable = false - withHostTest { isIncludeAndroidResources = true } - } + androidLibrary { withHostTest { isIncludeAndroidResources = true } } sourceSets { commonMain.dependencies { diff --git a/core/model/build.gradle.kts b/core/model/build.gradle.kts index 7517bcef2..3c0dc95bd 100644 --- a/core/model/build.gradle.kts +++ b/core/model/build.gradle.kts @@ -25,10 +25,7 @@ plugins { } kotlin { - jvm() - - android { - androidResources.enable = false + androidLibrary { withHostTest { isIncludeAndroidResources = true } withDeviceTest { instrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } } diff --git a/core/navigation/build.gradle.kts b/core/navigation/build.gradle.kts index bd7237a16..633b86f8f 100644 --- a/core/navigation/build.gradle.kts +++ b/core/navigation/build.gradle.kts @@ -23,8 +23,6 @@ plugins { } kotlin { - android { namespace = "org.meshtastic.core.navigation" } - sourceSets { commonMain.dependencies { implementation(projects.core.common) diff --git a/core/network/build.gradle.kts b/core/network/build.gradle.kts index d71a1d1af..4d0380ac6 100644 --- a/core/network/build.gradle.kts +++ b/core/network/build.gradle.kts @@ -23,11 +23,7 @@ plugins { } kotlin { - android { - namespace = "org.meshtastic.core.network" - androidResources.enable = false - withHostTest { isIncludeAndroidResources = true } - } + androidLibrary { withHostTest { isIncludeAndroidResources = true } } sourceSets { commonMain.dependencies { diff --git a/core/nfc/build.gradle.kts b/core/nfc/build.gradle.kts index 355e38d08..935eec87b 100644 --- a/core/nfc/build.gradle.kts +++ b/core/nfc/build.gradle.kts @@ -21,11 +21,6 @@ plugins { } kotlin { - android { - namespace = "org.meshtastic.core.nfc" - androidResources.enable = false - } - sourceSets { commonMain.dependencies { implementation(libs.kermit) } diff --git a/core/prefs/build.gradle.kts b/core/prefs/build.gradle.kts index a37d65e48..f423ca938 100644 --- a/core/prefs/build.gradle.kts +++ b/core/prefs/build.gradle.kts @@ -21,11 +21,7 @@ plugins { } kotlin { - android { - namespace = "org.meshtastic.core.prefs" - androidResources.enable = false - withHostTest {} - } + androidLibrary { withHostTest {} } sourceSets { commonMain.dependencies { diff --git a/core/proto/build.gradle.kts b/core/proto/build.gradle.kts index 112ecf936..683514a3c 100644 --- a/core/proto/build.gradle.kts +++ b/core/proto/build.gradle.kts @@ -24,7 +24,7 @@ plugins { kotlin { // Override minSdk for ATAK compatibility (standard is 26) - android { minSdk = 21 } + androidLibrary { minSdk = 21 } sourceSets { commonMain.dependencies { diff --git a/core/repository/build.gradle.kts b/core/repository/build.gradle.kts index b09051700..6d1185c41 100644 --- a/core/repository/build.gradle.kts +++ b/core/repository/build.gradle.kts @@ -21,10 +21,7 @@ plugins { } kotlin { - android { - androidResources.enable = false - withHostTest {} - } + androidLibrary { withHostTest {} } sourceSets { commonMain.dependencies { diff --git a/core/resources/build.gradle.kts b/core/resources/build.gradle.kts index e8b185dde..82fe2a669 100644 --- a/core/resources/build.gradle.kts +++ b/core/resources/build.gradle.kts @@ -21,9 +21,7 @@ plugins { } kotlin { - jvm() - - android { + androidLibrary { androidResources { enable = true resourcePrefix = "meshtastic_" diff --git a/core/service/build.gradle.kts b/core/service/build.gradle.kts index 65c10432d..59f7d3f95 100644 --- a/core/service/build.gradle.kts +++ b/core/service/build.gradle.kts @@ -21,11 +21,7 @@ plugins { } kotlin { - android { - namespace = "org.meshtastic.core.service" - androidResources.enable = false - withHostTest { isIncludeAndroidResources = true } - } + androidLibrary { withHostTest { isIncludeAndroidResources = true } } sourceSets { commonMain.dependencies { diff --git a/core/takserver/build.gradle.kts b/core/takserver/build.gradle.kts index c9e69c9e8..2aa9d2ec6 100644 --- a/core/takserver/build.gradle.kts +++ b/core/takserver/build.gradle.kts @@ -24,13 +24,7 @@ plugins { kotlin { @Suppress("UnstableApiUsage") - android { - namespace = "org.meshtastic.core.takserver" - androidResources.enable = false - withHostTest { isIncludeAndroidResources = true } - } - - jvm {} + androidLibrary { withHostTest { isIncludeAndroidResources = true } } sourceSets { commonMain.dependencies { diff --git a/core/testing/build.gradle.kts b/core/testing/build.gradle.kts index 7f5f000f1..315a8ddb2 100644 --- a/core/testing/build.gradle.kts +++ b/core/testing/build.gradle.kts @@ -18,11 +18,7 @@ plugins { alias(libs.plugins.meshtastic.kmp.library) } kotlin { - android { - namespace = "org.meshtastic.core.testing" - androidResources.enable = false - withHostTest {} - } + androidLibrary { withHostTest {} } sourceSets { commonMain.dependencies { diff --git a/core/ui/build.gradle.kts b/core/ui/build.gradle.kts index d2779769b..5453ea2f2 100644 --- a/core/ui/build.gradle.kts +++ b/core/ui/build.gradle.kts @@ -23,11 +23,6 @@ plugins { } kotlin { - android { - namespace = "org.meshtastic.core.ui" - androidResources.enable = false - } - sourceSets { commonMain.dependencies { implementation(projects.core.common) diff --git a/desktop/.gitignore b/desktopApp/.gitignore similarity index 100% rename from desktop/.gitignore rename to desktopApp/.gitignore diff --git a/desktop/README.md b/desktopApp/README.md similarity index 93% rename from desktop/README.md rename to desktopApp/README.md index 7a9daf9c8..cd6383b0c 100644 --- a/desktop/README.md +++ b/desktopApp/README.md @@ -1,4 +1,4 @@ -# `:desktop` — Meshtastic Desktop +# `:desktopApp` — Meshtastic Desktop A Compose Desktop application target — the first full non-Android target for the shared KMP module graph. This module serves as: @@ -11,21 +11,21 @@ A Compose Desktop application target — the first full non-Android target for t ```bash # Run the desktop app -./gradlew :desktop:run +./gradlew :desktopApp:run # Run tests -./gradlew :desktop:test +./gradlew :desktopApp:test # Package native distribution (DMG/MSI/DEB) — debug (no ProGuard) -./gradlew :desktop:packageDistributionForCurrentOS +./gradlew :desktopApp:packageDistributionForCurrentOS # Package native distribution (DMG/MSI/DEB) — release (ProGuard minified) -./gradlew :desktop:packageReleaseDistributionForCurrentOS +./gradlew :desktopApp:packageReleaseDistributionForCurrentOS ``` ## ProGuard / Minification -Release builds use ProGuard for tree-shaking (unused code removal), significantly reducing distribution size. Obfuscation is disabled since the project is open-source. Rules are aligned with the Android R8 rules in `app/proguard-rules.pro` — both targets share the same anti-class-merging philosophy. +Release builds use ProGuard for tree-shaking (unused code removal), significantly reducing distribution size. Obfuscation is disabled since the project is open-source. Rules are aligned with the Android R8 rules in `androidApp/proguard-rules.pro` — both targets share the same anti-class-merging philosophy. **Configuration:** - `build.gradle.kts` — `buildTypes.release.proguard` block enables ProGuard with `optimize.set(true)` and `obfuscate.set(false)`. @@ -36,10 +36,10 @@ Release builds use ProGuard for tree-shaking (unused code removal), significantl - **Room KMP** — Uses `androidx.room3` package path (Room KMP 3.x). **Troubleshooting ProGuard issues:** -- If the release build crashes at runtime with `ClassNotFoundException` or `NoSuchMethodError`, a library is loading classes via reflection that ProGuard stripped. Add a `-keep` rule in `proguard-rules.pro` **and** the corresponding rule in `app/proguard-rules.pro` to keep both targets aligned. -- To debug which classes ProGuard removes, temporarily add `-printusage proguard-usage.txt` to the rules file and inspect the output in `desktop/proguard-usage.txt`. +- If the release build crashes at runtime with `ClassNotFoundException` or `NoSuchMethodError`, a library is loading classes via reflection that ProGuard stripped. Add a `-keep` rule in `proguard-rules.pro` **and** the corresponding rule in `androidApp/proguard-rules.pro` to keep both targets aligned. +- To debug which classes ProGuard removes, temporarily add `-printusage proguard-usage.txt` to the rules file and inspect the output in `desktopApp/proguard-usage.txt`. - To see the full mapping of optimizations applied, add `-printseeds proguard-seeds.txt`. -- Run `./gradlew :desktop:runRelease` for a quick smoke-test of the minified app before packaging. +- Run `./gradlew :desktopApp:runRelease` for a quick smoke-test of the minified app before packaging. ## Architecture diff --git a/desktop/build.gradle.kts b/desktopApp/build.gradle.kts similarity index 100% rename from desktop/build.gradle.kts rename to desktopApp/build.gradle.kts diff --git a/desktop/detekt-baseline.xml b/desktopApp/detekt-baseline.xml similarity index 100% rename from desktop/detekt-baseline.xml rename to desktopApp/detekt-baseline.xml diff --git a/desktop/entitlements.plist b/desktopApp/entitlements.plist similarity index 100% rename from desktop/entitlements.plist rename to desktopApp/entitlements.plist diff --git a/desktop/proguard-rules.pro b/desktopApp/proguard-rules.pro similarity index 100% rename from desktop/proguard-rules.pro rename to desktopApp/proguard-rules.pro diff --git a/desktop/src/main/kotlin/org/meshtastic/desktop/DesktopNotificationManager.kt b/desktopApp/src/main/kotlin/org/meshtastic/desktop/DesktopNotificationManager.kt similarity index 100% rename from desktop/src/main/kotlin/org/meshtastic/desktop/DesktopNotificationManager.kt rename to desktopApp/src/main/kotlin/org/meshtastic/desktop/DesktopNotificationManager.kt diff --git a/desktop/src/main/kotlin/org/meshtastic/desktop/Main.kt b/desktopApp/src/main/kotlin/org/meshtastic/desktop/Main.kt similarity index 100% rename from desktop/src/main/kotlin/org/meshtastic/desktop/Main.kt rename to desktopApp/src/main/kotlin/org/meshtastic/desktop/Main.kt diff --git a/desktop/src/main/kotlin/org/meshtastic/desktop/data/DesktopPreferencesDataSource.kt b/desktopApp/src/main/kotlin/org/meshtastic/desktop/data/DesktopPreferencesDataSource.kt similarity index 100% rename from desktop/src/main/kotlin/org/meshtastic/desktop/data/DesktopPreferencesDataSource.kt rename to desktopApp/src/main/kotlin/org/meshtastic/desktop/data/DesktopPreferencesDataSource.kt diff --git a/desktop/src/main/kotlin/org/meshtastic/desktop/di/DesktopDiModule.kt b/desktopApp/src/main/kotlin/org/meshtastic/desktop/di/DesktopDiModule.kt similarity index 100% rename from desktop/src/main/kotlin/org/meshtastic/desktop/di/DesktopDiModule.kt rename to desktopApp/src/main/kotlin/org/meshtastic/desktop/di/DesktopDiModule.kt diff --git a/desktop/src/main/kotlin/org/meshtastic/desktop/di/DesktopKoinModule.kt b/desktopApp/src/main/kotlin/org/meshtastic/desktop/di/DesktopKoinModule.kt similarity index 100% rename from desktop/src/main/kotlin/org/meshtastic/desktop/di/DesktopKoinModule.kt rename to desktopApp/src/main/kotlin/org/meshtastic/desktop/di/DesktopKoinModule.kt diff --git a/desktop/src/main/kotlin/org/meshtastic/desktop/di/DesktopPlatformModule.kt b/desktopApp/src/main/kotlin/org/meshtastic/desktop/di/DesktopPlatformModule.kt similarity index 100% rename from desktop/src/main/kotlin/org/meshtastic/desktop/di/DesktopPlatformModule.kt rename to desktopApp/src/main/kotlin/org/meshtastic/desktop/di/DesktopPlatformModule.kt diff --git a/desktop/src/main/kotlin/org/meshtastic/desktop/navigation/DesktopNavigation.kt b/desktopApp/src/main/kotlin/org/meshtastic/desktop/navigation/DesktopNavigation.kt similarity index 100% rename from desktop/src/main/kotlin/org/meshtastic/desktop/navigation/DesktopNavigation.kt rename to desktopApp/src/main/kotlin/org/meshtastic/desktop/navigation/DesktopNavigation.kt diff --git a/desktop/src/main/kotlin/org/meshtastic/desktop/notification/DesktopMeshServiceNotifications.kt b/desktopApp/src/main/kotlin/org/meshtastic/desktop/notification/DesktopMeshServiceNotifications.kt similarity index 100% rename from desktop/src/main/kotlin/org/meshtastic/desktop/notification/DesktopMeshServiceNotifications.kt rename to desktopApp/src/main/kotlin/org/meshtastic/desktop/notification/DesktopMeshServiceNotifications.kt diff --git a/desktop/src/main/kotlin/org/meshtastic/desktop/notification/DesktopOS.kt b/desktopApp/src/main/kotlin/org/meshtastic/desktop/notification/DesktopOS.kt similarity index 100% rename from desktop/src/main/kotlin/org/meshtastic/desktop/notification/DesktopOS.kt rename to desktopApp/src/main/kotlin/org/meshtastic/desktop/notification/DesktopOS.kt diff --git a/desktop/src/main/kotlin/org/meshtastic/desktop/notification/LinuxNotificationSender.kt b/desktopApp/src/main/kotlin/org/meshtastic/desktop/notification/LinuxNotificationSender.kt similarity index 100% rename from desktop/src/main/kotlin/org/meshtastic/desktop/notification/LinuxNotificationSender.kt rename to desktopApp/src/main/kotlin/org/meshtastic/desktop/notification/LinuxNotificationSender.kt diff --git a/desktop/src/main/kotlin/org/meshtastic/desktop/notification/MacOSNotificationSender.kt b/desktopApp/src/main/kotlin/org/meshtastic/desktop/notification/MacOSNotificationSender.kt similarity index 100% rename from desktop/src/main/kotlin/org/meshtastic/desktop/notification/MacOSNotificationSender.kt rename to desktopApp/src/main/kotlin/org/meshtastic/desktop/notification/MacOSNotificationSender.kt diff --git a/desktop/src/main/kotlin/org/meshtastic/desktop/notification/NativeNotificationSender.kt b/desktopApp/src/main/kotlin/org/meshtastic/desktop/notification/NativeNotificationSender.kt similarity index 100% rename from desktop/src/main/kotlin/org/meshtastic/desktop/notification/NativeNotificationSender.kt rename to desktopApp/src/main/kotlin/org/meshtastic/desktop/notification/NativeNotificationSender.kt diff --git a/desktop/src/main/kotlin/org/meshtastic/desktop/notification/WindowsNotificationSender.kt b/desktopApp/src/main/kotlin/org/meshtastic/desktop/notification/WindowsNotificationSender.kt similarity index 100% rename from desktop/src/main/kotlin/org/meshtastic/desktop/notification/WindowsNotificationSender.kt rename to desktopApp/src/main/kotlin/org/meshtastic/desktop/notification/WindowsNotificationSender.kt diff --git a/desktop/src/main/kotlin/org/meshtastic/desktop/radio/DesktopMessageQueue.kt b/desktopApp/src/main/kotlin/org/meshtastic/desktop/radio/DesktopMessageQueue.kt similarity index 100% rename from desktop/src/main/kotlin/org/meshtastic/desktop/radio/DesktopMessageQueue.kt rename to desktopApp/src/main/kotlin/org/meshtastic/desktop/radio/DesktopMessageQueue.kt diff --git a/desktop/src/main/kotlin/org/meshtastic/desktop/radio/DesktopRadioTransportFactory.kt b/desktopApp/src/main/kotlin/org/meshtastic/desktop/radio/DesktopRadioTransportFactory.kt similarity index 100% rename from desktop/src/main/kotlin/org/meshtastic/desktop/radio/DesktopRadioTransportFactory.kt rename to desktopApp/src/main/kotlin/org/meshtastic/desktop/radio/DesktopRadioTransportFactory.kt diff --git a/desktop/src/main/kotlin/org/meshtastic/desktop/stub/CompassStubs.kt b/desktopApp/src/main/kotlin/org/meshtastic/desktop/stub/CompassStubs.kt similarity index 100% rename from desktop/src/main/kotlin/org/meshtastic/desktop/stub/CompassStubs.kt rename to desktopApp/src/main/kotlin/org/meshtastic/desktop/stub/CompassStubs.kt diff --git a/desktop/src/main/kotlin/org/meshtastic/desktop/stub/NoopStubs.kt b/desktopApp/src/main/kotlin/org/meshtastic/desktop/stub/NoopStubs.kt similarity index 100% rename from desktop/src/main/kotlin/org/meshtastic/desktop/stub/NoopStubs.kt rename to desktopApp/src/main/kotlin/org/meshtastic/desktop/stub/NoopStubs.kt diff --git a/desktop/src/main/kotlin/org/meshtastic/desktop/ui/DesktopMainScreen.kt b/desktopApp/src/main/kotlin/org/meshtastic/desktop/ui/DesktopMainScreen.kt similarity index 100% rename from desktop/src/main/kotlin/org/meshtastic/desktop/ui/DesktopMainScreen.kt rename to desktopApp/src/main/kotlin/org/meshtastic/desktop/ui/DesktopMainScreen.kt diff --git a/desktop/src/main/resources/icon.icns b/desktopApp/src/main/resources/icon.icns similarity index 100% rename from desktop/src/main/resources/icon.icns rename to desktopApp/src/main/resources/icon.icns diff --git a/desktop/src/main/resources/icon.ico b/desktopApp/src/main/resources/icon.ico similarity index 100% rename from desktop/src/main/resources/icon.ico rename to desktopApp/src/main/resources/icon.ico diff --git a/desktop/src/main/resources/icon.png b/desktopApp/src/main/resources/icon.png similarity index 100% rename from desktop/src/main/resources/icon.png rename to desktopApp/src/main/resources/icon.png diff --git a/desktop/src/main/resources/tray_icon_black.svg b/desktopApp/src/main/resources/tray_icon_black.svg similarity index 100% rename from desktop/src/main/resources/tray_icon_black.svg rename to desktopApp/src/main/resources/tray_icon_black.svg diff --git a/desktop/src/main/resources/tray_icon_white.svg b/desktopApp/src/main/resources/tray_icon_white.svg similarity index 100% rename from desktop/src/main/resources/tray_icon_white.svg rename to desktopApp/src/main/resources/tray_icon_white.svg diff --git a/desktop/src/test/kotlin/org/meshtastic/desktop/di/DesktopKoinTest.kt b/desktopApp/src/test/kotlin/org/meshtastic/desktop/di/DesktopKoinTest.kt similarity index 100% rename from desktop/src/test/kotlin/org/meshtastic/desktop/di/DesktopKoinTest.kt rename to desktopApp/src/test/kotlin/org/meshtastic/desktop/di/DesktopKoinTest.kt diff --git a/desktop/src/test/kotlin/org/meshtastic/desktop/notification/DesktopNotificationManagerTest.kt b/desktopApp/src/test/kotlin/org/meshtastic/desktop/notification/DesktopNotificationManagerTest.kt similarity index 100% rename from desktop/src/test/kotlin/org/meshtastic/desktop/notification/DesktopNotificationManagerTest.kt rename to desktopApp/src/test/kotlin/org/meshtastic/desktop/notification/DesktopNotificationManagerTest.kt diff --git a/desktop/src/test/kotlin/org/meshtastic/desktop/notification/LinuxNotificationSenderTest.kt b/desktopApp/src/test/kotlin/org/meshtastic/desktop/notification/LinuxNotificationSenderTest.kt similarity index 100% rename from desktop/src/test/kotlin/org/meshtastic/desktop/notification/LinuxNotificationSenderTest.kt rename to desktopApp/src/test/kotlin/org/meshtastic/desktop/notification/LinuxNotificationSenderTest.kt diff --git a/desktop/src/test/kotlin/org/meshtastic/desktop/notification/MacOSNotificationSenderTest.kt b/desktopApp/src/test/kotlin/org/meshtastic/desktop/notification/MacOSNotificationSenderTest.kt similarity index 100% rename from desktop/src/test/kotlin/org/meshtastic/desktop/notification/MacOSNotificationSenderTest.kt rename to desktopApp/src/test/kotlin/org/meshtastic/desktop/notification/MacOSNotificationSenderTest.kt diff --git a/desktop/src/test/kotlin/org/meshtastic/desktop/notification/WindowsNotificationSenderTest.kt b/desktopApp/src/test/kotlin/org/meshtastic/desktop/notification/WindowsNotificationSenderTest.kt similarity index 100% rename from desktop/src/test/kotlin/org/meshtastic/desktop/notification/WindowsNotificationSenderTest.kt rename to desktopApp/src/test/kotlin/org/meshtastic/desktop/notification/WindowsNotificationSenderTest.kt diff --git a/desktop/src/test/kotlin/org/meshtastic/desktop/ui/DesktopTopLevelDestinationParityTest.kt b/desktopApp/src/test/kotlin/org/meshtastic/desktop/ui/DesktopTopLevelDestinationParityTest.kt similarity index 100% rename from desktop/src/test/kotlin/org/meshtastic/desktop/ui/DesktopTopLevelDestinationParityTest.kt rename to desktopApp/src/test/kotlin/org/meshtastic/desktop/ui/DesktopTopLevelDestinationParityTest.kt diff --git a/feature/connections/build.gradle.kts b/feature/connections/build.gradle.kts index 18d7673a9..d6160c1a2 100644 --- a/feature/connections/build.gradle.kts +++ b/feature/connections/build.gradle.kts @@ -18,11 +18,7 @@ plugins { alias(libs.plugins.meshtastic.kmp.feature) } kotlin { - android { - namespace = "org.meshtastic.feature.connections" - androidResources.enable = false - withHostTest { isIncludeAndroidResources = true } - } + androidLibrary { withHostTest { isIncludeAndroidResources = true } } sourceSets { commonMain.dependencies { diff --git a/feature/firmware/build.gradle.kts b/feature/firmware/build.gradle.kts index 9c83bee0e..8cdd054ec 100644 --- a/feature/firmware/build.gradle.kts +++ b/feature/firmware/build.gradle.kts @@ -21,11 +21,7 @@ plugins { } kotlin { - android { - namespace = "org.meshtastic.feature.firmware" - androidResources.enable = false - withHostTest { isIncludeAndroidResources = true } - } + androidLibrary { withHostTest { isIncludeAndroidResources = true } } sourceSets { commonMain.dependencies { diff --git a/feature/intro/build.gradle.kts b/feature/intro/build.gradle.kts index a55154d6a..0d615ab02 100644 --- a/feature/intro/build.gradle.kts +++ b/feature/intro/build.gradle.kts @@ -21,11 +21,7 @@ plugins { } kotlin { - android { - namespace = "org.meshtastic.feature.intro" - androidResources.enable = false - withHostTest { isIncludeAndroidResources = true } - } + androidLibrary { withHostTest { isIncludeAndroidResources = true } } sourceSets { commonMain.dependencies { diff --git a/feature/map/README.md b/feature/map/README.md index 802f18913..8e393212c 100644 --- a/feature/map/README.md +++ b/feature/map/README.md @@ -1,7 +1,7 @@ # `:feature:map` ## Overview -The `:feature:map` module provides the mapping interface for the application. Map rendering is decomposed into three focused `CompositionLocal` provider contracts, each with per-flavor implementations in `:app`. +The `:feature:map` module provides the mapping interface for the application. Map rendering is decomposed into three focused `CompositionLocal` provider contracts, each with per-flavor implementations in `:androidApp`. ## Architecture @@ -28,8 +28,8 @@ All providers are injected via `CompositionLocal` in `MainActivity.kt` and consu ## Map Providers -- **Google Maps (`google` flavor)**: Uses Google Play Services Maps SDK. Implementations in `app/src/google/kotlin/org/meshtastic/app/map/`. -- **OpenStreetMap (`fdroid` flavor)**: Uses `osmdroid` for a fully open-source experience. Implementations in `app/src/fdroid/kotlin/org/meshtastic/app/map/`. +- **Google Maps (`google` flavor)**: Uses Google Play Services Maps SDK. Implementations in `androidApp/src/google/kotlin/org/meshtastic/app/map/`. +- **OpenStreetMap (`fdroid` flavor)**: Uses `osmdroid` for a fully open-source experience. Implementations in `androidApp/src/fdroid/kotlin/org/meshtastic/app/map/`. ## Features - **Live Node Tracking**: Real-time position updates for nodes on the mesh. diff --git a/feature/map/build.gradle.kts b/feature/map/build.gradle.kts index 42506ea33..3f0f3d11c 100644 --- a/feature/map/build.gradle.kts +++ b/feature/map/build.gradle.kts @@ -20,11 +20,7 @@ plugins { } kotlin { - android { - namespace = "org.meshtastic.feature.map" - androidResources.enable = false - withHostTest { isIncludeAndroidResources = true } - } + androidLibrary { withHostTest { isIncludeAndroidResources = true } } sourceSets { commonMain.dependencies { diff --git a/feature/messaging/build.gradle.kts b/feature/messaging/build.gradle.kts index 3a1c79a1a..39bcfb461 100644 --- a/feature/messaging/build.gradle.kts +++ b/feature/messaging/build.gradle.kts @@ -21,11 +21,6 @@ plugins { } kotlin { - android { - namespace = "org.meshtastic.feature.messaging" - androidResources.enable = false - } - sourceSets { commonMain.dependencies { implementation(libs.compose.multiplatform.foundation) @@ -61,11 +56,11 @@ kotlin { } // Gradle's KMP variant resolution follows `available-at` redirects in module -// metadata and needs android variant `.module` files for disambiguation, even -// when building desktop-only offline. The androidCompileClasspath configuration -// can't be resolved by the flatpak generator due to AGP variant ambiguity on -// project dependencies, so we capture android KMP metadata via a dedicated -// configuration that only holds external dependencies. +// metadata and needs android variant `.module` files for disambiguation. The +// androidCompileClasspath configuration can't be resolved by the flatpak +// generator due to AGP variant ambiguity on project dependencies, so we capture +// android KMP metadata via a dedicated configuration that only holds external +// dependencies. val flatpakKmpAndroidMeta by configurations.creating { isCanBeResolved = true diff --git a/feature/node/build.gradle.kts b/feature/node/build.gradle.kts index c90908280..51f0ae758 100644 --- a/feature/node/build.gradle.kts +++ b/feature/node/build.gradle.kts @@ -21,11 +21,7 @@ plugins { } kotlin { - android { - namespace = "org.meshtastic.feature.node" - androidResources.enable = false - withHostTest { isIncludeAndroidResources = true } - } + androidLibrary { withHostTest { isIncludeAndroidResources = true } } sourceSets { commonMain.dependencies { diff --git a/feature/settings/build.gradle.kts b/feature/settings/build.gradle.kts index 3725dd293..3ef213edd 100644 --- a/feature/settings/build.gradle.kts +++ b/feature/settings/build.gradle.kts @@ -22,11 +22,6 @@ plugins { } kotlin { - android { - namespace = "org.meshtastic.feature.settings" - androidResources.enable = false - } - sourceSets { commonMain.dependencies { implementation(projects.core.common) diff --git a/feature/wifi-provision/build.gradle.kts b/feature/wifi-provision/build.gradle.kts index ca1498b1e..ec0b4a0fe 100644 --- a/feature/wifi-provision/build.gradle.kts +++ b/feature/wifi-provision/build.gradle.kts @@ -20,9 +20,8 @@ plugins { } kotlin { - android { + androidLibrary { namespace = "org.meshtastic.feature.wifiprovision" - androidResources.enable = false withHostTest {} } diff --git a/scripts/desktop-only-prep.sh b/scripts/desktop-only-prep.sh deleted file mode 100755 index 0bd0c4189..000000000 --- a/scripts/desktop-only-prep.sh +++ /dev/null @@ -1,67 +0,0 @@ -#!/usr/bin/env bash -# desktop-only-prep.sh — Prepare source tree for a desktop-only (JVM) build. -# -# Usage: -# ./scripts/desktop-only-prep.sh -# DESKTOP_ONLY=true ./gradlew :desktop:packageUberJarForCurrentOS -# -# This script comments out Android-specific blocks in module build scripts so -# Gradle can configure without the Android SDK. It is designed for Flatpak and -# other sandboxed Linux packaging environments. -# -# Prerequisites: -# npm install -g @ast-grep/cli -# OR -# pipx install ast-grep-cli -# -# The companion in-code guards in build-logic convention plugins handle: -# - Skipping Android/iOS plugin application (KmpLibraryConventionPlugin) -# - Skipping iOS targets (configureKotlinMultiplatform) -# - Creating a placeholder androidMain source set -# - Excluding Android-only modules from settings.gradle.kts -# -# This script handles what can't be done in-code: -# - `kotlin { android { ... } }` blocks in module build.gradle.kts files -# - `androidMain.dependencies { ... }` blocks with project dependencies to -# excluded modules (e.g., projects.core.barcode, projects.core.api) -# -# To reverse: `git checkout -- .` or rebuild from clean source. - -set -euo pipefail - -REPO_ROOT="$(cd "$(dirname "$0")/.." && pwd)" -SCRIPT_DIR="$REPO_ROOT/scripts" -cd "$REPO_ROOT" - -if ! command -v sg &>/dev/null; then - echo "ERROR: ast-grep (sg) is required but not found in PATH." >&2 - echo " Install: https://ast-grep.github.io/guide/quick-start.html" >&2 - exit 1 -fi - -echo "==> Preparing desktop-only build..." - -# Collect target build.gradle.kts files (excluding modules that stay as-is) -mapfile -t FILES < <(find . -name "build.gradle.kts" \ - -not -path "./build-logic/*" \ - -not -path "./.agent_refs/*" \ - -not -path "./coil/*" \ - -not -path "./kable/*" \ - -not -path "./app/*" \ - -not -path "./core/api/*" \ - -not -path "./core/barcode/*" \ - -not -path "./feature/widget/*" \ - -not -path "./desktop/*" \ - -not -path "./build/*") - -if [[ ${#FILES[@]} -eq 0 ]]; then - echo "WARNING: No build.gradle.kts files found to process." >&2 - exit 0 -fi - -# Apply all ast-grep rules from the rules directory. -# Each rule YAML defines a pattern to match and a fix (comment replacement). -sg scan -c "$SCRIPT_DIR/sgconfig.yml" --update-all "${FILES[@]}" - -echo "==> Desktop-only prep complete." -echo " Run: DESKTOP_ONLY=true ./gradlew :desktop:packageUberJarForCurrentOS" diff --git a/scripts/desktop-only-rules/remove-android-block.yml b/scripts/desktop-only-rules/remove-android-block.yml deleted file mode 100644 index 972b63e3f..000000000 --- a/scripts/desktop-only-rules/remove-android-block.yml +++ /dev/null @@ -1,10 +0,0 @@ -id: remove-android-block -language: kotlin -severity: warning -message: "Remove android { } block for desktop-only build" -rule: - pattern: |- - android { - $$$BODY - } -fix: "// [desktop-only] android { ... } block removed" diff --git a/scripts/desktop-only-rules/remove-android-device-test.yml b/scripts/desktop-only-rules/remove-android-device-test.yml deleted file mode 100644 index 4d653681b..000000000 --- a/scripts/desktop-only-rules/remove-android-device-test.yml +++ /dev/null @@ -1,10 +0,0 @@ -id: remove-android-device-test -language: kotlin -severity: warning -message: "Remove val androidDeviceTest block for desktop-only build" -rule: - pattern: |- - val androidDeviceTest by getting { - $$$BODY - } -fix: "// [desktop-only] val androidDeviceTest { ... } block removed" diff --git a/scripts/desktop-only-rules/remove-android-host-test.yml b/scripts/desktop-only-rules/remove-android-host-test.yml deleted file mode 100644 index 0d68e32b3..000000000 --- a/scripts/desktop-only-rules/remove-android-host-test.yml +++ /dev/null @@ -1,10 +0,0 @@ -id: remove-android-host-test -language: kotlin -severity: warning -message: "Remove val androidHostTest block for desktop-only build" -rule: - pattern: |- - val androidHostTest by getting { - $$$BODY - } -fix: "// [desktop-only] val androidHostTest { ... } block removed" diff --git a/scripts/desktop-only-rules/remove-android-imports.yml b/scripts/desktop-only-rules/remove-android-imports.yml deleted file mode 100644 index 35060f455..000000000 --- a/scripts/desktop-only-rules/remove-android-imports.yml +++ /dev/null @@ -1,7 +0,0 @@ -id: remove-android-imports -language: kotlin -severity: warning -message: "Remove com.android import for desktop-only build" -rule: - pattern: "import com.android.$$$REST" -fix: "// [desktop-only] android import removed" diff --git a/scripts/desktop-only-rules/remove-android-instrumented-test.yml b/scripts/desktop-only-rules/remove-android-instrumented-test.yml deleted file mode 100644 index 4091c617e..000000000 --- a/scripts/desktop-only-rules/remove-android-instrumented-test.yml +++ /dev/null @@ -1,10 +0,0 @@ -id: remove-android-instrumented-test -language: kotlin -severity: warning -message: "Remove val androidInstrumentedTest block for desktop-only build" -rule: - pattern: |- - val androidInstrumentedTest by getting { - $$$BODY - } -fix: "// [desktop-only] val androidInstrumentedTest { ... } block removed" diff --git a/scripts/desktop-only-rules/remove-android-main-deps.yml b/scripts/desktop-only-rules/remove-android-main-deps.yml deleted file mode 100644 index 3dd1cd72d..000000000 --- a/scripts/desktop-only-rules/remove-android-main-deps.yml +++ /dev/null @@ -1,10 +0,0 @@ -id: remove-android-main-deps -language: kotlin -severity: warning -message: "Remove androidMain.dependencies { } block for desktop-only build" -rule: - pattern: |- - androidMain.dependencies { - $$$BODY - } -fix: "// [desktop-only] androidMain.dependencies { ... } block removed" diff --git a/scripts/desktop-only-rules/remove-ksp-android.yml b/scripts/desktop-only-rules/remove-ksp-android.yml deleted file mode 100644 index 7ea8680c8..000000000 --- a/scripts/desktop-only-rules/remove-ksp-android.yml +++ /dev/null @@ -1,8 +0,0 @@ -id: remove-ksp-android -language: kotlin -severity: warning -message: "Remove kspAndroid configuration for desktop-only build" -rule: - kind: call_expression - regex: "^\"kspAndroid" -fix: "// [desktop-only] kspAndroid config removed" diff --git a/scripts/desktop-only-rules/remove-parcelize-plugin.yml b/scripts/desktop-only-rules/remove-parcelize-plugin.yml deleted file mode 100644 index 9dd969cda..000000000 --- a/scripts/desktop-only-rules/remove-parcelize-plugin.yml +++ /dev/null @@ -1,7 +0,0 @@ -id: remove-parcelize-plugin -language: kotlin -severity: warning -message: "Remove parcelize plugin for desktop-only build" -rule: - pattern: "alias(libs.plugins.kotlin.parcelize)" -fix: "// [desktop-only] alias(libs.plugins.kotlin.parcelize)" diff --git a/scripts/sgconfig.yml b/scripts/sgconfig.yml deleted file mode 100644 index 0366edac1..000000000 --- a/scripts/sgconfig.yml +++ /dev/null @@ -1,2 +0,0 @@ -ruleDirs: - - desktop-only-rules diff --git a/settings.gradle.kts b/settings.gradle.kts index 4b41e8936..6d37b6559 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -25,12 +25,6 @@ pluginManagement { } } -// Desktop-only mode: skip Android-only modules when ANDROID_HOME is unavailable (e.g. Flatpak builds). -// Activate via: DESKTOP_ONLY=true ./gradlew :desktop:packageUberJarForCurrentOS -val desktopOnly = - providers.gradleProperty("desktop.only").orNull?.toBoolean() == true || - System.getenv("DESKTOP_ONLY")?.toBoolean() == true - plugins { id("org.gradle.toolchains.foojay-resolver") version "1.0.0" id("com.gradle.develocity") version "4.4.1" @@ -112,15 +106,10 @@ include( ":feature:settings", ":feature:firmware", ":feature:wifi-provision", - ":desktop", + ":desktopApp", + ":androidApp", + ":core:api", + ":core:barcode", + ":feature:widget", + ":screenshot-tests", ) - -if (!desktopOnly) { - include( - ":app", - ":core:api", - ":core:barcode", - ":feature:widget", - ":screenshot-tests", - ) -} diff --git a/specs/006-kmp-project-structure/checklists/build-migration.md b/specs/006-kmp-project-structure/checklists/build-migration.md new file mode 100644 index 000000000..20fa71b60 --- /dev/null +++ b/specs/006-kmp-project-structure/checklists/build-migration.md @@ -0,0 +1,110 @@ +# Build Migration Checklist: KMP Recommended Project Structure Alignment + +**Purpose**: Validate the quality, completeness, and clarity of requirements for migrating 27 KMP modules from legacy `android {}` blocks to `kotlin.androidLibrary {}` DSL, hardening convention plugins, and verifying module boundaries. +**Created**: 2025-07-16 +**Feature**: [spec.md](../spec.md) | [plan.md](../plan.md) | [tasks.md](../tasks.md) +**Focus**: Build infrastructure migration — DSL correctness, convention plugin hardening, build verification +**Audience**: PR Reviewer +**Depth**: Standard + +--- + +## Requirement Completeness + +- [ ] CHK001 — Are migration requirements specified for all 27 KMP modules individually, with per-module expected outcome documented? [Completeness, Spec §FR-001, Data Model §Migration Matrix] +- [ ] CHK002 — Are the 4 excluded modules (`feature:widget`, `core:api`, `core:barcode`, `screenshot-tests`) explicitly listed with justification for exclusion? [Completeness, Spec §FR-004] +- [ ] CHK003 — Is the convention plugin enhancement requirement (`androidResources.enable = false` default) specified with exact insertion point and backward-compatibility rationale? [Completeness, Spec §FR-003, §FR-007] +- [ ] CHK004 — Are build verification requirements defined for every migration phase, not just the final state? [Completeness, Plan §Phase Dependencies] +- [ ] CHK005 — Are requirements defined for what constitutes a "clean build baseline" measurement in Phase 1? [Completeness, Gap — T001 mentions "record timings" but format/storage unspecified] +- [ ] CHK006 — Is the redundant `jvm()` cleanup requirement documented with the full list of affected modules (14 modules per data-model.md)? [Completeness, Data Model §Redundant jvm() cleanup] +- [ ] CHK007 — Are requirements specified for updating `quickstart.md` if migration steps differ from what was actually executed? [Completeness, Tasks §T047] + +## Requirement Clarity + +- [x] CHK008 — Is the distinction between "28 KMP modules" (spec §Summary) and "27 KMP modules" (plan, data-model) resolved with an authoritative count? [Clarity, Ambiguity — ✅ Fixed: all references now say 27] +- [ ] CHK009 — Is "legacy `android {}` blocks inside `kotlin {}`" precisely defined to distinguish from `android {}` in non-KMP modules and from `androidLibrary {}` blocks? [Clarity, Spec §FR-001] +- [ ] CHK010 — Is the NFR-001 build-time threshold ("not increase by more than 5%") specified with measurement methodology — cold vs warm build, CI vs local, which tasks? [Clarity, Spec §NFR-001] +- [ ] CHK011 — Is "auto-derived namespace" behavior documented with the exact derivation formula (`:core:di` → `org.meshtastic.core.di`) so reviewers can verify correctness? [Clarity, Quickstart §Step 1] +- [ ] CHK012 — Is the `feature:wifi-provision` namespace mismatch clearly documented — why auto-derived `feature.wifi.provision` differs from required `feature.wifiprovision` and that this is the only override? [Clarity, Tasks §T030, Data Model §Tier 2c] +- [ ] CHK013 — Is "uses only `KotlinMultiplatformAndroidLibraryTarget` API" (SC-007) defined with enough specificity to distinguish compliant from non-compliant patterns in the convention plugin? [Clarity, Spec §SC-007] +- [ ] CHK014 — Is the `core:proto` minSdk override requirement (`minSdk = 21`) specified with rationale ("ATAK compatibility") that a reviewer can validate as still necessary? [Clarity, Tasks §T032] + +## Requirement Consistency + +- [ ] CHK015 — Are the tier classifications consistent between data-model.md, tasks.md, and quickstart.md for all 27 modules? [Consistency, Cross-Artifact] +- [ ] CHK016 — Does the `core:model` module appear in exactly one tier across all artifacts (Tier 2a in data-model.md, not duplicated in Tier 1)? [Consistency, Plan §Notes — explicit callout of double-count] +- [ ] CHK017 — Are the `withHostTest` configurations (empty `{}` vs `{ isIncludeAndroidResources = true }`) consistent between data-model.md and tasks.md for all 18 Tier 2 modules? [Consistency] +- [ ] CHK018 — Do quickstart.md code examples match the exact DSL patterns specified in data-model.md "After migration" column? [Consistency, Cross-Artifact] +- [ ] CHK019 — Are convention plugin file paths consistent across spec.md (§Key Components), plan.md (§Source Code), and tasks.md (T004, T043)? [Consistency] +- [ ] CHK020 — Is the `core:resources` module consistently documented as the sole module requiring `androidResources.enable = true` across all artifacts? [Consistency, Data Model §Validation Rules] + +## Acceptance Criteria Quality + +- [ ] CHK021 — Are success criteria SC-001 through SC-007 all objectively measurable with specific commands or grep patterns? [Measurability, Spec §Success Criteria] +- [ ] CHK022 — Is SC-006 ("new contributor can add a new KMP module") testable as-stated, or does it need a concrete verification procedure? [Measurability, Spec §SC-006 — no test procedure defined] +- [ ] CHK023 — Is SC-005 ("build time within 5%") measurable given that build times vary by machine — are multiple-run averaging or CI-based measurements specified? [Measurability, Spec §SC-005] +- [ ] CHK024 — Are the grep validation commands in tasks.md (T041, T042) specified with sufficient exclusion patterns to avoid false positives from Android-only modules and unrelated string matches? [Measurability, Tasks §T041] +- [ ] CHK025 — Does each user story's "Independent Test" section provide a concrete, copy-pasteable verification command? [Measurability, Spec §US1–US4] + +## Scenario Coverage + +- [ ] CHK026 — Are requirements defined for what happens if a single module migration fails mid-batch — can other modules in the same tier proceed? [Coverage, Exception Flow, Gap] +- [x] CHK027 — Are rollback requirements specified at per-module, per-tier, and full-migration granularity? [Coverage — ✅ Fixed: quickstart.md Rollback Plan now includes per-module, per-tier, and full-migration commands] +- [ ] CHK028 — Are requirements specified for the `DESKTOP_ONLY=true` build mode after each migration phase, or only at final verification? [Coverage, Spec §FR-005 — only tested in Phase 6 T039] +- [ ] CHK029 — Are CI/CD pipeline implications documented — will the migration PR pass existing CI checks without CI configuration changes? [Coverage, Gap] +- [ ] CHK030 — Are requirements specified for what happens if Gradle configuration cache is invalidated by the DSL migration? [Coverage, Spec §NFR-002] + +## Edge Case Coverage + +- [ ] CHK031 — Is the `core:database` module's `withDeviceTest` + `withHostTest` combination requirement fully specified, including the exact `instrumentationRunner` value? [Edge Case, Data Model §Tier 3] +- [ ] CHK032 — Is the `core:resources` module's resource prefix (`meshtastic_`) override requirement specified alongside the `androidResources.enable = true` override? [Edge Case, Data Model §Tier 3] +- [ ] CHK033 — Are requirements defined for modules that use the `meshtastic.kmp.jvm.android` plugin — does the DSL migration affect the `jvmAndroidMain` shared source set? [Edge Case, Spec §Assumptions] +- [ ] CHK034 — Is the behavior specified when a module's auto-derived namespace collides with another module's namespace? [Edge Case, Gap] +- [ ] CHK035 — Are requirements specified for the convention plugin's behavior when `namespace` is already set by a module (explicit override takes precedence)? [Edge Case, Quickstart §Step 1 — "if null" guard] + +## Non-Functional Requirements + +- [ ] CHK036 — Is NFR-003 ("no intermediate broken states on main branch") achievable as specified — does the plan ensure atomic commit boundaries? [NFR, Spec §NFR-003] +- [ ] CHK037 — Is NFR-004 ("documentable as step-by-step checklist for other repositories") satisfied by quickstart.md, or is additional documentation needed? [NFR, Spec §NFR-004] +- [ ] CHK038 — Are Gradle compatibility requirements specified — minimum Gradle version, configuration cache compatibility, isolated projects mode? [NFR, Spec §NFR-002] +- [ ] CHK039 — Are formatting and static analysis requirements (spotlessCheck, detekt) specified as part of every phase verification, or only in Phase 7? [NFR, Tasks — only T045 in Phase 7] + +## Dependencies & Assumptions + +- [ ] CHK040 — Is the assumption "project already runs AGP 9.2.1" validated with a specific version check requirement? [Assumption, Spec §Assumptions] +- [ ] CHK041 — Is the assumption "no module uses deprecated `androidTarget {}` call" specified as a pre-migration verification step? [Assumption, Spec §Assumptions] +- [ ] CHK042 — Is the Phase 2 → Phase 3/4/5 blocking dependency clearly specified — convention plugin hardening MUST complete before any module migration? [Dependency, Plan §Phase Dependencies] +- [ ] CHK043 — Is the `jvmAndroidMain` shared source set compatibility assumption validated — are there requirements to verify this pattern works with the new DSL? [Assumption, Spec §Assumptions] +- [ ] CHK044 — Is the backward-compatibility assumption for T004 (adding `androidResources.enable = false` default) documented with rationale that existing explicit overrides become no-ops? [Assumption, Plan §Key Risk Mitigation] + +## Ambiguities & Conflicts + +- [x] CHK045 — Is the "28 vs 27 modules" discrepancy resolved authoritatively in spec.md, or does the spec still say 28 while plan says 27? [Conflict — ✅ Fixed: all 5 instances of "28" updated to "27" in spec.md] +- [x] CHK046 — Does FR-008 ("prevent future modules from using legacy pattern") have a concrete enforcement mechanism specified, or is it aspirational? [Ambiguity — ✅ Fixed: T048 added to tasks.md — CI grep check or Gradle afterEvaluate assertion] +- [ ] CHK047 — Is it clear whether the `kotlin.androidLibrary {}` block should be removed entirely for Tier 1 modules or left as an empty block? [Ambiguity, Data Model says "removed", Quickstart shows no block] +- [ ] CHK048 — Is the scope of "convention plugin hardening" bounded — does FR-007 ("audit and update") have a defined completion criterion beyond "zero legacy references"? [Ambiguity, Spec §FR-007] + +## Cross-Artifact Consistency + +- [ ] CHK049 — Do task IDs in tasks.md (T001–T047) align with plan.md phase references and user story assignments? [Consistency, Cross-Artifact] +- [ ] CHK050 — Do data-model.md tier classifications match the tier groupings in tasks.md Phases 3–5? [Consistency, Cross-Artifact] +- [ ] CHK051 — Do quickstart.md migration patterns match the "After migration" column in data-model.md for all three tiers? [Consistency, Cross-Artifact] +- [ ] CHK052 — Are success criteria (SC-001–SC-007) in spec.md traceable to specific verification tasks in tasks.md? [Traceability, Cross-Artifact] +- [ ] CHK053 — Do the parallel execution opportunities documented in tasks.md (§Parallel Opportunities) align with the phase dependency constraints in plan.md? [Consistency, Cross-Artifact] + +## Constitution Compliance + +- [ ] CHK054 — Principle I (KMP Core): Are requirements specified to verify no `commonMain` source files are modified — only `build.gradle.kts` and convention plugin files? [Consistency, Spec §Source-Set Impact] +- [ ] CHK055 — Principle II (Zero Lint Tolerance): Are `spotlessCheck` and `detekt` verification requirements included in the migration acceptance criteria? [Consistency, Plan §Constitution Check] +- [ ] CHK056 — Principle IV (Privacy First): Is the `core/proto` submodule explicitly excluded from modifications in the requirements? [Consistency, Spec §Privacy Assessment] +- [ ] CHK057 — Principle VI (Verify Before Push): Are all six verification commands from the constitution mapped to specific tasks? [Consistency, Plan §Constitution Check] + +--- + +## Notes + +- Check items off as completed: `[x]` +- Items marked `[Gap]` indicate requirements that may be missing entirely +- Items marked `[Ambiguity]` or `[Conflict]` indicate requirements needing clarification before implementation +- The 28-vs-27 module count discrepancy (CHK008, CHK045) is the most critical ambiguity — resolve in spec.md before proceeding +- Cross-artifact consistency (CHK049–CHK053) is especially important given 5 design documents diff --git a/specs/006-kmp-project-structure/checklists/requirements.md b/specs/006-kmp-project-structure/checklists/requirements.md new file mode 100644 index 000000000..ab8206d3f --- /dev/null +++ b/specs/006-kmp-project-structure/checklists/requirements.md @@ -0,0 +1,37 @@ +# Specification Quality Checklist: KMP Recommended Project Structure Alignment + +**Purpose**: Validate specification completeness and quality before proceeding to planning +**Created**: 2025-07-15 (updated with blog post context) +**Feature**: [spec.md](../spec.md) + +## Content Quality + +- [x] No implementation details (languages, frameworks, APIs) +- [x] Focused on user value and business needs +- [x] Written for non-technical stakeholders +- [x] All mandatory sections completed + +## Requirement Completeness + +- [x] No [NEEDS CLARIFICATION] markers remain +- [x] Requirements are testable and unambiguous +- [x] Success criteria are measurable +- [x] Success criteria are technology-agnostic (no implementation details) +- [x] All acceptance scenarios are defined +- [x] Edge cases are identified +- [x] Scope is clearly bounded +- [x] Dependencies and assumptions identified + +## Feature Readiness + +- [x] All functional requirements have clear acceptance criteria +- [x] User scenarios cover primary flows +- [x] Feature meets measurable outcomes defined in Success Criteria +- [x] No implementation details leak into specification + +## Notes + +- The Architecture section references specific plugin names, DSL block names, and file paths because this is a build infrastructure feature — these are the "domain concepts" of the feature, not implementation details. The spec remains technology-agnostic regarding *how* the migration is executed. +- The "Design Standards Compliance" section was intentionally removed as this feature has zero UI impact. +- Gap analysis is based on a concrete audit of all 30+ modules — findings are documented in the Architecture section. +- All checklist items pass. Spec is ready for `/speckit.clarify` or `/speckit.plan`. diff --git a/specs/006-kmp-project-structure/data-model.md b/specs/006-kmp-project-structure/data-model.md new file mode 100644 index 000000000..54393a431 --- /dev/null +++ b/specs/006-kmp-project-structure/data-model.md @@ -0,0 +1,112 @@ +# Data Model: KMP Module Classification & Migration Matrix + +## Entity: KMP Module + +Each KMP module has the following properties relevant to migration: + +| Field | Type | Description | +|-------|------|-------------| +| `path` | String | Gradle module path (e.g., `:core:common`) | +| `convention_plugin` | Enum | `meshtastic.kmp.library` or `meshtastic.kmp.feature` | +| `namespace` | String? | Android namespace; null = auto-derived by convention | +| `namespace_override_needed` | Boolean | True if auto-derived namespace doesn't match desired | +| `android_resources` | Enum | `disabled` (default), `enabled`, `enabled_with_prefix` | +| `host_test` | Enum | `none`, `empty`, `with_resources` | +| `device_test` | Boolean | Has `withDeviceTest {}` block | +| `min_sdk_override` | Int? | Non-null only if module overrides default minSdk | +| `extra_jvm_target` | Boolean | Has explicit `jvm()` call (redundant with convention) | +| `jvm_android_source_set` | Boolean | Uses `meshtastic.kmp.jvm.android` plugin | +| `tier` | Enum | `simple`, `standard`, `special` | + +## Module Migration Matrix + +### Tier 1: Minimal — androidLibrary block becomes empty or removed (6 modules) + +Modules where convention handles everything. After migration, the `kotlin {}` block needs no `androidLibrary {}` at all (namespace auto-derived, resources disabled by convention, no tests). + +| Module | Current `android {}` content | After migration | +|--------|------------------------------|-----------------| +| `core:di` | namespace, resources=false | Remove `androidLibrary {}` entirely | +| `core:nfc` | namespace, resources=false | Remove `androidLibrary {}` entirely | +| `core:ui` | namespace, resources=false | Remove `androidLibrary {}` entirely | +| `core:navigation` | namespace only | Remove `androidLibrary {}` entirely | +| `feature:settings` | namespace, resources=false | Remove `androidLibrary {}` entirely | +| `feature:messaging` | namespace, resources=false | Remove `androidLibrary {}` entirely | + +### Tier 2: Standard — only withHostTest remains (18 modules) + +Modules that opt into host tests. The `androidLibrary {}` block only contains `withHostTest {}`. + +| Module | withHostTest config | After migration | +|--------|-------------------|-----------------| +| `core:ble` | `{ isIncludeAndroidResources = true }` | `androidLibrary { withHostTest { isIncludeAndroidResources = true } }` | +| `core:common` | `{ isIncludeAndroidResources = true }` | `androidLibrary { withHostTest { isIncludeAndroidResources = true } }` | +| `core:data` | `{ isIncludeAndroidResources = true }` | `androidLibrary { withHostTest { isIncludeAndroidResources = true } }` | +| `core:domain` | `{ isIncludeAndroidResources = true }` | `androidLibrary { withHostTest { isIncludeAndroidResources = true } }` | +| `core:model` | `{ isIncludeAndroidResources = true }` | `androidLibrary { withHostTest { isIncludeAndroidResources = true } }` | +| `core:network` | `{ isIncludeAndroidResources = true }` | `androidLibrary { withHostTest { isIncludeAndroidResources = true } }` | +| `core:service` | `{ isIncludeAndroidResources = true }` | `androidLibrary { withHostTest { isIncludeAndroidResources = true } }` | +| `core:takserver` | `{ isIncludeAndroidResources = true }` | `androidLibrary { withHostTest { isIncludeAndroidResources = true } }` | +| `feature:connections` | `{ isIncludeAndroidResources = true }` | `androidLibrary { withHostTest { isIncludeAndroidResources = true } }` | +| `feature:firmware` | `{ isIncludeAndroidResources = true }` | `androidLibrary { withHostTest { isIncludeAndroidResources = true } }` | +| `feature:intro` | `{ isIncludeAndroidResources = true }` | `androidLibrary { withHostTest { isIncludeAndroidResources = true } }` | +| `feature:map` | `{ isIncludeAndroidResources = true }` | `androidLibrary { withHostTest { isIncludeAndroidResources = true } }` | +| `feature:node` | `{ isIncludeAndroidResources = true }` | `androidLibrary { withHostTest { isIncludeAndroidResources = true } }` | +| `core:datastore` | `{}` (empty) | `androidLibrary { withHostTest {} }` | +| `core:prefs` | `{}` (empty) | `androidLibrary { withHostTest {} }` | +| `core:repository` | `{}` (empty) | `androidLibrary { withHostTest {} }` | +| `core:testing` | `{}` (empty) | `androidLibrary { withHostTest {} }` | +| `feature:wifi-provision` | `{}` (empty) | `androidLibrary { namespace = "org.meshtastic.feature.wifiprovision"; withHostTest {} }` | + +### Tier 3: Special — additional configuration (3 modules) + +| Module | Special config | After migration | +|--------|---------------|-----------------| +| `core:proto` | `minSdk = 21` | `androidLibrary { minSdk = 21 }` | +| `core:database` | namespace + withHostTest + withDeviceTest | `androidLibrary { withHostTest { isIncludeAndroidResources = true }; withDeviceTest { instrumentationRunner = "..." } }` | +| `core:resources` | resources enabled + prefix + withHostTest | `androidLibrary { androidResources { enable = true; resourcePrefix = "meshtastic_" }; withHostTest { isIncludeAndroidResources = true } }` | + +## Convention Plugin Enhancement + +### `configureKotlinMultiplatform()` — new default + +``` +BEFORE (KotlinAndroid.kt:91-101): + compileSdk = ... + minSdk = ... + namespace = auto-derived if null + +AFTER: + compileSdk = ... + minSdk = ... + namespace = auto-derived if null + androidResources.enable = false ← NEW DEFAULT +``` + +This eliminates `androidResources.enable = false` from 23 of 27 module build files. Only `core:resources` overrides this to `true`. + +## Redundant `jvm()` cleanup + +14 modules declare `jvm()` in their `kotlin {}` block despite the convention plugin calling `jvm()` in `configureKotlinMultiplatform()`. These redundant declarations will be removed. + +Modules with redundant `jvm()`: `core:ble`, `core:common`, `core:data`, `core:database`, `core:datastore`, `core:di`, `core:domain`, `core:model`, `core:network`, `core:resources`, `core:takserver`, `core:ui`, `feature:map`, `feature:wifi-provision`. + +## State Transitions + +``` +Module State Machine: + +[LEGACY] [MIGRATED] [VERIFIED] +android {} inside kotlin {} → androidLibrary {} DSL → Build passes + (or removed if empty) +``` + +Each module transitions independently. Build verification after each batch. + +## Validation Rules + +1. **No `android {}` inside `kotlin {}`**: After migration, `grep -rn "kotlin {" -A5 | grep "android {"` must return zero matches in KMP modules. +2. **No redundant `jvm()`**: After cleanup, only convention plugin declares `jvm()`. +3. **Namespace correctness**: All modules must resolve to correct namespace (verified by successful build). +4. **Resources disabled by default**: Only `core:resources` has `androidResources.enable = true`. +5. **Build verification**: `assembleDebug`, `:desktop:packageUberJarForCurrentOS`, `allTests`, and `DESKTOP_ONLY` mode all pass. diff --git a/specs/006-kmp-project-structure/plan.md b/specs/006-kmp-project-structure/plan.md new file mode 100644 index 000000000..80cbb8228 --- /dev/null +++ b/specs/006-kmp-project-structure/plan.md @@ -0,0 +1,78 @@ +# Implementation Plan: KMP Recommended Project Structure Alignment + +**Branch**: `020-kmp-project-structure` | **Date**: 2025-07-15 | **Spec**: `specs/006-kmp-project-structure/spec.md` +**Input**: Feature specification from `specs/006-kmp-project-structure/spec.md` + +## Summary + +Migrate 27 KMP modules from legacy `android {}` blocks inside `kotlin {}` to the recommended `kotlin.androidLibrary {}` top-level DSL. The project already runs AGP 9.2.1 and applies `com.android.kotlin.multiplatform.library` via convention plugins — the primary work is DSL migration in individual module `build.gradle.kts` files and hardening the convention plugin helper `configureKotlinMultiplatform()` to absorb common settings (like `androidResources.enable = false` and `withHostTest {}`) so modules need fewer per-module overrides. Build verification at each step is critical. + +## Technical Context + +**Language/Version**: Kotlin 2.3+ targeting JDK 21 (JDK 17 for published modules) +**Primary Dependencies**: AGP 9.2.1, Kotlin Multiplatform Gradle Plugin, `com.android.kotlin.multiplatform.library` +**Storage**: N/A (build infrastructure only) +**Testing**: `./gradlew assembleDebug :desktop:packageUberJarForCurrentOS allTests` for build verification +**Target Platform**: Android (API 26+) + Compose Desktop (JVM) +**Project Type**: Mobile app (KMP) — build infrastructure change +**Performance Goals**: Build time must not increase >5% (NFR-001) +**Constraints**: Configuration cache, isolated projects, parallel execution must remain functional (NFR-002) +**Scale/Scope**: 27 KMP modules across `core/` (19) and `feature/` (8), plus 4 convention plugin files in `build-logic/` + +## Constitution Check + +*GATE: Must pass before Phase 0 research. Re-check after Phase 1 design.* + +- **I. Kotlin Multiplatform Core**: ✅ PASS — No source files are modified. All changes are to `build.gradle.kts` configuration files and convention plugin Kotlin files in `build-logic/`. Business logic in `commonMain` is untouched. The migration moves Android target configuration from `kotlin { android {} }` to `kotlin { androidLibrary {} }` — a pure DSL change with identical semantics. + +- **II. Zero Lint Tolerance**: ✅ PASS — Verification commands: + - `./gradlew spotlessApply spotlessCheck` (formatting) + - `./gradlew detekt` (static analysis) + - Convention plugin files in `build-logic/` are covered by the `:build-logic:convention:spotlessCheck` and `:build-logic:convention:detekt` tasks. + +- **III. Compose Multiplatform UI**: ✅ N/A — No UI changes. This is a build infrastructure change only. + +- **IV. Privacy First**: ✅ PASS — No runtime behavior changes. No PII exposure. `core/proto` submodule not modified. + +- **V. Design Standards Compliance**: ✅ N/A — No user-facing UI changes. Cross-Platform Spec: N/A — build infrastructure change. + +- **VI. Verify Before Push**: ✅ — Local verification commands: + ```bash + ./gradlew spotlessApply spotlessCheck detekt assembleDebug :desktop:packageUberJarForCurrentOS allTests + DESKTOP_ONLY=true ./gradlew :desktop:packageUberJarForCurrentOS + ``` + Post-push: `gh pr checks ` or `gh run list --branch 020-kmp-project-structure --limit 5` + +## Project Structure + +### Documentation (this feature) + +```text +specs/006-kmp-project-structure/ +├── plan.md # This file +├── research.md # Phase 0: DSL migration research +├── data-model.md # Phase 1: Module classification and migration matrix +├── quickstart.md # Phase 1: Step-by-step migration guide +└── tasks.md # Phase 2 output (/speckit.tasks command) +``` + +### Source Code (repository root) + +```text +build-logic/convention/src/main/kotlin/ +├── KmpLibraryConventionPlugin.kt # Convention plugin — no changes expected +├── KmpFeatureConventionPlugin.kt # Convention plugin — no changes expected +├── KmpJvmAndroidConventionPlugin.kt # Convention plugin — no changes expected +└── org/meshtastic/buildlogic/ + └── KotlinAndroid.kt # configureKotlinMultiplatform() — harden defaults + +core/*/build.gradle.kts # 19 KMP modules — migrate android {} → androidLibrary {} +feature/*/build.gradle.kts # 8 KMP modules — migrate android {} → androidLibrary {} + (excluding feature/widget/ — Android-only, not affected) +``` + +**Structure Decision**: Existing module structure is preserved. This change only modifies `build.gradle.kts` files and convention plugin helpers. No directory restructuring. + +## Complexity Tracking + +> No constitution violations. No complexity exceptions needed. diff --git a/specs/006-kmp-project-structure/quickstart.md b/specs/006-kmp-project-structure/quickstart.md new file mode 100644 index 000000000..fcd535a1e --- /dev/null +++ b/specs/006-kmp-project-structure/quickstart.md @@ -0,0 +1,189 @@ +# Quickstart: KMP Recommended Project Structure Migration + +## Prerequisites + +- JDK 21 installed +- `ANDROID_HOME` set +- Proto submodule initialized: `git submodule update --init` +- `local.properties` exists: `[ -f local.properties ] || cp secrets.defaults.properties local.properties` +- Clean build baseline: `./gradlew assembleDebug` passes before starting + +## Migration Steps + +### Step 1: Harden convention plugin defaults + +**File**: `build-logic/convention/src/main/kotlin/org/meshtastic/buildlogic/KotlinAndroid.kt` + +In `configureKotlinMultiplatform()`, add `androidResources.enable = false` as default inside the `pluginManager.withPlugin` block: + +```kotlin +pluginManager.withPlugin("com.android.kotlin.multiplatform.library") { + extensions.findByType()?.apply { + compileSdk = configProperties.getProperty("COMPILE_SDK").toInt() + minSdk = configProperties.getProperty("MIN_SDK").toInt() + androidResources.enable = false // ← NEW: Default for all KMP modules + if (namespace == null) { + val pkg = this@configureKotlinMultiplatform.path.removePrefix(":").replace(":", ".") + namespace = "org.meshtastic.$pkg" + } + } +} +``` + +**Verify**: `./gradlew assembleDebug` — should pass (no behavior change yet, modules still override). + +### Step 2: Migrate Tier 1 modules (minimal — 6 modules) + +For each module, change `android {}` to `androidLibrary {}` inside `kotlin {}`, removing properties now handled by convention. + +**Pattern — before**: +```kotlin +kotlin { + jvm() // ← remove if present (convention handles it) + + android { + namespace = "org.meshtastic.core.di" // ← auto-derived, remove + androidResources.enable = false // ← convention default, remove + } + // ... +} +``` + +**Pattern — after**: +```kotlin +kotlin { + // android target configured by convention plugin (namespace auto-derived, resources disabled) + sourceSets { /* ... */ } +} +``` + +**Modules**: `core:di`, `core:nfc`, `core:ui`, `core:navigation`, `feature:messaging`, `feature:settings` + +**Verify after each module**: `./gradlew ::assembleDebug ::allTests` +**Verify after batch**: `./gradlew assembleDebug allTests` + +### Step 3: Migrate Tier 2 modules (withHostTest — 18 modules) + +**Pattern — before**: +```kotlin +kotlin { + jvm() + + android { + namespace = "org.meshtastic.core.data" + androidResources.enable = false + withHostTest { isIncludeAndroidResources = true } + } + // ... +} +``` + +**Pattern — after**: +```kotlin +kotlin { + androidLibrary { + withHostTest { isIncludeAndroidResources = true } + } + // ... +} +``` + +**Special case — `feature:wifi-provision`** (namespace mismatch): +```kotlin +kotlin { + androidLibrary { + namespace = "org.meshtastic.feature.wifiprovision" + withHostTest {} + } + // ... +} +``` + +**Verify after batch**: `./gradlew assembleDebug :desktop:packageUberJarForCurrentOS allTests` + +### Step 4: Migrate Tier 3 modules (special — 3 modules) + +#### `core:proto`: +```kotlin +kotlin { + androidLibrary { + minSdk = 21 // ATAK compatibility override + } + // ... +} +``` + +#### `core:database`: +```kotlin +kotlin { + androidLibrary { + withHostTest { isIncludeAndroidResources = true } + withDeviceTest { instrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } + } + // ... +} +``` + +#### `core:resources`: +```kotlin +kotlin { + androidLibrary { + androidResources { + enable = true // Override convention default + resourcePrefix = "meshtastic_" + } + withHostTest { isIncludeAndroidResources = true } + } + // ... +} +``` + +**Verify**: `./gradlew assembleDebug :desktop:packageUberJarForCurrentOS allTests` + +### Step 5: Full verification + +```bash +# Full Android build +./gradlew assembleDebug + +# Full Desktop build +./gradlew :desktop:packageUberJarForCurrentOS + +# All tests +./gradlew allTests + +# Desktop-only mode (no Android SDK) +DESKTOP_ONLY=true ./gradlew :desktop:packageUberJarForCurrentOS + +# Lint and formatting +./gradlew spotlessApply spotlessCheck detekt + +# Verify no legacy android {} blocks remain in KMP modules +grep -rn "android {" core/*/build.gradle.kts feature/*/build.gradle.kts | grep -v "widget\|api\|barcode\|androidLibrary\|androidResources\|androidMain\|androidHostTest\|androidDeviceTest\|androidRuntimeClasspath" +# Expected: zero matches +``` + +### Step 6: Validate success criteria + +- [ ] SC-001: Zero `android {}` blocks inside `kotlin {}` in KMP modules +- [ ] SC-002: `assembleDebug` and `:desktop:packageUberJarForCurrentOS` pass +- [ ] SC-003: `allTests` passes with zero regressions +- [ ] SC-004: `DESKTOP_ONLY` build succeeds +- [ ] SC-005: Clean `assembleDebug` time within 5% of baseline +- [ ] SC-006: New module can apply `meshtastic.kmp.library` with no manual `android {}` block +- [ ] SC-007: `configureKotlinMultiplatform()` uses only `KotlinMultiplatformAndroidLibraryTarget` API + +## Rollback Plan + +If any step produces build failures that cannot be resolved: + +**Per-module**: `git checkout -- /build.gradle.kts` to revert a single module migration. + +**Per-tier**: +- Tier 1: `git checkout -- core/di/build.gradle.kts core/nfc/build.gradle.kts core/ui/build.gradle.kts core/navigation/build.gradle.kts feature/settings/build.gradle.kts feature/messaging/build.gradle.kts` +- Tier 2: `git checkout -- core/{ble,common,data,domain,model,network,service,takserver,datastore,prefs,repository,testing}/build.gradle.kts feature/{connections,firmware,intro,map,node,wifi-provision}/build.gradle.kts` +- Tier 3: `git checkout -- core/{proto,database,resources}/build.gradle.kts` + +**Full rollback**: `git stash` or `git checkout -- .` to revert all changes. + +Convention plugin change (Step 1) is backward-compatible — existing explicit `androidResources.enable = false` in modules is a no-op override. diff --git a/specs/006-kmp-project-structure/research.md b/specs/006-kmp-project-structure/research.md new file mode 100644 index 000000000..3d29b58ea --- /dev/null +++ b/specs/006-kmp-project-structure/research.md @@ -0,0 +1,166 @@ +# Research: KMP Recommended Project Structure Alignment + +## R1: `android {}` vs `androidLibrary {}` inside `kotlin {}` + +**Decision**: Use `androidLibrary {}` as the canonical DSL accessor for the KMP Android target. + +**Rationale**: The `androidLibrary {}` accessor is the documented API in the [KMP recommended structure guide](https://kotlinlang.org/docs/multiplatform/multiplatform-project-recommended-structure.html) and the [KMP-App-Template](https://github.com/Kotlin/KMP-App-Template). While `android {}` inside `kotlin {}` is a transitional alias that still works (used by kotlinconf-app), `androidLibrary {}` is the forward-looking name that clearly distinguishes between: +- `kotlin { androidLibrary {} }` — KMP module Android target (new plugin) +- `android {}` — top-level Android extension (legacy `com.android.library` or `com.android.application`) + +Using `androidLibrary {}` eliminates ambiguity and signals the project uses the recommended patterns. + +**Alternatives considered**: +- Keep `android {}` inside `kotlin {}` (works but ambiguous, transitional) +- Use programmatic API only in convention plugins (already done for compileSdk/minSdk; per-module overrides still need DSL) + +## R2: What properties belong in `kotlin.androidLibrary {}` vs convention plugin + +**Decision**: Convention plugin (`configureKotlinMultiplatform()`) handles: +- `compileSdk` ✅ (already done) +- `minSdk` ✅ (already done, default from config.properties) +- `namespace` auto-derivation ✅ (already done when null) +- `androidResources.enable = false` as default ← NEW (absorb into convention) + +Module `build.gradle.kts` handles only overrides: +- `namespace` when it differs from auto-derived (e.g., `feature.wifiprovision` vs `feature.wifi-provision`) +- `minSdk` override (only `core:proto` with minSdk 21) +- `androidResources { enable = true; resourcePrefix = "..." }` (only `core:resources`) +- `withHostTest {}` / `withDeviceTest {}` (per-module opt-in) + +**Rationale**: The convention plugin already handles compileSdk/minSdk/namespace via `KotlinMultiplatformAndroidLibraryTarget`. Adding `androidResources.enable = false` as the convention default eliminates the most common per-module boilerplate (23 of 27 modules set this). + +**Alternatives considered**: +- Move all config to convention plugin, including withHostTest (rejected: test opt-in should be explicit per-module) +- Keep all config in module files (rejected: adds repetitive boilerplate across 27 modules) + +## R3: Convention plugin audit — what needs changing + +**Decision**: The `configureKotlinMultiplatform()` function in `KotlinAndroid.kt` is already well-structured. One enhancement needed: + +1. **Add `androidResources.enable = false` as default** in the `pluginManager.withPlugin` block alongside compileSdk/minSdk/namespace. This eliminates the most common boilerplate line across 23 modules. + +The `KmpLibraryConventionPlugin.kt`, `KmpFeatureConventionPlugin.kt`, and `KmpJvmAndroidConventionPlugin.kt` do NOT need changes — they compose correctly and delegate to `configureKotlinMultiplatform()`. + +**Rationale**: The convention plugin chain is already correct: +- `KmpLibraryConventionPlugin` applies `com.android.kotlin.multiplatform.library` (correct plugin) +- `configureKotlinMultiplatform()` uses `KotlinMultiplatformAndroidLibraryTarget` API (correct API) +- `isDesktopOnly` guard is properly implemented +- The only gap is that individual modules repeat `androidResources.enable = false` + +**Alternatives considered**: +- Rewrite convention plugins to use DSL instead of programmatic API (rejected: programmatic API via `KotlinMultiplatformAndroidLibraryTarget` is cleaner in convention plugins and already works) +- Add `withHostTest {}` to convention by default (rejected: not all modules need host tests, and some configure `isIncludeAndroidResources = true`) + +## R4: Module-by-module android {} block classification + +**Decision**: Categorize all 27 modules into migration tiers based on complexity. + +### Tier 1: Simple — namespace + androidResources.enable = false (6 modules) +These modules only set namespace and disable resources. After convention absorbs `androidResources.enable = false`, these only need namespace (or nothing if auto-derived matches). + +| Module | namespace | Auto-derivable? | +|--------|-----------|-----------------| +| `core:di` | `org.meshtastic.core.di` | ✅ Yes | +| `core:nfc` | `org.meshtastic.core.nfc` | ✅ Yes | +| `core:ui` | `org.meshtastic.core.ui` | ✅ Yes | +| `core:navigation` | `org.meshtastic.core.navigation` | ✅ Yes | +| `feature:messaging` | `org.meshtastic.feature.messaging` | ✅ Yes | +| `feature:settings` | `org.meshtastic.feature.settings` | ✅ Yes | + +### Tier 2: Namespace + resources disabled + withHostTest (18 modules) +These add `withHostTest {}` opt-in. The `androidLibrary {}` block will keep withHostTest. + +| Module | withHostTest config | +|--------|-------------------| +| `core:ble` | `{ isIncludeAndroidResources = true }` | +| `core:common` | `{ isIncludeAndroidResources = true }` | +| `core:data` | `{ isIncludeAndroidResources = true }` | +| `core:domain` | `{ isIncludeAndroidResources = true }` | +| `core:model` | `{ isIncludeAndroidResources = true }` | +| `core:network` | `{ isIncludeAndroidResources = true }` | +| `core:service` | `{ isIncludeAndroidResources = true }` | +| `core:takserver` | `{ isIncludeAndroidResources = true }` | +| `feature:connections` | `{ isIncludeAndroidResources = true }` | +| `feature:firmware` | `{ isIncludeAndroidResources = true }` | +| `feature:intro` | `{ isIncludeAndroidResources = true }` | +| `feature:map` | `{ isIncludeAndroidResources = true }` | +| `feature:node` | `{ isIncludeAndroidResources = true }` | +| `core:datastore` | `{}` (empty) | +| `core:prefs` | `{}` (empty) | +| `core:repository` | `{}` (empty) | +| `core:testing` | `{}` (empty) | +| `feature:wifi-provision` | `{}` (empty) | + +### Tier 3: Special cases (3 modules) +| Module | Special config | +|--------|---------------| +| `core:proto` | `minSdk = 21` override (for ATAK compatibility) | +| `core:database` | `namespace` + `withHostTest` + `withDeviceTest { instrumentationRunner }` | +| `core:resources` | `androidResources { enable = true; resourcePrefix = "meshtastic_" }` + `withHostTest` | + +### Not affected (correctly Android-only) +- `core:api` — `meshtastic.android.library`, AIDL, publishing +- `core:barcode` — `meshtastic.android.library`, Android-only +- `feature:widget` — `meshtastic.android.library`, Glance widgets +- `app/` — `com.android.application` +- `desktop/` — JVM only +- `screenshot-tests/` — Android test module + +## R5: DESKTOP_ONLY mode compatibility + +**Decision**: No changes needed to DESKTOP_ONLY mode. The migration is purely a DSL rename. + +**Rationale**: +- `isDesktopOnly` guard in `KmpLibraryConventionPlugin` skips `com.android.kotlin.multiplatform.library` plugin application entirely +- `configureKotlinMultiplatform()` creates inert placeholder `androidMain` source set in desktop-only mode +- The `kotlin { androidLibrary {} }` DSL accessor in module build files is provided by the plugin — when the plugin isn't applied (desktop-only), the accessor doesn't exist +- The existing `android {}` accessor inside `kotlin {}` works the same way — so the rename from `android {}` to `androidLibrary {}` has identical desktop-only behavior + +**Key validation**: After migration, `DESKTOP_ONLY=true ./gradlew :desktop:packageUberJarForCurrentOS` must succeed. + +## R6: `jvm()` declaration in module build files + +**Decision**: Remove redundant `jvm()` from module build files as a cleanup during migration — the convention plugin handles it. Calling `jvm()` twice is a no-op (Kotlin Gradle Plugin is idempotent for target declarations), so removing it is safe. This reduces boilerplate and makes convention ownership clear. + +**Alternatives considered**: Keep `jvm()` in all modules for explicitness (rejected: inconsistent since some modules already omit it, and convention plugins are the source of truth). + +## R7: Namespace auto-derivation coverage + +**Decision**: Rely on convention plugin auto-derivation for most modules; only override where the derived name doesn't match. + +| Module path | Auto-derived namespace | Needed namespace | Match? | +|-------------|----------------------|------------------|--------| +| `:core:ble` | `org.meshtastic.core.ble` | `org.meshtastic.core.ble` | ✅ | +| `:core:common` | `org.meshtastic.core.common` | `org.meshtastic.core.common` | ✅ | +| `:core:data` | `org.meshtastic.core.data` | `org.meshtastic.core.data` | ✅ | +| `:core:database` | `org.meshtastic.core.database` | `org.meshtastic.core.database` | ✅ | +| `:core:datastore` | `org.meshtastic.core.datastore` | `org.meshtastic.core.datastore` | ✅ | +| `:core:di` | `org.meshtastic.core.di` | `org.meshtastic.core.di` | ✅ | +| `:core:domain` | `org.meshtastic.core.domain` | `org.meshtastic.core.domain` | ✅ | +| `:core:model` | `org.meshtastic.core.model` | (none set — auto-derived) | ✅ | +| `:core:navigation` | `org.meshtastic.core.navigation` | `org.meshtastic.core.navigation` | ✅ | +| `:core:network` | `org.meshtastic.core.network` | `org.meshtastic.core.network` | ✅ | +| `:core:nfc` | `org.meshtastic.core.nfc` | `org.meshtastic.core.nfc` | ✅ | +| `:core:prefs` | `org.meshtastic.core.prefs` | `org.meshtastic.core.prefs` | ✅ | +| `:core:proto` | `org.meshtastic.core.proto` | (none set — auto-derived) | ✅ | +| `:core:repository` | `org.meshtastic.core.repository` | (none set — auto-derived) | ✅ | +| `:core:resources` | `org.meshtastic.core.resources` | (none set — auto-derived) | ✅ | +| `:core:service` | `org.meshtastic.core.service` | `org.meshtastic.core.service` | ✅ | +| `:core:takserver` | `org.meshtastic.core.takserver` | `org.meshtastic.core.takserver` | ✅ | +| `:core:testing` | `org.meshtastic.core.testing` | `org.meshtastic.core.testing` | ✅ | +| `:core:ui` | `org.meshtastic.core.ui` | `org.meshtastic.core.ui` | ✅ | +| `:feature:connections` | `org.meshtastic.feature.connections` | `org.meshtastic.feature.connections` | ✅ | +| `:feature:firmware` | `org.meshtastic.feature.firmware` | `org.meshtastic.feature.firmware` | ✅ | +| `:feature:intro` | `org.meshtastic.feature.intro` | `org.meshtastic.feature.intro` | ✅ | +| `:feature:map` | `org.meshtastic.feature.map` | `org.meshtastic.feature.map` | ✅ | +| `:feature:messaging` | `org.meshtastic.feature.messaging` | `org.meshtastic.feature.messaging` | ✅ | +| `:feature:node` | `org.meshtastic.feature.node` | `org.meshtastic.feature.node` | ✅ | +| `:feature:settings` | `org.meshtastic.feature.settings` | `org.meshtastic.feature.settings` | ✅ | +| `:feature:wifi-provision` | `org.meshtastic.feature.wifi.provision` | `org.meshtastic.feature.wifiprovision` | ❌ | + +**Finding**: Only `feature:wifi-provision` has a namespace mismatch — the module path contains a hyphen which auto-derives as `org.meshtastic.feature.wifi.provision` (with dot separator) but the module currently uses `org.meshtastic.feature.wifiprovision` (no dot). This module MUST explicitly set `namespace` in its `androidLibrary {}` block. + +All other modules that currently set `namespace` explicitly match the auto-derived value and can safely rely on the convention plugin's auto-derivation. However, being explicit about namespace provides documentation value and prevents silent changes if the module is moved. + +**Decision**: Remove explicit `namespace` from modules where it matches auto-derivation. Keep it only for `feature:wifi-provision`. This reduces boilerplate and delegates ownership to the convention plugin. diff --git a/specs/006-kmp-project-structure/spec.md b/specs/006-kmp-project-structure/spec.md new file mode 100644 index 000000000..5d30364e9 --- /dev/null +++ b/specs/006-kmp-project-structure/spec.md @@ -0,0 +1,258 @@ +# Feature Specification: KMP Recommended Project Structure Alignment + +**Feature Branch**: `020-kmp-project-structure` +**Created**: 2025-07-15 +**Status**: Draft +**Input**: User description: "Restructure Meshtastic Android project to align with the updated Kotlin Multiplatform recommended project structure" +**Cross-Platform Spec**: N/A — this is a build/infrastructure change with no user-facing behavior changes across platforms + +## Summary + +The Meshtastic Android project should be aligned with the official Kotlin Multiplatform recommended project structure as documented in the [KMP project structure guide](https://kotlinlang.org/docs/multiplatform/multiplatform-project-recommended-structure.html) and the [JetBrains blog post on the new KMP default structure](https://blog.jetbrains.com/kotlin/2026/05/new-kmp-default-structure/). The project already runs on AGP 9.2.1 and already applies the `com.android.kotlin.multiplatform.library` plugin via convention plugins, but an audit reveals that **all 27 KMP modules still contain legacy `android {}` blocks inside `kotlin {}`** that should be migrated to the recommended `kotlin.androidLibrary {}` top-level DSL. This effort focuses on completing that migration, validating module boundaries, and ensuring convention plugins enforce the canonical patterns — so the project fully conforms to the new structure with clear module responsibilities. + +## Goals + +1. **Migrate all legacy `android {}` blocks** inside `kotlin {}` to the recommended `kotlin.androidLibrary {}` top-level DSL across all 27 KMP modules in `core/` and `feature/`. +2. **Validate and harden convention plugins** so that `KmpLibraryConventionPlugin` and `KmpFeatureConventionPlugin` configure Android targets exclusively through the new plugin's DSL, preventing legacy patterns from being reintroduced. +3. **Confirm entry-point module separation** — `app/` (Android) and `desktop/` (JVM) are already separate entry-point modules with no shared business logic, satisfying the AGP 9 mandatory requirement. +4. **Document the module boundary model** — map the current `core/` (shared logic) and `feature/` (shared UI + logic) organization to the recommended `sharedLogic` / `sharedUI` categories, confirming they already satisfy the recommended split. +5. **Ensure forward compatibility** — verify the project structure is compatible with future KMP toolchain updates and potential new targets (iOS, web) without requiring another structural overhaul. + +## Non-Goals + +- **Introducing iOS, web, or server modules** — while the recommended structure supports these, this spec scopes only the existing Android + Desktop targets. +- **Renaming modules to match the default template names** — the recommended structure uses `shared`, `androidApp`, `desktopApp` as defaults, but the project's existing `core/`, `feature/`, `app/`, `desktop/` naming is equally valid and will not be renamed for cosmetic alignment. +- **Changing application behavior or UI** — this is purely a build infrastructure and module organization change. No user-facing functionality changes. +- **Migrating away from existing technology choices** — Koin, Ktor, Room KMP, Compose Multiplatform, and Navigation 3 remain as-is per the constitution. +- **Migrating `feature:widget` away from `com.android.library`** — this module is genuinely Android-only (Glance app widgets) and correctly uses the Android library plugin, not the KMP library plugin. + +## User Scenarios & Testing *(mandatory)* + +### User Story 1 - Developer Builds Successfully After Restructuring (Priority: P1) + +As a contributor, I want the project to build successfully on both Android and Desktop targets after any structural changes, so that my development workflow is uninterrupted. + +**Why this priority**: A broken build blocks all development. This is the absolute minimum bar for any structural change. + +**Independent Test**: Can be fully tested by running `./gradlew assembleDebug`, `./gradlew :desktop:packageUberJarForCurrentOS`, and `./gradlew allTests` and verifying all pass. + +**Acceptance Scenarios**: + +1. **Given** the restructured project, **When** a developer runs the full Android build (`assembleDebug`), **Then** the build completes with zero errors. +2. **Given** the restructured project, **When** a developer runs the Desktop build (`:desktop:packageUberJarForCurrentOS`), **Then** the build completes with zero errors. +3. **Given** the restructured project, **When** a developer runs all tests (`allTests`), **Then** all existing tests pass with no regressions. +4. **Given** the restructured project with `DESKTOP_ONLY=true`, **When** a developer builds without Android SDK, **Then** the desktop-only build succeeds as before. + +--- + +### User Story 2 - Convention Plugins Reflect Recommended Patterns (Priority: P2) + +As a build maintainer, I want the convention plugins in `build-logic/` to apply the correct KMP plugin configuration patterns recommended by JetBrains, so that adding new modules follows a clear, documented convention. + +**Why this priority**: Convention plugins are the enforcement layer for project structure. If they are correct, individual module configurations stay consistent. + +**Independent Test**: Can be tested by verifying that `KmpLibraryConventionPlugin` applies the `com.android.kotlin.multiplatform.library` plugin and that no KMP library module uses the legacy `com.android.library` plugin. + +**Acceptance Scenarios**: + +1. **Given** the `meshtastic.kmp.library` convention plugin, **When** applied to a KMP module, **Then** it configures the module using `com.android.kotlin.multiplatform.library` (not `com.android.library`). +2. **Given** the `meshtastic.kmp.feature` convention plugin, **When** applied to a feature module, **Then** it inherits the correct KMP library plugin chain without legacy Android library configuration. +3. **Given** a new core module is created, **When** a developer applies `meshtastic.kmp.library`, **Then** the module follows the recommended structure with `kotlin.androidLibrary {}` configuration. + +--- + +### User Story 3 - Module Boundary Clarity for New Contributors (Priority: P3) + +As a new contributor, I want a clear separation between entry-point modules, shared business logic modules, and shared UI modules, so that I know where to add new code based on its purpose. + +**Why this priority**: Clear boundaries reduce onboarding friction and prevent architectural drift over time. + +**Independent Test**: Can be tested by reviewing the module dependency graph and verifying that entry-point modules (`app/`, `desktop/`) do not contain shared logic, and that `core/` modules do not depend on `feature/` modules. + +**Acceptance Scenarios**: + +1. **Given** the module dependency graph, **When** analyzing `app/` dependencies, **Then** `app/` depends on `core/` and `feature/` modules but contains no shared business logic. +2. **Given** the module dependency graph, **When** analyzing `desktop/` dependencies, **Then** `desktop/` depends on `core/` and `feature/` modules but contains no shared business logic. +3. **Given** any `core/` module, **When** examining its dependencies, **Then** it does not depend on any `feature/` module (unidirectional flow preserved). + +--- + +### User Story 4 - Legacy DSL Block Migration (Priority: P1) + +As a build maintainer, I want all 27 KMP modules' legacy `android {}` blocks inside `kotlin {}` migrated to the recommended `kotlin.androidLibrary {}` top-level DSL, so that the build configuration fully uses the new plugin's canonical API. + +**Why this priority**: The project already runs AGP 9.2.1 and applies the `com.android.kotlin.multiplatform.library` plugin, but every KMP module still configures its Android target using the legacy `android {}` block inside `kotlin {}` (for namespace, resource settings, etc.). This is the primary gap between the current state and full alignment with the recommended structure. It ties with P1 because the build already works — this is about eliminating technical debt before it becomes a blocker. + +**Independent Test**: Can be tested by searching all `core/` and `feature/` KMP module `build.gradle.kts` files for `android {` blocks inside `kotlin {}` — zero should remain after migration. All configuration should appear in `kotlin.androidLibrary {}` top-level blocks or be handled by convention plugins. + +**Acceptance Scenarios**: + +1. **Given** any KMP library module in `core/` or `feature/`, **When** examining its `build.gradle.kts`, **Then** it contains no `android {}` block inside `kotlin {}` — Android configuration uses the `kotlin.androidLibrary {}` top-level DSL or is delegated to convention plugins. +2. **Given** the `configureKotlinMultiplatform()` helper in build-logic, **When** it configures Android targets, **Then** it uses `KotlinMultiplatformAndroidLibraryTarget` APIs from the new plugin, not legacy `android {}` extension configuration. +3. **Given** the full project with all 27 modules migrated, **When** building Android and Desktop targets, **Then** all builds succeed with zero errors. + +--- + +### Edge Cases + +- What happens when the `DESKTOP_ONLY` mode is active and no Android SDK is available? The restructured plugins must continue to conditionally skip Android plugin application (as the current `isDesktopOnly` guard already does). +- How does the system handle modules that are genuinely Android-only (e.g., `core:api`, `core:barcode`, `screenshot-tests`)? These modules should continue using `com.android.library` or `com.android.application` as appropriate — the KMP library plugin applies only to multiplatform modules. +- What happens if a module currently uses `com.android.library` but should be KMP? The migration path must be documented and executed per-module, with build verification at each step. + +## Architecture + +### Gap Analysis: Current State vs Recommended Structure + +The audit reveals the project is **substantially aligned** with the recommended KMP structure, with one significant gap remaining: + +``` +AREA STATUS FINDING +==== ====== ======= + +Entry-point separation ✅ DONE app/ (Android) and desktop/ (JVM) are + already separate entry-point modules. + AGP 9 mandatory requirement satisfied. + +KMP library plugin adoption ✅ DONE KmpLibraryConventionPlugin already applies + com.android.kotlin.multiplatform.library + via the android-kotlin-multiplatform-library + catalog alias. No androidTarget {} calls. + +AGP version ✅ DONE Project already runs AGP 9.2.1. + +Legacy android {} blocks in kotlin {} ⚠️ GAP All 27 KMP modules still configure Android + via android {} blocks INSIDE kotlin {} for + namespace, androidResources, withHostTest. + These should migrate to kotlin.androidLibrary {} + top-level DSL blocks. + +Module boundary model ✅ DONE core/ = shared business logic (≈ sharedLogic) + feature/ = shared UI + logic (≈ sharedUI) + Unidirectional: app/desktop → feature → core + +Dependency direction ✅ DONE No reverse dependencies. core/ does not + depend on feature/. Unidirectional flow. + +DESKTOP_ONLY mode ✅ DONE Conditional Android plugin skipping via + isDesktopOnly guard in convention plugins. + +Android-only modules ✅ DONE feature:widget uses com.android.library + correctly. core:api, core:barcode also + Android-only with appropriate plugins. + +Convention plugin architecture ⚠️ GAP configureKotlinMultiplatform() helper + may contain legacy android {} configuration + patterns alongside the new plugin's API. + Needs audit and cleanup. +``` + +### Affected Modules (Legacy `android {}` blocks to migrate) + +**Core modules (19)**: +`core:ble`, `core:common`, `core:data`, `core:database`, `core:datastore`, `core:di`, `core:domain`, `core:model`, `core:navigation`, `core:network`, `core:nfc`, `core:prefs`, `core:proto`, `core:repository`, `core:resources`, `core:service`, `core:takserver`, `core:testing`, `core:ui` + +**Feature modules (8 — excluding widget)**: +`feature:connections`, `feature:firmware`, `feature:intro`, `feature:map`, `feature:messaging`, `feature:node`, `feature:settings`, `feature:wifi-provision` + +**Not affected** (correctly using `com.android.library` or `com.android.application`): +`app/`, `desktop/`, `feature:widget`, `core:api`, `core:barcode`, `screenshot-tests` + +### Mapping to Recommended Structure + +``` +RECOMMENDED STRUCTURE MESHTASTIC EQUIVALENT NOTES +===================== ======================= ===== + +androidApp/ app/ ✅ Same role, different name + - kotlin.android (naming is cosmetic) + + com.android.application + +desktopApp/ desktop/ ✅ Same role, different name + - kotlin.jvm + compose + +shared/ (single shared mod) core/ + feature/ ✅ Already modularized further + OR (27+ KMP modules) than the default; this is the +sharedLogic/ + sharedUI/ core/ ≈ sharedLogic recommended "advanced" pattern + feature/ ≈ sharedUI + +build-logic/ build-logic/ ✅ Project-specific convention + plugins (not prescribed by + JetBrains but aligned) +``` + +### Reference Projects Comparison + +The JetBrains blog cites `kotlinconf-app`, `KMP-App-Template`, and `RSS Reader` as reference implementations. The Meshtastic project is more mature and more modularized than any of these, having already decomposed the monolithic `shared` module into granular `core/` and `feature/` modules. This is the recommended evolution path for larger projects. + +### Key Components + +| Component | Module / File | Purpose | +| -------------------------------- | ---------------------------------------------------------- | ------------------------------------------------------------- | +| KmpLibraryConventionPlugin | `build-logic/convention/.../KmpLibraryConventionPlugin.kt` | Applies KMP + Android library plugins to shared modules | +| KmpFeatureConventionPlugin | `build-logic/convention/.../KmpFeatureConventionPlugin.kt` | Composite plugin for feature modules (KMP + Compose + Koin) | +| KmpJvmAndroidConventionPlugin | `build-logic/convention/.../KmpJvmAndroidConventionPlugin.kt` | Configures jvmAndroidMain shared source set | +| AndroidLibraryConventionPlugin | `build-logic/convention/.../AndroidLibraryConventionPlugin.kt` | Legacy Android library plugin (for Android-only modules) | +| configureKotlinMultiplatform() | `build-logic/convention/.../KotlinAndroid.kt` | Shared Kotlin/Android configuration helper | +| settings.gradle.kts | Root `settings.gradle.kts` | Module registration and plugin management | + +## Requirements *(mandatory)* + +### Functional Requirements + +- **FR-001**: All 27 KMP library modules (`core/*` except `core:api` and `core:barcode`, plus `feature/*` except `feature:widget`) MUST have their `android {}` blocks inside `kotlin {}` migrated to `kotlin.androidLibrary {}` top-level DSL blocks. +- **FR-002**: Entry-point modules (`app/`, `desktop/`) MUST remain as standalone application modules that depend on shared modules but contain no reusable business logic. This is already satisfied and MUST NOT regress. +- **FR-003**: The `KmpLibraryConventionPlugin` MUST configure Android target properties (namespace, compileSdk, minSdk, resource settings) exclusively through the `com.android.kotlin.multiplatform.library` plugin's API (`KotlinMultiplatformAndroidLibraryTarget`), not through legacy `android {}` extension blocks. +- **FR-004**: Android-only modules (`core:api`, `core:barcode`, `feature:widget`, `screenshot-tests`) MUST continue using `com.android.library` or `com.android.application` as they are not multiplatform modules. +- **FR-005**: The `DESKTOP_ONLY` build mode MUST continue functioning — when active, Android plugin application MUST be skipped for KMP modules (existing `isDesktopOnly` guard preserved). +- **FR-006**: Module dependency direction MUST remain unidirectional: `app/desktop → feature → core → build-logic`. No reverse dependencies. +- **FR-007**: The `configureKotlinMultiplatform()` helper function MUST be audited and updated to remove any residual legacy configuration that duplicates or conflicts with the new plugin's target configuration. +- **FR-008**: Convention plugins MUST prevent future modules from using the legacy `android {}` pattern — applying `meshtastic.kmp.library` MUST automatically configure the Android target through the new plugin's DSL with no manual `android {}` block needed in the module's `build.gradle.kts`. + +### Non-Functional Requirements + +- **NFR-001**: The restructuring MUST NOT increase full-project build time by more than 5%. +- **NFR-002**: Gradle configuration cache, isolated projects, and parallel execution (`gradle.properties` settings) MUST remain functional after changes. +- **NFR-003**: All changes MUST be backward-compatible within a single migration PR — no intermediate broken states on the main branch. +- **NFR-004**: The migration MUST be documentable as a step-by-step checklist that other Meshtastic platform repositories can reference. + +## Source-Set Impact + +| Source Set | Impact | Justification | +| -------------- | --------------------------------------------------- | ---------------------------------------------------------------------------------------- | +| `commonMain` | No changes to source files | Business logic and UI remain in commonMain; only build configuration changes | +| `androidMain` | No changes to source files | Platform-specific code unchanged; plugin configuration changes only | +| `jvmMain` | No changes to source files | Desktop-specific code unchanged; plugin configuration changes only | +| Build files | Modified `build.gradle.kts` across 28 files (27 modules + 1 convention plugin) | Plugin IDs and configuration blocks updated to match recommended patterns | +| Convention plugins | Modified convention plugin Kotlin files | Updated to enforce recommended plugin application and configuration patterns | + +## Privacy Assessment + +- [x] No PII, location data, or cryptographic keys logged or exposed +- [x] No new network calls that transmit user data +- [x] Proto submodule (`core/proto`) not modified (read-only upstream) + +This feature is purely a build infrastructure change with no runtime behavior changes. + +## Success Criteria *(mandatory)* + +### Measurable Outcomes + +- **SC-001**: All 27 KMP library modules have zero `android {}` blocks inside `kotlin {}` — all Android configuration uses `kotlin.androidLibrary {}` top-level DSL or is handled by convention plugins. +- **SC-002**: Full project builds succeed on both Android (`assembleDebug`) and Desktop (`:desktop:packageUberJarForCurrentOS`) with zero new errors after migration. +- **SC-003**: All existing tests pass (`allTests`) with zero regressions after migration. +- **SC-004**: The `DESKTOP_ONLY` build mode continues to function correctly, building without Android SDK. +- **SC-005**: Build time for a clean `assembleDebug` does not increase by more than 5% compared to the pre-migration baseline. +- **SC-006**: A new contributor can add a new KMP module by applying one convention plugin (`meshtastic.kmp.library`) and the module is correctly configured for both Android and Desktop targets with no manual `android {}` block needed. +- **SC-007**: The `configureKotlinMultiplatform()` helper contains zero references to legacy `android {}` extension configuration — all Android target configuration goes through the new plugin's API. + +## Assumptions + +- All business logic and UI composables reside in `commonMain` source set (per Constitution §I, §III). +- The project already runs AGP 9.2.1 and applies `com.android.kotlin.multiplatform.library` in `KmpLibraryConventionPlugin` — the plugin adoption is complete; only the DSL migration from `android {}` to `kotlin.androidLibrary {}` remains. +- The `configureKotlinMultiplatform()` helper already uses `KotlinMultiplatformAndroidLibraryTarget` for compileSdk/minSdk configuration — any remaining legacy `android {}` blocks are in individual module `build.gradle.kts` files, not solely in convention plugins. +- No module uses the deprecated `androidTarget {}` call — this was verified by audit (zero matches found). +- The typical `android {}` block content in KMP modules is limited to `namespace` and `androidResources.enable = false` and occasionally `withHostTest {}` — migration should be mechanical. +- Android-only modules (`core:api`, `core:barcode`, `feature:widget`) are not candidates for the KMP library plugin migration — they correctly remain on `com.android.library`. +- The Gradle version catalog (`libs.versions.toml`) already declares the `android-kotlin-multiplatform-library` plugin alias pointing to AGP 9.2.1. +- The `jvmAndroidMain` shared source set pattern (used by some modules via `meshtastic.kmp.jvm.android`) is compatible with the new plugin and does not conflict with the `kotlin.androidLibrary {}` DSL. +- The recommended structure's module naming (`shared`, `androidApp`, `desktopApp`) is a default convention, not a requirement — the project's existing `core/`, `feature/`, `app/`, `desktop/` naming is equally valid per the JetBrains documentation. diff --git a/specs/006-kmp-project-structure/tasks.md b/specs/006-kmp-project-structure/tasks.md new file mode 100644 index 000000000..b9cbdc798 --- /dev/null +++ b/specs/006-kmp-project-structure/tasks.md @@ -0,0 +1,253 @@ +# Tasks: KMP Recommended Project Structure Alignment + +**Input**: Design documents from `/specs/006-kmp-project-structure/` +**Prerequisites**: plan.md (required), spec.md (required for user stories), research.md, data-model.md, quickstart.md + +**Tests**: No new automated tests are required by this specification. Validation is via existing build and test commands. + +**Verification**: Every phase includes constitution-required validation tasks for formatting, static analysis, and the relevant compile/test commands. + +**Organization**: Tasks are grouped by user story to enable independent implementation and testing. US4 (Legacy DSL Block Migration) is the primary implementation work, subdivided by migration tier. + +## Format: `[ID] [P?] [Story] Description` + +- **[P]**: Can run in parallel (different files, no dependencies) +- **[Story]**: Which user story this task belongs to (e.g., US1, US2, US3, US4) +- Include exact file paths in descriptions + +## Phase 1: Setup (Baseline & Prerequisites) + +**Purpose**: Establish a clean build baseline and verify the starting state before any changes + +- [ ] T001 Verify clean build baseline by running `./gradlew assembleDebug :desktop:packageUberJarForCurrentOS allTests` and record clean `assembleDebug` wall-clock time (3 consecutive runs after `./gradlew clean`, median value) to `specs/006-kmp-project-structure/baseline-timing.txt` for NFR-001 comparison +- [ ] T002 Verify `DESKTOP_ONLY=true ./gradlew :desktop:packageUberJarForCurrentOS` passes before migration +- [x] T003 Run `grep -rn "android {" core/*/build.gradle.kts feature/*/build.gradle.kts` to document all 27 legacy `android {}` blocks as the pre-migration inventory + +--- + +## Phase 2: Convention Plugin Hardening (US2 — Blocking Prerequisite) + +**Purpose**: Harden convention plugin defaults so modules can rely on convention for `androidResources.enable = false`. This MUST complete before any module migration. + +**Goal**: Convention plugins reflect recommended patterns — `configureKotlinMultiplatform()` absorbs the `androidResources.enable = false` default so 23 of 27 modules no longer need to set it explicitly. + +**⚠️ CRITICAL**: No module migration (Phase 3–5) can begin until this phase is complete. + +**Independent Test**: `./gradlew assembleDebug` passes — adding the default is backward-compatible since all modules currently override it. + +- [x] T004 [US2] Add `androidResources.enable = false` default to `configureKotlinMultiplatform()` inside the `pluginManager.withPlugin` block in `build-logic/convention/src/main/kotlin/org/meshtastic/buildlogic/KotlinAndroid.kt` (add after `minSdk` assignment, before namespace auto-derivation) +- [x] T005 [US2] Verify convention plugin change builds successfully: `./gradlew assembleDebug :desktop:packageUberJarForCurrentOS allTests` + +**Checkpoint**: Convention plugin hardened — module migration can now begin + +--- + +## Phase 3: Tier 1 Module Migration — Simple Modules (US4, Priority: P1) 🎯 MVP + +**Goal**: Migrate 6 modules where convention handles everything — remove `android {}` block entirely, remove redundant `jvm()` declarations, remove explicit `namespace` (auto-derived), remove `androidResources.enable = false` (convention default). + +**Independent Test**: `./gradlew assembleDebug allTests` passes after all 6 modules migrated. Verify with `grep -rn "android {" core/di/build.gradle.kts core/nfc/build.gradle.kts core/ui/build.gradle.kts core/navigation/build.gradle.kts feature/settings/build.gradle.kts feature/messaging/build.gradle.kts` returning zero matches. + +### Implementation for Tier 1 + +- [x] T006 [P] [US4] Migrate `core/di/build.gradle.kts` — remove `android {}` block (namespace auto-derived, resources disabled by convention), remove redundant `jvm()` if present +- [x] T007 [P] [US4] Migrate `core/nfc/build.gradle.kts` — remove `android {}` block (namespace auto-derived, resources disabled by convention) +- [x] T008 [P] [US4] Migrate `core/ui/build.gradle.kts` — remove `android {}` block (namespace auto-derived, resources disabled by convention), remove redundant `jvm()` if present +- [x] T009 [P] [US4] Migrate `core/navigation/build.gradle.kts` — remove `android {}` block (namespace auto-derived) +- [x] T010 [P] [US4] Migrate `feature/settings/build.gradle.kts` — remove `android {}` block (namespace auto-derived, resources disabled by convention) +- [x] T011 [P] [US4] Migrate `feature/messaging/build.gradle.kts` — remove `android {}` block (namespace auto-derived, resources disabled by convention) +- [x] T012 [US4] Verify Tier 1 batch: `./gradlew assembleDebug allTests` — commit must be independently buildable (NFR-003) + +**Checkpoint**: Tier 1 complete — 6 of 27 modules migrated, build passes + +--- + +## Phase 4: Tier 2 Module Migration — Standard Modules with Host Tests (US4, Priority: P1) + +**Goal**: Migrate 18 modules that opt into `withHostTest {}`. Replace `android {}` with `androidLibrary { withHostTest {} }`, remove redundant `jvm()`, remove explicit `namespace` (auto-derived except `feature:wifi-provision`), remove `androidResources.enable = false` (convention default). + +**Independent Test**: `./gradlew assembleDebug :desktop:packageUberJarForCurrentOS allTests` passes after all 18 modules migrated. + +### Tier 2a: Modules with `withHostTest { isIncludeAndroidResources = true }` (13 modules) + +- [x] T013 [P] [US4] Migrate `core/ble/build.gradle.kts` — replace `android {}` with `androidLibrary { withHostTest { isIncludeAndroidResources = true } }`, remove redundant `jvm()`, remove explicit namespace, remove `androidResources.enable = false` +- [x] T014 [P] [US4] Migrate `core/common/build.gradle.kts` — replace `android {}` with `androidLibrary { withHostTest { isIncludeAndroidResources = true } }`, remove redundant `jvm()`, remove explicit namespace, remove `androidResources.enable = false` +- [x] T015 [P] [US4] Migrate `core/data/build.gradle.kts` — replace `android {}` with `androidLibrary { withHostTest { isIncludeAndroidResources = true } }`, remove redundant `jvm()`, remove explicit namespace, remove `androidResources.enable = false` +- [x] T016 [P] [US4] Migrate `core/domain/build.gradle.kts` — replace `android {}` with `androidLibrary { withHostTest { isIncludeAndroidResources = true } }`, remove redundant `jvm()`, remove explicit namespace, remove `androidResources.enable = false` +- [x] T017 [P] [US4] Migrate `core/model/build.gradle.kts` — replace `android {}` with `androidLibrary { withHostTest { isIncludeAndroidResources = true } }`, remove redundant `jvm()`, remove `androidResources.enable = false` +- [x] T018 [P] [US4] Migrate `core/network/build.gradle.kts` — replace `android {}` with `androidLibrary { withHostTest { isIncludeAndroidResources = true } }`, remove redundant `jvm()`, remove explicit namespace, remove `androidResources.enable = false` +- [x] T019 [P] [US4] Migrate `core/service/build.gradle.kts` — replace `android {}` with `androidLibrary { withHostTest { isIncludeAndroidResources = true } }`, remove explicit namespace, remove `androidResources.enable = false` +- [x] T020 [P] [US4] Migrate `core/takserver/build.gradle.kts` — replace `android {}` with `androidLibrary { withHostTest { isIncludeAndroidResources = true } }`, remove redundant `jvm()`, remove explicit namespace, remove `androidResources.enable = false` +- [x] T021 [P] [US4] Migrate `feature/connections/build.gradle.kts` — replace `android {}` with `androidLibrary { withHostTest { isIncludeAndroidResources = true } }`, remove explicit namespace, remove `androidResources.enable = false` +- [x] T022 [P] [US4] Migrate `feature/firmware/build.gradle.kts` — replace `android {}` with `androidLibrary { withHostTest { isIncludeAndroidResources = true } }`, remove explicit namespace, remove `androidResources.enable = false` +- [x] T023 [P] [US4] Migrate `feature/intro/build.gradle.kts` — replace `android {}` with `androidLibrary { withHostTest { isIncludeAndroidResources = true } }`, remove explicit namespace, remove `androidResources.enable = false` +- [x] T024 [P] [US4] Migrate `feature/map/build.gradle.kts` — replace `android {}` with `androidLibrary { withHostTest { isIncludeAndroidResources = true } }`, remove redundant `jvm()`, remove explicit namespace, remove `androidResources.enable = false` +- [x] T025 [P] [US4] Migrate `feature/node/build.gradle.kts` — replace `android {}` with `androidLibrary { withHostTest { isIncludeAndroidResources = true } }`, remove explicit namespace, remove `androidResources.enable = false` + +### Tier 2b: Modules with empty `withHostTest {}` (4 modules) + +- [x] T026 [P] [US4] Migrate `core/datastore/build.gradle.kts` — replace `android {}` with `androidLibrary { withHostTest {} }`, remove redundant `jvm()`, remove explicit namespace, remove `androidResources.enable = false` +- [x] T027 [P] [US4] Migrate `core/prefs/build.gradle.kts` — replace `android {}` with `androidLibrary { withHostTest {} }`, remove explicit namespace, remove `androidResources.enable = false` +- [x] T028 [P] [US4] Migrate `core/repository/build.gradle.kts` — replace `android {}` with `androidLibrary { withHostTest {} }`, remove explicit namespace, remove `androidResources.enable = false` +- [x] T029 [P] [US4] Migrate `core/testing/build.gradle.kts` — replace `android {}` with `androidLibrary { withHostTest {} }`, remove explicit namespace, remove `androidResources.enable = false` + +### Tier 2c: Namespace override required (1 module) + +- [x] T030 [P] [US4] Migrate `feature/wifi-provision/build.gradle.kts` — replace `android {}` with `androidLibrary { namespace = "org.meshtastic.feature.wifiprovision"; withHostTest {} }`, remove redundant `jvm()`, remove `androidResources.enable = false` (namespace MUST be explicit — auto-derived `feature.wifi.provision` differs from required `feature.wifiprovision`) + +### Tier 2 Verification + +- [x] T031 [US4] Verify Tier 2 batch: `./gradlew assembleDebug :desktop:packageUberJarForCurrentOS allTests` and `DESKTOP_ONLY=true ./gradlew :desktop:packageUberJarForCurrentOS` — commit must be independently buildable (NFR-003) + +**Checkpoint**: Tiers 1 + 2 complete — 24 of 27 modules migrated, build passes + +--- + +## Phase 5: Tier 3 Module Migration — Special Modules (US4, Priority: P1) + +**Goal**: Migrate 3 modules with custom configuration (minSdk override, device tests, resource prefix). + +**Independent Test**: `./gradlew assembleDebug :desktop:packageUberJarForCurrentOS allTests` passes. All special configurations preserved. + +### Implementation for Tier 3 + +- [x] T032 [P] [US4] Migrate `core/proto/build.gradle.kts` — replace `android {}` with `androidLibrary { minSdk = 21 }` (ATAK compatibility override), remove `androidResources.enable = false` +- [x] T033 [P] [US4] Migrate `core/database/build.gradle.kts` — replace `android {}` with `androidLibrary { withHostTest { isIncludeAndroidResources = true }; withDeviceTest { instrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } }`, remove explicit namespace, remove `androidResources.enable = false` +- [x] T034 [P] [US4] Migrate `core/resources/build.gradle.kts` — replace `android {}` with `androidLibrary { androidResources { enable = true; resourcePrefix = "meshtastic_" }; withHostTest { isIncludeAndroidResources = true } }`, remove redundant `jvm()` (resources MUST override convention default to `enable = true`) +- [x] T035 [US4] Verify Tier 3 batch: `./gradlew assembleDebug :desktop:packageUberJarForCurrentOS allTests` — commit must be independently buildable (NFR-003) + +**Checkpoint**: All 27 KMP modules migrated — zero legacy `android {}` blocks remain + +--- + +## Phase 6: Full Verification & Build Validation (US1, Priority: P1) + +**Goal**: Developer builds successfully after restructuring — full verification across all build modes and configurations. + +**Independent Test**: All 4 acceptance scenarios from US1 pass. + +- [ ] T036 [US1] Run full Android build: `./gradlew assembleDebug` — verify zero errors +- [ ] T037 [US1] Run full Desktop build: `./gradlew :desktop:packageUberJarForCurrentOS` — verify zero errors +- [ ] T038 [US1] Run all tests: `./gradlew allTests` — verify zero regressions +- [ ] T039 [US1] Run DESKTOP_ONLY mode: `DESKTOP_ONLY=true ./gradlew :desktop:packageUberJarForCurrentOS` — verify succeeds without Android SDK +- [ ] T040 [US1] Compare clean `assembleDebug` time against baseline from T001 (3 consecutive runs after `./gradlew clean`, median value, same machine) — verify <5% increase (NFR-001) + +**Checkpoint**: US1 complete — all build modes verified + +--- + +## Phase 7: Polish & Cross-Cutting Concerns + +**Purpose**: Final validation, cleanup, and constitution compliance + +- [x] T041 [P] Verify no legacy `android {}` blocks remain: `grep -rn "android {" core/*/build.gradle.kts feature/*/build.gradle.kts | grep -v "widget\|api\|barcode\|androidLibrary\|androidResources\|androidMain\|androidHostTest\|androidDeviceTest\|androidRuntimeClasspath"` — must return zero matches (SC-001) +- [x] T042 [P] Verify no redundant `jvm()` calls remain in migrated modules: `grep -n "jvm()" core/*/build.gradle.kts feature/*/build.gradle.kts | grep -v "widget\|api\|barcode"` — must return zero matches +- [x] T043 [P] Verify `configureKotlinMultiplatform()` in `build-logic/convention/src/main/kotlin/org/meshtastic/buildlogic/KotlinAndroid.kt` uses only `KotlinMultiplatformAndroidLibraryTarget` API — no legacy `android {}` extension configuration (SC-007) +- [x] T044 [P] [US3] Verify module dependency direction is preserved: no `core/` module depends on `feature/` modules (FR-006) +- [x] T045 [P] Run constitution-required verification: `./gradlew spotlessApply spotlessCheck detekt` +- [x] T046 [P] Verify Gradle configuration cache, isolated projects, and parallel execution remain functional (NFR-002): `./gradlew assembleDebug --configuration-cache` +- [ ] T047 Validate quickstart.md in `specs/006-kmp-project-structure/quickstart.md` matches final implementation — update if migration steps differ from what was executed. Ensure guide is generic enough for other Meshtastic platform repos to reference (NFR-004) +- [x] T048 [US2] Add FR-008 enforcement: add a CI-time grep check in Phase 7 verification or a Gradle `afterEvaluate` assertion in `configureKotlinMultiplatform()` that fails the build if any KMP module contains a legacy `android {}` block inside `kotlin {}` — prevents future regressions (FR-008) +- [ ] T049 [P] Verify SC-006: create a temporary scratch module applying `meshtastic.kmp.library`, confirm it configures correctly for Android + Desktop with no manual `android {}` block, then remove it + +--- + +## Dependencies & Execution Order + +### Phase Dependencies + +- **Setup (Phase 1)**: No dependencies — can start immediately +- **Convention Plugin Hardening (Phase 2)**: Depends on Phase 1 — BLOCKS all module migrations +- **Tier 1 Migration (Phase 3)**: Depends on Phase 2 completion +- **Tier 2 Migration (Phase 4)**: Depends on Phase 2 completion (can run in parallel with Phase 3) +- **Tier 3 Migration (Phase 5)**: Depends on Phase 2 completion (can run in parallel with Phases 3–4) +- **Full Verification (Phase 6)**: Depends on Phases 3, 4, and 5 completion +- **Polish (Phase 7)**: Depends on Phase 6 completion + +### User Story Dependencies + +- **US2 (Convention Plugins)**: Phase 2 — Must complete first; blocking prerequisite +- **US4 (Legacy DSL Migration)**: Phases 3, 4, 5 — Primary implementation; depends on US2 +- **US1 (Build Verification)**: Phase 6 — Validation of US4 work; depends on all tiers complete +- **US3 (Module Boundary Clarity)**: Verified in Phase 7 (T044) — no implementation needed, existing structure already satisfies + +### Within Each Tier + +- All module migrations within a tier marked [P] can run in parallel (different files, no dependencies) +- Tier verification task must run after all module tasks in that tier complete +- Tiers 1, 2, and 3 can themselves run in parallel after Phase 2 completes + +### Parallel Opportunities + +- **Phase 2**: Sequential (single file change + verification) +- **Phase 3**: T006–T011 all parallel (6 different `build.gradle.kts` files) +- **Phase 4**: T013–T030 all parallel (18 different `build.gradle.kts` files) +- **Phase 5**: T032–T034 all parallel (3 different `build.gradle.kts` files) +- **Phase 7**: T041–T046 all parallel (independent verification commands) +- **Cross-tier**: Phases 3, 4, 5 can all run in parallel after Phase 2 + +--- + +## Parallel Example: Tier 1 Migration + +```text +# All 6 Tier 1 modules can be migrated simultaneously: +T006: core/di/build.gradle.kts +T007: core/nfc/build.gradle.kts +T008: core/ui/build.gradle.kts +T009: core/navigation/build.gradle.kts +T010: feature/settings/build.gradle.kts +T011: feature/messaging/build.gradle.kts + +# Then verify the batch: +T012: ./gradlew assembleDebug allTests +``` + +## Parallel Example: Full Tier Parallelism + +```text +# After Phase 2 (convention plugin hardening), all three tiers can start simultaneously: +Tier 1 (T006–T012): 6 simple modules — remove android {} entirely +Tier 2 (T013–T031): 18 standard modules — replace with androidLibrary { withHostTest {} } +Tier 3 (T032–T035): 3 special modules — custom config (minSdk, device tests, resources) + +# Maximum parallelism: 27 module files can be edited simultaneously +``` + +--- + +## Implementation Strategy + +### MVP First (Tier 1 Only) + +1. Complete Phase 1: Setup (baseline) +2. Complete Phase 2: Convention plugin hardening (T004–T005) +3. Complete Phase 3: Tier 1 — 6 simple modules (T006–T012) +4. **STOP and VALIDATE**: Build passes, 6 modules proven +5. This alone demonstrates the migration pattern works + +### Incremental Delivery + +1. Setup + Convention Plugin Hardening → Foundation ready +2. Tier 1 (6 modules) → Build verified → Pattern proven (MVP!) +3. Tier 2 (18 modules) → Build verified → Bulk migration complete +4. Tier 3 (3 modules) → Build verified → All 27 modules done +5. Full verification + polish → Ready for PR + +### Key Risk Mitigation + +- Each tier is independently verifiable — if Tier 2 breaks, Tier 1 is still valid +- Convention plugin change (T004) is backward-compatible — existing explicit overrides in modules are no-ops +- Individual module migrations can be reverted independently (`git checkout -- /build.gradle.kts`) +- `feature:wifi-provision` is the only namespace edge case — flagged explicitly in T030 + +--- + +## Notes + +- [P] tasks = different files, no dependencies on each other +- [US4] is the primary user story — all module migration tasks belong to it +- No source code files are modified — only `build.gradle.kts` files and one convention plugin `.kt` file +- The spec lists 28 modules but `core:model` was counted in both research.md Tier 1 and data-model.md Tier 2 — data-model.md (Tier 2 with `withHostTest`) is authoritative, yielding 27 total KMP modules +- `feature:widget`, `core:api`, `core:barcode` are Android-only and NOT affected by this migration +- Commit after each tier verification for clean rollback points From 1dd47bc09032fe0972af7eed6a7554e61be7a02b Mon Sep 17 00:00:00 2001 From: James Rich <2199651+jamesarich@users.noreply.github.com> Date: Mon, 18 May 2026 07:52:17 -0500 Subject: [PATCH 25/78] fix(settings): add input validation for BLE PIN, LoRa modem, and ambient lighting (#5477) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../AmbientLightingConfigItemList.kt | 94 +++++++++++++------ .../component/BluetoothConfigItemList.kt | 49 ++++++++-- .../radio/component/LoRaConfigItemList.kt | 74 ++++++++++----- 3 files changed, 159 insertions(+), 58 deletions(-) diff --git a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/AmbientLightingConfigItemList.kt b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/AmbientLightingConfigItemList.kt index 3099e9e8a..a751e5fc8 100644 --- a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/AmbientLightingConfigItemList.kt +++ b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/AmbientLightingConfigItemList.kt @@ -21,6 +21,7 @@ import androidx.compose.material3.CardDefaults import androidx.compose.material3.HorizontalDivider import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue +import androidx.compose.ui.focus.FocusManager import androidx.compose.ui.platform.LocalFocusManager import androidx.lifecycle.compose.collectAsStateWithLifecycle import org.jetbrains.compose.resources.stringResource @@ -38,6 +39,9 @@ import org.meshtastic.core.ui.component.TitledCard import org.meshtastic.feature.settings.radio.RadioConfigViewModel import org.meshtastic.proto.ModuleConfig +private const val MAX_LED_CURRENT = 31 +private const val MAX_RGB_VALUE = 255 + @Composable fun AmbientLightingConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit) { val state by viewModel.radioConfigState.collectAsStateWithLifecycle() @@ -67,36 +71,72 @@ fun AmbientLightingConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> U containerColor = CardDefaults.cardColors().containerColor, ) HorizontalDivider() - EditTextPreference( - title = stringResource(Res.string.current), - value = formState.value.current, + LedColorFields( + config = formState.value, enabled = state.connected, - keyboardActions = KeyboardActions(onDone = { focusManager.clearFocus() }), - onValueChanged = { formState.value = formState.value.copy(current = it) }, - ) - EditTextPreference( - title = stringResource(Res.string.red), - value = formState.value.red, - enabled = state.connected, - keyboardActions = KeyboardActions(onDone = { focusManager.clearFocus() }), - onValueChanged = { formState.value = formState.value.copy(red = it) }, - ) - EditTextPreference( - title = stringResource(Res.string.green), - value = formState.value.green, - enabled = state.connected, - keyboardActions = KeyboardActions(onDone = { focusManager.clearFocus() }), - onValueChanged = { formState.value = formState.value.copy(green = it) }, - ) - - EditTextPreference( - title = stringResource(Res.string.blue), - value = formState.value.blue, - enabled = state.connected, - keyboardActions = KeyboardActions(onDone = { focusManager.clearFocus() }), - onValueChanged = { formState.value = formState.value.copy(blue = it) }, + focusManager = focusManager, + onConfigChange = { formState.value = it }, ) } } } } + +@Composable +private fun LedColorFields( + config: ModuleConfig.AmbientLightingConfig, + enabled: Boolean, + focusManager: FocusManager, + onConfigChange: (ModuleConfig.AmbientLightingConfig) -> Unit, +) { + androidx.compose.foundation.layout.Column { + EditTextPreference( + title = stringResource(Res.string.current), + value = config.current, + enabled = enabled, + isError = config.current !in 0..MAX_LED_CURRENT, + keyboardActions = KeyboardActions(onDone = { focusManager.clearFocus() }), + onValueChanged = { + if (it in 0..MAX_LED_CURRENT) { + onConfigChange(config.copy(current = it)) + } + }, + ) + EditTextPreference( + title = stringResource(Res.string.red), + value = config.red, + enabled = enabled, + isError = config.red !in 0..MAX_RGB_VALUE, + keyboardActions = KeyboardActions(onDone = { focusManager.clearFocus() }), + onValueChanged = { + if (it in 0..MAX_RGB_VALUE) { + onConfigChange(config.copy(red = it)) + } + }, + ) + EditTextPreference( + title = stringResource(Res.string.green), + value = config.green, + enabled = enabled, + isError = config.green !in 0..MAX_RGB_VALUE, + keyboardActions = KeyboardActions(onDone = { focusManager.clearFocus() }), + onValueChanged = { + if (it in 0..MAX_RGB_VALUE) { + onConfigChange(config.copy(green = it)) + } + }, + ) + EditTextPreference( + title = stringResource(Res.string.blue), + value = config.blue, + enabled = enabled, + isError = config.blue !in 0..MAX_RGB_VALUE, + keyboardActions = KeyboardActions(onDone = { focusManager.clearFocus() }), + onValueChanged = { + if (it in 0..MAX_RGB_VALUE) { + onConfigChange(config.copy(blue = it)) + } + }, + ) + } +} diff --git a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/BluetoothConfigItemList.kt b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/BluetoothConfigItemList.kt index 08d27bbef..fd83155f6 100644 --- a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/BluetoothConfigItemList.kt +++ b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/BluetoothConfigItemList.kt @@ -17,11 +17,17 @@ package org.meshtastic.feature.settings.radio.component import androidx.compose.foundation.text.KeyboardActions +import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material3.CardDefaults import androidx.compose.material3.HorizontalDivider import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.platform.LocalFocusManager +import androidx.compose.ui.text.input.ImeAction +import androidx.compose.ui.text.input.KeyboardType import androidx.lifecycle.compose.collectAsStateWithLifecycle import org.jetbrains.compose.resources.stringResource import org.meshtastic.core.resources.Res @@ -37,6 +43,8 @@ import org.meshtastic.core.ui.component.TitledCard import org.meshtastic.feature.settings.radio.RadioConfigViewModel import org.meshtastic.proto.Config +private const val PIN_LENGTH = 6 + @Composable fun BluetoothConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit) { val state by viewModel.radioConfigState.collectAsStateWithLifecycle() @@ -79,18 +87,41 @@ fun BluetoothConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit) { onItemSelected = { formState.value = formState.value.copy(mode = it) }, ) HorizontalDivider() - EditTextPreference( - title = stringResource(Res.string.fixed_pin), - value = formState.value.fixed_pin, + FixedPinPreference( + pinValue = formState.value.fixed_pin, enabled = state.connected, - keyboardActions = KeyboardActions(onDone = { focusManager.clearFocus() }), - onValueChanged = { - if (it.toString().length == 6) { // ensure 6 digits - formState.value = formState.value.copy(fixed_pin = it) - } - }, + focusManager = focusManager, + onPinChange = { formState.value = formState.value.copy(fixed_pin = it) }, ) } } } } + +@Composable +private fun FixedPinPreference( + pinValue: Int, + enabled: Boolean, + focusManager: androidx.compose.ui.focus.FocusManager, + onPinChange: (Int) -> Unit, +) { + var pinState by remember(pinValue) { mutableStateOf(pinValue.toString().padStart(PIN_LENGTH, '0')) } + val pinIsError = pinState.length != PIN_LENGTH || !pinState.all { it.isDigit() } + EditTextPreference( + title = stringResource(Res.string.fixed_pin), + value = pinState, + enabled = enabled, + isError = pinIsError, + keyboardOptions = + KeyboardOptions.Default.copy(keyboardType = KeyboardType.NumberPassword, imeAction = ImeAction.Done), + keyboardActions = KeyboardActions(onDone = { focusManager.clearFocus() }), + onValueChanged = { input -> + if (input.length <= PIN_LENGTH && input.all { it.isDigit() }) { + pinState = input + if (input.length == PIN_LENGTH) { + onPinChange(input.toInt()) + } + } + }, + ) +} diff --git a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/LoRaConfigItemList.kt b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/LoRaConfigItemList.kt index f0dab11e1..ced63fff6 100644 --- a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/LoRaConfigItemList.kt +++ b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/LoRaConfigItemList.kt @@ -64,6 +64,9 @@ import org.meshtastic.feature.settings.radio.RadioConfigViewModel import org.meshtastic.feature.settings.util.hopLimits import org.meshtastic.proto.Config +private val SPREAD_FACTOR_RANGE = 7..12 +private val CODING_RATE_RANGE = 5..8 + @Composable fun LoRaConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit) { val state by viewModel.radioConfigState.collectAsStateWithLifecycle() @@ -115,28 +118,11 @@ fun LoRaConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit) { onItemSelected = { formState.value = formState.value.copy(modem_preset = it) }, ) } else { - EditTextPreference( - title = stringResource(Res.string.bandwidth), - value = formState.value.bandwidth, - enabled = state.connected && !formState.value.use_preset, - keyboardActions = KeyboardActions(onDone = { focusManager.clearFocus() }), - onValueChanged = { formState.value = formState.value.copy(bandwidth = it) }, - ) - HorizontalDivider() - EditTextPreference( - title = stringResource(Res.string.spread_factor), - value = formState.value.spread_factor, - enabled = state.connected && !formState.value.use_preset, - keyboardActions = KeyboardActions(onDone = { focusManager.clearFocus() }), - onValueChanged = { formState.value = formState.value.copy(spread_factor = it) }, - ) - HorizontalDivider() - EditTextPreference( - title = stringResource(Res.string.coding_rate), - value = formState.value.coding_rate, - enabled = state.connected && !formState.value.use_preset, - keyboardActions = KeyboardActions(onDone = { focusManager.clearFocus() }), - onValueChanged = { formState.value = formState.value.copy(coding_rate = it) }, + ManualModemSettings( + config = formState.value, + enabled = state.connected, + focusManager = focusManager, + onConfigChange = { formState.value = it }, ) } } @@ -250,3 +236,47 @@ fun LoRaConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit) { } } } + +@Composable +private fun ManualModemSettings( + config: Config.LoRaConfig, + enabled: Boolean, + focusManager: androidx.compose.ui.focus.FocusManager, + onConfigChange: (Config.LoRaConfig) -> Unit, +) { + androidx.compose.foundation.layout.Column { + EditTextPreference( + title = stringResource(Res.string.bandwidth), + value = config.bandwidth, + enabled = enabled, + keyboardActions = KeyboardActions(onDone = { focusManager.clearFocus() }), + onValueChanged = { onConfigChange(config.copy(bandwidth = it)) }, + ) + HorizontalDivider() + EditTextPreference( + title = stringResource(Res.string.spread_factor), + value = config.spread_factor, + enabled = enabled, + isError = config.spread_factor !in SPREAD_FACTOR_RANGE, + keyboardActions = KeyboardActions(onDone = { focusManager.clearFocus() }), + onValueChanged = { + if (it in SPREAD_FACTOR_RANGE) { + onConfigChange(config.copy(spread_factor = it)) + } + }, + ) + HorizontalDivider() + EditTextPreference( + title = stringResource(Res.string.coding_rate), + value = config.coding_rate, + enabled = enabled, + isError = config.coding_rate !in CODING_RATE_RANGE, + keyboardActions = KeyboardActions(onDone = { focusManager.clearFocus() }), + onValueChanged = { + if (it in CODING_RATE_RANGE) { + onConfigChange(config.copy(coding_rate = it)) + } + }, + ) + } +} From f6587a12364cc490b5872ed7bc77cfeed9e414a6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 18 May 2026 10:19:16 -0500 Subject: [PATCH 26/78] chore(deps): update markdownrenderer to v0.41.0 (#5471) --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 061b7e610..5241cce5c 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -76,7 +76,7 @@ dokka = "2.2.0" devtools-ksp = "2.3.8" firebase-crashlytics-gradle = "3.0.7" google-services-gradle = "4.4.4" -markdownRenderer = "0.40.2" +markdownRenderer = "0.41.0" okio = "3.17.0" uri-kmp = "0.0.21" osmdroid-android = "6.1.20" From df4f10c4d64a273688aa9dbe5284ac3737756310 Mon Sep 17 00:00:00 2001 From: James Rich <2199651+jamesarich@users.noreply.github.com> Date: Mon, 18 May 2026 12:29:27 -0500 Subject: [PATCH 27/78] fix(nav): remote admin nodenum + Nav3 consolidation and improvements (#5478) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../main/kotlin/org/meshtastic/app/ui/Main.kt | 2 +- .../app/ui/NavigationAssemblyTest.kt | 2 +- .../core/navigation/DeepLinkRouter.kt | 31 +++-- .../core/navigation/MultiBackstack.kt | 27 ++++- .../org/meshtastic/core/navigation/Routes.kt | 24 +--- .../core/navigation/TopLevelDestination.kt | 8 +- .../core/navigation/DeepLinkRouterTest.kt | 108 ++++++++---------- .../core/navigation/MultiBackstackTest.kt | 22 ++-- .../core/navigation/NavBackStackExtTest.kt | 38 +++--- .../core/navigation/NavigationConfigTest.kt | 10 -- core/ui/detekt-baseline.xml | 2 +- .../core/ui/component/MeshtasticAppShell.kt | 2 +- .../core/ui/component/MeshtasticNavDisplay.kt | 62 ++++++---- .../ui/component/MeshtasticNavigationSuite.kt | 5 +- .../DesktopTopLevelDestinationParityTest.kt | 8 +- .../navigation/ConnectionsNavigation.kt | 10 -- feature/messaging/detekt-baseline.xml | 2 +- .../navigation/ContactsNavigation.kt | 4 - .../ui/contact/AdaptiveContactsScreen.kt | 2 +- .../node/navigation/AdaptiveNodeListScreen.kt | 2 +- .../node/navigation/NodesNavigation.kt | 36 ++---- .../settings/navigation/SettingsNavigation.kt | 30 ++--- .../radio/channel/ChannelsNavigation.kt | 8 -- 23 files changed, 196 insertions(+), 249 deletions(-) diff --git a/androidApp/src/main/kotlin/org/meshtastic/app/ui/Main.kt b/androidApp/src/main/kotlin/org/meshtastic/app/ui/Main.kt index 46409b14e..9177c7edb 100644 --- a/androidApp/src/main/kotlin/org/meshtastic/app/ui/Main.kt +++ b/androidApp/src/main/kotlin/org/meshtastic/app/ui/Main.kt @@ -60,7 +60,7 @@ fun MainScreen() { if (viewModel.currentDeviceAddressFlow.value.isNullOrSelectedNone()) { TopLevelDestination.Connections.route } else { - NodesRoute.NodesGraph + NodesRoute.Nodes } val multiBackstack = rememberMultiBackstack(initialTab) val backStack = multiBackstack.activeBackStack diff --git a/androidApp/src/test/kotlin/org/meshtastic/app/ui/NavigationAssemblyTest.kt b/androidApp/src/test/kotlin/org/meshtastic/app/ui/NavigationAssemblyTest.kt index 1fd4b39ce..8f3bf2c71 100644 --- a/androidApp/src/test/kotlin/org/meshtastic/app/ui/NavigationAssemblyTest.kt +++ b/androidApp/src/test/kotlin/org/meshtastic/app/ui/NavigationAssemblyTest.kt @@ -43,7 +43,7 @@ class NavigationAssemblyTest { @Test fun verifyNavigationGraphsAssembleWithoutCrashing() = runComposeUiTest { setContent { - val backStack = rememberNavBackStack(NodesRoute.NodesGraph) + val backStack = rememberNavBackStack(NodesRoute.Nodes) entryProvider { contactsGraph(backStack, emptyFlow()) nodesGraph(backStack = backStack, scrollToTopEvents = emptyFlow()) diff --git a/core/navigation/src/commonMain/kotlin/org/meshtastic/core/navigation/DeepLinkRouter.kt b/core/navigation/src/commonMain/kotlin/org/meshtastic/core/navigation/DeepLinkRouter.kt index 2351cd876..f88dabc60 100644 --- a/core/navigation/src/commonMain/kotlin/org/meshtastic/core/navigation/DeepLinkRouter.kt +++ b/core/navigation/src/commonMain/kotlin/org/meshtastic/core/navigation/DeepLinkRouter.kt @@ -60,7 +60,7 @@ object DeepLinkRouter { "quickchat", -> routeContacts(uri, pathSegments) - "connections" -> listOf(ConnectionsRoute.ConnectionsGraph) + "connections" -> listOf(ConnectionsRoute.Connections) "map" -> routeMap(uri, pathSegments) @@ -68,7 +68,7 @@ object DeepLinkRouter { "settings" -> routeSettings(pathSegments) - "channels" -> listOf(ChannelsRoute.ChannelsGraph) + "channels" -> listOf(ChannelsRoute.Channels) "firmware" -> routeFirmware(pathSegments) @@ -86,27 +86,24 @@ object DeepLinkRouter { return when (firstSegment) { "share" -> { val message = uri.getQueryParameter("message") ?: "" - listOf(ContactsRoute.ContactsGraph, ContactsRoute.Share(message)) + listOf(ContactsRoute.Contacts, ContactsRoute.Share(message)) } "quickchat" -> { - listOf(ContactsRoute.ContactsGraph, ContactsRoute.QuickChat) + listOf(ContactsRoute.Contacts, ContactsRoute.QuickChat) } "messages" -> { val contactKey = if (segments.size > 1) segments[1] else uri.getQueryParameter("contactKey") ?: "" val message = uri.getQueryParameter("message") ?: "" if (contactKey.isNotBlank()) { - listOf( - ContactsRoute.ContactsGraph, - ContactsRoute.Messages(contactKey = contactKey, message = message), - ) + listOf(ContactsRoute.Contacts, ContactsRoute.Messages(contactKey = contactKey, message = message)) } else { - listOf(ContactsRoute.ContactsGraph) + listOf(ContactsRoute.Contacts) } } - else -> listOf(ContactsRoute.ContactsGraph) + else -> listOf(ContactsRoute.Contacts) } } @@ -121,17 +118,17 @@ object DeepLinkRouter { val destNum = destNumStr?.toIntOrNull() return if (destNum == null) { - listOf(NodesRoute.NodesGraph) + listOf(NodesRoute.Nodes) } else if (segments.size > 2) { val subRouteStr = segments[2].lowercase() val detailRouteFn = nodeDetailSubRoutes[subRouteStr] if (detailRouteFn != null) { - listOf(NodesRoute.NodesGraph, NodesRoute.NodeDetailGraph(destNum), detailRouteFn(destNum)) + listOf(NodesRoute.Nodes, NodesRoute.NodeDetail(destNum), detailRouteFn(destNum)) } else { - listOf(NodesRoute.NodesGraph, NodesRoute.NodeDetail(destNum)) + listOf(NodesRoute.Nodes, NodesRoute.NodeDetail(destNum)) } } else { - listOf(NodesRoute.NodesGraph, NodesRoute.NodeDetail(destNum)) + listOf(NodesRoute.Nodes, NodesRoute.NodeDetail(destNum)) } } @@ -153,14 +150,14 @@ object DeepLinkRouter { } if (subRouteStr == null) { - return listOf(SettingsRoute.SettingsGraph(destNum)) + return listOf(SettingsRoute.Settings(destNum)) } val subRoute = settingsSubRoutes[subRouteStr] return if (subRoute != null) { - listOf(SettingsRoute.SettingsGraph(destNum), subRoute) + listOf(SettingsRoute.Settings(destNum), subRoute) } else { - listOf(SettingsRoute.SettingsGraph(destNum)) + listOf(SettingsRoute.Settings(destNum)) } } diff --git a/core/navigation/src/commonMain/kotlin/org/meshtastic/core/navigation/MultiBackstack.kt b/core/navigation/src/commonMain/kotlin/org/meshtastic/core/navigation/MultiBackstack.kt index 067ee2ae7..49f1f55a6 100644 --- a/core/navigation/src/commonMain/kotlin/org/meshtastic/core/navigation/MultiBackstack.kt +++ b/core/navigation/src/commonMain/kotlin/org/meshtastic/core/navigation/MultiBackstack.kt @@ -17,20 +17,23 @@ package org.meshtastic.core.navigation import androidx.compose.runtime.Composable +import androidx.compose.runtime.MutableState import androidx.compose.runtime.getValue import androidx.compose.runtime.key import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember +import androidx.compose.runtime.saveable.Saver +import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.navigation3.runtime.NavBackStack import androidx.navigation3.runtime.NavKey import androidx.navigation3.runtime.rememberNavBackStack /** Manages independent backstacks for multiple tabs. */ -class MultiBackstack(val startTab: NavKey) { +class MultiBackstack(val startTab: NavKey, private val currentTabState: MutableState) { var backStacks: Map> = emptyMap() - var currentTabRoute: NavKey by mutableStateOf(TopLevelDestination.fromNavKey(startTab)?.route ?: startTab) + var currentTabRoute: NavKey by currentTabState private set val activeBackStack: NavBackStack @@ -73,6 +76,19 @@ class MultiBackstack(val startTab: NavKey) { } } +/** Saver that persists the active tab ordinal across process death. */ +private val CurrentTabSaver = + Saver, Int>( + save = { state -> + TopLevelDestination.entries.indexOfFirst { it.route::class == state.value::class }.takeIf { it >= 0 } + }, + restore = { ordinal -> + mutableStateOf( + TopLevelDestination.entries.getOrNull(ordinal)?.route ?: TopLevelDestination.Connections.route, + ) + }, + ) + /** Remembers a [MultiBackstack] for managing independent tab navigation histories with Navigation 3. */ @Composable fun rememberMultiBackstack(initialTab: NavKey = TopLevelDestination.Connections.route): MultiBackstack { @@ -82,7 +98,12 @@ fun rememberMultiBackstack(initialTab: NavKey = TopLevelDestination.Connections. key(dest.route) { stacks[dest.route] = rememberNavBackStack(MeshtasticNavSavedStateConfig, dest.route) } } - val multiBackstack = remember { MultiBackstack(initialTab) } + val currentTabState = + rememberSaveable(saver = CurrentTabSaver) { + mutableStateOf(TopLevelDestination.fromNavKey(initialTab)?.route ?: initialTab) + } + + val multiBackstack = remember { MultiBackstack(initialTab, currentTabState) } multiBackstack.backStacks = stacks return multiBackstack diff --git a/core/navigation/src/commonMain/kotlin/org/meshtastic/core/navigation/Routes.kt b/core/navigation/src/commonMain/kotlin/org/meshtastic/core/navigation/Routes.kt index d8682c40c..a0df53eb3 100644 --- a/core/navigation/src/commonMain/kotlin/org/meshtastic/core/navigation/Routes.kt +++ b/core/navigation/src/commonMain/kotlin/org/meshtastic/core/navigation/Routes.kt @@ -27,23 +27,17 @@ interface Graph : Route @Serializable sealed interface ChannelsRoute : Route { - @Serializable data object ChannelsGraph : ChannelsRoute, Graph - - @Serializable data object Channels : ChannelsRoute + @Serializable data object Channels : ChannelsRoute, Graph } @Serializable sealed interface ConnectionsRoute : Route { - @Serializable data object ConnectionsGraph : ConnectionsRoute, Graph - - @Serializable data object Connections : ConnectionsRoute + @Serializable data object Connections : ConnectionsRoute, Graph } @Serializable sealed interface ContactsRoute : Route { - @Serializable data object ContactsGraph : ContactsRoute, Graph - - @Serializable data object Contacts : ContactsRoute + @Serializable data object Contacts : ContactsRoute, Graph @Serializable data class Messages(val contactKey: String, val message: String = "") : ContactsRoute @@ -59,13 +53,7 @@ sealed interface MapRoute : Route { @Serializable sealed interface NodesRoute : Route { - @Serializable data object NodesGraph : NodesRoute, Graph - - @Serializable data object Nodes : NodesRoute - - @Serializable data class NodeDetailGraph(val destNum: Int? = null) : - NodesRoute, - Graph + @Serializable data object Nodes : NodesRoute, Graph @Serializable data class NodeDetail(val destNum: Int? = null) : NodesRoute } @@ -96,12 +84,10 @@ sealed interface NodeDetailRoute : Route { @Serializable sealed interface SettingsRoute : Route { - @Serializable data class SettingsGraph(val destNum: Int? = null) : + @Serializable data class Settings(val destNum: Int? = null) : SettingsRoute, Graph - @Serializable data class Settings(val destNum: Int? = null) : SettingsRoute - @Serializable data object DeviceConfiguration : SettingsRoute @Serializable data object ModuleConfiguration : SettingsRoute diff --git a/core/navigation/src/commonMain/kotlin/org/meshtastic/core/navigation/TopLevelDestination.kt b/core/navigation/src/commonMain/kotlin/org/meshtastic/core/navigation/TopLevelDestination.kt index 8c8c4eea7..635ecfb7f 100644 --- a/core/navigation/src/commonMain/kotlin/org/meshtastic/core/navigation/TopLevelDestination.kt +++ b/core/navigation/src/commonMain/kotlin/org/meshtastic/core/navigation/TopLevelDestination.kt @@ -32,11 +32,11 @@ import org.meshtastic.core.resources.nodes * and Desktop navigation shells. */ enum class TopLevelDestination(val label: StringResource, val route: Route) { - Conversations(Res.string.conversations, ContactsRoute.ContactsGraph), - Nodes(Res.string.nodes, NodesRoute.NodesGraph), + Conversations(Res.string.conversations, ContactsRoute.Contacts), + Nodes(Res.string.nodes, NodesRoute.Nodes), Map(Res.string.map, MapRoute.Map()), - Settings(Res.string.bottom_nav_settings, SettingsRoute.SettingsGraph()), - Connections(Res.string.connections, ConnectionsRoute.ConnectionsGraph), + Settings(Res.string.bottom_nav_settings, SettingsRoute.Settings()), + Connections(Res.string.connections, ConnectionsRoute.Connections), ; companion object { diff --git a/core/navigation/src/commonTest/kotlin/org/meshtastic/core/navigation/DeepLinkRouterTest.kt b/core/navigation/src/commonTest/kotlin/org/meshtastic/core/navigation/DeepLinkRouterTest.kt index 04bda7472..c6fc642bd 100644 --- a/core/navigation/src/commonTest/kotlin/org/meshtastic/core/navigation/DeepLinkRouterTest.kt +++ b/core/navigation/src/commonTest/kotlin/org/meshtastic/core/navigation/DeepLinkRouterTest.kt @@ -47,25 +47,25 @@ class DeepLinkRouterTest { @Test fun `share with message`() { assertEquals( - listOf(ContactsRoute.ContactsGraph, ContactsRoute.Share("hello world")), + listOf(ContactsRoute.Contacts, ContactsRoute.Share("hello world")), route("/share?message=hello%20world"), ) } @Test fun `share without message defaults to empty string`() { - assertEquals(listOf(ContactsRoute.ContactsGraph, ContactsRoute.Share("")), route("/share")) + assertEquals(listOf(ContactsRoute.Contacts, ContactsRoute.Share("")), route("/share")) } @Test fun `quickchat routes to QuickChat`() { - assertEquals(listOf(ContactsRoute.ContactsGraph, ContactsRoute.QuickChat), route("/quickchat")) + assertEquals(listOf(ContactsRoute.Contacts, ContactsRoute.QuickChat), route("/quickchat")) } @Test fun `messages with contactKey path segment`() { assertEquals( - listOf(ContactsRoute.ContactsGraph, ContactsRoute.Messages(contactKey = "abc123", message = "")), + listOf(ContactsRoute.Contacts, ContactsRoute.Messages(contactKey = "abc123", message = "")), route("/messages/abc123"), ) } @@ -73,7 +73,7 @@ class DeepLinkRouterTest { @Test fun `messages with contactKey query param`() { assertEquals( - listOf(ContactsRoute.ContactsGraph, ContactsRoute.Messages(contactKey = "contact1", message = "")), + listOf(ContactsRoute.Contacts, ContactsRoute.Messages(contactKey = "contact1", message = "")), route("/messages?contactKey=contact1"), ) } @@ -81,14 +81,14 @@ class DeepLinkRouterTest { @Test fun `messages with contactKey and message`() { assertEquals( - listOf(ContactsRoute.ContactsGraph, ContactsRoute.Messages(contactKey = "contact1", message = "hi")), + listOf(ContactsRoute.Contacts, ContactsRoute.Messages(contactKey = "contact1", message = "hi")), route("/messages/contact1?message=hi"), ) } @Test fun `messages without contactKey returns graph only`() { - assertEquals(listOf(ContactsRoute.ContactsGraph), route("/messages")) + assertEquals(listOf(ContactsRoute.Contacts), route("/messages")) } // endregion @@ -96,8 +96,8 @@ class DeepLinkRouterTest { // region connections @Test - fun `connections routes to ConnectionsGraph`() { - assertEquals(listOf(ConnectionsRoute.ConnectionsGraph), route("/connections")) + fun `connections routes to Connections`() { + assertEquals(listOf(ConnectionsRoute.Connections), route("/connections")) } // endregion @@ -129,21 +129,21 @@ class DeepLinkRouterTest { // region nodes @Test - fun `nodes root returns NodesGraph`() { - assertEquals(listOf(NodesRoute.NodesGraph), route("/nodes")) + fun `nodes root returns Nodes`() { + assertEquals(listOf(NodesRoute.Nodes), route("/nodes")) } @Test fun `nodes with destNum returns NodeDetail`() { - assertEquals(listOf(NodesRoute.NodesGraph, NodesRoute.NodeDetail(destNum = 1234)), route("/nodes/1234")) + assertEquals(listOf(NodesRoute.Nodes, NodesRoute.NodeDetail(destNum = 1234)), route("/nodes/1234")) } @Test fun `nodes with destNum and device-metrics sub-route`() { assertEquals( listOf( - NodesRoute.NodesGraph, - NodesRoute.NodeDetailGraph(destNum = 1234), + NodesRoute.Nodes, + NodesRoute.NodeDetail(destNum = 1234), NodeDetailRoute.DeviceMetrics(destNum = 1234), ), route("/nodes/1234/device-metrics"), @@ -154,8 +154,8 @@ class DeepLinkRouterTest { fun `nodes with destNum and map sub-route`() { assertEquals( listOf( - NodesRoute.NodesGraph, - NodesRoute.NodeDetailGraph(destNum = 5678), + NodesRoute.Nodes, + NodesRoute.NodeDetail(destNum = 5678), NodeDetailRoute.PositionLog(destNum = 5678), ), route("/nodes/5678/map"), @@ -165,11 +165,7 @@ class DeepLinkRouterTest { @Test fun `nodes with destNum and position sub-route`() { assertEquals( - listOf( - NodesRoute.NodesGraph, - NodesRoute.NodeDetailGraph(destNum = 100), - NodeDetailRoute.PositionLog(destNum = 100), - ), + listOf(NodesRoute.Nodes, NodesRoute.NodeDetail(destNum = 100), NodeDetailRoute.PositionLog(destNum = 100)), route("/nodes/100/position"), ) } @@ -178,8 +174,8 @@ class DeepLinkRouterTest { fun `nodes with destNum and environment sub-route`() { assertEquals( listOf( - NodesRoute.NodesGraph, - NodesRoute.NodeDetailGraph(destNum = 100), + NodesRoute.Nodes, + NodesRoute.NodeDetail(destNum = 100), NodeDetailRoute.EnvironmentMetrics(destNum = 100), ), route("/nodes/100/environment"), @@ -190,8 +186,8 @@ class DeepLinkRouterTest { fun `nodes with destNum and signal sub-route`() { assertEquals( listOf( - NodesRoute.NodesGraph, - NodesRoute.NodeDetailGraph(destNum = 100), + NodesRoute.Nodes, + NodesRoute.NodeDetail(destNum = 100), NodeDetailRoute.SignalMetrics(destNum = 100), ), route("/nodes/100/signal"), @@ -201,11 +197,7 @@ class DeepLinkRouterTest { @Test fun `nodes with destNum and power sub-route`() { assertEquals( - listOf( - NodesRoute.NodesGraph, - NodesRoute.NodeDetailGraph(destNum = 100), - NodeDetailRoute.PowerMetrics(destNum = 100), - ), + listOf(NodesRoute.Nodes, NodesRoute.NodeDetail(destNum = 100), NodeDetailRoute.PowerMetrics(destNum = 100)), route("/nodes/100/power"), ) } @@ -214,8 +206,8 @@ class DeepLinkRouterTest { fun `nodes with destNum and traceroute sub-route`() { assertEquals( listOf( - NodesRoute.NodesGraph, - NodesRoute.NodeDetailGraph(destNum = 100), + NodesRoute.Nodes, + NodesRoute.NodeDetail(destNum = 100), NodeDetailRoute.TracerouteLog(destNum = 100), ), route("/nodes/100/traceroute"), @@ -226,8 +218,8 @@ class DeepLinkRouterTest { fun `nodes with destNum and host-metrics sub-route`() { assertEquals( listOf( - NodesRoute.NodesGraph, - NodesRoute.NodeDetailGraph(destNum = 100), + NodesRoute.Nodes, + NodesRoute.NodeDetail(destNum = 100), NodeDetailRoute.HostMetricsLog(destNum = 100), ), route("/nodes/100/host-metrics"), @@ -237,11 +229,7 @@ class DeepLinkRouterTest { @Test fun `nodes with destNum and pax sub-route`() { assertEquals( - listOf( - NodesRoute.NodesGraph, - NodesRoute.NodeDetailGraph(destNum = 100), - NodeDetailRoute.PaxMetrics(destNum = 100), - ), + listOf(NodesRoute.Nodes, NodesRoute.NodeDetail(destNum = 100), NodeDetailRoute.PaxMetrics(destNum = 100)), route("/nodes/100/pax"), ) } @@ -250,8 +238,8 @@ class DeepLinkRouterTest { fun `nodes with destNum and neighbors sub-route`() { assertEquals( listOf( - NodesRoute.NodesGraph, - NodesRoute.NodeDetailGraph(destNum = 100), + NodesRoute.Nodes, + NodesRoute.NodeDetail(destNum = 100), NodeDetailRoute.NeighborInfoLog(destNum = 100), ), route("/nodes/100/neighbors"), @@ -260,20 +248,17 @@ class DeepLinkRouterTest { @Test fun `nodes with destNum and unknown sub-route falls back to NodeDetail`() { - assertEquals( - listOf(NodesRoute.NodesGraph, NodesRoute.NodeDetail(destNum = 1234)), - route("/nodes/1234/unknown-sub"), - ) + assertEquals(listOf(NodesRoute.Nodes, NodesRoute.NodeDetail(destNum = 1234)), route("/nodes/1234/unknown-sub")) } @Test - fun `nodes with non-numeric destNum returns NodesGraph only`() { - assertEquals(listOf(NodesRoute.NodesGraph), route("/nodes/not-a-number")) + fun `nodes with non-numeric destNum returns Nodes only`() { + assertEquals(listOf(NodesRoute.Nodes), route("/nodes/not-a-number")) } @Test fun `nodes with destNum query param`() { - assertEquals(listOf(NodesRoute.NodesGraph, NodesRoute.NodeDetail(destNum = 9999)), route("/nodes?destNum=9999")) + assertEquals(listOf(NodesRoute.Nodes, NodesRoute.NodeDetail(destNum = 9999)), route("/nodes?destNum=9999")) } // endregion @@ -281,31 +266,28 @@ class DeepLinkRouterTest { // region settings @Test - fun `settings root returns SettingsGraph`() { - assertEquals(listOf(SettingsRoute.SettingsGraph(destNum = null)), route("/settings")) + fun `settings root returns Settings`() { + assertEquals(listOf(SettingsRoute.Settings(destNum = null)), route("/settings")) } @Test fun `settings with destNum`() { - assertEquals(listOf(SettingsRoute.SettingsGraph(destNum = 1234)), route("/settings/1234")) + assertEquals(listOf(SettingsRoute.Settings(destNum = 1234)), route("/settings/1234")) } @Test fun `settings with destNum and sub-route`() { - assertEquals( - listOf(SettingsRoute.SettingsGraph(destNum = 1234), SettingsRoute.About), - route("/settings/1234/about"), - ) + assertEquals(listOf(SettingsRoute.Settings(destNum = 1234), SettingsRoute.About), route("/settings/1234/about")) } @Test fun `settings with sub-route without destNum`() { - assertEquals(listOf(SettingsRoute.SettingsGraph(destNum = null), SettingsRoute.LoRa), route("/settings/lora")) + assertEquals(listOf(SettingsRoute.Settings(destNum = null), SettingsRoute.LoRa), route("/settings/lora")) } @Test - fun `settings with unknown sub-route returns SettingsGraph only`() { - assertEquals(listOf(SettingsRoute.SettingsGraph(destNum = null)), route("/settings/nonexistent-page")) + fun `settings with unknown sub-route returns Settings only`() { + assertEquals(listOf(SettingsRoute.Settings(destNum = null)), route("/settings/nonexistent-page")) } @Test @@ -349,7 +331,7 @@ class DeepLinkRouterTest { expectedSubRoutes.forEach { (slug, expectedRoute) -> assertEquals( - listOf(SettingsRoute.SettingsGraph(destNum = null), expectedRoute), + listOf(SettingsRoute.Settings(destNum = null), expectedRoute), route("/settings/$slug"), "Settings sub-route '$slug' did not resolve to $expectedRoute", ) @@ -361,8 +343,8 @@ class DeepLinkRouterTest { // region channels @Test - fun `channels routes to ChannelsGraph`() { - assertEquals(listOf(ChannelsRoute.ChannelsGraph), route("/channels")) + fun `channels routes to Channels`() { + assertEquals(listOf(ChannelsRoute.Channels), route("/channels")) } // endregion @@ -402,8 +384,8 @@ class DeepLinkRouterTest { @Test fun `route segments are case insensitive`() { - assertEquals(listOf(NodesRoute.NodesGraph), route("/Nodes")) - assertEquals(listOf(ConnectionsRoute.ConnectionsGraph), route("/CONNECTIONS")) + assertEquals(listOf(NodesRoute.Nodes), route("/Nodes")) + assertEquals(listOf(ConnectionsRoute.Connections), route("/CONNECTIONS")) } // endregion diff --git a/core/navigation/src/commonTest/kotlin/org/meshtastic/core/navigation/MultiBackstackTest.kt b/core/navigation/src/commonTest/kotlin/org/meshtastic/core/navigation/MultiBackstackTest.kt index c36375356..4ec1f7139 100644 --- a/core/navigation/src/commonTest/kotlin/org/meshtastic/core/navigation/MultiBackstackTest.kt +++ b/core/navigation/src/commonTest/kotlin/org/meshtastic/core/navigation/MultiBackstackTest.kt @@ -16,6 +16,7 @@ */ package org.meshtastic.core.navigation +import androidx.compose.runtime.mutableStateOf import androidx.navigation3.runtime.NavBackStack import androidx.navigation3.runtime.NavKey import kotlin.test.Test @@ -23,10 +24,15 @@ import kotlin.test.assertEquals class MultiBackstackTest { + private fun createMultiBackstack(startTab: NavKey): MultiBackstack { + val tabRoute = TopLevelDestination.fromNavKey(startTab)?.route ?: startTab + return MultiBackstack(startTab, mutableStateOf(tabRoute)) + } + @Test fun `navigateTopLevel to different tab preserves previous tab stack and activates new tab stack`() { val startTab = TopLevelDestination.Nodes.route - val multiBackstack = MultiBackstack(startTab) + val multiBackstack = createMultiBackstack(startTab) val nodesStack = NavBackStack().apply { addAll(listOf(TopLevelDestination.Nodes.route, NodesRoute.Nodes)) } @@ -48,7 +54,7 @@ class MultiBackstackTest { @Test fun `navigateTopLevel to same tab resets stack to root`() { val startTab = TopLevelDestination.Nodes.route - val multiBackstack = MultiBackstack(startTab) + val multiBackstack = createMultiBackstack(startTab) val nodesStack = NavBackStack().apply { addAll(listOf(TopLevelDestination.Nodes.route, NodesRoute.Nodes)) } @@ -65,7 +71,7 @@ class MultiBackstackTest { @Test fun `goBack pops current stack if size is greater than 1`() { val startTab = TopLevelDestination.Nodes.route - val multiBackstack = MultiBackstack(startTab) + val multiBackstack = createMultiBackstack(startTab) val nodesStack = NavBackStack().apply { addAll(listOf(TopLevelDestination.Nodes.route, NodesRoute.Nodes)) } @@ -80,7 +86,7 @@ class MultiBackstackTest { @Test fun `goBack on root of non-start tab returns to start tab`() { val startTab = TopLevelDestination.Connections.route - val multiBackstack = MultiBackstack(startTab) + val multiBackstack = createMultiBackstack(startTab) val mapStack = NavBackStack().apply { addAll(listOf(TopLevelDestination.Map.route)) } val connectionsStack = NavBackStack().apply { addAll(listOf(TopLevelDestination.Connections.route)) } @@ -99,7 +105,7 @@ class MultiBackstackTest { @Test fun `handleDeepLink sets target tab and populates stack`() { val startTab = TopLevelDestination.Nodes.route - val multiBackstack = MultiBackstack(startTab) + val multiBackstack = createMultiBackstack(startTab) val settingsStack = NavBackStack().apply { addAll(listOf(TopLevelDestination.Settings.route)) } multiBackstack.backStacks = mapOf(TopLevelDestination.Settings.route to settingsStack) @@ -116,7 +122,7 @@ class MultiBackstackTest { fun `handleDeepLink from different tab switches tab and sets stack`() { // Start on Connections tab val startTab = TopLevelDestination.Connections.route - val multiBackstack = MultiBackstack(startTab) + val multiBackstack = createMultiBackstack(startTab) val connectionsStack = NavBackStack().apply { addAll(listOf(TopLevelDestination.Connections.route)) } val nodesStack = NavBackStack().apply { addAll(listOf(TopLevelDestination.Nodes.route)) } @@ -133,13 +139,13 @@ class MultiBackstackTest { // Deep-link to a TracerouteMap on the Nodes tab (this is the exact pattern // MeshtasticAppShell uses for traceroute alert "View on Map") val tracerouteMap = NodeDetailRoute.TracerouteMap(destNum = 100, requestId = 42, logUuid = "abc") - multiBackstack.handleDeepLink(listOf(NodesRoute.NodesGraph, tracerouteMap)) + multiBackstack.handleDeepLink(listOf(NodesRoute.Nodes, tracerouteMap)) // Should have switched to the Nodes tab assertEquals(TopLevelDestination.Nodes.route, multiBackstack.currentTabRoute) // Stack should contain the graph root + the traceroute map route assertEquals(2, multiBackstack.activeBackStack.size) - assertEquals(NodesRoute.NodesGraph, multiBackstack.activeBackStack.first()) + assertEquals(NodesRoute.Nodes, multiBackstack.activeBackStack.first()) assertEquals(tracerouteMap, multiBackstack.activeBackStack.last()) } } diff --git a/core/navigation/src/commonTest/kotlin/org/meshtastic/core/navigation/NavBackStackExtTest.kt b/core/navigation/src/commonTest/kotlin/org/meshtastic/core/navigation/NavBackStackExtTest.kt index 2f013a39c..8ffb917e6 100644 --- a/core/navigation/src/commonTest/kotlin/org/meshtastic/core/navigation/NavBackStackExtTest.kt +++ b/core/navigation/src/commonTest/kotlin/org/meshtastic/core/navigation/NavBackStackExtTest.kt @@ -26,21 +26,21 @@ class NavBackStackExtTest { @Test fun `replaceLast on non-empty list replaces the last element`() { - val stack = mutableListOf(NodesRoute.NodesGraph, NodesRoute.Nodes) + val stack = mutableListOf(NodesRoute.Nodes, NodesRoute.Nodes) stack.replaceLast(NodesRoute.NodeDetail(destNum = 42)) assertEquals(2, stack.size) - assertEquals(NodesRoute.NodesGraph, stack[0]) + assertEquals(NodesRoute.Nodes, stack[0]) assertEquals(NodesRoute.NodeDetail(destNum = 42), stack[1]) } @Test fun `replaceLast on single-element list replaces that element`() { - val stack = mutableListOf(NodesRoute.NodesGraph) - stack.replaceLast(SettingsRoute.SettingsGraph()) + val stack = mutableListOf(NodesRoute.Nodes) + stack.replaceLast(SettingsRoute.Settings()) assertEquals(1, stack.size) - assertEquals(SettingsRoute.SettingsGraph(), stack[0]) + assertEquals(SettingsRoute.Settings(), stack[0]) } @Test @@ -55,7 +55,7 @@ class NavBackStackExtTest { @Test fun `replaceLast with same element does not mutate`() { val route = NodesRoute.Nodes - val stack = mutableListOf(NodesRoute.NodesGraph, route) + val stack = mutableListOf(NodesRoute.Nodes, route) stack.replaceLast(route) assertEquals(2, stack.size) @@ -68,8 +68,8 @@ class NavBackStackExtTest { @Test fun `replaceAll replaces entire stack with new routes`() { - val stack = mutableListOf(NodesRoute.NodesGraph, NodesRoute.Nodes) - val newRoutes = listOf(SettingsRoute.SettingsGraph(), SettingsRoute.About) + val stack = mutableListOf(NodesRoute.Nodes, NodesRoute.Nodes) + val newRoutes = listOf(SettingsRoute.Settings(), SettingsRoute.About) stack.replaceAll(newRoutes) @@ -78,19 +78,19 @@ class NavBackStackExtTest { @Test fun `replaceAll with shorter list trims excess elements`() { - val stack = mutableListOf(NodesRoute.NodesGraph, NodesRoute.Nodes, NodesRoute.NodeDetail(destNum = 42)) - val newRoutes = listOf(SettingsRoute.SettingsGraph()) + val stack = mutableListOf(NodesRoute.Nodes, NodesRoute.Nodes, NodesRoute.NodeDetail(destNum = 42)) + val newRoutes = listOf(SettingsRoute.Settings()) stack.replaceAll(newRoutes) assertEquals(1, stack.size) - assertEquals(SettingsRoute.SettingsGraph(), stack[0]) + assertEquals(SettingsRoute.Settings(), stack[0]) } @Test fun `replaceAll with longer list appends new elements`() { - val stack = mutableListOf(NodesRoute.NodesGraph) - val newRoutes = listOf(NodesRoute.NodesGraph, NodesRoute.Nodes, NodesRoute.NodeDetail(destNum = 99)) + val stack = mutableListOf(NodesRoute.Nodes) + val newRoutes = listOf(NodesRoute.Nodes, NodesRoute.Nodes, NodesRoute.NodeDetail(destNum = 99)) stack.replaceAll(newRoutes) @@ -99,7 +99,7 @@ class NavBackStackExtTest { @Test fun `replaceAll with empty list clears the stack`() { - val stack = mutableListOf(NodesRoute.NodesGraph, NodesRoute.Nodes) + val stack = mutableListOf(NodesRoute.Nodes, NodesRoute.Nodes) stack.replaceAll(emptyList()) @@ -109,7 +109,7 @@ class NavBackStackExtTest { @Test fun `replaceAll on empty stack with new routes populates it`() { val stack = mutableListOf() - val newRoutes = listOf(ContactsRoute.ContactsGraph, ContactsRoute.Contacts) + val newRoutes = listOf(ContactsRoute.Contacts, ContactsRoute.Contacts) stack.replaceAll(newRoutes) @@ -118,7 +118,7 @@ class NavBackStackExtTest { @Test fun `replaceAll with identical routes does not mutate entries`() { - val routes = listOf(NodesRoute.NodesGraph, NodesRoute.Nodes) + val routes = listOf(NodesRoute.Nodes, NodesRoute.Nodes) val stack = routes.toMutableList() stack.replaceAll(routes) @@ -128,17 +128,17 @@ class NavBackStackExtTest { @Test fun `replaceAll with partial overlap only changes differing elements`() { - val stack = mutableListOf(NodesRoute.NodesGraph, NodesRoute.Nodes, NodesRoute.NodeDetail(destNum = 1)) + val stack = mutableListOf(NodesRoute.Nodes, NodesRoute.Nodes, NodesRoute.NodeDetail(destNum = 1)) val newRoutes = listOf( - NodesRoute.NodesGraph, // same + NodesRoute.Nodes, // same SettingsRoute.About, // different ) stack.replaceAll(newRoutes) assertEquals(2, stack.size) - assertEquals(NodesRoute.NodesGraph, stack[0]) + assertEquals(NodesRoute.Nodes, stack[0]) assertEquals(SettingsRoute.About, stack[1]) } diff --git a/core/navigation/src/commonTest/kotlin/org/meshtastic/core/navigation/NavigationConfigTest.kt b/core/navigation/src/commonTest/kotlin/org/meshtastic/core/navigation/NavigationConfigTest.kt index 293c567fc..2f7ae59af 100644 --- a/core/navigation/src/commonTest/kotlin/org/meshtastic/core/navigation/NavigationConfigTest.kt +++ b/core/navigation/src/commonTest/kotlin/org/meshtastic/core/navigation/NavigationConfigTest.kt @@ -38,13 +38,10 @@ class NavigationConfigTest { private val allRouteInstances: List = listOf( // ChannelsRoute - ChannelsRoute.ChannelsGraph, ChannelsRoute.Channels, // ConnectionsRoute - ConnectionsRoute.ConnectionsGraph, ConnectionsRoute.Connections, // ContactsRoute - ContactsRoute.ContactsGraph, ContactsRoute.Contacts, ContactsRoute.Messages(contactKey = "test-contact", message = "hello"), ContactsRoute.Messages(contactKey = "test-contact"), @@ -54,10 +51,7 @@ class NavigationConfigTest { MapRoute.Map(), MapRoute.Map(waypointId = 42), // NodesRoute - NodesRoute.NodesGraph, NodesRoute.Nodes, - NodesRoute.NodeDetailGraph(destNum = 1234), - NodesRoute.NodeDetailGraph(), NodesRoute.NodeDetail(destNum = 5678), NodesRoute.NodeDetail(), // NodeDetailRoute @@ -73,8 +67,6 @@ class NavigationConfigTest { NodeDetailRoute.PaxMetrics(destNum = 100), NodeDetailRoute.NeighborInfoLog(destNum = 100), // SettingsRoute - SettingsRoute.SettingsGraph(), - SettingsRoute.SettingsGraph(destNum = 999), SettingsRoute.Settings(), SettingsRoute.Settings(destNum = 999), SettingsRoute.DeviceConfiguration, @@ -183,9 +175,7 @@ class NavigationConfigTest { val routesWithDefaults: List> = listOf( MapRoute.Map() to MapRoute.Map(waypointId = null), - NodesRoute.NodeDetailGraph() to NodesRoute.NodeDetailGraph(destNum = null), NodesRoute.NodeDetail() to NodesRoute.NodeDetail(destNum = null), - SettingsRoute.SettingsGraph() to SettingsRoute.SettingsGraph(destNum = null), SettingsRoute.Settings() to SettingsRoute.Settings(destNum = null), WifiProvisionRoute.WifiProvision() to WifiProvisionRoute.WifiProvision(address = null), ) diff --git a/core/ui/detekt-baseline.xml b/core/ui/detekt-baseline.xml index ab18a483f..11672934f 100644 --- a/core/ui/detekt-baseline.xml +++ b/core/ui/detekt-baseline.xml @@ -127,7 +127,7 @@ PreviewPublic:SwitchPreference.kt:@Preview(showBackground = true) @Composable fun SwitchPreferencePreview PreviewPublic:TextDividerPreference.kt:@Preview(showBackground = true) @Composable fun TextDividerPreferencePreview PreviewPublic:TitledCard.kt:@PreviewLightDark @Composable fun TitledCardPreview - ViewModelForwarding:MeshtasticAppShell.kt:MeshtasticCommonAppSetup( uiViewModel = uiViewModel, onNavigateToTracerouteMap = { destNum, requestId, logUuid -> multiBackstack.handleDeepLink( listOf( NodesRoute.NodesGraph, NodeDetailRoute.TracerouteMap(destNum = destNum, requestId = requestId, logUuid = logUuid), ), ) }, ) + ViewModelForwarding:MeshtasticAppShell.kt:MeshtasticCommonAppSetup( uiViewModel = uiViewModel, onNavigateToTracerouteMap = { destNum, requestId, logUuid -> multiBackstack.handleDeepLink( listOf( NodesRoute.Nodes, NodeDetailRoute.TracerouteMap(destNum = destNum, requestId = requestId, logUuid = logUuid), ), ) }, ) ViewModelForwarding:MeshtasticCommonAppSetup.kt:FirmwareVersionCheck(viewModel = uiViewModel) ViewModelForwarding:MeshtasticCommonAppSetup.kt:SharedDialogs(uiViewModel = uiViewModel) ViewModelForwarding:MeshtasticCommonAppSetup.kt:TracerouteAlertHandler(uiViewModel = uiViewModel, onNavigateToMap = onNavigateToTracerouteMap) diff --git a/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/MeshtasticAppShell.kt b/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/MeshtasticAppShell.kt index 95a64ff95..9f6077e2d 100644 --- a/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/MeshtasticAppShell.kt +++ b/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/MeshtasticAppShell.kt @@ -46,7 +46,7 @@ fun MeshtasticAppShell( onNavigateToTracerouteMap = { destNum, requestId, logUuid -> multiBackstack.handleDeepLink( listOf( - NodesRoute.NodesGraph, + NodesRoute.Nodes, NodeDetailRoute.TracerouteMap(destNum = destNum, requestId = requestId, logUuid = logUuid), ), ) diff --git a/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/MeshtasticNavDisplay.kt b/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/MeshtasticNavDisplay.kt index 08d63c605..c05cb71be 100644 --- a/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/MeshtasticNavDisplay.kt +++ b/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/MeshtasticNavDisplay.kt @@ -18,6 +18,8 @@ package org.meshtastic.core.ui.component import androidx.compose.animation.AnimatedContentTransitionScope import androidx.compose.animation.ContentTransform +import androidx.compose.animation.ExperimentalSharedTransitionApi +import androidx.compose.animation.SharedTransitionLayout import androidx.compose.animation.core.tween import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut @@ -68,7 +70,7 @@ fun MeshtasticNavDisplay( /** Shared [NavDisplay] wrapper for a single backstack. */ @Suppress("LongMethod") -@OptIn(ExperimentalMaterial3AdaptiveApi::class) +@OptIn(ExperimentalMaterial3AdaptiveApi::class, ExperimentalSharedTransitionApi::class) @Composable fun MeshtasticNavDisplay( backStack: NavBackStack, @@ -115,28 +117,32 @@ fun MeshtasticNavDisplay( val activeDecorators = remember(backStack, saveableDecorator, vmStoreDecorator) { listOf(saveableDecorator, vmStoreDecorator) } - NavDisplay( - backStack = backStack, - entryProvider = entryProvider, - entryDecorators = activeDecorators, - onBack = - onBack - ?: { - if (backStack.size > 1) { - backStack.removeLastOrNull() - } - }, - sceneStrategies = - listOf( - DialogSceneStrategy(), - listDetailSceneStrategy, - supportingPaneSceneStrategy, - SinglePaneSceneStrategy(), - ), - transitionSpec = meshtasticTransitionSpec(), - popTransitionSpec = meshtasticTransitionSpec(), - modifier = modifier, - ) + SharedTransitionLayout { + NavDisplay( + backStack = backStack, + entryProvider = entryProvider, + entryDecorators = activeDecorators, + onBack = + onBack + ?: { + if (backStack.size > 1) { + backStack.removeLastOrNull() + } + }, + sceneStrategies = + listOf( + DialogSceneStrategy(), + listDetailSceneStrategy, + supportingPaneSceneStrategy, + SinglePaneSceneStrategy(), + ), + sharedTransitionScope = this@SharedTransitionLayout, + transitionSpec = meshtasticTransitionSpec(), + popTransitionSpec = meshtasticTransitionSpec(), + predictivePopTransitionSpec = meshtasticPredictivePopTransitionSpec(), + modifier = modifier, + ) + } } /** Shared crossfade [ContentTransform] used for both forward and pop navigation. */ @@ -146,3 +152,13 @@ private fun meshtasticTransitionSpec(): AnimatedContentTransitionScope>.(Int) -> ContentTransform = + { + ContentTransform( + fadeIn(animationSpec = tween(TRANSITION_DURATION_MS)), + fadeOut(animationSpec = tween(TRANSITION_DURATION_MS)), + ) + } diff --git a/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/MeshtasticNavigationSuite.kt b/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/MeshtasticNavigationSuite.kt index f23f082b5..de477fc4a 100644 --- a/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/MeshtasticNavigationSuite.kt +++ b/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/MeshtasticNavigationSuite.kt @@ -141,7 +141,7 @@ private fun handleNavigation( val currentKey = multiBackstack.activeBackStack.lastOrNull() when (destination) { TopLevelDestination.Nodes -> { - val onNodesList = currentKey is NodesRoute.NodesGraph || currentKey is NodesRoute.Nodes + val onNodesList = currentKey is NodesRoute.Nodes if (!onNodesList) { multiBackstack.navigateTopLevel(destination.route) } else { @@ -150,8 +150,7 @@ private fun handleNavigation( } TopLevelDestination.Conversations -> { - val onConversationsList = - currentKey is ContactsRoute.ContactsGraph || currentKey is ContactsRoute.Contacts + val onConversationsList = currentKey is ContactsRoute.Contacts if (!onConversationsList) { multiBackstack.navigateTopLevel(destination.route) } else { diff --git a/desktopApp/src/test/kotlin/org/meshtastic/desktop/ui/DesktopTopLevelDestinationParityTest.kt b/desktopApp/src/test/kotlin/org/meshtastic/desktop/ui/DesktopTopLevelDestinationParityTest.kt index b77d6a222..ac81053ef 100644 --- a/desktopApp/src/test/kotlin/org/meshtastic/desktop/ui/DesktopTopLevelDestinationParityTest.kt +++ b/desktopApp/src/test/kotlin/org/meshtastic/desktop/ui/DesktopTopLevelDestinationParityTest.kt @@ -41,11 +41,11 @@ class DesktopTopLevelDestinationParityTest { val androidParityRoutes: Set> = setOf( - ContactsRoute.ContactsGraph::class, - NodesRoute.NodesGraph::class, + ContactsRoute.Contacts::class, + NodesRoute.Nodes::class, MapRoute.Map::class, - SettingsRoute.SettingsGraph::class, - ConnectionsRoute.ConnectionsGraph::class, + SettingsRoute.Settings::class, + ConnectionsRoute.Connections::class, ) assertEquals( diff --git a/feature/connections/src/commonMain/kotlin/org/meshtastic/feature/connections/navigation/ConnectionsNavigation.kt b/feature/connections/src/commonMain/kotlin/org/meshtastic/feature/connections/navigation/ConnectionsNavigation.kt index 7b91f0975..23fa20d59 100644 --- a/feature/connections/src/commonMain/kotlin/org/meshtastic/feature/connections/navigation/ConnectionsNavigation.kt +++ b/feature/connections/src/commonMain/kotlin/org/meshtastic/feature/connections/navigation/ConnectionsNavigation.kt @@ -28,16 +28,6 @@ import org.meshtastic.feature.settings.radio.RadioConfigViewModel /** Navigation graph for for the top level ConnectionsScreen - [ConnectionsRoute.Connections]. */ fun EntryProviderScope.connectionsGraph(backStack: NavBackStack) { - entry { - ConnectionsScreen( - scanModel = koinViewModel(), - radioConfigViewModel = koinViewModel(), - onClickNodeChip = { id -> backStack.add(NodesRoute.NodeDetail(id)) }, - onNavigateToNodeDetails = { id -> backStack.add(NodesRoute.NodeDetail(id)) }, - onConfigNavigate = { route -> backStack.add(route) }, - ) - } - entry { ConnectionsScreen( scanModel = koinViewModel(), diff --git a/feature/messaging/detekt-baseline.xml b/feature/messaging/detekt-baseline.xml index 2986c9292..6363e9375 100644 --- a/feature/messaging/detekt-baseline.xml +++ b/feature/messaging/detekt-baseline.xml @@ -35,6 +35,6 @@ PreviewPublic:QuickChatPreviews.kt:@PreviewLightDark @Composable fun EditQuickChatDialogPreview PreviewPublic:QuickChatPreviews.kt:@PreviewLightDark @Composable fun QuickChatItemPreview PreviewPublic:ReactionPreviews.kt:@PreviewLightDark @Composable fun ReactionItemPreview - ViewModelForwarding:AdaptiveContactsScreen.kt:ContactsScreen( onNavigateToShare = { backStack.add(ChannelsRoute.ChannelsGraph) }, sharedContactRequested = sharedContactRequested, requestChannelSet = requestChannelSet, onHandleDeepLink = onHandleDeepLink, onClearSharedContactRequested = onClearSharedContactRequested, onClearRequestChannelUrl = onClearRequestChannelUrl, viewModel = contactsViewModel, onClickNodeChip = { backStack.add(NodesRoute.NodeDetail(it)) }, onNavigateToMessages = { contactKey -> backStack.add(ContactsRoute.Messages(contactKey)) }, onNavigateToNodeDetails = { backStack.add(NodesRoute.NodeDetail(it)) }, scrollToTopEvents = scrollToTopEvents, activeContactKey = null, ) + ViewModelForwarding:AdaptiveContactsScreen.kt:ContactsScreen( onNavigateToShare = { backStack.add(ChannelsRoute.Channels) }, sharedContactRequested = sharedContactRequested, requestChannelSet = requestChannelSet, onHandleDeepLink = onHandleDeepLink, onClearSharedContactRequested = onClearSharedContactRequested, onClearRequestChannelUrl = onClearRequestChannelUrl, viewModel = contactsViewModel, onClickNodeChip = { backStack.add(NodesRoute.NodeDetail(it)) }, onNavigateToMessages = { contactKey -> backStack.add(ContactsRoute.Messages(contactKey)) }, onNavigateToNodeDetails = { backStack.add(NodesRoute.NodeDetail(it)) }, scrollToTopEvents = scrollToTopEvents, activeContactKey = null, ) diff --git a/feature/messaging/src/commonMain/kotlin/org/meshtastic/feature/messaging/navigation/ContactsNavigation.kt b/feature/messaging/src/commonMain/kotlin/org/meshtastic/feature/messaging/navigation/ContactsNavigation.kt index f6c27c3c6..899ae7344 100644 --- a/feature/messaging/src/commonMain/kotlin/org/meshtastic/feature/messaging/navigation/ContactsNavigation.kt +++ b/feature/messaging/src/commonMain/kotlin/org/meshtastic/feature/messaging/navigation/ContactsNavigation.kt @@ -45,10 +45,6 @@ fun EntryProviderScope.contactsGraph( backStack: NavBackStack, scrollToTopEvents: Flow = MutableSharedFlow(), ) { - entry(metadata = { ListDetailSceneStrategy.listPane() }) { - ContactsEntryContent(backStack = backStack, scrollToTopEvents = scrollToTopEvents) - } - entry(metadata = { ListDetailSceneStrategy.listPane() }) { ContactsEntryContent(backStack = backStack, scrollToTopEvents = scrollToTopEvents) } diff --git a/feature/messaging/src/commonMain/kotlin/org/meshtastic/feature/messaging/ui/contact/AdaptiveContactsScreen.kt b/feature/messaging/src/commonMain/kotlin/org/meshtastic/feature/messaging/ui/contact/AdaptiveContactsScreen.kt index c87b9143f..278ad2f45 100644 --- a/feature/messaging/src/commonMain/kotlin/org/meshtastic/feature/messaging/ui/contact/AdaptiveContactsScreen.kt +++ b/feature/messaging/src/commonMain/kotlin/org/meshtastic/feature/messaging/ui/contact/AdaptiveContactsScreen.kt @@ -40,7 +40,7 @@ fun AdaptiveContactsScreen( onClearRequestChannelUrl: () -> Unit, ) { ContactsScreen( - onNavigateToShare = { backStack.add(ChannelsRoute.ChannelsGraph) }, + onNavigateToShare = { backStack.add(ChannelsRoute.Channels) }, sharedContactRequested = sharedContactRequested, requestChannelSet = requestChannelSet, onHandleDeepLink = onHandleDeepLink, diff --git a/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/navigation/AdaptiveNodeListScreen.kt b/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/navigation/AdaptiveNodeListScreen.kt index f10f456ac..882e078f3 100644 --- a/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/navigation/AdaptiveNodeListScreen.kt +++ b/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/navigation/AdaptiveNodeListScreen.kt @@ -39,7 +39,7 @@ fun AdaptiveNodeListScreen( NodeListScreen( viewModel = nodeListViewModel, navigateToNodeDetails = { nodeId -> backStack.add(NodesRoute.NodeDetail(nodeId)) }, - onNavigateToChannels = { backStack.add(ChannelsRoute.ChannelsGraph) }, + onNavigateToChannels = { backStack.add(ChannelsRoute.Channels) }, scrollToTopEvents = scrollToTopEvents, activeNodeId = null, onHandleDeepLink = onHandleDeepLink, diff --git a/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/navigation/NodesNavigation.kt b/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/navigation/NodesNavigation.kt index 47d34c9c5..ee4955c32 100644 --- a/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/navigation/NodesNavigation.kt +++ b/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/navigation/NodesNavigation.kt @@ -76,15 +76,6 @@ fun EntryProviderScope.nodesGraph( onHandleDeepLink: (org.meshtastic.core.common.util.CommonUri, onInvalid: () -> Unit) -> Unit = { _, _ -> }, onNavigateToConnections: () -> Unit = {}, ) { - entry(metadata = { ListDetailSceneStrategy.listPane() }) { - AdaptiveNodeListScreen( - backStack = backStack, - scrollToTopEvents = scrollToTopEvents, - onHandleDeepLink = onHandleDeepLink, - onNavigateToConnections = onNavigateToConnections, - ) - } - entry(metadata = { ListDetailSceneStrategy.listPane() }) { AdaptiveNodeListScreen( backStack = backStack, @@ -94,30 +85,16 @@ fun EntryProviderScope.nodesGraph( ) } - nodeDetailGraph(backStack, scrollToTopEvents, onHandleDeepLink, onNavigateToConnections) + nodeDetailGraph(backStack) } @OptIn(ExperimentalMaterial3AdaptiveApi::class) @Suppress("LongMethod") -fun EntryProviderScope.nodeDetailGraph( - backStack: NavBackStack, - scrollToTopEvents: Flow, - onHandleDeepLink: (org.meshtastic.core.common.util.CommonUri, onInvalid: () -> Unit) -> Unit = { _, _ -> }, - onNavigateToConnections: () -> Unit = {}, -) { - entry(metadata = { ListDetailSceneStrategy.listPane() }) { args -> - AdaptiveNodeListScreen( - backStack = backStack, - scrollToTopEvents = scrollToTopEvents, - onHandleDeepLink = onHandleDeepLink, - onNavigateToConnections = onNavigateToConnections, - ) - } - +fun EntryProviderScope.nodeDetailGraph(backStack: NavBackStack) { entry(metadata = { ListDetailSceneStrategy.detailPane() }) { args -> val nodeDetailViewModel: NodeDetailViewModel = koinViewModel() val compassViewModel: CompassViewModel = koinViewModel() - val destNum = args.destNum ?: 0 // Handle nullable destNum if needed + val destNum = args.destNum ?: 0 NodeDetailScreen( nodeId = destNum, viewModel = nodeDetailViewModel, @@ -149,7 +126,12 @@ fun EntryProviderScope.nodeDetailGraph( entry(metadata = { ListDetailSceneStrategy.extraPane() }) { args -> val tracerouteMapScreen = org.meshtastic.core.ui.util.LocalTracerouteMapScreenProvider.current - tracerouteMapScreen(args.destNum, args.requestId, args.logUuid) { backStack.removeLastOrNull() } + tracerouteMapScreen( + args.destNum, + args.requestId, + args.logUuid, + dropUnlessResumed { backStack.removeLastOrNull() }, + ) } NodeDetailScreen.entries.forEach { routeInfo -> diff --git a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/navigation/SettingsNavigation.kt b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/navigation/SettingsNavigation.kt index d0e4f4a00..18e2707bb 100644 --- a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/navigation/SettingsNavigation.kt +++ b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/navigation/SettingsNavigation.kt @@ -73,14 +73,12 @@ import org.meshtastic.feature.settings.radio.component.UserConfigScreen import kotlin.reflect.KClass @Composable -fun getRadioConfigViewModel(backStack: NavBackStack): RadioConfigViewModel { +fun getRadioConfigViewModel(backStack: NavBackStack, destNumOverride: Int? = null): RadioConfigViewModel { val destNum = - remember(backStack.toList()) { - backStack.lastOrNull { it is SettingsRoute.Settings }?.let { (it as SettingsRoute.Settings).destNum } - ?: backStack - .lastOrNull { it is SettingsRoute.SettingsGraph } - ?.let { (it as SettingsRoute.SettingsGraph).destNum } - } + destNumOverride + ?: remember(backStack.toList()) { + backStack.lastOrNull { it is SettingsRoute.Settings }?.let { (it as SettingsRoute.Settings).destNum } + } return koinViewModel(key = destNum?.toString()) { parametersOf(SavedStateHandle(mapOf("destNum" to destNum))) } @@ -88,22 +86,14 @@ fun getRadioConfigViewModel(backStack: NavBackStack): RadioConfigViewMod @Suppress("LongMethod", "CyclomaticComplexMethod") fun EntryProviderScope.settingsGraph(backStack: NavBackStack) { - entry { + entry { args -> + val isTabRoot = backStack.firstOrNull() == args SettingsMainScreen( settingsViewModel = koinViewModel(), - radioConfigViewModel = getRadioConfigViewModel(backStack), + radioConfigViewModel = getRadioConfigViewModel(backStack, destNumOverride = args.destNum), onClickNodeChip = { backStack.add(NodesRoute.NodeDetail(it)) }, onNavigate = { backStack.add(it) }, - ) - } - - entry { - SettingsMainScreen( - settingsViewModel = koinViewModel(), - radioConfigViewModel = getRadioConfigViewModel(backStack), - onClickNodeChip = { backStack.add(NodesRoute.NodeDetail(it)) }, - onNavigate = { backStack.add(it) }, - onBack = dropUnlessResumed { backStack.removeLastOrNull() }, + onBack = if (isTabRoot) null else dropUnlessResumed { backStack.removeLastOrNull() }, ) } @@ -236,7 +226,7 @@ fun EntryProviderScope.settingsGraph(backStack: NavBackStack) { } } - entry { TakServerScreen(onBack = { backStack.removeLastOrNull() }) } + entry { TakServerScreen(onBack = dropUnlessResumed { backStack.removeLastOrNull() }) } entry { val viewModel: DebugViewModel = koinViewModel() diff --git a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/channel/ChannelsNavigation.kt b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/channel/ChannelsNavigation.kt index 428b6602c..6218a0a90 100644 --- a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/channel/ChannelsNavigation.kt +++ b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/channel/ChannelsNavigation.kt @@ -26,14 +26,6 @@ import org.meshtastic.feature.settings.radio.RadioConfigViewModel /** Navigation graph for for the top level ChannelScreen - [ChannelsRoute.Channels]. */ fun EntryProviderScope.channelsGraph(backStack: NavBackStack) { - entry { - ChannelScreen( - radioConfigViewModel = koinViewModel(), - onNavigate = { route -> backStack.add(route) }, - onNavigateUp = dropUnlessResumed { backStack.removeLastOrNull() }, - ) - } - entry { ChannelScreen( radioConfigViewModel = koinViewModel(), From 72436e70bc1db9373581bc53e8cc62548e596744 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 18 May 2026 18:01:43 -0500 Subject: [PATCH 28/78] chore(deps): update core/proto/src/main/proto digest to 59cb394 (#5480) --- core/proto/src/main/proto | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/proto/src/main/proto b/core/proto/src/main/proto index 1c6254062..59cb394dc 160000 --- a/core/proto/src/main/proto +++ b/core/proto/src/main/proto @@ -1 +1 @@ -Subproject commit 1c6254062b3f726893b79350aaf8d506eb28503a +Subproject commit 59cb394dcfc4432cb216358ca26e861c7d13f462 From f5128798a808219a28e9ee0916c079edcb203744 Mon Sep 17 00:00:00 2001 From: James Rich <2199651+jamesarich@users.noreply.github.com> Date: Mon, 18 May 2026 20:10:47 -0500 Subject: [PATCH 29/78] feat: adopt Material 3 Expressive design system (M3-native APIs only) (#5479) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/agents/speckit.verify.run.agent.md | 2 +- .skills/speckit/SKILL.md | 6 +- .specify/extensions/verify/commands/verify.md | 2 +- .specify/feature.json | 2 +- .specify/init-options.json | 2 +- AGENTS.md | 2 +- .../kotlin/org/meshtastic/app/map/MapView.kt | 122 +- .../app/map/component/MapFilterDropdown.kt | 105 +- .../app/map/component/MapTypeDropdown.kt | 66 +- .../core/prefs/emoji/CustomEmojiPrefsImpl.kt | 9 + .../core/repository/AppPreferences.kt | 3 + .../core/testing/FakeAppPreferences.kt | 5 + core/ui/build.gradle.kts | 2 + .../ui/component/TimeTickWithLifecycle.kt | 56 - .../composeResources/files/emoji-data.json | 1 + .../core/ui/component/AlertDialogs.kt | 6 +- .../core/ui/component/BottomSheetDialog.kt | 66 - .../core/ui/component/ChannelItem.kt | 5 +- .../core/ui/component/ClickableTextField.kt | 58 - .../meshtastic/core/ui/component/ListItem.kt | 73 +- .../core/ui/component/MainAppBar.kt | 2 +- .../meshtastic/core/ui/component/MenuFAB.kt | 32 +- .../ui/component/MeshtasticNavigationSuite.kt | 3 +- .../core/ui/component/RegularPreference.kt | 79 +- .../core/ui/component/SliderPreference.kt | 15 +- .../core/ui/component/SlidingSelector.kt | 389 ---- .../core/ui/component/SwitchPreference.kt | 36 +- .../ui/component/TimeTickWithLifecycle.kt | 26 - .../org/meshtastic/core/ui/emoji/EmojiData.kt | 2009 ----------------- .../core/ui/emoji/EmojiPickerDialog.kt | 272 ++- .../core/ui/emoji/EmojiPickerViewModel.kt | 34 +- .../core/ui/emoji/EmojiRepository.kt | 111 + .../org/meshtastic/core/ui/theme/Theme.kt | 10 +- .../org/meshtastic/core/ui/theme/Type.kt | 34 +- .../core/ui/emoji/EmojiPickerViewModelTest.kt | 5 +- .../meshtastic/core/ui/component/NoopStubs.kt | 4 - .../ui/component/TimeTickWithLifecycle.kt | 23 - .../ui/components/ConnectingDeviceInfo.kt | 7 +- .../ui/components/ConnectionActionButton.kt | 6 + .../ui/components/CurrentlyConnectedInfo.kt | 5 +- .../ui/components/DeviceListItem.kt | 7 +- .../ui/components/DeviceSectionHeader.kt | 7 +- .../feature/firmware/FirmwareUpdateScreen.kt | 8 +- .../map/component/MapControlsOverlay.kt | 6 +- .../component/MessageScreenComponents.kt | 20 +- .../feature/messaging/component/Reaction.kt | 11 +- .../messaging/ui/contact/ContactItem.kt | 5 +- .../feature/messaging/ui/contact/Contacts.kt | 9 +- .../node/component/AdministrationSection.kt | 7 +- .../node/component/CompassBottomSheet.kt | 9 +- .../feature/node/component/DeviceActions.kt | 4 +- .../feature/node/component/NodeContextMenu.kt | 19 +- .../node/component/NodeFilterTextField.kt | 111 +- .../feature/node/component/NotesSection.kt | 5 +- .../feature/node/detail/NodeDetailContent.kt | 7 +- .../feature/node/metrics/PowerMetrics.kt | 7 +- .../feature/settings/AboutScreen.kt | 5 +- .../settings/component/ExpressiveSection.kt | 5 +- .../settings/debugging/DebugFilters.kt | 10 +- .../feature/settings/debugging/DebugSearch.kt | 4 +- .../settings/filter/FilterSettingsScreen.kt | 7 +- .../wifiprovision/ui/WifiProvisionScreen.kt | 5 +- ...eenshotComposableAlert_Dark_d19fbf1f_0.png | Bin 61795 -> 64527 bytes ...enshotComposableAlert_Light_b29dc7a7_0.png | Bin 61966 -> 64742 bytes .../ScreenshotHtmlAlert_Dark_d19fbf1f_0.png | Bin 56683 -> 59797 bytes .../ScreenshotHtmlAlert_Light_b29dc7a7_0.png | Bin 56781 -> 60023 bytes .../ScreenshotIconAlert_Dark_d19fbf1f_0.png | Bin 56277 -> 58225 bytes .../ScreenshotIconAlert_Light_b29dc7a7_0.png | Bin 56437 -> 58258 bytes ...hotMultipleChoiceAlert_Dark_d19fbf1f_0.png | Bin 71598 -> 73616 bytes ...otMultipleChoiceAlert_Light_b29dc7a7_0.png | Bin 71412 -> 73559 bytes .../ScreenshotTextAlert_Dark_d19fbf1f_0.png | Bin 63569 -> 66559 bytes .../ScreenshotTextAlert_Light_b29dc7a7_0.png | Bin 63696 -> 66873 bytes .../ScreenshotChannelItem_Dark_d19fbf1f_0.png | Bin 7967 -> 7866 bytes ...ScreenshotChannelItem_Light_b29dc7a7_0.png | Bin 7772 -> 7690 bytes ...enshotListItemDisabled_Dark_d19fbf1f_0.png | Bin 3910 -> 3787 bytes ...nshotListItemDisabled_Light_b29dc7a7_0.png | Bin 3910 -> 3842 bytes .../ScreenshotListItem_Dark_d19fbf1f_0.png | Bin 3910 -> 3376 bytes .../ScreenshotListItem_Light_b29dc7a7_0.png | Bin 3910 -> 4063 bytes ...reenshotSwitchListItem_Dark_d19fbf1f_0.png | Bin 6171 -> 5720 bytes ...eenshotSwitchListItem_Light_b29dc7a7_0.png | Bin 6314 -> 6390 bytes .../ScreenshotIAQScale_Dark_d19fbf1f_0.png | Bin 51241 -> 58165 bytes .../ScreenshotIAQScale_Light_b29dc7a7_0.png | Bin 51241 -> 58165 bytes ...ionPrecisionPreference_Dark_d19fbf1f_0.png | Bin 25079 -> 26318 bytes ...onPrecisionPreference_Light_b29dc7a7_0.png | Bin 25043 -> 26038 bytes ...nshotRegularPreference_Dark_d19fbf1f_0.png | Bin 7782 -> 6512 bytes ...shotRegularPreference_Light_b29dc7a7_0.png | Bin 8246 -> 8156 bytes ...iderPreferenceDisabled_Dark_d19fbf1f_0.png | Bin 11267 -> 11764 bytes ...derPreferenceDisabled_Light_b29dc7a7_0.png | Bin 11282 -> 11761 bytes ...enshotSliderPreference_Dark_d19fbf1f_0.png | Bin 11447 -> 11956 bytes ...nshotSliderPreference_Light_b29dc7a7_0.png | Bin 11345 -> 11833 bytes ...enshotSwitchPreference_Dark_d19fbf1f_0.png | Bin 6712 -> 8008 bytes ...nshotSwitchPreference_Light_b29dc7a7_0.png | Bin 6705 -> 7796 bytes ...tTextDividerPreference_Dark_d19fbf1f_0.png | Bin 7362 -> 7235 bytes ...TextDividerPreference_Light_b29dc7a7_0.png | Bin 7169 -> 7055 bytes ...otConnectingDeviceInfo_Dark_d19fbf1f_0.png | Bin 24335 -> 26962 bytes ...tConnectingDeviceInfo_Light_b29dc7a7_0.png | Bin 24915 -> 26778 bytes ...reenshotDeviceListItem_Dark_d19fbf1f_0.png | Bin 12590 -> 12583 bytes ...eenshotDeviceListItem_Light_b29dc7a7_0.png | Bin 15353 -> 15345 bytes ...hotDeviceSectionHeader_Dark_d19fbf1f_0.png | Bin 4114 -> 4203 bytes ...otDeviceSectionHeader_Light_b29dc7a7_0.png | Bin 4706 -> 4834 bytes ...nshotEmptyStateContent_Dark_d19fbf1f_0.png | Bin 23961 -> 23937 bytes ...shotEmptyStateContent_Light_b29dc7a7_0.png | Bin 23525 -> 23484 bytes ...enshotFirmwareChecking_Dark_d19fbf1f_0.png | Bin 23523 -> 27850 bytes ...nshotFirmwareChecking_Light_b29dc7a7_0.png | Bin 23484 -> 26973 bytes ...shotFirmwareDisclaimer_Dark_d19fbf1f_0.png | Bin 82331 -> 96241 bytes ...hotFirmwareDisclaimer_Light_b29dc7a7_0.png | Bin 82576 -> 96588 bytes ...creenshotFirmwareError_Dark_d19fbf1f_0.png | Bin 29493 -> 29562 bytes ...reenshotFirmwareError_Light_b29dc7a7_0.png | Bin 29427 -> 29436 bytes ...nshotFirmwareVerifying_Dark_d19fbf1f_0.png | Bin 33364 -> 40019 bytes ...shotFirmwareVerifying_Light_b29dc7a7_0.png | Bin 33377 -> 39104 bytes ...creenshotWelcomeScreen_Dark_d19fbf1f_0.png | Bin 98938 -> 108253 bytes ...reenshotWelcomeScreen_Light_b29dc7a7_0.png | Bin 98946 -> 108133 bytes ...hotEditQuickChatDialog_Dark_d19fbf1f_0.png | Bin 31950 -> 34541 bytes ...otEditQuickChatDialog_Light_b29dc7a7_0.png | Bin 31985 -> 34687 bytes ...creenshotQuickChatItem_Dark_d19fbf1f_0.png | Bin 7679 -> 7881 bytes ...reenshotQuickChatItem_Light_b29dc7a7_0.png | Bin 7323 -> 7529 bytes ...hotDeviceActionsRemote_Dark_d19fbf1f_0.png | Bin 147582 -> 149734 bytes ...otDeviceActionsRemote_Light_b29dc7a7_0.png | Bin 148414 -> 150271 bytes ...deDetailContentLoading_Dark_d19fbf1f_0.png | Bin 16422 -> 19572 bytes ...eDetailContentLoading_Light_b29dc7a7_0.png | Bin 16407 -> 18997 bytes ...odeDetailContentRemote_Dark_d19fbf1f_0.png | Bin 132268 -> 134116 bytes ...deDetailContentRemote_Light_b29dc7a7_0.png | Bin 135280 -> 137240 bytes ...tPositionInlineContent_Dark_d19fbf1f_0.png | Bin 17757 -> 17225 bytes ...PositionInlineContent_Light_b29dc7a7_0.png | Bin 17321 -> 16795 bytes ...reenshotAppInfoSection_Dark_d19fbf1f_0.png | Bin 40957 -> 41229 bytes ...eenshotAppInfoSection_Light_b29dc7a7_0.png | Bin 40965 -> 40860 bytes ...nshotAppearanceSection_Dark_d19fbf1f_0.png | Bin 12874 -> 12837 bytes ...shotAppearanceSection_Light_b29dc7a7_0.png | Bin 12667 -> 12619 bytes ...shotPersistenceSection_Dark_d19fbf1f_0.png | Bin 32149 -> 32132 bytes ...hotPersistenceSection_Light_b29dc7a7_0.png | Bin 31773 -> 31678 bytes ...kServerSectionDisabled_Dark_d19fbf1f_0.png | Bin 27766 -> 28812 bytes ...ServerSectionDisabled_Light_b29dc7a7_0.png | Bin 27506 -> 28542 bytes ...akServerSectionEnabled_Dark_d19fbf1f_0.png | Bin 42840 -> 44876 bytes ...kServerSectionEnabled_Light_b29dc7a7_0.png | Bin 42564 -> 44607 bytes ...shotTakTestCardResults_Dark_d19fbf1f_0.png | Bin 42948 -> 42947 bytes ...hotTakTestCardResults_Light_b29dc7a7_0.png | Bin 42754 -> 42758 bytes ...shotTakTestCardRunning_Dark_d19fbf1f_0.png | Bin 29695 -> 29700 bytes ...hotTakTestCardRunning_Light_b29dc7a7_0.png | Bin 29437 -> 29439 bytes ...eenshotConnectedFailed_Dark_d19fbf1f_0.png | Bin 108637 -> 114402 bytes ...enshotConnectedFailed_Light_b29dc7a7_0.png | Bin 108004 -> 113817 bytes ...enshotConnectedSuccess_Dark_d19fbf1f_0.png | Bin 114920 -> 116492 bytes ...nshotConnectedSuccess_Light_b29dc7a7_0.png | Bin 113841 -> 115521 bytes ...tConnectedWithNetworks_Dark_d19fbf1f_0.png | Bin 99703 -> 104495 bytes ...ConnectedWithNetworks_Light_b29dc7a7_0.png | Bin 98995 -> 103953 bytes .../ScreenshotDeviceFound_Dark_d19fbf1f_0.png | Bin 48706 -> 49648 bytes ...ScreenshotDeviceFound_Light_b29dc7a7_0.png | Bin 48421 -> 49384 bytes .../ScreenshotNetworkRow_Dark_d19fbf1f_0.png | Bin 19075 -> 19426 bytes .../ScreenshotNetworkRow_Light_b29dc7a7_0.png | Bin 19089 -> 19462 bytes ...isionStatusCardSuccess_Dark_d19fbf1f_0.png | Bin 10178 -> 10980 bytes ...sionStatusCardSuccess_Light_b29dc7a7_0.png | Bin 10065 -> 10909 bytes .../ScreenshotScanningBle_Dark_d19fbf1f_0.png | Bin 23621 -> 23621 bytes ...ScreenshotScanningBle_Light_b29dc7a7_0.png | Bin 23604 -> 23604 bytes .../checklists/requirements.md | 37 + .../contracts/expressive-typography-api.md | 78 + .../contracts/swipe-to-reveal-api.md | 128 ++ .../data-model.md | 120 + .../plan.md | 118 + .../quickstart.md | 109 + .../research.md | 132 ++ .../spec.md | 136 ++ .../tasks.md | 86 + 161 files changed, 1864 insertions(+), 3053 deletions(-) delete mode 100644 core/ui/src/androidMain/kotlin/org/meshtastic/core/ui/component/TimeTickWithLifecycle.kt create mode 100644 core/ui/src/commonMain/composeResources/files/emoji-data.json delete mode 100644 core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/BottomSheetDialog.kt delete mode 100644 core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/ClickableTextField.kt delete mode 100644 core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/SlidingSelector.kt delete mode 100644 core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/TimeTickWithLifecycle.kt delete mode 100644 core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/emoji/EmojiData.kt create mode 100644 core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/emoji/EmojiRepository.kt delete mode 100644 core/ui/src/jvmMain/kotlin/org/meshtastic/core/ui/component/TimeTickWithLifecycle.kt create mode 100644 specs/20260513-160000-m3-expressive-adoption/checklists/requirements.md create mode 100644 specs/20260513-160000-m3-expressive-adoption/contracts/expressive-typography-api.md create mode 100644 specs/20260513-160000-m3-expressive-adoption/contracts/swipe-to-reveal-api.md create mode 100644 specs/20260513-160000-m3-expressive-adoption/data-model.md create mode 100644 specs/20260513-160000-m3-expressive-adoption/plan.md create mode 100644 specs/20260513-160000-m3-expressive-adoption/quickstart.md create mode 100644 specs/20260513-160000-m3-expressive-adoption/research.md create mode 100644 specs/20260513-160000-m3-expressive-adoption/spec.md create mode 100644 specs/20260513-160000-m3-expressive-adoption/tasks.md diff --git a/.github/agents/speckit.verify.run.agent.md b/.github/agents/speckit.verify.run.agent.md index 2ea0c3a85..dfd2e9f9f 100644 --- a/.github/agents/speckit.verify.run.agent.md +++ b/.github/agents/speckit.verify.run.agent.md @@ -34,7 +34,7 @@ Validate the implementation against its specification artifacts (`spec.md`, `pla Run `.specify/scripts/bash/check-prerequisites.sh --json --paths-only` from repo root. 1. **Script succeeds** (on a feature branch): Parse JSON for FEATURE_DIR. Set `FEATURE_BRANCH = true`. Proceed to next step. -2. **Script fails** (not on a feature branch): You MUST prompt for available features (Scan `specs/NNN-*/` to get available features). Use the **AskUserQuestion tool** to let the user select. **Do NOT guess or auto-select a change. Always let the user choose.** +2. **Script fails** (not on a feature branch): You MUST prompt for available features (Scan `specs/*/` to get available features). Use the **AskUserQuestion tool** to let the user select. **Do NOT guess or auto-select a change. Always let the user choose.** Derive absolute paths: diff --git a/.skills/speckit/SKILL.md b/.skills/speckit/SKILL.md index d546d9be6..badec3fbf 100644 --- a/.skills/speckit/SKILL.md +++ b/.skills/speckit/SKILL.md @@ -52,7 +52,7 @@ The standard SDD cycle for a new feature: ```text 1. /speckit.specify "Feature description here" - → Creates specs/-feature-name/spec.md + → Creates specs/-feature-name/spec.md → Auto-creates feature branch via git hook 2. /speckit.clarify @@ -85,11 +85,11 @@ This runs: specify → (review gate) → plan → (review gate) → tasks → im ## File Structure -Spec Kit produces files under `specs/-feature-name/`: +Spec Kit produces files under `specs/-feature-name/`: ``` specs/ -└── 001-feature-name/ +└── 20260513-160000-feature-name/ ├── spec.md # Feature specification (FRs, NFRs, SCs, user stories) ├── plan.md # Implementation plan (architecture, phases) ├── tasks.md # Dependency-ordered task list diff --git a/.specify/extensions/verify/commands/verify.md b/.specify/extensions/verify/commands/verify.md index bf43c326a..d14bf27b4 100644 --- a/.specify/extensions/verify/commands/verify.md +++ b/.specify/extensions/verify/commands/verify.md @@ -30,7 +30,7 @@ Validate the implementation against its specification artifacts (`spec.md`, `pla Run `{SCRIPT}` from repo root. 1. **Script succeeds** (on a feature branch): Parse JSON for FEATURE_DIR. Set `FEATURE_BRANCH = true`. Proceed to next step. -2. **Script fails** (not on a feature branch): You MUST prompt for available features (Scan `specs/NNN-*/` to get available features). Use the **AskUserQuestion tool** to let the user select. **Do NOT guess or auto-select a change. Always let the user choose.** +2. **Script fails** (not on a feature branch): You MUST prompt for available features (Scan `specs/*/` to get available features). Use the **AskUserQuestion tool** to let the user select. **Do NOT guess or auto-select a change. Always let the user choose.** Derive absolute paths: diff --git a/.specify/feature.json b/.specify/feature.json index c800a6321..b5d645344 100644 --- a/.specify/feature.json +++ b/.specify/feature.json @@ -1 +1 @@ -{"feature_directory":"specs/006-kmp-project-structure"} +{"feature_directory":"specs/20260513-160000-m3-expressive-adoption"} diff --git a/.specify/init-options.json b/.specify/init-options.json index e4fce1fc2..3d0c55bc7 100644 --- a/.specify/init-options.json +++ b/.specify/init-options.json @@ -1,6 +1,6 @@ { "ai": "opencode", - "branch_numbering": "sequential", + "branch_numbering": "timestamp", "context_file": "AGENTS.md", "here": true, "integration": "opencode", diff --git a/AGENTS.md b/AGENTS.md index f7d3bdcd6..83dd3aca2 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -49,5 +49,5 @@ You are an expert Android/KMP engineer. Maintain architectural boundaries, use M For additional context about technologies to be used, project structure, shell commands, and other important information, read the current plan -at `specs/006-kmp-project-structure/plan.md` +at `specs/20260513-160000-m3-expressive-adoption/plan.md` diff --git a/androidApp/src/fdroid/kotlin/org/meshtastic/app/map/MapView.kt b/androidApp/src/fdroid/kotlin/org/meshtastic/app/map/MapView.kt index da85fc950..cebaf3931 100644 --- a/androidApp/src/fdroid/kotlin/org/meshtastic/app/map/MapView.kt +++ b/androidApp/src/fdroid/kotlin/org/meshtastic/app/map/MapView.kt @@ -34,11 +34,13 @@ import androidx.compose.material3.AlertDialogDefaults import androidx.compose.material3.BasicAlertDialog import androidx.compose.material3.Checkbox import androidx.compose.material3.DropdownMenu +import androidx.compose.material3.DropdownMenuGroup import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.MenuDefaults import androidx.compose.material3.Scaffold import androidx.compose.material3.Slider import androidx.compose.material3.Surface @@ -723,69 +725,71 @@ private fun FdroidMainMapFilterDropdown( mapFilterState: MapFilterState, mapViewModel: MapViewModel, ) { + @OptIn(ExperimentalMaterial3ExpressiveApi::class) DropdownMenu( expanded = expanded, onDismissRequest = onDismissRequest, modifier = Modifier.background(MaterialTheme.colorScheme.surface), ) { - DropdownMenuItem( - text = { - Row(modifier = Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically) { - Icon( - imageVector = MeshtasticIcons.Favorite, - contentDescription = null, - modifier = Modifier.padding(end = 8.dp), - tint = MaterialTheme.colorScheme.onSurface, - ) - Text(text = stringResource(Res.string.only_favorites), modifier = Modifier.weight(1f)) - Checkbox( - checked = mapFilterState.onlyFavorites, - onCheckedChange = { mapViewModel.toggleOnlyFavorites() }, - modifier = Modifier.padding(start = 8.dp), - ) - } - }, - onClick = { mapViewModel.toggleOnlyFavorites() }, - ) - DropdownMenuItem( - text = { - Row(modifier = Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically) { - Icon( - imageVector = MeshtasticIcons.PinDrop, - contentDescription = null, - modifier = Modifier.padding(end = 8.dp), - tint = MaterialTheme.colorScheme.onSurface, - ) - Text(text = stringResource(Res.string.show_waypoints), modifier = Modifier.weight(1f)) - Checkbox( - checked = mapFilterState.showWaypoints, - onCheckedChange = { mapViewModel.toggleShowWaypointsOnMap() }, - modifier = Modifier.padding(start = 8.dp), - ) - } - }, - onClick = { mapViewModel.toggleShowWaypointsOnMap() }, - ) - DropdownMenuItem( - text = { - Row(modifier = Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically) { - Icon( - imageVector = MeshtasticIcons.Lens, - contentDescription = null, - modifier = Modifier.padding(end = 8.dp), - tint = MaterialTheme.colorScheme.onSurface, - ) - Text(text = stringResource(Res.string.show_precision_circle), modifier = Modifier.weight(1f)) - Checkbox( - checked = mapFilterState.showPrecisionCircle, - onCheckedChange = { mapViewModel.toggleShowPrecisionCircleOnMap() }, - modifier = Modifier.padding(start = 8.dp), - ) - } - }, - onClick = { mapViewModel.toggleShowPrecisionCircleOnMap() }, - ) - HorizontalDivider() + DropdownMenuGroup(shapes = MenuDefaults.groupShapes()) { + DropdownMenuItem( + text = { + Row(modifier = Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically) { + Icon( + imageVector = MeshtasticIcons.Favorite, + contentDescription = null, + modifier = Modifier.padding(end = 8.dp), + tint = MaterialTheme.colorScheme.onSurface, + ) + Text(text = stringResource(Res.string.only_favorites), modifier = Modifier.weight(1f)) + Checkbox( + checked = mapFilterState.onlyFavorites, + onCheckedChange = { mapViewModel.toggleOnlyFavorites() }, + modifier = Modifier.padding(start = 8.dp), + ) + } + }, + onClick = { mapViewModel.toggleOnlyFavorites() }, + ) + DropdownMenuItem( + text = { + Row(modifier = Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically) { + Icon( + imageVector = MeshtasticIcons.PinDrop, + contentDescription = null, + modifier = Modifier.padding(end = 8.dp), + tint = MaterialTheme.colorScheme.onSurface, + ) + Text(text = stringResource(Res.string.show_waypoints), modifier = Modifier.weight(1f)) + Checkbox( + checked = mapFilterState.showWaypoints, + onCheckedChange = { mapViewModel.toggleShowWaypointsOnMap() }, + modifier = Modifier.padding(start = 8.dp), + ) + } + }, + onClick = { mapViewModel.toggleShowWaypointsOnMap() }, + ) + DropdownMenuItem( + text = { + Row(modifier = Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically) { + Icon( + imageVector = MeshtasticIcons.Lens, + contentDescription = null, + modifier = Modifier.padding(end = 8.dp), + tint = MaterialTheme.colorScheme.onSurface, + ) + Text(text = stringResource(Res.string.show_precision_circle), modifier = Modifier.weight(1f)) + Checkbox( + checked = mapFilterState.showPrecisionCircle, + onCheckedChange = { mapViewModel.toggleShowPrecisionCircleOnMap() }, + modifier = Modifier.padding(start = 8.dp), + ) + } + }, + onClick = { mapViewModel.toggleShowPrecisionCircleOnMap() }, + ) + } Column(modifier = Modifier.padding(horizontal = 16.dp, vertical = 8.dp)) { val filterOptions = LastHeardFilter.entries val selectedIndex = filterOptions.indexOf(mapFilterState.lastHeardFilter) diff --git a/androidApp/src/google/kotlin/org/meshtastic/app/map/component/MapFilterDropdown.kt b/androidApp/src/google/kotlin/org/meshtastic/app/map/component/MapFilterDropdown.kt index 04112a411..8c8d63c2a 100644 --- a/androidApp/src/google/kotlin/org/meshtastic/app/map/component/MapFilterDropdown.kt +++ b/androidApp/src/google/kotlin/org/meshtastic/app/map/component/MapFilterDropdown.kt @@ -14,16 +14,20 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ +@file:OptIn(ExperimentalMaterial3ExpressiveApi::class) + package org.meshtastic.app.map.component import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.padding import androidx.compose.material3.Checkbox import androidx.compose.material3.DropdownMenu +import androidx.compose.material3.DropdownMenuGroup import androidx.compose.material3.DropdownMenuItem -import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.MenuDefaults import androidx.compose.material3.Slider import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -52,55 +56,56 @@ import kotlin.math.roundToInt internal fun MapFilterDropdown(expanded: Boolean, onDismissRequest: () -> Unit, mapViewModel: MapViewModel) { val mapFilterState by mapViewModel.mapFilterStateFlow.collectAsStateWithLifecycle() DropdownMenu(expanded = expanded, onDismissRequest = onDismissRequest) { - DropdownMenuItem( - text = { Text(stringResource(Res.string.only_favorites)) }, - onClick = { mapViewModel.toggleOnlyFavorites() }, - leadingIcon = { - Icon( - imageVector = MeshtasticIcons.Favorite, - contentDescription = stringResource(Res.string.only_favorites), - ) - }, - trailingIcon = { - Checkbox( - checked = mapFilterState.onlyFavorites, - onCheckedChange = { mapViewModel.toggleOnlyFavorites() }, - ) - }, - ) - DropdownMenuItem( - text = { Text(stringResource(Res.string.show_waypoints)) }, - onClick = { mapViewModel.toggleShowWaypointsOnMap() }, - leadingIcon = { - Icon( - imageVector = MeshtasticIcons.PinDrop, - contentDescription = stringResource(Res.string.show_waypoints), - ) - }, - trailingIcon = { - Checkbox( - checked = mapFilterState.showWaypoints, - onCheckedChange = { mapViewModel.toggleShowWaypointsOnMap() }, - ) - }, - ) - DropdownMenuItem( - text = { Text(stringResource(Res.string.show_precision_circle)) }, - onClick = { mapViewModel.toggleShowPrecisionCircleOnMap() }, - leadingIcon = { - Icon( - imageVector = MeshtasticIcons.Lens, - contentDescription = stringResource(Res.string.show_precision_circle), - ) - }, - trailingIcon = { - Checkbox( - checked = mapFilterState.showPrecisionCircle, - onCheckedChange = { mapViewModel.toggleShowPrecisionCircleOnMap() }, - ) - }, - ) - HorizontalDivider() + DropdownMenuGroup(shapes = MenuDefaults.groupShapes()) { + DropdownMenuItem( + text = { Text(stringResource(Res.string.only_favorites)) }, + onClick = { mapViewModel.toggleOnlyFavorites() }, + leadingIcon = { + Icon( + imageVector = MeshtasticIcons.Favorite, + contentDescription = stringResource(Res.string.only_favorites), + ) + }, + trailingIcon = { + Checkbox( + checked = mapFilterState.onlyFavorites, + onCheckedChange = { mapViewModel.toggleOnlyFavorites() }, + ) + }, + ) + DropdownMenuItem( + text = { Text(stringResource(Res.string.show_waypoints)) }, + onClick = { mapViewModel.toggleShowWaypointsOnMap() }, + leadingIcon = { + Icon( + imageVector = MeshtasticIcons.PinDrop, + contentDescription = stringResource(Res.string.show_waypoints), + ) + }, + trailingIcon = { + Checkbox( + checked = mapFilterState.showWaypoints, + onCheckedChange = { mapViewModel.toggleShowWaypointsOnMap() }, + ) + }, + ) + DropdownMenuItem( + text = { Text(stringResource(Res.string.show_precision_circle)) }, + onClick = { mapViewModel.toggleShowPrecisionCircleOnMap() }, + leadingIcon = { + Icon( + imageVector = MeshtasticIcons.Lens, + contentDescription = stringResource(Res.string.show_precision_circle), + ) + }, + trailingIcon = { + Checkbox( + checked = mapFilterState.showPrecisionCircle, + onCheckedChange = { mapViewModel.toggleShowPrecisionCircleOnMap() }, + ) + }, + ) + } Column(modifier = Modifier.padding(horizontal = 16.dp, vertical = 8.dp)) { val filterOptions = LastHeardFilter.entries val selectedIndex = filterOptions.indexOf(mapFilterState.lastHeardFilter) diff --git a/androidApp/src/google/kotlin/org/meshtastic/app/map/component/MapTypeDropdown.kt b/androidApp/src/google/kotlin/org/meshtastic/app/map/component/MapTypeDropdown.kt index a2a1edb3c..a649e2962 100644 --- a/androidApp/src/google/kotlin/org/meshtastic/app/map/component/MapTypeDropdown.kt +++ b/androidApp/src/google/kotlin/org/meshtastic/app/map/component/MapTypeDropdown.kt @@ -14,12 +14,16 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ +@file:OptIn(ExperimentalMaterial3ExpressiveApi::class) + package org.meshtastic.app.map.component import androidx.compose.material3.DropdownMenu +import androidx.compose.material3.DropdownMenuGroup import androidx.compose.material3.DropdownMenuItem -import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi import androidx.compose.material3.Icon +import androidx.compose.material3.MenuDefaults import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue @@ -58,38 +62,16 @@ internal fun MapTypeDropdown( ) DropdownMenu(expanded = expanded, onDismissRequest = onDismissRequest) { - googleMapTypes.forEach { (name, type) -> - DropdownMenuItem( - text = { Text(name) }, - onClick = { - mapViewModel.setSelectedGoogleMapType(type) - onDismissRequest() // Close menu - }, - trailingIcon = - if (selectedCustomUrl == null && selectedGoogleMapType == type) { - { - Icon( - MeshtasticIcons.Check, - contentDescription = stringResource(Res.string.selected_map_type), - ) - } - } else { - null - }, - ) - } - - if (customTileProviders.isNotEmpty()) { - HorizontalDivider() - customTileProviders.forEach { config -> + DropdownMenuGroup(shapes = MenuDefaults.groupShapes()) { + googleMapTypes.forEach { (name, type) -> DropdownMenuItem( - text = { Text(config.name) }, + text = { Text(name) }, onClick = { - mapViewModel.selectCustomTileProvider(config) - onDismissRequest() // Close menu + mapViewModel.setSelectedGoogleMapType(type) + onDismissRequest() }, trailingIcon = - if (selectedCustomUrl == config.urlTemplate) { + if (selectedCustomUrl == null && selectedGoogleMapType == type) { { Icon( MeshtasticIcons.Check, @@ -102,7 +84,31 @@ internal fun MapTypeDropdown( ) } } - HorizontalDivider() + + if (customTileProviders.isNotEmpty()) { + DropdownMenuGroup(shapes = MenuDefaults.groupShapes()) { + customTileProviders.forEach { config -> + DropdownMenuItem( + text = { Text(config.name) }, + onClick = { + mapViewModel.selectCustomTileProvider(config) + onDismissRequest() + }, + trailingIcon = + if (selectedCustomUrl == config.urlTemplate) { + { + Icon( + MeshtasticIcons.Check, + contentDescription = stringResource(Res.string.selected_map_type), + ) + } + } else { + null + }, + ) + } + } + } DropdownMenuItem( text = { Text(stringResource(Res.string.manage_custom_tile_sources)) }, onClick = { diff --git a/core/prefs/src/commonMain/kotlin/org/meshtastic/core/prefs/emoji/CustomEmojiPrefsImpl.kt b/core/prefs/src/commonMain/kotlin/org/meshtastic/core/prefs/emoji/CustomEmojiPrefsImpl.kt index b88994571..5c05e31d7 100644 --- a/core/prefs/src/commonMain/kotlin/org/meshtastic/core/prefs/emoji/CustomEmojiPrefsImpl.kt +++ b/core/prefs/src/commonMain/kotlin/org/meshtastic/core/prefs/emoji/CustomEmojiPrefsImpl.kt @@ -19,6 +19,7 @@ package org.meshtastic.core.prefs.emoji import androidx.datastore.core.DataStore import androidx.datastore.preferences.core.Preferences import androidx.datastore.preferences.core.edit +import androidx.datastore.preferences.core.intPreferencesKey import androidx.datastore.preferences.core.stringPreferencesKey import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.SupervisorJob @@ -42,6 +43,9 @@ class CustomEmojiPrefsImpl( override val customEmojiFrequency: StateFlow = dataStore.data.map { it[KEY_EMOJI_FREQ_PREF] }.stateIn(scope, SharingStarted.Eagerly, null) + override val preferredSkinToneIndex: StateFlow = + dataStore.data.map { it[KEY_SKIN_TONE_PREF] ?: 0 }.stateIn(scope, SharingStarted.Eagerly, 0) + override fun setCustomEmojiFrequency(frequency: String?) { scope.launch { dataStore.edit { prefs -> @@ -54,8 +58,13 @@ class CustomEmojiPrefsImpl( } } + override fun setPreferredSkinToneIndex(index: Int) { + scope.launch { dataStore.edit { prefs -> prefs[KEY_SKIN_TONE_PREF] = index } } + } + companion object { const val KEY_EMOJI_FREQ = "pref_key_custom_emoji_freq" val KEY_EMOJI_FREQ_PREF = stringPreferencesKey(KEY_EMOJI_FREQ) + val KEY_SKIN_TONE_PREF = intPreferencesKey("pref_key_skin_tone") } } diff --git a/core/repository/src/commonMain/kotlin/org/meshtastic/core/repository/AppPreferences.kt b/core/repository/src/commonMain/kotlin/org/meshtastic/core/repository/AppPreferences.kt index bcbaad63b..92f9381e3 100644 --- a/core/repository/src/commonMain/kotlin/org/meshtastic/core/repository/AppPreferences.kt +++ b/core/repository/src/commonMain/kotlin/org/meshtastic/core/repository/AppPreferences.kt @@ -65,8 +65,11 @@ interface MeshLogPrefs { /** Reactive interface for emoji preferences. */ interface CustomEmojiPrefs { val customEmojiFrequency: StateFlow + val preferredSkinToneIndex: StateFlow fun setCustomEmojiFrequency(frequency: String?) + + fun setPreferredSkinToneIndex(index: Int) } /** Reactive interface for general UI preferences. */ diff --git a/core/testing/src/commonMain/kotlin/org/meshtastic/core/testing/FakeAppPreferences.kt b/core/testing/src/commonMain/kotlin/org/meshtastic/core/testing/FakeAppPreferences.kt index 5cb6f5ce1..7122b1cc9 100644 --- a/core/testing/src/commonMain/kotlin/org/meshtastic/core/testing/FakeAppPreferences.kt +++ b/core/testing/src/commonMain/kotlin/org/meshtastic/core/testing/FakeAppPreferences.kt @@ -64,10 +64,15 @@ class FakeFilterPrefs : FilterPrefs { class FakeCustomEmojiPrefs : CustomEmojiPrefs { override val customEmojiFrequency = MutableStateFlow(null) + override val preferredSkinToneIndex = MutableStateFlow(0) override fun setCustomEmojiFrequency(frequency: String?) { customEmojiFrequency.value = frequency } + + override fun setPreferredSkinToneIndex(index: Int) { + preferredSkinToneIndex.value = index + } } @Suppress("TooManyFunctions") diff --git a/core/ui/build.gradle.kts b/core/ui/build.gradle.kts index 5453ea2f2..fc48e919a 100644 --- a/core/ui/build.gradle.kts +++ b/core/ui/build.gradle.kts @@ -18,6 +18,7 @@ plugins { alias(libs.plugins.meshtastic.kmp.library) alias(libs.plugins.meshtastic.kmp.library.compose) + alias(libs.plugins.meshtastic.kotlinx.serialization) id("meshtastic.kmp.jvm.android") id("meshtastic.koin") } @@ -44,6 +45,7 @@ kotlin { api(libs.compose.multiplatform.ui.tooling.preview) implementation(libs.kermit) + implementation(libs.kotlinx.serialization.json) implementation(libs.koin.compose.viewmodel) implementation(libs.qrcode.kotlin) implementation(libs.jetbrains.compose.material3.adaptive) diff --git a/core/ui/src/androidMain/kotlin/org/meshtastic/core/ui/component/TimeTickWithLifecycle.kt b/core/ui/src/androidMain/kotlin/org/meshtastic/core/ui/component/TimeTickWithLifecycle.kt deleted file mode 100644 index 7912c05b6..000000000 --- a/core/ui/src/androidMain/kotlin/org/meshtastic/core/ui/component/TimeTickWithLifecycle.kt +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (c) 2026 Meshtastic LLC - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package org.meshtastic.core.ui.component - -import android.content.BroadcastReceiver -import android.content.Context -import android.content.Intent -import android.content.IntentFilter -import androidx.compose.runtime.Composable -import androidx.compose.runtime.DisposableEffect -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableLongStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue -import androidx.compose.ui.platform.LocalContext -import org.meshtastic.core.common.util.nowMillis - -@Composable -actual fun rememberTimeTickWithLifecycle(): Long { - val context = LocalContext.current - var value by remember { mutableLongStateOf(nowMillis) } - - DisposableEffect(context) { - val receiver = - object : BroadcastReceiver() { - override fun onReceive(context: Context, intent: Intent) { - value = nowMillis - } - } - - androidx.core.content.ContextCompat.registerReceiver( - context, - receiver, - IntentFilter(Intent.ACTION_TIME_TICK), - androidx.core.content.ContextCompat.RECEIVER_NOT_EXPORTED, - ) - - onDispose { context.unregisterReceiver(receiver) } - } - - return value -} diff --git a/core/ui/src/commonMain/composeResources/files/emoji-data.json b/core/ui/src/commonMain/composeResources/files/emoji-data.json new file mode 100644 index 000000000..918c06cc6 --- /dev/null +++ b/core/ui/src/commonMain/composeResources/files/emoji-data.json @@ -0,0 +1 @@ +{"version":"16.0","categories":[{"name":"Smileys & Emotion","icon":"😀","emojis":[{"b":"😀","k":["cheerful","cheery","face","grin","grinning","happy","laugh","nice","smile","smiling","teeth"]},{"b":"😃","k":["awesome","big","eyes","face","grin","grinning","haha","happy","joy","mouth","open","smile","smiley","smiling","teeth","with","yay"]},{"b":"😄","k":["eye","eyes","face","grin","grinning","happy","joy","laugh","lol","mouth","open","pleased","smile","smiling","with"]},{"b":"😁","k":["beaming","eye","eyes","face","grin","grinning","happy","nice","smile","smiling","teeth","with"]},{"b":"😆","k":["closed","eyes","face","grinning","haha","hahaha","happy","laugh","laughing","lol","mouth","open","rofl","satisfied","smile","smiling","squinting"]},{"b":"😅","k":["cold","dejected","excited","face","grinning","hot","mouth","nervous","open","smile","smiling","stress","stressed","sweat","with"]},{"b":"🤣","k":["crying","face","floor","funny","haha","happy","hehe","hilarious","joy","laugh","laughing","lmao","lol","rofl","roflmao","rolling","tear","the"]},{"b":"😂","k":["crying","face","feels","funny","haha","happy","hehe","hilarious","joy","laugh","lmao","lol","rofl","roflmao","tear","tears","with"]},{"b":"🙂","k":["face","happy","slightly","smile","smiling"]},{"b":"🙃","k":["down","face","hehe","smile","upside","upside-down"]},{"b":"🫠","k":["disappear","dissolve","dread","embarrassed","face","haha","heat","hot","liquid","lol","melt","melting","sarcasm","sarcastic"]},{"b":"😉","k":["face","flirt","heartbreaker","sexy","slide","tease","wink","winking","winks"]},{"b":"😊","k":["blush","eye","eyes","face","glad","proud","satisfied","smile","smiling","with"]},{"b":"😇","k":["angel","angelic","angels","blessed","face","fairy","fairytale","fantasy","halo","happy","innocent","peaceful","smile","smiling","spirit","tale","with"]},{"b":"🥰","k":["3","adore","crush","face","heart","hearts","ily","love","romance","smile","smiling","three","with","you"]},{"b":"😍","k":["143","bae","crush","eye","eyes","face","feels","heart","heart-eyes","hearts","ily","kisses","love","romance","romantic","smile","smiling","with","xoxo"]},{"b":"🤩","k":["excited","eyes","face","grinning","smile","star","star-struck","starry-eyed","struck","wow"]},{"b":"😘","k":["adorbs","bae","blowing","face","flirt","heart","ily","kiss","kissing","love","lover","miss","muah","romantic","smooch","xoxo","you"]},{"b":"😗","k":["143","date","dating","face","flirt","ily","kiss","kissing","love","smooch","smooches","xoxo","you"]},{"b":"☺️","k":["blush","face","pleased","relaxed","smiling"]},{"b":"😚","k":["143","bae","blush","closed","date","dating","eye","eyes","face","flirt","ily","kisses","kissing","smooches","with","xoxo"]},{"b":"😙","k":["143","closed","date","dating","eye","eyes","face","flirt","ily","kiss","kisses","kissing","love","night","smile","smiling","with"]},{"b":"🥲","k":["face","glad","grateful","happy","joy","pain","proud","relieved","smile","smiley","smiling","tear","touched","with"]},{"b":"😋","k":["delicious","eat","face","food","full","hungry","lick","savor","savoring","smile","smiling","tasty","tongue","um","yum","yummy"]},{"b":"😛","k":["awesome","cool","face","nice","out","party","stuck","stuck-out","sweet","tongue","with"]},{"b":"😜","k":["crazy","epic","eye","face","funny","joke","loopy","nutty","out","party","prank","silly","stuck","stuck-out","tongue","wacky","weirdo","wink","winking","with","yolo"]},{"b":"🤪","k":["crazy","eye","eyes","face","goofy","large","small","wacky","zany"]},{"b":"😝","k":["closed","eye","eyes","face","gross","horrible","omg","out","prank","squinting","stuck","stuck-out","taste","tongue","whatever","with","yolo"]},{"b":"🤑","k":["face","money","money-mouth","mouth","paid","rich"]},{"b":"🤗","k":["face","hands","hug","hugging","hugs","open","smiling","with"]},{"b":"🤭","k":["face","giggle","giggling","hand","mouth","oops","over","quiet","realization","secret","shock","sudden","surprise","whoops","with"]},{"b":"🫢","k":["amazement","and","awe","disbelief","embarrass","eyes","face","gasp","hand","mouth","omg","open","over","quiet","scared","shock","surprise","with"]},{"b":"🫣","k":["captivated","embarrass","eye","face","hide","hiding","peek","peeking","peep","scared","shy","stare","with"]},{"b":"🤫","k":["face","quiet","shh","shush","shushing","silence"]},{"b":"🤔","k":["chin","consider","face","hmm","ponder","pondering","thinking","wondering"]},{"b":"🫡","k":["face","good","luck","ma’am","ok","respect","salute","saluting","sir","troops","yes"]},{"b":"🤐","k":["face","hush","keep","mouth","quiet","secret","shut","silence","zip","zipper","zipper-mouth"]},{"b":"🤨","k":["disapproval","disbelief","distrust","emoji","eyebrow","face","hmm","mild","raised","skeptic","skeptical","skepticism","surprise","suspicious","what","with"]},{"b":"😐","k":["awkward","blank","deadpan","expressionless","face","fine","jealous","meh","neutral","oh","shade","straight","unamused","unhappy","unimpressed","whatever"]},{"b":"😑","k":["awkward","dead","expressionless","face","fine","inexpressive","jealous","meh","not","oh","omg","straight","uh","unhappy","unimpressed","whatever"]},{"b":"😶","k":["awkward","blank","expressionless","face","mouth","mouthless","mute","no","quiet","secret","silence","silent","speechless","without"]},{"b":"🫥","k":["depressed","disappear","dotted","face","hidden","hide","introvert","invisible","line","meh","whatever","wtv"]},{"b":"😶‍🌫️","k":["clouds","face","in"]},{"b":"😏","k":["boss","dapper","face","flirt","homie","kidding","leer","shade","slick","sly","smirk","smirking","smug","snicker","suave","suspicious","swag"]},{"b":"😒","k":["...","bored","face","fine","jealous","jel","jelly","meh","pissed","smh","ugh","uhh","unamused","unhappy","weird","whatever"]},{"b":"🙄","k":["eyeroll","eyes","face","roll","rolling","shade","ugh","whatever","with"]},{"b":"😬","k":["awk","awkward","dentist","face","grimace","grimacing","grinning","smile","smiling"]},{"b":"😮‍💨","k":["blow","blowing","exhale","exhaling","exhausted","face","gasp","groan","relief","sigh","smiley","smoke","whisper","whistle"]},{"b":"🤥","k":["face","liar","lie","lying","pinocchio"]},{"b":"🫨","k":["crazy","daze","earthquake","face","omg","panic","shaking","shock","surprise","vibrate","whoa","wow"]},{"b":"😌","k":["calm","face","peace","relief","relieved","whew","zen"]},{"b":"😔","k":["awful","bored","dejected","died","disappointed","face","losing","lost","pensive","sad","sucks"]},{"b":"😪","k":["crying","face","good","night","sad","sleep","sleeping","sleepy","tired"]},{"b":"🤤","k":["drooling","face"]},{"b":"😴","k":["bed","bedtime","face","good","goodnight","nap","night","sleep","sleeping","tired","whatever","yawn","zzz"]},{"b":"😷","k":["cold","dentist","dermatologist","doctor","dr","face","germs","ill","mask","medical","medicine","sick","with"]},{"b":"🤒","k":["face","ill","sick","thermometer","with"]},{"b":"🤕","k":["bandage","face","head","head-bandage","hurt","injury","ouch","with"]},{"b":"🤢","k":["barf","disgusted","face","gross","nasty","nauseated","sick","vomit"]},{"b":"🤮","k":["barf","ew","face","gross","puke","sick","spew","throw","up","vomit","vomiting"]},{"b":"🤧","k":["achoo","face","fever","flu","gesundheit","sick","sneeze","sneezing"]},{"b":"🥵","k":["dying","face","feverish","heat","hot","panting","red-faced","stroke","sweating","tongue"]},{"b":"🥶","k":["blue","blue-faced","cold","face","freezing","frostbite","ice","icicles","subzero","teeth"]},{"b":"🥴","k":["dizzy","drunk","eyes","face","groggy","intoxicated","mouth","tipsy","uneven","wavy","woozy"]},{"b":"😵","k":["crossed-out","dead","dizzy","eyes","face","feels","knocked","out","sick","tired","with"]},{"b":"😵‍💫","k":["confused","dizzy","eyes","face","hypnotized","omg","smiley","spiral","trouble","whoa","with","woah","woozy"]},{"b":"🤯","k":["blown","explode","exploding","head","mind","mindblown","no","shocked","way"]},{"b":"🤠","k":["cowboy","cowgirl","face","hat"]},{"b":"🥳","k":["bday","birthday","celebrate","celebration","excited","face","happy","hat","hooray","horn","party","partying"]},{"b":"🥸","k":["disguise","disguised","eyebrow","face","glasses","incognito","moustache","mustache","nose","person","spy","tache","tash"]},{"b":"😎","k":["awesome","beach","bright","bro","chilling","cool","face","rad","relaxed","shades","slay","smile","smiling","style","sunglasses","swag","win","with"]},{"b":"🤓","k":["brainy","clever","expert","face","geek","gifted","glasses","intelligent","nerd","smart"]},{"b":"🧐","k":["classy","face","fancy","monocle","rich","stuffy","wealthy","with"]},{"b":"😕","k":["befuddled","confused","confusing","dunno","face","frown","hm","meh","not","sad","sorry","sure"]},{"b":"🫤","k":["confused","confusion","diagonal","disappointed","doubt","doubtful","face","frustrated","frustration","meh","mouth","skeptical","unsure","whatever","with","wtv"]},{"b":"😟","k":["anxious","butterflies","face","nerves","nervous","sad","stress","stressed","surprised","worried","worry"]},{"b":"🙁","k":["face","frown","frowning","sad","slightly"]},{"b":"☹️","k":["face","frowning"]},{"b":"😮","k":["believe","face","forgot","impressed","mouth","omg","open","shocked","surprise","surprised","sympathy","unbelievable","unreal","whoa","with","wow","you"]},{"b":"😯","k":["epic","face","hushed","omg","silence","speechless","stunned","surprised","whoa","woah"]},{"b":"😲","k":["amazed","astonished","cost","face","gasp","no","omg","shocked","totally","way"]},{"b":"😳","k":["amazed","awkward","crazy","dazed","dead","disbelief","embarrassed","face","flushed","geez","heat","hot","impressed","jeez","what","wow"]},{"b":"🥺","k":["begging","big","eyes","face","mercy","not","pleading","please","pretty","puppy","sad","why"]},{"b":"🥹","k":["admiration","aww","back","cry","embarrassed","face","feelings","grateful","gratitude","holding","joy","please","proud","resist","sad","tears"]},{"b":"😦","k":["caught","face","frown","frowning","guard","mouth","open","scared","scary","surprise","what","with","wow"]},{"b":"😧","k":["anguished","face","forgot","scared","scary","stressed","stunned","surprise","unhappy","what","wow"]},{"b":"😨","k":["afraid","anxious","blame","face","fear","fearful","oops","scared","shocked","worried"]},{"b":"😰","k":["anxious","blue","cold","eek","face","mouth","nervous","open","rushed","scared","sweat","with","yikes"]},{"b":"😥","k":["anxious","but","call","close","complicated","disappointed","face","nervous","not","phew","relieved","sad","sweat","time","whew"]},{"b":"😢","k":["awful","cry","crying","face","feels","miss","sad","tear","triste","unhappy"]},{"b":"😭","k":["bawling","cry","crying","face","loudly","sad","sob","tear","tears","unhappy"]},{"b":"😱","k":["epic","face","fear","fearful","horror","munch","scared","scream","screamer","screaming","shocked","surprised","woah"]},{"b":"😖","k":["annoyed","confounded","confused","cringe","distraught","face","feels","frustrated","mad","sad"]},{"b":"😣","k":["concentrate","concentration","face","focus","headache","persevere","persevering","struggling"]},{"b":"😞","k":["awful","blame","dejected","disappointed","face","fail","losing","sad","unhappy"]},{"b":"😓","k":["close","cold","downcast","face","feels","headache","nervous","sad","scared","sweat","with","yikes"]},{"b":"😩","k":["crying","face","fail","feels","hungry","mad","nooo","sad","sleepy","tired","unhappy","weary"]},{"b":"😫","k":["cost","face","feels","nap","sad","sneeze","tired","upset","whine"]},{"b":"🥱","k":["bedtime","bored","face","goodnight","nap","night","sleep","sleepy","tired","whatever","yawn","yawning","zzz"]},{"b":"😤","k":["anger","angry","face","feels","from","fume","fuming","furious","fury","mad","nose","smug","steam","triumph","unhappy","with","won"]},{"b":"😡","k":["anger","angry","enraged","face","feels","mad","maddening","pout","pouting","rage","red","shade","unhappy","upset"]},{"b":"😠","k":["anger","angry","annoyed","blame","face","feels","frustrated","mad","maddening","rage","shade","unhappy","upset"]},{"b":"🤬","k":["censor","cursing","cussing","face","foul","mad","mouth","pissed","swearing","symbols","with"]},{"b":"😈","k":["demon","devil","evil","face","fairy","fairytale","fantasy","horns","imp","purple","shade","smile","smiling","tale","with"]},{"b":"👿","k":["angry","demon","devil","evil","face","fairy","fairytale","fantasy","horns","imp","mischievous","purple","shade","tale","with"]},{"b":"💀","k":["body","danger","dead","death","face","fairy","fairytale","i’m","lmao","monster","poison","skull","tale","yolo"]},{"b":"☠️","k":["and","crossbones","danger","pirate","skull"]},{"b":"💩","k":["bs","comic","crap","doo","dung","face","fml","hankey","monster","pile","poo","poop","shit","smelly","smh","stink","stinks","stinky","turd"]},{"b":"🤡","k":["clown","face"]},{"b":"👹","k":["creature","devil","face","fairy","fairytale","fantasy","japanese","mask","monster","ogre","scary","tale"]},{"b":"👺","k":["angry","creature","face","fairy","fairytale","fantasy","goblin","japanese","mask","mean","monster","tale"]},{"b":"👻","k":["boo","creature","excited","face","fairy","fairytale","fantasy","ghost","halloween","haunting","monster","scary","silly","tale"]},{"b":"👽","k":["alien","creature","extraterrestrial","face","fairy","fairytale","fantasy","monster","space","tale","ufo"]},{"b":"👾","k":["alien","creature","extraterrestrial","face","fairy","fairytale","fantasy","game","gamer","games","invader","monster","pixelated","retro","space","tale","ufo"]},{"b":"🤖","k":["face","monster","robot"]},{"b":"😺","k":["animal","cat","face","grinning","mouth","open","smile","smiley","smiling"]},{"b":"😸","k":["animal","cat","eye","eyes","face","grin","grinning","smile","smiling","with"]},{"b":"😹","k":["animal","cat","face","joy","laugh","laughing","lol","tear","tears","with"]},{"b":"😻","k":["animal","cat","eye","eyes","face","heart","heart-eyes","love","smile","smiling","with"]},{"b":"😼","k":["animal","cat","face","ironic","smile","smirk","with","wry"]},{"b":"😽","k":["animal","cat","closed","eye","eyes","face","kiss","kissing"]},{"b":"🙀","k":["animal","cat","face","horror","oh","scream","surprised","weary"]},{"b":"😿","k":["animal","cat","cry","crying","face","sad","tear"]},{"b":"😾","k":["animal","cat","face","pouting"]},{"b":"🙈","k":["blind","embarrassed","evil","face","forbidden","forgot","gesture","hide","ignore","monkey","no","omg","prohibited","scared","secret","see","see-no-evil","smh","watch"]},{"b":"🙉","k":["animal","deaf","ears","evil","face","forbidden","gesture","hear","hear-no-evil","listen","monkey","no","not","prohibited","secret","shh","tmi"]},{"b":"🙊","k":["animal","evil","face","forbidden","gesture","hush","monkey","mute","no","not","oops","prohibited","quiet","secret","speak","speak-no-evil","stealth"]},{"b":"💌","k":["email","envelope","heart","letter","love","mail","romance","valentine"]},{"b":"💘","k":["143","adorbs","arrow","cupid","date","emotion","heart","ily","love","romance","valentine","with"]},{"b":"💝","k":["143","anniversary","chocolates","emotion","gift","heart","ily","kisses","ribbon","valentine","with","xoxo"]},{"b":"💖","k":["143","emotion","excited","good","heart","ily","kisses","morning","night","sparkle","sparkling","xoxo"]},{"b":"💗","k":["143","emotion","excited","growing","heart","heartpulse","ily","kisses","muah","nervous","pulse","xoxo"]},{"b":"💓","k":["143","beating","cardio","emotion","heart","heartbeat","ily","love","pulsating","pulse"]},{"b":"💞","k":["143","adorbs","anniversary","emotion","heart","hearts","revolving"]},{"b":"💕","k":["143","anniversary","date","dating","emotion","heart","hearts","ily","kisses","love","loving","two","xoxo"]},{"b":"💟","k":["143","decoration","emotion","heart","hearth","purple","white"]},{"b":"❣️","k":["exclamation","heart","heavy"]},{"b":"💔","k":["break","broken","crushed","emotion","heart","heartbroken","lonely","sad"]},{"b":"❤️‍🔥","k":["fire","heart","on"]},{"b":"❤️‍🩹","k":["heart","mending"]},{"b":"❤️","k":["heart","love","red"]},{"b":"🩷","k":["143","adorable","cute","emotion","heart","ily","like","love","pink","special","sweet"]},{"b":"🧡","k":["143","heart","orange"]},{"b":"💛","k":["143","cardiac","emotion","heart","ily","love","yellow"]},{"b":"💚","k":["143","emotion","green","heart","ily","love","romantic"]},{"b":"💙","k":["143","blue","emotion","heart","ily","love","romance"]},{"b":"🩵","k":["143","blue","cute","cyan","emotion","heart","ily","light","like","love","sky","special","teal"]},{"b":"💜","k":["143","bestest","emotion","heart","ily","love","purple"]},{"b":"🤎","k":["143","brown","heart"]},{"b":"🖤","k":["black","evil","heart","wicked"]},{"b":"🩶","k":["143","emotion","gray","grey","heart","ily","love","silver","slate","special"]},{"b":"🤍","k":["143","heart","white"]},{"b":"💋","k":["dating","emotion","heart","kiss","kissing","lips","lipstick","mark","romance","sexy"]},{"b":"💯","k":["100","a+","agree","clearly","definitely","faithful","fleek","full","hundred","keep","perfect","point","points","score","true","truth","yup"]},{"b":"💢","k":["anger","angry","comic","mad","symbol","upset"]},{"b":"💥","k":["bomb","boom","collide","collision","comic","explode"]},{"b":"💫","k":["comic","dizzy","shining","shooting","star","stars"]},{"b":"💦","k":["comic","drip","droplet","droplets","drops","splashing","squirt","sweat","water","wet","work","workout"]},{"b":"💨","k":["away","blow","cloud","comic","dash","dashing","fart","fast","go","gone","gotta","running","smoke","wind"]},{"b":"🕳️","k":["hole"]},{"b":"💬","k":["balloon","bubble","comic","comment","dialog","message","sms","speech","talk","text","typing"]},{"b":"👁️‍🗨️","k":["bubble","eye","speech"]},{"b":"🗨️","k":["bubble","left","speech"]},{"b":"🗯️","k":["anger","bubble","right"]},{"b":"💭","k":["balloon","bubble","cartoon","cloud","comic","daydream","decisions","dream","idea","invent","invention","realize","think","thinking","thought","thoughts","wonder"]},{"b":"💤","k":["comic","good","goodnight","night","sleep","sleeping","sleepy","tired","zzz"]}]},{"name":"People & Body","icon":"👋","emojis":[{"b":"👋","k":["bye","cya","g2g","goodbye","greetings","gtg","hand","hello","hey","hi","later","outtie","ttfn","ttyl","wave","waving","yo","you"],"s":true},{"b":"🤚","k":["back","backhand","hand","of","raised"],"s":true},{"b":"🖐️","k":["fingers","hand","raised","splayed","with"],"s":true},{"b":"✋","k":["5","five","hand","high","highfive","raised","stop"],"s":true},{"b":"🖖","k":["finger","hand","hands","prosper","salute","spock","vulcan"],"s":true},{"b":"🫱","k":["hand","handshake","hold","reach","right","rightward","rightwards","shake"],"s":true},{"b":"🫲","k":["hand","handshake","hold","left","leftward","leftwards","reach","shake"],"s":true},{"b":"🫳","k":["dismiss","down","drop","dropped","hand","palm","pick","shoo","up"],"s":true},{"b":"🫴","k":["beckon","catch","come","hand","hold","know","lift","me","offer","palm","tell","up"],"s":true},{"b":"🫷","k":["block","five","halt","hand","high","hold","leftward","leftwards","pause","push","pushing","refuse","slap","stop","wait"],"s":true},{"b":"🫸","k":["block","five","halt","hand","high","hold","pause","push","pushing","refuse","rightward","rightwards","slap","stop","wait"],"s":true},{"b":"👌","k":["awesome","bet","dope","fleek","fosho","got","gotcha","hand","legit","ok","okay","pinch","rad","sure","sweet","three"],"s":true},{"b":"🤌","k":["fingers","gesture","hand","hold","huh","interrogation","patience","pinched","relax","sarcastic","ugh","what","zip"],"s":true},{"b":"🤏","k":["amount","bit","fingers","hand","little","pinching","small","sort"],"s":true},{"b":"✌️","k":["hand","peace","v","victory"],"s":true},{"b":"🤞","k":["cross","crossed","finger","fingers","hand","hopeful","luck"],"s":true},{"b":"🫰","k":["<3","and","crossed","expensive","finger","hand","heart","index","love","money","snap","thumb","with"],"s":true},{"b":"🤟","k":["fingers","gesture","hand","ily","love","love-you","three","you"],"s":true},{"b":"🤘","k":["finger","hand","horns","metal","rock-on","sign","the"],"s":true},{"b":"🤙","k":["call","hand","hang","loose","me","shaka"],"s":true},{"b":"👈","k":["backhand","finger","hand","index","left","point","pointing"],"s":true},{"b":"👉","k":["backhand","finger","hand","index","point","pointing","right"],"s":true},{"b":"👆","k":["2","backhand","finger","hand","index","point","pointing","up"],"s":true},{"b":"🖕","k":["finger","fu","hand","middle"],"s":true},{"b":"👇","k":["backhand","down","finger","hand","index","point","pointing"],"s":true},{"b":"☝️","k":["index","point","pointing","up"],"s":true},{"b":"🫵","k":["at","finger","hand","index","pointing","poke","the","viewer","you"],"s":true},{"b":"👍","k":["+1","approve","good","hand","like","ok","thumb","thumbs","thumbsup","up","yes"],"s":true},{"b":"👎","k":["-1","bad","bury","disapprove","dislike","down","good","hand","no","nope","thumb","thumbs","thumbsdown"],"s":true},{"b":"✊","k":["clenched","fist","hand","power","punch","raised","solidarity"],"s":true},{"b":"👊","k":["absolutely","agree","attack","boom","bro","bruh","bump","clenched","correct","facepunch","fist","hand","knuckle","oncoming","pound","punch","rock","ttyl"],"s":true},{"b":"🤛","k":["fist","left","left-facing","leftwards"],"s":true},{"b":"🤜","k":["fist","right","right-facing","rightwards"],"s":true},{"b":"👏","k":["applause","approval","awesome","clap","clapping","congrats","congratulations","excited","good","great","hand","hands","homie","job","nice","praise","prayed","well","yay"],"s":true},{"b":"🙌","k":["celebration","gesture","hand","hands","hooray","praise","raised","raising"],"s":true},{"b":"🫶","k":["<3","hands","heart","love","you"],"s":true},{"b":"👐","k":["hand","hands","hug","jazz","open","swerve"],"s":true},{"b":"🤲","k":["cupped","dua","hands","palms","pray","prayer","together","up","wish"],"s":true},{"b":"🤝","k":["agreement","deal","hand","handshake","meeting","shake"],"s":true},{"b":"🙏","k":["appreciate","ask","beg","blessed","bow","cmon","five","folded","gesture","hand","hands","high","hope","please","pray","thanks","thx","wish"],"s":true},{"b":"✍️","k":["hand","writing"],"s":true},{"b":"💅","k":["beauty","bored","care","cosmetics","done","makeup","manicure","nail","polish","whatever"],"s":true},{"b":"🤳","k":["camera","phone","selfie"],"s":true},{"b":"💪","k":["arm","beast","bench","bicep","biceps","bodybuilder","bro","curls","flex","flexed","gains","gym","jacked","muscle","press","ripped","strong","weightlift","workout"],"s":true},{"b":"🦾","k":["accessibility","arm","mechanical","prosthetic"]},{"b":"🦿","k":["accessibility","leg","mechanical","prosthetic"]},{"b":"🦵","k":["bent","foot","kick","knee","leg","limb"],"s":true},{"b":"🦶","k":["ankle","feet","foot","kick","stomp"],"s":true},{"b":"👂","k":["body","ear","ears","hear","hearing","listen","listening","sound"],"s":true},{"b":"🦻","k":["accessibility","aid","ear","hard","hearing","with"],"s":true},{"b":"👃","k":["body","nose","noses","nosey","odor","smell","smells"],"s":true},{"b":"🧠","k":["brain","intelligent","smart"]},{"b":"🫀","k":["anatomical","beat","cardiology","heart","heartbeat","organ","pulse","real","red"]},{"b":"🫁","k":["breath","breathe","exhalation","inhalation","lung","lungs","organ","respiration"]},{"b":"🦷","k":["dentist","pearly","teeth","tooth","white"]},{"b":"🦴","k":["bone","bones","dog","skeleton","wishbone"]},{"b":"👀","k":["body","eye","eyes","face","googly","look","looking","omg","peep","see","seeing","watch"]},{"b":"👁️","k":["eye"]},{"b":"👅","k":["body","lick","slurp","taste","tongue"]},{"b":"👄","k":["beauty","body","kiss","kissing","lips","lipstick","mouth"]},{"b":"🫦","k":["anxious","bite","biting","fear","flirt","flirting","kiss","lip","lipstick","nervous","sexy","uncomfortable","worried","worry"]},{"b":"👶","k":["babies","baby","child","children","goo","infant","newborn","pregnant","young"],"s":true},{"b":"🧒","k":["bright-eyed","child","grandchild","kid","young","younger"],"s":true},{"b":"👦","k":["boy","bright-eyed","child","grandson","kid","son","young","younger"],"s":true},{"b":"👧","k":["bright-eyed","child","daughter","girl","granddaughter","kid","virgo","young","younger","zodiac"],"s":true},{"b":"🧑","k":["adult","person"],"s":true},{"b":"👱","k":["blond","blond-haired","hair","haired","human","person","person:"],"s":true},{"b":"👨","k":["adult","bro","dad","father","man","mustache"],"s":true},{"b":"🧔","k":["beard","bearded","person","person:","whiskers"],"s":true},{"b":"🧔‍♂️","k":["beard","man","man:"],"s":true},{"b":"🧔‍♀️","k":["beard","woman","woman:"],"s":true},{"b":"👨‍🦰","k":["hair","haired","man","man:","red"],"s":true},{"b":"👨‍🦱","k":["curly","hair","haired","man","man:"],"s":true},{"b":"👨‍🦳","k":["hair","haired","man","man:","white"],"s":true},{"b":"👨‍🦲","k":["bald","man","man:"],"s":true},{"b":"👩","k":["adult","girls","lady","woman"],"s":true},{"b":"👩‍🦰","k":["hair","haired","red","woman","woman:"],"s":true},{"b":"🧑‍🦰","k":["hair","person","person:","red"],"s":true},{"b":"👩‍🦱","k":["curly","hair","haired","woman","woman:"],"s":true},{"b":"🧑‍🦱","k":["curly","hair","person","person:"],"s":true},{"b":"👩‍🦳","k":["hair","haired","white","woman","woman:"],"s":true},{"b":"🧑‍🦳","k":["hair","person","person:","white"],"s":true},{"b":"👩‍🦲","k":["bald","woman","woman:"],"s":true},{"b":"🧑‍🦲","k":["bald","person","person:"],"s":true},{"b":"👱‍♀️","k":["blond","blonde","hair","haired","woman","woman:"],"s":true},{"b":"👱‍♂️","k":["blond","hair","haired","man","man:"],"s":true},{"b":"🧓","k":["adult","elderly","grandparent","old","older","person","wise"],"s":true},{"b":"👴","k":["adult","bald","elderly","gramps","grandfather","grandpa","man","old","older","wise"],"s":true},{"b":"👵","k":["adult","elderly","grandma","grandmother","granny","lady","old","older","wise","woman"],"s":true},{"b":"🙍","k":["annoyed","disappointed","disgruntled","disturbed","frown","frowning","frustrated","gesture","irritated","person","upset"],"s":true},{"b":"🙍‍♂️","k":["frowning","man"],"s":true},{"b":"🙍‍♀️","k":["frowning","woman"],"s":true},{"b":"🙎","k":["disappointed","downtrodden","face","frown","grimace","person","pouting","scowl","sulk","upset","whine"],"s":true},{"b":"🙎‍♂️","k":["man","pouting"],"s":true},{"b":"🙎‍♀️","k":["pouting","woman"],"s":true},{"b":"🙅","k":["denied","forbidden","gesture","gesturing","good","halt","hand","no","not","person","prohibit","stop"],"s":true},{"b":"🙅‍♂️","k":["denied","gesturing","good","halt","man","ng","no","stop"],"s":true},{"b":"🙅‍♀️","k":["denied","gesturing","good","halt","ng","no","stop","woman"],"s":true},{"b":"🙆","k":["exercise","gesture","gesturing","hand","ok","omg","person"],"s":true},{"b":"🙆‍♂️","k":["gesturing","man","ok"],"s":true},{"b":"🙆‍♀️","k":["gesturing","ok","woman"],"s":true},{"b":"💁","k":["desk","fetch","flick","flip","gossip","hand","information","person","sarcasm","sarcastic","sassy","seriously","tipping","whatever"],"s":true},{"b":"💁‍♂️","k":["hand","information","man","sassy","tipping"],"s":true},{"b":"💁‍♀️","k":["hand","information","sassy","tipping","woman"],"s":true},{"b":"🙋","k":["gesture","hand","here","know","me","person","pick","question","raise","raising"],"s":true},{"b":"🙋‍♂️","k":["hand","man","raising"],"s":true},{"b":"🙋‍♀️","k":["hand","raising","woman"],"s":true},{"b":"🧏","k":["accessibility","deaf","ear","gesture","hear","person"],"s":true},{"b":"🧏‍♂️","k":["deaf","man"],"s":true},{"b":"🧏‍♀️","k":["deaf","woman"],"s":true},{"b":"🙇","k":["apology","ask","beg","bow","bowing","favor","forgive","gesture","meditate","meditation","person","pity","regret","respect","sorry","thanks"],"s":true},{"b":"🙇‍♂️","k":["bowing","man","respect","thanks"],"s":true},{"b":"🙇‍♀️","k":["bowing","respect","thanks","woman"],"s":true},{"b":"🤦","k":["again","bewilder","disbelief","exasperation","facepalm","facepalming","no","not","oh","omg","person","shock","smh"],"s":true},{"b":"🤦‍♂️","k":["facepalming","man"],"s":true},{"b":"🤦‍♀️","k":["facepalming","woman"],"s":true},{"b":"🤷","k":["doubt","dunno","guess","idk","ignorance","indifference","knows","maybe","person","shrug","shrugging","whatever","who"],"s":true},{"b":"🤷‍♂️","k":["man","shrugging"],"s":true},{"b":"🤷‍♀️","k":["shrugging","woman"],"s":true},{"b":"🧑‍⚕️","k":["health","worker"],"s":true},{"b":"👨‍⚕️","k":["doctor","health","man","nurse","worker"],"s":true},{"b":"👩‍⚕️","k":["doctor","health","nurse","woman","worker"],"s":true},{"b":"🧑‍🎓","k":["graduate","student"],"s":true},{"b":"👨‍🎓","k":["graduate","graduation","man","student"],"s":true},{"b":"👩‍🎓","k":["graduate","graduation","student","woman"],"s":true},{"b":"🧑‍🏫","k":["instructor","lecturer","professor","teacher"],"s":true},{"b":"👨‍🏫","k":["instructor","lecturer","man","professor","school","teacher"],"s":true},{"b":"👩‍🏫","k":["instructor","lecturer","professor","school","teacher","woman"],"s":true},{"b":"🧑‍⚖️","k":["judge"],"s":true},{"b":"👨‍⚖️","k":["judge","justice","man"],"s":true},{"b":"👩‍⚖️","k":["judge","justice","woman"],"s":true},{"b":"🧑‍🌾","k":["farmer","gardener","rancher"],"s":true},{"b":"👨‍🌾","k":["farmer","gardener","man","rancher"],"s":true},{"b":"👩‍🌾","k":["farmer","gardener","rancher","woman"],"s":true},{"b":"🧑‍🍳","k":["chef","cook"],"s":true},{"b":"👨‍🍳","k":["chef","cook","man"],"s":true},{"b":"👩‍🍳","k":["chef","cook","woman"],"s":true},{"b":"🧑‍🔧","k":["electrician","mechanic","plumber","tradesperson"],"s":true},{"b":"👨‍🔧","k":["electrician","man","mechanic","plumber","tradesperson"],"s":true},{"b":"👩‍🔧","k":["electrician","mechanic","plumber","tradesperson","woman"],"s":true},{"b":"🧑‍🏭","k":["assembly","factory","industrial","worker"],"s":true},{"b":"👨‍🏭","k":["assembly","factory","industrial","man","worker"],"s":true},{"b":"👩‍🏭","k":["assembly","factory","industrial","woman","worker"],"s":true},{"b":"🧑‍💼","k":["architect","business","manager","office","white-collar","worker"],"s":true},{"b":"👨‍💼","k":["architect","business","man","manager","office","white-collar","worker"],"s":true},{"b":"👩‍💼","k":["architect","business","manager","office","white-collar","woman","worker"],"s":true},{"b":"🧑‍🔬","k":["biologist","chemist","engineer","mathematician","physicist","scientist"],"s":true},{"b":"👨‍🔬","k":["biologist","chemist","engineer","man","mathematician","physicist","research","scientist"],"s":true},{"b":"👩‍🔬","k":["biologist","chemist","engineer","mathematician","physicist","research","scientist","woman"],"s":true},{"b":"🧑‍💻","k":["coder","computer","developer","inventor","software","technologist"],"s":true},{"b":"👨‍💻","k":["coder","computer","developer","inventor","man","software","technologist"],"s":true},{"b":"👩‍💻","k":["coder","computer","developer","inventor","software","technologist","woman"],"s":true},{"b":"🧑‍🎤","k":["actor","entertainer","rock","rockstar","singer","star"],"s":true},{"b":"👨‍🎤","k":["actor","entertainer","man","rock","rockstar","singer","star"],"s":true},{"b":"👩‍🎤","k":["actor","entertainer","rock","rockstar","singer","star","woman"],"s":true},{"b":"🧑‍🎨","k":["artist","palette"],"s":true},{"b":"👨‍🎨","k":["artist","man","painter","palette"],"s":true},{"b":"👩‍🎨","k":["artist","painter","palette","woman"],"s":true},{"b":"🧑‍✈️","k":["pilot"],"s":true},{"b":"👨‍✈️","k":["man","pilot"],"s":true},{"b":"👩‍✈️","k":["pilot","woman"],"s":true},{"b":"🧑‍🚀","k":["astronaut","rocket","space"],"s":true},{"b":"👨‍🚀","k":["astronaut","man","rocket","space"],"s":true},{"b":"👩‍🚀","k":["astronaut","rocket","space","woman"],"s":true},{"b":"🧑‍🚒","k":["fire","firefighter","firetruck"],"s":true},{"b":"👨‍🚒","k":["fire","firefighter","firetruck","man"],"s":true},{"b":"👩‍🚒","k":["fire","firefighter","firetruck","woman"],"s":true},{"b":"👮","k":["apprehend","arrest","citation","cop","law","officer","over","police","pulled","undercover"],"s":true},{"b":"👮‍♂️","k":["cop","law","man","officer","police","policeman"],"s":true},{"b":"👮‍♀️","k":["cop","law","officer","police","policewoman","woman"],"s":true},{"b":"🕵️","k":["detective","sleuth"],"s":true},{"b":"🕵️‍♂️","k":["detective","male","man","sleuth"],"s":true},{"b":"🕵️‍♀️","k":["detective","female","sleuth","woman"],"s":true},{"b":"💂","k":["buckingham","guard","helmet","london","palace"],"s":true},{"b":"💂‍♂️","k":["guard","guardsman","man"],"s":true},{"b":"💂‍♀️","k":["guard","guardswoman","woman"],"s":true},{"b":"🥷","k":["assassin","fight","fighter","hidden","ninja","person","secret","skills","sly","soldier","stealth","war"],"s":true},{"b":"👷","k":["build","construction","fix","hardhat","hat","helmet","man","person","rebuild","remodel","repair","work","worker"],"s":true},{"b":"👷‍♂️","k":["construction","helmet","man","worker"],"s":true},{"b":"👷‍♀️","k":["construction","helmet","woman","worker"],"s":true},{"b":"🫅","k":["crown","monarch","noble","person","regal","royal","royalty","with"],"s":true},{"b":"🤴","k":["crown","fairy","fairytale","fantasy","king","prince","royal","royalty","tale"],"s":true},{"b":"👸","k":["crown","fairy","fairytale","fantasy","princess","queen","royal","royalty","tale"],"s":true},{"b":"👳","k":["person","turban","wearing","with"],"s":true},{"b":"👳‍♂️","k":["man","turban","wearing","with"],"s":true},{"b":"👳‍♀️","k":["turban","wearing","with","woman"],"s":true},{"b":"👲","k":["cap","chinese","gua","guapi","hat","man","mao","person","pi","skullcap","with"],"s":true},{"b":"🧕","k":["bandana","head","headscarf","hijab","kerchief","mantilla","tichel","with","woman"],"s":true},{"b":"🤵","k":["formal","groom","in","marriage","person","tuxedo","wedding"],"s":true},{"b":"🤵‍♂️","k":["in","man","tuxedo"],"s":true},{"b":"🤵‍♀️","k":["in","tuxedo","woman"],"s":true},{"b":"👰","k":["marriage","person","veil","wedding","with"],"s":true},{"b":"👰‍♂️","k":["man","veil","with"],"s":true},{"b":"👰‍♀️","k":["bride","veil","with","woman"],"s":true},{"b":"🤰","k":["pregnant","woman"],"s":true},{"b":"🫃","k":["belly","bloated","full","man","overeat","pregnant"],"s":true},{"b":"🫄","k":["belly","bloated","full","overeat","person","pregnant","stuffed"],"s":true},{"b":"🤱","k":["baby","breast","breast-feeding","feeding","mom","mother","nursing","woman"],"s":true},{"b":"👩‍🍼","k":["baby","feed","feeding","mom","mother","nanny","newborn","nursing","woman"],"s":true},{"b":"👨‍🍼","k":["baby","dad","father","feed","feeding","man","nanny","newborn","nursing"],"s":true},{"b":"🧑‍🍼","k":["baby","feed","feeding","nanny","newborn","nursing","parent","person"],"s":true},{"b":"👼","k":["angel","baby","church","face","fairy","fairytale","fantasy","tale"],"s":true},{"b":"🎅","k":["celebration","christmas","claus","fairy","fantasy","father","holiday","merry","santa","tale","xmas"],"s":true},{"b":"🤶","k":["celebration","christmas","claus","fairy","fantasy","holiday","merry","mother","mrs","mrs.","santa","tale","xmas"],"s":true},{"b":"🧑‍🎄","k":["celebration","christmas","claus","fairy","fantasy","holiday","merry","mx","santa","tale","xmas"],"s":true},{"b":"🦸","k":["good","hero","superhero","superpower"],"s":true},{"b":"🦸‍♂️","k":["man","superhero"],"s":true},{"b":"🦸‍♀️","k":["superhero","woman"],"s":true},{"b":"🦹","k":["bad","criminal","evil","superpower","supervillain","villain"],"s":true},{"b":"🦹‍♂️","k":["man","supervillain"],"s":true},{"b":"🦹‍♀️","k":["supervillain","woman"],"s":true},{"b":"🧙","k":["fantasy","mage","magic","play","sorcerer","sorceress","sorcery","spell","summon","witch","wizard"],"s":true},{"b":"🧙‍♂️","k":["mage","man","wizard"],"s":true},{"b":"🧙‍♀️","k":["mage","wizard","woman"],"s":true},{"b":"🧚","k":["fairy","fairytale","fantasy","myth","person","pixie","tale","wings"],"s":true},{"b":"🧚‍♂️","k":["fairy","man"],"s":true},{"b":"🧚‍♀️","k":["fairy","woman"],"s":true},{"b":"🧛","k":["blood","dracula","fangs","halloween","scary","supernatural","teeth","undead","vampire"],"s":true},{"b":"🧛‍♂️","k":["man","vampire"],"s":true},{"b":"🧛‍♀️","k":["vampire","woman"],"s":true},{"b":"🧜","k":["creature","fairytale","folklore","merperson","ocean","sea","siren","trident"],"s":true},{"b":"🧜‍♂️","k":["merman"],"s":true},{"b":"🧜‍♀️","k":["mermaid"],"s":true},{"b":"🧝","k":["elf","elves","enchantment","fantasy","folklore","magic","magical","myth"],"s":true},{"b":"🧝‍♂️","k":["elf","man"],"s":true},{"b":"🧝‍♀️","k":["elf","woman"],"s":true},{"b":"🧞","k":["djinn","fantasy","genie","jinn","lamp","myth","rub","wishes"]},{"b":"🧞‍♂️","k":["genie","man"]},{"b":"🧞‍♀️","k":["genie","woman"]},{"b":"🧟","k":["apocalypse","dead","halloween","horror","scary","undead","walking","zombie"]},{"b":"🧟‍♂️","k":["man","zombie"]},{"b":"🧟‍♀️","k":["woman","zombie"]},{"b":"🧌","k":["fairy","fantasy","monster","tale","troll","trolling"]},{"b":"💆","k":["face","getting","headache","massage","person","relax","relaxing","salon","soothe","spa","tension","therapy","treatment"],"s":true},{"b":"💆‍♂️","k":["getting","man","massage","spa"],"s":true},{"b":"💆‍♀️","k":["getting","massage","spa","woman"],"s":true},{"b":"💇","k":["barber","beauty","chop","cosmetology","cut","getting","groom","hair","haircut","parlor","person","shears","style"],"s":true},{"b":"💇‍♂️","k":["getting","haircut","man"],"s":true},{"b":"💇‍♀️","k":["getting","haircut","woman"],"s":true},{"b":"🚶","k":["amble","gait","hike","man","pace","pedestrian","person","stride","stroll","walk","walking"],"s":true},{"b":"🚶‍♂️","k":["man","walking"],"s":true},{"b":"🚶‍♀️","k":["walking","woman"],"s":true},{"b":"🧍","k":["person","stand","standing"],"s":true},{"b":"🧍‍♂️","k":["man","standing"],"s":true},{"b":"🧍‍♀️","k":["standing","woman"],"s":true},{"b":"🧎","k":["kneel","kneeling","knees","person"],"s":true},{"b":"🧎‍♂️","k":["kneeling","man"],"s":true},{"b":"🧎‍♀️","k":["kneeling","woman"],"s":true},{"b":"🧑‍🦯","k":["accessibility","blind","cane","person","probing","white","with"],"s":true},{"b":"👨‍🦯","k":["accessibility","blind","cane","man","probing","white","with"],"s":true},{"b":"👩‍🦯","k":["accessibility","blind","cane","probing","white","with","woman"],"s":true},{"b":"🧑‍🦼","k":["accessibility","in","motorized","person","wheelchair"],"s":true},{"b":"👨‍🦼","k":["accessibility","in","man","motorized","wheelchair"],"s":true},{"b":"👩‍🦼","k":["accessibility","in","motorized","wheelchair","woman"],"s":true},{"b":"🧑‍🦽","k":["accessibility","in","manual","person","wheelchair"],"s":true},{"b":"👨‍🦽","k":["accessibility","in","man","manual","wheelchair"],"s":true},{"b":"👩‍🦽","k":["accessibility","in","manual","wheelchair","woman"],"s":true},{"b":"🏃","k":["exercise","fast","hurry","marathon","move","person","quick","race","racing","run","runner","running","rush","speed","workout"],"s":true},{"b":"🏃‍♂️","k":["exercise","man","marathon","running","workout"],"s":true},{"b":"🏃‍♀️","k":["exercise","marathon","running","woman","workout"],"s":true},{"b":"💃","k":["dance","dancer","dancing","dress","elegant","festive","flair","flamenco","groove","let’s","salsa","tango","woman"],"s":true},{"b":"🕺","k":["dance","dancer","dancing","elegant","festive","flair","flamenco","groove","let’s","man","salsa","tango"],"s":true},{"b":"🕴️","k":["business","levitating","person","suit"],"s":true},{"b":"👯","k":["bestie","bff","bunny","counterpart","dancer","dancers","double","ear","ears","identical","pair","party","partying","people","soulmate","twin","twinsies","with"]},{"b":"👯‍♂️","k":["bunny","dancing","ears","men","with"]},{"b":"👯‍♀️","k":["bunny","dancing","ears","with","women"]},{"b":"🧖","k":["day","luxurious","pamper","person","relax","room","sauna","spa","steam","steambath","steamy","unwind"],"s":true},{"b":"🧖‍♂️","k":["man","room","sauna","steamy"],"s":true},{"b":"🧖‍♀️","k":["room","sauna","steamy","woman"],"s":true},{"b":"🧗","k":["bouldering","climb","climber","climbing","mountain","person","rock","scale","up"],"s":true},{"b":"🧗‍♂️","k":["bouldering","climbing","man"],"s":true},{"b":"🧗‍♀️","k":["bouldering","climbing","woman"],"s":true},{"b":"🤺","k":["fencer","fencing","person","sword"]},{"b":"🏇","k":["horse","jockey","racehorse","racing","riding","sport"],"s":true},{"b":"⛷️","k":["skier"]},{"b":"🏂","k":["ski","snow","snowboard","snowboarder","sport"],"s":true},{"b":"🏌️","k":["golfing","person"],"s":true},{"b":"🏌️‍♂️","k":["golfing","man"],"s":true},{"b":"🏌️‍♀️","k":["golfing","woman"],"s":true},{"b":"🏄","k":["beach","ocean","person","sport","surf","surfer","surfing","swell","waves"],"s":true},{"b":"🏄‍♂️","k":["man","surfing"],"s":true},{"b":"🏄‍♀️","k":["surfing","woman"],"s":true},{"b":"🚣","k":["boat","canoe","cruise","fishing","lake","oar","paddle","person","raft","river","row","rowboat","rowing"],"s":true},{"b":"🚣‍♂️","k":["boat","man","rowing"],"s":true},{"b":"🚣‍♀️","k":["boat","rowing","woman"],"s":true},{"b":"🏊","k":["freestyle","person","sport","swim","swimmer","swimming","triathlon"],"s":true},{"b":"🏊‍♂️","k":["man","swimming"],"s":true},{"b":"🏊‍♀️","k":["swimming","woman"],"s":true},{"b":"⛹️","k":["ball","basketball","bouncing","person"],"s":true},{"b":"⛹️‍♂️","k":["ball","basketball","bouncing","man"],"s":true},{"b":"⛹️‍♀️","k":["ball","basketball","bouncing","woman"],"s":true},{"b":"🏋️","k":["gym","lifting","person","weight","weights","workout"],"s":true},{"b":"🏋️‍♂️","k":["gym","lifting","man","weight","weights","workout"],"s":true},{"b":"🏋️‍♀️","k":["gym","lifting","weight","weights","woman","workout"],"s":true},{"b":"🚴","k":["bicycle","bicyclist","bike","biking","cycle","cyclist","person","riding","sport"],"s":true},{"b":"🚴‍♂️","k":["biking","man"],"s":true},{"b":"🚴‍♀️","k":["biking","woman"],"s":true},{"b":"🚵","k":["bicycle","bicyclist","bike","biking","cycle","cyclist","mountain","person","riding","sport"],"s":true},{"b":"🚵‍♂️","k":["biking","man","mountain"],"s":true},{"b":"🚵‍♀️","k":["biking","mountain","woman"],"s":true},{"b":"🤸","k":["active","cartwheel","cartwheeling","excited","flip","gymnastics","happy","person","somersault"],"s":true},{"b":"🤸‍♂️","k":["cartwheeling","man"],"s":true},{"b":"🤸‍♀️","k":["cartwheeling","woman"],"s":true},{"b":"🤼","k":["combat","duel","grapple","people","ring","tournament","wrestle","wrestling"]},{"b":"🤼‍♂️","k":["men","wrestling"]},{"b":"🤼‍♀️","k":["women","wrestling"]},{"b":"🤽","k":["person","playing","polo","sport","swimming","water","waterpolo"],"s":true},{"b":"🤽‍♂️","k":["man","playing","polo","water"],"s":true},{"b":"🤽‍♀️","k":["playing","polo","water","woman"],"s":true},{"b":"🤾","k":["athletics","ball","catch","chuck","handball","hurl","lob","person","pitch","playing","sport","throw","toss"],"s":true},{"b":"🤾‍♂️","k":["handball","man","playing"],"s":true},{"b":"🤾‍♀️","k":["handball","playing","woman"],"s":true},{"b":"🤹","k":["act","balance","balancing","handle","juggle","juggling","manage","multitask","person","skill"],"s":true},{"b":"🤹‍♂️","k":["juggling","man"],"s":true},{"b":"🤹‍♀️","k":["juggling","woman"],"s":true},{"b":"🧘","k":["cross","legged","legs","lotus","meditation","peace","person","position","relax","serenity","yoga","yogi","zen"],"s":true},{"b":"🧘‍♂️","k":["lotus","man","meditation","position"],"s":true},{"b":"🧘‍♀️","k":["lotus","meditation","position","woman"],"s":true},{"b":"🛀","k":["bath","bathtub","person","shower","taking","tub"],"s":true},{"b":"🛌","k":["bed","bedtime","good","goodnight","hotel","nap","night","person","sleep","sleeping","tired","zzz"],"s":true},{"b":"🧑‍🤝‍🧑","k":["bae","bestie","bff","couple","date","dating","flirt","friends","hand","hands","hold","holding","people","twins"],"s":true},{"b":"👭","k":["bae","bestie","bff","couple","date","dating","flirt","friends","girls","hand","hands","hold","holding","sisters","twins","two","women"],"s":true},{"b":"👫","k":["and","bae","bestie","bff","couple","date","dating","flirt","friends","hand","hands","hold","holding","man","twins","woman"],"s":true},{"b":"👬","k":["bae","bestie","bff","boys","brothers","couple","date","dating","flirt","friends","hand","hands","hold","holding","men","twins","two"],"s":true},{"b":"💏","k":["anniversary","babe","bae","couple","couplekiss","date","dating","heart","kiss","love","mwah","person","romance","together","xoxo"],"s":true},{"b":"👩‍❤️‍💋‍👨","k":["couplekiss","kiss:","man","woman","woman,"],"s":true},{"b":"👨‍❤️‍💋‍👨","k":["couplekiss","kiss:","man","man,"],"s":true},{"b":"👩‍❤️‍💋‍👩","k":["couplekiss","kiss:","woman","woman,"],"s":true},{"b":"💑","k":["anniversary","babe","bae","couple","dating","heart","kiss","love","person","relationship","romance","together","with","you"],"s":true},{"b":"👩‍❤️‍👨","k":["couple","heart","heart:","man","with","woman","woman,"],"s":true},{"b":"👨‍❤️‍👨","k":["couple","heart","heart:","man","man,","with"],"s":true},{"b":"👩‍❤️‍👩","k":["couple","heart","heart:","with","woman","woman,"],"s":true},{"b":"👪","k":["child","family","home","parents"]},{"b":"👨‍👩‍👦","k":["boy","family","family:","man","man,","woman","woman,"]},{"b":"👨‍👩‍👧","k":["family","family:","girl","man","man,","woman","woman,"]},{"b":"👨‍👩‍👧‍👦","k":["boy","family","family:","girl","girl,","man","man,","woman","woman,"]},{"b":"👨‍👩‍👦‍👦","k":["boy","boy,","family","family:","man","man,","woman","woman,"]},{"b":"👨‍👩‍👧‍👧","k":["family","family:","girl","girl,","man","man,","woman","woman,"]},{"b":"👨‍👨‍👦","k":["boy","family","family:","man","man,"]},{"b":"👨‍👨‍👧","k":["family","family:","girl","man","man,"]},{"b":"👨‍👨‍👧‍👦","k":["boy","family","family:","girl","girl,","man","man,"]},{"b":"👨‍👨‍👦‍👦","k":["boy","boy,","family","family:","man","man,"]},{"b":"👨‍👨‍👧‍👧","k":["family","family:","girl","girl,","man","man,"]},{"b":"👩‍👩‍👦","k":["boy","family","family:","woman","woman,"]},{"b":"👩‍👩‍👧","k":["family","family:","girl","woman","woman,"]},{"b":"👩‍👩‍👧‍👦","k":["boy","family","family:","girl","girl,","woman","woman,"]},{"b":"👩‍👩‍👦‍👦","k":["boy","boy,","family","family:","woman","woman,"]},{"b":"👩‍👩‍👧‍👧","k":["family","family:","girl","girl,","woman","woman,"]},{"b":"👨‍👦","k":["boy","family","family:","man","man,"]},{"b":"👨‍👦‍👦","k":["boy","boy,","family","family:","man","man,"]},{"b":"👨‍👧","k":["family","family:","girl","man","man,"]},{"b":"👨‍👧‍👦","k":["boy","family","family:","girl","girl,","man","man,"]},{"b":"👨‍👧‍👧","k":["family","family:","girl","girl,","man","man,"]},{"b":"👩‍👦","k":["boy","family","family:","woman","woman,"]},{"b":"👩‍👦‍👦","k":["boy","boy,","family","family:","woman","woman,"]},{"b":"👩‍👧","k":["family","family:","girl","woman","woman,"]},{"b":"👩‍👧‍👦","k":["boy","family","family:","girl","girl,","woman","woman,"]},{"b":"👩‍👧‍👧","k":["family","family:","girl","girl,","woman","woman,"]},{"b":"🗣️","k":["head","speaking"]},{"b":"👤","k":["bust","in","mysterious","shadow","silhouette","user"]},{"b":"👥","k":["bff","bust","busts","everyone","friend","friends","group","in","people","silhouette","team","users"]},{"b":"🫂","k":["comfort","embrace","farewell","friendship","goodbye","hello","hug","hugging","love","people","thanks"]},{"b":"👣","k":["barefoot","clothing","feet","footprint","footprints","omw","print","tracks","walk"]}]},{"name":"Animals & Nature","icon":"🐾","emojis":[{"b":"🐵","k":["animal","banana","face","monkey"]},{"b":"🐒","k":["animal","banana","monkey"]},{"b":"🦍","k":["animal","gorilla"]},{"b":"🦧","k":["animal","ape","monkey","orangutan"]},{"b":"🐶","k":["adorbs","animal","dog","face","pet","puppies","puppy"]},{"b":"🐕","k":["animal","animals","dog","dog2","dogs","pet"]},{"b":"🦮","k":["accessibility","animal","blind","dog","guide"]},{"b":"🐕‍🦺","k":["accessibility","animal","assistance","dog","service"]},{"b":"🐩","k":["animal","dog","fluffy","poodle"]},{"b":"🐺","k":["animal","face","wolf"]},{"b":"🦊","k":["animal","face","fox"]},{"b":"🦝","k":["animal","curious","raccoon","sly"]},{"b":"🐱","k":["animal","cat","face","kitten","kitty","pet"]},{"b":"🐈","k":["animal","animals","cat","cat2","cats","kitten","pet"]},{"b":"🐈‍⬛","k":["animal","black","cat","feline","halloween","meow","unlucky"]},{"b":"🦁","k":["alpha","animal","face","leo","lion","mane","order","rawr","roar","safari","strong","zodiac"]},{"b":"🐯","k":["animal","big","cat","face","predator","tiger"]},{"b":"🐅","k":["animal","big","cat","predator","tiger","tiger2","zoo"]},{"b":"🐆","k":["animal","big","cat","leopard","predator","zoo"]},{"b":"🐴","k":["animal","dressage","equine","face","farm","horse","horses"]},{"b":"🫎","k":["alces","animal","antlers","canada","elk","mammal","moose"]},{"b":"🫏","k":["animal","ass","burro","donkey","hinny","mammal","mule","stubborn"]},{"b":"🐎","k":["animal","equestrian","farm","horse","racehorse","racing","speed"]},{"b":"🦄","k":["face","unicorn"]},{"b":"🦓","k":["animal","stripe","zebra"]},{"b":"🦌","k":["animal","deer"]},{"b":"🦬","k":["animal","bison","buffalo","herd","wisent"]},{"b":"🐮","k":["animal","cow","face","farm","milk","moo"]},{"b":"🐂","k":["animal","animals","bull","farm","ox","taurus","zodiac"]},{"b":"🐃","k":["animal","buffalo","water","zoo"]},{"b":"🐄","k":["animal","animals","cow","cow2","farm","milk","moo"]},{"b":"🐷","k":["animal","bacon","face","farm","pig","pork"]},{"b":"🐖","k":["animal","bacon","farm","pig","pig2","pork","sow"]},{"b":"🐗","k":["animal","boar","pig"]},{"b":"🐽","k":["animal","face","farm","nose","pig","smell","snout"]},{"b":"🐏","k":["animal","aries","horns","male","ram","sheep","zodiac","zoo"]},{"b":"🐑","k":["animal","baa","ewe","farm","female","fluffy","lamb","sheep","wool"]},{"b":"🐐","k":["animal","capricorn","farm","goat","milk","zodiac"]},{"b":"🐪","k":["animal","camel","desert","dromedary","hump","one"]},{"b":"🐫","k":["animal","bactrian","camel","desert","hump","two","two-hump"]},{"b":"🦙","k":["alpaca","animal","guanaco","llama","vicuña","wool"]},{"b":"🦒","k":["animal","giraffe","spots"]},{"b":"🐘","k":["animal","elephant"]},{"b":"🦣","k":["animal","extinction","large","mammoth","tusk","wooly"]},{"b":"🦏","k":["animal","rhinoceros"]},{"b":"🦛","k":["animal","hippo","hippopotamus"]},{"b":"🐭","k":["animal","face","mouse"]},{"b":"🐁","k":["animal","animals","mouse","mouse2"]},{"b":"🐀","k":["animal","rat"]},{"b":"🐹","k":["animal","face","hamster","pet"]},{"b":"🐰","k":["animal","bunny","face","pet","rabbit"]},{"b":"🐇","k":["animal","bunny","pet","rabbit","rabbit2"]},{"b":"🐿️","k":["chipmunk"]},{"b":"🦫","k":["animal","beaver","dam","teeth"]},{"b":"🦔","k":["animal","hedgehog","spiny"]},{"b":"🦇","k":["animal","bat","vampire"]},{"b":"🐻","k":["animal","bear","face","grizzly","growl","honey"]},{"b":"🐻‍❄️","k":["bear","polar"]},{"b":"🐨","k":["animal","australia","bear","down","face","koala","marsupial","under"]},{"b":"🐼","k":["animal","bamboo","face","panda"]},{"b":"🦥","k":["lazy","sloth","slow"]},{"b":"🦦","k":["animal","fishing","otter","playful"]},{"b":"🦨","k":["animal","skunk","stink"]},{"b":"🦘","k":["animal","joey","jump","kangaroo","marsupial"]},{"b":"🦡","k":["animal","badger","honey","pester"]},{"b":"🐾","k":["feet","paw","paws","print","prints"]},{"b":"🦃","k":["bird","gobble","thanksgiving","turkey"]},{"b":"🐔","k":["animal","bird","chicken","ornithology"]},{"b":"🐓","k":["animal","bird","ornithology","rooster"]},{"b":"🐣","k":["animal","baby","bird","chick","egg","hatching"]},{"b":"🐤","k":["animal","baby","bird","chick","ornithology"]},{"b":"🐥","k":["animal","baby","bird","chick","front-facing","hatched","newborn","ornithology"]},{"b":"🐦","k":["animal","bird","ornithology"]},{"b":"🐧","k":["animal","antarctica","bird","ornithology","penguin"]},{"b":"🕊️","k":["dove","peace"]},{"b":"🦅","k":["animal","bird","eagle","ornithology"]},{"b":"🦆","k":["animal","bird","duck","ornithology"]},{"b":"🦢","k":["animal","bird","cygnet","duckling","ornithology","swan","ugly"]},{"b":"🦉","k":["animal","bird","ornithology","owl","wise"]},{"b":"🦤","k":["animal","bird","dodo","extinction","large","ornithology"]},{"b":"🪶","k":["bird","feather","flight","light","plumage"]},{"b":"🦩","k":["animal","bird","flamboyant","flamingo","ornithology","tropical"]},{"b":"🦚","k":["animal","bird","colorful","ornithology","ostentatious","peacock","peahen","pretty","proud"]},{"b":"🦜","k":["animal","bird","ornithology","parrot","pirate","talk"]},{"b":"🪽","k":["angelic","ascend","aviation","bird","fly","flying","heavenly","mythology","soar","wing"]},{"b":"🐦‍⬛","k":["animal","beak","bird","black","caw","corvid","crow","ornithology","raven","rook"]},{"b":"🪿","k":["animal","bird","duck","flock","fowl","gaggle","gander","geese","goose","honk","ornithology","silly"]},{"b":"🐸","k":["animal","face","frog"]},{"b":"🐊","k":["animal","crocodile","zoo"]},{"b":"🐢","k":["animal","slow","terrapin","tortoise","turtle"]},{"b":"🦎","k":["animal","lizard","reptile"]},{"b":"🐍","k":["animal","bearer","ophiuchus","serpent","snake","zodiac"]},{"b":"🐲","k":["animal","dragon","face","fairy","fairytale","tale"]},{"b":"🐉","k":["animal","dragon","fairy","fairytale","knights","tale"]},{"b":"🦕","k":["brachiosaurus","brontosaurus","dinosaur","diplodocus","sauropod"]},{"b":"🦖","k":["dinosaur","rex","t","t-rex","tyrannosaurus"]},{"b":"🐳","k":["animal","beach","face","ocean","sea","spouting","whale"]},{"b":"🐋","k":["animal","beach","ocean","whale","whale2"]},{"b":"🐬","k":["animal","beach","dolphin","flipper","ocean"]},{"b":"🦭","k":["animal","lion","ocean","sea","seal"]},{"b":"🐟","k":["animal","dinner","fish","fishes","fishing","pisces","zodiac"]},{"b":"🐠","k":["animal","fish","fishes","tropical"]},{"b":"🐡","k":["animal","blowfish","fish"]},{"b":"🦈","k":["animal","fish","shark"]},{"b":"🐙","k":["animal","creature","ocean","octopus"]},{"b":"🐚","k":["animal","beach","conch","sea","shell","spiral"]},{"b":"🪸","k":["change","climate","coral","ocean","reef","sea"]},{"b":"🪼","k":["animal","aquarium","burn","invertebrate","jelly","jellyfish","life","marine","ocean","ouch","plankton","sea","sting","stinger","tentacles"]},{"b":"🐌","k":["animal","escargot","garden","nature","slow","slug","snail"]},{"b":"🦋","k":["butterfly","insect","pretty"]},{"b":"🐛","k":["animal","bug","garden","insect"]},{"b":"🐜","k":["animal","ant","garden","insect"]},{"b":"🐝","k":["animal","bee","bumblebee","honey","honeybee","insect","nature","spring"]},{"b":"🪲","k":["animal","beetle","bug","insect"]},{"b":"🐞","k":["animal","beetle","bug","garden","insect","lady","ladybird","ladybug","nature"]},{"b":"🦗","k":["animal","bug","cricket","grasshopper","insect","orthoptera"]},{"b":"🪳","k":["animal","cockroach","insect","pest","roach"]},{"b":"🕷️","k":["spider"]},{"b":"🕸️","k":["spider","web"]},{"b":"🦂","k":["scorpio","scorpion","scorpius","zodiac"]},{"b":"🦟","k":["bite","disease","fever","insect","malaria","mosquito","pest","virus"]},{"b":"🪰","k":["animal","disease","fly","insect","maggot","pest","rotting"]},{"b":"🪱","k":["animal","annelid","earthworm","parasite","worm"]},{"b":"🦠","k":["amoeba","bacteria","germ","microbe","science","virus"]},{"b":"💐","k":["anniversary","birthday","bouquet","date","flower","flowers","love","plant","romance"]},{"b":"🌸","k":["blossom","cherry","flower","plant","spring","springtime"]},{"b":"💮","k":["flower","white"]},{"b":"🪷","k":["beauty","buddhism","calm","flower","hinduism","lotus","peace","purity","serenity"]},{"b":"🏵️","k":["rosette"]},{"b":"🌹","k":["beauty","elegant","flower","love","plant","red","rose","valentine"]},{"b":"🥀","k":["dying","flower","wilted"]},{"b":"🌺","k":["flower","hibiscus","plant"]},{"b":"🌻","k":["flower","outdoors","plant","sun","sunflower"]},{"b":"🌼","k":["blossom","buttercup","dandelion","flower","plant"]},{"b":"🌷","k":["blossom","flower","growth","plant","tulip"]},{"b":"🪻","k":["bloom","bluebonnet","flower","hyacinth","indigo","lavender","lilac","lupine","plant","purple","shrub","snapdragon","spring","violet"]},{"b":"🌱","k":["plant","sapling","seedling","sprout","young"]},{"b":"🪴","k":["decor","grow","house","nurturing","plant","pot","potted"]},{"b":"🌲","k":["christmas","evergreen","forest","pine","tree","wood"]},{"b":"🌳","k":["deciduous","forest","green","habitat","shedding","tree","wood"]},{"b":"🌴","k":["beach","palm","plant","tree","tropical"]},{"b":"🌵","k":["cactus","desert","drought","nature","plant"]},{"b":"🌾","k":["ear","grain","grains","of","plant","rice","sheaf"]},{"b":"🌿","k":["herb","leaf","plant"]},{"b":"☘️","k":["shamrock"]},{"b":"🍀","k":["4","clover","four","four-leaf","irish","leaf","luck","lucky","plant"]},{"b":"🍁","k":["canada","falling","leaf","maple"]},{"b":"🍂","k":["autumn","fall","fallen","falling","leaf"]},{"b":"🍃","k":["blow","flutter","fluttering","leaf","leaves","wind"]},{"b":"🪹","k":["branch","empty","home","nest","nesting"]},{"b":"🪺","k":["bird","branch","egg","eggs","nest","nesting","with"]},{"b":"🍄","k":["fungus","mushroom","toadstool"]}]},{"name":"Food & Drink","icon":"🍔","emojis":[{"b":"🍇","k":["dionysus","fruit","grape","grapes"]},{"b":"🍈","k":["cantaloupe","fruit","melon"]},{"b":"🍉","k":["fruit","watermelon"]},{"b":"🍊","k":["c","citrus","fruit","mandarin","nectarine","orange","tangerine","vitamin"]},{"b":"🍋","k":["citrus","fruit","lemon","sour"]},{"b":"🍌","k":["banana","fruit","potassium"]},{"b":"🍍","k":["colada","fruit","pina","pineapple","tropical"]},{"b":"🥭","k":["food","fruit","mango","tropical"]},{"b":"🍎","k":["apple","diet","food","fruit","health","red","ripe"]},{"b":"🍏","k":["apple","fruit","green"]},{"b":"🍐","k":["fruit","pear"]},{"b":"🍑","k":["fruit","peach"]},{"b":"🍒","k":["berries","cherries","cherry","fruit","red"]},{"b":"🍓","k":["berry","fruit","strawberry"]},{"b":"🫐","k":["berries","berry","bilberry","blue","blueberries","blueberry","food","fruit"]},{"b":"🥝","k":["food","fruit","kiwi"]},{"b":"🍅","k":["food","fruit","tomato","vegetable"]},{"b":"🫒","k":["food","olive"]},{"b":"🥥","k":["coconut","colada","palm","piña"]},{"b":"🥑","k":["avocado","food","fruit"]},{"b":"🍆","k":["aubergine","eggplant","vegetable"]},{"b":"🥔","k":["food","potato","vegetable"]},{"b":"🥕","k":["carrot","food","vegetable"]},{"b":"🌽","k":["corn","crops","ear","farm","maize","maze"]},{"b":"🌶️","k":["hot","pepper","spicy"]},{"b":"🫑","k":["bell","capsicum","food","pepper","vegetable"]},{"b":"🥒","k":["cucumber","food","pickle","vegetable"]},{"b":"🥬","k":["bok","burgers","cabbage","choy","green","kale","leafy","lettuce","salad"]},{"b":"🥦","k":["broccoli","cabbage","wild"]},{"b":"🧄","k":["flavoring","garlic"]},{"b":"🧅","k":["flavoring","onion"]},{"b":"🥜","k":["food","nut","peanut","peanuts","vegetable"]},{"b":"🫘","k":["beans","food","kidney","legume","small"]},{"b":"🌰","k":["almond","chestnut","plant"]},{"b":"🫚","k":["beer","ginger","health","herb","natural","root","spice"]},{"b":"🫛","k":["beans","beanstalk","edamame","legume","pea","pod","soybean","vegetable","veggie"]},{"b":"🍞","k":["bread","carbs","food","grain","loaf","restaurant","toast","wheat"]},{"b":"🥐","k":["bread","breakfast","crescent","croissant","food","french","roll"]},{"b":"🥖","k":["baguette","bread","food","french"]},{"b":"🫓","k":["arepa","bread","flatbread","food","gordita","lavash","naan","pita"]},{"b":"🥨","k":["convoluted","pretzel","twisted"]},{"b":"🥯","k":["bagel","bakery","bread","breakfast","schmear"]},{"b":"🥞","k":["breakfast","crêpe","food","hotcake","pancake","pancakes"]},{"b":"🧇","k":["breakfast","indecisive","iron","waffle"]},{"b":"🧀","k":["cheese","wedge"]},{"b":"🍖","k":["bone","meat","on"]},{"b":"🍗","k":["bone","chicken","drumstick","hungry","leg","meat","poultry","turkey"]},{"b":"🥩","k":["chop","cut","lambchop","meat","of","porkchop","red","steak"]},{"b":"🥓","k":["bacon","breakfast","food","meat"]},{"b":"🍔","k":["burger","eat","fast","food","hamburger","hungry"]},{"b":"🍟","k":["fast","food","french","fries"]},{"b":"🍕","k":["cheese","food","hungry","pepperoni","pizza","slice"]},{"b":"🌭","k":["dog","frankfurter","hot","hotdog","sausage"]},{"b":"🥪","k":["bread","sandwich"]},{"b":"🌮","k":["mexican","taco"]},{"b":"🌯","k":["burrito","mexican","wrap"]},{"b":"🫔","k":["food","mexican","pamonha","tamale","wrapped"]},{"b":"🥙","k":["falafel","flatbread","food","gyro","kebab","stuffed"]},{"b":"🧆","k":["chickpea","falafel","meatball"]},{"b":"🥚","k":["breakfast","egg","food"]},{"b":"🍳","k":["breakfast","cooking","easy","egg","fried","fry","frying","over","pan","restaurant","side","sunny","up"]},{"b":"🥘","k":["casserole","curry","food","of","paella","pan","shallow"]},{"b":"🍲","k":["food","pot","soup","stew"]},{"b":"🫕","k":["cheese","chocolate","fondue","food","melted","pot","ski"]},{"b":"🥣","k":["bowl","breakfast","cereal","congee","oatmeal","porridge","spoon","with"]},{"b":"🥗","k":["food","green","salad"]},{"b":"🍿","k":["corn","movie","pop","popcorn"]},{"b":"🧈","k":["butter","dairy"]},{"b":"🧂","k":["condiment","flavor","mad","salt","salty","shaker","taste","upset"]},{"b":"🥫","k":["can","canned","food"]},{"b":"🍱","k":["bento","box","food"]},{"b":"🍘","k":["cracker","food","rice"]},{"b":"🍙","k":["ball","food","japanese","rice"]},{"b":"🍚","k":["cooked","food","rice"]},{"b":"🍛","k":["curry","food","rice"]},{"b":"🍜","k":["bowl","chopsticks","food","noodle","pho","ramen","soup","steaming"]},{"b":"🍝","k":["food","meatballs","pasta","restaurant","spaghetti"]},{"b":"🍠","k":["food","potato","roasted","sweet"]},{"b":"🍢","k":["food","kebab","oden","restaurant","seafood","skewer","stick"]},{"b":"🍣","k":["food","sushi"]},{"b":"🍤","k":["fried","prawn","shrimp","tempura"]},{"b":"🍥","k":["cake","fish","food","pastry","restaurant","swirl","with"]},{"b":"🥮","k":["autumn","cake","festival","moon","yuèbǐng"]},{"b":"🍡","k":["dango","dessert","japanese","skewer","stick","sweet"]},{"b":"🥟","k":["dumpling","empanada","gyōza","jiaozi","pierogi","potsticker"]},{"b":"🥠","k":["cookie","fortune","prophecy"]},{"b":"🥡","k":["box","chopsticks","delivery","food","oyster","pail","takeout"]},{"b":"🦀","k":["cancer","crab","zodiac"]},{"b":"🦞","k":["animal","bisque","claws","lobster","seafood"]},{"b":"🦐","k":["food","shellfish","shrimp","small"]},{"b":"🦑","k":["animal","food","mollusk","squid"]},{"b":"🦪","k":["diving","oyster","pearl"]},{"b":"🍦","k":["cream","dessert","food","ice","icecream","restaurant","serve","soft","sweet"]},{"b":"🍧","k":["dessert","ice","restaurant","shaved","sweet"]},{"b":"🍨","k":["cream","dessert","food","ice","restaurant","sweet"]},{"b":"🍩","k":["breakfast","dessert","donut","doughnut","food","sweet"]},{"b":"🍪","k":["chip","chocolate","cookie","dessert","sweet"]},{"b":"🎂","k":["bday","birthday","cake","celebration","dessert","happy","party","pastry","sweet"]},{"b":"🍰","k":["cake","dessert","pastry","shortcake","slice","sweet"]},{"b":"🧁","k":["bakery","cupcake","dessert","sprinkles","sugar","sweet","treat"]},{"b":"🥧","k":["apple","filling","fruit","meat","pastry","pie","pumpkin","slice"]},{"b":"🍫","k":["bar","candy","chocolate","dessert","halloween","sweet","tooth"]},{"b":"🍬","k":["candy","cavities","dessert","halloween","restaurant","sweet","tooth","wrapper"]},{"b":"🍭","k":["candy","dessert","food","lollipop","restaurant","sweet"]},{"b":"🍮","k":["custard","dessert","pudding","sweet"]},{"b":"🍯","k":["barrel","bear","food","honey","honeypot","jar","pot","sweet"]},{"b":"🍼","k":["babies","baby","birth","born","bottle","drink","infant","milk","newborn"]},{"b":"🥛","k":["drink","glass","milk"]},{"b":"☕","k":["beverage","cafe","caffeine","chai","coffee","drink","espresso","hot","morning","steaming","tea"]},{"b":"🫖","k":["brew","drink","food","pot","tea","teapot"]},{"b":"🍵","k":["beverage","breakfast","cup","drink","green","handle","oolong","tea","teacup","without"]},{"b":"🍶","k":["bar","beverage","bottle","cup","drink","restaurant","sake"]},{"b":"🍾","k":["bar","bottle","bubbly","celebration","champagne","cork","drink","popping","with"]},{"b":"🍷","k":["alcohol","bar","beverage","booze","club","drink","drinking","drinks","glass","restaurant","wine"]},{"b":"🍸","k":["alcohol","bar","booze","club","cocktail","drink","drinking","drinks","glass","mad","martini","men"]},{"b":"🍹","k":["alcohol","bar","booze","club","cocktail","drink","drinking","drinks","drunk","mai","party","summer","tai","tropical","tropics","vacation"]},{"b":"🍺","k":["alcohol","ale","bar","beer","booze","drink","drinking","drinks","mug","octoberfest","oktoberfest","pint","stein","summer"]},{"b":"🍻","k":["alcohol","bar","beer","beers","booze","bottoms","cheers","clink","clinking","drinking","drinks","mugs"]},{"b":"🥂","k":["celebrate","cheers","clink","clinking","drink","glass","glasses","toast"]},{"b":"🥃","k":["glass","liquor","scotch","shot","tumbler","whiskey","whisky"]},{"b":"🫗","k":["accident","drink","empty","glass","liquid","oops","pour","pouring","spill","water"]},{"b":"🥤","k":["cup","drink","juice","malt","soda","soft","straw","water","with"]},{"b":"🧋","k":["boba","bubble","food","milk","pearl","tea"]},{"b":"🧃","k":["beverage","box","juice","straw","sweet"]},{"b":"🧉","k":["drink","mate"]},{"b":"🧊","k":["cold","cube","ice","iceberg"]},{"b":"🥢","k":["chopsticks","hashi","jeotgarak","kuaizi"]},{"b":"🍽️","k":["and","cutlery","dining","dinner","fork","knife","plate","with"]},{"b":"🍴","k":["and","breakfast","breaky","cooking","cutlery","delicious","dinner","eat","feed","food","fork","hungry","knife","lunch","restaurant","yum","yummy"]},{"b":"🥄","k":["eat","spoon","tableware"]},{"b":"🔪","k":["chef","chop","cooking","cut","hocho","kitchen","knife","tool","weapon"]},{"b":"🫙","k":["condiment","container","empty","jar","nothing","sauce","store"]},{"b":"🏺","k":["amphora","aquarius","cooking","drink","jug","tool","weapon","zodiac"]}]},{"name":"Travel & Places","icon":"✈️","emojis":[{"b":"🌍","k":["africa","earth","europe","europe-africa","globe","international","showing","world"]},{"b":"🌎","k":["americas","earth","globe","international","showing","world"]},{"b":"🌏","k":["asia","asia-australia","australia","earth","globe","international","showing","world"]},{"b":"🌐","k":["earth","global","globe","international","internet","meridians","web","with","world","worldwide"]},{"b":"🗺️","k":["map","travel","world"]},{"b":"🗾","k":["japan","map"]},{"b":"🧭","k":["compass","direction","magnetic","navigation","orienteering"]},{"b":"🏔️","k":["mountain","snow","snow-capped"]},{"b":"⛰️","k":["mountain"]},{"b":"🌋","k":["eruption","mountain","nature","volcano"]},{"b":"🗻","k":["fuji","mount","mountain","nature"]},{"b":"🏕️","k":["camping"]},{"b":"🏖️","k":["beach","umbrella","with"]},{"b":"🏜️","k":["desert"]},{"b":"🏝️","k":["desert","island"]},{"b":"🏞️","k":["national","park"]},{"b":"🏟️","k":["stadium"]},{"b":"🏛️","k":["building","classical"]},{"b":"🏗️","k":["building","construction"]},{"b":"🧱","k":["brick","bricks","clay","mortar","wall"]},{"b":"🪨","k":["boulder","heavy","rock","solid","stone","tough"]},{"b":"🪵","k":["log","lumber","timber","wood"]},{"b":"🛖","k":["home","house","hut","roundhouse","shelter","yurt"]},{"b":"🏘️","k":["houses"]},{"b":"🏚️","k":["derelict","house"]},{"b":"🏠","k":["building","country","heart","home","house","ranch","settle","simple","suburban","suburbia","where"]},{"b":"🏡","k":["building","country","garden","heart","home","house","ranch","settle","simple","suburban","suburbia","where","with"]},{"b":"🏢","k":["building","city","cubical","job","office"]},{"b":"🏣","k":["building","japanese","office","post"]},{"b":"🏤","k":["building","european","office","post"]},{"b":"🏥","k":["building","doctor","hospital","medicine"]},{"b":"🏦","k":["bank","building"]},{"b":"🏨","k":["building","hotel"]},{"b":"🏩","k":["building","hotel","love"]},{"b":"🏪","k":["24","building","convenience","hours","store"]},{"b":"🏫","k":["building","school"]},{"b":"🏬","k":["building","department","store"]},{"b":"🏭","k":["building","factory"]},{"b":"🏯","k":["building","castle","japanese"]},{"b":"🏰","k":["building","castle","european"]},{"b":"💒","k":["chapel","hitched","marriage","nuptials","romance","wedding"]},{"b":"🗼","k":["tokyo","tower"]},{"b":"🗽","k":["liberty","new","ny","nyc","of","statue","york"]},{"b":"⛪","k":["bless","chapel","christian","church","cross","religion"]},{"b":"🕌","k":["islam","masjid","mosque","muslim","religion"]},{"b":"🛕","k":["hindu","temple"]},{"b":"🕍","k":["jew","jewish","judaism","religion","synagogue","temple"]},{"b":"⛩️","k":["shinto","shrine"]},{"b":"🕋","k":["hajj","islam","kaaba","muslim","religion","umrah"]},{"b":"⛲","k":["fountain"]},{"b":"⛺","k":["camping","tent"]},{"b":"🌁","k":["fog","foggy","karl"]},{"b":"🌃","k":["night","star","stars","with"]},{"b":"🏙️","k":["cityscape","skyline"]},{"b":"🌄","k":["morning","mountains","over","sun","sunrise"]},{"b":"🌅","k":["morning","nature","sun","sunrise"]},{"b":"🌆","k":["at","building","city","cityscape","dusk","evening","landscape","sun","sunset"]},{"b":"🌇","k":["building","city","dusk","sun","sunrise","sunset"]},{"b":"🌉","k":["at","bridge","night"]},{"b":"♨️","k":["hot","hotsprings","springs"]},{"b":"🎠","k":["carousel","entertainment","horse"]},{"b":"🛝","k":["amusement","park","play","playground","playing","slide","sliding","theme"]},{"b":"🎡","k":["amusement","ferris","park","theme","wheel"]},{"b":"🎢","k":["amusement","coaster","park","roller","theme"]},{"b":"💈","k":["barber","cut","fresh","haircut","pole","shave"]},{"b":"🎪","k":["circus","tent"]},{"b":"🚂","k":["caboose","engine","locomotive","railway","steam","train","trains","travel"]},{"b":"🚃","k":["car","electric","railway","train","tram","travel","trolleybus"]},{"b":"🚄","k":["bullettrain","high-speed","railway","shinkansen","side","speed","train"]},{"b":"🚅","k":["bullet","bullettrain","front","high-speed","nose","railway","shinkansen","speed","train","travel"]},{"b":"🚆","k":["arrived","choo","railway","train","train2"]},{"b":"🚇","k":["metro","subway","travel"]},{"b":"🚈","k":["arrived","light","monorail","rail","railway"]},{"b":"🚉","k":["railway","station","train"]},{"b":"🚊","k":["tram","trolleybus"]},{"b":"🚝","k":["monorail","vehicle"]},{"b":"🚞","k":["car","mountain","railway","trip"]},{"b":"🚋","k":["bus","car","train","tram","trolley","trolleybus"]},{"b":"🚌","k":["bus","school","vehicle"]},{"b":"🚍","k":["bus","cars","oncoming"]},{"b":"🚎","k":["bus","tram","trolley","trolleybus"]},{"b":"🚐","k":["bus","drive","minibus","van","vehicle"]},{"b":"🚑","k":["ambulance","emergency","vehicle"]},{"b":"🚒","k":["engine","fire","truck"]},{"b":"🚓","k":["5–0","car","cops","patrol","police"]},{"b":"🚔","k":["car","oncoming","police"]},{"b":"🚕","k":["cab","cabbie","car","drive","taxi","vehicle","yellow"]},{"b":"🚖","k":["cab","cabbie","cars","drove","hail","oncoming","taxi","yellow"]},{"b":"🚗","k":["automobile","car","driving","red","vehicle"]},{"b":"🚘","k":["automobile","car","cars","drove","oncoming","vehicle"]},{"b":"🚙","k":["blue","car","drive","recreational","sport","sportutility","utility","vehicle"]},{"b":"🛻","k":["automobile","car","flatbed","pick-up","pickup","transportation","truck"]},{"b":"🚚","k":["car","delivery","drive","truck","vehicle"]},{"b":"🚛","k":["articulated","car","drive","lorry","move","semi","truck","vehicle"]},{"b":"🚜","k":["tractor","vehicle"]},{"b":"🏎️","k":["car","racing"]},{"b":"🏍️","k":["motorcycle"]},{"b":"🛵","k":["motor","scooter"]},{"b":"🦽","k":["accessibility","manual","wheelchair"]},{"b":"🦼","k":["accessibility","motorized","wheelchair"]},{"b":"🛺","k":["auto","rickshaw","tuk"]},{"b":"🚲","k":["bicycle","bike","class","cycle","cycling","cyclist","gang","ride","spin","spinning"]},{"b":"🛴","k":["kick","scooter"]},{"b":"🛹","k":["board","skate","skateboard","skater","wheels"]},{"b":"🛼","k":["blades","roller","skate","skates","sport"]},{"b":"🚏","k":["bus","busstop","stop"]},{"b":"🛣️","k":["motorway"]},{"b":"🛤️","k":["railway","track"]},{"b":"🛢️","k":["drum","oil"]},{"b":"⛽","k":["diesel","fuel","fuelpump","gas","gasoline","pump","station"]},{"b":"🛞","k":["car","circle","tire","turn","vehicle","wheel"]},{"b":"🚨","k":["911","alarm","alert","beacon","car","emergency","light","police","revolving","rotating","siren"]},{"b":"🚥","k":["horizontal","intersection","light","signal","stop","stoplight","traffic"]},{"b":"🚦","k":["drove","intersection","light","semaphore","signal","stop","stoplight","traffic","vertical"]},{"b":"🛑","k":["octagonal","sign","stop"]},{"b":"🚧","k":["barrier","construction","wip"]},{"b":"⚓","k":["anchor","ship","tool"]},{"b":"🛟","k":["buoy","float","life","lifesaver","preserver","rescue","ring","safety","save","saver","swim"]},{"b":"⛵","k":["boat","resort","sailboat","sailing","sea","yacht"]},{"b":"🛶","k":["boat","canoe"]},{"b":"🚤","k":["billionaire","boat","lake","luxury","millionaire","ship","speedboat","summer","travel"]},{"b":"🛳️","k":["cruise","passenger","ship"]},{"b":"⛴️","k":["ferry"]},{"b":"🛥️","k":["boat","motor"]},{"b":"🚢","k":["boat","passenger","ship","travel"]},{"b":"✈️","k":["airplane","flight"]},{"b":"🛩️","k":["airplane","flight","small"]},{"b":"🛫","k":["aeroplane","airplane","check-in","departure","departures","flight","plane"]},{"b":"🛬","k":["aeroplane","airplane","arrival","arrivals","arriving","flight","landing","plane"]},{"b":"🪂","k":["hang-glide","parachute","parasail","skydive"]},{"b":"💺","k":["chair","seat"]},{"b":"🚁","k":["copter","helicopter","roflcopter","travel","vehicle"]},{"b":"🚟","k":["railway","suspension"]},{"b":"🚠","k":["cable","cableway","gondola","lift","mountain","ski"]},{"b":"🚡","k":["aerial","cable","car","gondola","ropeway","tramway"]},{"b":"🛰️","k":["artificial","orbit","satellite","space"]},{"b":"🚀","k":["launch","rocket","rockets","ship","space","travel"]},{"b":"🛸","k":["aliens","extra","flying","saucer","terrestrial","ufo"]},{"b":"🛎️","k":["bell","bellhop"]},{"b":"🧳","k":["bag","luggage","packing","roller","suitcase","travel"]},{"b":"⌛","k":["done","hourglass","sand","time","timer"]},{"b":"⏳","k":["done","flowing","hourglass","hours","not","sand","time","timer","waiting","yolo"]},{"b":"⌚","k":["clock","time","watch"]},{"b":"⏰","k":["alarm","clock","hours","hrs","late","morning","time","waiting"]},{"b":"⏱️","k":["stopwatch"]},{"b":"⏲️","k":["clock","timer"]},{"b":"🕰️","k":["clock","mantelpiece"]},{"b":"🕛","k":["12","12:00","clock","clock12","o’clock","time","twelve"]},{"b":"🕧","k":["12","12:30","30","clock","clock1230","thirty","time","twelve","twelve-thirty"]},{"b":"🕐","k":["1","1:00","clock","clock1","one","o’clock","time"]},{"b":"🕜","k":["1","1:30","30","clock","clock130","one","one-thirty","thirty","time"]},{"b":"🕑","k":["2","2:00","clock","clock2","o’clock","time","two"]},{"b":"🕝","k":["2","2:30","30","clock","clock230","thirty","time","two","two-thirty"]},{"b":"🕒","k":["3","3:00","clock","clock3","o’clock","three","time"]},{"b":"🕞","k":["3","30","3:30","clock","clock330","thirty","three","three-thirty","time"]},{"b":"🕓","k":["4","4:00","clock","clock4","four","o’clock","time"]},{"b":"🕟","k":["30","4","4:30","clock","clock430","four","four-thirty","thirty","time"]},{"b":"🕔","k":["5","5:00","clock","clock5","five","o’clock","time"]},{"b":"🕠","k":["30","5","5:30","clock","clock530","five","five-thirty","thirty","time"]},{"b":"🕕","k":["6","6:00","clock","clock6","o’clock","six","time"]},{"b":"🕡","k":["30","6","6:30","clock","clock630","six","six-thirty","thirty"]},{"b":"🕖","k":["0","7","7:00","clock","clock7","o’clock","seven"]},{"b":"🕢","k":["30","7","7:30","clock","clock730","seven","seven-thirty","thirty"]},{"b":"🕗","k":["8","8:00","clock","clock8","eight","o’clock","time"]},{"b":"🕣","k":["30","8","8:30","clock","clock830","eight","eight-thirty","thirty","time"]},{"b":"🕘","k":["9","9:00","clock","clock9","nine","o’clock","time"]},{"b":"🕤","k":["30","9","9:30","clock","clock930","nine","nine-thirty","thirty","time"]},{"b":"🕙","k":["0","10","10:00","clock","clock10","o’clock","ten"]},{"b":"🕥","k":["10","10:30","30","clock","clock1030","ten","ten-thirty","thirty","time"]},{"b":"🕚","k":["11","11:00","clock","clock11","eleven","o’clock","time"]},{"b":"🕦","k":["11","11:30","30","clock","clock1130","eleven","eleven-thirty","thirty","time"]},{"b":"🌑","k":["dark","moon","new","space"]},{"b":"🌒","k":["crescent","dreams","moon","space","waxing"]},{"b":"🌓","k":["first","moon","quarter","space"]},{"b":"🌔","k":["gibbous","moon","space","waxing"]},{"b":"🌕","k":["full","moon","space"]},{"b":"🌖","k":["gibbous","moon","space","waning"]},{"b":"🌗","k":["last","moon","quarter","space"]},{"b":"🌘","k":["crescent","moon","space","waning"]},{"b":"🌙","k":["crescent","moon","night","ramadan","space"]},{"b":"🌚","k":["face","moon","new","space","with"]},{"b":"🌛","k":["face","first","moon","quarter","space","with"]},{"b":"🌜","k":["dreams","face","last","moon","quarter","with"]},{"b":"🌡️","k":["thermometer"]},{"b":"☀️","k":["sun","sunny","weather"]},{"b":"🌝","k":["bright","face","full","moon","with"]},{"b":"🌞","k":["beach","bright","day","face","heat","shine","summer","sun","sunny","sunshine","weather","with"]},{"b":"🪐","k":["planet","ringed","saturn","saturnine"]},{"b":"⭐","k":["astronomy","medium","star","stars","white"]},{"b":"🌟","k":["glittery","glow","glowing","night","shining","sparkle","star","star2","win"]},{"b":"🌠","k":["falling","night","shooting","space","star","stars"]},{"b":"🌌","k":["milky","space","way"]},{"b":"☁️","k":["cloud"]},{"b":"⛅","k":["behind","cloud","cloudy","partly","sun","sunny","weather"]},{"b":"⛈️","k":["and","cloud","lightning","rain","with"]},{"b":"🌤️","k":["behind","cloud","small","sun"]},{"b":"🌥️","k":["behind","cloud","large","sun"]},{"b":"🌦️","k":["behind","cloud","rain","sun"]},{"b":"🌧️","k":["cloud","rain","with"]},{"b":"🌨️","k":["cloud","snow","with"]},{"b":"🌩️","k":["cloud","lightning","with"]},{"b":"🌪️","k":["tornado"]},{"b":"🌫️","k":["fog"]},{"b":"🌬️","k":["face","wind"]},{"b":"🌀","k":["cyclone","dizzy","hurricane","swirl","twister","typhoon","weather"]},{"b":"🌈","k":["gay","genderqueer","glbt","glbtq","lesbian","lgbt","lgbtq","lgbtqia","nature","pride","queer","rain","rainbow","trans","transgender","weather"]},{"b":"🌂","k":["closed","clothing","rain","umbrella","weather"]},{"b":"☂️","k":["open","umbrella"]},{"b":"☔","k":["clothing","drop","drops","rain","umbrella","weather","with"]},{"b":"⛱️","k":["beach_umbrella","ground","on","parasol","umbrella"]},{"b":"⚡","k":["danger","electric","electricity","high","lightning","nature","thunder","thunderbolt","voltage","zap"]},{"b":"❄️","k":["cold","snowflake","weather","winter"]},{"b":"☃️","k":["christmas","snow","snowman","winter","with"]},{"b":"⛄","k":["cold","man","snow","snowman","winter","without"]},{"b":"☄️","k":["comet"]},{"b":"🔥","k":["af","burn","fire","flame","hot","lit","litaf","tool"]},{"b":"💧","k":["cold","comic","drop","droplet","nature","sad","sweat","tear","water","weather"]},{"b":"🌊","k":["nature","ocean","sea","surf","surfer","surfing","water","wave"]}]},{"name":"Activities","icon":"⚽","emojis":[{"b":"🎃","k":["celebration","halloween","jack","jack-o-lantern","lantern","o","pumpkin"]},{"b":"🎄","k":["celebration","christmas","tree"]},{"b":"🎆","k":["boom","celebration","entertainment","festival","fireworks","yolo"]},{"b":"🎇","k":["boom","celebration","fireworks","sparkle","sparkler"]},{"b":"🧨","k":["dynamite","explosive","fire","firecracker","fireworks","light","pop","popping","spark"]},{"b":"✨","k":["*","magic","shiny","sparkle","sparkles","star"]},{"b":"🎈","k":["balloon","birthday","celebrate","celebration","party"]},{"b":"🎉","k":["awesome","birthday","celebrate","celebration","excited","hooray","party","popper","tada","woohoo"]},{"b":"🎊","k":["ball","celebrate","celebration","confetti","party","woohoo"]},{"b":"🎋","k":["banner","celebration","japanese","tanabata","tree"]},{"b":"🎍","k":["bamboo","celebration","decoration","japanese","pine","plant"]},{"b":"🎎","k":["celebration","doll","dolls","festival","japanese"]},{"b":"🎏","k":["carp","celebration","flags","streamer"]},{"b":"🎐","k":["bell","celebration","chime","wind"]},{"b":"🎑","k":["celebration","ceremony","moon","rice","scene","viewing"]},{"b":"🧧","k":["envelope","gift","good","hóngbāo","lai","luck","money","red","see"]},{"b":"🎀","k":["celebration","ribbon"]},{"b":"🎁","k":["birthday","bow","box","celebration","christmas","gift","present","surprise","wrapped"]},{"b":"🎗️","k":["reminder","ribbon"]},{"b":"🎟️","k":["admission","tickets"]},{"b":"🎫","k":["admission","stub","ticket"]},{"b":"🎖️","k":["medal","military"]},{"b":"🏆","k":["award","champion","champs","contest","prize","slay","sport","trophy","victory","win","winner","winning"]},{"b":"🏅","k":["award","gold","medal","sports","winner"]},{"b":"🥇","k":["1st","first","gold","medal","place"]},{"b":"🥈","k":["2nd","medal","place","second","silver"]},{"b":"🥉","k":["3rd","bronze","medal","place","third"]},{"b":"⚽","k":["ball","football","futbol","soccer","sport","sports"]},{"b":"⚾","k":["ball","baseball","sport","sports"]},{"b":"🥎","k":["ball","glove","softball","sports","underarm"]},{"b":"🏀","k":["ball","basketball","hoop","sport","sports"]},{"b":"🏐","k":["ball","game","volleyball"]},{"b":"🏈","k":["american","ball","bowl","football","sport","sports","super"]},{"b":"🏉","k":["ball","football","rugby","sport"]},{"b":"🎾","k":["ball","racquet","sport","sports","tennis"]},{"b":"🥏","k":["disc","flying","ultimate"]},{"b":"🎳","k":["ball","bowling","game","sport","strike"]},{"b":"🏏","k":["ball","bat","cricket","game"]},{"b":"🏑","k":["ball","field","game","hockey","stick"]},{"b":"🏒","k":["game","hockey","ice","puck","stick"]},{"b":"🥍","k":["ball","goal","lacrosse","sports","stick"]},{"b":"🏓","k":["ball","bat","game","paddle","ping","pingpong","pong","table","tennis"]},{"b":"🏸","k":["badminton","birdie","game","racquet","shuttlecock"]},{"b":"🥊","k":["boxing","glove"]},{"b":"🥋","k":["arts","judo","karate","martial","taekwondo","uniform"]},{"b":"🥅","k":["goal","net"]},{"b":"⛳","k":["flag","golf","hole","sport"]},{"b":"⛸️","k":["ice","skate","skating"]},{"b":"🎣","k":["and","entertainment","fish","fishing","pole","sport"]},{"b":"🤿","k":["diving","mask","scuba","snorkeling"]},{"b":"🎽","k":["athletics","marathon","running","sash","shirt","with"]},{"b":"🎿","k":["ski","skis","snow","sport"]},{"b":"🛷","k":["luge","sled","sledge","sleigh","snow","toboggan"]},{"b":"🥌","k":["curling","game","rock","stone"]},{"b":"🎯","k":["bull","bullseye","dart","direct","entertainment","game","hit","target"]},{"b":"🪀","k":["fluctuate","toy","yo","yo-yo"]},{"b":"🪁","k":["fly","kite","soar"]},{"b":"🔫","k":["gun","handgun","pistol","revolver","shoot","tool","water","weapon"]},{"b":"🎱","k":["8","8ball","ball","billiard","billiards","eight","game","pool"]},{"b":"🔮","k":["ball","crystal","fairy","fairytale","fantasy","fortune","future","magic","tale","tool"]},{"b":"🪄","k":["magic","magician","wand","witch","wizard"]},{"b":"🎮","k":["console","controller","entertainment","game","play","video"]},{"b":"🕹️","k":["joystick"]},{"b":"🎰","k":["casino","gamble","gambling","game","machine","slot","slots"]},{"b":"🎲","k":["dice","die","entertainment","gambling","game"]},{"b":"🧩","k":["clue","interlocking","jigsaw","piece","puzzle"]},{"b":"🧸","k":["bear","plaything","plush","stuffed","teddy","toy"]},{"b":"🪅","k":["candy","celebrate","celebration","cinco","de","festive","mayo","party","pinada","pinata","piñata"]},{"b":"🪩","k":["ball","dance","disco","glitter","mirror","party"]},{"b":"🪆","k":["babooshka","baboushka","babushka","doll","dolls","matryoshka","nesting","russia"]},{"b":"♠️","k":["spade","spades","suit"]},{"b":"♥️","k":["heart","hearts","suit"]},{"b":"♦️","k":["diamond","diamonds","suit"]},{"b":"♣️","k":["club","clubs","suit"]},{"b":"♟️","k":["chess","pawn"]},{"b":"🃏","k":["black","card","game","joker","wildcard"]},{"b":"🀄","k":["dragon","game","mahjong","red"]},{"b":"🎴","k":["card","cards","flower","game","japanese","playing"]},{"b":"🎭","k":["actor","actress","art","arts","drama","entertainment","mask","performing","theater","theatre","thespian"]},{"b":"🖼️","k":["framed","picture"]},{"b":"🎨","k":["art","artist","artsy","arty","colorful","creative","design","entertainment","museum","paint","painter","painting","palette"]},{"b":"🧵","k":["needle","sewing","spool","string","thread"]},{"b":"🪡","k":["embroidery","needle","sew","sewing","stitches","sutures","tailoring","thread"]},{"b":"🧶","k":["ball","crochet","knit","yarn"]},{"b":"🪢","k":["cord","knot","rope","tangled","tie","twine","twist"]}]},{"name":"Objects","icon":"💡","emojis":[{"b":"👓","k":["clothing","eye","eyeglasses","eyewear","glasses"]},{"b":"🕶️","k":["dark","sunglasses"]},{"b":"🥽","k":["dive","eye","goggles","protection","scuba","swimming","welding"]},{"b":"🥼","k":["clothes","coat","doctor","dr","experiment","jacket","lab","scientist","white"]},{"b":"🦺","k":["emergency","safety","vest"]},{"b":"👔","k":["clothing","employed","formal","necktie","serious","shirt","tie"]},{"b":"👕","k":["blue","casual","clothes","clothing","collar","dressed","shirt","shopping","t-shirt","tshirt","weekend"]},{"b":"👖","k":["blue","casual","clothes","clothing","denim","dressed","jeans","pants","shopping","trousers","weekend"]},{"b":"🧣","k":["bundle","cold","neck","scarf","up"]},{"b":"🧤","k":["gloves","hand"]},{"b":"🧥","k":["brr","bundle","coat","cold","jacket","up"]},{"b":"🧦","k":["socks","stocking"]},{"b":"👗","k":["clothes","clothing","dress","dressed","fancy","shopping"]},{"b":"👘","k":["clothing","comfortable","kimono"]},{"b":"🥻","k":["clothing","dress","sari"]},{"b":"🩱","k":["bathing","one","one-piece","piece","suit","swimsuit"]},{"b":"🩲","k":["bathing","brief","briefs","one-piece","suit","swim","swimsuit","underwear"]},{"b":"🩳","k":["bathing","pants","shorts","suit","swimsuit","underwear"]},{"b":"👙","k":["bathing","beach","bikini","clothing","pool","suit","swim"]},{"b":"👚","k":["blouse","clothes","clothing","collar","dress","dressed","lady","shirt","shopping","woman","womans","woman’s"]},{"b":"🪭","k":["clack","clap","cool","cooling","dance","fan","flirt","flutter","folding","hand","hot","sensu","shy"]},{"b":"👛","k":["clothes","clothing","coin","dress","fancy","handbag","purse","shopping"]},{"b":"👜","k":["bag","clothes","clothing","dress","handbag","lady","purse","shopping"]},{"b":"👝","k":["bag","clothes","clothing","clutch","dress","handbag","pouch","purse"]},{"b":"🛍️","k":["bags","shopping"]},{"b":"🎒","k":["backpack","backpacking","bag","bookbag","education","rucksack","satchel","school"]},{"b":"🩴","k":["beach","flip","flop","sandal","sandals","shoe","thong","thongs","zōri"]},{"b":"👞","k":["brown","clothes","clothing","feet","foot","kick","man","mans","man’s","shoe","shoes","shopping"]},{"b":"👟","k":["athletic","clothes","clothing","fast","kick","running","shoe","shoes","shopping","sneaker","sport","tennis"]},{"b":"🥾","k":["backpacking","boot","brown","camping","hiking","outdoors","shoe"]},{"b":"🥿","k":["ballet","comfy","flat","flats","shoe","slip-on","slipper"]},{"b":"👠","k":["clothes","clothing","dress","fashion","heel","heels","high","high-heeled","shoe","shoes","shopping","stiletto","woman"]},{"b":"👡","k":["clothing","sandal","shoe","woman","woman’s"]},{"b":"🩰","k":["ballet","dance","shoes"]},{"b":"👢","k":["boot","clothes","clothing","dress","shoe","shoes","shopping","woman","woman’s"]},{"b":"🪮","k":["afro","comb","groom","hair","pick"]},{"b":"👑","k":["clothing","crown","family","king","medieval","queen","royal","royalty","win"]},{"b":"👒","k":["clothes","clothing","garden","hat","hats","party","woman","womans","woman’s"]},{"b":"🎩","k":["classy","clothes","clothing","fancy","formal","hat","magic","top","tophat"]},{"b":"🎓","k":["board","cap","celebration","clothing","college","education","graduation","hat","mortar","scholar","university"]},{"b":"🧢","k":["baseball","bent","billed","cap","dad","hat"]},{"b":"🪖","k":["army","helmet","military","soldier","war","warrior"]},{"b":"⛑️","k":["helmet","rescue","worker","worker’s"]},{"b":"📿","k":["beads","clothing","necklace","prayer","religion"]},{"b":"💄","k":["cosmetics","date","lipstick","makeup"]},{"b":"💍","k":["diamond","engaged","engagement","marriage","married","ring","romance","shiny","sparkling","wedding"]},{"b":"💎","k":["diamond","engagement","gem","jewel","money","romance","stone","wedding"]},{"b":"🔇","k":["mute","muted","quiet","silent","sound","speaker","volume"]},{"b":"🔈","k":["low","soft","sound","speaker","volume"]},{"b":"🔉","k":["medium","sound","speaker","volume"]},{"b":"🔊","k":["high","loud","music","sound","speaker","volume"]},{"b":"📢","k":["address","announcement","communication","loud","loudspeaker","public","sound"]},{"b":"📣","k":["cheering","mega","megaphone","sound"]},{"b":"📯","k":["horn","post","postal"]},{"b":"🔔","k":["bell","break","church","notification","sound"]},{"b":"🔕","k":["bell","forbidden","mute","no","not","off","prohibited","quiet","silent","slash","sound","volume","with"]},{"b":"🎼","k":["music","musical","note","score"]},{"b":"🎵","k":["music","musical","note","sound"]},{"b":"🎶","k":["music","musical","note","notes","sound"]},{"b":"🎙️","k":["microphone","podcast","studio"]},{"b":"🎚️","k":["level","slider"]},{"b":"🎛️","k":["control","knobs"]},{"b":"🎤","k":["karaoke","mic","microphone","music","sing","sound"]},{"b":"🎧","k":["earbud","earphones","headphone","headphones","music","sound"]},{"b":"📻","k":["entertainment","podcast","radio","tbt","video"]},{"b":"🎷","k":["instrument","music","sax","saxophone"]},{"b":"🪗","k":["accordion","box","concertina","instrument","music","squeeze","squeezebox"]},{"b":"🎸","k":["guitar","instrument","music","rock","strat"]},{"b":"🎹","k":["instrument","keyboard","music","musical","piano"]},{"b":"🎺","k":["instrument","music","trumpet"]},{"b":"🎻","k":["instrument","music","violin"]},{"b":"🪕","k":["banjo","music","stringed"]},{"b":"🥁","k":["drum","drumsticks","music"]},{"b":"🪘","k":["beat","conga","drum","instrument","long","rhythm"]},{"b":"🪇","k":["cha","dance","instrument","maracas","music","party","percussion","rattle","shake","shaker"]},{"b":"🪈","k":["band","fife","flautist","flute","instrument","marching","music","orchestra","piccolo","pipe","recorder","woodwind"]},{"b":"📱","k":["cell","communication","iphone","mobile","phone","smartphone","telephone"]},{"b":"📲","k":["arrow","build","call","calling","cell","communication","incoming","mobile","phone","receive","telephone","with"]},{"b":"☎️","k":["phone","telephone"]},{"b":"📞","k":["call","communication","phone","receiver","telephone","voip"]},{"b":"📟","k":["communication","pager"]},{"b":"📠","k":["communication","fax","machine"]},{"b":"🔋","k":["battery","power"]},{"b":"🪫","k":["battery","drained","electronic","energy","low","power"]},{"b":"🔌","k":["electric","electricity","plug"]},{"b":"💻","k":["computer","desktop","laptop","office","pc","personal","screen"]},{"b":"🖥️","k":["computer","desktop"]},{"b":"🖨️","k":["printer"]},{"b":"⌨️","k":["keyboard"]},{"b":"🖱️","k":["computer","mouse"]},{"b":"🖲️","k":["trackball"]},{"b":"💽","k":["computer","disk","minidisc","minidisk","optical"]},{"b":"💾","k":["computer","disk","floppy","save"]},{"b":"💿","k":["blu-ray","cd","computer","disk","dvd","optical"]},{"b":"📀","k":["blu-ray","cd","computer","disk","dvd","optical"]},{"b":"🧮","k":["abacus","calculation","calculator"]},{"b":"🎥","k":["bollywood","camera","cinema","film","hollywood","movie","record","video"]},{"b":"🎞️","k":["film","frames","strip"]},{"b":"📽️","k":["film","projector"]},{"b":"🎬","k":["action","board","clapper","film","movie"]},{"b":"📺","k":["television","tv","video"]},{"b":"📷","k":["camera","photo","selfie","snap","tbt","trip","video"]},{"b":"📸","k":["camera","flash","photo","video","with"]},{"b":"📹","k":["camcorder","camera","tbt","video"]},{"b":"📼","k":["old","school","tape","vcr","vhs","video","videocassette"]},{"b":"🔍","k":["glass","lab","left","left-pointing","mag","magnifying","science","search","tilted","tool","zoom"]},{"b":"🔎","k":["contact","glass","lab","mag","magnifying","right","right-pointing","science","search","tilted","tool"]},{"b":"🕯️","k":["candle"]},{"b":"💡","k":["bulb","comic","electric","idea","light"]},{"b":"🔦","k":["electric","flashlight","light","tool","torch"]},{"b":"🏮","k":["bar","izakaya","lantern","light","paper","red","restaurant"]},{"b":"🪔","k":["diya","lamp","light","oil"]},{"b":"📔","k":["book","cover","decorated","decorative","education","notebook","school","with","writing"]},{"b":"📕","k":["book","closed","education"]},{"b":"📖","k":["book","education","fantasy","knowledge","library","novels","open","reading"]},{"b":"📗","k":["book","education","fantasy","green","library","reading"]},{"b":"📘","k":["blue","book","education","fantasy","library","reading"]},{"b":"📙","k":["book","education","fantasy","library","orange","reading"]},{"b":"📚","k":["book","books","education","fantasy","knowledge","library","novels","reading","school","study"]},{"b":"📓","k":["notebook"]},{"b":"📒","k":["ledger","notebook"]},{"b":"📃","k":["curl","document","page","paper","with"]},{"b":"📜","k":["document","paper","scroll"]},{"b":"📄","k":["document","facing","page","paper","up"]},{"b":"📰","k":["communication","news","newspaper","paper","press"]},{"b":"🗞️","k":["newspaper","press","roll","rolled-up"]},{"b":"📑","k":["bookmark","mark","marker","tabs"]},{"b":"🔖","k":["bookmark","mark"]},{"b":"🏷️","k":["label","tag"]},{"b":"💰","k":["bag","bank","bet","billion","cash","cost","cream","dollar","gold","million","money","moneybag","paid","paying","pot","rich","win"]},{"b":"🪙","k":["coin","dollar","euro","gold","metal","money","rich","silver","treasure"]},{"b":"💴","k":["bank","banknote","bill","currency","money","note","yen"]},{"b":"💵","k":["bank","banknote","bill","currency","dollar","money","note"]},{"b":"💶","k":["100","bank","banknote","bill","currency","euro","money","note","rich"]},{"b":"💷","k":["bank","banknote","bill","billion","cash","currency","money","note","pound","pounds"]},{"b":"💸","k":["bank","banknote","bill","billion","cash","dollar","fly","million","money","note","pay","wings","with"]},{"b":"💳","k":["bank","card","cash","charge","credit","money","pay","subscription"]},{"b":"🧾","k":["accounting","bookkeeping","evidence","invoice","proof","receipt"]},{"b":"💹","k":["bank","chart","currency","graph","growth","increasing","market","money","rise","trend","upward","with","yen"]},{"b":"✉️","k":["email","envelope","letter"]},{"b":"📧","k":["e-mail","email","letter","mail"]},{"b":"📨","k":["delivering","e-mail","email","envelope","incoming","letter","mail","receive","sent"]},{"b":"📩","k":["arrow","communication","down","e-mail","email","envelope","letter","mail","outgoing","send","sent","with"]},{"b":"📤","k":["box","email","letter","mail","outbox","sent","tray"]},{"b":"📥","k":["box","email","inbox","letter","mail","receive","tray","zero"]},{"b":"📦","k":["box","communication","delivery","package","parcel","shipping"]},{"b":"📫","k":["closed","communication","flag","mail","mailbox","postbox","raised","with"]},{"b":"📪","k":["closed","flag","lowered","mail","mailbox","postbox","with"]},{"b":"📬","k":["flag","mail","mailbox","open","postbox","raised","with"]},{"b":"📭","k":["flag","lowered","mail","mailbox","no","open","postbox","with"]},{"b":"📮","k":["mail","mailbox","postbox"]},{"b":"🗳️","k":["ballot","box","with"]},{"b":"✏️","k":["pencil","pencil2"]},{"b":"✒️","k":["black","nib"]},{"b":"🖋️","k":["fountain","pen"]},{"b":"🖊️","k":["pen"]},{"b":"🖌️","k":["paintbrush"]},{"b":"🖍️","k":["crayon"]},{"b":"📝","k":["communication","document","media","memo","note","notes","pencil"]},{"b":"💼","k":["briefcase","business","office"]},{"b":"📁","k":["directory","file","folder"]},{"b":"📂","k":["file","folder","open"]},{"b":"🗂️","k":["card","dividers","index"]},{"b":"📅","k":["calendar","date","schedule"]},{"b":"📆","k":["calendar","schedule","tear-off"]},{"b":"🗒️","k":["notepad","spiral"]},{"b":"🗓️","k":["calendar","spiral"]},{"b":"📇","k":["card","index","old","rolodex","school"]},{"b":"📈","k":["chart","data","graph","growth","increasing","metrics","right","trend","up","upward","upwards","with"]},{"b":"📉","k":["chart","data","decreasing","down","downward","downwards","graph","metrics","negative","trend","with"]},{"b":"📊","k":["bar","chart","data","graph","metrics","stats"]},{"b":"📋","k":["clipboard","do","list","notes"]},{"b":"📌","k":["collage","location","pin","pushpin"]},{"b":"📍","k":["location","map","pin","pushpin","round"]},{"b":"📎","k":["paperclip"]},{"b":"🖇️","k":["linked","paperclips"]},{"b":"📏","k":["angle","edge","math","ruler","straight","straightedge"]},{"b":"📐","k":["angle","math","rule","ruler","set","slide","triangle","triangular"]},{"b":"✂️","k":["cut","scissors"]},{"b":"🗃️","k":["box","card","file"]},{"b":"🗄️","k":["cabinet","file"]},{"b":"🗑️","k":["trash","wastebasket"]},{"b":"🔒","k":["closed","lock","locked","private","security"]},{"b":"🔓","k":["cracked","lock","open","security","unlock","unlocked"]},{"b":"🔏","k":["ink","lock","locked","nib","pen","privacy","with"]},{"b":"🔐","k":["bike","closed","key","lock","locked","secure","security","with"]},{"b":"🔑","k":["key","keys","lock","major","password","unlock"]},{"b":"🗝️","k":["key","old"]},{"b":"🔨","k":["hammer","home","improvement","repairs","tool"]},{"b":"🪓","k":["ax","axe","chop","hatchet","split","wood"]},{"b":"⛏️","k":["pick"]},{"b":"⚒️","k":["and","hammer","pick"]},{"b":"🛠️","k":["and","hammer","wrench"]},{"b":"🗡️","k":["dagger"]},{"b":"⚔️","k":["crossed","swords"]},{"b":"💣","k":["bomb","boom","comic","dangerous","explosion","hot"]},{"b":"🪃","k":["boomerang","rebound","repercussion","weapon"]},{"b":"🏹","k":["and","archer","archery","arrow","bow","sagittarius","tool","weapon","zodiac"]},{"b":"🛡️","k":["shield"]},{"b":"🪚","k":["carpenter","carpentry","cut","lumber","saw","tool","trim"]},{"b":"🔧","k":["home","improvement","spanner","tool","wrench"]},{"b":"🪛","k":["flathead","handy","screw","screwdriver","tool"]},{"b":"🔩","k":["and","bolt","home","improvement","nut","tool"]},{"b":"⚙️","k":["gear"]},{"b":"🗜️","k":["clamp"]},{"b":"⚖️","k":["balance","scale"]},{"b":"🦯","k":["accessibility","blind","cane","probing","white"]},{"b":"🔗","k":["link","links"]},{"b":"⛓️","k":["chains"]},{"b":"🪝","k":["catch","crook","curve","ensnare","hook","point","selling"]},{"b":"🧰","k":["box","chest","mechanic","red","tool","toolbox"]},{"b":"🧲","k":["attraction","horseshoe","magnet","magnetic","negative","positive","shape","u"]},{"b":"🪜","k":["climb","ladder","rung","step"]},{"b":"⚗️","k":["alembic"]},{"b":"🧪","k":["chemist","chemistry","experiment","lab","science","test","tube"]},{"b":"🧫","k":["bacteria","biologist","biology","culture","dish","lab","petri"]},{"b":"🧬","k":["biologist","dna","evolution","gene","genetics","life"]},{"b":"🔬","k":["experiment","investigate","lab","laboratory","microscope","science","tool"]},{"b":"🔭","k":["contact","extraterrestrial","science","telescope","tool"]},{"b":"📡","k":["aliens","antenna","contact","dish","satellite","science","signal"]},{"b":"💉","k":["doctor","flu","health","hospital","medicine","needle","shot","sick","syringe","tool","vaccination"]},{"b":"🩸","k":["bleed","blood","donation","drop","injury","medicine","menstruation","of"]},{"b":"💊","k":["doctor","drugs","health","medicated","medicine","pill","pills","sick","vitamin"]},{"b":"🩹","k":["adhesive","bandage"]},{"b":"🩼","k":["aid","cane","crutch","disability","help","hurt","injured","mobility","stick"]},{"b":"🩺","k":["doctor","heart","medicine","stethoscope"]},{"b":"🩻","k":["bones","doctor","medical","ray","skeleton","skull","x","x-ray","xray"]},{"b":"🚪","k":["back","closet","door","front"]},{"b":"🛗","k":["accessibility","elevator","hoist","lift"]},{"b":"🪞","k":["makeup","mirror","reflection","reflector","speculum"]},{"b":"🪟","k":["air","frame","fresh","opening","transparent","view","window"]},{"b":"🛏️","k":["bed"]},{"b":"🛋️","k":["and","couch","lamp"]},{"b":"🪑","k":["chair","seat","sit"]},{"b":"🚽","k":["bathroom","toilet","wc"]},{"b":"🪠","k":["cup","force","plumber","plunger","poop","suction","toilet"]},{"b":"🚿","k":["bath","shower","water"]},{"b":"🛁","k":["bath","bathtub"]},{"b":"🪤","k":["bait","cheese","lure","mouse","mousetrap","snare","trap"]},{"b":"🪒","k":["razor","sharp","shave"]},{"b":"🧴","k":["bottle","lotion","moisturizer","shampoo","sunscreen"]},{"b":"🧷","k":["diaper","pin","punk","rock","safety"]},{"b":"🧹","k":["broom","cleaning","sweeping","witch"]},{"b":"🧺","k":["basket","farming","laundry","picnic"]},{"b":"🧻","k":["of","paper","roll","toilet","towels"]},{"b":"🪣","k":["bucket","cask","pail","vat"]},{"b":"🧼","k":["bar","bathing","clean","cleaning","lather","soap","soapdish"]},{"b":"🫧","k":["bubble","bubbles","burp","clean","floating","pearl","soap","underwater"]},{"b":"🪥","k":["bathroom","brush","clean","dental","hygiene","teeth","toiletry","toothbrush"]},{"b":"🧽","k":["absorbing","cleaning","porous","soak","sponge"]},{"b":"🧯","k":["extinguish","extinguisher","fire","quench"]},{"b":"🛒","k":["cart","shopping","trolley"]},{"b":"🚬","k":["cigarette","smoking"]},{"b":"⚰️","k":["coffin","funeral"]},{"b":"🪦","k":["cemetery","dead","grave","graveyard","headstone","memorial","rip","tomb","tombstone"]},{"b":"⚱️","k":["funeral","urn"]},{"b":"🧿","k":["amulet","bead","blue","charm","evil-eye","nazar","talisman"]},{"b":"🪬","k":["amulet","fatima","fortune","guide","hamsa","hand","mary","miriam","palm","protect","protection"]},{"b":"🗿","k":["face","moai","moyai","statue","stone","stoneface","travel"]},{"b":"🪧","k":["card","demonstration","notice","picket","placard","plaque","protest","sign"]},{"b":"🪪","k":["card","credentials","document","id","identification","license","security"]}]},{"name":"Symbols","icon":"❤️","emojis":[{"b":"🏧","k":["atm","automated","bank","cash","money","sign","teller"]},{"b":"🚮","k":["bin","in","its","litter","litterbin","place","put","sign"]},{"b":"🚰","k":["drinking","potable","water"]},{"b":"♿","k":["access","accessibility","handicap","symbol","wheelchair"]},{"b":"🚹","k":["bathroom","lavatory","man","mens","men’s","restroom","room","toilet","wc"]},{"b":"🚺","k":["bathroom","lavatory","restroom","room","toilet","wc","woman","womens","women’s"]},{"b":"🚻","k":["bathroom","lavatory","restroom","toilet","wc"]},{"b":"🚼","k":["baby","changing","symbol"]},{"b":"🚾","k":["bathroom","closet","lavatory","restroom","toilet","water","wc"]},{"b":"🛂","k":["control","passport"]},{"b":"🛃","k":["customs","packing"]},{"b":"🛄","k":["airport","arrived","baggage","bags","case","checked","claim","journey","packing","plane","ready","travel","trip"]},{"b":"🛅","k":["baggage","case","left","locker","luggage"]},{"b":"⚠️","k":["warning","wip"]},{"b":"🚸","k":["child","children","crossing","pedestrian","traffic"]},{"b":"⛔","k":["do","entry","fail","forbidden","limit","no","not","pass","prohibited","traffic"]},{"b":"🚫","k":["block","entry","forbidden","no","not","prohibited","sign","smoke"]},{"b":"🚳","k":["bicycle","bicycles","bike","forbidden","no","not","prohibited"]},{"b":"🚭","k":["forbidden","no","not","prohibited","smoke","smoking"]},{"b":"🚯","k":["do","forbidden","litter","littering","no","not","prohibited"]},{"b":"🚱","k":["dry","non-drinking","non-potable","prohibited","water"]},{"b":"🚷","k":["forbidden","no","not","pedestrian","pedestrians","prohibited"]},{"b":"📵","k":["cell","forbidden","mobile","no","not","phone","phones","prohibited","telephone"]},{"b":"🔞","k":["18","age","eighteen","forbidden","no","not","one","prohibited","restriction","under","underage"]},{"b":"☢️","k":["radioactive"]},{"b":"☣️","k":["biohazard"]},{"b":"⬆️","k":["arrow","up"]},{"b":"↗️","k":["arrow","right","up-right","upper"]},{"b":"➡️","k":["arrow","right"]},{"b":"↘️","k":["arrow","down-right","lower","right"]},{"b":"⬇️","k":["arrow","down"]},{"b":"↙️","k":["arrow","down-left","left","lower"]},{"b":"⬅️","k":["arrow","left"]},{"b":"↖️","k":["arrow","left","up-left","upper"]},{"b":"↕️","k":["arrow","down","up","up-down"]},{"b":"↔️","k":["arrow","left","left-right","right"]},{"b":"↩️","k":["arrow","curving","hook","left","leftwards","return","right","with"]},{"b":"↪️","k":["arrow","curving","hook","left","right"]},{"b":"⤴️","k":["arrow","curving","heading","right","up"]},{"b":"⤵️","k":["arrow","curving","down","heading","right"]},{"b":"🔃","k":["arrow","arrows","clockwise","refresh","reload","vertical"]},{"b":"🔄","k":["again","anticlockwise","arrow","arrows","button","counterclockwise","deja","refresh","rewindershins","sync","vu"]},{"b":"🔙","k":["arrow","back"]},{"b":"🔚","k":["arrow","end"]},{"b":"🔛","k":["arrow","mark","on","on!"]},{"b":"🔜","k":["arrow","brb","omw","soon"]},{"b":"🔝","k":["arrow","homie","top","up"]},{"b":"🛐","k":["of","place","pray","religion","worship"]},{"b":"⚛️","k":["atom","symbol"]},{"b":"🕉️","k":["om"]},{"b":"✡️","k":["david","of","star"]},{"b":"☸️","k":["dharma","of","wheel"]},{"b":"☯️","k":["yang","yin"]},{"b":"✝️","k":["cross","latin"]},{"b":"☦️","k":["cross","orthodox"]},{"b":"☪️","k":["and","crescent","star"]},{"b":"☮️","k":["peace","symbol"]},{"b":"🕎","k":["candelabrum","candlestick","hanukkah","jewish","judaism","menorah","religion"]},{"b":"🔯","k":["dotted","fortune","jewish","judaism","pointed","six","six-pointed","star"]},{"b":"🪯","k":["deg","fateh","khalsa","khanda","religion","sikh","sikhism","tegh"]},{"b":"♈","k":["aries","horoscope","ram","zodiac"]},{"b":"♉","k":["bull","horoscope","ox","taurus","zodiac"]},{"b":"♊","k":["gemini","horoscope","twins","zodiac"]},{"b":"♋","k":["cancer","crab","horoscope","zodiac"]},{"b":"♌","k":["horoscope","leo","lion","zodiac"]},{"b":"♍","k":["horoscope","virgo","zodiac"]},{"b":"♎","k":["balance","horoscope","justice","libra","scales","zodiac"]},{"b":"♏","k":["horoscope","scorpio","scorpion","scorpius","zodiac"]},{"b":"♐","k":["archer","horoscope","sagittarius","zodiac"]},{"b":"♑","k":["capricorn","goat","horoscope","zodiac"]},{"b":"♒","k":["aquarius","bearer","horoscope","water","zodiac"]},{"b":"♓","k":["fish","horoscope","pisces","zodiac"]},{"b":"⛎","k":["bearer","ophiuchus","serpent","snake","zodiac"]},{"b":"🔀","k":["arrow","arrows","button","crossed","rightwards","shuffle","tracks","twisted"]},{"b":"🔁","k":["arrow","button","clockwise","loop","repeat"]},{"b":"🔂","k":["arrow","button","clockwise","once","one","repeat","single"]},{"b":"▶️","k":["arrow","button","forward","play"]},{"b":"⏩","k":["arrow","button","double","fast","fast-forward","forward"]},{"b":"⏭️","k":["button","next","track"]},{"b":"⏯️","k":["button","or","pause","play"]},{"b":"◀️","k":["arrow","backward","button","reverse"]},{"b":"⏪","k":["arrow","button","double","fast","reverse","rewind"]},{"b":"⏮️","k":["button","last","previous","track"]},{"b":"🔼","k":["arrow","button","red","small","up","upwards"]},{"b":"⏫","k":["arrow","button","double","fast","up"]},{"b":"🔽","k":["arrow","button","down","downwards","red","small"]},{"b":"⏬","k":["arrow","button","double","down","fast"]},{"b":"⏸️","k":["button","pause"]},{"b":"⏹️","k":["button","stop"]},{"b":"⏺️","k":["button","record"]},{"b":"⏏️","k":["button","eject"]},{"b":"🎦","k":["camera","cinema","film","movie"]},{"b":"🔅","k":["brightness","button","dim","low"]},{"b":"🔆","k":["bright","brightness","button","high","light"]},{"b":"📶","k":["antenna","bar","bars","cell","communication","mobile","phone","signal","strength","telephone","wifi"]},{"b":"🛜","k":["broadband","computer","connectivity","hotspot","internet","network","router","smartphone","wi-fi","wifi","wireless","wlan"]},{"b":"📳","k":["cell","communication","mobile","mode","phone","telephone","vibration"]},{"b":"📴","k":["cell","mobile","mute","off","phone","telephone"]},{"b":"♀️","k":["female","sign"]},{"b":"♂️","k":["male","sign"]},{"b":"⚧️","k":["symbol","transgender"]},{"b":"✖️","k":["heavy","multiplication","multiply","x"]},{"b":"➕","k":["+","heavy","plus","sign"]},{"b":"➖","k":["-","heavy","math","minus","sign","−"]},{"b":"➗","k":["divide","division","heavy","math","sign","÷"]},{"b":"🟰","k":["answer","equal","equality","equals","heavy","math","sign"]},{"b":"♾️","k":["infinity"]},{"b":"‼️","k":["bangbang","double","exclamation","mark"]},{"b":"⁉️","k":["exclamation","interrobang","mark","question"]},{"b":"❓","k":["?","confused","mark","punctuation","question","red"]},{"b":"❔","k":["?","grey","mark","outlined","punctuation","question","white"]},{"b":"❕","k":["!","exclamation","grey","mark","outlined","punctuation","white"]},{"b":"❗","k":["!","bang","exclamation","heavy","mark","punctuation","red"]},{"b":"〰️","k":["dash","wavy"]},{"b":"💱","k":["bank","currency","exchange","money"]},{"b":"💲","k":["billion","cash","charge","currency","dollar","heavy","million","money","pay","sign"]},{"b":"⚕️","k":["medical","symbol"]},{"b":"♻️","k":["environment","green","recycle","recycling","symbol"]},{"b":"⚜️","k":["de","fleur","fleur-de-lis","lis"]},{"b":"🔱","k":["anchor","emblem","poseidon","ship","tool","trident"]},{"b":"📛","k":["badge","name"]},{"b":"🔰","k":["beginner","chevron","for","green","japanese","leaf","symbol","tool","yellow"]},{"b":"⭕","k":["circle","heavy","hollow","large","o","red"]},{"b":"✅","k":["button","check","checked","checkmark","complete","completed","done","fixed","mark","tick","white","✓"]},{"b":"☑️","k":["ballot","box","check","with"]},{"b":"✔️","k":["check","heavy","mark"]},{"b":"❌","k":["cancel","cross","mark","multiplication","multiply","x","×"]},{"b":"❎","k":["button","cross","mark","multiplication","multiply","negative","square","squared","x","×"]},{"b":"➰","k":["curl","curly","loop"]},{"b":"➿","k":["curl","curly","double","loop"]},{"b":"〽️","k":["alternation","mark","part"]},{"b":"✳️","k":["asterisk","eight","eight-spoked","spoked"]},{"b":"✴️","k":["black","eight","eight-pointed","pointed","star"]},{"b":"❇️","k":["sparkle"]},{"b":"©️","k":["copyright"]},{"b":"®️","k":["registered"]},{"b":"™️","k":["mark","tm","trade","trademark"]},{"b":"#️⃣","k":["hash","keycap:","number"]},{"b":"*️⃣","k":["asterisk","keycap:"]},{"b":"0️⃣","k":["keycap:","zero"]},{"b":"1️⃣","k":["keycap:","one"]},{"b":"2️⃣","k":["keycap:","two"]},{"b":"3️⃣","k":["keycap:","three"]},{"b":"4️⃣","k":["four","keycap:"]},{"b":"5️⃣","k":["five","keycap:"]},{"b":"6️⃣","k":["keycap:","six"]},{"b":"7️⃣","k":["keycap:","seven"]},{"b":"8️⃣","k":["eight","keycap:"]},{"b":"9️⃣","k":["keycap:","nine"]},{"b":"🔟","k":["keycap","keycap:","ten"]},{"b":"🔠","k":["abcd","capital","input","latin","letters","uppercase"]},{"b":"🔡","k":["abcd","input","latin","letters","lowercase"]},{"b":"🔢","k":["1234","input","numbers"]},{"b":"🔣","k":["%","&","input","symbols","♪","〒"]},{"b":"🔤","k":["abc","alphabet","input","latin","letters"]},{"b":"🅰️","k":["(blood","a","button","type)"]},{"b":"🆎","k":["(blood","ab","blood","button","type","type)"]},{"b":"🅱️","k":["(blood","b","button","type)"]},{"b":"🆑","k":["button","cl"]},{"b":"🆒","k":["button","cool"]},{"b":"🆓","k":["button","free"]},{"b":"ℹ️","k":["information","source"]},{"b":"🆔","k":["button","id","identity"]},{"b":"Ⓜ️","k":["circled","m"]},{"b":"🆕","k":["button","fresh","new"]},{"b":"🆖","k":["button","ng"]},{"b":"🅾️","k":["(blood","button","o2","type)"]},{"b":"🆗","k":["button","ok","okay","yes"]},{"b":"🅿️","k":["button","parking"]},{"b":"🆘","k":["button","emergency","help","sos"]},{"b":"🆙","k":["button","mark","up","up!"]},{"b":"🆚","k":["button","versus","vs"]},{"b":"🈁","k":["button","here","japanese","katakana","koko","“here”"]},{"b":"🈂️","k":["button","charge”","japanese","sa","“service"]},{"b":"🈷️","k":["amount”","button","japanese","u6708","“monthly"]},{"b":"🈶","k":["button","charge","charge”","free","ideograph","japanese","not","u6709","“not"]},{"b":"🈯","k":["button","ideograph","japanese","reserved","u6307","“reserved”"]},{"b":"🉐","k":["advantage","bargain","button","ideograph","japanese","“bargain”"]},{"b":"🈹","k":["button","discount","ideograph","japanese","u5272","“discount”"]},{"b":"🈚","k":["button","charge","charge”","free","ideograph","japanese","u7121","“free"]},{"b":"🈲","k":["button","ideograph","japanese","prohibited","u7981","“prohibited”"]},{"b":"🉑","k":["accept","acceptable","button","ideograph","japanese","“acceptable”"]},{"b":"🈸","k":["application","button","ideograph","japanese","u7533","“application”"]},{"b":"🈴","k":["button","grade","grade”","ideograph","japanese","passing","u5408","“passing"]},{"b":"🈳","k":["button","ideograph","japanese","u7a7a","vacancy","“vacancy”"]},{"b":"㊗️","k":["button","congratulations","japanese","“congratulations”"]},{"b":"㊙️","k":["button","japanese","secret","“secret”"]},{"b":"🈺","k":["business","business”","button","for","ideograph","japanese","open","u55b6","“open"]},{"b":"🈵","k":["button","ideograph","japanese","no","u6e80","vacancy","vacancy”","“no"]},{"b":"🔴","k":["circle","geometric","red"]},{"b":"🟠","k":["circle","orange"]},{"b":"🟡","k":["circle","yellow"]},{"b":"🟢","k":["circle","green"]},{"b":"🔵","k":["blue","circle","geometric","large"]},{"b":"🟣","k":["circle","purple"]},{"b":"🟤","k":["brown","circle"]},{"b":"⚫","k":["black","circle","geometric"]},{"b":"⚪","k":["circle","geometric","white"]},{"b":"🟥","k":["card","penalty","red","square"]},{"b":"🟧","k":["orange","square"]},{"b":"🟨","k":["card","penalty","square","yellow"]},{"b":"🟩","k":["green","square"]},{"b":"🟦","k":["blue","square"]},{"b":"🟪","k":["purple","square"]},{"b":"🟫","k":["brown","square"]},{"b":"⬛","k":["black","geometric","large","square"]},{"b":"⬜","k":["geometric","large","square","white"]},{"b":"◼️","k":["black","medium","square"]},{"b":"◻️","k":["medium","square","white"]},{"b":"◾","k":["black","geometric","medium","medium-small","small","square"]},{"b":"◽","k":["geometric","medium","medium-small","small","square","white"]},{"b":"▪️","k":["black","small","square"]},{"b":"▫️","k":["small","square","white"]},{"b":"🔶","k":["diamond","geometric","large","orange"]},{"b":"🔷","k":["blue","diamond","geometric","large"]},{"b":"🔸","k":["diamond","geometric","orange","small"]},{"b":"🔹","k":["blue","diamond","geometric","small"]},{"b":"🔺","k":["geometric","pointed","red","small","triangle","up"]},{"b":"🔻","k":["down","geometric","pointed","red","small","triangle"]},{"b":"💠","k":["a","comic","diamond","dot","geometric","inside","shape","with"]},{"b":"🔘","k":["button","geometric","radio"]},{"b":"🔳","k":["button","geometric","outlined","square","white"]},{"b":"🔲","k":["black","button","geometric","square"]}]},{"name":"Flags","icon":"🏁","emojis":[{"b":"🏁","k":["checkered","chequered","finish","flag","flags","game","milestone","race","racing","sport","win"]},{"b":"🚩","k":["construction","flag","golf","on","post","triangular"]},{"b":"🎌","k":["celebration","cross","crossed","flags","japanese"]},{"b":"🏴","k":["black","flag","waving"]},{"b":"🏳️","k":["flag","white"]},{"b":"🏳️‍🌈","k":["flag","pride","rainbow"]},{"b":"🏳️‍⚧️","k":["flag","transgender"]},{"b":"🏴‍☠️","k":["flag","pirate"]},{"b":"🇦🇨","k":["ascension","flag:","island"]},{"b":"🇦🇩","k":["andorra","flag:"]},{"b":"🇦🇪","k":["arab","emirates","flag:","united"]},{"b":"🇦🇫","k":["afghanistan","flag:"]},{"b":"🇦🇬","k":["antigua","barbuda","flag:"]},{"b":"🇦🇮","k":["anguilla","flag:"]},{"b":"🇦🇱","k":["albania","flag:"]},{"b":"🇦🇲","k":["armenia","flag:"]},{"b":"🇦🇴","k":["angola","flag:"]},{"b":"🇦🇶","k":["antarctica","flag:"]},{"b":"🇦🇷","k":["argentina","flag:"]},{"b":"🇦🇸","k":["american","flag:","samoa"]},{"b":"🇦🇹","k":["austria","flag:"]},{"b":"🇦🇺","k":["australia","flag:"]},{"b":"🇦🇼","k":["aruba","flag:"]},{"b":"🇦🇽","k":["aland","flag:","islands","åland"]},{"b":"🇦🇿","k":["azerbaijan","flag:"]},{"b":"🇧🇦","k":["bosnia","flag:","herzegovina"]},{"b":"🇧🇧","k":["barbados","flag:"]},{"b":"🇧🇩","k":["bangladesh","flag:"]},{"b":"🇧🇪","k":["belgium","flag:"]},{"b":"🇧🇫","k":["burkina","faso","flag:"]},{"b":"🇧🇬","k":["bulgaria","flag:"]},{"b":"🇧🇭","k":["bahrain","flag:"]},{"b":"🇧🇮","k":["burundi","flag:"]},{"b":"🇧🇯","k":["benin","flag:"]},{"b":"🇧🇱","k":["barthelemy","barthélemy","flag:","st","st."]},{"b":"🇧🇲","k":["bermuda","flag:"]},{"b":"🇧🇳","k":["brunei","flag:"]},{"b":"🇧🇴","k":["bolivia","flag:"]},{"b":"🇧🇶","k":["caribbean","flag:","netherlands"]},{"b":"🇧🇷","k":["brazil","flag:"]},{"b":"🇧🇸","k":["bahamas","flag:"]},{"b":"🇧🇹","k":["bhutan","flag:"]},{"b":"🇧🇻","k":["bouvet","flag:","island"]},{"b":"🇧🇼","k":["botswana","flag:"]},{"b":"🇧🇾","k":["belarus","flag:"]},{"b":"🇧🇿","k":["belize","flag:"]},{"b":"🇨🇦","k":["canada","flag:"]},{"b":"🇨🇨","k":["(keeling)","cocos","flag:","islands","keeling"]},{"b":"🇨🇩","k":["congo","flag:","kinshasa"]},{"b":"🇨🇫","k":["african","central","flag:","republic"]},{"b":"🇨🇬","k":["brazzaville","congo","flag:"]},{"b":"🇨🇭","k":["flag:","switzerland"]},{"b":"🇨🇮","k":["cote","côte","divoire","d’ivoire","flag:","ivory"]},{"b":"🇨🇰","k":["cook","flag:","islands"]},{"b":"🇨🇱","k":["chile","flag:"]},{"b":"🇨🇲","k":["cameroon","flag:"]},{"b":"🇨🇳","k":["china","cn","flag:"]},{"b":"🇨🇴","k":["colombia","flag:"]},{"b":"🇨🇵","k":["clipperton","flag:","island"]},{"b":"🇨🇷","k":["costa","flag:","rica"]},{"b":"🇨🇺","k":["cuba","flag:"]},{"b":"🇨🇻","k":["cape","flag:","verde"]},{"b":"🇨🇼","k":["curacao","curaçao","flag:"]},{"b":"🇨🇽","k":["christmas","flag:","island"]},{"b":"🇨🇾","k":["cyprus","flag:"]},{"b":"🇨🇿","k":["czech","czechia","flag:","republic"]},{"b":"🇩🇪","k":["de","flag","flag:","germany"]},{"b":"🇩🇬","k":["diego","flag:","garcia"]},{"b":"🇩🇯","k":["djibouti","flag:"]},{"b":"🇩🇰","k":["denmark","flag:"]},{"b":"🇩🇲","k":["dominica","flag:"]},{"b":"🇩🇴","k":["dominican","flag:","republic"]},{"b":"🇩🇿","k":["algeria","flag:"]},{"b":"🇪🇦","k":["ceuta","flag:","melilla"]},{"b":"🇪🇨","k":["ecuador","flag:"]},{"b":"🇪🇪","k":["estonia","flag:"]},{"b":"🇪🇬","k":["egypt","flag:"]},{"b":"🇪🇭","k":["flag:","sahara","western"]},{"b":"🇪🇷","k":["eritrea","flag:"]},{"b":"🇪🇸","k":["es","flag:","spain"]},{"b":"🇪🇹","k":["ethiopia","flag:"]},{"b":"🇪🇺","k":["eu","european","flag:","union"]},{"b":"🇫🇮","k":["finland","flag:"]},{"b":"🇫🇯","k":["fiji","flag:"]},{"b":"🇫🇰","k":["falkland","flag:","islands"]},{"b":"🇫🇲","k":["flag:","micronesia"]},{"b":"🇫🇴","k":["faroe","flag:","islands"]},{"b":"🇫🇷","k":["flag:","fr","france","french"]},{"b":"🇬🇦","k":["flag:","gabon"]},{"b":"🇬🇧","k":["british","flag","flag:","gb","kingdom","uk","united"]},{"b":"🇬🇩","k":["flag:","grenada"]},{"b":"🇬🇪","k":["flag:","georgia"]},{"b":"🇬🇫","k":["flag:","french","guiana"]},{"b":"🇬🇬","k":["flag:","guernsey"]},{"b":"🇬🇭","k":["flag:","ghana"]},{"b":"🇬🇮","k":["flag:","gibraltar"]},{"b":"🇬🇱","k":["flag:","greenland"]},{"b":"🇬🇲","k":["flag:","gambia"]},{"b":"🇬🇳","k":["flag:","guinea"]},{"b":"🇬🇵","k":["flag:","guadeloupe"]},{"b":"🇬🇶","k":["equatorial","flag:","guinea"]},{"b":"🇬🇷","k":["flag:","greece"]},{"b":"🇬🇸","k":["flag:","georgia","islands","sandwich","south"]},{"b":"🇬🇹","k":["flag:","guatemala"]},{"b":"🇬🇺","k":["flag:","guam"]},{"b":"🇬🇼","k":["bissau","flag:","guinea","guinea-bissau"]},{"b":"🇬🇾","k":["flag:","guyana"]},{"b":"🇭🇰","k":["china","flag:","hong","kong","sar"]},{"b":"🇭🇲","k":["flag:","heard","islands","mcdonald"]},{"b":"🇭🇳","k":["flag:","honduras"]},{"b":"🇭🇷","k":["croatia","flag:"]},{"b":"🇭🇹","k":["flag:","haiti"]},{"b":"🇭🇺","k":["flag:","hungary"]},{"b":"🇮🇨","k":["canary","flag:","islands"]},{"b":"🇮🇩","k":["flag:","indonesia"]},{"b":"🇮🇪","k":["flag:","ireland"]},{"b":"🇮🇱","k":["flag:","israel"]},{"b":"🇮🇲","k":["flag:","isle","man","of"]},{"b":"🇮🇳","k":["flag:","india"]},{"b":"🇮🇴","k":["british","flag:","indian","ocean","territory"]},{"b":"🇮🇶","k":["flag:","iraq"]},{"b":"🇮🇷","k":["flag:","iran"]},{"b":"🇮🇸","k":["flag:","iceland"]},{"b":"🇮🇹","k":["flag:","it","italy"]},{"b":"🇯🇪","k":["flag:","jersey"]},{"b":"🇯🇲","k":["flag:","jamaica"]},{"b":"🇯🇴","k":["flag:","jordan"]},{"b":"🇯🇵","k":["flag:","japan","jp"]},{"b":"🇰🇪","k":["flag:","kenya"]},{"b":"🇰🇬","k":["flag:","kyrgyzstan"]},{"b":"🇰🇭","k":["cambodia","flag:"]},{"b":"🇰🇮","k":["flag:","kiribati"]},{"b":"🇰🇲","k":["comoros","flag:"]},{"b":"🇰🇳","k":["flag:","kitts","nevis","st","st."]},{"b":"🇰🇵","k":["flag:","korea","north"]},{"b":"🇰🇷","k":["flag:","korea","kr","south"]},{"b":"🇰🇼","k":["flag:","kuwait"]},{"b":"🇰🇾","k":["cayman","flag:","islands"]},{"b":"🇰🇿","k":["flag:","kazakhstan"]},{"b":"🇱🇦","k":["flag:","laos"]},{"b":"🇱🇧","k":["flag:","lebanon"]},{"b":"🇱🇨","k":["flag:","lucia","st","st."]},{"b":"🇱🇮","k":["flag:","liechtenstein"]},{"b":"🇱🇰","k":["flag:","lanka","sri"]},{"b":"🇱🇷","k":["flag:","liberia"]},{"b":"🇱🇸","k":["flag:","lesotho"]},{"b":"🇱🇹","k":["flag:","lithuania"]},{"b":"🇱🇺","k":["flag:","luxembourg"]},{"b":"🇱🇻","k":["flag:","latvia"]},{"b":"🇱🇾","k":["flag:","libya"]},{"b":"🇲🇦","k":["flag:","morocco"]},{"b":"🇲🇨","k":["flag:","monaco"]},{"b":"🇲🇩","k":["flag:","moldova"]},{"b":"🇲🇪","k":["flag:","montenegro"]},{"b":"🇲🇫","k":["flag:","martin","st","st."]},{"b":"🇲🇬","k":["flag:","madagascar"]},{"b":"🇲🇭","k":["flag:","islands","marshall"]},{"b":"🇲🇰","k":["flag:","macedonia","north"]},{"b":"🇲🇱","k":["flag:","mali"]},{"b":"🇲🇲","k":["(burma)","burma","flag:","myanmar"]},{"b":"🇲🇳","k":["flag:","mongolia"]},{"b":"🇲🇴","k":["china","flag:","macao","macau","sar"]},{"b":"🇲🇵","k":["flag:","islands","mariana","northern"]},{"b":"🇲🇶","k":["flag:","martinique"]},{"b":"🇲🇷","k":["flag:","mauritania"]},{"b":"🇲🇸","k":["flag:","montserrat"]},{"b":"🇲🇹","k":["flag:","malta"]},{"b":"🇲🇺","k":["flag:","mauritius"]},{"b":"🇲🇻","k":["flag:","maldives"]},{"b":"🇲🇼","k":["flag:","malawi"]},{"b":"🇲🇽","k":["flag:","mexico"]},{"b":"🇲🇾","k":["flag:","malaysia"]},{"b":"🇲🇿","k":["flag:","mozambique"]},{"b":"🇳🇦","k":["flag:","namibia"]},{"b":"🇳🇨","k":["caledonia","flag:","new"]},{"b":"🇳🇪","k":["flag:","niger"]},{"b":"🇳🇫","k":["flag:","island","norfolk"]},{"b":"🇳🇬","k":["flag:","nigeria"]},{"b":"🇳🇮","k":["flag:","nicaragua"]},{"b":"🇳🇱","k":["flag:","netherlands"]},{"b":"🇳🇴","k":["flag:","norway"]},{"b":"🇳🇵","k":["flag:","nepal"]},{"b":"🇳🇷","k":["flag:","nauru"]},{"b":"🇳🇺","k":["flag:","niue"]},{"b":"🇳🇿","k":["flag:","new","zealand"]},{"b":"🇴🇲","k":["flag:","oman"]},{"b":"🇵🇦","k":["flag:","panama"]},{"b":"🇵🇪","k":["flag:","peru"]},{"b":"🇵🇫","k":["flag:","french","polynesia"]},{"b":"🇵🇬","k":["flag:","guinea","new","papua"]},{"b":"🇵🇭","k":["flag:","philippines"]},{"b":"🇵🇰","k":["flag:","pakistan"]},{"b":"🇵🇱","k":["flag:","poland"]},{"b":"🇵🇲","k":["flag:","miquelon","pierre","st","st."]},{"b":"🇵🇳","k":["flag:","islands","pitcairn"]},{"b":"🇵🇷","k":["flag:","puerto","rico"]},{"b":"🇵🇸","k":["flag:","palestinian","territories"]},{"b":"🇵🇹","k":["flag:","portugal"]},{"b":"🇵🇼","k":["flag:","palau"]},{"b":"🇵🇾","k":["flag:","paraguay"]},{"b":"🇶🇦","k":["flag:","qatar"]},{"b":"🇷🇪","k":["flag:","reunion","réunion"]},{"b":"🇷🇴","k":["flag:","romania"]},{"b":"🇷🇸","k":["flag:","serbia"]},{"b":"🇷🇺","k":["flag:","ru","russia"]},{"b":"🇷🇼","k":["flag:","rwanda"]},{"b":"🇸🇦","k":["arabia","flag:","saudi"]},{"b":"🇸🇧","k":["flag:","islands","solomon"]},{"b":"🇸🇨","k":["flag:","seychelles"]},{"b":"🇸🇩","k":["flag:","sudan"]},{"b":"🇸🇪","k":["flag:","sweden"]},{"b":"🇸🇬","k":["flag:","singapore"]},{"b":"🇸🇭","k":["flag:","helena","st","st."]},{"b":"🇸🇮","k":["flag:","slovenia"]},{"b":"🇸🇯","k":["flag:","jan","mayen","svalbard"]},{"b":"🇸🇰","k":["flag:","slovakia"]},{"b":"🇸🇱","k":["flag:","leone","sierra"]},{"b":"🇸🇲","k":["flag:","marino","san"]},{"b":"🇸🇳","k":["flag:","senegal"]},{"b":"🇸🇴","k":["flag:","somalia"]},{"b":"🇸🇷","k":["flag:","suriname"]},{"b":"🇸🇸","k":["flag:","south","sudan"]},{"b":"🇸🇹","k":["flag:","principe","príncipe","sao","são","tome","tomé"]},{"b":"🇸🇻","k":["el","flag:","salvador"]},{"b":"🇸🇽","k":["flag:","maarten","sint"]},{"b":"🇸🇾","k":["flag:","syria"]},{"b":"🇸🇿","k":["eswatini","flag:","swaziland"]},{"b":"🇹🇦","k":["cunha","da","flag:","tristan"]},{"b":"🇹🇨","k":["caicos","flag:","islands","turks"]},{"b":"🇹🇩","k":["chad","flag:"]},{"b":"🇹🇫","k":["flag:","french","southern","territories"]},{"b":"🇹🇬","k":["flag:","togo"]},{"b":"🇹🇭","k":["flag:","thailand"]},{"b":"🇹🇯","k":["flag:","tajikistan"]},{"b":"🇹🇰","k":["flag:","tokelau"]},{"b":"🇹🇱","k":["flag:","leste","timor","timor-leste"]},{"b":"🇹🇲","k":["flag:","turkmenistan"]},{"b":"🇹🇳","k":["flag:","tunisia"]},{"b":"🇹🇴","k":["flag:","tonga"]},{"b":"🇹🇷","k":["flag:","tr","turkey"]},{"b":"🇹🇹","k":["flag:","tobago","trinidad"]},{"b":"🇹🇻","k":["flag:","tuvalu"]},{"b":"🇹🇼","k":["flag:","taiwan"]},{"b":"🇹🇿","k":["flag:","tanzania"]},{"b":"🇺🇦","k":["flag:","ukraine"]},{"b":"🇺🇬","k":["flag:","uganda"]},{"b":"🇺🇲","k":["flag:","islands","outlying","u.s.","us"]},{"b":"🇺🇳","k":["flag:","nations","united"]},{"b":"🇺🇸","k":["america","flag","flag:","states","united","us"]},{"b":"🇺🇾","k":["flag:","uruguay"]},{"b":"🇺🇿","k":["flag:","uzbekistan"]},{"b":"🇻🇦","k":["city","flag:","vatican"]},{"b":"🇻🇨","k":["flag:","grenadines","st","st.","vincent"]},{"b":"🇻🇪","k":["flag:","venezuela"]},{"b":"🇻🇬","k":["british","flag:","islands","virgin"]},{"b":"🇻🇮","k":["flag:","islands","u.s.","us","virgin"]},{"b":"🇻🇳","k":["flag:","vietnam"]},{"b":"🇻🇺","k":["flag:","vanuatu"]},{"b":"🇼🇫","k":["flag:","futuna","wallis"]},{"b":"🇼🇸","k":["flag:","samoa"]},{"b":"🇽🇰","k":["flag:","kosovo"]},{"b":"🇾🇪","k":["flag:","yemen"]},{"b":"🇾🇹","k":["flag:","mayotte"]},{"b":"🇿🇦","k":["africa","flag:","south"]},{"b":"🇿🇲","k":["flag:","zambia"]},{"b":"🇿🇼","k":["flag:","zimbabwe"]},{"b":"🏴󠁧󠁢󠁥󠁮󠁧󠁿","k":["england","flag:"]},{"b":"🏴󠁧󠁢󠁳󠁣󠁴󠁿","k":["flag:","scotland"]},{"b":"🏴󠁧󠁢󠁷󠁬󠁳󠁿","k":["flag:","wales"]}]}]} \ No newline at end of file diff --git a/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/AlertDialogs.kt b/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/AlertDialogs.kt index c16751634..dc22912b4 100644 --- a/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/AlertDialogs.kt +++ b/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/AlertDialogs.kt @@ -25,6 +25,7 @@ import androidx.compose.foundation.verticalScroll import androidx.compose.material3.AlertDialog import androidx.compose.material3.Button import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text @@ -66,6 +67,7 @@ import org.meshtastic.core.ui.util.annotatedStringFromHtml * @param dismissable Whether the dialog can be dismissed by clicking outside or pressing back. */ @Composable +@OptIn(ExperimentalMaterial3ExpressiveApi::class) @Suppress("LongMethod", "CyclomaticComplexMethod") fun MeshtasticDialog( modifier: Modifier = Modifier, @@ -137,7 +139,7 @@ fun MeshtasticDialog( text = titleText, modifier = Modifier.fillMaxWidth(), textAlign = TextAlign.Center, - style = MaterialTheme.typography.titleLarge, + style = MaterialTheme.typography.headlineSmallEmphasized, ) }, text = { @@ -167,7 +169,7 @@ fun MeshtasticDialog( } } }, - shape = RoundedCornerShape(16.dp), + shape = RoundedCornerShape(28.dp), ) } diff --git a/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/BottomSheetDialog.kt b/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/BottomSheetDialog.kt deleted file mode 100644 index 13327e855..000000000 --- a/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/BottomSheetDialog.kt +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (c) 2026 Meshtastic LLC - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package org.meshtastic.core.ui.component - -import androidx.compose.foundation.background -import androidx.compose.foundation.clickable -import androidx.compose.foundation.interaction.MutableInteractionSource -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.ColumnScope -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material3.MaterialTheme -import androidx.compose.runtime.Composable -import androidx.compose.runtime.remember -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.unit.dp -import androidx.compose.ui.window.Dialog -import androidx.compose.ui.window.DialogProperties - -@Composable -fun BottomSheetDialog( - onDismiss: () -> Unit, - modifier: Modifier = Modifier, - content: @Composable ColumnScope.() -> Unit, -) = Dialog(onDismissRequest = onDismiss, properties = DialogProperties(usePlatformDefaultWidth = false)) { - Box( - modifier = - Modifier.fillMaxSize() - .background(Color.Transparent) - .clickable( - onClick = onDismiss, - indication = null, - interactionSource = remember { MutableInteractionSource() }, - ), - ) { - Column( - modifier = - modifier - .align(Alignment.BottomCenter) - .background( - color = MaterialTheme.colorScheme.surface.copy(alpha = 1f), - shape = RoundedCornerShape(topStart = 16.dp, topEnd = 16.dp), - ) - .padding(16.dp), - content = content, - ) - } -} diff --git a/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/ChannelItem.kt b/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/ChannelItem.kt index d037c84a0..7eeaea444 100644 --- a/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/ChannelItem.kt +++ b/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/ChannelItem.kt @@ -14,6 +14,8 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ +@file:OptIn(ExperimentalMaterial3ExpressiveApi::class) + package org.meshtastic.core.ui.component import androidx.compose.foundation.clickable @@ -23,6 +25,7 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.material3.AssistChip import androidx.compose.material3.Card +import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -54,7 +57,7 @@ fun ChannelItem( modifier = Modifier.weight(1f), overflow = TextOverflow.Ellipsis, maxLines = 1, - style = MaterialTheme.typography.bodyLarge, + style = MaterialTheme.typography.titleMediumEmphasized, color = fontColor, ) content() diff --git a/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/ClickableTextField.kt b/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/ClickableTextField.kt deleted file mode 100644 index 4e30b09b5..000000000 --- a/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/ClickableTextField.kt +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (c) 2026 Meshtastic LLC - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package org.meshtastic.core.ui.component - -import androidx.compose.foundation.interaction.MutableInteractionSource -import androidx.compose.foundation.interaction.collectIsPressedAsState -import androidx.compose.material3.Icon -import androidx.compose.material3.OutlinedTextField -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.remember -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.vector.ImageVector -import org.jetbrains.compose.resources.StringResource -import org.jetbrains.compose.resources.stringResource - -@Composable -fun ClickableTextField( - label: StringResource, - enabled: Boolean, - trailingIcon: ImageVector, - value: String, - onClick: () -> Unit, - modifier: Modifier = Modifier, - isError: Boolean = false, - trailingIconContentDescription: String? = null, -) { - val source = remember { MutableInteractionSource() } - val isPressed by source.collectIsPressedAsState() - if (isPressed) onClick() - - OutlinedTextField( - value, - onValueChange = {}, - enabled = enabled, - readOnly = true, - label = { Text(stringResource(label)) }, - trailingIcon = { Icon(trailingIcon, trailingIconContentDescription) }, - isError = isError, - interactionSource = source, - modifier = modifier, - ) -} diff --git a/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/ListItem.kt b/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/ListItem.kt index e34199ac9..cb4b398d0 100644 --- a/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/ListItem.kt +++ b/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/ListItem.kt @@ -14,11 +14,12 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ +@file:OptIn(ExperimentalMaterial3ExpressiveApi::class) + package org.meshtastic.core.ui.component -import androidx.compose.foundation.clickable -import androidx.compose.foundation.combinedClickable import androidx.compose.foundation.layout.size +import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi import androidx.compose.material3.Icon import androidx.compose.material3.ListItem import androidx.compose.material3.ListItemDefaults @@ -29,6 +30,7 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.RectangleShape import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.platform.Clipboard import androidx.compose.ui.platform.LocalClipboard @@ -49,14 +51,14 @@ fun ListItem( text: String, modifier: Modifier = Modifier, supportingText: String? = null, - textColor: Color = LocalContentColor.current, - supportingTextColor: Color = LocalContentColor.current, + textColor: Color = Color.Unspecified, + supportingTextColor: Color = Color.Unspecified, copyable: Boolean = false, enabled: Boolean = true, leadingIcon: ImageVector? = null, - leadingIconTint: Color = LocalContentColor.current, + leadingIconTint: Color = Color.Unspecified, trailingIcon: ImageVector? = MeshtasticIcons.ChevronRight, - trailingIconTint: Color = LocalContentColor.current, + trailingIconTint: Color = Color.Unspecified, onClick: (() -> Unit)? = null, ) { val clipboard: Clipboard = LocalClipboard.current @@ -89,10 +91,10 @@ fun SwitchListItem( text: String, onClick: () -> Unit, modifier: Modifier = Modifier, - textColor: Color = LocalContentColor.current, + textColor: Color = Color.Unspecified, enabled: Boolean = true, leadingIcon: ImageVector? = null, - leadingIconTint: Color = LocalContentColor.current, + leadingIconTint: Color = Color.Unspecified, ) { BasicListItem( text = text, @@ -113,42 +115,57 @@ fun SwitchListItem( * This is a core component that should facilitate most list item use cases. Please carefully consider if modifying this * is really necessary before doing so. * + * Uses the M3 Expressive interactive [ListItem] overload which provides built-in shape morphing on press/hover and + * proper disabled styling. + * * @see [LinkedCoordinatesItem] for example usage */ @Composable fun BasicListItem( text: String, modifier: Modifier = Modifier, - textColor: Color = LocalContentColor.current, + textColor: Color = Color.Unspecified, supportingText: String? = null, - supportingTextColor: Color = LocalContentColor.current, + supportingTextColor: Color = Color.Unspecified, enabled: Boolean = true, leadingIcon: ImageVector? = null, - leadingIconTint: Color = LocalContentColor.current, + leadingIconTint: Color = Color.Unspecified, trailingContent: @Composable (() -> Unit)? = null, onClick: (() -> Unit)? = null, onLongClick: (() -> Unit)? = null, ) { - ListItem( - modifier = - if (onLongClick != null) { - modifier.combinedClickable(enabled = enabled, onLongClick = onLongClick, onClick = onClick ?: {}) - } else if (onClick != null) { - modifier.clickable(enabled = enabled, onClick = onClick) - } else { - modifier - }, - colors = ListItemDefaults.colors(containerColor = Color.Transparent), - headlineContent = { Text(text = text, color = textColor) }, - supportingContent = supportingText?.let { { Text(text = it, color = supportingTextColor) } }, - leadingContent = leadingIcon.icon(leadingIconTint), - trailingContent = trailingContent, - ) + if (onClick != null) { + ListItem( + onClick = onClick, + modifier = modifier, + enabled = enabled, + onLongClick = onLongClick, + shapes = ListItemDefaults.shapes(shape = RectangleShape), + colors = ListItemDefaults.colors(containerColor = Color.Transparent), + leadingContent = leadingIcon.icon(leadingIconTint), + trailingContent = trailingContent, + supportingContent = supportingText?.let { { Text(text = it, color = supportingTextColor) } }, + content = { Text(text = text, color = textColor) }, + ) + } else { + ListItem( + modifier = modifier, + colors = ListItemDefaults.colors(containerColor = Color.Transparent), + headlineContent = { Text(text = text, color = textColor) }, + supportingContent = supportingText?.let { { Text(text = it, color = supportingTextColor) } }, + leadingContent = leadingIcon.icon(leadingIconTint), + trailingContent = trailingContent, + ) + } } @Composable -fun ImageVector?.icon(tint: Color = LocalContentColor.current): @Composable (() -> Unit)? = - this?.let { { Icon(imageVector = it, contentDescription = null, modifier = Modifier.size(24.dp), tint = tint) } } +fun ImageVector?.icon(tint: Color = Color.Unspecified): @Composable (() -> Unit)? = this?.let { + { + val resolvedTint = if (tint == Color.Unspecified) LocalContentColor.current else tint + Icon(imageVector = it, contentDescription = null, modifier = Modifier.size(24.dp), tint = resolvedTint) + } +} @Preview(showBackground = true) @Composable diff --git a/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/MainAppBar.kt b/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/MainAppBar.kt index 41b6b8a3d..4df0c8b5a 100644 --- a/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/MainAppBar.kt +++ b/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/MainAppBar.kt @@ -74,7 +74,7 @@ fun MainAppBar( text = title, maxLines = 1, overflow = TextOverflow.Ellipsis, - style = MaterialTheme.typography.titleLarge, + style = MaterialTheme.typography.titleLargeEmphasized, ) }, subtitle = { diff --git a/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/MenuFAB.kt b/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/MenuFAB.kt index db82fe7fe..163d75443 100644 --- a/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/MenuFAB.kt +++ b/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/MenuFAB.kt @@ -16,13 +16,19 @@ */ package org.meshtastic.core.ui.component +import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi import androidx.compose.material3.FloatingActionButtonMenu import androidx.compose.material3.FloatingActionButtonMenuItem import androidx.compose.material3.Icon +import androidx.compose.material3.PlainTooltip import androidx.compose.material3.Text import androidx.compose.material3.ToggleFloatingActionButton import androidx.compose.material3.ToggleFloatingActionButtonDefaults +import androidx.compose.material3.TooltipAnchorPosition +import androidx.compose.material3.TooltipBox +import androidx.compose.material3.TooltipDefaults +import androidx.compose.material3.rememberTooltipState import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -32,7 +38,7 @@ import org.meshtastic.core.ui.icon.Close import org.meshtastic.core.ui.icon.MeshtasticIcons import org.meshtastic.core.ui.icon.OfflineShare -@OptIn(ExperimentalMaterial3ExpressiveApi::class) +@OptIn(ExperimentalMaterial3ExpressiveApi::class, ExperimentalMaterial3Api::class) @Composable fun MenuFAB( expanded: Boolean, @@ -46,15 +52,21 @@ fun MenuFAB( modifier = modifier.then(if (testTag != null) Modifier.testTag(testTag) else Modifier), expanded = expanded, button = { - ToggleFloatingActionButton( - checked = expanded, - onCheckedChange = onExpandedChange, - content = { - val imageVector = if (expanded) MeshtasticIcons.Close else MeshtasticIcons.OfflineShare - Icon(imageVector = imageVector, contentDescription = contentDescription) - }, - containerColor = ToggleFloatingActionButtonDefaults.containerColor(), - ) + TooltipBox( + positionProvider = TooltipDefaults.rememberTooltipPositionProvider(TooltipAnchorPosition.Above), + tooltip = { contentDescription?.let { PlainTooltip { Text(it) } } }, + state = rememberTooltipState(), + ) { + ToggleFloatingActionButton( + checked = expanded, + onCheckedChange = onExpandedChange, + content = { + val imageVector = if (expanded) MeshtasticIcons.Close else MeshtasticIcons.OfflineShare + Icon(imageVector = imageVector, contentDescription = contentDescription) + }, + containerColor = ToggleFloatingActionButtonDefaults.containerColor(), + ) + } }, horizontalAlignment = Alignment.End, ) { diff --git a/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/MeshtasticNavigationSuite.kt b/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/MeshtasticNavigationSuite.kt index de477fc4a..5fa55b040 100644 --- a/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/MeshtasticNavigationSuite.kt +++ b/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/MeshtasticNavigationSuite.kt @@ -26,6 +26,7 @@ import androidx.compose.foundation.layout.Row import androidx.compose.material3.Badge import androidx.compose.material3.BadgedBox import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi import androidx.compose.material3.Icon import androidx.compose.material3.LocalContentColor import androidx.compose.material3.MaterialTheme.colorScheme @@ -68,7 +69,7 @@ import org.meshtastic.core.ui.viewmodel.UIViewModel * This implementation uses the [MultiBackstack] state holder to manage independent histories for each tab, aligning * with Navigation 3 best practices for state preservation during tab switching. */ -@OptIn(ExperimentalMaterial3Api::class) +@OptIn(ExperimentalMaterial3Api::class, ExperimentalMaterial3ExpressiveApi::class) @Composable fun MeshtasticNavigationSuite( multiBackstack: MultiBackstack, diff --git a/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/RegularPreference.kt b/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/RegularPreference.kt index 8427a5392..013bc3f0b 100644 --- a/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/RegularPreference.kt +++ b/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/RegularPreference.kt @@ -14,27 +14,26 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ +@file:OptIn(ExperimentalMaterial3ExpressiveApi::class) + package org.meshtastic.core.ui.component -import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.ExperimentalLayoutApi -import androidx.compose.foundation.layout.FlowRow import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.wrapContentWidth +import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi import androidx.compose.material3.Icon +import androidx.compose.material3.ListItem +import androidx.compose.material3.ListItemDefaults import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.RectangleShape import androidx.compose.ui.graphics.vector.ImageVector -import androidx.compose.ui.semantics.Role import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp @@ -63,7 +62,6 @@ fun RegularPreference( ) } -@OptIn(ExperimentalLayoutApi::class) @Composable fun RegularPreference( title: String, @@ -75,51 +73,30 @@ fun RegularPreference( trailingIcon: ImageVector? = null, dropdownMenu: @Composable () -> Unit = {}, ) { - val color = - if (enabled) { - MaterialTheme.colorScheme.onSurface - } else { - MaterialTheme.colorScheme.onSurface.copy(alpha = 0.38f) - } - - Column( - modifier = - modifier - .fillMaxWidth() - .clickable(enabled = enabled, onClick = onClick, role = Role.Button) - .padding(all = 16.dp), - ) { - Row(verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.SpaceBetween) { - FlowRow(modifier = Modifier.weight(1f), horizontalArrangement = Arrangement.SpaceBetween) { - Text( - text = title, - style = MaterialTheme.typography.bodyLarge, - color = - if (enabled) { - Color.Unspecified - } else { - MaterialTheme.colorScheme.onSurface.copy(alpha = 0.38f) - }, - ) - - Text(text = subtitle, style = MaterialTheme.typography.bodyLarge, color = color) - } - if (trailingIcon != null) { - Box { - Icon( - imageVector = trailingIcon, - contentDescription = null, - modifier = Modifier.padding(start = 8.dp).wrapContentWidth(Alignment.End), - tint = color, - ) - dropdownMenu() + ListItem( + onClick = onClick, + modifier = modifier, + enabled = enabled, + shapes = ListItemDefaults.shapes(shape = RectangleShape), + colors = ListItemDefaults.colors(containerColor = Color.Transparent), + trailingContent = { + Row(verticalAlignment = Alignment.CenterVertically) { + Text(text = subtitle, style = MaterialTheme.typography.bodyLarge) + if (trailingIcon != null) { + Box { + Icon( + imageVector = trailingIcon, + contentDescription = null, + modifier = Modifier.padding(start = 8.dp).wrapContentWidth(Alignment.End), + ) + dropdownMenu() + } } } - } - if (summary != null) { - Text(text = summary, style = MaterialTheme.typography.bodyMedium, color = color) - } - } + }, + supportingContent = summary?.let { { Text(text = it, style = MaterialTheme.typography.bodyMedium) } }, + content = { Text(text = title, style = MaterialTheme.typography.bodyLarge) }, + ) } @Preview(showBackground = true) diff --git a/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/SliderPreference.kt b/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/SliderPreference.kt index e47071aea..d27a0cb56 100644 --- a/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/SliderPreference.kt +++ b/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/SliderPreference.kt @@ -16,6 +16,9 @@ */ package org.meshtastic.core.ui.component +import androidx.compose.animation.core.Spring +import androidx.compose.animation.core.animateFloatAsState +import androidx.compose.animation.core.spring import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding @@ -23,6 +26,7 @@ import androidx.compose.material3.ListItem import androidx.compose.material3.Slider import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview @@ -46,6 +50,15 @@ fun SliderPreference( val valueRange = 0f..(items.size - 1).toFloat() val steps = (items.size - 2).coerceAtLeast(0) + // Spring-animated thumb position for expressive feel + val animatedValue by + animateFloatAsState( + targetValue = selectedIndex.coerceIn(valueRange), + animationSpec = + spring(stiffness = Spring.StiffnessMediumLow, dampingRatio = Spring.DampingRatioMediumBouncy), + label = "sliderSpring", + ) + ListItem( modifier = modifier, headlineContent = { @@ -60,7 +73,7 @@ fun SliderPreference( Column { summary?.let { Text(text = it, modifier = Modifier.fillMaxWidth().padding(bottom = 8.dp)) } Slider( - value = selectedIndex.coerceIn(valueRange), + value = animatedValue, onValueChange = { val index = it.roundToInt() if (index in items.indices) { diff --git a/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/SlidingSelector.kt b/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/SlidingSelector.kt deleted file mode 100644 index 9664e0cd1..000000000 --- a/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/SlidingSelector.kt +++ /dev/null @@ -1,389 +0,0 @@ -/* - * Copyright (c) 2026 Meshtastic LLC - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package org.meshtastic.core.ui.component - -import androidx.compose.animation.core.animateDpAsState -import androidx.compose.animation.core.animateFloatAsState -import androidx.compose.foundation.Canvas -import androidx.compose.foundation.background -import androidx.compose.foundation.gestures.awaitEachGesture -import androidx.compose.foundation.gestures.awaitFirstDown -import androidx.compose.foundation.gestures.horizontalDrag -import androidx.compose.foundation.layout.Arrangement.spacedBy -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.wrapContentWidth -import androidx.compose.foundation.selection.selectableGroup -import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material3.LocalTextStyle -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.runtime.CompositionLocalProvider -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableFloatStateOf -import androidx.compose.runtime.mutableIntStateOf -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue -import androidx.compose.ui.Modifier -import androidx.compose.ui.composed -import androidx.compose.ui.draw.alpha -import androidx.compose.ui.draw.shadow -import androidx.compose.ui.geometry.Offset -import androidx.compose.ui.geometry.Rect -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.TransformOrigin -import androidx.compose.ui.graphics.graphicsLayer -import androidx.compose.ui.input.pointer.AwaitPointerEventScope -import androidx.compose.ui.input.pointer.PointerEventPass -import androidx.compose.ui.input.pointer.PointerInputChange -import androidx.compose.ui.input.pointer.changedToUp -import androidx.compose.ui.input.pointer.pointerInput -import androidx.compose.ui.layout.Layout -import androidx.compose.ui.semantics.Role -import androidx.compose.ui.semantics.onClick -import androidx.compose.ui.semantics.role -import androidx.compose.ui.semantics.selected -import androidx.compose.ui.semantics.semantics -import androidx.compose.ui.semantics.stateDescription -import androidx.compose.ui.text.TextStyle -import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.text.style.TextOverflow.Companion.Ellipsis -import androidx.compose.ui.unit.Constraints -import androidx.compose.ui.unit.Density -import androidx.compose.ui.unit.IntOffset -import androidx.compose.ui.unit.dp - -private const val NO_OPTION_INDEX = -1 - -private val TRACK_PADDING = 2.dp - -private val TRACK_COLOR = Color.LightGray.copy(alpha = .5f) - -private val PRESSED_TRACK_PADDING = 1.dp - -private val OPTION_PADDING = 5.dp - -private const val PRESSED_UNSELECTED_ALPHA = .6f - -private val BACKGROUND_SHAPE = RoundedCornerShape(8.dp) - -/** - * Provides the user with a set of options they can choose from. - * - * (Inspired by https://gist.github.com/zach-klippenstein/7ae8874db304f957d6bb91263e292117) - */ -@Composable -fun SlidingSelector( - options: List, - selectedOption: T, - onOptionSelected: (T) -> Unit, - modifier: Modifier = Modifier, - content: @Composable (T) -> Unit, -) { - val state = remember { SelectorState() } - state.optionCount = options.size - state.selectedOption = options.indexOf(selectedOption) - state.onOptionSelected = { onOptionSelected(options[it]) } - - /* Animate between whole-number indices so we don't need to do pixel calculations. */ - val selectedIndexOffset by animateFloatAsState(state.selectedOption.toFloat(), label = "Selected Index Offset") - - Layout( - content = { - SelectedIndicator(state) - Dividers(state) - Options(state, options, content) - }, - modifier = - modifier - .fillMaxWidth() - .then(state.inputModifier) - .background(TRACK_COLOR, BACKGROUND_SHAPE) - .padding(TRACK_PADDING), - ) { measurables, constraints -> - val (indicatorMeasurable, dividersMeasurable, optionsMeasurable) = measurables - - /* Measure the options first so we know how tall to make the indicator. */ - val optionsPlaceable = optionsMeasurable.measure(constraints) - state.updatePressedScale(optionsPlaceable.height, this) - - /* Measure the indicator and dividers to be the right size. */ - val indicatorPlaceable = - indicatorMeasurable.measure( - Constraints.fixed(width = optionsPlaceable.width / options.size, height = optionsPlaceable.height), - ) - - val dividersPlaceable = - dividersMeasurable.measure( - Constraints.fixed(width = optionsPlaceable.width, height = optionsPlaceable.height), - ) - - layout(optionsPlaceable.width, optionsPlaceable.height) { - val optionWidth = optionsPlaceable.width / options.size - - /* Place the indicator first so that it's below the option labels. */ - indicatorPlaceable.placeRelative(x = (selectedIndexOffset * optionWidth).toInt(), y = 0) - dividersPlaceable.placeRelative(IntOffset.Zero) - optionsPlaceable.placeRelative(IntOffset.Zero) - } - } -} - -/** Visual representation of the option the user may select. */ -@Composable -fun OptionLabel(text: String) { - Text(text, maxLines = 1, overflow = Ellipsis) -} - -/** Draws the selected indicator on the [SlidingSelector] track. */ -@Composable -private fun SelectedIndicator(state: SelectorState) { - Box( - Modifier.then( - state.optionScaleModifier( - pressed = state.pressedOption == state.selectedOption, - option = state.selectedOption, - ), - ) - .shadow(4.dp, BACKGROUND_SHAPE) - .background(MaterialTheme.colorScheme.background, BACKGROUND_SHAPE), - ) -} - -/** Draws dividers between [OptionLabel]s. */ -@Composable -private fun Dividers(state: SelectorState) { - /* Animate each divider independently. */ - val alphas = - (0 until state.optionCount).map { i -> - val selectionAdjacent = i == state.selectedOption || i - 1 == state.selectedOption - animateFloatAsState(if (selectionAdjacent) 0f else 1f, label = "Dividers") - } - - Canvas(Modifier.fillMaxSize()) { - val optionWidth = size.width / state.optionCount - val dividerPadding = TRACK_PADDING + PRESSED_TRACK_PADDING - - alphas.forEachIndexed { i, alpha -> - val x = i * optionWidth - drawLine( - Color.White, - alpha = alpha.value, - start = Offset(x, dividerPadding.toPx()), - end = Offset(x, size.height - dividerPadding.toPx()), - ) - } - } -} - -/** Draws the options available to the user. */ -@Composable -private fun Options(state: SelectorState, options: List, content: @Composable (T) -> Unit) { - CompositionLocalProvider(LocalTextStyle provides TextStyle(fontWeight = FontWeight.Medium)) { - Row(horizontalArrangement = spacedBy(TRACK_PADDING), modifier = Modifier.fillMaxWidth().selectableGroup()) { - options.forEachIndexed { i, timeFrame -> - val isSelected = i == state.selectedOption - val isPressed = i == state.pressedOption - - /* Unselected presses are represented by fading. */ - val alpha by - animateFloatAsState( - if (!isSelected && isPressed) PRESSED_UNSELECTED_ALPHA else 1f, - label = "Unselected", - ) - - val semanticsModifier = - Modifier.semantics(mergeDescendants = true) { - selected = isSelected - role = Role.Button - onClick { - state.onOptionSelected(i) - true - } - stateDescription = if (isSelected) "Selected" else "Not selected" - } - - Box( - Modifier - /* Divide space evenly between all options. */ - .weight(1f) - .then(semanticsModifier) - .padding(OPTION_PADDING) - /* Draw pressed indication when not selected. */ - .alpha(alpha) - /* Selected presses are represented by scaling. */ - .then(state.optionScaleModifier(isPressed && isSelected, i)) - /* Center the option content. */ - .wrapContentWidth(), - ) { - content(timeFrame) - } - } - } - } -} - -/** Contains and handles the state necessary to present the [SlidingSelector] to the user. */ -private class SelectorState { - var optionCount by mutableIntStateOf(0) - var selectedOption by mutableIntStateOf(0) - var onOptionSelected: (Int) -> Unit by mutableStateOf({}) - var pressedOption by mutableIntStateOf(NO_OPTION_INDEX) - - /** - * Scale factor that should be used to scale pressed option. When this scale is applied, exactly - * [PRESSED_TRACK_PADDING] will be added around the element's usual size. - */ - var pressedSelectedScale by mutableFloatStateOf(1f) - private set - - /** Calculates the scale factor we need to use for pressed options to get the desired padding. */ - fun updatePressedScale(controlHeight: Int, density: Density) { - with(density) { - val pressedPadding = PRESSED_TRACK_PADDING * 2 - val pressedHeight = controlHeight - pressedPadding.toPx() - pressedSelectedScale = pressedHeight / controlHeight - } - } - - /** - * Returns a [Modifier] that will scale an element so that it gets [PRESSED_TRACK_PADDING] extra padding around it. - * The scale will be animated. - * - * The scale is also performed around either the left or right edge of the element if the option is the first or - * last option, respectively. In those cases, the scale will also be translated so that [PRESSED_TRACK_PADDING] will - * be added on the left or right edge. - */ - fun optionScaleModifier(pressed: Boolean, option: Int): Modifier = Modifier.composed { - val scale by animateFloatAsState(if (pressed) pressedSelectedScale else 1f, label = "Scale") - val xOffset by animateDpAsState(if (pressed) PRESSED_TRACK_PADDING else 0.dp, label = "x Offset") - - graphicsLayer { - this.scaleX = scale - this.scaleY = scale - - /* Scales on the ends should gravitate to that edge. */ - this.transformOrigin = - TransformOrigin( - pivotFractionX = - when (option) { - 0 -> 0f - optionCount - 1 -> 1f - else -> .5f - }, - pivotFractionY = .5f, - ) - - /* But should still move inwards to keep the pressed padding consistent with top and bottom. */ - this.translationX = - when (option) { - 0 -> xOffset.toPx() - optionCount - 1 -> -xOffset.toPx() - else -> 0f - } - } - } - - /** - * A [Modifier] that will listen for touch gestures and update the selected and pressed properties of this state - * appropriately. - */ - val inputModifier = - Modifier.pointerInput(optionCount) { - val optionWidth = size.width / optionCount - - /* Helper to calculate which option an event occurred in. */ - fun optionIndex(change: PointerInputChange): Int = - ((change.position.x / size.width.toFloat()) * optionCount).toInt().coerceIn(0, optionCount - 1) - - awaitEachGesture { - val down = awaitFirstDown() - - pressedOption = optionIndex(down) - val downOnSelected = pressedOption == selectedOption - val optionBounds = - Rect( - left = pressedOption * optionWidth.toFloat(), - right = (pressedOption + 1) * optionWidth.toFloat(), - top = 0f, - bottom = size.height.toFloat(), - ) - - if (downOnSelected) { - horizontalDrag(down.id) { change -> - pressedOption = optionIndex(change) - - if (pressedOption != selectedOption) { - onOptionSelected(pressedOption) - } - } - } else { - waitForUpOrCancellation(inBounds = optionBounds) - /* Null means the gesture was cancelled (e.g. dragged out of bounds). */ - ?.let { onOptionSelected(pressedOption) } - } - pressedOption = NO_OPTION_INDEX - } - } -} - -/** Works with bounds that may not be at 0,0. */ -@Suppress("ReturnCount") -private suspend fun AwaitPointerEventScope.waitForUpOrCancellation(inBounds: Rect): PointerInputChange? { - while (true) { - val event = awaitPointerEvent(PointerEventPass.Main) - if (event.changes.all { it.changedToUp() }) { - /* All pointers are up */ - return event.changes[0] - } - - if (event.changes.any { it.isConsumed || !inBounds.contains(it.position) }) { - /* Canceled */ - return null - } - - val consumeCheck = awaitPointerEvent(PointerEventPass.Final) - if (consumeCheck.changes.any { it.isConsumed }) { - return null - } - } -} - -/*@Preview -@Composable -fun SlidingSelectorPreview() { - MaterialTheme { - Surface { - Column(Modifier.padding(8.dp)) { - - var selectedOption by remember { mutableStateOf(TimeFrame.TWENTY_FOUR_HOURS) } - SlidingSelector( - TimeFrame.entries.toList(), - selectedOption, - onOptionSelected = { selectedOption = it } - ) { - OptionLabel(stringResource(it.strRes)) - } - } - } - } -}*/ diff --git a/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/SwitchPreference.kt b/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/SwitchPreference.kt index fc7764fef..005653e30 100644 --- a/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/SwitchPreference.kt +++ b/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/SwitchPreference.kt @@ -14,14 +14,16 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ +@file:OptIn(ExperimentalMaterial3ExpressiveApi::class) + package org.meshtastic.core.ui.component import androidx.compose.animation.AnimatedContent import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size -import androidx.compose.foundation.selection.toggleable -import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.CircularWavyProgressIndicator +import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi import androidx.compose.material3.ListItem import androidx.compose.material3.ListItemDefaults import androidx.compose.material3.Switch @@ -29,6 +31,7 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.RectangleShape import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import org.meshtastic.core.ui.theme.AppTheme @@ -45,32 +48,19 @@ fun SwitchPreference( containerColor: Color? = null, loading: Boolean = false, ) { - val defaultColors = ListItemDefaults.colors() - - @Suppress("DEPRECATION") - val currentColors = - if (enabled) { - defaultColors - } else { - defaultColors.copy( - headlineColor = defaultColors.headlineColor.copy(alpha = 0.5f), - supportingTextColor = defaultColors.supportingTextColor.copy(alpha = 0.5f), - ) - } - .let { if (containerColor != null) it.copy(containerColor = containerColor) else it } + val currentColors = ListItemDefaults.colors(containerColor = containerColor ?: Color.Unspecified) ListItem( + checked = checked, + onCheckedChange = onCheckedChange, + modifier = padding?.let { Modifier.padding(it) } ?: modifier, + enabled = enabled, + shapes = ListItemDefaults.shapes(shape = RectangleShape), colors = currentColors, - modifier = - (padding?.let { Modifier.padding(it) } ?: modifier).toggleable( - value = checked, - enabled = enabled, - onValueChange = onCheckedChange, - ), trailingContent = { AnimatedContent(targetState = loading) { loading -> if (loading) { - CircularProgressIndicator(modifier = Modifier.size(24.dp)) + CircularWavyProgressIndicator(modifier = Modifier.size(24.dp)) } else { Switch(enabled = enabled, checked = checked, onCheckedChange = null) } @@ -81,7 +71,7 @@ fun SwitchPreference( Text(text = summary) } }, - headlineContent = { Text(text = title) }, + content = { Text(text = title) }, ) } diff --git a/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/TimeTickWithLifecycle.kt b/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/TimeTickWithLifecycle.kt deleted file mode 100644 index 567845314..000000000 --- a/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/TimeTickWithLifecycle.kt +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (c) 2026 Meshtastic LLC - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package org.meshtastic.core.ui.component - -import androidx.compose.runtime.Composable - -/** - * Remembers a time tick that updates every minute. - * - * @return The current time in milliseconds, updating every minute. - */ -@Composable expect fun rememberTimeTickWithLifecycle(): Long diff --git a/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/emoji/EmojiData.kt b/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/emoji/EmojiData.kt deleted file mode 100644 index 8e7f65c34..000000000 --- a/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/emoji/EmojiData.kt +++ /dev/null @@ -1,2009 +0,0 @@ -/* - * Copyright (c) 2026 Meshtastic LLC - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -@file:Suppress("LongMethod", "MaxLineLength", "StringLiteralDuplication", "TooManyFunctions") - -package org.meshtastic.core.ui.emoji - -/** A single emoji entry with optional skin-tone support and search keywords. */ -internal data class Emoji( - val base: String, - val keywords: List = emptyList(), - val supportsSkinTone: Boolean = false, -) - -/** A named category of emojis with an icon emoji for the tab. */ -internal data class EmojiCategory(val name: String, val icon: String, val emojis: List) - -/** Unicode skin tone modifiers (Fitzpatrick scale). */ -internal enum class SkinTone(val modifier: String, val label: String, val preview: String) { - DEFAULT("", "Default", "👋"), - LIGHT("\uD83C\uDFFB", "Light", "👋🏻"), - MEDIUM_LIGHT("\uD83C\uDFFC", "Medium-Light", "👋🏼"), - MEDIUM("\uD83C\uDFFD", "Medium", "👋🏽"), - MEDIUM_DARK("\uD83C\uDFFE", "Medium-Dark", "👋🏾"), - DARK("\uD83C\uDFFF", "Dark", "👋🏿"), -} - -/** - * Applies a skin tone modifier to a base emoji string. Only works correctly for single-codepoint emojis that support - * skin tones. - */ -internal fun Emoji.withSkinTone(tone: SkinTone): String { - if (!supportsSkinTone || tone == SkinTone.DEFAULT) return base - // Insert the modifier after the first code point (which may be a surrogate pair) - val firstChar = base[0] - val charCount = if (firstChar.isHighSurrogate() && base.length > 1) 2 else 1 - val baseChar = base.substring(0, charCount) - val after = base.substring(charCount) - return baseChar + tone.modifier + after -} - -// ── Emoji Catalog ────────────────────────────────────────────────────────────── - -@Suppress("LargeClass", "MaxLineLength", "LongMethod") -internal object EmojiData { - private fun e(base: String, vararg kw: String, skin: Boolean = false) = Emoji(base, kw.toList(), skin) - - val categories: List = - listOf(smileys(), people(), nature(), food(), travel(), activities(), objects(), symbols(), flags()) - - /** Flat list for search. */ - val all: List by lazy { categories.flatMap { it.emojis } } - - // ── Categories ───────────────────────────────────────────────────────────── - private fun smileys() = EmojiCategory( - name = "Smileys & Emotion", - icon = "😀", - emojis = - listOf( - e("😀", "grinning", "face", "smile", "happy"), - e("😃", "grinning", "face", "with", "big", "eyes", "smiley", "happy", "joy", "haha"), - e("😄", "grinning", "face", "with", "smiling", "eyes", "smile", "happy", "joy", "laugh", "pleased"), - e("😁", "beaming", "face", "with", "smiling", "eyes", "grin"), - e("😆", "grinning", "squinting", "face", "laughing", "satisfied", "happy", "haha"), - e("😅", "grinning", "face", "with", "sweat", "smile", "hot"), - e("🤣", "rolling", "on", "the", "floor", "laughing", "rofl", "lol"), - e("😂", "face", "with", "tears", "of", "joy"), - e("🙂", "slightly", "smiling", "face"), - e("🙃", "upside", "down", "face"), - e("🫠", "melting", "face", "sarcasm", "dread"), - e("😉", "winking", "face", "wink", "flirt"), - e("😊", "smiling", "face", "with", "eyes", "blush", "proud"), - e("😇", "smiling", "face", "with", "halo", "innocent", "angel"), - e("🥰", "smiling", "face", "with", "hearts", "three", "love"), - e("😍", "smiling", "face", "with", "heart", "eyes", "love", "crush"), - e("🤩", "star", "struck", "eyes"), - e("😘", "face", "blowing", "a", "kiss", "kissing", "heart", "flirt"), - e("😗", "kissing", "face"), - e("☺️", "smiling", "face", "relaxed", "blush", "pleased"), - e("😚", "kissing", "face", "with", "closed", "eyes"), - e("😙", "kissing", "face", "with", "smiling", "eyes"), - e("🥲", "smiling", "face", "with", "tear"), - e("😋", "face", "savoring", "food", "yum", "tongue", "lick"), - e("😛", "face", "with", "tongue", "stuck", "out"), - e("😜", "winking", "face", "with", "tongue", "stuck", "out", "eye", "prank", "silly"), - e("🤪", "zany", "face", "goofy", "wacky"), - e("😝", "squinting", "face", "with", "tongue", "stuck", "out", "closed", "eyes", "prank"), - e("🤑", "money", "mouth", "face", "rich"), - e("🤗", "smiling", "face", "with", "open", "hands", "hugs"), - e("🤭", "face", "with", "hand", "over", "mouth", "quiet", "whoops"), - e("🫢", "face", "with", "open", "eyes", "and", "hand", "over", "mouth", "gasp", "shock"), - e("🫣", "face", "with", "peeking", "eye"), - e("🤫", "shushing", "face", "silence", "quiet"), - e("🤔", "thinking", "face"), - e("🫡", "saluting", "face", "respect"), - e("🤐", "zipper", "mouth", "face", "silence", "hush"), - e("🤨", "face", "with", "raised", "eyebrow", "suspicious"), - e("😐", "neutral", "face", "meh"), - e("😑", "expressionless", "face"), - e("😶", "face", "without", "mouth", "no", "mute", "silence"), - e("🫥", "dotted", "line", "face", "invisible"), - e("😶‍🌫️", "face", "in", "clouds"), - e("😏", "smirking", "face", "smirk", "smug"), - e("😒", "unamused", "face", "meh"), - e("🙄", "face", "with", "rolling", "eyes", "roll"), - e("😬", "grimacing", "face"), - e("😮‍💨", "face", "exhaling"), - e("🤥", "lying", "face", "liar"), - e("🫨", "shaking", "face", "shock"), - e("😌", "relieved", "face", "whew"), - e("😔", "pensive", "face"), - e("😪", "sleepy", "face", "tired"), - e("🤤", "drooling", "face"), - e("😴", "sleeping", "face", "zzz"), - e("😷", "face", "with", "medical", "mask", "sick", "ill"), - e("🤒", "face", "with", "thermometer", "sick"), - e("🤕", "face", "with", "head", "bandage", "hurt"), - e("🤢", "nauseated", "face", "sick", "barf", "disgusted"), - e("🤮", "face", "vomiting", "barf", "sick"), - e("🤧", "sneezing", "face", "achoo", "sick"), - e("🥵", "hot", "face", "heat", "sweating"), - e("🥶", "cold", "face", "freezing", "ice"), - e("🥴", "woozy", "face", "groggy"), - e("😵", "face", "with", "crossed", "out", "eyes", "dizzy"), - e("😵‍💫", "face", "with", "spiral", "eyes"), - e("🤯", "exploding", "head", "mind", "blown"), - e("🤠", "cowboy", "hat", "face"), - e("🥳", "partying", "face", "celebration", "birthday"), - e("🥸", "disguised", "face"), - e("😎", "smiling", "face", "with", "sunglasses", "cool"), - e("🤓", "nerd", "face", "geek", "glasses"), - e("🧐", "face", "with", "monocle"), - e("😕", "confused", "face"), - e("🫤", "face", "with", "diagonal", "mouth", "confused"), - e("😟", "worried", "face", "nervous"), - e("🙁", "slightly", "frowning", "face"), - e("☹️", "frowning", "face"), - e("😮", "face", "with", "open", "mouth", "surprise", "impressed", "wow"), - e("😯", "hushed", "face", "silence", "speechless"), - e("😲", "astonished", "face", "amazed", "gasp"), - e("😳", "flushed", "face"), - e("🥺", "pleading", "face", "puppy", "eyes"), - e("🥹", "face", "holding", "back", "tears", "gratitude"), - e("😦", "frowning", "face", "with", "open", "mouth"), - e("😧", "anguished", "face", "stunned"), - e("😨", "fearful", "face", "scared", "shocked", "oops"), - e("😰", "anxious", "face", "with", "sweat", "cold", "nervous"), - e("😥", "sad", "but", "relieved", "face", "disappointed", "phew", "sweat", "nervous"), - e("😢", "crying", "face", "cry", "sad", "tear"), - e("😭", "loudly", "crying", "face", "sob", "sad", "cry", "bawling"), - e("😱", "face", "screaming", "in", "fear", "scream", "horror", "shocked"), - e("😖", "confounded", "face"), - e("😣", "persevering", "face", "persevere", "struggling"), - e("😞", "disappointed", "face", "sad"), - e("😓", "downcast", "face", "with", "sweat"), - e("😩", "weary", "face", "tired"), - e("😫", "tired", "face", "upset", "whine"), - e("🥱", "yawning", "face"), - e("😤", "face", "with", "steam", "from", "nose", "triumph", "smug"), - e("😡", "enraged", "face", "rage", "pout", "angry"), - e("😠", "angry", "face", "mad", "annoyed"), - e("🤬", "face", "with", "symbols", "on", "mouth", "cursing", "foul"), - e("😈", "smiling", "face", "with", "horns", "imp", "devil", "evil"), - e("👿", "angry", "face", "with", "horns", "imp", "devil", "evil"), - e("💀", "skull", "dead", "danger", "poison"), - e("☠️", "skull", "and", "crossbones", "danger", "pirate"), - e("💩", "pile", "of", "poo", "hankey", "poop", "shit", "crap"), - e("🤡", "clown", "face"), - e("👹", "ogre", "japanese", "monster"), - e("👺", "goblin", "japanese"), - e("👻", "ghost", "halloween"), - e("👽", "alien", "ufo"), - e("👾", "alien", "monster", "space", "invader", "game", "retro"), - e("🤖", "robot"), - e("😺", "grinning", "cat", "smiley"), - e("😸", "grinning", "cat", "with", "smiling", "eyes", "smile"), - e("😹", "cat", "with", "tears", "of", "joy"), - e("😻", "smiling", "cat", "with", "heart", "eyes"), - e("😼", "cat", "with", "wry", "smile", "smirk"), - e("😽", "kissing", "cat"), - e("🙀", "weary", "cat", "scream", "horror"), - e("😿", "crying", "cat", "face", "sad", "tear"), - e("😾", "pouting", "cat"), - e("🙈", "see", "no", "evil", "monkey", "blind", "ignore"), - e("🙉", "hear", "no", "evil", "monkey", "deaf"), - e("🙊", "speak", "no", "evil", "monkey", "mute", "hush"), - e("💌", "love", "letter", "email", "envelope"), - e("💘", "heart", "with", "arrow", "cupid", "love"), - e("💝", "heart", "with", "ribbon", "gift", "chocolates"), - e("💖", "sparkling", "heart"), - e("💗", "growing", "heart", "heartpulse"), - e("💓", "beating", "heart", "heartbeat"), - e("💞", "revolving", "hearts"), - e("💕", "two", "hearts"), - e("💟", "heart", "decoration"), - e("❣️", "heart", "exclamation", "heavy"), - e("💔", "broken", "heart"), - e("❤️‍🔥", "heart", "on", "fire"), - e("❤️‍🩹", "mending", "heart"), - e("❤️", "red", "heart", "love"), - e("🩷", "pink", "heart"), - e("🧡", "orange", "heart"), - e("💛", "yellow", "heart"), - e("💚", "green", "heart"), - e("💙", "blue", "heart"), - e("🩵", "light", "blue", "heart"), - e("💜", "purple", "heart"), - e("🤎", "brown", "heart"), - e("🖤", "black", "heart"), - e("🩶", "grey", "heart"), - e("🤍", "white", "heart"), - e("💋", "kiss", "mark", "lipstick"), - e("💯", "hundred", "points", "100", "score", "perfect"), - e("💢", "anger", "symbol", "angry"), - e("💥", "collision", "boom", "explode"), - e("💫", "dizzy", "star"), - e("💦", "sweat", "droplets", "drops", "water", "workout"), - e("💨", "dashing", "away", "dash", "wind", "blow", "fast"), - e("🕳️", "hole"), - e("💬", "speech", "balloon", "comment"), - e("👁️‍🗨️", "eye", "in", "speech", "bubble"), - e("🗨️", "left", "speech", "bubble"), - e("🗯️", "right", "anger", "bubble"), - e("💭", "thought", "balloon", "thinking"), - e("💤", "zzz", "sleeping"), - ), - ) - - private fun people() = EmojiCategory( - name = "People & Body", - icon = "👋", - emojis = - listOf( - e("👋", "waving", "hand", "wave", "goodbye", skin = true), - e("🤚", "raised", "back", "of", "hand", skin = true), - e("🖐️", "hand", "with", "fingers", "splayed", "raised", skin = true), - e("✋", "raised", "hand", "highfive", "stop", skin = true), - e("🖖", "vulcan", "salute", "prosper", "spock", skin = true), - e("🫱", "rightwards", "hand", skin = true), - e("🫲", "leftwards", "hand", skin = true), - e("🫳", "palm", "down", "hand", skin = true), - e("🫴", "palm", "up", "hand", skin = true), - e("🫷", "leftwards", "pushing", "hand", skin = true), - e("🫸", "rightwards", "pushing", "hand", skin = true), - e("👌", "ok", "hand", skin = true), - e("🤌", "pinched", "fingers", skin = true), - e("🤏", "pinching", "hand", skin = true), - e("✌️", "victory", "hand", "v", "peace", skin = true), - e("🤞", "crossed", "fingers", "luck", "hopeful", skin = true), - e("🫰", "hand", "with", "index", "finger", "and", "thumb", "crossed", skin = true), - e("🤟", "love", "you", "gesture", skin = true), - e("🤘", "sign", "of", "the", "horns", "metal", skin = true), - e("🤙", "call", "me", "hand", skin = true), - e("👈", "backhand", "index", "pointing", "left", "point", skin = true), - e("👉", "backhand", "index", "pointing", "right", "point", skin = true), - e("👆", "backhand", "index", "pointing", "up", "point", "2", skin = true), - e("🖕", "middle", "finger", "fu", skin = true), - e("👇", "backhand", "index", "pointing", "down", "point", skin = true), - e("☝️", "index", "pointing", "up", "point", skin = true), - e("🫵", "index", "pointing", "at", "the", "viewer", skin = true), - e("👍", "thumbs", "up", "thumbsup", "approve", "ok", skin = true), - e("👎", "thumbs", "down", "thumbsdown", "disapprove", "bury", skin = true), - e("✊", "raised", "fist", "power", skin = true), - e("👊", "oncoming", "fist", "facepunch", "punch", "attack", skin = true), - e("🤛", "left", "facing", "fist", skin = true), - e("🤜", "right", "facing", "fist", skin = true), - e("👏", "clapping", "hands", "clap", "praise", "applause", skin = true), - e("🙌", "raising", "hands", "raised", "hooray", skin = true), - e("🫶", "heart", "hands", "love", skin = true), - e("👐", "open", "hands", skin = true), - e("🤲", "palms", "up", "together", skin = true), - e("🤝", "handshake", "deal", skin = true), - e("🙏", "folded", "hands", "pray", "please", "hope", "wish", skin = true), - e("✍️", "writing", "hand", skin = true), - e("💅", "nail", "polish", "care", "beauty", "manicure", skin = true), - e("🤳", "selfie", skin = true), - e("💪", "flexed", "biceps", "muscle", "flex", "bicep", "strong", "workout", skin = true), - e("🦾", "mechanical", "arm"), - e("🦿", "mechanical", "leg"), - e("🦵", "leg", skin = true), - e("🦶", "foot", skin = true), - e("👂", "ear", "hear", "sound", "listen", skin = true), - e("🦻", "ear", "with", "hearing", "aid", skin = true), - e("👃", "nose", "smell", skin = true), - e("🧠", "brain"), - e("🫀", "anatomical", "heart"), - e("🫁", "lungs"), - e("🦷", "tooth"), - e("🦴", "bone"), - e("👀", "eyes", "look", "see", "watch"), - e("👁️", "eye"), - e("👅", "tongue", "taste"), - e("👄", "mouth", "lips", "kiss"), - e("🫦", "biting", "lip"), - e("👶", "baby", "child", "newborn", skin = true), - e("🧒", "child", skin = true), - e("👦", "boy", "child", skin = true), - e("👧", "girl", "child", skin = true), - e("🧑", "person", "adult", skin = true), - e("👱", "blond", "hair", "haired", "person", skin = true), - e("👨", "man", "mustache", "father", "dad", skin = true), - e("🧔", "beard", "bearded", "person", skin = true), - e("🧔‍♂️", "beard", "man", skin = true), - e("🧔‍♀️", "beard", "woman", skin = true), - e("👨‍🦰", "red", "hair", "haired", "man", skin = true), - e("👨‍🦱", "curly", "hair", "haired", "man", skin = true), - e("👨‍🦳", "white", "hair", "haired", "man", skin = true), - e("👨‍🦲", "bald", "man", skin = true), - e("👩", "woman", "girls", skin = true), - e("👩‍🦰", "red", "hair", "haired", "woman", skin = true), - e("🧑‍🦰", "red", "hair", "person", skin = true), - e("👩‍🦱", "curly", "hair", "haired", "woman", skin = true), - e("🧑‍🦱", "curly", "hair", "person", skin = true), - e("👩‍🦳", "white", "hair", "haired", "woman", skin = true), - e("🧑‍🦳", "white", "hair", "person", skin = true), - e("👩‍🦲", "bald", "woman", skin = true), - e("🧑‍🦲", "bald", "person", skin = true), - e("👱‍♀️", "blond", "hair", "haired", "woman", "blonde", skin = true), - e("👱‍♂️", "blond", "hair", "haired", "man", skin = true), - e("🧓", "older", "person", "adult", skin = true), - e("👴", "old", "man", "older", skin = true), - e("👵", "old", "woman", "older", skin = true), - e("🙍", "person", "frowning", skin = true), - e("🙍‍♂️", "man", "frowning", skin = true), - e("🙍‍♀️", "woman", "frowning", skin = true), - e("🙎", "person", "pouting", "face", skin = true), - e("🙎‍♂️", "man", "pouting", skin = true), - e("🙎‍♀️", "woman", "pouting", skin = true), - e("🙅", "person", "gesturing", "no", "good", "stop", "halt", "denied", skin = true), - e("🙅‍♂️", "man", "gesturing", "no", "good", "ng", "stop", "halt", "denied", skin = true), - e("🙅‍♀️", "woman", "gesturing", "no", "good", "ng", "stop", "halt", "denied", skin = true), - e("🙆", "person", "gesturing", "ok", skin = true), - e("🙆‍♂️", "man", "gesturing", "ok", skin = true), - e("🙆‍♀️", "woman", "gesturing", "ok", skin = true), - e("💁", "person", "tipping", "hand", "information", "desk", skin = true), - e("💁‍♂️", "man", "tipping", "hand", "sassy", "information", skin = true), - e("💁‍♀️", "woman", "tipping", "hand", "sassy", "information", skin = true), - e("🙋", "person", "raising", "hand", skin = true), - e("🙋‍♂️", "man", "raising", "hand", skin = true), - e("🙋‍♀️", "woman", "raising", "hand", skin = true), - e("🧏", "deaf", "person", skin = true), - e("🧏‍♂️", "deaf", "man", skin = true), - e("🧏‍♀️", "deaf", "woman", skin = true), - e("🙇", "person", "bowing", "bow", "respect", "thanks", skin = true), - e("🙇‍♂️", "man", "bowing", "respect", "thanks", skin = true), - e("🙇‍♀️", "woman", "bowing", "respect", "thanks", skin = true), - e("🤦", "person", "facepalming", "facepalm", skin = true), - e("🤦‍♂️", "man", "facepalming", skin = true), - e("🤦‍♀️", "woman", "facepalming", skin = true), - e("🤷", "person", "shrugging", "shrug", skin = true), - e("🤷‍♂️", "man", "shrugging", skin = true), - e("🤷‍♀️", "woman", "shrugging", skin = true), - e("🧑‍⚕️", "health", "worker", skin = true), - e("👨‍⚕️", "man", "health", "worker", "doctor", "nurse", skin = true), - e("👩‍⚕️", "woman", "health", "worker", "doctor", "nurse", skin = true), - e("🧑‍🎓", "student", skin = true), - e("👨‍🎓", "man", "student", "graduation", skin = true), - e("👩‍🎓", "woman", "student", "graduation", skin = true), - e("🧑‍🏫", "teacher", skin = true), - e("👨‍🏫", "man", "teacher", "school", "professor", skin = true), - e("👩‍🏫", "woman", "teacher", "school", "professor", skin = true), - e("🧑‍⚖️", "judge", skin = true), - e("👨‍⚖️", "man", "judge", "justice", skin = true), - e("👩‍⚖️", "woman", "judge", "justice", skin = true), - e("🧑‍🌾", "farmer", skin = true), - e("👨‍🌾", "man", "farmer", skin = true), - e("👩‍🌾", "woman", "farmer", skin = true), - e("🧑‍🍳", "cook", skin = true), - e("👨‍🍳", "man", "cook", "chef", skin = true), - e("👩‍🍳", "woman", "cook", "chef", skin = true), - e("🧑‍🔧", "mechanic", skin = true), - e("👨‍🔧", "man", "mechanic", skin = true), - e("👩‍🔧", "woman", "mechanic", skin = true), - e("🧑‍🏭", "factory", "worker", skin = true), - e("👨‍🏭", "man", "factory", "worker", skin = true), - e("👩‍🏭", "woman", "factory", "worker", skin = true), - e("🧑‍💼", "office", "worker", skin = true), - e("👨‍💼", "man", "office", "worker", "business", skin = true), - e("👩‍💼", "woman", "office", "worker", "business", skin = true), - e("🧑‍🔬", "scientist", skin = true), - e("👨‍🔬", "man", "scientist", "research", skin = true), - e("👩‍🔬", "woman", "scientist", "research", skin = true), - e("🧑‍💻", "technologist", skin = true), - e("👨‍💻", "man", "technologist", "coder", skin = true), - e("👩‍💻", "woman", "technologist", "coder", skin = true), - e("🧑‍🎤", "singer", skin = true), - e("👨‍🎤", "man", "singer", "rockstar", skin = true), - e("👩‍🎤", "woman", "singer", "rockstar", skin = true), - e("🧑‍🎨", "artist", skin = true), - e("👨‍🎨", "man", "artist", "painter", skin = true), - e("👩‍🎨", "woman", "artist", "painter", skin = true), - e("🧑‍✈️", "pilot", skin = true), - e("👨‍✈️", "man", "pilot", skin = true), - e("👩‍✈️", "woman", "pilot", skin = true), - e("🧑‍🚀", "astronaut", skin = true), - e("👨‍🚀", "man", "astronaut", "space", skin = true), - e("👩‍🚀", "woman", "astronaut", "space", skin = true), - e("🧑‍🚒", "firefighter", skin = true), - e("👨‍🚒", "man", "firefighter", skin = true), - e("👩‍🚒", "woman", "firefighter", skin = true), - e("👮", "police", "officer", "cop", "law", skin = true), - e("👮‍♂️", "man", "police", "officer", "policeman", "law", "cop", skin = true), - e("👮‍♀️", "woman", "police", "officer", "policewoman", "law", "cop", skin = true), - e("🕵️", "detective", "sleuth", skin = true), - e("🕵️‍♂️", "man", "detective", "male", "sleuth", skin = true), - e("🕵️‍♀️", "woman", "detective", "female", "sleuth", skin = true), - e("💂", "guard", skin = true), - e("💂‍♂️", "man", "guard", "guardsman", skin = true), - e("💂‍♀️", "woman", "guard", "guardswoman", skin = true), - e("🥷", "ninja", skin = true), - e("👷", "construction", "worker", "helmet", skin = true), - e("👷‍♂️", "man", "construction", "worker", "helmet", skin = true), - e("👷‍♀️", "woman", "construction", "worker", "helmet", skin = true), - e("🫅", "person", "with", "crown", skin = true), - e("🤴", "prince", "crown", "royal", skin = true), - e("👸", "princess", "crown", "royal", skin = true), - e("👳", "person", "wearing", "turban", "with", skin = true), - e("👳‍♂️", "man", "wearing", "turban", "with", skin = true), - e("👳‍♀️", "woman", "wearing", "turban", "with", skin = true), - e("👲", "person", "with", "skullcap", "man", "gua", "pi", "mao", skin = true), - e("🧕", "woman", "with", "headscarf", "hijab", skin = true), - e("🤵", "person", "in", "tuxedo", "groom", "marriage", "wedding", skin = true), - e("🤵‍♂️", "man", "in", "tuxedo", skin = true), - e("🤵‍♀️", "woman", "in", "tuxedo", skin = true), - e("👰", "person", "with", "veil", "marriage", "wedding", skin = true), - e("👰‍♂️", "man", "with", "veil", skin = true), - e("👰‍♀️", "woman", "with", "veil", "bride", skin = true), - e("🤰", "pregnant", "woman", skin = true), - e("🫃", "pregnant", "man", skin = true), - e("🫄", "pregnant", "person", skin = true), - e("🤱", "breast", "feeding", "nursing", skin = true), - e("👩‍🍼", "woman", "feeding", "baby", skin = true), - e("👨‍🍼", "man", "feeding", "baby", skin = true), - e("🧑‍🍼", "person", "feeding", "baby", skin = true), - e("👼", "baby", "angel", skin = true), - e("🎅", "santa", "claus", "christmas", skin = true), - e("🤶", "claus", "mrs", "santa", skin = true), - e("🧑‍🎄", "mx", "claus", skin = true), - e("🦸", "superhero", skin = true), - e("🦸‍♂️", "man", "superhero", skin = true), - e("🦸‍♀️", "woman", "superhero", skin = true), - e("🦹", "supervillain", skin = true), - e("🦹‍♂️", "man", "supervillain", skin = true), - e("🦹‍♀️", "woman", "supervillain", skin = true), - e("🧙", "mage", "wizard", skin = true), - e("🧙‍♂️", "man", "mage", "wizard", skin = true), - e("🧙‍♀️", "woman", "mage", "wizard", skin = true), - e("🧚", "fairy", skin = true), - e("🧚‍♂️", "man", "fairy", skin = true), - e("🧚‍♀️", "woman", "fairy", skin = true), - e("🧛", "vampire", skin = true), - e("🧛‍♂️", "man", "vampire", skin = true), - e("🧛‍♀️", "woman", "vampire", skin = true), - e("🧜", "merperson", skin = true), - e("🧜‍♂️", "merman", skin = true), - e("🧜‍♀️", "mermaid", skin = true), - e("🧝", "elf", skin = true), - e("🧝‍♂️", "man", "elf", skin = true), - e("🧝‍♀️", "woman", "elf", skin = true), - e("🧞", "genie"), - e("🧞‍♂️", "man", "genie"), - e("🧞‍♀️", "woman", "genie"), - e("🧟", "zombie"), - e("🧟‍♂️", "man", "zombie"), - e("🧟‍♀️", "woman", "zombie"), - e("🧌", "troll"), - e("💆", "person", "getting", "massage", "spa", skin = true), - e("💆‍♂️", "man", "getting", "massage", "spa", skin = true), - e("💆‍♀️", "woman", "getting", "massage", "spa", skin = true), - e("💇", "person", "getting", "haircut", "beauty", skin = true), - e("💇‍♂️", "man", "getting", "haircut", skin = true), - e("💇‍♀️", "woman", "getting", "haircut", skin = true), - e("🚶", "person", "walking", skin = true), - e("🚶‍♂️", "man", "walking", skin = true), - e("🚶‍♀️", "woman", "walking", skin = true), - e("🧍", "person", "standing", skin = true), - e("🧍‍♂️", "man", "standing", skin = true), - e("🧍‍♀️", "woman", "standing", skin = true), - e("🧎", "person", "kneeling", skin = true), - e("🧎‍♂️", "man", "kneeling", skin = true), - e("🧎‍♀️", "woman", "kneeling", skin = true), - e("🧑‍🦯", "person", "with", "white", "cane", "probing", skin = true), - e("👨‍🦯", "man", "with", "white", "cane", "probing", skin = true), - e("👩‍🦯", "woman", "with", "white", "cane", "probing", skin = true), - e("🧑‍🦼", "person", "in", "motorized", "wheelchair", skin = true), - e("👨‍🦼", "man", "in", "motorized", "wheelchair", skin = true), - e("👩‍🦼", "woman", "in", "motorized", "wheelchair", skin = true), - e("🧑‍🦽", "person", "in", "manual", "wheelchair", skin = true), - e("👨‍🦽", "man", "in", "manual", "wheelchair", skin = true), - e("👩‍🦽", "woman", "in", "manual", "wheelchair", skin = true), - e("🏃", "person", "running", "runner", "exercise", "workout", "marathon", skin = true), - e("🏃‍♂️", "man", "running", "exercise", "workout", "marathon", skin = true), - e("🏃‍♀️", "woman", "running", "exercise", "workout", "marathon", skin = true), - e("💃", "woman", "dancing", "dancer", "dress", skin = true), - e("🕺", "man", "dancing", "dancer", skin = true), - e("🕴️", "person", "in", "suit", "levitating", "business", skin = true), - e("👯", "people", "with", "bunny", "ears", "dancers"), - e("👯‍♂️", "men", "with", "bunny", "ears", "dancing"), - e("👯‍♀️", "women", "with", "bunny", "ears", "dancing"), - e("🧖", "person", "in", "steamy", "room", "sauna", skin = true), - e("🧖‍♂️", "man", "in", "steamy", "room", "sauna", skin = true), - e("🧖‍♀️", "woman", "in", "steamy", "room", "sauna", skin = true), - e("🧗", "person", "climbing", "bouldering", skin = true), - e("🧗‍♂️", "man", "climbing", "bouldering", skin = true), - e("🧗‍♀️", "woman", "climbing", "bouldering", skin = true), - e("🤺", "person", "fencing"), - e("🏇", "horse", "racing", skin = true), - e("⛷️", "skier"), - e("🏂", "snowboarder", skin = true), - e("🏌️", "person", "golfing", skin = true), - e("🏌️‍♂️", "man", "golfing", skin = true), - e("🏌️‍♀️", "woman", "golfing", skin = true), - e("🏄", "person", "surfing", "surfer", skin = true), - e("🏄‍♂️", "man", "surfing", skin = true), - e("🏄‍♀️", "woman", "surfing", skin = true), - e("🚣", "person", "rowing", "boat", "rowboat", skin = true), - e("🚣‍♂️", "man", "rowing", "boat", skin = true), - e("🚣‍♀️", "woman", "rowing", "boat", skin = true), - e("🏊", "person", "swimming", "swimmer", skin = true), - e("🏊‍♂️", "man", "swimming", skin = true), - e("🏊‍♀️", "woman", "swimming", skin = true), - e("⛹️", "person", "bouncing", "ball", "basketball", skin = true), - e("⛹️‍♂️", "man", "bouncing", "ball", "basketball", skin = true), - e("⛹️‍♀️", "woman", "bouncing", "ball", "basketball", skin = true), - e("🏋️", "person", "lifting", "weights", "weight", "gym", "workout", skin = true), - e("🏋️‍♂️", "man", "lifting", "weights", "weight", "gym", "workout", skin = true), - e("🏋️‍♀️", "woman", "lifting", "weights", "weight", "gym", "workout", skin = true), - e("🚴", "person", "biking", "bicyclist", skin = true), - e("🚴‍♂️", "man", "biking", skin = true), - e("🚴‍♀️", "woman", "biking", skin = true), - e("🚵", "person", "mountain", "biking", "bicyclist", skin = true), - e("🚵‍♂️", "man", "mountain", "biking", skin = true), - e("🚵‍♀️", "woman", "mountain", "biking", skin = true), - e("🤸", "person", "cartwheeling", skin = true), - e("🤸‍♂️", "man", "cartwheeling", skin = true), - e("🤸‍♀️", "woman", "cartwheeling", skin = true), - e("🤼", "people", "wrestling"), - e("🤼‍♂️", "men", "wrestling"), - e("🤼‍♀️", "women", "wrestling"), - e("🤽", "person", "playing", "water", "polo", skin = true), - e("🤽‍♂️", "man", "playing", "water", "polo", skin = true), - e("🤽‍♀️", "woman", "playing", "water", "polo", skin = true), - e("🤾", "person", "playing", "handball", skin = true), - e("🤾‍♂️", "man", "playing", "handball", skin = true), - e("🤾‍♀️", "woman", "playing", "handball", skin = true), - e("🤹", "person", "juggling", skin = true), - e("🤹‍♂️", "man", "juggling", skin = true), - e("🤹‍♀️", "woman", "juggling", skin = true), - e("🧘", "person", "in", "lotus", "position", "meditation", skin = true), - e("🧘‍♂️", "man", "in", "lotus", "position", "meditation", skin = true), - e("🧘‍♀️", "woman", "in", "lotus", "position", "meditation", skin = true), - e("🛀", "person", "taking", "bath", "shower", skin = true), - e("🛌", "person", "in", "bed", "sleeping", skin = true), - e("🧑‍🤝‍🧑", "people", "holding", "hands", "couple", "date", skin = true), - e("👭", "women", "holding", "hands", "two", "couple", "date", skin = true), - e("👫", "woman", "and", "man", "holding", "hands", "couple", "date", skin = true), - e("👬", "men", "holding", "hands", "two", "couple", "date", skin = true), - e("💏", "kiss", "couplekiss", skin = true), - e("👩‍❤️‍💋‍👨", "man", "couplekiss", "woman", skin = true), - e("👨‍❤️‍💋‍👨", "man", "couplekiss", skin = true), - e("👩‍❤️‍💋‍👩", "woman", "couplekiss", skin = true), - e("💑", "couple", "with", "heart", skin = true), - e("👩‍❤️‍👨", "couple", "with", "man", "heart", "woman", skin = true), - e("👨‍❤️‍👨", "couple", "with", "man", "heart", skin = true), - e("👩‍❤️‍👩", "couple", "with", "woman", "heart", skin = true), - e("👪", "family", "home", "parents", "child"), - e("👨‍👩‍👦", "boy", "family", "man", "woman"), - e("👨‍👩‍👧", "girl", "family", "man", "woman"), - e("👨‍👩‍👧‍👦", "boy", "family", "man", "woman", "girl"), - e("👨‍👩‍👦‍👦", "boy", "family", "man", "woman"), - e("👨‍👩‍👧‍👧", "girl", "family", "man", "woman"), - e("👨‍👨‍👦", "boy", "family", "man"), - e("👨‍👨‍👧", "girl", "family", "man"), - e("👨‍👨‍👧‍👦", "boy", "family", "man", "girl"), - e("👨‍👨‍👦‍👦", "boy", "family", "man"), - e("👨‍👨‍👧‍👧", "girl", "family", "man"), - e("👩‍👩‍👦", "boy", "family", "woman"), - e("👩‍👩‍👧", "girl", "family", "woman"), - e("👩‍👩‍👧‍👦", "boy", "family", "woman", "girl"), - e("👩‍👩‍👦‍👦", "boy", "family", "woman"), - e("👩‍👩‍👧‍👧", "girl", "family", "woman"), - e("👨‍👦", "boy", "family", "man"), - e("👨‍👦‍👦", "boy", "family", "man"), - e("👨‍👧", "girl", "family", "man"), - e("👨‍👧‍👦", "boy", "family", "man", "girl"), - e("👨‍👧‍👧", "girl", "family", "man"), - e("👩‍👦", "boy", "family", "woman"), - e("👩‍👦‍👦", "boy", "family", "woman"), - e("👩‍👧", "girl", "family", "woman"), - e("👩‍👧‍👦", "boy", "family", "woman", "girl"), - e("👩‍👧‍👧", "girl", "family", "woman"), - e("🗣️", "speaking", "head"), - e("👤", "bust", "in", "silhouette", "user"), - e("👥", "busts", "in", "silhouette", "users", "group", "team"), - e("🫂", "people", "hugging"), - e("👣", "footprints", "feet", "tracks"), - ), - ) - - private fun nature() = EmojiCategory( - name = "Animals & Nature", - icon = "🐾", - emojis = - listOf( - e("🐵", "monkey", "face"), - e("🐒", "monkey"), - e("🦍", "gorilla"), - e("🦧", "orangutan"), - e("🐶", "dog", "face", "pet"), - e("🐕", "dog", "dog2"), - e("🦮", "guide", "dog"), - e("🐕‍🦺", "service", "dog"), - e("🐩", "poodle", "dog"), - e("🐺", "wolf"), - e("🦊", "fox", "face"), - e("🦝", "raccoon"), - e("🐱", "cat", "face", "pet"), - e("🐈", "cat", "cat2"), - e("🐈‍⬛", "black", "cat"), - e("🦁", "lion"), - e("🐯", "tiger", "face"), - e("🐅", "tiger", "tiger2"), - e("🐆", "leopard"), - e("🐴", "horse", "face"), - e("🫎", "moose", "canada"), - e("🫏", "donkey", "mule"), - e("🐎", "horse", "racehorse", "speed"), - e("🦄", "unicorn"), - e("🦓", "zebra"), - e("🦌", "deer"), - e("🦬", "bison"), - e("🐮", "cow", "face"), - e("🐂", "ox"), - e("🐃", "water", "buffalo"), - e("🐄", "cow", "cow2"), - e("🐷", "pig", "face"), - e("🐖", "pig", "pig2"), - e("🐗", "boar"), - e("🐽", "pig", "nose"), - e("🐏", "ram"), - e("🐑", "ewe", "sheep"), - e("🐐", "goat"), - e("🐪", "camel", "dromedary", "desert"), - e("🐫", "two", "hump", "camel"), - e("🦙", "llama"), - e("🦒", "giraffe"), - e("🐘", "elephant"), - e("🦣", "mammoth"), - e("🦏", "rhinoceros"), - e("🦛", "hippopotamus"), - e("🐭", "mouse", "face"), - e("🐁", "mouse", "mouse2"), - e("🐀", "rat"), - e("🐹", "hamster", "pet"), - e("🐰", "rabbit", "face", "bunny"), - e("🐇", "rabbit", "rabbit2"), - e("🐿️", "chipmunk"), - e("🦫", "beaver"), - e("🦔", "hedgehog"), - e("🦇", "bat"), - e("🐻", "bear"), - e("🐻‍❄️", "polar", "bear"), - e("🐨", "koala"), - e("🐼", "panda", "face"), - e("🦥", "sloth"), - e("🦦", "otter"), - e("🦨", "skunk"), - e("🦘", "kangaroo"), - e("🦡", "badger"), - e("🐾", "paw", "prints", "feet"), - e("🦃", "turkey", "thanksgiving"), - e("🐔", "chicken"), - e("🐓", "rooster"), - e("🐣", "hatching", "chick"), - e("🐤", "baby", "chick"), - e("🐥", "front", "facing", "baby", "chick", "hatched"), - e("🐦", "bird"), - e("🐧", "penguin"), - e("🕊️", "dove", "peace"), - e("🦅", "eagle"), - e("🦆", "duck"), - e("🦢", "swan"), - e("🦉", "owl"), - e("🦤", "dodo"), - e("🪶", "feather"), - e("🦩", "flamingo"), - e("🦚", "peacock"), - e("🦜", "parrot"), - e("🪽", "wing", "fly"), - e("🐦‍⬛", "black", "bird"), - e("🪿", "goose", "honk"), - e("🐸", "frog"), - e("🐊", "crocodile"), - e("🐢", "turtle", "slow"), - e("🦎", "lizard"), - e("🐍", "snake"), - e("🐲", "dragon", "face"), - e("🐉", "dragon"), - e("🦕", "sauropod", "dinosaur"), - e("🦖", "t", "rex", "dinosaur"), - e("🐳", "spouting", "whale", "sea"), - e("🐋", "whale", "whale2"), - e("🐬", "dolphin", "flipper"), - e("🦭", "seal"), - e("🐟", "fish"), - e("🐠", "tropical", "fish"), - e("🐡", "blowfish"), - e("🦈", "shark"), - e("🐙", "octopus"), - e("🐚", "spiral", "shell", "sea", "beach"), - e("🪸", "coral"), - e("🪼", "jellyfish"), - e("🐌", "snail", "slow"), - e("🦋", "butterfly"), - e("🐛", "bug"), - e("🐜", "ant"), - e("🐝", "honeybee", "bee"), - e("🪲", "beetle"), - e("🐞", "lady", "beetle", "bug"), - e("🦗", "cricket"), - e("🪳", "cockroach"), - e("🕷️", "spider"), - e("🕸️", "spider", "web"), - e("🦂", "scorpion"), - e("🦟", "mosquito"), - e("🪰", "fly"), - e("🪱", "worm"), - e("🦠", "microbe", "germ"), - e("💐", "bouquet", "flowers"), - e("🌸", "cherry", "blossom", "flower", "spring"), - e("💮", "white", "flower"), - e("🪷", "lotus"), - e("🏵️", "rosette"), - e("🌹", "rose", "flower"), - e("🥀", "wilted", "flower"), - e("🌺", "hibiscus"), - e("🌻", "sunflower"), - e("🌼", "blossom"), - e("🌷", "tulip", "flower"), - e("🪻", "hyacinth"), - e("🌱", "seedling", "plant"), - e("🪴", "potted", "plant"), - e("🌲", "evergreen", "tree", "wood"), - e("🌳", "deciduous", "tree", "wood"), - e("🌴", "palm", "tree"), - e("🌵", "cactus"), - e("🌾", "sheaf", "of", "rice", "ear"), - e("🌿", "herb"), - e("☘️", "shamrock"), - e("🍀", "four", "leaf", "clover", "luck"), - e("🍁", "maple", "leaf", "canada"), - e("🍂", "fallen", "leaf", "autumn"), - e("🍃", "leaf", "fluttering", "in", "wind", "leaves"), - e("🪹", "empty", "nest"), - e("🪺", "nest", "with", "eggs"), - e("🍄", "mushroom", "fungus"), - ), - ) - - private fun food() = EmojiCategory( - name = "Food & Drink", - icon = "🍔", - emojis = - listOf( - e("🍇", "grapes"), - e("🍈", "melon"), - e("🍉", "watermelon"), - e("🍊", "tangerine", "orange", "mandarin"), - e("🍋", "lemon"), - e("🍌", "banana", "fruit"), - e("🍍", "pineapple"), - e("🥭", "mango"), - e("🍎", "red", "apple"), - e("🍏", "green", "apple", "fruit"), - e("🍐", "pear"), - e("🍑", "peach"), - e("🍒", "cherries", "fruit"), - e("🍓", "strawberry", "fruit"), - e("🫐", "blueberries"), - e("🥝", "kiwi", "fruit"), - e("🍅", "tomato"), - e("🫒", "olive"), - e("🥥", "coconut"), - e("🥑", "avocado"), - e("🍆", "eggplant", "aubergine"), - e("🥔", "potato"), - e("🥕", "carrot"), - e("🌽", "ear", "of", "corn"), - e("🌶️", "hot", "pepper", "spicy"), - e("🫑", "bell", "pepper"), - e("🥒", "cucumber"), - e("🥬", "leafy", "green"), - e("🥦", "broccoli"), - e("🧄", "garlic"), - e("🧅", "onion"), - e("🥜", "peanuts"), - e("🫘", "beans"), - e("🌰", "chestnut"), - e("🫚", "ginger", "root"), - e("🫛", "pea", "pod"), - e("🍞", "bread", "toast"), - e("🥐", "croissant"), - e("🥖", "baguette", "bread"), - e("🫓", "flatbread"), - e("🥨", "pretzel"), - e("🥯", "bagel"), - e("🥞", "pancakes"), - e("🧇", "waffle"), - e("🧀", "cheese", "wedge"), - e("🍖", "meat", "on", "bone"), - e("🍗", "poultry", "leg", "meat", "chicken"), - e("🥩", "cut", "of", "meat"), - e("🥓", "bacon"), - e("🍔", "hamburger", "burger"), - e("🍟", "french", "fries"), - e("🍕", "pizza"), - e("🌭", "hot", "dog", "hotdog"), - e("🥪", "sandwich"), - e("🌮", "taco"), - e("🌯", "burrito"), - e("🫔", "tamale"), - e("🥙", "stuffed", "flatbread"), - e("🧆", "falafel"), - e("🥚", "egg"), - e("🍳", "cooking", "fried", "egg", "breakfast"), - e("🥘", "shallow", "pan", "of", "food", "paella", "curry"), - e("🍲", "pot", "of", "food", "stew"), - e("🫕", "fondue"), - e("🥣", "bowl", "with", "spoon"), - e("🥗", "green", "salad"), - e("🍿", "popcorn"), - e("🧈", "butter"), - e("🧂", "salt"), - e("🥫", "canned", "food"), - e("🍱", "bento", "box"), - e("🍘", "rice", "cracker"), - e("🍙", "rice", "ball"), - e("🍚", "cooked", "rice"), - e("🍛", "curry", "rice"), - e("🍜", "steaming", "bowl", "ramen", "noodle"), - e("🍝", "spaghetti", "pasta"), - e("🍠", "roasted", "sweet", "potato"), - e("🍢", "oden"), - e("🍣", "sushi"), - e("🍤", "fried", "shrimp", "tempura"), - e("🍥", "fish", "cake", "with", "swirl"), - e("🥮", "moon", "cake"), - e("🍡", "dango"), - e("🥟", "dumpling"), - e("🥠", "fortune", "cookie"), - e("🥡", "takeout", "box"), - e("🦀", "crab"), - e("🦞", "lobster"), - e("🦐", "shrimp"), - e("🦑", "squid"), - e("🦪", "oyster"), - e("🍦", "soft", "ice", "cream", "icecream"), - e("🍧", "shaved", "ice"), - e("🍨", "ice", "cream"), - e("🍩", "doughnut"), - e("🍪", "cookie"), - e("🎂", "birthday", "cake", "party"), - e("🍰", "shortcake", "cake", "dessert"), - e("🧁", "cupcake"), - e("🥧", "pie"), - e("🍫", "chocolate", "bar"), - e("🍬", "candy", "sweet"), - e("🍭", "lollipop"), - e("🍮", "custard"), - e("🍯", "honey", "pot"), - e("🍼", "baby", "bottle", "milk"), - e("🥛", "glass", "of", "milk"), - e("☕", "hot", "beverage", "coffee", "cafe", "espresso"), - e("🫖", "teapot"), - e("🍵", "teacup", "without", "handle", "tea", "green", "breakfast"), - e("🍶", "sake"), - e("🍾", "bottle", "with", "popping", "cork", "champagne", "bubbly", "celebration"), - e("🍷", "wine", "glass"), - e("🍸", "cocktail", "glass", "drink"), - e("🍹", "tropical", "drink", "summer", "vacation"), - e("🍺", "beer", "mug", "drink"), - e("🍻", "clinking", "beer", "mugs", "beers", "drinks"), - e("🥂", "clinking", "glasses", "cheers", "toast"), - e("🥃", "tumbler", "glass", "whisky"), - e("🫗", "pouring", "liquid"), - e("🥤", "cup", "with", "straw"), - e("🧋", "bubble", "tea"), - e("🧃", "beverage", "box"), - e("🧉", "mate"), - e("🧊", "ice", "cube"), - e("🥢", "chopsticks"), - e("🍽️", "fork", "and", "knife", "with", "plate", "cutlery", "dining", "dinner"), - e("🍴", "fork", "and", "knife", "cutlery"), - e("🥄", "spoon"), - e("🔪", "kitchen", "knife", "hocho", "cut", "chop"), - e("🫙", "jar"), - e("🏺", "amphora"), - ), - ) - - private fun travel() = EmojiCategory( - name = "Travel & Places", - icon = "✈️", - emojis = - listOf( - e("🌍", "globe", "showing", "europe", "africa", "earth", "world", "international"), - e("🌎", "globe", "showing", "americas", "earth", "world", "international"), - e("🌏", "globe", "showing", "asia", "australia", "earth", "world", "international"), - e("🌐", "globe", "with", "meridians", "world", "global", "international"), - e("🗺️", "world", "map", "travel"), - e("🗾", "map", "of", "japan"), - e("🧭", "compass"), - e("🏔️", "snow", "capped", "mountain"), - e("⛰️", "mountain"), - e("🌋", "volcano"), - e("🗻", "mount", "fuji"), - e("🏕️", "camping"), - e("🏖️", "beach", "with", "umbrella"), - e("🏜️", "desert"), - e("🏝️", "desert", "island"), - e("🏞️", "national", "park"), - e("🏟️", "stadium"), - e("🏛️", "classical", "building"), - e("🏗️", "building", "construction"), - e("🧱", "brick", "bricks"), - e("🪨", "rock"), - e("🪵", "wood"), - e("🛖", "hut"), - e("🏘️", "houses"), - e("🏚️", "derelict", "house"), - e("🏠", "house"), - e("🏡", "house", "with", "garden"), - e("🏢", "office", "building"), - e("🏣", "japanese", "post", "office"), - e("🏤", "post", "office", "european"), - e("🏥", "hospital"), - e("🏦", "bank"), - e("🏨", "hotel"), - e("🏩", "love", "hotel"), - e("🏪", "convenience", "store"), - e("🏫", "school"), - e("🏬", "department", "store"), - e("🏭", "factory"), - e("🏯", "japanese", "castle"), - e("🏰", "castle", "european"), - e("💒", "wedding", "marriage"), - e("🗼", "tokyo", "tower"), - e("🗽", "statue", "of", "liberty"), - e("⛪", "church"), - e("🕌", "mosque"), - e("🛕", "hindu", "temple"), - e("🕍", "synagogue"), - e("⛩️", "shinto", "shrine"), - e("🕋", "kaaba"), - e("⛲", "fountain"), - e("⛺", "tent", "camping"), - e("🌁", "foggy", "karl"), - e("🌃", "night", "with", "stars"), - e("🏙️", "cityscape", "skyline"), - e("🌄", "sunrise", "over", "mountains"), - e("🌅", "sunrise"), - e("🌆", "cityscape", "at", "dusk", "city", "sunset"), - e("🌇", "sunset", "city", "sunrise"), - e("🌉", "bridge", "at", "night"), - e("♨️", "hot", "springs", "hotsprings"), - e("🎠", "carousel", "horse"), - e("🛝", "playground", "slide"), - e("🎡", "ferris", "wheel"), - e("🎢", "roller", "coaster"), - e("💈", "barber", "pole"), - e("🎪", "circus", "tent"), - e("🚂", "locomotive", "steam", "train"), - e("🚃", "railway", "car"), - e("🚄", "high", "speed", "train", "bullettrain", "side"), - e("🚅", "bullet", "train", "bullettrain", "front"), - e("🚆", "train", "train2"), - e("🚇", "metro"), - e("🚈", "light", "rail"), - e("🚉", "station"), - e("🚊", "tram"), - e("🚝", "monorail"), - e("🚞", "mountain", "railway"), - e("🚋", "tram", "car", "train"), - e("🚌", "bus"), - e("🚍", "oncoming", "bus"), - e("🚎", "trolleybus"), - e("🚐", "minibus"), - e("🚑", "ambulance"), - e("🚒", "fire", "engine"), - e("🚓", "police", "car"), - e("🚔", "oncoming", "police", "car"), - e("🚕", "taxi"), - e("🚖", "oncoming", "taxi"), - e("🚗", "automobile", "car", "red"), - e("🚘", "oncoming", "automobile"), - e("🚙", "sport", "utility", "vehicle", "blue", "car"), - e("🛻", "pickup", "truck"), - e("🚚", "delivery", "truck"), - e("🚛", "articulated", "lorry"), - e("🚜", "tractor"), - e("🏎️", "racing", "car"), - e("🏍️", "motorcycle"), - e("🛵", "motor", "scooter"), - e("🦽", "manual", "wheelchair"), - e("🦼", "motorized", "wheelchair"), - e("🛺", "auto", "rickshaw"), - e("🚲", "bicycle", "bike"), - e("🛴", "kick", "scooter"), - e("🛹", "skateboard"), - e("🛼", "roller", "skate"), - e("🚏", "bus", "stop", "busstop"), - e("🛣️", "motorway"), - e("🛤️", "railway", "track"), - e("🛢️", "oil", "drum"), - e("⛽", "fuel", "pump", "fuelpump"), - e("🛞", "wheel"), - e("🚨", "police", "car", "light", "rotating", "911", "emergency"), - e("🚥", "horizontal", "traffic", "light"), - e("🚦", "vertical", "traffic", "light", "semaphore"), - e("🛑", "stop", "sign"), - e("🚧", "construction", "wip"), - e("⚓", "anchor", "ship"), - e("🛟", "ring", "buoy", "lifepreserver"), - e("⛵", "sailboat", "boat"), - e("🛶", "canoe"), - e("🚤", "speedboat", "ship"), - e("🛳️", "passenger", "ship", "cruise"), - e("⛴️", "ferry"), - e("🛥️", "motor", "boat"), - e("🚢", "ship"), - e("✈️", "airplane", "flight"), - e("🛩️", "small", "airplane", "flight"), - e("🛫", "airplane", "departure", "flight"), - e("🛬", "airplane", "arrival", "flight"), - e("🪂", "parachute"), - e("💺", "seat"), - e("🚁", "helicopter"), - e("🚟", "suspension", "railway"), - e("🚠", "mountain", "cableway"), - e("🚡", "aerial", "tramway"), - e("🛰️", "satellite", "artificial", "orbit", "space"), - e("🚀", "rocket", "ship", "launch"), - e("🛸", "flying", "saucer", "ufo"), - e("🛎️", "bellhop", "bell"), - e("🧳", "luggage"), - e("⌛", "hourglass", "done", "time"), - e("⏳", "hourglass", "not", "done", "flowing", "sand", "time"), - e("⌚", "watch", "time"), - e("⏰", "alarm", "clock", "morning"), - e("⏱️", "stopwatch"), - e("⏲️", "timer", "clock"), - e("🕰️", "mantelpiece", "clock"), - e("🕛", "twelve", "clock12"), - e("🕧", "twelve", "thirty", "clock1230"), - e("🕐", "one", "clock1"), - e("🕜", "one", "thirty", "clock130"), - e("🕑", "two", "clock2"), - e("🕝", "two", "thirty", "clock230"), - e("🕒", "three", "clock3"), - e("🕞", "three", "thirty", "clock330"), - e("🕓", "four", "clock4"), - e("🕟", "four", "thirty", "clock430"), - e("🕔", "five", "clock5"), - e("🕠", "five", "thirty", "clock530"), - e("🕕", "six", "clock6"), - e("🕡", "six", "thirty", "clock630"), - e("🕖", "seven", "clock7"), - e("🕢", "seven", "thirty", "clock730"), - e("🕗", "eight", "clock8"), - e("🕣", "eight", "thirty", "clock830"), - e("🕘", "nine", "clock9"), - e("🕤", "nine", "thirty", "clock930"), - e("🕙", "ten", "clock10"), - e("🕥", "ten", "thirty", "clock1030"), - e("🕚", "eleven", "clock11"), - e("🕦", "eleven", "thirty", "clock1130"), - e("🌑", "new", "moon"), - e("🌒", "waxing", "crescent", "moon"), - e("🌓", "first", "quarter", "moon"), - e("🌔", "waxing", "gibbous", "moon"), - e("🌕", "full", "moon"), - e("🌖", "waning", "gibbous", "moon"), - e("🌗", "last", "quarter", "moon"), - e("🌘", "waning", "crescent", "moon"), - e("🌙", "crescent", "moon", "night"), - e("🌚", "new", "moon", "face", "with"), - e("🌛", "first", "quarter", "moon", "face", "with"), - e("🌜", "last", "quarter", "moon", "face", "with"), - e("🌡️", "thermometer"), - e("☀️", "sun", "sunny", "weather"), - e("🌝", "full", "moon", "face", "with"), - e("🌞", "sun", "with", "face", "summer"), - e("🪐", "ringed", "planet"), - e("⭐", "star"), - e("🌟", "glowing", "star", "star2"), - e("🌠", "shooting", "star", "stars"), - e("🌌", "milky", "way"), - e("☁️", "cloud"), - e("⛅", "sun", "behind", "cloud", "partly", "sunny", "weather"), - e("⛈️", "cloud", "with", "lightning", "and", "rain"), - e("🌤️", "sun", "behind", "small", "cloud"), - e("🌥️", "sun", "behind", "large", "cloud"), - e("🌦️", "sun", "behind", "rain", "cloud"), - e("🌧️", "cloud", "with", "rain"), - e("🌨️", "cloud", "with", "snow"), - e("🌩️", "cloud", "with", "lightning"), - e("🌪️", "tornado"), - e("🌫️", "fog"), - e("🌬️", "wind", "face"), - e("🌀", "cyclone", "swirl"), - e("🌈", "rainbow"), - e("🌂", "closed", "umbrella", "weather", "rain"), - e("☂️", "umbrella", "open"), - e("☔", "umbrella", "with", "rain", "drops", "weather"), - e("⛱️", "umbrella", "on", "ground", "parasol", "beachumbrella"), - e("⚡", "high", "voltage", "zap", "lightning", "thunder"), - e("❄️", "snowflake", "winter", "cold", "weather"), - e("☃️", "snowman", "with", "snow", "winter", "christmas"), - e("⛄", "snowman", "without", "snow", "winter"), - e("☄️", "comet"), - e("🔥", "fire", "burn"), - e("💧", "droplet", "water"), - e("🌊", "water", "wave", "ocean", "sea"), - ), - ) - - private fun activities() = EmojiCategory( - name = "Activities", - icon = "⚽", - emojis = - listOf( - e("🎃", "jack", "o", "lantern", "halloween"), - e("🎄", "christmas", "tree"), - e("🎆", "fireworks", "festival", "celebration"), - e("🎇", "sparkler"), - e("🧨", "firecracker"), - e("✨", "sparkles", "shiny"), - e("🎈", "balloon", "party", "birthday"), - e("🎉", "party", "popper", "tada", "hooray"), - e("🎊", "confetti", "ball"), - e("🎋", "tanabata", "tree"), - e("🎍", "pine", "decoration", "bamboo"), - e("🎎", "japanese", "dolls"), - e("🎏", "carp", "streamer", "flags"), - e("🎐", "wind", "chime"), - e("🎑", "moon", "viewing", "ceremony", "rice", "scene"), - e("🧧", "red", "envelope"), - e("🎀", "ribbon"), - e("🎁", "wrapped", "gift", "present", "birthday", "christmas"), - e("🎗️", "reminder", "ribbon"), - e("🎟️", "admission", "tickets"), - e("🎫", "ticket"), - e("🎖️", "military", "medal"), - e("🏆", "trophy", "award", "contest", "winner"), - e("🏅", "sports", "medal", "gold", "winner"), - e("🥇", "1st", "place", "medal", "gold"), - e("🥈", "2nd", "place", "medal", "silver"), - e("🥉", "3rd", "place", "medal", "bronze"), - e("⚽", "soccer", "ball", "sports"), - e("⚾", "baseball", "sports"), - e("🥎", "softball"), - e("🏀", "basketball", "sports"), - e("🏐", "volleyball"), - e("🏈", "american", "football", "sports"), - e("🏉", "rugby", "football"), - e("🎾", "tennis", "sports"), - e("🥏", "flying", "disc"), - e("🎳", "bowling"), - e("🏏", "cricket", "game"), - e("🏑", "field", "hockey"), - e("🏒", "ice", "hockey"), - e("🥍", "lacrosse"), - e("🏓", "ping", "pong"), - e("🏸", "badminton"), - e("🥊", "boxing", "glove"), - e("🥋", "martial", "arts", "uniform"), - e("🥅", "goal", "net"), - e("⛳", "flag", "in", "hole", "golf"), - e("⛸️", "ice", "skate", "skating"), - e("🎣", "fishing", "pole", "and", "fish"), - e("🤿", "diving", "mask"), - e("🎽", "running", "shirt", "with", "sash", "marathon"), - e("🎿", "skis", "ski"), - e("🛷", "sled"), - e("🥌", "curling", "stone"), - e("🎯", "bullseye", "dart", "target"), - e("🪀", "yo"), - e("🪁", "kite"), - e("🔫", "water", "pistol", "gun", "shoot", "weapon"), - e("🎱", "pool", "8", "ball", "8ball", "billiards"), - e("🔮", "crystal", "ball", "fortune"), - e("🪄", "magic", "wand"), - e("🎮", "video", "game", "play", "controller", "console"), - e("🕹️", "joystick"), - e("🎰", "slot", "machine"), - e("🎲", "game", "die", "dice", "gambling"), - e("🧩", "puzzle", "piece", "jigsaw"), - e("🧸", "teddy", "bear"), - e("🪅", "piñata", "pinata"), - e("🪩", "mirror", "ball", "disco", "party"), - e("🪆", "nesting", "dolls"), - e("♠️", "spade", "suit", "spades"), - e("♥️", "heart", "suit", "hearts"), - e("♦️", "diamond", "suit", "diamonds"), - e("♣️", "club", "suit", "clubs"), - e("♟️", "chess", "pawn"), - e("🃏", "joker", "black"), - e("🀄", "mahjong", "red", "dragon"), - e("🎴", "flower", "playing", "cards"), - e("🎭", "performing", "arts", "theater", "drama"), - e("🖼️", "framed", "picture"), - e("🎨", "artist", "palette", "art", "design", "paint"), - e("🧵", "thread"), - e("🪡", "sewing", "needle"), - e("🧶", "yarn"), - e("🪢", "knot"), - ), - ) - - private fun objects() = EmojiCategory( - name = "Objects", - icon = "💡", - emojis = - listOf( - e("👓", "glasses", "eyeglasses"), - e("🕶️", "sunglasses", "dark"), - e("🥽", "goggles"), - e("🥼", "lab", "coat"), - e("🦺", "safety", "vest"), - e("👔", "necktie", "shirt", "formal"), - e("👕", "t", "shirt", "tshirt"), - e("👖", "jeans", "pants"), - e("🧣", "scarf"), - e("🧤", "gloves"), - e("🧥", "coat"), - e("🧦", "socks"), - e("👗", "dress"), - e("👘", "kimono"), - e("🥻", "sari"), - e("🩱", "one", "piece", "swimsuit"), - e("🩲", "briefs", "swim", "brief"), - e("🩳", "shorts"), - e("👙", "bikini", "beach"), - e("👚", "clothes", "womans"), - e("🪭", "folding", "hand", "fan", "sensu"), - e("👛", "purse"), - e("👜", "handbag", "bag"), - e("👝", "clutch", "bag", "pouch"), - e("🛍️", "shopping", "bags"), - e("🎒", "backpack", "school", "satchel"), - e("🩴", "thong", "sandal"), - e("👞", "shoe", "mans"), - e("👟", "running", "shoe", "athletic", "sneaker", "sport"), - e("🥾", "hiking", "boot"), - e("🥿", "flat", "shoe"), - e("👠", "high", "heeled", "shoe", "heel"), - e("👡", "sandal", "shoe"), - e("🩰", "ballet", "shoes"), - e("👢", "boot"), - e("🪮", "hair", "pick"), - e("👑", "crown", "king", "queen", "royal"), - e("👒", "hat", "womans"), - e("🎩", "top", "hat", "tophat", "classy"), - e("🎓", "graduation", "cap", "mortar", "board", "education", "college", "university"), - e("🧢", "billed", "cap"), - e("🪖", "military", "helmet"), - e("⛑️", "rescue", "helmet", "worker"), - e("📿", "prayer", "beads"), - e("💄", "lipstick", "makeup"), - e("💍", "ring", "wedding", "marriage", "engaged"), - e("💎", "gem", "stone", "diamond"), - e("🔇", "muted", "speaker", "mute", "sound", "volume"), - e("🔈", "speaker", "low", "volume"), - e("🔉", "speaker", "medium", "volume", "sound"), - e("🔊", "speaker", "high", "volume", "loud", "sound"), - e("📢", "loudspeaker", "announcement"), - e("📣", "megaphone", "mega"), - e("📯", "postal", "horn"), - e("🔔", "bell", "sound", "notification"), - e("🔕", "bell", "with", "slash", "no", "volume", "off"), - e("🎼", "musical", "score"), - e("🎵", "musical", "note"), - e("🎶", "musical", "notes", "music"), - e("🎙️", "studio", "microphone", "podcast"), - e("🎚️", "level", "slider"), - e("🎛️", "control", "knobs"), - e("🎤", "microphone", "sing"), - e("🎧", "headphone", "headphones", "music", "earphones"), - e("📻", "radio", "podcast"), - e("🎷", "saxophone"), - e("🪗", "accordion"), - e("🎸", "guitar", "rock"), - e("🎹", "musical", "keyboard", "piano"), - e("🎺", "trumpet"), - e("🎻", "violin"), - e("🪕", "banjo"), - e("🥁", "drum"), - e("🪘", "long", "drum"), - e("🪇", "maracas", "shaker"), - e("🪈", "flute", "recorder"), - e("📱", "mobile", "phone", "iphone", "smartphone"), - e("📲", "mobile", "phone", "with", "arrow", "calling", "call", "incoming"), - e("☎️", "telephone", "phone"), - e("📞", "telephone", "receiver", "phone", "call"), - e("📟", "pager"), - e("📠", "fax", "machine"), - e("🔋", "battery", "power"), - e("🪫", "low", "battery"), - e("🔌", "electric", "plug"), - e("💻", "laptop", "computer", "desktop", "screen"), - e("🖥️", "desktop", "computer"), - e("🖨️", "printer"), - e("⌨️", "keyboard"), - e("🖱️", "computer", "mouse"), - e("🖲️", "trackball"), - e("💽", "computer", "disk", "minidisc"), - e("💾", "floppy", "disk", "save"), - e("💿", "optical", "disk", "cd"), - e("📀", "dvd"), - e("🧮", "abacus"), - e("🎥", "movie", "camera", "film", "video"), - e("🎞️", "film", "frames", "strip"), - e("📽️", "film", "projector"), - e("🎬", "clapper", "board", "film"), - e("📺", "television", "tv"), - e("📷", "camera", "photo"), - e("📸", "camera", "with", "flash", "photo"), - e("📹", "video", "camera"), - e("📼", "videocassette", "vhs"), - e("🔍", "magnifying", "glass", "tilted", "left", "mag", "search", "zoom"), - e("🔎", "magnifying", "glass", "tilted", "right", "mag"), - e("🕯️", "candle"), - e("💡", "light", "bulb", "idea"), - e("🔦", "flashlight"), - e("🏮", "red", "paper", "lantern", "izakaya"), - e("🪔", "diya", "lamp"), - e("📔", "notebook", "with", "decorative", "cover"), - e("📕", "closed", "book"), - e("📖", "open", "book"), - e("📗", "green", "book"), - e("📘", "blue", "book"), - e("📙", "orange", "book"), - e("📚", "books", "library"), - e("📓", "notebook"), - e("📒", "ledger"), - e("📃", "page", "with", "curl"), - e("📜", "scroll", "document"), - e("📄", "page", "facing", "up", "document"), - e("📰", "newspaper", "press"), - e("🗞️", "rolled", "up", "newspaper", "roll", "press"), - e("📑", "bookmark", "tabs"), - e("🔖", "bookmark"), - e("🏷️", "label", "tag"), - e("💰", "money", "bag", "moneybag", "dollar", "cream"), - e("🪙", "coin"), - e("💴", "yen", "banknote"), - e("💵", "dollar", "banknote", "money"), - e("💶", "euro", "banknote"), - e("💷", "pound", "banknote"), - e("💸", "money", "with", "wings", "dollar"), - e("💳", "credit", "card", "subscription"), - e("🧾", "receipt"), - e("💹", "chart", "increasing", "with", "yen"), - e("✉️", "envelope", "letter", "email"), - e("📧", "e", "mail", "email"), - e("📨", "incoming", "envelope"), - e("📩", "envelope", "with", "arrow"), - e("📤", "outbox", "tray"), - e("📥", "inbox", "tray"), - e("📦", "package", "shipping"), - e("📫", "closed", "mailbox", "with", "raised", "flag"), - e("📪", "closed", "mailbox", "with", "lowered", "flag"), - e("📬", "open", "mailbox", "with", "raised", "flag", "mail"), - e("📭", "open", "mailbox", "with", "lowered", "flag", "no", "mail"), - e("📮", "postbox"), - e("🗳️", "ballot", "box", "with"), - e("✏️", "pencil", "pencil2"), - e("✒️", "black", "nib"), - e("🖋️", "fountain", "pen"), - e("🖊️", "pen"), - e("🖌️", "paintbrush"), - e("🖍️", "crayon"), - e("📝", "memo", "pencil", "document", "note"), - e("💼", "briefcase", "business"), - e("📁", "file", "folder", "directory"), - e("📂", "open", "file", "folder"), - e("🗂️", "card", "index", "dividers"), - e("📅", "calendar", "date", "schedule"), - e("📆", "tear", "off", "calendar", "schedule"), - e("🗒️", "spiral", "notepad"), - e("🗓️", "spiral", "calendar"), - e("📇", "card", "index"), - e("📈", "chart", "increasing", "with", "upwards", "trend", "graph", "metrics"), - e("📉", "chart", "decreasing", "with", "downwards", "trend", "graph", "metrics"), - e("📊", "bar", "chart", "stats", "metrics"), - e("📋", "clipboard"), - e("📌", "pushpin", "location"), - e("📍", "round", "pushpin", "location"), - e("📎", "paperclip"), - e("🖇️", "linked", "paperclips"), - e("📏", "straight", "ruler"), - e("📐", "triangular", "ruler"), - e("✂️", "scissors", "cut"), - e("🗃️", "card", "file", "box"), - e("🗄️", "file", "cabinet"), - e("🗑️", "wastebasket", "trash"), - e("🔒", "locked", "lock", "security", "private"), - e("🔓", "unlocked", "unlock", "security"), - e("🔏", "locked", "with", "pen", "lock", "ink"), - e("🔐", "locked", "with", "key", "closed", "lock", "security"), - e("🔑", "key", "lock", "password"), - e("🗝️", "old", "key"), - e("🔨", "hammer", "tool"), - e("🪓", "axe"), - e("⛏️", "pick"), - e("⚒️", "hammer", "and", "pick"), - e("🛠️", "hammer", "and", "wrench"), - e("🗡️", "dagger"), - e("⚔️", "crossed", "swords"), - e("💣", "bomb", "boom"), - e("🪃", "boomerang"), - e("🏹", "bow", "and", "arrow", "archery"), - e("🛡️", "shield"), - e("🪚", "carpentry", "saw"), - e("🔧", "wrench", "tool"), - e("🪛", "screwdriver"), - e("🔩", "nut", "and", "bolt"), - e("⚙️", "gear"), - e("🗜️", "clamp"), - e("⚖️", "balance", "scale"), - e("🦯", "white", "cane", "probing"), - e("🔗", "link"), - e("⛓️", "chains"), - e("🪝", "hook"), - e("🧰", "toolbox"), - e("🧲", "magnet"), - e("🪜", "ladder"), - e("⚗️", "alembic"), - e("🧪", "test", "tube"), - e("🧫", "petri", "dish"), - e("🧬", "dna"), - e("🔬", "microscope", "science", "laboratory", "investigate"), - e("🔭", "telescope"), - e("📡", "satellite", "antenna", "signal"), - e("💉", "syringe", "health", "hospital", "needle"), - e("🩸", "drop", "of", "blood"), - e("💊", "pill", "health", "medicine"), - e("🩹", "adhesive", "bandage"), - e("🩼", "crutch"), - e("🩺", "stethoscope"), - e("🩻", "x", "ray"), - e("🚪", "door"), - e("🛗", "elevator"), - e("🪞", "mirror"), - e("🪟", "window"), - e("🛏️", "bed"), - e("🛋️", "couch", "and", "lamp"), - e("🪑", "chair"), - e("🚽", "toilet", "wc"), - e("🪠", "plunger"), - e("🚿", "shower", "bath"), - e("🛁", "bathtub"), - e("🪤", "mouse", "trap"), - e("🪒", "razor"), - e("🧴", "lotion", "bottle"), - e("🧷", "safety", "pin"), - e("🧹", "broom"), - e("🧺", "basket"), - e("🧻", "roll", "of", "paper", "toilet"), - e("🪣", "bucket"), - e("🧼", "soap"), - e("🫧", "bubbles"), - e("🪥", "toothbrush"), - e("🧽", "sponge"), - e("🧯", "fire", "extinguisher"), - e("🛒", "shopping", "cart"), - e("🚬", "cigarette", "smoking"), - e("⚰️", "coffin", "funeral"), - e("🪦", "headstone"), - e("⚱️", "funeral", "urn"), - e("🧿", "nazar", "amulet"), - e("🪬", "hamsa"), - e("🗿", "moai", "moyai", "stone"), - e("🪧", "placard"), - e("🪪", "identification", "card"), - ), - ) - - private fun symbols() = EmojiCategory( - name = "Symbols", - icon = "🔣", - emojis = - listOf( - e("🏧", "atm", "sign"), - e("🚮", "litter", "in", "bin", "sign", "put", "its", "place"), - e("🚰", "potable", "water"), - e("♿", "wheelchair", "symbol", "accessibility"), - e("🚹", "room", "mens"), - e("🚺", "room", "womens"), - e("🚻", "restroom", "toilet"), - e("🚼", "baby", "symbol"), - e("🚾", "water", "closet", "wc", "toilet", "restroom"), - e("🛂", "passport", "control"), - e("🛃", "customs"), - e("🛄", "baggage", "claim", "airport"), - e("🛅", "left", "luggage"), - e("⚠️", "warning", "wip"), - e("🚸", "children", "crossing"), - e("⛔", "no", "entry", "limit"), - e("🚫", "prohibited", "no", "entry", "sign", "block", "forbidden"), - e("🚳", "no", "bicycles"), - e("🚭", "no", "smoking"), - e("🚯", "no", "littering", "do", "not", "litter"), - e("🚱", "non", "potable", "water"), - e("🚷", "no", "pedestrians"), - e("📵", "no", "mobile", "phones"), - e("🔞", "no", "one", "under", "eighteen", "underage"), - e("☢️", "radioactive"), - e("☣️", "biohazard"), - e("⬆️", "up", "arrow"), - e("↗️", "up", "right", "arrow", "upper"), - e("➡️", "right", "arrow"), - e("↘️", "down", "right", "arrow", "lower"), - e("⬇️", "down", "arrow"), - e("↙️", "down", "left", "arrow", "lower"), - e("⬅️", "left", "arrow"), - e("↖️", "up", "left", "arrow", "upper"), - e("↕️", "up", "down", "arrow"), - e("↔️", "left", "right", "arrow"), - e("↩️", "right", "arrow", "curving", "left", "leftwards", "with", "hook", "return"), - e("↪️", "left", "arrow", "curving", "right", "hook"), - e("⤴️", "right", "arrow", "curving", "up", "heading"), - e("⤵️", "right", "arrow", "curving", "down", "heading"), - e("🔃", "clockwise", "vertical", "arrows"), - e("🔄", "counterclockwise", "arrows", "button", "sync"), - e("🔙", "back", "arrow"), - e("🔚", "end", "arrow"), - e("🔛", "arrow", "on"), - e("🔜", "soon", "arrow"), - e("🔝", "top", "arrow"), - e("🛐", "place", "of", "worship"), - e("⚛️", "atom", "symbol"), - e("🕉️", "om"), - e("✡️", "star", "of", "david"), - e("☸️", "wheel", "of", "dharma"), - e("☯️", "yin", "yang"), - e("✝️", "latin", "cross"), - e("☦️", "orthodox", "cross"), - e("☪️", "star", "and", "crescent"), - e("☮️", "peace", "symbol"), - e("🕎", "menorah"), - e("🔯", "dotted", "six", "pointed", "star"), - e("🪯", "khanda"), - e("♈", "aries"), - e("♉", "taurus"), - e("♊", "gemini"), - e("♋", "cancer"), - e("♌", "leo"), - e("♍", "virgo"), - e("♎", "libra"), - e("♏", "scorpio", "scorpius"), - e("♐", "sagittarius"), - e("♑", "capricorn"), - e("♒", "aquarius"), - e("♓", "pisces"), - e("⛎", "ophiuchus"), - e("🔀", "shuffle", "tracks", "button", "twisted", "rightwards", "arrows"), - e("🔁", "repeat", "button", "loop"), - e("🔂", "repeat", "single", "button", "one"), - e("▶️", "play", "button", "arrow", "forward"), - e("⏩", "fast", "forward", "button"), - e("⏭️", "next", "track", "button"), - e("⏯️", "play", "or", "pause", "button"), - e("◀️", "reverse", "button", "arrow", "backward"), - e("⏪", "fast", "reverse", "button", "rewind"), - e("⏮️", "last", "track", "button", "previous"), - e("🔼", "upwards", "button", "arrow", "up", "small"), - e("⏫", "fast", "up", "button", "arrow", "double"), - e("🔽", "downwards", "button", "arrow", "down", "small"), - e("⏬", "fast", "down", "button", "arrow", "double"), - e("⏸️", "pause", "button"), - e("⏹️", "stop", "button"), - e("⏺️", "record", "button"), - e("⏏️", "eject", "button"), - e("🎦", "cinema", "film", "movie"), - e("🔅", "dim", "button", "low", "brightness"), - e("🔆", "bright", "button", "high", "brightness"), - e("📶", "antenna", "bars", "signal", "strength", "wifi"), - e("🛜", "wireless", "wifi"), - e("📳", "vibration", "mode"), - e("📴", "mobile", "phone", "off", "mute"), - e("♀️", "female", "sign"), - e("♂️", "male", "sign"), - e("⚧️", "transgender", "symbol"), - e("✖️", "multiply", "heavy", "multiplication", "x"), - e("➕", "plus", "heavy", "sign"), - e("➖", "minus", "heavy", "sign"), - e("➗", "divide", "heavy", "division", "sign"), - e("🟰", "heavy", "equals", "sign"), - e("♾️", "infinity"), - e("‼️", "double", "exclamation", "mark", "bangbang"), - e("⁉️", "exclamation", "question", "mark", "interrobang"), - e("❓", "red", "question", "mark", "confused"), - e("❔", "white", "question", "mark", "grey"), - e("❕", "white", "exclamation", "mark", "grey"), - e("❗", "red", "exclamation", "mark", "heavy", "bang"), - e("〰️", "wavy", "dash"), - e("💱", "currency", "exchange"), - e("💲", "heavy", "dollar", "sign"), - e("⚕️", "medical", "symbol"), - e("♻️", "recycling", "symbol", "recycle", "environment", "green"), - e("⚜️", "fleur", "de", "lis"), - e("🔱", "trident", "emblem"), - e("📛", "name", "badge"), - e("🔰", "japanese", "symbol", "for", "beginner"), - e("⭕", "hollow", "red", "circle", "o"), - e("✅", "check", "mark", "button", "white"), - e("☑️", "check", "box", "with", "ballot"), - e("✔️", "check", "mark", "heavy"), - e("❌", "cross", "mark", "x"), - e("❎", "cross", "mark", "button", "negative", "squared"), - e("➰", "curly", "loop"), - e("➿", "double", "curly", "loop"), - e("〽️", "part", "alternation", "mark"), - e("✳️", "eight", "spoked", "asterisk"), - e("✴️", "eight", "pointed", "star", "black"), - e("❇️", "sparkle"), - e("©️", "copyright"), - e("®️", "registered"), - e("™️", "trade", "mark", "tm", "trademark"), - e("#️⃣", "hash", "number"), - e("*️⃣", "asterisk"), - e("0️⃣", "0", "zero"), - e("1️⃣", "1", "one"), - e("2️⃣", "2", "two"), - e("3️⃣", "3", "three"), - e("4️⃣", "4", "four"), - e("5️⃣", "5", "five"), - e("6️⃣", "6", "six"), - e("7️⃣", "7", "seven"), - e("8️⃣", "8", "eight"), - e("9️⃣", "9", "nine"), - e("🔟", "10", "keycap", "ten"), - e("🔠", "input", "latin", "uppercase", "capital", "abcd", "letters"), - e("🔡", "input", "latin", "lowercase", "abcd"), - e("🔢", "input", "numbers", "1234"), - e("🔣", "input", "symbols"), - e("🔤", "input", "latin", "letters", "abc", "alphabet"), - e("🅰️", "a", "button"), - e("🆎", "ab", "button"), - e("🅱️", "b", "button"), - e("🆑", "cl", "button"), - e("🆒", "cool", "button"), - e("🆓", "free", "button"), - e("ℹ️", "information", "source"), - e("🆔", "id", "button"), - e("Ⓜ️", "circled", "m"), - e("🆕", "new", "button", "fresh"), - e("🆖", "ng", "button"), - e("🅾️", "o", "button", "o2"), - e("🆗", "ok", "button", "yes"), - e("🅿️", "p", "button", "parking"), - e("🆘", "sos", "button", "help", "emergency"), - e("🆙", "button", "up"), - e("🆚", "vs", "button"), - e("🈁", "japanese", "button", "koko"), - e("🈂️", "japanese", "button", "sa"), - e("🈷️", "japanese", "button", "u6708"), - e("🈶", "japanese", "free", "of", "button", "u6709"), - e("🈯", "japanese", "button", "u6307"), - e("🉐", "japanese", "button", "ideograph", "advantage"), - e("🈹", "japanese", "button", "u5272"), - e("🈚", "japanese", "of", "button", "u7121"), - e("🈲", "japanese", "button", "u7981"), - e("🉑", "japanese", "button", "accept"), - e("🈸", "japanese", "button", "u7533"), - e("🈴", "japanese", "button", "u5408"), - e("🈳", "japanese", "button", "u7a7a"), - e("㊗️", "japanese", "button", "congratulations"), - e("㊙️", "japanese", "button", "secret"), - e("🈺", "japanese", "for", "button", "u55b6"), - e("🈵", "japanese", "button", "u6e80"), - e("🔴", "red", "circle"), - e("🟠", "orange", "circle"), - e("🟡", "yellow", "circle"), - e("🟢", "green", "circle"), - e("🔵", "blue", "circle", "large"), - e("🟣", "purple", "circle"), - e("🟤", "brown", "circle"), - e("⚫", "black", "circle"), - e("⚪", "white", "circle"), - e("🟥", "red", "square"), - e("🟧", "orange", "square"), - e("🟨", "yellow", "square"), - e("🟩", "green", "square"), - e("🟦", "blue", "square"), - e("🟪", "purple", "square"), - e("🟫", "brown", "square"), - e("⬛", "black", "large", "square"), - e("⬜", "white", "large", "square"), - e("◼️", "black", "medium", "square"), - e("◻️", "white", "medium", "square"), - e("◾", "black", "medium", "small", "square"), - e("◽", "white", "medium", "small", "square"), - e("▪️", "black", "small", "square"), - e("▫️", "white", "small", "square"), - e("🔶", "large", "orange", "diamond"), - e("🔷", "large", "blue", "diamond"), - e("🔸", "small", "orange", "diamond"), - e("🔹", "small", "blue", "diamond"), - e("🔺", "red", "triangle", "pointed", "up", "small"), - e("🔻", "red", "triangle", "pointed", "down", "small"), - e("💠", "diamond", "with", "a", "dot", "shape", "inside"), - e("🔘", "radio", "button"), - e("🔳", "white", "square", "button"), - e("🔲", "black", "square", "button"), - ), - ) - - private fun flags() = EmojiCategory( - name = "Flags", - icon = "🏁", - emojis = - listOf( - e("🏁", "chequered", "flag", "checkered", "milestone", "finish"), - e("🚩", "triangular", "flag", "on", "post"), - e("🎌", "crossed", "flags"), - e("🏴", "black", "flag"), - e("🏳️", "white", "flag"), - e("🏳️‍🌈", "rainbow", "flag", "pride"), - e("🏳️‍⚧️", "transgender", "flag"), - e("🏴‍☠️", "pirate", "flag"), - e("🇦🇨", "ascension", "island"), - e("🇦🇩", "andorra"), - e("🇦🇪", "united", "arab", "emirates"), - e("🇦🇫", "afghanistan"), - e("🇦🇬", "antigua", "barbuda"), - e("🇦🇮", "anguilla"), - e("🇦🇱", "albania"), - e("🇦🇲", "armenia"), - e("🇦🇴", "angola"), - e("🇦🇶", "antarctica"), - e("🇦🇷", "argentina"), - e("🇦🇸", "american", "samoa"), - e("🇦🇹", "austria"), - e("🇦🇺", "australia"), - e("🇦🇼", "aruba"), - e("🇦🇽", "åland", "islands", "aland"), - e("🇦🇿", "azerbaijan"), - e("🇧🇦", "bosnia", "herzegovina"), - e("🇧🇧", "barbados"), - e("🇧🇩", "bangladesh"), - e("🇧🇪", "belgium"), - e("🇧🇫", "burkina", "faso"), - e("🇧🇬", "bulgaria"), - e("🇧🇭", "bahrain"), - e("🇧🇮", "burundi"), - e("🇧🇯", "benin"), - e("🇧🇱", "barthélemy", "st", "barthelemy"), - e("🇧🇲", "bermuda"), - e("🇧🇳", "brunei"), - e("🇧🇴", "bolivia"), - e("🇧🇶", "caribbean", "netherlands"), - e("🇧🇷", "brazil"), - e("🇧🇸", "bahamas"), - e("🇧🇹", "bhutan"), - e("🇧🇻", "bouvet", "island"), - e("🇧🇼", "botswana"), - e("🇧🇾", "belarus"), - e("🇧🇿", "belize"), - e("🇨🇦", "canada"), - e("🇨🇨", "cocos", "islands", "keeling"), - e("🇨🇩", "congo", "kinshasa"), - e("🇨🇫", "central", "african", "republic"), - e("🇨🇬", "congo", "brazzaville"), - e("🇨🇭", "switzerland"), - e("🇨🇮", "côte", "cote", "divoire", "ivory"), - e("🇨🇰", "cook", "islands"), - e("🇨🇱", "chile"), - e("🇨🇲", "cameroon"), - e("🇨🇳", "china", "cn"), - e("🇨🇴", "colombia"), - e("🇨🇵", "clipperton", "island"), - e("🇨🇷", "costa", "rica"), - e("🇨🇺", "cuba"), - e("🇨🇻", "cape", "verde"), - e("🇨🇼", "curaçao", "curacao"), - e("🇨🇽", "christmas", "island"), - e("🇨🇾", "cyprus"), - e("🇨🇿", "czechia", "czech", "republic"), - e("🇩🇪", "germany", "de", "flag"), - e("🇩🇬", "diego", "garcia"), - e("🇩🇯", "djibouti"), - e("🇩🇰", "denmark"), - e("🇩🇲", "dominica"), - e("🇩🇴", "dominican", "republic"), - e("🇩🇿", "algeria"), - e("🇪🇦", "ceuta", "melilla"), - e("🇪🇨", "ecuador"), - e("🇪🇪", "estonia"), - e("🇪🇬", "egypt"), - e("🇪🇭", "western", "sahara"), - e("🇪🇷", "eritrea"), - e("🇪🇸", "spain", "es"), - e("🇪🇹", "ethiopia"), - e("🇪🇺", "european", "union", "eu"), - e("🇫🇮", "finland"), - e("🇫🇯", "fiji"), - e("🇫🇰", "falkland", "islands"), - e("🇫🇲", "micronesia"), - e("🇫🇴", "faroe", "islands"), - e("🇫🇷", "france", "fr", "french"), - e("🇬🇦", "gabon"), - e("🇬🇧", "united", "kingdom", "gb", "uk", "flag", "british"), - e("🇬🇩", "grenada"), - e("🇬🇪", "georgia"), - e("🇬🇫", "french", "guiana"), - e("🇬🇬", "guernsey"), - e("🇬🇭", "ghana"), - e("🇬🇮", "gibraltar"), - e("🇬🇱", "greenland"), - e("🇬🇲", "gambia"), - e("🇬🇳", "guinea"), - e("🇬🇵", "guadeloupe"), - e("🇬🇶", "equatorial", "guinea"), - e("🇬🇷", "greece"), - e("🇬🇸", "south", "georgia", "sandwich", "islands"), - e("🇬🇹", "guatemala"), - e("🇬🇺", "guam"), - e("🇬🇼", "guinea", "bissau"), - e("🇬🇾", "guyana"), - e("🇭🇰", "hong", "kong", "sar", "china"), - e("🇭🇲", "heard", "mcdonald", "islands"), - e("🇭🇳", "honduras"), - e("🇭🇷", "croatia"), - e("🇭🇹", "haiti"), - e("🇭🇺", "hungary"), - e("🇮🇨", "canary", "islands"), - e("🇮🇩", "indonesia"), - e("🇮🇪", "ireland"), - e("🇮🇱", "israel"), - e("🇮🇲", "isle", "of", "man"), - e("🇮🇳", "india"), - e("🇮🇴", "british", "indian", "ocean", "territory"), - e("🇮🇶", "iraq"), - e("🇮🇷", "iran"), - e("🇮🇸", "iceland"), - e("🇮🇹", "italy", "it"), - e("🇯🇪", "jersey"), - e("🇯🇲", "jamaica"), - e("🇯🇴", "jordan"), - e("🇯🇵", "japan", "jp"), - e("🇰🇪", "kenya"), - e("🇰🇬", "kyrgyzstan"), - e("🇰🇭", "cambodia"), - e("🇰🇮", "kiribati"), - e("🇰🇲", "comoros"), - e("🇰🇳", "kitts", "nevis", "st"), - e("🇰🇵", "north", "korea"), - e("🇰🇷", "south", "korea", "kr"), - e("🇰🇼", "kuwait"), - e("🇰🇾", "cayman", "islands"), - e("🇰🇿", "kazakhstan"), - e("🇱🇦", "laos"), - e("🇱🇧", "lebanon"), - e("🇱🇨", "lucia", "st"), - e("🇱🇮", "liechtenstein"), - e("🇱🇰", "sri", "lanka"), - e("🇱🇷", "liberia"), - e("🇱🇸", "lesotho"), - e("🇱🇹", "lithuania"), - e("🇱🇺", "luxembourg"), - e("🇱🇻", "latvia"), - e("🇱🇾", "libya"), - e("🇲🇦", "morocco"), - e("🇲🇨", "monaco"), - e("🇲🇩", "moldova"), - e("🇲🇪", "montenegro"), - e("🇲🇫", "martin", "st"), - e("🇲🇬", "madagascar"), - e("🇲🇭", "marshall", "islands"), - e("🇲🇰", "north", "macedonia"), - e("🇲🇱", "mali"), - e("🇲🇲", "myanmar", "burma"), - e("🇲🇳", "mongolia"), - e("🇲🇴", "macao", "sar", "china", "macau"), - e("🇲🇵", "northern", "mariana", "islands"), - e("🇲🇶", "martinique"), - e("🇲🇷", "mauritania"), - e("🇲🇸", "montserrat"), - e("🇲🇹", "malta"), - e("🇲🇺", "mauritius"), - e("🇲🇻", "maldives"), - e("🇲🇼", "malawi"), - e("🇲🇽", "mexico"), - e("🇲🇾", "malaysia"), - e("🇲🇿", "mozambique"), - e("🇳🇦", "namibia"), - e("🇳🇨", "new", "caledonia"), - e("🇳🇪", "niger"), - e("🇳🇫", "norfolk", "island"), - e("🇳🇬", "nigeria"), - e("🇳🇮", "nicaragua"), - e("🇳🇱", "netherlands"), - e("🇳🇴", "norway"), - e("🇳🇵", "nepal"), - e("🇳🇷", "nauru"), - e("🇳🇺", "niue"), - e("🇳🇿", "new", "zealand"), - e("🇴🇲", "oman"), - e("🇵🇦", "panama"), - e("🇵🇪", "peru"), - e("🇵🇫", "french", "polynesia"), - e("🇵🇬", "papua", "new", "guinea"), - e("🇵🇭", "philippines"), - e("🇵🇰", "pakistan"), - e("🇵🇱", "poland"), - e("🇵🇲", "pierre", "miquelon", "st"), - e("🇵🇳", "pitcairn", "islands"), - e("🇵🇷", "puerto", "rico"), - e("🇵🇸", "palestinian", "territories"), - e("🇵🇹", "portugal"), - e("🇵🇼", "palau"), - e("🇵🇾", "paraguay"), - e("🇶🇦", "qatar"), - e("🇷🇪", "réunion", "reunion"), - e("🇷🇴", "romania"), - e("🇷🇸", "serbia"), - e("🇷🇺", "russia", "ru"), - e("🇷🇼", "rwanda"), - e("🇸🇦", "saudi", "arabia"), - e("🇸🇧", "solomon", "islands"), - e("🇸🇨", "seychelles"), - e("🇸🇩", "sudan"), - e("🇸🇪", "sweden"), - e("🇸🇬", "singapore"), - e("🇸🇭", "helena", "st"), - e("🇸🇮", "slovenia"), - e("🇸🇯", "svalbard", "jan", "mayen"), - e("🇸🇰", "slovakia"), - e("🇸🇱", "sierra", "leone"), - e("🇸🇲", "san", "marino"), - e("🇸🇳", "senegal"), - e("🇸🇴", "somalia"), - e("🇸🇷", "suriname"), - e("🇸🇸", "south", "sudan"), - e("🇸🇹", "são", "tomé", "príncipe", "sao", "tome", "principe"), - e("🇸🇻", "el", "salvador"), - e("🇸🇽", "sint", "maarten"), - e("🇸🇾", "syria"), - e("🇸🇿", "eswatini", "swaziland"), - e("🇹🇦", "tristan", "da", "cunha"), - e("🇹🇨", "turks", "caicos", "islands"), - e("🇹🇩", "chad"), - e("🇹🇫", "french", "southern", "territories"), - e("🇹🇬", "togo"), - e("🇹🇭", "thailand"), - e("🇹🇯", "tajikistan"), - e("🇹🇰", "tokelau"), - e("🇹🇱", "timor", "leste"), - e("🇹🇲", "turkmenistan"), - e("🇹🇳", "tunisia"), - e("🇹🇴", "tonga"), - e("🇹🇷", "turkey", "tr"), - e("🇹🇹", "trinidad", "tobago"), - e("🇹🇻", "tuvalu"), - e("🇹🇼", "taiwan"), - e("🇹🇿", "tanzania"), - e("🇺🇦", "ukraine"), - e("🇺🇬", "uganda"), - e("🇺🇲", "outlying", "islands", "us"), - e("🇺🇳", "united", "nations"), - e("🇺🇸", "united", "states", "us", "flag", "america"), - e("🇺🇾", "uruguay"), - e("🇺🇿", "uzbekistan"), - e("🇻🇦", "vatican", "city"), - e("🇻🇨", "vincent", "grenadines", "st"), - e("🇻🇪", "venezuela"), - e("🇻🇬", "british", "virgin", "islands"), - e("🇻🇮", "virgin", "islands", "us"), - e("🇻🇳", "vietnam"), - e("🇻🇺", "vanuatu"), - e("🇼🇫", "wallis", "futuna"), - e("🇼🇸", "samoa"), - e("🇽🇰", "kosovo"), - e("🇾🇪", "yemen"), - e("🇾🇹", "mayotte"), - e("🇿🇦", "south", "africa"), - e("🇿🇲", "zambia"), - e("🇿🇼", "zimbabwe"), - e("🏴󠁧󠁢󠁥󠁮󠁧󠁿", "england"), - e("🏴󠁧󠁢󠁳󠁣󠁴󠁿", "scotland"), - e("🏴󠁧󠁢󠁷󠁬󠁳󠁿", "wales"), - ), - ) -} diff --git a/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/emoji/EmojiPickerDialog.kt b/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/emoji/EmojiPickerDialog.kt index ee9bbdbd0..cbf5e9074 100644 --- a/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/emoji/EmojiPickerDialog.kt +++ b/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/emoji/EmojiPickerDialog.kt @@ -15,6 +15,7 @@ * along with this program. If not, see . */ @file:Suppress("TooManyFunctions") +@file:OptIn(ExperimentalMaterial3Api::class) package org.meshtastic.core.ui.emoji @@ -31,7 +32,6 @@ import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding @@ -43,17 +43,22 @@ import androidx.compose.foundation.lazy.grid.LazyVerticalGrid import androidx.compose.foundation.lazy.grid.rememberLazyGridState import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.PrimaryScrollableTabRow import androidx.compose.material3.Surface import androidx.compose.material3.Tab import androidx.compose.material3.Text import androidx.compose.material3.TextField import androidx.compose.material3.TextFieldDefaults +import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.collectAsState import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf @@ -67,18 +72,20 @@ import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.compose.ui.window.Popup +import kotlinx.coroutines.delay import org.jetbrains.compose.resources.stringResource import org.koin.compose.viewmodel.koinViewModel import org.meshtastic.core.resources.Res import org.meshtastic.core.resources.clear import org.meshtastic.core.resources.search_emoji -import org.meshtastic.core.ui.component.BottomSheetDialog import org.meshtastic.core.ui.icon.Close import org.meshtastic.core.ui.icon.MeshtasticIcons import org.meshtastic.core.ui.icon.Search +import org.meshtastic.core.ui.theme.AppTheme // ── Constants ────────────────────────────────────────────────────────────────── @@ -89,6 +96,7 @@ private const val RECENTS_HEADER_KEY = "header_recents" private const val RECENTS_KEY_PREFIX = "recent_" private const val MAX_RECENTS = 30 private const val DEFAULT_QUICK_REACTION_COUNT = 6 +private const val SEARCH_DEBOUNCE_MS = 150L /** Default quick-reaction emoji used when the user has no recents. */ private val DEFAULT_QUICK_REACTIONS = listOf("👍", "❤️", "😂", "😮", "😢", "🙏") @@ -116,26 +124,53 @@ fun EmojiPickerDialog( onConfirm: (String) -> Unit, ) { val viewModel: EmojiPickerViewModel = koinViewModel() + val isLoaded by viewModel.isLoaded.collectAsState() var searchQuery by rememberSaveable { mutableStateOf("") } + var debouncedQuery by remember { mutableStateOf("") } var selectedCategoryIndex by rememberSaveable { mutableStateOf(0) } + val preferredSkinToneIndex by viewModel.preferredSkinToneIndex.collectAsState() + + // Debounce search input to avoid per-keystroke filtering of 1870 emojis + LaunchedEffect(searchQuery) { + if (searchQuery.isBlank()) { + debouncedQuery = "" + } else { + delay(SEARCH_DEBOUNCE_MS) + debouncedQuery = searchQuery + } + } val recentEmojis by remember(viewModel.customEmojiFrequency) { derivedStateOf { parseRecents(viewModel.customEmojiFrequency) } } - BottomSheetDialog(onDismiss = onDismiss, modifier = Modifier.fillMaxHeight(fraction = .55f)) { - EmojiPickerContent( - searchQuery = searchQuery, - onSearchQueryChange = { searchQuery = it }, - selectedCategoryIndex = selectedCategoryIndex, - onCategorySelected = { selectedCategoryIndex = it }, - selectedEmojis = selectedEmojis, - recentEmojis = recentEmojis, - onEmojiSelected = { emoji -> - recordSelection(emoji, viewModel) - onDismiss() - onConfirm(emoji) - }, - ) + ModalBottomSheet( + onDismissRequest = onDismiss, + sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true), + ) { + if (isLoaded) { + EmojiPickerContent( + searchQuery = searchQuery, + debouncedQuery = debouncedQuery, + onSearchQueryChange = { searchQuery = it }, + selectedCategoryIndex = selectedCategoryIndex, + onCategorySelected = { selectedCategoryIndex = it }, + selectedEmojis = selectedEmojis, + recentEmojis = recentEmojis, + categories = viewModel.categories, + allEmojis = viewModel.allEmojis, + preferredSkinToneIndex = preferredSkinToneIndex, + onSkinToneSelect = { viewModel.setPreferredSkinTone(it) }, + onEmojiSelected = { emoji -> + recordSelection(emoji, viewModel) + onDismiss() + onConfirm(emoji) + }, + ) + } else { + Box(modifier = Modifier.fillMaxWidth().height(200.dp), contentAlignment = Alignment.Center) { + CircularProgressIndicator() + } + } } } @@ -171,11 +206,16 @@ fun rememberQuickReactions(count: Int = DEFAULT_QUICK_REACTION_COUNT): List Unit, selectedCategoryIndex: Int, onCategorySelected: (Int) -> Unit, selectedEmojis: Set, recentEmojis: List, + categories: List, + allEmojis: List, + preferredSkinToneIndex: Int, + onSkinToneSelect: (Int) -> Unit, onEmojiSelected: (String) -> Unit, ) { Column { @@ -186,15 +226,20 @@ private fun EmojiPickerContent( selectedIndex = selectedCategoryIndex, onCategorySelected = onCategorySelected, hasRecents = recentEmojis.isNotEmpty(), + categories = categories, ) } EmojiGrid( - searchQuery = searchQuery, + searchQuery = debouncedQuery, selectedCategoryIndex = selectedCategoryIndex, onCategoryChanged = onCategorySelected, selectedEmojis = selectedEmojis, recentEmojis = recentEmojis, + categories = categories, + allEmojis = allEmojis, + preferredSkinToneIndex = preferredSkinToneIndex, + onSkinToneSelect = onSkinToneSelect, onEmojiSelected = onEmojiSelected, ) } @@ -246,9 +291,14 @@ private fun SearchBar(query: String, onQueryChange: (String) -> Unit) { // ── Category Tabs ────────────────────────────────────────────────────────────── @Composable -private fun CategoryTabStrip(selectedIndex: Int, onCategorySelected: (Int) -> Unit, hasRecents: Boolean) { +private fun CategoryTabStrip( + selectedIndex: Int, + onCategorySelected: (Int) -> Unit, + hasRecents: Boolean, + categories: List, +) { val tabOffset = if (hasRecents) 1 else 0 - val totalTabs = EmojiData.categories.size + tabOffset + val totalTabs = categories.size + tabOffset PrimaryScrollableTabRow( selectedTabIndex = selectedIndex, @@ -263,10 +313,7 @@ private fun CategoryTabStrip(selectedIndex: Int, onCategorySelected: (Int) -> Un selected = selectedIndex == index, onClick = { onCategorySelected(index) }, text = { - Text( - text = if (isRecents) "\uD83D\uDD50" else EmojiData.categories[index - tabOffset].icon, - fontSize = 18.sp, - ) + Text(text = if (isRecents) "\uD83D\uDD50" else categories[index - tabOffset].icon, fontSize = 18.sp) }, ) } @@ -283,13 +330,20 @@ private fun EmojiGrid( onCategoryChanged: (Int) -> Unit, selectedEmojis: Set, recentEmojis: List, + categories: List, + allEmojis: List, + preferredSkinToneIndex: Int, + onSkinToneSelect: (Int) -> Unit, onEmojiSelected: (String) -> Unit, ) { val gridState = rememberLazyGridState() val hasRecents = recentEmojis.isNotEmpty() val tabOffset = if (hasRecents) 1 else 0 - val gridItems: List = remember(searchQuery, recentEmojis) { buildGridItems(searchQuery, recentEmojis) } + val gridItems: List = + remember(searchQuery, recentEmojis, categories, allEmojis) { + buildGridItems(searchQuery, recentEmojis, categories, allEmojis) + } var animationTargetIndex by remember { mutableStateOf(null) } // Scroll to category when tab changes @@ -302,7 +356,7 @@ private fun EmojiGrid( RECENTS_HEADER_KEY } else { val catIndex = selectedCategoryIndex - tabOffset - if (catIndex in EmojiData.categories.indices) { + if (catIndex in categories.indices) { CATEGORY_HEADER_KEY_PREFIX + catIndex } else { null @@ -363,6 +417,8 @@ private fun EmojiGrid( EmojiCellWithSkinTone( emoji = item.emoji, isSelected = selectedEmojis.contains(item.emoji.base), + preferredSkinToneIndex = preferredSkinToneIndex, + onSkinToneSelect = onSkinToneSelect, onSelect = onEmojiSelected, ) } @@ -392,11 +448,15 @@ private sealed class GridItem(open val key: String) { } @Suppress("CyclomaticComplexMethod") -private fun buildGridItems(searchQuery: String, recentEmojis: List): List = buildList { +private fun buildGridItems( + searchQuery: String, + recentEmojis: List, + categories: List, + allEmojis: List, +): List = buildList { if (searchQuery.isNotBlank()) { val query = searchQuery.lowercase() - val results = - EmojiData.all.filter { emoji -> emoji.keywords.any { it.contains(query) } || emoji.base.contains(query) } + val results = rankSearchResults(query, allEmojis, recentEmojis) results.forEachIndexed { i, emoji -> add(GridItem.EmojiCell(emoji, "search_$i")) } } else { if (recentEmojis.isNotEmpty()) { @@ -405,7 +465,7 @@ private fun buildGridItems(searchQuery: String, recentEmojis: List): Lis add(GridItem.EmojiCell(Emoji(emojiStr), "$RECENTS_KEY_PREFIX$i")) } } - EmojiData.categories.forEachIndexed { catIndex, category -> + categories.forEachIndexed { catIndex, category -> add(GridItem.Header(category.name, "$CATEGORY_HEADER_KEY_PREFIX$catIndex")) category.emojis.forEachIndexed { emojiIndex, emoji -> add(GridItem.EmojiCell(emoji, "cat_${catIndex}_$emojiIndex")) @@ -414,6 +474,47 @@ private fun buildGridItems(searchQuery: String, recentEmojis: List): Lis } } +/** + * Ranks search results using prefix-weighted scoring (inspired by Signal's approach). Exact keyword matches score + * highest, then prefix matches, then substring matches. Recently-used emoji matching the query get a boost. + */ +private fun rankSearchResults(query: String, allEmojis: List, recentEmojis: List): List { + val recentSet = recentEmojis.toSet() + + data class ScoredEmoji(val emoji: Emoji, val score: Float) + + return allEmojis + .mapNotNull { emoji -> + val score = scoreEmoji(emoji, query, recentSet) + if (score > 0f) ScoredEmoji(emoji, score) else null + } + .sortedByDescending { it.score } + .map { it.emoji } +} + +private const val SCORE_EXACT_MATCH = 10f +private const val SCORE_PREFIX_MATCH = 4f +private const val SCORE_SUBSTRING_MATCH = 1f +private const val SCORE_BASE_CONTAINS = 0.5f +private const val SCORE_RECENT_BOOST = 3f + +private fun scoreEmoji(emoji: Emoji, query: String, recentSet: Set): Float { + var score = 0f + + for (keyword in emoji.keywords) { + when { + keyword == query -> score += SCORE_EXACT_MATCH + keyword.startsWith(query) -> score += SCORE_PREFIX_MATCH + keyword.contains(query) -> score += SCORE_SUBSTRING_MATCH + } + } + + if (emoji.base.contains(query)) score += SCORE_BASE_CONTAINS + if (score > 0f && emoji.base in recentSet) score += SCORE_RECENT_BOOST + + return score +} + // ── Cell Components ──────────────────────────────────────────────────────────── @Composable @@ -428,14 +529,23 @@ private fun SectionHeader(title: String) { /** * An emoji grid cell that supports: - * - **Tap** → select the emoji (with default skin tone) + * - **Tap** → select the emoji with the user's preferred skin tone applied * - **Long-press** → if the emoji supports skin tones, show a popup with 6 Fitzpatrick variants * - **Selected highlight** → tinted background when the emoji is in [isSelected] */ @OptIn(ExperimentalFoundationApi::class) @Composable -private fun EmojiCellWithSkinTone(emoji: Emoji, isSelected: Boolean, onSelect: (String) -> Unit) { +@Suppress("LongParameterList") +private fun EmojiCellWithSkinTone( + emoji: Emoji, + isSelected: Boolean, + preferredSkinToneIndex: Int, + onSkinToneSelect: (Int) -> Unit, + onSelect: (String) -> Unit, +) { var showSkinTonePopup by rememberSaveable { mutableStateOf(false) } + val preferredTone = SkinTone.entries.getOrElse(preferredSkinToneIndex) { SkinTone.DEFAULT } + val displayEmoji = if (emoji.supportsSkinTone) emoji.withSkinTone(preferredTone) else emoji.base Box { Box( @@ -450,7 +560,7 @@ private fun EmojiCellWithSkinTone(emoji: Emoji, isSelected: Boolean, onSelect: ( }, ) .combinedClickable( - onClick = { onSelect(emoji.base) }, + onClick = { onSelect(displayEmoji) }, onLongClick = if (emoji.supportsSkinTone) { { showSkinTonePopup = true } @@ -460,7 +570,7 @@ private fun EmojiCellWithSkinTone(emoji: Emoji, isSelected: Boolean, onSelect: ( ), contentAlignment = Alignment.Center, ) { - Text(text = emoji.base, fontSize = EMOJI_FONT_SIZE.sp, textAlign = TextAlign.Center) + Text(text = displayEmoji, fontSize = EMOJI_FONT_SIZE.sp, textAlign = TextAlign.Center) // Small dot indicator for skin-tone-capable emoji if (emoji.supportsSkinTone) { Box( @@ -476,8 +586,9 @@ private fun EmojiCellWithSkinTone(emoji: Emoji, isSelected: Boolean, onSelect: ( if (showSkinTonePopup) { SkinTonePopup( emoji = emoji, - onSelect = { variant -> + onSelect = { variant, toneIndex -> showSkinTonePopup = false + onSkinToneSelect(toneIndex) onSelect(variant) }, onDismiss = { showSkinTonePopup = false }, @@ -489,7 +600,7 @@ private fun EmojiCellWithSkinTone(emoji: Emoji, isSelected: Boolean, onSelect: ( // ── Skin Tone Popup ──────────────────────────────────────────────────────────── @Composable -private fun SkinTonePopup(emoji: Emoji, onSelect: (String) -> Unit, onDismiss: () -> Unit) { +private fun SkinTonePopup(emoji: Emoji, onSelect: (String, Int) -> Unit, onDismiss: () -> Unit) { Popup(alignment = Alignment.TopCenter, onDismissRequest = onDismiss) { Surface( shape = RoundedCornerShape(12.dp), @@ -499,10 +610,11 @@ private fun SkinTonePopup(emoji: Emoji, onSelect: (String) -> Unit, onDismiss: ( modifier = Modifier.widthIn(max = 280.dp), ) { Row(modifier = Modifier.padding(6.dp), horizontalArrangement = Arrangement.spacedBy(2.dp)) { - SkinTone.entries.forEach { tone -> + SkinTone.entries.forEachIndexed { index, tone -> val variant = emoji.withSkinTone(tone) Box( - modifier = Modifier.size(40.dp).clip(RoundedCornerShape(8.dp)).clickable { onSelect(variant) }, + modifier = + Modifier.size(40.dp).clip(RoundedCornerShape(8.dp)).clickable { onSelect(variant, index) }, contentAlignment = Alignment.Center, ) { Text(text = variant, fontSize = 22.sp) @@ -552,3 +664,89 @@ private fun recordSelection(emoji: String, viewModel: EmojiPickerViewModel) { viewModel.customEmojiFrequency = freq.entries.joinToString(SPLIT_CHAR) { "${it.key}$KEY_VALUE_DELIMITER${it.value}" } } + +// ── Previews ─────────────────────────────────────────────────────────────────── + +private val PREVIEW_CATEGORIES = + listOf( + EmojiCategory( + "Smileys & Emotion", + "😀", + listOf( + Emoji("😀", listOf("grinning", "face", "smile")), + Emoji("😃", listOf("smiley", "face", "happy")), + Emoji("😄", listOf("smile", "happy", "joy")), + Emoji("😁", listOf("grin", "happy")), + Emoji("😆", listOf("laughing", "satisfied")), + Emoji("😅", listOf("sweat", "smile", "hot")), + Emoji("🤣", listOf("rofl", "laughing", "floor")), + Emoji("😂", listOf("joy", "tears", "laugh")), + Emoji("🙂", listOf("slightly", "smile")), + Emoji("😉", listOf("wink", "face")), + Emoji("😊", listOf("blush", "happy", "smile")), + Emoji("😇", listOf("angel", "innocent", "halo")), + ), + ), + EmojiCategory( + "People & Body", + "👋", + listOf( + Emoji("👋", listOf("wave", "hand", "hello"), supportsSkinTone = true), + Emoji("🤚", listOf("raised", "back", "hand"), supportsSkinTone = true), + Emoji("🖐️", listOf("hand", "splayed", "fingers"), supportsSkinTone = true), + Emoji("✋", listOf("hand", "high five", "stop"), supportsSkinTone = true), + Emoji("👍", listOf("thumbs up", "approve", "yes"), supportsSkinTone = true), + Emoji("👎", listOf("thumbs down", "disapprove", "no"), supportsSkinTone = true), + Emoji("👏", listOf("clap", "applause"), supportsSkinTone = true), + Emoji("🙌", listOf("raised", "hands", "celebration"), supportsSkinTone = true), + ), + ), + ) + +@Suppress("UnusedPrivateMember", "PreviewPublic") +@PreviewLightDark +@Composable +fun EmojiPickerContentPreview() { + AppTheme { + Surface { + EmojiPickerContent( + searchQuery = "", + debouncedQuery = "", + onSearchQueryChange = {}, + selectedCategoryIndex = 0, + onCategorySelected = {}, + selectedEmojis = setOf("😀", "👍"), + recentEmojis = listOf("😀", "❤️", "👍", "🔥", "😂", "🙏"), + categories = PREVIEW_CATEGORIES, + allEmojis = PREVIEW_CATEGORIES.flatMap { it.emojis }, + preferredSkinToneIndex = 0, + onSkinToneSelect = {}, + onEmojiSelected = {}, + ) + } + } +} + +@Suppress("UnusedPrivateMember", "PreviewPublic") +@PreviewLightDark +@Composable +fun EmojiPickerSearchPreview() { + AppTheme { + Surface { + EmojiPickerContent( + searchQuery = "smile", + debouncedQuery = "smile", + onSearchQueryChange = {}, + selectedCategoryIndex = 0, + onCategorySelected = {}, + selectedEmojis = emptySet(), + recentEmojis = listOf("😀", "❤️", "👍"), + categories = PREVIEW_CATEGORIES, + allEmojis = PREVIEW_CATEGORIES.flatMap { it.emojis }, + preferredSkinToneIndex = 0, + onSkinToneSelect = {}, + onEmojiSelected = {}, + ) + } + } +} diff --git a/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/emoji/EmojiPickerViewModel.kt b/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/emoji/EmojiPickerViewModel.kt index 1d7269b64..4feb31125 100644 --- a/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/emoji/EmojiPickerViewModel.kt +++ b/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/emoji/EmojiPickerViewModel.kt @@ -17,11 +17,43 @@ package org.meshtastic.core.ui.emoji import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.launch import org.koin.core.annotation.KoinViewModel import org.meshtastic.core.repository.CustomEmojiPrefs @KoinViewModel -class EmojiPickerViewModel(private val customEmojiPrefs: CustomEmojiPrefs) : ViewModel() { +internal class EmojiPickerViewModel( + private val customEmojiPrefs: CustomEmojiPrefs, + private val emojiRepository: EmojiRepository, +) : ViewModel() { + + private val _isLoaded = MutableStateFlow(false) + val isLoaded: StateFlow = _isLoaded + + /** Emoji categories, available after [isLoaded] emits true. */ + val categories: List + get() = emojiRepository.categories + + /** Flat list of all emojis, available after [isLoaded] emits true. */ + val allEmojis: List + get() = emojiRepository.all + + init { + viewModelScope.launch { + emojiRepository.preload() + _isLoaded.value = true + } + } + + /** User's preferred skin tone (persisted across sessions). */ + val preferredSkinToneIndex: StateFlow = customEmojiPrefs.preferredSkinToneIndex + + fun setPreferredSkinTone(index: Int) { + customEmojiPrefs.setPreferredSkinToneIndex(index) + } var customEmojiFrequency: String? get() = customEmojiPrefs.customEmojiFrequency.value diff --git a/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/emoji/EmojiRepository.kt b/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/emoji/EmojiRepository.kt new file mode 100644 index 000000000..d6b587f41 --- /dev/null +++ b/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/emoji/EmojiRepository.kt @@ -0,0 +1,111 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.meshtastic.core.ui.emoji + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.Json +import meshtasticandroid.core.ui.generated.resources.Res +import org.koin.core.annotation.Single + +/** A single emoji entry with optional skin-tone support and search keywords. */ +internal data class Emoji( + val base: String, + val keywords: List = emptyList(), + val supportsSkinTone: Boolean = false, +) + +/** A named category of emojis with an icon emoji for the tab. */ +internal data class EmojiCategory(val name: String, val icon: String, val emojis: List) + +/** Unicode skin tone modifiers (Fitzpatrick scale). */ +internal enum class SkinTone(val modifier: String, val label: String, val preview: String) { + DEFAULT("", "Default", "👋"), + LIGHT("\uD83C\uDFFB", "Light", "👋🏻"), + MEDIUM_LIGHT("\uD83C\uDFFC", "Medium-Light", "👋🏼"), + MEDIUM("\uD83C\uDFFD", "Medium", "👋🏽"), + MEDIUM_DARK("\uD83C\uDFFE", "Medium-Dark", "👋🏾"), + DARK("\uD83C\uDFFF", "Dark", "👋🏿"), +} + +/** + * Applies a skin tone modifier to a base emoji string. Only works correctly for single-codepoint emojis that support + * skin tones. + */ +internal fun Emoji.withSkinTone(tone: SkinTone): String { + if (!supportsSkinTone || tone == SkinTone.DEFAULT) return base + val firstChar = base[0] + val charCount = if (firstChar.isHighSurrogate() && base.length > 1) 2 else 1 + val baseChar = base.substring(0, charCount) + val after = base.substring(charCount) + return baseChar + tone.modifier + after +} + +// ── JSON models (compact wire format) ────────────────────────────────────────── + +@Serializable +private data class EmojiJson( + @SerialName("b") val base: String, + @SerialName("k") val keywords: List = emptyList(), + @SerialName("s") val supportsSkinTone: Boolean = false, +) + +@Serializable private data class CategoryJson(val name: String, val icon: String, val emojis: List) + +@Serializable private data class EmojiDataJson(val version: String, val categories: List) + +// ── Repository ───────────────────────────────────────────────────────────────── + +/** + * Provides access to the emoji catalog loaded from a bundled JSON resource. + * + * Data is loaded lazily on first access and cached for the lifetime of the app. The JSON resource contains Unicode 16.0 + * emoji data with CLDR-based keywords. + */ +@Single +internal class EmojiRepository { + + private var cached: Pair, List>? = null + + val categories: List + get() = ensureLoaded().first + + val all: List + get() = ensureLoaded().second + + suspend fun preload() { + if (cached != null) return + val bytes = Res.readBytes("files/emoji-data.json") + val json = Json { ignoreUnknownKeys = true } + val data = json.decodeFromString(bytes.decodeToString()) + val cats = + data.categories.map { cat -> + EmojiCategory( + name = cat.name, + icon = cat.icon, + emojis = + cat.emojis.map { e -> + Emoji(base = e.base, keywords = e.keywords, supportsSkinTone = e.supportsSkinTone) + }, + ) + } + cached = cats to cats.flatMap { it.emojis } + } + + private fun ensureLoaded(): Pair, List> = + cached ?: error("EmojiRepository not loaded. Call preload() before accessing data.") +} diff --git a/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/theme/Theme.kt b/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/theme/Theme.kt index 5b3cffcfd..acce06a76 100644 --- a/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/theme/Theme.kt +++ b/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/theme/Theme.kt @@ -15,6 +15,7 @@ * along with this program. If not, see . */ @file:Suppress("MatchingDeclarationName") +@file:OptIn(ExperimentalMaterial3ExpressiveApi::class) package org.meshtastic.core.ui.theme @@ -127,12 +128,9 @@ fun AppTheme( null } ?: if (darkTheme) darkScheme else lightScheme - MaterialExpressiveTheme( - colorScheme = colorScheme, - typography = AppTypography, - motionScheme = expressive(), - content = content, - ) + MaterialExpressiveTheme(colorScheme = colorScheme, typography = AppTypography, motionScheme = expressive()) { + content() + } } const val MODE_DYNAMIC = 6969420 diff --git a/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/theme/Type.kt b/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/theme/Type.kt index c3c53125b..b7b28717a 100644 --- a/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/theme/Type.kt +++ b/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/theme/Type.kt @@ -14,8 +14,40 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ +@file:OptIn(ExperimentalMaterial3ExpressiveApi::class) + package org.meshtastic.core.ui.theme +import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi import androidx.compose.material3.Typography +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontFamily +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.sp -val AppTypography = Typography() +/** + * Complete expressive typescale for the Meshtastic application. + * + * `bodyLarge` and `bodyMedium` enforce a minimum of 16.sp per design standards §5. Emphasized variants (e.g. + * `titleMediumEmphasized`, `bodyLargeEmphasized`) are auto-generated by [MaterialExpressiveTheme] based on these base + * styles. + */ +val AppTypography = + Typography( + bodyLarge = + TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Normal, + fontSize = 16.sp, + lineHeight = 24.sp, + letterSpacing = 0.5.sp, + ), + bodyMedium = + TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Normal, + fontSize = 16.sp, + lineHeight = 22.sp, + letterSpacing = 0.25.sp, + ), + ) diff --git a/core/ui/src/commonTest/kotlin/org/meshtastic/core/ui/emoji/EmojiPickerViewModelTest.kt b/core/ui/src/commonTest/kotlin/org/meshtastic/core/ui/emoji/EmojiPickerViewModelTest.kt index 12441b429..041ea3820 100644 --- a/core/ui/src/commonTest/kotlin/org/meshtastic/core/ui/emoji/EmojiPickerViewModelTest.kt +++ b/core/ui/src/commonTest/kotlin/org/meshtastic/core/ui/emoji/EmojiPickerViewModelTest.kt @@ -33,12 +33,15 @@ class EmojiPickerViewModelTest { private lateinit var viewModel: EmojiPickerViewModel private val customEmojiPrefs: CustomEmojiPrefs = mock(MockMode.autofill) + private val emojiRepository = EmojiRepository() private val frequencyFlow = MutableStateFlow(null) + private val skinToneFlow = MutableStateFlow(0) @BeforeTest fun setUp() { every { customEmojiPrefs.customEmojiFrequency } returns frequencyFlow - viewModel = EmojiPickerViewModel(customEmojiPrefs) + every { customEmojiPrefs.preferredSkinToneIndex } returns skinToneFlow + viewModel = EmojiPickerViewModel(customEmojiPrefs, emojiRepository) } @Test diff --git a/core/ui/src/iosMain/kotlin/org/meshtastic/core/ui/component/NoopStubs.kt b/core/ui/src/iosMain/kotlin/org/meshtastic/core/ui/component/NoopStubs.kt index e18ffd84c..ff88d00eb 100644 --- a/core/ui/src/iosMain/kotlin/org/meshtastic/core/ui/component/NoopStubs.kt +++ b/core/ui/src/iosMain/kotlin/org/meshtastic/core/ui/component/NoopStubs.kt @@ -16,10 +16,6 @@ */ package org.meshtastic.core.ui.component -import androidx.compose.runtime.Composable - -@Composable actual fun rememberTimeTickWithLifecycle(): Long = 0L - internal actual fun > enumEntriesOf(selectedItem: T): List = emptyList() internal actual fun Enum<*>.isDeprecatedEnumEntry(): Boolean = false diff --git a/core/ui/src/jvmMain/kotlin/org/meshtastic/core/ui/component/TimeTickWithLifecycle.kt b/core/ui/src/jvmMain/kotlin/org/meshtastic/core/ui/component/TimeTickWithLifecycle.kt deleted file mode 100644 index 4d4655419..000000000 --- a/core/ui/src/jvmMain/kotlin/org/meshtastic/core/ui/component/TimeTickWithLifecycle.kt +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (c) 2026 Meshtastic LLC - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package org.meshtastic.core.ui.component - -import androidx.compose.runtime.Composable -import org.meshtastic.core.common.util.nowMillis - -/** JVM implementation — returns the current epoch millis (no lifecycle-based updates on Desktop). */ -@Composable actual fun rememberTimeTickWithLifecycle(): Long = nowMillis diff --git a/feature/connections/src/commonMain/kotlin/org/meshtastic/feature/connections/ui/components/ConnectingDeviceInfo.kt b/feature/connections/src/commonMain/kotlin/org/meshtastic/feature/connections/ui/components/ConnectingDeviceInfo.kt index 9c6897c53..e27939314 100644 --- a/feature/connections/src/commonMain/kotlin/org/meshtastic/feature/connections/ui/components/ConnectingDeviceInfo.kt +++ b/feature/connections/src/commonMain/kotlin/org/meshtastic/feature/connections/ui/components/ConnectingDeviceInfo.kt @@ -14,6 +14,8 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ +@file:OptIn(ExperimentalMaterial3ExpressiveApi::class) + package org.meshtastic.feature.connections.ui.components import androidx.compose.foundation.layout.Arrangement @@ -22,7 +24,8 @@ import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size -import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.CircularWavyProgressIndicator +import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -66,7 +69,7 @@ fun ConnectingDeviceInfo( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(16.dp), ) { - CircularProgressIndicator(modifier = Modifier.size(40.dp)) + CircularWavyProgressIndicator(modifier = Modifier.size(40.dp)) Column { Text(text = deviceName, style = MaterialTheme.typography.headlineSmall) diff --git a/feature/connections/src/commonMain/kotlin/org/meshtastic/feature/connections/ui/components/ConnectionActionButton.kt b/feature/connections/src/commonMain/kotlin/org/meshtastic/feature/connections/ui/components/ConnectionActionButton.kt index e383494df..f964db65d 100644 --- a/feature/connections/src/commonMain/kotlin/org/meshtastic/feature/connections/ui/components/ConnectionActionButton.kt +++ b/feature/connections/src/commonMain/kotlin/org/meshtastic/feature/connections/ui/components/ConnectionActionButton.kt @@ -14,12 +14,15 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ +@file:OptIn(ExperimentalMaterial3ExpressiveApi::class) + package org.meshtastic.feature.connections.ui.components import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.size import androidx.compose.material3.Button import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi import androidx.compose.material3.FilledTonalButton import androidx.compose.material3.Icon import androidx.compose.material3.OutlinedButton @@ -62,6 +65,7 @@ fun ConnectionActionButton( onClick = onClick, modifier = modifier, enabled = enabled, + shapes = ButtonDefaults.shapes(), contentPadding = ButtonDefaults.ButtonWithIconContentPadding, ) { content() @@ -72,6 +76,7 @@ fun ConnectionActionButton( onClick = onClick, modifier = modifier, enabled = enabled, + shapes = ButtonDefaults.shapes(), contentPadding = ButtonDefaults.ButtonWithIconContentPadding, ) { content() @@ -82,6 +87,7 @@ fun ConnectionActionButton( onClick = onClick, modifier = modifier, enabled = enabled, + shapes = ButtonDefaults.shapes(), contentPadding = ButtonDefaults.ButtonWithIconContentPadding, ) { content() diff --git a/feature/connections/src/commonMain/kotlin/org/meshtastic/feature/connections/ui/components/CurrentlyConnectedInfo.kt b/feature/connections/src/commonMain/kotlin/org/meshtastic/feature/connections/ui/components/CurrentlyConnectedInfo.kt index 03a25a375..b0785fe96 100644 --- a/feature/connections/src/commonMain/kotlin/org/meshtastic/feature/connections/ui/components/CurrentlyConnectedInfo.kt +++ b/feature/connections/src/commonMain/kotlin/org/meshtastic/feature/connections/ui/components/CurrentlyConnectedInfo.kt @@ -14,6 +14,8 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ +@file:OptIn(ExperimentalMaterial3ExpressiveApi::class) + package org.meshtastic.feature.connections.ui.components import androidx.compose.foundation.layout.Arrangement @@ -21,6 +23,7 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding +import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -95,7 +98,7 @@ fun CurrentlyConnectedInfo( NodeChip(node = node, onClick = { onNavigateToNodeDetails(it.num) }) Column(modifier = Modifier.weight(1f, fill = true)) { - Text(text = node.user.long_name, style = MaterialTheme.typography.titleMedium) + Text(text = node.user.long_name, style = MaterialTheme.typography.titleMediumEmphasized) node.metadata ?.firmware_version diff --git a/feature/connections/src/commonMain/kotlin/org/meshtastic/feature/connections/ui/components/DeviceListItem.kt b/feature/connections/src/commonMain/kotlin/org/meshtastic/feature/connections/ui/components/DeviceListItem.kt index cebc40724..dcc51e1a8 100644 --- a/feature/connections/src/commonMain/kotlin/org/meshtastic/feature/connections/ui/components/DeviceListItem.kt +++ b/feature/connections/src/commonMain/kotlin/org/meshtastic/feature/connections/ui/components/DeviceListItem.kt @@ -14,6 +14,8 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ +@file:OptIn(ExperimentalMaterial3ExpressiveApi::class) + package org.meshtastic.feature.connections.ui.components import androidx.compose.foundation.ExperimentalFoundationApi @@ -24,7 +26,8 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.selection.selectable -import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.CircularWavyProgressIndicator +import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi import androidx.compose.material3.Icon import androidx.compose.material3.ListItem import androidx.compose.material3.ListItemDefaults @@ -156,7 +159,7 @@ fun DeviceListItem( } if (connectionState is ConnectionState.Connecting) { - CircularProgressIndicator(modifier = Modifier.size(32.dp)) + CircularWavyProgressIndicator(modifier = Modifier.size(32.dp)) } else { RadioButton(selected = connectionState is ConnectionState.Connected, onClick = null) } diff --git a/feature/connections/src/commonMain/kotlin/org/meshtastic/feature/connections/ui/components/DeviceSectionHeader.kt b/feature/connections/src/commonMain/kotlin/org/meshtastic/feature/connections/ui/components/DeviceSectionHeader.kt index 7d4f28005..f344041c3 100644 --- a/feature/connections/src/commonMain/kotlin/org/meshtastic/feature/connections/ui/components/DeviceSectionHeader.kt +++ b/feature/connections/src/commonMain/kotlin/org/meshtastic/feature/connections/ui/components/DeviceSectionHeader.kt @@ -14,6 +14,8 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ +@file:OptIn(ExperimentalMaterial3ExpressiveApi::class) + package org.meshtastic.feature.connections.ui.components import androidx.compose.foundation.layout.Arrangement @@ -21,7 +23,8 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding -import androidx.compose.material3.LinearProgressIndicator +import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi +import androidx.compose.material3.LinearWavyProgressIndicator import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -60,7 +63,7 @@ fun DeviceSectionHeader( trailing() } if (showProgress) { - LinearProgressIndicator(modifier = Modifier.fillMaxWidth()) + LinearWavyProgressIndicator(modifier = Modifier.fillMaxWidth()) } } } diff --git a/feature/firmware/src/commonMain/kotlin/org/meshtastic/feature/firmware/FirmwareUpdateScreen.kt b/feature/firmware/src/commonMain/kotlin/org/meshtastic/feature/firmware/FirmwareUpdateScreen.kt index e63ab4338..45aa27cd2 100644 --- a/feature/firmware/src/commonMain/kotlin/org/meshtastic/feature/firmware/FirmwareUpdateScreen.kt +++ b/feature/firmware/src/commonMain/kotlin/org/meshtastic/feature/firmware/FirmwareUpdateScreen.kt @@ -14,6 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ +@file:OptIn(ExperimentalMaterial3ExpressiveApi::class) @file:Suppress("TooManyFunctions") package org.meshtastic.feature.firmware @@ -39,7 +40,6 @@ import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.Card import androidx.compose.material3.CardDefaults import androidx.compose.material3.CenterAlignedTopAppBar -import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.CircularWavyProgressIndicator import androidx.compose.material3.ElevatedCard import androidx.compose.material3.ExperimentalMaterial3Api @@ -337,7 +337,7 @@ private fun FirmwareUpdateContent( @Composable internal fun VerifyingState() { - CircularProgressIndicator(modifier = Modifier.size(64.dp)) + CircularWavyProgressIndicator(modifier = Modifier.size(64.dp)) Spacer(Modifier.height(24.dp)) Text(stringResource(Res.string.firmware_update_verifying), style = MaterialTheme.typography.titleMedium) Spacer(Modifier.height(8.dp)) @@ -352,7 +352,7 @@ internal fun VerifyingState() { @Composable internal fun CheckingState() { - CircularProgressIndicator(modifier = Modifier.size(64.dp)) + CircularWavyProgressIndicator(modifier = Modifier.size(64.dp)) Spacer(Modifier.height(24.dp)) Text(stringResource(Res.string.firmware_update_checking), style = MaterialTheme.typography.bodyLarge) } @@ -763,7 +763,7 @@ private fun AwaitingFileSaveState(state: FirmwareUpdateState.AwaitingFileSave, o ) } - CircularProgressIndicator(modifier = Modifier.size(64.dp)) + CircularWavyProgressIndicator(modifier = Modifier.size(64.dp)) Spacer(Modifier.height(24.dp)) Text( stringResource(Res.string.firmware_update_save_dfu_file), diff --git a/feature/map/src/commonMain/kotlin/org/meshtastic/feature/map/component/MapControlsOverlay.kt b/feature/map/src/commonMain/kotlin/org/meshtastic/feature/map/component/MapControlsOverlay.kt index 3b20211c8..1445424b3 100644 --- a/feature/map/src/commonMain/kotlin/org/meshtastic/feature/map/component/MapControlsOverlay.kt +++ b/feature/map/src/commonMain/kotlin/org/meshtastic/feature/map/component/MapControlsOverlay.kt @@ -14,12 +14,14 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ +@file:OptIn(ExperimentalMaterial3ExpressiveApi::class) + package org.meshtastic.feature.map.component import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size -import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.CircularWavyProgressIndicator import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi import androidx.compose.material3.FloatingToolbarDefaults import androidx.compose.material3.HorizontalFloatingToolbar @@ -103,7 +105,7 @@ fun MapControlsOverlay( if (showRefresh) { if (isRefreshing) { Box(modifier = Modifier.padding(8.dp)) { - CircularProgressIndicator(modifier = Modifier.size(24.dp), strokeWidth = 2.dp) + CircularWavyProgressIndicator(modifier = Modifier.size(24.dp)) } } else { MapButton( diff --git a/feature/messaging/src/commonMain/kotlin/org/meshtastic/feature/messaging/component/MessageScreenComponents.kt b/feature/messaging/src/commonMain/kotlin/org/meshtastic/feature/messaging/component/MessageScreenComponents.kt index dba6bb493..4d89b342c 100644 --- a/feature/messaging/src/commonMain/kotlin/org/meshtastic/feature/messaging/component/MessageScreenComponents.kt +++ b/feature/messaging/src/commonMain/kotlin/org/meshtastic/feature/messaging/component/MessageScreenComponents.kt @@ -15,6 +15,7 @@ * along with this program. If not, see . */ @file:Suppress("TooManyFunctions") +@file:OptIn(ExperimentalMaterial3ExpressiveApi::class) package org.meshtastic.feature.messaging.component @@ -36,13 +37,16 @@ import androidx.compose.material3.Badge import androidx.compose.material3.BadgedBox import androidx.compose.material3.Button import androidx.compose.material3.DropdownMenu +import androidx.compose.material3.DropdownMenuGroup import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi import androidx.compose.material3.FloatingActionButton import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.MenuDefaults import androidx.compose.material3.Text import androidx.compose.material3.TopAppBar import androidx.compose.runtime.Composable @@ -389,13 +393,17 @@ private fun OverFlowMenu( ) { if (expanded) { DropdownMenu(expanded = expanded, onDismissRequest = onDismiss) { - QuickChatToggleMenuItem(showQuickChat, onDismiss, onToggleQuickChat) - QuickChatOptionsMenuItem(onDismiss, onNavigateToQuickChatOptions) - if (filteredCount > 0 && !filteringDisabled) { - FilteredMessagesMenuItem(showFiltered, filteredCount, onDismiss, onToggleShowFiltered) + DropdownMenuGroup(shapes = MenuDefaults.groupShapes()) { + QuickChatToggleMenuItem(showQuickChat, onDismiss, onToggleQuickChat) + QuickChatOptionsMenuItem(onDismiss, onNavigateToQuickChatOptions) + } + DropdownMenuGroup(shapes = MenuDefaults.groupShapes()) { + if (filteredCount > 0 && !filteringDisabled) { + FilteredMessagesMenuItem(showFiltered, filteredCount, onDismiss, onToggleShowFiltered) + } + FilterToggleMenuItem(filteringDisabled, onDismiss, onToggleFilteringDisabled) + FilterSettingsMenuItem(onDismiss, onNavigateToFilterSettings) } - FilterToggleMenuItem(filteringDisabled, onDismiss, onToggleFilteringDisabled) - FilterSettingsMenuItem(onDismiss, onNavigateToFilterSettings) } } } diff --git a/feature/messaging/src/commonMain/kotlin/org/meshtastic/feature/messaging/component/Reaction.kt b/feature/messaging/src/commonMain/kotlin/org/meshtastic/feature/messaging/component/Reaction.kt index c08298e29..d11fc1ae9 100644 --- a/feature/messaging/src/commonMain/kotlin/org/meshtastic/feature/messaging/component/Reaction.kt +++ b/feature/messaging/src/commonMain/kotlin/org/meshtastic/feature/messaging/component/Reaction.kt @@ -26,7 +26,6 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.ExperimentalLayoutApi import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size @@ -34,11 +33,14 @@ import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyRow import androidx.compose.foundation.lazy.items import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.Surface import androidx.compose.material3.Text +import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf @@ -68,7 +70,6 @@ import org.meshtastic.core.resources.message_status_queued import org.meshtastic.core.resources.message_status_unknown import org.meshtastic.core.resources.react import org.meshtastic.core.resources.you -import org.meshtastic.core.ui.component.BottomSheetDialog import org.meshtastic.core.ui.component.Rssi import org.meshtastic.core.ui.component.Snr import org.meshtastic.core.ui.emoji.EmojiPickerDialog @@ -187,6 +188,7 @@ internal fun AddReactionButton(modifier: Modifier = Modifier, onSendReaction: (S } } +@OptIn(ExperimentalMaterial3Api::class) @Suppress("LongMethod", "CyclomaticComplexity", "CyclomaticComplexMethod") @Composable internal fun ReactionDialog( @@ -194,7 +196,10 @@ internal fun ReactionDialog( onDismiss: () -> Unit = {}, myId: String? = null, onResend: (Reaction) -> Unit = {}, -) = BottomSheetDialog(onDismiss = onDismiss, modifier = Modifier.fillMaxHeight(fraction = .3f)) { +) = ModalBottomSheet( + onDismissRequest = onDismiss, + sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true), +) { val groupedEmojis = reactions.groupBy { it.emoji } var selectedEmoji by remember { mutableStateOf(null) } val filteredReactions = selectedEmoji?.let { groupedEmojis[it] ?: emptyList() } ?: reactions diff --git a/feature/messaging/src/commonMain/kotlin/org/meshtastic/feature/messaging/ui/contact/ContactItem.kt b/feature/messaging/src/commonMain/kotlin/org/meshtastic/feature/messaging/ui/contact/ContactItem.kt index b96a59698..497984548 100644 --- a/feature/messaging/src/commonMain/kotlin/org/meshtastic/feature/messaging/ui/contact/ContactItem.kt +++ b/feature/messaging/src/commonMain/kotlin/org/meshtastic/feature/messaging/ui/contact/ContactItem.kt @@ -14,6 +14,8 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ +@file:OptIn(ExperimentalMaterial3ExpressiveApi::class) + package org.meshtastic.feature.messaging.ui.contact import androidx.compose.animation.AnimatedVisibility @@ -35,6 +37,7 @@ import androidx.compose.material3.AssistChip import androidx.compose.material3.AssistChipDefaults import androidx.compose.material3.Card import androidx.compose.material3.CardDefaults +import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text @@ -141,7 +144,7 @@ private fun ContactHeader( Text( modifier = Modifier.padding(start = 8.dp).weight(1f), - style = MaterialTheme.typography.bodyLarge, + style = MaterialTheme.typography.bodyLargeEmphasized, fontWeight = FontWeight.Medium, overflow = TextOverflow.Ellipsis, maxLines = 1, diff --git a/feature/messaging/src/commonMain/kotlin/org/meshtastic/feature/messaging/ui/contact/Contacts.kt b/feature/messaging/src/commonMain/kotlin/org/meshtastic/feature/messaging/ui/contact/Contacts.kt index 2792dfb54..63389dc5a 100644 --- a/feature/messaging/src/commonMain/kotlin/org/meshtastic/feature/messaging/ui/contact/Contacts.kt +++ b/feature/messaging/src/commonMain/kotlin/org/meshtastic/feature/messaging/ui/contact/Contacts.kt @@ -14,6 +14,8 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ +@file:OptIn(ExperimentalMaterial3ExpressiveApi::class) + package org.meshtastic.feature.messaging.ui.contact import androidx.compose.foundation.layout.Box @@ -27,8 +29,9 @@ import androidx.compose.foundation.lazy.LazyListScope import androidx.compose.foundation.lazy.LazyListState import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.foundation.selection.selectable -import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.CircularWavyProgressIndicator import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.RadioButton @@ -501,7 +504,7 @@ private fun ContactListViewPaged( val haptic = LocalHapticFeedback.current Box(modifier = modifier.fillMaxSize()) { if (contacts.loadState.refresh is LoadState.Loading && contacts.itemCount == 0) { - CircularProgressIndicator(modifier = Modifier.align(Alignment.Center)) + CircularWavyProgressIndicator(modifier = Modifier.align(Alignment.Center)) } else { ContactListContentInternal( contacts = contacts, @@ -621,7 +624,7 @@ private fun LazyListScope.contactListAppendLoadingItem(contacts: LazyPagingItems if (contacts.loadState.append is LoadState.Loading) { item { Box(modifier = Modifier.fillMaxWidth().padding(16.dp)) { - CircularProgressIndicator(modifier = Modifier.align(Alignment.Center)) + CircularWavyProgressIndicator(modifier = Modifier.align(Alignment.Center)) } } } diff --git a/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/component/AdministrationSection.kt b/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/component/AdministrationSection.kt index 80c4c132b..a70619c17 100644 --- a/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/component/AdministrationSection.kt +++ b/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/component/AdministrationSection.kt @@ -14,6 +14,8 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ +@file:OptIn(ExperimentalMaterial3ExpressiveApi::class) + package org.meshtastic.feature.node.component import androidx.compose.animation.AnimatedVisibility @@ -23,7 +25,8 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.material3.AssistChip import androidx.compose.material3.AssistChipDefaults -import androidx.compose.material3.LinearProgressIndicator +import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi +import androidx.compose.material3.LinearWavyProgressIndicator import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier @@ -168,7 +171,7 @@ private fun RemoteAdminListItem( ) AnimatedVisibility(visible = isEnsuringSession) { Column(modifier = Modifier.fillMaxWidth().padding(horizontal = 16.dp, vertical = 4.dp)) { - LinearProgressIndicator(modifier = Modifier.fillMaxWidth()) + LinearWavyProgressIndicator(modifier = Modifier.fillMaxWidth()) androidx.compose.material3.Text( text = stringResource(Res.string.establishing_session), style = MaterialTheme.typography.bodySmall, diff --git a/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/component/CompassBottomSheet.kt b/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/component/CompassBottomSheet.kt index 4763caf3c..01e7a0672 100644 --- a/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/component/CompassBottomSheet.kt +++ b/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/component/CompassBottomSheet.kt @@ -14,6 +14,8 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ +@file:OptIn(ExperimentalMaterial3ExpressiveApi::class) + package org.meshtastic.feature.node.component import androidx.compose.foundation.Canvas @@ -26,6 +28,7 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width import androidx.compose.material3.Button +import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface @@ -99,7 +102,11 @@ fun CompassSheetContent( horizontalAlignment = Alignment.CenterHorizontally, ) { Text(text = stringResource(Res.string.compass_title), style = MaterialTheme.typography.headlineSmall) - Text(text = uiState.targetName, style = MaterialTheme.typography.titleMedium, color = uiState.targetColor) + Text( + text = uiState.targetName, + style = MaterialTheme.typography.titleMediumEmphasized, + color = uiState.targetColor, + ) CompassDial( heading = uiState.heading, diff --git a/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/component/DeviceActions.kt b/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/component/DeviceActions.kt index 4fe65e966..1e7e971b8 100644 --- a/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/component/DeviceActions.kt +++ b/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/component/DeviceActions.kt @@ -26,10 +26,10 @@ import androidx.compose.foundation.layout.width import androidx.compose.material3.Button import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.Icon -import androidx.compose.material3.IconToggleButton import androidx.compose.material3.LocalContentColor import androidx.compose.material3.MaterialTheme import androidx.compose.material3.OutlinedButton +import androidx.compose.material3.OutlinedIconToggleButton import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment @@ -136,7 +136,7 @@ private fun PrimaryActionsRow(node: Node, isLocal: Boolean, onAction: (NodeDetai } if (!isLocal) { - IconToggleButton( + OutlinedIconToggleButton( checked = node.isFavorite, onCheckedChange = { onAction(NodeDetailAction.HandleNodeMenuAction(NodeMenuAction.Favorite(node))) }, ) { diff --git a/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/component/NodeContextMenu.kt b/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/component/NodeContextMenu.kt index 29f526deb..ec6ef384e 100644 --- a/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/component/NodeContextMenu.kt +++ b/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/component/NodeContextMenu.kt @@ -14,13 +14,18 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ +@file:OptIn(ExperimentalMaterial3ExpressiveApi::class) + package org.meshtastic.feature.node.component import androidx.compose.material3.DropdownMenu +import androidx.compose.material3.DropdownMenuGroup import androidx.compose.material3.DropdownMenuItem +import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi import androidx.compose.material3.Icon import androidx.compose.material3.LocalContentColor import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.MenuDefaults import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.graphics.Color @@ -59,12 +64,16 @@ fun NodeContextMenu( onDismiss: () -> Unit, ) { DropdownMenu(expanded = expanded, onDismissRequest = onDismiss) { - FavoriteMenuItem(node, onFavorite, onDismiss) - IgnoreMenuItem(node, onIgnore, onDismiss) - if (node.capabilities.canMuteNode) { - MuteMenuItem(node, onMute, onDismiss) + DropdownMenuGroup(shapes = MenuDefaults.groupShapes()) { + FavoriteMenuItem(node, onFavorite, onDismiss) + if (node.capabilities.canMuteNode) { + MuteMenuItem(node, onMute, onDismiss) + } + } + DropdownMenuGroup(shapes = MenuDefaults.groupShapes()) { + IgnoreMenuItem(node, onIgnore, onDismiss) + RemoveMenuItem(node, onRemove, onDismiss) } - RemoveMenuItem(node, onRemove, onDismiss) } } diff --git a/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/component/NodeFilterTextField.kt b/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/component/NodeFilterTextField.kt index 88423aab1..b1f2a3799 100644 --- a/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/component/NodeFilterTextField.kt +++ b/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/component/NodeFilterTextField.kt @@ -14,6 +14,8 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ +@file:OptIn(ExperimentalMaterial3ExpressiveApi::class) + package org.meshtastic.feature.node.component import androidx.compose.foundation.background @@ -31,8 +33,9 @@ import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material3.Checkbox import androidx.compose.material3.DropdownMenu +import androidx.compose.material3.DropdownMenuGroup import androidx.compose.material3.DropdownMenuItem -import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme @@ -227,67 +230,69 @@ private fun NodeSortButton( onDismissRequest = { expanded = false }, modifier = Modifier.background(MaterialTheme.colorScheme.background.copy(alpha = 1f)), ) { - DropdownMenuTitle(text = stringResource(Res.string.node_sort_title)) + DropdownMenuGroup(shapes = MenuDefaults.groupShapes()) { + DropdownMenuTitle(text = stringResource(Res.string.node_sort_title)) - NodeSortOption.entries.forEach { sort -> - DropdownMenuRadio( - text = stringResource(sort.stringRes), - selected = sort == currentSortOption, - onClick = { onSortSelect(sort) }, - ) + NodeSortOption.entries.forEach { sort -> + DropdownMenuRadio( + text = stringResource(sort.stringRes), + selected = sort == currentSortOption, + onClick = { onSortSelect(sort) }, + ) + } } - HorizontalDivider(modifier = Modifier.padding(MenuDefaults.DropdownMenuItemContentPadding)) + DropdownMenuGroup(shapes = MenuDefaults.groupShapes()) { + DropdownMenuTitle(text = stringResource(Res.string.node_filter_title)) - DropdownMenuTitle(text = stringResource(Res.string.node_filter_title)) + DropdownMenuCheck( + text = stringResource(Res.string.node_filter_exclude_infrastructure), + checked = toggles.excludeInfrastructure, + onClick = toggles.onToggleExcludeInfrastructure, + ) - DropdownMenuCheck( - text = stringResource(Res.string.node_filter_exclude_infrastructure), - checked = toggles.excludeInfrastructure, - onClick = toggles.onToggleExcludeInfrastructure, - ) + DropdownMenuCheck( + text = stringResource(Res.string.node_filter_include_unknown), + checked = toggles.includeUnknown, + onClick = toggles.onToggleIncludeUnknown, + ) - DropdownMenuCheck( - text = stringResource(Res.string.node_filter_include_unknown), - checked = toggles.includeUnknown, - onClick = toggles.onToggleIncludeUnknown, - ) + DropdownMenuCheck( + text = stringResource(Res.string.node_filter_only_online), + checked = toggles.onlyOnline, + onClick = toggles.onToggleOnlyOnline, + ) - DropdownMenuCheck( - text = stringResource(Res.string.node_filter_only_online), - checked = toggles.onlyOnline, - onClick = toggles.onToggleOnlyOnline, - ) + DropdownMenuCheck( + text = stringResource(Res.string.node_filter_only_direct), + checked = toggles.onlyDirect, + onClick = toggles.onToggleOnlyDirect, + ) - DropdownMenuCheck( - text = stringResource(Res.string.node_filter_only_direct), - checked = toggles.onlyDirect, - onClick = toggles.onToggleOnlyDirect, - ) + DropdownMenuCheck( + text = stringResource(Res.string.node_filter_show_ignored), + checked = toggles.showIgnored, + onClick = toggles.onToggleShowIgnored, + trailing = + if (toggles.ignoredNodeCount > 0) { + { + Text( + text = " (${toggles.ignoredNodeCount})", + color = MaterialTheme.colorScheme.primary, + modifier = Modifier.padding(start = 4.dp), + ) + } + } else { + null + }, + ) - DropdownMenuCheck( - text = stringResource(Res.string.node_filter_show_ignored), - checked = toggles.showIgnored, - onClick = toggles.onToggleShowIgnored, - trailing = - if (toggles.ignoredNodeCount > 0) { - { - Text( - text = " (${toggles.ignoredNodeCount})", - color = MaterialTheme.colorScheme.primary, - modifier = Modifier.padding(start = 4.dp), - ) - } - } else { - null - }, - ) - - DropdownMenuCheck( - text = stringResource(Res.string.node_filter_exclude_mqtt), - checked = toggles.excludeMqtt, - onClick = toggles.onToggleExcludeMqtt, - ) + DropdownMenuCheck( + text = stringResource(Res.string.node_filter_exclude_mqtt), + checked = toggles.excludeMqtt, + onClick = toggles.onToggleExcludeMqtt, + ) + } } } diff --git a/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/component/NotesSection.kt b/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/component/NotesSection.kt index ff93c4a2e..6347901da 100644 --- a/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/component/NotesSection.kt +++ b/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/component/NotesSection.kt @@ -14,6 +14,8 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ +@file:OptIn(ExperimentalMaterial3ExpressiveApi::class) + package org.meshtastic.feature.node.component import androidx.compose.foundation.layout.Column @@ -25,6 +27,7 @@ import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material3.CardDefaults import androidx.compose.material3.ElevatedCard +import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme @@ -60,7 +63,7 @@ fun NotesSection(node: Node, onSaveNotes: (Int, String) -> Unit, modifier: Modif Column(modifier = Modifier.padding(20.dp)) { Text( text = stringResource(Res.string.notes), - style = MaterialTheme.typography.titleMedium, + style = MaterialTheme.typography.titleMediumEmphasized, color = MaterialTheme.colorScheme.primary, fontWeight = FontWeight.Bold, ) diff --git a/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/detail/NodeDetailContent.kt b/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/detail/NodeDetailContent.kt index 46b581127..62044a0e5 100644 --- a/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/detail/NodeDetailContent.kt +++ b/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/detail/NodeDetailContent.kt @@ -14,6 +14,8 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ +@file:OptIn(ExperimentalMaterial3ExpressiveApi::class) + package org.meshtastic.feature.node.detail import androidx.compose.animation.Crossfade @@ -24,7 +26,8 @@ import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyListState import androidx.compose.foundation.lazy.rememberLazyListState -import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.CircularWavyProgressIndicator +import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -73,7 +76,7 @@ fun NodeDetailContent( } else { val loadingDescription = stringResource(Res.string.loading) Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) { - CircularProgressIndicator(modifier = Modifier.semantics { contentDescription = loadingDescription }) + CircularWavyProgressIndicator(modifier = Modifier.semantics { contentDescription = loadingDescription }) } } } diff --git a/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/metrics/PowerMetrics.kt b/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/metrics/PowerMetrics.kt index 8920ee725..577a8b612 100644 --- a/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/metrics/PowerMetrics.kt +++ b/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/metrics/PowerMetrics.kt @@ -42,7 +42,6 @@ import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color -import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle @@ -363,11 +362,7 @@ private fun hasChannelData(voltage: Float?, current: Float?): Boolean = voltage @Composable private fun PowerChannelColumn(titleRes: StringResource, voltage: Float, current: Float) { Column { - Text( - text = stringResource(titleRes), - style = TextStyle(fontWeight = FontWeight.Bold), - fontSize = MaterialTheme.typography.labelLarge.fontSize, - ) + Text(text = stringResource(titleRes), style = MaterialTheme.typography.labelLarge, fontWeight = FontWeight.Bold) MetricValueRow(color = PowerMetric.VOLTAGE.color, text = MetricFormatter.voltage(voltage)) MetricValueRow(color = PowerMetric.CURRENT.color, text = MetricFormatter.current(current)) } diff --git a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/AboutScreen.kt b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/AboutScreen.kt index 751b5511d..6c1367b3a 100644 --- a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/AboutScreen.kt +++ b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/AboutScreen.kt @@ -14,6 +14,8 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ +@file:OptIn(ExperimentalMaterial3ExpressiveApi::class) + package org.meshtastic.feature.settings import androidx.compose.foundation.layout.Box @@ -21,6 +23,7 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding +import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold @@ -112,7 +115,7 @@ private fun AboutHeader() { Column(modifier = Modifier.fillMaxWidth().padding(horizontal = 16.dp, vertical = 12.dp)) { Text( text = stringResource(Res.string.open_source_libraries), - style = MaterialTheme.typography.titleMedium, + style = MaterialTheme.typography.titleMediumEmphasized, color = MaterialTheme.colorScheme.primary, ) Text( diff --git a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/component/ExpressiveSection.kt b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/component/ExpressiveSection.kt index 4dc4913b6..9305ee6ba 100644 --- a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/component/ExpressiveSection.kt +++ b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/component/ExpressiveSection.kt @@ -14,6 +14,8 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ +@file:OptIn(ExperimentalMaterial3ExpressiveApi::class) + package org.meshtastic.feature.settings.component import androidx.compose.foundation.layout.Arrangement @@ -23,6 +25,7 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.material3.Card import androidx.compose.material3.CardDefaults +import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -43,7 +46,7 @@ fun ExpressiveSection( Text( text = title, modifier = Modifier.padding(horizontal = 16.dp).fillMaxWidth(), - style = MaterialTheme.typography.titleMedium, + style = MaterialTheme.typography.titleMediumEmphasized, fontWeight = FontWeight.Bold, color = titleColor, ) diff --git a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/debugging/DebugFilters.kt b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/debugging/DebugFilters.kt index 3d879cbde..6dbe9f1a5 100644 --- a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/debugging/DebugFilters.kt +++ b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/debugging/DebugFilters.kt @@ -43,7 +43,6 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.unit.DpOffset @@ -129,7 +128,8 @@ fun DebugPresetFilters( Column(modifier = modifier) { Text( text = stringResource(Res.string.debug_filter_preset_title), - style = TextStyle(fontWeight = FontWeight.Bold), + style = MaterialTheme.typography.bodyMedium, + fontWeight = FontWeight.Bold, modifier = Modifier.padding(vertical = 4.dp), ) FlowRow( @@ -185,7 +185,8 @@ fun DebugFilterBar( Row(verticalAlignment = Alignment.CenterVertically) { Text( text = stringResource(Res.string.debug_filters), - style = TextStyle(fontWeight = FontWeight.Bold), + style = MaterialTheme.typography.bodyMedium, + fontWeight = FontWeight.Bold, ) Icon( imageVector = @@ -245,7 +246,8 @@ fun DebugActiveFilters( ) { Text( text = stringResource(Res.string.debug_active_filters), - style = TextStyle(fontWeight = FontWeight.Bold), + style = MaterialTheme.typography.bodyMedium, + fontWeight = FontWeight.Bold, ) TextButton( onClick = { diff --git a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/debugging/DebugSearch.kt b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/debugging/DebugSearch.kt index 30c86a52e..782308fb1 100644 --- a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/debugging/DebugSearch.kt +++ b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/debugging/DebugSearch.kt @@ -39,10 +39,8 @@ import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp import org.jetbrains.compose.resources.stringResource import org.meshtastic.core.resources.Res import org.meshtastic.core.resources.debug_default_search @@ -73,7 +71,7 @@ fun DebugSearchNavigation( Text( text = "${searchState.currentMatchIndex + 1}/${searchState.allMatches.size}", modifier = Modifier.padding(end = 4.dp), - style = TextStyle(fontSize = 12.sp), + style = MaterialTheme.typography.labelSmall, ) IconButton(onClick = onPreviousMatch, enabled = searchState.hasMatches, modifier = Modifier.size(32.dp)) { Icon( diff --git a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/filter/FilterSettingsScreen.kt b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/filter/FilterSettingsScreen.kt index 680114afc..7ee3f603e 100644 --- a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/filter/FilterSettingsScreen.kt +++ b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/filter/FilterSettingsScreen.kt @@ -14,6 +14,8 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ +@file:OptIn(ExperimentalMaterial3ExpressiveApi::class) + package org.meshtastic.feature.settings.filter import androidx.compose.foundation.layout.Arrangement @@ -26,6 +28,7 @@ import androidx.compose.foundation.lazy.items import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material3.Card +import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme @@ -121,7 +124,7 @@ private fun FilterEnableCard(enabled: Boolean, onToggle: (Boolean) -> Unit) { verticalAlignment = Alignment.CenterVertically, ) { Column(modifier = Modifier.weight(1f)) { - Text(stringResource(Res.string.filter_enable), style = MaterialTheme.typography.titleMedium) + Text(stringResource(Res.string.filter_enable), style = MaterialTheme.typography.titleMediumEmphasized) Text( stringResource(Res.string.filter_enable_summary), style = MaterialTheme.typography.bodySmall, @@ -137,7 +140,7 @@ private fun FilterEnableCard(enabled: Boolean, onToggle: (Boolean) -> Unit) { private fun FilterWordsInputCard(newWord: String, onNewWordChange: (String) -> Unit, onAddWord: () -> Unit) { Card(modifier = Modifier.fillMaxWidth()) { Column(modifier = Modifier.padding(16.dp)) { - Text(stringResource(Res.string.filter_words), style = MaterialTheme.typography.titleMedium) + Text(stringResource(Res.string.filter_words), style = MaterialTheme.typography.titleMediumEmphasized) Text( stringResource(Res.string.filter_words_summary), style = MaterialTheme.typography.bodySmall, diff --git a/feature/wifi-provision/src/commonMain/kotlin/org/meshtastic/feature/wifiprovision/ui/WifiProvisionScreen.kt b/feature/wifi-provision/src/commonMain/kotlin/org/meshtastic/feature/wifiprovision/ui/WifiProvisionScreen.kt index e824ddadf..0e89e4d9a 100644 --- a/feature/wifi-provision/src/commonMain/kotlin/org/meshtastic/feature/wifiprovision/ui/WifiProvisionScreen.kt +++ b/feature/wifi-provision/src/commonMain/kotlin/org/meshtastic/feature/wifiprovision/ui/WifiProvisionScreen.kt @@ -14,6 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ +@file:OptIn(ExperimentalMaterial3ExpressiveApi::class) @file:Suppress("TooManyFunctions", "LongMethod") package org.meshtastic.feature.wifiprovision.ui @@ -55,7 +56,7 @@ import androidx.compose.material3.FilledTonalButton import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.IconToggleButton -import androidx.compose.material3.LinearProgressIndicator +import androidx.compose.material3.LinearWavyProgressIndicator import androidx.compose.material3.ListItem import androidx.compose.material3.ListItemDefaults import androidx.compose.material3.LoadingIndicator @@ -200,7 +201,7 @@ fun WifiProvisionScreen( Column(modifier = Modifier.padding(padding).fillMaxSize().animateContentSize()) { // Indeterminate progress bar for active operations if (uiState.phase.isLoading) { - LinearProgressIndicator(modifier = Modifier.fillMaxWidth()) + LinearWavyProgressIndicator(modifier = Modifier.fillMaxWidth()) } else { Spacer(Modifier.height(4.dp)) } diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/core/AlertScreenshotTestsKt/ScreenshotComposableAlert_Dark_d19fbf1f_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/core/AlertScreenshotTestsKt/ScreenshotComposableAlert_Dark_d19fbf1f_0.png index 8a2f075a419a0acbf6c0b5a34dc1e77f2b920668..88a16d9e69b32dbd3f65ce00200a0ce9364dc2e3 100644 GIT binary patch literal 64527 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 literal 61795 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 Pp=ahMRtNKqTqFJq!VRqB literal 61966 zcmeFad03Oz);5k>#5zDHO_d?-u~w@<9IDKu)?;aFg|;eDfkZ{5iVy}vfRMzYN-au` zB1A=q%2C8fA_xQ$l0XroM2H9&AS7Wh1QJ3ZA@lHjPwaVrZ~Gp4zW;vL^?e_g*QI&p zz1CiPt@~bU@9p{T!^4&=T(Qu}$!WM-_PvooCE;oBQ#PLdFWS@_Hj5{}sxEMT|?5K{nu1=oL1%Eq1#l*Q`faBL> z?*b3-pT@G)$&N#cq-cH~9I(C*{vP;DwGcJ*fq&LV;K518OV_CjW%I(&j#p3C)ITe zMpwsYrwojKJO?~RQrQPPOHvkkguDeFHAWrH$@m8MggQ42y#PF(tf}4+ywu;^qSy%@ zIdN+B=go+LQRvwv;L*U!qx7F%8_S`;x`RiJVO>d65pG~p=7L9)6*Z{f#U8eg-(2Y| z`S^DM!*Neo&UsQI;0c~LHdVVd6o8Fe=5PK2Ja$sKAXLlIEBv#50uN4x^({q~h79kV z8|L<=DG$=m#sA*$TaKH5Z}`;qQ>8f$IqHsKuYx*WmpsiUO*^hTq3?JOU4qOD<4%8# zHt*-!^o~|e7ALr6ROo*R3qMurhl_;12c9#gRKFigjTu@6EcCDquVi=Jb#v&#TGzK^ zi|Rd6!`kHOPxC{;Gfs^_LfF;nh=$i=jUBlWzc=$(#MSCuU4U~Q!FU;IyyUeEyl>!A z`q{9)&yZDMCrw}Sa(v`KCuj0&+;;Xi1EYhESCw?PPhQslx&qXf{<4?DEC*`(+>tMn zrjGo#MEBBj-Q4{NHXXuoJ%5x2{HSv6PMX?1FuMJIPMw19kUW$!VWaAEj&Y46r%K-_ z-)Ln5D5~vNAB=N!V6=H2c$1Wrep2`o@t!^xw$OuZdSq?{Pc|B;F$4Ql@62@p4<_5H z7X?#2hqgKAg?{2Vwk1F_z6yGr^R@>b94Sr%ypHgPM{|tRr-sQW!kZ8OGNF&JdH;Cd z$DD5mMtAz*@9ji+Ii8$4Awc&n+M;@w0;(>~aVr#owf&QQpwnw==e#iJk(XqLg0r*5 zhWzw1-{2mXE%3kxfM*)z9mT-ctfqg43^lvtao*Usc1%M2#&PP)0q_nd4s*gru6F;f zZ)NC-fl2X{LHBW%+yA=jO*cGLNH~8I-~p2XV_K-<124UPA4JsI zSIp|d$!XRu{(F$m>S9(Gpm&}1oo}MeY#f=5ssA4un#C9YjSOdXF{=wOOw0o4Suz2d z!7ON;1&yB(t7{fV|csqt-69;w~^cNiSH9tH`ddD&8^yE&lXw#dVLW`DwstDv#4Me70jZ7SyV8K3T9EkZ2si`!kki4 zof@#aK)rPLcpfE_Kd<&I(O1hokkhxx9`;E$6fR@fT}sFhvO+VAPs8lWK{TKzf|)nU z?Lx{JnW7?7rchJA3QMfdxz=&+@sn|jyo+uIozj-!a9?4GHSQN2OQ`$bal?<2JW6yA z;^Hy{xFi&Q6ZlNs zf!@Uoi8&|-YN@0=RJLE5P%RhRx|7yBRx&5=6k8;QfM826%s+eb3}r9A6WlkTM`Je- z$0r}ei?iwkcn+?{ua3iH#Gf!ASWRDpE4rIDS7u)f)|CtVvq!fPS?2lRqUz*3g^5#F z%7Sf&6HXA5@hAR}WIVH}#)^$Xt{KIvEu#u|a2 zrQMN(xUEIR3}{<{7Hyrb~!%vK`AI>UM(LHVkC#+w!bxCllcx^~ap%fj)utd8r%J zJ}ISh>cP)OqxoC*ZTS|vDE?2~@?GYWO(i(vHHM^pReo-CDSw8C^XJd@X;FxdRDjl_-~v3 zl%MtGKcd)9cl#{@W!5J3ZWQ}H|C3^hyZ|FA3ZD-=Mf_>P@&vqt2&We*Hf(T<=_IVQ14xS_rN z;*e<0pKR&Aj5`%2HBWT=f%b4RVh=i#&x)uGH@K1iq{ADEu?S+jq6qwQV;M6}c>+kz z{8Rf{v3McdjUlyTsc6Rz1r$YLMVcBX#nqhYdG*J(MFwX%4E$Q=2fQ19YRPMYfyE6& zgU|YHCJkNvlR$Zn@xcnTIxf1ChU!xPXa@uNg<bs^yO#*kct!8_WHfvu}L%Ov^7{4uNUKLxsme#Jwu{r%&G zK3(|7V}H`Yc?j2dhk6E7c=99d=LLM>ALR~jkcTknu7Qr%Pk5>`fMd`U=ART`w5x$r z-5-NHO7!H$y^mR4`6s=(M&K2jB3-~?a{yMjv#a>={y#OXVQi;5+7sL=dx%JL1&afXNbjPbdcP9y@c5&Cc+?oc#(G_QxirPnZONxVs4)z&%BA?ig6ggFpJdAVU~& znnyhYZin*Fk0I8#b|Z)O{^|MlsK=mRv(lTDD4_7)u1+zU}ph4oVmRA*>5_Yu=*A(QNjQ_z6>WZmg-QTBiJmm?MtkPmfp2FDl+i?}=_%X;Y5a{0 z^_m`l23S#mf!jabjb$na$xz^R{;5}%)9kbor@9q0#cQE(oqaSSe12q@P{tIAx!TEd zehqjG_hDH3`%Vbz|3obHUOx?(>uh>1Ja~K%&R((i5n7w)gQb0zG59$;qEF;p}TlZm@1_Bx?u!CtPm(W;K0w_ydfY%B$9H?H++(SNr1sD zjPPvlG!10Ocv9g0a3WVcz!O;jOW2`Kg z@z>^DZJr-(E zQlUr)AAL<~;BfcFaAh%Srfss9qCHEsSWd$lhM$RI^=9^_kCJ>rsfYfP)EBW_OEVP; z(qQGBH>{LtPYqGOlA^@&Lnb*pUA_31q8#lByFUuSle@K(CRXMBktoK>vu>VB7@msA z&?sDlEfm0nqS4qtVl5-MiV1`JM3$f%gNy&7KlnzOmS0UVDCNZ!T7+Yx>@!q~*XuGf({HW*s0w31gKJ<}!hSLQ6t82p%x4 zvuK*Pd71N914{~tWSMkq9bohGn9#*Y(=vLRiRQ_lQJJlSOVAk>MXj(kGbkd8#uK*i zLiJJv3c|3ys-P-CK1#ar)(y4A4vHI72#K^^5Lo;3wR*PH@S?fY%T||9x5=ENaiU!D zFWMS#K-m?^d>=tjKQITLQKuE+wS$jBE!v3eHX&hnFo>&!dlK|=FI=6fRv7)t@Jp^r zrge!fnaN}x8GfM{P2Fx4`~>G|CUq)AYWYVu&sZL2A5t(|f~2OV?wVYXK@L+B7!5|O zJsAV%8&w!`>c$?5vAP-2Kh;jP)L)4JE(ijw{iR-h9vcj7;0%JndXKNdQOH$~f2MQ! zA(4g+RgX_!+sd-~DeykqOutcJ!xQZ&tf6}|S(7LwaCe+LwQ7sbe90nFZ`}o($h^}o z%4A+qnlMwBNY-WrXJWD*Wqt-nagqwBqzS&V9b9X8j*v6qLnWm(>4H(Yvhpy5W&`=A zp(ui&ep*wCXI`ru_hmr zMl^-Q2H0%~sqD4$7ZyY44!J70cqEG$b7RX3fD&Q3kPnYKr%#$v} z40F_LBwedJA7K^j;6$~{_Hy!ItC`{l6!?MgnH*YgmKsGkp=%x+swH!iFe+WD*IXVI zX}i0NG9OH2g{9rlPydn-@=;+1q**B4C*93g!!lF=C)4>4^Zko<38|IPODV*8vTOl-XY3*!`oR0&7oX z#$1#nRbDs`H4lc}XrMjToXCx<3ssH5{DWWLf~P$DNOKl7T|h0{7p;`n0X-z3UqSFS zDuTqi*GK*M2?%e}dXowwN!Mh3h|3n&p0qX|WKH{D*LMZxcR3(`9BuoCI;%x0| z&LQ1ACEOyXfcsWvF*{BTGfMQNo)ZP&_M!o@m0)sE^ zHtmmA6dx}Pi}jAUrO-jVr6SHS(k)t?R2h8ife@Aa2yZ`0?VKT9kX&0b^&CPY9Eg!@ zza@-`@C!`t*ST{sn4&Q2>)1$P@sUjIX<5hHY@4R2n`@?$DrnrEeT#p=vX%OL$og@- zL&Ke`vusBTxxAyKD|<`i+=d<7=-i$)$=;;YF&$Z>BR>5k6zl>ELv_Ya39Uc%a zjkhm=BtM!`%Juzf9{%kwqE5+9%YN9!whg69wvKqW3lEuAz*Qalcl0;hz-F0WfjH3Vc9|@t;~J7e_`3>X>&`EWa?CR4Y_LZlTNQ+ zIo5Qp5IOEW|FI^jUqZ;_{oH|0k4P)$@-?4dLgFex`$aQF4Ad(ls|P}uLR3t|R|exp zzYSeYHfJ&Wf5=z`TIBxzQF?C27u*{u_)3=87KAWNJ*9XNtu1%#69`RB_1+Rqhh;A( zlAPR;0F$+$2?oX3s$7|PZnm$X}YuAedt>^u4o}I z^w^t%w|>4#Z}CSW5u9#d2xJwH@_enKPK&sVaci+C&dQ* z3k8$er>)t`;Y8r>w}biOq3)WfaEqDKm2kb^n*tv=J|lFgkeyYV=P5O}FS5Z=a_Q7? zgmjwLt;=0!``G>l)-6)|01t#Q9p0IS>PQz%?BRs)G%n;fn1 z>s-lKhE5Zf@zGqIst`(iTpDT6-V3v76ih0{OVF8VbPNdMFvZ@Y=<|UYRb;S>GVkxC zQ>h_fBx*T|v&cUCn!l?vOI0Y_?3ab&M=drmTiP_HdF@}#=+6U5XU4yppC>yw!X{KU ztlLTtNk9aBG=bx~R3uqODa79t%ylV!LEF9QM>~|h{`|(uhBb%O@tL0I!Fc0ksY9W} zLe1QNvj3=4U|c{8j`Tra?6d5Xl;0C}cbCvxwn6nzyH#X*1^8ScgAk(fL4rEw|L>dD zqDfXsj%4mNzZVc{p8_hG_6N~zC+oVL_DfFJ2$APyn6+6H2UbGHV4L=VqPz=ZQ~1jd zl?AAdF6DRr0*2W@w0x`~J0@D8-mvLK1a6&V)d$l|=5?^6OYWxkEvoTFJBt!v!Whm} z3Dpv$67NnrCx9lW&qNa1Uu9;uopkr~FKl`#ik{qzvRurO8r$M`F46lSHhm<~*BUC4 z7X6d&@K@ouiV~SB8z*j? z1p8>_m}{2t=&0n0-?6l?^P;OqZl`2P>F?2A>{5sg3s4=DAr!~vKTbdy3cFQ>jJqlf z;#g+lDT(?}X2oSBs|PpW|GN_U7tgcp1g5d7MEcqIP~}-F3BM`Ze)7>@_{c1N8Up?h z*|zANlC#=({FiYpIO2)AW;tO@p)cDfxpOG<7~hA{ADHcT{t|WhJ1|@?6~VB8krIOu zUl5qb1t_rrtTjF9#^kbH^0etC?R;TN+xiz|B159zZ){r)$LT83|3Tdv=6kkNI#hOF zJhD@Gy(bk3q6oTO5xW}pG@~y~4U)Xes^G1xLsc_?#T6B5V1!D~#ZlWV#R?+GgcS}^|8~bGX_+Q;X&f<%? z#$2}wT1diwumN-?b35^;81GxRgzbBg+}j4Wze@EEgx?vEr8+bs{)UDf*y|l}(DZAN zBvY3H)jXu^kHJ+^J;AQ|dzNSidvsWqW!^-W%!96DwKP>I1)=OdzQ158KRzMiT7 zws^}q&PW0`1tWImC+xYQp9_){Zo@&0su03Swza!}Q5mdk;v$8e)ld-br}nGoz#lT{ ztnA^C99ZGnWGm=h-}I|?{R_H2+b4ALRD?(9@FqAG0|mx#gba*IwqG)KAt!sIoeihDX|`qDjD9eRs(usay!)$<@N007-4Uxgsd zfpfUJYB_x(Hswt|M1N>54@fC#@4RSd`n%1uf$(#v8vAfx@F1cD%$D%ofoWK%DYBDm zPGCf9ETXn)(>xk-CLmGs$eL{PG-M4ZTzXoHIr<{n=;rl>P1@g6Qv3STMG28Yp%yjy zvRk!`WIBtAiHYJrwO@kTdb<;0A3Eoe+2h>~Qt}~^(5TjxnM&bV%?f?4lrWe`O@P&A z+d*403#p=z;cI2wjMqmCKb~HKWy>90LrN7=Mp|Gp)wo#dvXv&R)#WJ%h$M~PH(B3S$ZP#BB}Fly#F9pO>nmTjoX7Bf*Cn#q7lBN z81A20mY<7e1b;%zR6dn4ih#j(Y?OH7G!H)bj7rM9F7tbdHTJ_|#2}=)C)H#Fxx@r^ zu$vV_$0-Nni4&DMjflz%i`Mf!Q=c6-n48&F#~Ct^uzG1|s&Cgmx-@ zIrcqtb7wa%pbZ2UOeRRONJ0_v`0^jvZ7qdi%c89YRLPc(1mE;}`nJC%KPV<^tLuJ1 zLF92aDIg{EroY`K>eeI$^5xTBh6cei!<9~Cu<5j{II$2rFvi>0e*sKz%xK5DO6%RJ zGU5?i;Cq|wEoJzTXDi)nk*jYOhV8nccW>s`1T$;_0#k7}9ObpMgS3Z_W<}sWc~Y<+ z`H#s|%G`&02})eRJVPo-u~J~cT;eOPtpOHfoq_@;1qZf$z+ar{9|7tAg`TV3_(Gt` z_9?+C)o!INGII-HO(+Z9EIVDK)4Dt#o5?wF3K0g>S8>FX>}Y<}{&wp-geJ{Gn_I?! z8*Kv1_Yz-lB*s?`TJ3CgK>X`{Fh@gied(10;jOhX9A$$L=o!j>t~hY1^y>S zvzBvnc33$|qq9x{#OAXe6D--cx4TOw_02w9jPkskJ8*{zcR86brX!~60pci|XzFOD z+xt30$L2wej}DSF+G5IaTEy?Swo?Ytg9ftK_`%6Gb9zT0F%_-dojHP zNOHnWJ4)@>0N|D%*Azl&5VWu)x?A0wohYp{L@r4_*UBe(+5VBf%-6p2)jpRzuu4}E z236M3@qEQ~cUdqXcG7=4-~>)w{hxC#bzi8TmF*wMXj+6!pRO#iG)SXj(n@d0x$Z)q z3*5-af!l}Sz&}YuEAats4h?o{-azXNQz+Q0p~gm@8+`g76c6)V7Lm7__zO$qN0fuJ z62OdvJ>Nilb!u3JCIW*>bt);}5@pANQ_kBirh?)|L+Jz^#q(l`qYjP`Itj^*bHMq> z|2|P+hRN;3$q48$BRo`6O0-Yq ztcJ@1au96u&Ky$qYiOiUaMi?$A#o8tFmKCcGRHi5r7Tnp#H-tZxX+Yn2LW(a^Lw#* z^B&Jx`eMzo&wqVq<(j--)(pMnUwV7UY3+5V`QPvUU@Q1%`yA(?D`O2KH?(fke5`3~ zd$*WfqR@>`u(z;iP+G)qw6X*YLf5IsW0&AWw$pyd24iC!!k43uknRmO4nQNHpm(rK zqPV&!-9F=X}gxc4jjUmI@akjI$J0!NI zmUucRDMb*%jb6?TFZQaj;(*jntO2muDR3sXL$n`NVNgNX=&4(7#4L3?ygo10K!Wxx zItyVB+j9M)C-Yju;OV-dktmKIlheM%Q;Azy>@Cvh)xcpOpv&^mu3~U)okN9D9B!TB zK1{`~)k>2)hVW2h&yZP(jtMsR5Gx*(#<`1*7E9`@+qZ<$UoG{}aW_egBc4QpiX2_( z59rXS1_PMGv3A0VX{GqisN{aEv>6Am_NsG)a62Iba0%tqO;G)?Y{8uL&$REwUSr@6 zPek;(S09Gn8n{}2BefXPFZoyLWxk4bRQ z{S89}^q9=&--qxlYT{wAtCs#u9+n#KVtu_b22c<*fxl{^5R*wPfn9{2#c&WEZ15)1^f32?SX(iP2YMxS`aAe3*W{I zB%iA_WfnMxvGtpf#$O9CKHZ#hUUjR!d6~y%d%uu#REGBPk;;p%taIXR8(H;aBiit^ zpHk)b)3eYon>M5c+*&S*Y?}HF!cK*~mO)sUwQF88TMvHwvznkTv9YcnAIcR*bF1>2 zd#39>)$%=x(aZ81`k?|0^mTVUm#_|1z3!tf`t5rAnTCN2WKZLc5#NP*iQ~DkKK^!- zIjZQa^m}Let4kj>e{X+DraWSVqE!W;vWPPiUYs>M7X)SO;ufevA()mC7=$bKhS~Y<1;&M-wK?&N?3E^ z>gnMfD7zVX>XH&whTP$KCtvC0FWCs&P?*UI8?j$uZ{4APcVXT&{@ZOmwF~p^#D`d( z^SH@`%oKUCLFM@)US13r2YqK;UKWi0JSk@D!=vXXM@xbF41F4^8a^>5$d*XR{eiDp z_9GQ#u0&#c8jxPifl9U10!-que0ll@0;=maxV+zQf=(rDt!QQuQ>EK*Ik`fJHt;QL zgI2o5T(sw%*GyMx-mB%bN3QeesPP0*m$IVM>DY6?0ul5;wQh90wl%A@c2QoUDwj3E zB&so21ljs^rIncdZK=IX(R^ttUsXD_w1H!l5qpCw4w^g^2>aq%Oa&<#vHYCo&h&jivU2IhJbnxIAJso*oX8*5f{(ct9?GRHxtJH{rScM^Q!V!$8jj z|GVM5XF4Yj^fmH_{08yLG-9jd<|@kqXWnz!&qt0IIrGxOEuwjXA{wlx8D?L)EbaNH ztG+BpZ70VbD^_y8Cc6+!q8}=MM17w2{O*>_q_C-mB(|=-L(8=3afm10-M5VV6ru@H z=IezUPnPrDx@#65^W^Kg1LRAQsnO*Fe*K1}3sawiN{$)NZH_)%9bW(8xu*!b4epg8 zE;Mhqw8XQsh{w-9#Beo7)^MjopvdKqb_=(CnCFA(A=oNBq7>Dq2YZ-LzRc_Gs+GF0 zR@Od0fGoS>apHcvC)Rqny7-v;>#H%x%c|Pyt8)d^{=7X;JWeQf#%N2wEs*uB{Ur6f z-hU1l#cF$X#)KAG1-~1f5;$5-4pbZoptau5@j3>rcZu>stTXVs=%?zle=_dSw3=??S0e*va(z|oM!sobI+#iCCa?O zo~}s~B~>wo<3^5Ly~TVw4tlZg)|1h!fu0tQ|94F(sv5ru60UDk2_s|jmXv;B`TZ}p zSPKZ^@+HmRBbC;+l>leskx?1lnA4$+L3l0hK6->-iD93N=9DLL{lZ@*1}q-IeExLn z*=Ij`E!`EyTS8VJ3Mxo!zY~*gVZ?X&vJrA+JIsd()_GWX6Zqe{oc|Dr{sX(=+M0l_ZVj0v@qbf$O?(9lfL6hH% z`pLE1q~i}fnt*gBLOj437e&iFF#8*mqs3c3=RMfPi1Z5ejX?MxUjw!8=X`T>1#;a0 zM$X27wo_}9_+Mkl4lc_3QMo_#E-j(TYKTcJtIDmfKED%A&#H|TgTV4C)AEfkWv&0Q z37}!f`sJqd-Ogdf z=n}r)XYYQCpYkMhz%WQmaTrmIKudzcvPCE_zc&N;$C&X+cWFcHRJ{O?nc^6T$I(FK zoQLxMsl>%@3m5OwyqHS75%GJ69qK&2k|8+bRvWQ&@BKwSu26)!eozzpwoI3h<{JS9 z84^7T+FJHH0shMH6-|A(uP~%3+qgV1c>h6!sC@j8uTSEz_I`X2L2*C908KMrgGKEN z-IHuJ^0*#8^p!^xA>Eg;ORooF79AkZY=QZe18Xo%_1KuymQxHlHSLAeT#H3dFVcLv z1)s#TWcrBB70_|p?V#YF@vU1=9sD*VsjlRV?*r_IB47X3T0_fSXPyrun@IdlMT#c; zBlr`pZ&E-s;cq`{J`)kpH=c{CR$mo*Mi!FF7e)I5c!X%|e2S=ehsfHX=*`0<2xYP1 zrlL+nVZ>4o4D-8CZgbYaDPoL?<;2@DqgmmqmU-+j^lJx(Y5?QomL0dM^Hu}7mU zUryLP{~{!+W_fxY*mcG zFK)rBTmr5!;v&`q)4i;ZnO)cuG$h&Ek&3NbQd4p-*lw2alMSjnt)cs zyXWkOl1{JmOh+BgfZrQX7#b4#ABUr;z^0h-zvS0AzfSRKVcp;;yGjb`Tjo~MjrCkrjwrAKEs_U9AEi? z$0qXo*DLdD2KKI)pU+IiD;Ht-wG>fpiLkST&}Yw5B)NdG0&LnHLZ(MaF85j1er)R+ zC|9GkD5J1B#nl(V&hErl9&MT$jRiLMg`(;w?iOrNW{*5V^%9>uU@D0YM3l-_f4PQI z~$STfk2IaFL|GD*OJxy#(@NhJnnj>iz46 zua0WE#PzpZ+k14UGhG4KKqf5>~ zwq`et!D9A>He?JjSu6gDMW(jcjo$w0HLxu{{@=!YkrFU5E^Ig$mwBJ{{q7gY&?7OU zfuPa8@qzn5A9%)OGr+6hoWtiUb5+%C^;alxk-1?-5-%QZ*q)C)QQnz)4&rC)mvd`3 z9=SiT1|%6zY_g)`=#%e%^A{s;sRt=o1I^`Hsk^}Vyxoxc{Dp(LRkwq)%F9YbKZMZD zUvi_v#NbeYb;BM(8m5Liq`_;}A3v1giepclX)lE>^>4?kiu640@DM-p$?E_WIF$JX z8+KsqL|b5k2MCyG`W7q~EBGne_G?jW;kjGvXrirRUFD> zTu)c+F3SX?uOC--**3NG#kzZLj@X=t^HmKw!WX{`t}Q6ou#L=-pWi*eE_8BAdG^iU zx9-O8BAED6+6550JQZd&FOlwFzG=5wmxbyATt_bXIPs$XQUiC|Rmi-|k#d;->!YgCeUbT(KbCJst2UW0=)K+_4;Lq7&Sfy^!R9cCJQ7XLT9M;>yxrbQ{ zBrWv{I8u(pRwM-I=@k8q8q3}OjA86oXLrUF9S|ot{MNrrAa1@^P9ePNJER6@i>o`d zK1*Mw^*g}sNOWI|d`}YZN9=)Tsdp9we)k$|w+$5+J_E5!4O_u}=&`HpLAEY|@!-O` zJw4GG9XJDz19EZtg*ktPW56hKZ+-TYMW_wtL;Fy7;pR#zgpoaL!EwKPMSeC2F{UaR zgojnMorxNU(c4BRP#0VozBRD5SEAER1*K{FT_Kcc>A^1NRmx?#%|c7L31*Q2 ziH<=G-+{s7r~TX(I^E$+yYWhNRcXuAIDn_GMI|yIHkCrWqLt~uKev<0O&4~RaN+uZ zGIoagw_lfr((U~S#1pu668hCCdV^KnE)M#HL%2u_I@DlXMfdWd;|<^nUQsKv_53@n zzayeLAEC3hFC5LDe92A-?9Wmb=SIX}RQJ5sViqC_zOLs~sZ`T)OcMHym5I~6F>I1q zT1_I1KgwMPpE_G$5T#KJmkUY{=qd8~&SB-H`R6Ea-?1M_R5DARYr;3__EknBg@OAJ zhv#@i%m|IgpY2V)63DQug5leKvTjv8JsFI$J^Vc)7Yu$j$7ku^z{24s17L{((+*X% zW~Qo^1=7za+DLn37D$m|`jdwl2ru~VgTvLlZDFBX_I$)1*F=m12IlF~@k6L=O}_9! zaBY{$H|=kyaMn2_$e7RRnCS{P1~!wU}tq_4UTj}=J-L+k$O*oyk>U} z24!vMFN+|K7}2k!_ib4YhI`T7Yt;|j10z{k){#p@R5YfWtPkJ*RJdO;X((4N^4`;P zA7xJSyhC&TzNvEJ!>O|{tJcni?oPgvsLl;sGH^Q={;;Y946Q#xR@x@RLLXJ33)fC} z(FZX44YVJHYxiNiqF*skik^N z=Keek_Kukm=q$gm2}qI!6f*sPis7vmZUR|+X%~m3=tLoJm>+D4v?I$qNyl&q(-o4l z|H7HNedP5n)Jrar$1aW9`RZd0DWo>bRX=qCB;)OihyzpaoZxxFdo4J(P-9NP2G(x6 ziDU6X_7f}=6qdT+Soxxi$fx^~7$Po^AKRBCl0YzFxr1rc+zlgFcYl1(J~A3$owWBx zCnra#FQ#rh&iD2|$DgoI%_|kAzbMAv9S0p}ny<>Ny&vwpJXG+?8O^wbjF@1V)gCU% zT{EG_B~D=#dy<_RedA_`*DIXzuAiQFvh;H1`O4>_kd212@g@7KNZ%(vj}HII$^Y0w zSEsyhXL7T12JU_4@8rLBCJoI$S$cQCY2e;W0O5c4K@4s%B3qM-b7UVu+VXJSj301v zx=Ni1{)4OTpYNHmxlT?aYiG*if$Q12KDOhW=(sUJPFDxD6{X6^u|^@#r$ z#Yju7AI_tAhfY0%P1KL{xkna0s&}MPT4adqV^VP6k(9XS`OnUqv%#7nB7t!J3bKx zH@Dbpy$w>Js9*y)eOX;LuF-kqHV4y7dy;Ns+<)rHi6@vc8U-8DQm+QQ)p&m8=#={4X-6*>>(;10-AU$gmo*|J04A&b)(gx7vf9pv+k_nPf>3n4xR$fHYA6 zYe&I`v0`%chOFmB(!kIavBfMfF+REhZXFba@rj!JoMl8?wS3%%3Pb_L$~98E-YraN zQlSAZ2<8^%sd_*E+#?;D$W${DJB4WtiROm9W2}^+fJ=+=nh9RVoA0JAIH{Xyz=Zgb zLiMOzzyK?$1h!8)()!Eu?IXSMd7R+Ly6fgWG(rqAkJ#545f#K~Eij*@@2T?8^Q%C` zZ&|V=M;sQHkLM;9aY}|&>jla+weG9EoOwM5N8WLw&iJ`77{E$1a2IeKHGzGhS5O{g z4(Q+4#pXz|2Jcv61wnvn9p4Yr1LK2YJ;M{f|H*$mG;r;kFZ>;kyixaoN9@Qujg`-4 z@E6k_G3ln&;M*O5D6-HE???jhIODR24^~1gMtS5D*ARI}g<1pDG~O>~(a4s?Y`iOX=CF)}A{k z>riEfS;^1HGj-Dm3~)0eZXMnCJ4SSRTaDj1VA&2K9;l|RjV$CRF~@N0lp*&9?gce< zX^8?HybAmGZ#)mC_R1(dtdk06XS^#l+WOtUX$cuy4=xr}mQs9|ggT`BEY@!9UvFbWmp&CYGDt6>zIZ927 z30?Qo6vr+5xcYNypl+@3(tdiG42--I9I87s(>82*ZG#$(Lrl7)A;UNbr(IB0j%oW2 zv$~_BeCYXhLbyaVcnMrht|L}lke*vRkH#Go z<&sdQvusszlRFHVJy5j{g2H86elNMvA1PJVfiqlG_SAJHV6C4rW+}dAnLX-3N;v`8 z260ECoWs<1|8eth_t_Y5#-A` zP84-HuM~vJPlF^d!lsO;XO~0G134viLE++s{^YWS2l!KRYjaU#Avy9V|3Z9MpJB%y zjW^kW3iV#USCIg)&?HY=Mq!(o1-ivGNI{^ZR1}&*9p23d=S)wj{P%?J?48a`tP-D7 z0}GFf2mm^vs4I=w-5b$gl~o*HVm|#tX7Ypk4fhs(BA0%HDJz!(b}k5?tEsB!t=up5 zlY!rqha&F3@UV+2mwE7*a92y__h%<3rRavKpmjE7gc?Fr4T{XXV zjlW~v190SOUaZdm%fs}3_k2=RS?jrI;lag=^2i+Pjh0328NIF2z4B(L>A6Jro#M*} z^~a0p(G2@C_Ug1IaCP9nYEKVv#b+e^UG&xXF+NJVD4^bsQLHHoWPT#7EC*xBr=moo zo&E*8%>dNaKEp!Y7<^XK@!NTapJF^BJ#9ZSTG}ztf0hu}^-mlMLVWXMSf(uYRlx9b zuDi`p`GJS12byCGzW3Xqy@iOQ`AQGwFqr6gwJR)R2^k%j(^@Oxfu&Q|fxrJ_223nNsi#8<-# zGGA7OVLbDgPx`$GHcv~2U?rJS3GAPktJoOGYp?{SZj>kQZ3Yu+JJAH81eOoC^wJ@u zP%{N5usKRf*w3G*erE&ttghhUD{^%R5ZGk`Csr_8z&+!d+0Df{s3+6~`>?N{Px<=) z%V#_U(|RlY73*zT*(%<`kQ$U0pX_keH7I6Eikj`FQt{UQQ-U9R ze>>4SjF%Kd#U>FtK>wqdq_#N!F& zO%)7DeTLKmuhoy{NlwQ`SxV*Fo2_Em)xa++Fe`Y;$3vujWz90sD{MuU2#`7P| zgksY+V^(~FKjlH#fFhitb?z=a#X6lyWB9J|v(69SGRK+d_XC?{4KtoBH2Sd@3Gd7^Zu9)FI_ z9N}-xF$i@F&RM1khyZC_Z0o0VIk>8)bEtlbpW1%$PT>B-0kn}9+uS_u4YsOh+ODMtbvu)|wt=88y2s+))Y6EdJ}};u zM6~?6rTI23&*Pq|WVqFjlgS%JlR-^EEU}$}Gv=t~l!{&c=fZy3{ml)&-?eR`Y$!SA zc+kvzX0-l(ZqE|#JH9X^V>iH#jx1ZSnB4s?lplwwZc5&_bOk?-ICW*0t2LGN&E9oI zgnh`?ft2r?s-_(^QhU$uD6nY7G7krXU&hUREk!(8yo8kcnT~%bZ~6Vs#KKr*|70{_ zBg6x9n7>sf_%Q}JP}iOfC+|c?6om0*WjC_2(%`Q!EAC(2pNE1(`&Ir?HNGrst1S+* zdwVG1r@9E`6((5O8jLAb?0>sH`(7UB!z3;y?4truBL{EN1Z@~g`kFskBrl)-_uYPmXWQsWpZAvU<{;!dA^_I_Y3NLJGXpISL`w4_x^% zzSQP3Is9{|3FSY=2df4XZ7;2Visl3I5gYiNuy@G{0Td-Kq4wS8Fu{hQykB z&LqL3w!EDnTaPN_SH4AJwr}&5c7dS*G-I%ub$S?zDjV1vUk4M~ZU^eJ2-e}%zp{Sh zGKGZ1<@Svz#cyX!*s||J=y!J3ifW~RNb;#}-$w7--^NToqU}p_)Y({hTjxJZq<(pe z7W+e3Mfdg~2Y|+<9S{smv#N5zT3TB1h@Z8{AT~_44tIi6BVxu$AS38XN9DD3V!a4P zQYogpH0(0$q*|ptA5?T(?{j12xSl;1vvZKpFk17716J zCOBgOBFh#n&LzF+SzA>@+d#^Py0aPeUd~}SXkwKbw=j>{+^X4t+0Yans>?bjB#r4B z=K)O3AEjjVe2M{=$-Jq*DIQ#|rty+N($}EL&fC6}hB+)?vi{-mI^zQmOy6&l=*W8l zURmN&k2sNK_#wrmITtf>bnTuGyvgj>cj)^v$6t1N^tD*(j^qB)R>hOc(lN@%W`=ob zq6sZT5tXg6t&{CueC@RyND4Lgr;*rmjxKzNDr77VcHP!gX$tK-EH!-Kfii1^2I!{X zza2fQ(Dk3ts!C-cuh@m3?Ghv$%~#c`41h1=o29quHr{GqPJMU`PkxiN%i{@zUQdV< z>$0SpS6EnRa&Li!+vi3P*_{{GbP2mBa5QP_Hj%e~VQtMDOtn2jTzMpbBT3`OK^9LO z%NOEST))1J1v=lv#J_aDtkEI2apD{n7-{-~#?v#ee`9;OFDFeN`z`)$l>L~_+6iP2 zGR&(I>S=Gv*ncIV13=n%HwYvA$ifJA$>QreW+7yLe-|_NlkjU<$Q@v;N#p_~-j;em zPV#lk2Qo;SbvJT|^scdFjIb=b|E{9;VY6<}JGK^>SJZMu9&fXMYLNVYwRf#yOe!lk6qusch{tEaLd7k3YVfj zz>h?A?c{2=R_#vk96b@vai{f=jw(L$eH)8SYWW}PM&Ir0ApN=u=eCE>CYIdrObWH) z$irt}J7&_aK3eyW7w6;?&p;p0X|tJU0v6vDqd_y*_KuTznd2S>@jemKPH;+LkW0Z1w1WWlmHr>ABl*O9_0d93H$6ORS z2#&D|kCQ|xI-5-`4-URE>3%jjbJ0>OCf!~RWiEK)2vu*|f{UPfzoy-)HYss( z@lkrY*k+t2-etM%{R=S5kdr>|^ZQd9?+n}6@5|t= z)lP`594()`{Z`x7aX2+U;DWlrlFxJFX&4oUbB|HGZ5sMqe`97~S zA;yj@NW8mWJpcOqJmb2hLrulmU~)7uU|wQqe&oe#!6X6047Xm7OY7@sg|>a=$5THm zCLR0aCQ&C<5MeXpp?H#NKimjGZ{+X2k7N}yU=7X!_X1_u76S3Z_Jz-kp6m|Y&4u(o zJ1(yd`ZSTTqPOr0HzS78_nc5C2GPyP^Ond`(%)ppJ%xu-F$LmiKs{lgqC^A_g5K)KGucO zpnb)wE55F6cyPREq7IxZv@k|HbP#8O*5FRmyQcekg0kR+ls2zwJjt;JOueJd6T{(929C8H^vw* zGuGqud=)PPP0~+OC()N}?KHe%t=1SF*r7 ztqZq-lL9qZqG20lD|@b0yh+GXR#1eU&iI>)Anb6pc9HqR=#GeJhw5$nhpR#UXP0ZO5e3I zRZ@X`6Praob(!9i_O`}YM97tkCf20Atuang&0I5IwmMmHq^*TnmqI%Q$e6tDIMM9T z9B)@4fu%i3Y{wn<)Bm7Lofm{mF<>_DxGwWqGp zup{@QwWC8$xAC3KgoTw4O*o z;e>0eH7TFk(v)?`L#l4~#RWpr{ZP=PCuH~E12hPq#qD`55eMOhtIJ{BDK8G80iy~| ztP|`cy1x{7YOh@d45rXUqYldM3A6?oCbi79y3P*&8<}P~-KdA~V@_BZ@v~bj2A|%x z(^Jr^5Tz3h3RUUE$Q{mw6!78Ay(mxe;PVKJ6@}B4uy8Ijm z+bn0%ZDpOL_aWPrJB!>+~*&VQwU-I5C7O=lPJY3>NM|bKAsD$1p^6)Hw*Y8YJ zWD&~-!c<_tlVxp_Fi2-B+dy6(DCSn7)Or`c2kdeFvfLiWGNdJSkH~Z&Kp~GP2%7#r zroTZ{5&lU>6hEhas==RMm`lE?!NqrW+k|_l{BELpf4NiN-N1HJr4A1N=+3_%^RYsy zBadk#w4>zWY1XNRh07RapxEJasXSx6(ceXMKB`GE|LM`c+53b+OZ3jQXu*cP#7a&E z!f@;<$mey+K#FNucHuf|@F@*Vd_cDM8Dk+CRkSVP{YP7tOYyD-6@>MPw5j?CzOsb< zdbpL@z2aXGDiGS-vkF6&`rp*qeg@8 zb)+u0zTO9kbWLhk6oE7Xv0B6fGz;BJ-OFXY_bv{d>)V_xsD4aS+`~`%Z{<)zqG^# z7d)2~t>L<@dh-D|LjJ$A{0!R$Y#WQLRH*qCre?g$lZS2Nk7FCUP$fbCE5Ix2axq&< zIT{C5>{Ce{5K+mw({L%g<%81}v1g$dYL87@irPw*Qg@_2bn(jaqbGZp7VgOh2L%jg z6gVxVP9f2=uPHx6F=U_KTq74bxuh2o9EDTxt3<--$sWoQ4#fCQzYqnl613qbrfBU7 zo;tFGhZfZ4W`dfR#Hzfo0nmdS#NPX|-kh-gpIYhGZwl&`Hd8(Tx8s;1C_nEp$p1o( zfBvk|5d7l3%rC}hY4&5JK6G!*X%~GSwK7|c?Dk0bR>wm?#|BK^fuz`zCTat}DIQLy z=N`KV&XkDnZbf34aZ4opnc&_VkC-mqK!RGYsE6ZNtex(xoKgeb=~ECo-K6TMU1o+H z+s6SF;Mu7UskZ|_d(1oSrXIaXUZssr;M$%tZI)kq<@=UV zr43fgB?BfPlx%RzcUI$!o*a!k+QXdu7K}0RBht-aN;{?I-Htm=O@^e}FOT#o5U_M} zt*+_f469Fa89fo%i~zNPK3+7qyQeJP9-G25PYUZetv1p5(AJ!KG@xX$=_K%4!C)>K zSw8V0(H!;p;=!4g*EdDXa8&5o8$iyy$@Ny&v3QGUj#?+6=9Xenc0(@d2OvTn$t#&` zHkysHR#)P-r#t;vQiYM;CLm;x%`;8HjU>F=>bc%5a5%~2Vv`e4;NiOkN3n@@Urnn| z6CF^!*$X=AFOQpRe|<=K1CY=$))c(jE%1|@1LJsY?dJC6OO z&fv`Ll^(F8iF|82k&xGJ2dv00bt3GV1`NH&xL>xiUat3+_?#$l7B|`5&O1(Bkn`aq9o5ti>p=v8IMWQF^=z zqTeB{8^IK_GYeu>m;^LZ;wAms5hN3%AH(}9Z>azGGz)>2Tw`NSlWrmZ5bg`219(tCC9K%M|eLxLXvkPEy zD~|EhObL8rx(8h2sV*_^uPlz4!aT9L&6^Nx8q6R zNDG4q7-+rI3I=0HI6%Sy5)P1XfLuK0;t#NcRN3qgJP#6eD^1_1=#q^$?ihtuuFjOn z?3nDib!H12Rzs*Bf59)}i6W=hqgn3^9&+Na0IUaiJ-~JW`v=%h!r=f8i!eNZVG;}% zVN?vGVi*;}s2E1YFe-*oF^q~~R1BkH7!|{)7)He~Duz)pjEZ4Y45MNg6~m|)M#V5H zhEXw$ieXd?qhc5p!>AZW#V{&{Q8A2)|3Ij??1?A$fv?85A8R197yLLK9;QMY;!z!o z2Y2E=SbeS_40JHN%4G+GBA#wJ_G;TIa3aA9k5(4BsT(u4I$pNsGSvEilIVxIC`U5O z?^_+{1D{u%=;kB37g~Kye~SGG>a>T4fOP?{i~n>R`75Ds=JP<(M$5Se1`E(>9DS-* zltv&qR!Q;!8y=S>>+3J(;uLO5OwqEa8w(R1v!w0`{i}9cA zJ`(zQ*Dnq(t;g}_R5=gd{ovuMbI@yE&wqLL`CdI2x&2Fut_z{SO?m+NNY^OidzG)+%eR5;u2S()g+ zLGzx^xvCS(9UG^V`AS7n5@B4h(AU+Gk1PNgrFP=7x1N_jN0_`<4e{ z!UxAbeFt3o6YEd4XNP~FZ}%R!YVbLCJ?1dFnfR_F;(c&ET~U6-cBAEd)5I}wwTx0J zxiRlKIA(ZtEw~!oevb6x$lN2tn|k1?!SPk-jI$0H%Ddody08Lf`=P$_(}gGP*`L0d zpcA^8ydsf}S8oIN=Nij(>QcerHd)Sp4X&3>t@51Og4k*q`y;rx=-9i_KgVwP*t?E8 z3qvW0z83gq;P*5yzZv+9!=;?-nt4>8M`i$wO~PgwNwb>g%McH?4JGR?ccjjKhnV-K zDkYjxPG<$_#1u+?c67RwV}bTC{21Ju3ol=9OY|Gsq5eQ$IlR68MXrtp3q^JB+Wk`> zC)Mo=oBiUJJ-D;1K^^3nQSMwfGT!ha&iTzS&pT(7yS`GdNW{(k;y;&cunD|3m>hl8 zv3I9`DG<_ZvVo?PlkJr0@6ZnQhX==AYnsaLXq)~;a&s%dOY)0>MlA;`diDHYhR&S* z&lx?8j?>Yz#3{v|n&-F1iqyxa)^&u=xDAduDKZ! zw#02i2UaB7f3CS!1{ua2vUzfSwLTVD%CbS)3#a09*XL$04X49!3myN=mjqU<5AOYx z^8Mi0F$?U&V=x2FFJ~?=5xr~nPklrH&;@8-HS|O(f2%*)ZZLCfxufCPm+2aSF_;1A zt>`O<(NFT;*T-6cI}O|yS?ce|jlbCqJzkYaSLs zuKi-_BQ|z$47vi`jH%~OX%8qLEx-TATMJ?+o?ub5CQwjY1*w%22Tr~;cwLw!E|?`_a;} z!qT$B(z3!*`FLqB%EHE?r3`T?LtM%bmomivi!;P&>f`__z0my>e+nVW-u%&y_e00u zd+(>+@4tN1_~XdK%{h(6r*A#nymtSOZa*|Wd}0>;;^B*v5aT=D@GGa|?zHc);$p6e z&w3m}Ng|ovkshty?iCVT5wysB&#V`b?$&BIq3XyF1iLW5_T*1}R3mqdzLGZihDSb6 zMWYY$RVf3%?)YP)<^>MRAejseu=w%W9~&M0YN{MZ_|83Ry-VMKywuDRHcNW5WDHA= zV#$dvMTUheWGQMcF^VOcv_v77==GbAqn2`prF?2B*IY`Vmx>DuAHyzHO#ZK^n6$hM zNcW>yV&?8Qc_rB*W~N=4zIS6@K8m}3cW%1rinC>T%<}^Vm6rUuTbrozU$2|txR;E~ zR1AR%d~dBUrZX!!f&Id=P}%J&#iS2zr5SWhI^hO`*?e6GRy|V|p;CP4pyd^5bw?oe z!Qrf&br2^zWkHibNrSRDhGGQ`G&qN+Gg~-;-1at0^l;#~aBr0AZmVMCuUU6ki`AYV zQ+6rUc7s1n7zTsS+vRlTD^4I!xVLi99Hzxc^~LXj(*n9-mua?ICBCp%wbS=$rcO4> z$)+m?mB0RyJ>)y!JMtIz6qBlHSA&w7GK>nte6dq1`MF=Yll;vQ$@`bCR7AgU z(1keJUx*ba?O3)fY}Odso=%t&aj}VJT0<{*@HmO`WBAasJP-Ak;8+7k(t2m>sPMUI zhYqG%e_I41>FEHWRImI@(myOum~i+E9Xnb1gyFZ~>+kMx;k~_eBD#yQcGux;HC%{6 zSpNYcUI7j{fHRjT+JwWGkC>grYNIn)cOJ}ilo9l6#d>Rh}M9yQJp>9-5P!KQ2z|x3*MFaI+<&m-@9JFpucZ>gfwq*OMAvo0F;(#&rYwRo8b)vFS_4Kd$bCT0$DY`ph_!)S~-AbO!b+`GcK3xm3 z@3W*2A9p}C2SE^{`6yjC^iTC#)yPKrU3}x!4yZMF1I6$?&!N zKtpl6^hSPw+|LBjHG6UR39y-yY9;@Q!Nl$}(!*MgbGP#G zXFz9?BR!v|`^S1!c%CTKlF2o{@TSzb^-h==anc%1rzU;B1*i1yF3=v;V~q_?7;Xe} zzY@{ACD4<6wd0u6hDmyYaHNbNQ%Y4(zr zO~7JG=C6a!P7b6@9p8VHzqMJ*bc#cawprKDJ8ItW%fgJspYQt8Obg?Xn!(F!hVKr|TiXclxa+eYND^7nmItDoz4ZYIt#f zk>|%kO~Jt)`cwU37xrmQ_&-! z<%F3EcO`~vNy4oz7GP)Tky;ojfTho? z%cM)R)$nye8I!mUc!P$LqTqY|j={UN;9slJQtL4d0JWu8BMeI_w1n4>2hC>emcITM zp}x6a5eLBqSKNB2)#IQ_Bb9=zNWQGY>3-T@z1Jl<0(4XsJ(l9=W^=<^OO1hpuzg@X z2%bmIpmppX^d5eth0_V!K}(CxK+8sX0BX0X&(CYgdoQvlAl>si==x+ReLubaiQ8XW zr?uG4|4wsT_14F!+PNqgc%(dvQc_ixBch>c~s(59asIqjm530|G1@l|8toZxC`&!%Q%T^r& zA!gn8i@CL8sQuhMXEVwLuEllCd>PCSGk8E<9K$OVc-0LxTbO2Jr`G7^5l}d>d7{U= zt9WO7Q1yHngjnQvm5m>2&rfpikL^R}2fYLM@4xzSUxOb{;xS?Z#dGc4z&w3GYRU?i zuiDh5co9iVLVop;KG3YNTUuZ_aV=D+vktFnC@l4n4 zhQ`|QtS&>vv?`&>qK%ed?XjH3#?H2PsB?!}91XHa`0oe|K@g0hDtt!Cg`E zZcN)TQr%2KhnV->;K>0~8`5~TK#2(-d*$en#NK&n`QYHlVu4W(?>X5UGHA(fyuJyE zmHBjtHgTN2g!56K197Egbrsg}>0#zjphZ_R2@?V zHdRruFtNVPzej@jfj$B)XL~UH`c)Q&`9%Ydbk#DLnSB(^PY*8?4$D=MgQ@pC5BaS& zLDWnQ=m~_sB=r^5uhT~>WzrNi7C{mF#X&IRyf_4&YZNEP&9gUA=f!H(6nFZ84Yg** z$~U^{JVm!M0;sf^O4w|nlBjh!@O0*D3PHgbB1;t)W;#d%Wiv&eP}NWJ+>`t&uBc*z z9c5}q9CQ<;{&htMzH)p@p!iyB+gD+DY1o+{{iO+tnK%+h!Yi-G8M4soW|3NsK6{Ccn*)qHM3VB)hGPOeirNqdGlr_*EjdWIU{@7oe5N|WLMZ^7nhoPoe;|( z%I&I;n#mHV%I7V2bL1nv+`5Oc6c>)1cg0ZkYDfiBqQxa?I}c3Oa;XKeMFZAPNi?V3 zYxH+~n~Dw{!TYC}%SZBT%VLYBx)}}O!$F}vo4aNGjFfOyX*#tsHajigQ+S?g#2Mym zCymx0k#<^VnV&qmxTQ#}!&0geTDfMbnRcXmmn4NdKUyUqW(SdhuWG~Hs-I{mVH5DR zDhCLxA1xpexdS(xF~Ybw$834VL`@a1Uj*^OOdlZhS3?ilOQTb1=|9|J*1N7!iZ{Rb zK%e91N+;)y;5}2SLhWBaaV2tjJ#h^)@qzY;?H(hMp$|jXaEQY8 zEz3c&_^+Hdebv@(L-aPwZ1lj9e6AUt(I)CmvtTJC3G9Ph(c~+dy-L=!JPBG8t12wm z6Q=)!OMT?4R_WmG#}>K3YUJd&TL#f*#o@6A(w~UBQq`D6hbX}qGKGJ&BHhCfPF^SE zmFU%ryj3aN)#PJUEJ^l+EY@S2C7p13Br?HxSm{opfVMCE~BJs=p_{`~_ z%gi3ydoaJj+eO1|xKUm$yYTtN?Q&CqLY)+ANX#}$l^>WKkr(TRNNmFX)P{YF`}LBn z#&SK*=p|Wy(=igYqBh!ugn!(ZPYaz_=&DdNmvvQ5X^;mL{=D9P+(jlWco)g^8SOXV zU#=(=aRJh=chVCaVCZ(AO}c)XfN%Um~q%LAi%QO zkZe^v*DMh|eeW5ZUL5;4lf}{x0ilmeOzMbu4oe#7Z9~}sGLVKV3Me+f|Gu+BWLB2n zFq7-U^0K4l3hgAFKI}3}%!|~HVY<5L;{*8lGPR3cXnVB(v*a`f>Ofr_{Tn=@kg;XC z$6GY2Z_Ck~HY>r<1B>duHW5^OCx}Q3*+u&B8Lxe39)Uc2T_s?N$|mN46Aph)z;A&t zaBFa)Oa!U9&4Z4(nm!2zP>VC+_!$dJ9Ay1P^H=gbyYeF2s4+7=JE%7x)JrTr zxlVt!3%;=u?ax?yN_6KKr#W3#$0+zL%y#CmGi+Y)HEIW_68QVuec=}?Gc>KwYl7fp zq_`ubnB(G%H1}1BS5z$T^t~$!JQg?NN}G&B7@?t{AiJuXXTmNj8lab+s=sw9TKJgh zjhSgfxG`NcY{sq2@LbiU;a{O@;Y2*?y{A&84^W2x%v! zVnn}>o%75%6IW473FrVF0msRSe}|a5xT$1)n41+dpchKaj%*hdq0dEOV>=0TzsCBy z;D$51B>I%Gn+a4qCU@6z6O!G_(06Ip7!`-gq@}Q<)1jxH2BE*-@Qk}l6D&Nsa!E>& zlt@zo2J*V!!Jrq+`5k@rkQhcf0ns+1JfF$MaPac73&%IHAjFWhCq= zargbYW8tWdZ~fV>{w{9(_GG4~;`M&E*Mk!QgD0*F3ZpFH4HJu|zH+$Hm2)<9pP$pH zJ#E~+@_|g(H1^X`c$|^1_|-)3lrf%0V7jMx8jVzBMz6Q*d@W*6>^{I~)f3fD#q{oD zKFTJ>hzbSyMaQ6u7bHMwa0W=0xNxF|p0HI^TfPpK#i(*BpzGx;hz` zItS~B4B16R+41hGE*eYuPidQAb3;(iuF$RyXKb_>1@^LF#Xs@%^YTqg!=YNDy1IY7Hzg^6oc(t@p^*dbQIR5?R?GcV1N8?1Mek92of;9 zFVOpbj}8{wx%)(oX)ouqvOIRG!&TGRb`9ue#ag-o=0A6N*NP>l_6B8#6sN zT6S{KykD7{i!I)QXYiMW$5C-l_LK_Y5K*HJK0h{bXo#l5MNK)Su=7VF)6$=FqcRUI zr`2Lq#B$rP+3TS-FHYMR8BRle&O{utKpW_Pwdfm8#$NjuQ> z(##K&`j>xU$ImAcxx2rwei~E-B1MTA+h-N_-vYLgZug1*^zYP%_Gg`I-Z^dWDO-EN zzsl869)m^v6D?3iMGfS>LCooHjBtw{K6DnaiO89jKtJkCCVRUb7lrr7PM)?oAcZ3C z&XGFcaWLgP9%4VE13Td>RiuYt*2%ivEw@q)7=R1cH@F1vyAv0&mmVNRb{`uww)nV} zmZ~--=~Z+P9;YJrKI3UZ+<#->7Id9npyq`gwB8~CR;}9+nU>j~ntn>q>|rrvvVA91 z^~bpPa0X2L=Y~AZSmNxY;CR-ayFye|kj;Ur7^NP|!)|}7dN=1c)ABQ;52CbQO=WiOmN9$_DAH^`aal#Dcevoz3UT#S`M8Hh#K(FNPZm6`{dtB zK9zlRRA<0P)(N%nHZ{5n)3M7K@SLQ zr&KjWno&}yZK%4C#9m=tOl35i3&uK0r?ye4Ub=$ z$hH}uoiJ}=*U1I>L5``&GjuKl5q_sDB*6U=e1KB5ZX*62u$HqZX(Des$_Y8e(0L}C z8_I`vvyM54WI~jrw}uNljx}idZtz4N6Ysjk0r2uw`~CB?lLiV|&yVdWHI=*GNE6ni zf9j!f%kBTkoPfL?rHGwu4rK|HsTwRnnEaQe#uP4-OFh1H4lIx6ha{boicz~D5&@Xx_fjV&%H zTDTN%yR)}HCen!!!c=P{t3qtdUpo*$$J*Pguj2Ew5jJ$}Ci>3|Za=*iYZo1~ky}x> zZ_-0bGNuzC`lzWN2aUt`8oB~EsY&pEu*1JV^ZHJ21n^O-Bs>7$TNnay^HEOrI;rwE zoX_K-S{~wI5u#>R2z{6hC+*f-yZsV8%U*r|!xwcp*BZxfWdepxuSN9*Cq z#~qOy0$N5Y&>^3P6|{5Jbv%D>tbxO7JyNW=Rqw@ThGi}OD-yS-o|^w9z5eXXJstIM zbDz&Bt(Q(jc&j$$HCbcrJWjcDD-^4L_Yf>Qo^qmQ3mJ^@Mz$>DzQXIUzfFE!@8<;S zhjVqICdBvk9fzfz{vZSi-jWczUwPD@peD2BUSiv(1X53r&Ql*{+DsWi?Hx7XueVyi z3HVCJ%3zfAr@G2O=(~=wz)|}5V;ECM5NF8a=elh3VkeV3Ie?82tw|23qq5ytdrucu zZn^K?t(G?nS(O)h$QAK(%~d#GJ2j}R9Mc%|N0v8pl;|M$zz@6i-co|#oQxe`ODfFH zGtL=)otN$7M{V&y_;?Q;_OI#!Dh`MTgRfI;<%^v7cn)>(&b zV9pKmDltYGLPFMT@m?a&qVRDS+}#7~A6MwV+9l;nFP6)8wPQWxQ_-nN%rmYDJz>45cY#Ny)?1RA`q;8d6IMRnFzK;3iB40ON+$29 zuo34NB9ukP3X$(xzbyTT+77Y?whu4j?eV&P^HGpZ@9Pk4E2T?nI-%E(XiV28-o|y3!i9>+B_o+t@bkNM`HpG#NzLMa7NUrfc@TG44t+%>D zy5e9Fa51K74NL*lW&1Xec(_Y|n=#79G&dVFxqi7)fbTPWU0H1KOdtg14klSYGm3O$ zdSXU$2#<>V&h|(}PRkwt9C`<1aUJzvo4etAOJs?|;|^Y`f=I)7S%22@+c!d(=gR`4p&1!0XY8 zJUeo&7I|-7>l$P=4-0SxD*OWI6MSPcWOk{Hzoixf6dnY<#10ei6co zcXy4&Avj=MOgj1eh~K?cS;AK_`VAapGpd{If{w*0)qK7U9Wfx1x>#)juo)y{Wj2#)Fy#MdSc#_TV?l4DGD91@pPOEE^Q=!vaC$s(^tlr@v7vCiUd zHyq<`l5-~Yh7-rnx>D}*8WiErkFSNWrB#NcA~r~AxdX`>X5La&8fXEeX_1FbS13H%7Df z!Pae`+8?%Il}wf{*B^l=x-}m~`LqfvjHxvgS!)%d?lU-%J!t0I?1Sr{tv2!qRTSr zCYwTIWXJUIXOEw5+7f8!uSw?FbF8|B3>3b`W=WYL{U27iLY1CMk(kc&rnmgR9W2?L3&(wpOyT3@K4`pdNCcs?Tk)zjYBxI? z$dZ0F1VJr<9n1v`!#59Ghx4JRKP!ol#YwT;Ji}k=S>?fmrLY^) z^d>lBMoN0B;A}xUH1ADfj=b%@GVwGOsy@cqxM{~1N}(!CDXH^Sr}eRveQX1WybvdA zPg7(tY!$B}(^;7TWKAMY#XeGo>c8rOTS$iMLTe>fkbL_#khQp^Kog8frdv@D4xp}n zE3-GntJ0V@LkN}<*+J|69_4u-6U_K?%x__$@_iW;sS@U9n4<~2T@qXMRSQ#l@<_DY@2VohF}C$sAASWb`427m@{7fg|2419=76kku8$>Q?M|g$ zhd@WT!<`!4p>c9^2KmV3i2FXW80={9x1G8J9oT%E^F@ND zB)JKcXw~)v4Y^M6{5U1kX%y}`^()0d!5TV@pKD1FT+)MybDLVL`YHDmYzXFs$tK`@ z_vZ7Y-^%tD@QSFXhS6c7Apf>zuz>Zf*=7w#Y!m)Z5UVdVU(8x`Ee328Aug81Xm)A* zedh^Syjl9eA0O1WfOXI%l>Rt@fY!348vl9L!jfwI&ijHeh?nGa?Gr4_({`&MaTfv^o{5_BtsVK6;s4AuY zn`4rXK1jU5SfSZn=zcqWj9xeJStOp$`t=L>`zvTqIF~g6F~8-=g#cD)at$;9@xv|b zPnY3C5#N-F^wC4-%Fuje?=0H=PJNQ=lxhyN&1`SgfzsHW6!Y z8$rn-sRhMG6t$q<{OIG`fw0LF7jKqyK0P51K<{A}lNTF*Y`%RYL-(w+dZg)Cc%!Ni z>%URI#cKRo?SJ_@3Px>VZDgVs&T;P&OQ2t@SQY71doQ$L-=0ofPj-vNWawhE&)&6S z75UPw(1&_K3Go%|!r4cep#ope(@Ym5adSby_CEeW@+k_}n_CoR)4h7J$=bPlg(;>V zajn&1B-)lhzvq4Gj1BrNQ@OW7H$PqgD)fPHBcq8H)-sbP`5&~&2$9Y<2YY_7ZZx|6 zutof-g_%^nJoGN_Q02gl=*JjlMVlWlx_JGWMf4yxe}n$yO7i$`dd**UZru_@^*Oiw zQq+HIIv=cyzA|v(1`QD;P=9jEV+@55AF1n+m z%P_jxOE)?cI$vF1MkFc6Cd;ZYrz9jKHb8Ql$+9A=wi6~2d|H2KEJ?<8-4(L1Cc19Q zCwYi0>}&oi4~abKx~lDP-rXKOpS`1zWobEyR;cKXRU}xA0Lh9{PexuJl@p-zw|l(g z5@~Z~_4JUGX)k$(_v(?hUgslG{!X^CcviL8TJSp~&`{YO7>HEx*b=mOpBgh(ayMd5 zV(wHMiIZd@2d6_gsJhVu7Hy%_VM;2Gsb8nK!;+lao0wVWj53W6Z`mN?s@ov_)KY=a zf`y%AwSkXfY9^+YyJ+9=;alL_pp4#lt6i)_RIE+scjo16S0|f5PRW2ohW1QR`>A~R zc@Dgpi19|EjYy9zw+i9Z_b+kb&yyqG7b$H;64-U)b6$Jx{;Uy9N^N9DKZ{ ze#6R|sq;b=Vl?vBI)BvEq3^j zjzAtr&B6{&B+XWCi+G%1!NiGqP>IA-Axlu-v6B=U1sdsFf240c9-1r?O@ zSP)6=$gOlVz}~M?_MbJdKoOd4&)#&#%~$pyaB^=1%mJk`R7+g1KW^H~RLxI^IIG42 z>#>CaEyICcnO2TX9&PP?HHU6iNPND1J!GDojaF5aG1k?aaa7lWn`eG`C+ex{2&p$E z#ItNmQlME9xwEU_PGPp-bXjL0ufHPHQxwfa@3h;bmP2&vuZ`e5MTy%Jvy`tps0J*4 zAyvW5-FPBcXL0o|G_y2_nJ(#BMXEU^p+Te6FZ>ueNy=ZVm=zK~r}F(l>^M4kJv4Uy zDoe7DjZr*e;f}M^t(eeF15r#*bYCY%ZUg1l+fdVl466f1*>QaQU^2_z!`10NeV8%j zDH56>+Cmjic4w(8x4hoX<(42+Cne7xv-wKp{hwa;=i-Eg%frCN0@Ggj^w!iLn(Hs?;Ei|Rx&2CTlf zkKY8VD;4s^N*L;bWW*JkSwBysQgh5b?PIgSNs=1GMm0eowl4*FfzEs<{Z=lGB6|!J zL>h}|(aFX{Py3As&AXeB5jQ>6bJVlW$}w3g_rat*oyvzIMaZ%sI=pR)J`Ag2UzhlO zpV1+)t6Bh53{?|Y?Aw`C_djMXD1VsTT5y1ME9W`CjV8KoTh5*H%=q%Wu<; zpmfQ;j;Ht?P^F-4KNLHfp4G=>A)n<2+q^;D4xrwfFEfC@F?3>&lSq|Hvag(FXP5*` z4ejRyMO$6V+P$ceS9GkP^&g?);Sy&<*%<^zmKb7n$xGiy^_m$D7XX0u$}K6F1UOr^ zDt7oLnyLs347QpfVl84O<**`RvJrvPt}jy#3Z24ad>n;b*LnDK3HRZxvrOvr@j%6L z9aSHl7OG3Dk7S0I`5@G%1q1a**5Qh)m^DK4(Wa87$4M9@=O+tV8uG3`rbK>sL*_@U z&O3yNZ?Wuj3PqTxD4`K5g`1tBqRVZS@NE`B19`31XK$JeZ>v3B$W{LyN6JttbRp7a zosIf%11Mu_P~y!J?m2Qn@@LBhzOwh8pJ%s1-hoi*(?S!xm)8-i=+MdG2S2@Rnvrew zYA>BSkrY@s9D2K}ARwd(qYE!$)}+<+J&o=QVKG#jXb{o9)FzT?njAUwOu$Px706hG zIL*4%Z(HGr^301ChO4foBUPs$0!-TaEBaNv6vmBL=Z(A~Iq&V1VxJ@%Nt!ouK7+*x zYE>$ZMIbF}j>W2W;ACYt$s^@iQgL%jVYJ$USF;m0HxikJ#ZTn+q2ZgRpwpL}K0R(v zxntxXi5yU#3}nO5V>7G_2a5rWW1vDxQMa=)YA{^_6CL|by|S^ENQsmZShwYMNQDeF zL4$ml{X7BHUl2{$FUr{2DOaSgfvd(V_#&uVSUgH$3U9I6)tsFtZhLVe=(iKQr_+$- zL4;){x(+SBdM4h`x3G}Ryxe-ir)nE-rXae1x9CoVfsZ*GPWlt7aF%H6k%~13VPP*g zStXqHUjc1{EUIm(D;(o`ukI8XvV?xq-tU-uQo3rY{Z_NB&bDB6Wlqtury+@lIo}4w z^`#`;<7U*D3-B_Bt4-#dcXO=H?%QF!JJi$cU>f}U?|eQi=ineJ@5kPooWqVJm-gDk z$aOBTUFHXl;QjZG?52~3f)B+oWIF}d3Zn__8MI@pyjBnugab28;S75Ff9) z(L9L|kN{#phNwJCV~^5`E_Gz|=*LugN>UD{sTgy|loryoF#pPJqM4EKs>z_v*myg3 zQ#UU%v_7&bd8(3E$K6+Z9_G4}FyX83gKPbQRxEnEccXstPq@b|_S)Uh%rtm&Kawak zYagO8$i`M@LtEtP2Xe#l_?@2jnC8T1x1RLbv+=r3(d${5#5#eN>z2XKd zLp~Ja8_h<&tY2_MH;ndEm=$2DYXsZd0?(Zr!omdcKBIom@BbuinmWINmO*1?q-Eut zZb9`r1^xC^X(m4rr7+Q4R#7o3SCiVK)E;8` z?7mJ)?s3W&Um1GR(*g`EY@A1T)b2r4J?$ryT0DGa|81jrc+IbQ=ZR|)1Dx|kS(k;b zKWl_qwTo&+triGfg!+3eMwKwd`{=10{-by@mqpqZJq5)USd88Wlyz&*;c7d+}wMw^TI zsBK8zzT?4XsGLAk-73GSpbI|Xb>;7Mc81U}wuQ6-jnE1^%j~(GHb}jmP#Y#1#|fzz zdW3m5AiO2^=I-dU#S#{0_f7hooL@ctu*%xI5feT2%C-vC<4mJ(iK)hLJ~Aior`dqy;Lw|46khFwBdnA%n6yyzV z7R~iMY|Z#ngxybZB(myORtUrB=ZF>$eaP-h6;XZWhR(e3Dgz+F*0Y6wO0Z4jk6RrO zE*JWaW@N%!&T~x22Nsp!t~H4zkUh1N&^pH5v7{QoEFUf{x*K0833_i|#jS!8K3?W8 z8k%DG`!$ z2J-ip4nz~A5#}$O*2I$}`%;CXc2OUrTX^HP{$u_>Q8$WO`gZRD--xe0Uz+qo*im1z zu}8{7DJ0DuNQI|LcYbBc^2Z(9A$^hWJ78}JCn~nIL_AP7^)aLs zA^|C2yU{?HjnWylpmA5v&IIjxaK_v8 zYr6B?sASS$QD(Sn1#Lo}Z4<+(s3$ZiS_S?DyV>cgKmt{C#KiL>>U?jKfvVQ2#&~e3 zyZ3PC2`SV$mu>^8N%8>S`8ox%^=5MN$hwzIpk3q`dEYjcH#cuHPoq)?Xh)L?3KU<~ z3bAaq#dQW10N;NnZ>sXp&4fv5|C)8tl~_gJz+kyMjS;&%h*t@RW_J#U+BM%5IB0^S zxJBa-R*U>85vA2hfDcUn9zq!Juk5|*)MK}JD*HiVhtw|xc|@0V_y^ViWw;GO`YB%D zrYd_)Rzj4TUBj(zo8sgdMH&`%isrmcaS96Nb1MXlamcB*>!mdmZeUR;JvWwd+edMe z4tB_w1~-;W4(s=2{8fckm&Enql&=LBLSf8E%16Al1%-Wy${6n?vUqbOh1={;h~(WS zCj@szush*6@@{dqmvf(1F4tcVyv!V{Y+U_ zIH!hge$LKl51gfLT5~6LeN!EFyFXe9)e)d)KL2rV-Rw)f>r%hVzW-?q&9A9km}bjy{b#4TAbadXEpABgr|r{ z{o#f`!+#O2zN9nTTyWNIA-a?{-~EegG6Z=|TO}uGmDO33#Pl?cNo2e+i4rb(GaA@6 zQe)Rn8B!fzWpW#i-sL8wrm6{jCFHjiABY0-(_+t}kYxDF5~J+Sp4@271gOI>GCZ_a zmdMKJxEnq8TTnQ;1J_KtJ8PO)!{e_)!@X0nyZLez$+lOo?9LzF=|2RLOlt)s)d$gX zzSDJq4Fze~(A~VL@ zGc9?S+cJc=2n@`?V49DBAB|f#71SGppGPE>q_hA zqzvTcBQb5^<3(snZ%^o($oU_0br}s0?=NNI`Baa8o$7~m9O5x9ECz+}ogc|V@Peg7 z5D#khQ=o)U)ib7z^ubRY{jxN1sLkl`IXiwQd{Sn%U{zVbs;XQ^m8w++s@l~fS{*m&$vXiX)z_uC?fv9HP3YgVqxhh?`J5iJG2@SShNy5hXP`9VMUB1%5>)C6 zF>3?EGXn^WJDsvEqJ=PRQ;W*c=p`TjfTdYD~07A4!qq38zUNb<58hjKW zkuZ#1*Tzf8GKs92t5*$yA`M$lLx6=-0{ej;ysRP#pa4Qt>_UhNZo(u1lk^@9-QG9# z6AA)D`Sf?)k4Wy;XYy|?8kXpnhlx5^-ZZnQ&{O8PU&@}>5$rLV2UOxIvMi2ZFJkn_ zq0_HZ`;PotJuI>;!bf?kZjX5VqW@b zlLHfhp|Woggh->Th_l?B0tcBTFRBY)iu^2g{qRJtY1H_lo-yPL{J^98tGqp zWYct%?KB&?nV}D5N+cEYktLInUhRMS+#YytcRUyWP{TXCnl)a^&NR* z|Gi$4?OgZw#&_6xIZ1ss@<}d#;_5)ery~{gSEoUag=q~8XD2E8q(o|W$%{oHOF=;h zMPB_d7c<}N;qI)(O~flK_(=$XT2-a)#K)vty)cYqN9x!qrdY$iNnQTxB$hq5a!8dP zcaWl>!#rwWYAdv)hFwr6$~5wAdY)%@GsynJaDL;Xx;{6F59=GBDMWhGI8KvV$$i{H znNv3-NfpinPyyb^RmxY`O z#LYiyB73IOPS(sJm?v)R_aC`KJsKSd{Xq^voR zMwK-Ng^q=k0Zd}vs8I(dsRpPKCNsI&H#1x9Cr}mTzW1vzoQ<(Kx0`dY0+YH!T9y`Z z+TsG9Yd`bM$J6ekqg1@CH8tsd$fkV^`}BQpRjhhz(!;!Tq_Av3c)xx%kA-qrS zpfTVL*W&kqx>;*`U;Uw*z;&3Xz-UjMGYWG1NsP{!5~+Dox~5pjl0k{_4!P%-!{5H0s+Xne8~cDvbs4`U^?$=ye35GQ_p5FU2f8Ra znzWeAAMY`%o4eUVgU-~X6536TqT|>Wtkrb#Y0l*HqyHR6KMFIVUM!pkT`P#riWe-h2~Gt2!7!H)P4cj zK?|$7P0db+our#j`Y#qQR{nYnl^#_x820Ul#d}kOem13K6Dkljgt7qS(?!ZKUoFGC z+K)$0&g6+za&H6qSt(bCLC&yRd2vcGBT$S@2cc?ko~$;0+9IC$$7QNqOw$OPAnTZX z2zTNSq?vW&1Gwlh5cw01DaS0A`Q%_8{5T_4Xp-@SQ^>^%L0>JSweYJ&jO)&!j3#AK z?fg6_%P>fa=k%-7o1pbBlmpqr%eqi}6p;;m#k%V$>c@eY*ySfzSw^x|J$Z(I*?qa&MeA?o{h%t2A-4%ygZ#gT2qcy8Yk`)b-Te|E0W+x-5UK1ua7mwj9 z2L*KI?<%l16>CHpUnrI^>vd!!D;w4w$9-=NW5(s-W)-z&ds_LwEDG~H-GNItvZkks z8PYPs{LC5?!$6AqlH*xJ71x=WXgmKKYyYxfgd9?TUNY;9FNr8jI3Ap`=3si)ywJqk zDs6mm(f_}{bO{bWIqJR`u?7dnUv>VnsbRfk^xe z@j7QJGk}d+brvR{9|qq93~_ph_<43&I!wlxd}gQ&mdrR~iYzvPL)p9+^9|Yg+-&vK zBm}R-gQmtc9;uBwEo9+g3>Vs6TRGj+Ftc8qt{zup)sUcyETB}&8afwS_MUYs%p0s0 zSEASHZe*)p?=3^>hX*5$&bLXk`Kepu_)6j9`Vg?Esc|O9PEyKb-1ict-xEu zN%j2U`tZ2W>X}jhdo!<+U>Tal$FqiYqt|*W)Uzc$jSSLw$SQEaUEyMe>D*Deg7%T4 z0aPy1Q&$vS9v&yub#KA^H!MoeERBNkCq#dRxbU}4P~)5i@Z=asP$c zK=He>EL}bAf#|CV#7p{mRu!qfL->HL4XDLIo$?O58{WC1OxIt5MPyd=s~fi0V*yf( zXN$z1S+|h0jWdH?l$zra8y1#6Cc)8{;d7NW!qjwyUK2&Mu0=IH0ki3&&ePQU&=ZbK zCSOg@DO*^D0$O~YG*T@+q9c}o1F$|^EVeB4Q1VdxSq?hU`jKa%?erj3tm?Fp>RXV- z5=a~P9EEBF@7i??sA|RH;8*%IhIb9w`p};k*C@SPTa# zdjAYbimW8_9}~tjI^DTgG#-1@>$HNl9vYKd*7_)q&079>&fjvQlu9UYTz$=7mLew z?tKpiEoVmd#yU6uY+9|*NuU?(VxMee}R^En*HNzcVEYtx#NWYvD zGbL8r+N!D`^(^wXWy>}@E^Z7q8}*s?QeNABhUzFdhOpTDts?H1bHLhcf0Xn}y*Zfq z=v$D=yF5IJO>be%Gt~O5(IotQQqOJfqyTKY&}eulRYYOofpK1Yivqefy4cQl>sa?G zgDjfg>g>2gk&pZZyk zO`>JxUdilUNX9@oH$4y^I|W^rgcTL4v%%_FBMS%4__6(!&K`&U5@Kk z%}${nuvZ{f0@e)22mC24p=Jxu6gZ&o;ah;AUCyzLk?jNV3svTMy5PZv&la{f;ea)s zdJE{@VH+F`tB}!Pos%V})9aS|T*S;Nkf9Dg(SLR0IO`5Fkl|FV79sBn@+v`b< z=1|w%(Tw2@`Un1HvjQ!vxT*L>~byZcG|I{n@{+atNhiA36XkY08hhz8sn_s^?qBFb65`gZOax}&2 z21RS#z4$aUnI_$21s;cbmi{oh-6Q?4JI2>}RIdZv@JojxYDt~;4}XsWZC>0Np-kXt zk7r}iV=&aC$vlK9L~C2R{-`xbGaFK>Rn7Bf{_5VYJZ6D314 z6c-lef@lQVI_a@vd4SpJ5Us7RgT*FA)u*F>B0T~SuAeT-aXRtr>)UZBe6+U9k999- z062O2WK|EkS00P{xmIgR&%<9d$TUf9`VB>G2`RxiJDpCSp}J_^tW+2NV(?JJwp zw4jOwXKoj;z+vhDN|!y(qn}*U#wC0Cs&#Fw@Fykpx&WVxSw&~EenIV7Wp1hkQUSf` z5Fow-56@(^KuwLbpXGmbNA@k~ptxN&dx)$x_~P7KED?(p2bykha^K@LYLKQa$a2^nDF-{A?lh46_W?|nK`D%5&?rH$RR46mqsKtz`5c;>B zQfiC*xFidW6I=z2og|xheIZ&KqW%1(Zx}cNz5B55i3^e1I6v@<9lr!Du6ocIAf-&5 zj2OSPyx#Y~zu;w-M+lD=Tm?FHl591M<<1H})Vrl6(9Ws%VD13V%93H{*^U%*ZJmuG zPnI&y3WUU60I&USrQbg@y$$cK))LBdaFD-*$qGNHZURTa4^CZpaj)PP+11u$t$yy* z7y!*L&Z_1&S8Gl3o3aJH2G#Lde>Whv$~(N!cx{^se%g2?y*1GqlwjjD=lFZ9|I@&sUKg13#gdc{f2sLtMjN1GQ4%Yz*#80;_~S7lBQ%vCfV{d9E_c)-Ir1aag*rQk1q|6tR>?yHgfozsvrBEjhn_ zb9=w{d+vFB?rF}sP9-6g@a-JwG@+Gkqbifq>DTzapaI&3Gm#M`l1S=852@qG?uA37 zwG5;y*~dt)K5Rds80z}N|51$_Yx%wiBdDw-m~ZiK9}4)`lrqdTIEY-*9nIBtoILmOr7rcq?V*dRhj0C z^F1{qAB7zSB~+)Wr!=wStPbI|B~;tYzOV1rvV>!EUd%7WM^yKvhvgfB;R=-|6=6#xd8Dar zGOY07FBw!9o=UO$k_Fn@TZkap_WIh&c2-~ z77Nt8kdB+X){X`a3+l?xy3snqiM7Y-pS*Y=Q14~vtd9GkM--o3> z(MRMF(M;oyJe_v|#T9_!(w?D+6V#sOC!%a8JmKu5Yz{m*`U+0;v_8)VWrTW!Ci1lW z6x|4VNQ@#bMV=5K&_kk!L=U;x0|6NlIUA1aA^|s{|JzJ$AMm- zY#MC~?c}^8ve<1!VM3*rroXMTAF`%(bX|_`);ldb#cZzRmQ2yJW&*vP$r2oZazK4R zyFmYdeiFk0hDF2!J(vMv65=9aGoB9cl!T{63OW`<^jNh!qN_8R3(fs#k_Wo>G0Ro%u|)oHXOA4(6}c=-4j0IA`uziPoiXiO zi@Drle=qvN^=+Qe@PO9&4S%+-wd3xyo6Np$&|(0m_;*?SK;#}-5!1fRUvT@2VsDVs zgyTVTN&n`F6n;-o>Ii#5cDel-j;{rJ@spERm-LQL&E)M-?9szmntZ(W`tr5`-NX+4 w^t~v%dqrset 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 diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/core/AlertScreenshotTestsKt/ScreenshotHtmlAlert_Light_b29dc7a7_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/core/AlertScreenshotTestsKt/ScreenshotHtmlAlert_Light_b29dc7a7_0.png index e10f03b4b11a679d7b769de1a412b9708145b310..db8b196475642262cdc5bd86e14bdf5cbd1c1154 100644 GIT binary patch literal 60023 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 diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/core/AlertScreenshotTestsKt/ScreenshotIconAlert_Dark_d19fbf1f_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/core/AlertScreenshotTestsKt/ScreenshotIconAlert_Dark_d19fbf1f_0.png index 5c2efc58d641f3f2d7a4ec6459dbc5ab975bcabc..4533f3b842396bc355b69afa0ce2ed6355e401ca 100644 GIT binary patch literal 58225 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 Ci*9}Z diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/core/AlertScreenshotTestsKt/ScreenshotIconAlert_Light_b29dc7a7_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/core/AlertScreenshotTestsKt/ScreenshotIconAlert_Light_b29dc7a7_0.png index a0e4aa13b8e3381001cc169191824a97564e022f..2dc83b0e709cc661925485b1caeb41f20d7d9721 100644 GIT binary patch literal 58258 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 literal 56437 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 @H@JNu^CCWi+f0Zcap~Ut71AdoifNg)gJoF97 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 diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/core/AlertScreenshotTestsKt/ScreenshotMultipleChoiceAlert_Light_b29dc7a7_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/core/AlertScreenshotTestsKt/ScreenshotMultipleChoiceAlert_Light_b29dc7a7_0.png index 7e54d473dd7593327528a9ef739cc9e5dded1975..d64d88637480aa702f585e77d8d220b263e09a04 100644 GIT binary patch literal 73559 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 diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/core/AlertScreenshotTestsKt/ScreenshotTextAlert_Dark_d19fbf1f_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/core/AlertScreenshotTestsKt/ScreenshotTextAlert_Dark_d19fbf1f_0.png index a317c423f0a200870f95cc09ece804d549fcd33c..544022e019cacde1a5b895d2ec022acbb2aa7087 100644 GIT binary patch literal 66559 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

fyiYLe7+74K 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 D$DK!& literal 63569 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 T!-x)eiU)3GYngxIe9YegoIfcX diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/core/ComponentScreenshotTestsKt/ScreenshotChannelItem_Dark_d19fbf1f_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/core/ComponentScreenshotTestsKt/ScreenshotChannelItem_Dark_d19fbf1f_0.png index 1bca5bdc47dba09c71dddcc506817317d3cccee8..1b4a8b4fca094b1cd2a3c1856e8eab1435d7e311 100644 GIT binary patch literal 7866 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 literal 7967 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 diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/core/ComponentScreenshotTestsKt/ScreenshotListItemDisabled_Dark_d19fbf1f_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/core/ComponentScreenshotTestsKt/ScreenshotListItemDisabled_Dark_d19fbf1f_0.png index 1d279597feb24244f1224825c71c3d2547032962..9db0caa8a5c3be0cd1302dea75b2796ef6cbde9c 100644 GIT binary patch literal 3787 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 T{(1WIaakVRN9dGmKYj5ZBL$7~ literal 3910 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 literal 3910 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 literal 3910 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 Tzw-nDpYMi|#kEg{cmMh~#b)I^ literal 6171 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 S!KON{I|fEKi~o4~>c0Sf3tIF5 literal 6314 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 Hvk3SvbV`yL diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/core/PreferenceComponentScreenshotTestsKt/ScreenshotIAQScale_Light_b29dc7a7_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/core/PreferenceComponentScreenshotTestsKt/ScreenshotIAQScale_Light_b29dc7a7_0.png index 23a4a6558937805c9c04dfcf7f62415ad8b1eac7..589eeebbe8ddd07891528e73a57cb9ae19c0230e 100644 GIT binary patch literal 58165 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 Hvk3SvbV`yL diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/core/PreferenceComponentScreenshotTestsKt/ScreenshotPositionPrecisionPreference_Dark_d19fbf1f_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/core/PreferenceComponentScreenshotTestsKt/ScreenshotPositionPrecisionPreference_Dark_d19fbf1f_0.png index e1f86afd4c12a07ef38ce16aa161c513a84829d1..60e79e2b6fcd1fd6413a971d19f0f9182747bb88 100644 GIT binary patch literal 26318 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 literal 25079 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 Zd-feqBQy3J^c=!R;3woiSrqMt*Nu zjE&0_*Fz?QnW$hr;_bV*-NmDuV}w6#9f4KG#hLof58h@b!pB{1jxGlSvGc6^_{2Jb3M3D3SMjoCONx8D97y38uI$*HU-=1gfFv>`;1e&w z&;M==*{P)}=CFUEsR_J(o$dne>boNTQd5ic+)Qp){0RQ#WT%VgSFIVvP~y}s#q9R_ zRi;;n&hLLo&eMkCju|26x;{5;nU53dlaVpe-Z6<{~2^538EiMbW9M}KkY zjriP7F3g_)6){Wd8g>4lM;nY9N)@B-VsGyo%?Nw?D$1QNEbm&!sHmNSO4c>1_;_Hw z3L595^GG{JV~SnS5iw85g{wS&&F|>uUXAd5y_qWa*czcq=Mo*MDx~BcM@U!$%YLfGzYpP_l8o~O$^ZgF+t@A4%PpKqd z?^JEx*PN;H{^2TmelgD{rpbjHqmxBQWx+E}eC7P&o+@8e@1kVr3*Y&6Mffc4+PhsX z8_|uNUgWC0^3;q+B9{}jN1scNn6gVz<=u@8cc&=NnE)CzG*_%GA}uiul4h|Jp+UNg zv^Xe{l~PWv{kXTHmU`E2>OsT6WI`Zx~hg$ z4b`IM1qU_MIPiD9TDe?|0$prB`Y@#tCRI%Q#n6ZeG{L)*qY&EV5fljl!A3kWK6u7Q%tzx9Hm6)t)w^6DqU<}r!Ui9}E%t`RqGwSxiDbIzcR`AX zu)wfTn*6F5PUsG-=)T5`urtC{05`08q%%BMp8-AjGbSuFERv>FSk&wLl9Q2KPU9!B zd$qt#=3O zF5)bSxs6YZyZa~Jj?DtPa5NK<*TI1x53Q(*M`5ZrY9gyM+xlv{wC#l5JI*@K5+Pk! zr#rTaWj>{QPfCl9Zead?$eUN)m1;E&WmL1wJ^H9;8L&83W3r=|4Kpdb7n`a+@&?WB zhQ#T8U^(CONTTSU`Vo&tsxqfEhV`Nc5Vg!39S>6qta_z zhVbCvtzi=?7f}c{N&cw6M&njr!;$)J*r3kvi`A`9wNS&F)eqrDF$el! z&cm4heOHv4hG5D&{Z6!dMJP(bx?T)4`xW|_Y>^29w_2%fc33g#YHQY6G%v_hUUo84 zo55|)yUP!JCLV(}oeWfjxi$Oh9yV@F_(+dYQ7kaE(YIwr@@iv**3fr~M9f>ozy8@% z){;GVFHFG*ZQ|$fsnRgq+%e!CmWitg=SbBo!Q&_>Ac> zBLk{GmLY4(p(d~L%$!8D=(!;2)QfoT*zhjDNX?sW`2@H%t37T{AKi3b6Pms>t*#;X z`U{j?cAIJWQ(vK=T79U@uh+d3w}yiUTs9s;TdUY+PXgbLCmlldHn$$`VkJ4urT)RY zf$xZE1&3EB_v<~?bxB#M-*$n;i5of69CFihfE=t5-c9{@q5z1tzVrW z%mao_w7YyP3TN#x zCOhAiP<@gkimmi>-?;gi*gzrc*cVcCb}&GzpO|5yl+#~~ZFIrdO`m8!rB#NMHkIY) z8-t1Gz9coJ<3eQXfm0I=sk2fCY0;j`nB9xj$w!=qV^HmCg_H&D+8EShBZm5+U#oaA zc0pm#M73c<&{oQ1pH|3|c*_24d$Te(&C@0zP;H((M|_#5nNoY|@boUp8p0_I`_U}2d7gdx zV2n1`ng#8i7Ywi8EIACT>c9-#TrGMfwK%D8=uI5;qI>2UkRaZE3%>e z7p^?d`#odX=}w|t1YY8@Ed+%P>FL5G_dnG7g+`Hv-{O6&>ARBN;IA&ohbY|ap z@xzZC1GdaYUt^BncG}&eEg$rUt2>^~Jv6u$w1`3kyM2ijk z20QV5C?`&B=27u&{wj?b0HGZjp4i6`RA$emM=GF19~Brm)>o78{m=Vp@goQ{w6oUd zecKEl+LT1Ym=X%UK3UJ5j_NZw`^1lEw&XyTJiMX|mu@HI;TWTJ9a<_-UDpdsE$Qwt zD&fc_kSdqs*sm73Rx#4=WWuRm&$4)erF9p{_AxE#pTQ;*(v*Xraj%uyfi(41MQ8{D zn=qjDx;gV+`1*&46qE;XQrb&Dx6bZ|IR?D#B9Y0p0$X=Sz76ak!eFV0Q3G=28fA(# zeW7@WixasGD3h7<=x972!_ii6w(LG6m^$fK;}t=*`R+A8=>lZY!b1v{7kNR!pp7H; zHi{UwrIA=Obuou|U(ECLPNm88ND9UZ#e#?Tw5fH2T=^Rp6W^gZTitfLweyet<5Oar zC+BHJA!seLvG~)mbEl-Yds}9XiYP9e3ni&%>d#`Oa;#~c;Txcuiu4aK8&B@!4J(FO zIcB+&eV^0ObsdnB>0pMW+&iOuI2V zvG|fYWl;{P#1SV`bi6ZZA9MMeA)(!D|7;%*lC(ANqb_XEGK<9a0;TPKqFzshZgHO` z;dPAUcFcr!RIQZ55qqhPXtE#n`=aM94w_Xki(;`fp^t~p1exwkUfT-6JZj^Llx*a)vtTxAer4Hi!mP1^? z*_WZ9e&o~H&@(gJ(b^ugl=tqH(mv;uasI04d6C6>|8S3OF#=V8=e+J4irU48{Abplt_sE9Xi0}|Atu8(Lx_`m_O=Hor& zFJW2gHsW0>r9zv^EiQ1D2Qr=tXEd;OD;e-)+bo)L8}^dthQ#)MU!2`5BtE(I{5^=T zU1+IC7voA>P8oNwWDx0_ByLhZVQ0{hRUvg;RHH7rEah{ofH~&iG6>}Ufy8oE*NAO` zd#RMRp<&J;4p7G{O%Sx_lr;!*F&rt@Q_UE0(lRFb)RR0y{7xo@95_BW=BjT)7ON9K z`yYGKjWv_@)miQH$gAjE@25Vi$B%f>%AwdQW5;5`&}GzBKW#hNak5n}pQCc?d;{4R z3FP6fkepH<#oC2h7bDYK*}?Jvy1b1aabrZmSEhmhJzrkQA9x7{p9lGP@nxUzho|Nk zxSOr6g~+;HuZaJt4X?d-OWhCtBLH}A(`)^Z z-O_3Cg`8epi^;Au;*!2sdIZJQ1_te0l0R2C*dPP-J6DIaw|h<-OOnyFr+p;qljhY< z*>{)OLB^NhN&{R&nd*?eyXk{k(w-Fn1oUNCMJ^eTg2Gq!)w8^glR@f}Q?6JE5rh0g zGU4wOJoJ&HD?2uaiVd>#ik0!GGxQZBfeoia3@rebSBLHD0k1LcUy&2VCN?Ye>ir*1 zqdODT`1!qb1-QNN^o#Fjo6!z_v$N_){pDlAL)?nY%-5%q9mY<=OVLK(Gfo9z6&-hW zxWrfH`T|c*i`rPfIgUBn{*UXu@_(94ziYu^V(aHVq0{Rw3Qk!BVeb*nmxsi zOe|2`tShcRMf0Hj@je3TBkdF+Wy7sB(+TAX^q7yExS8HSA;zuLAcpgwd)BENly6irASAXNN_uO8(pTE_ znLXnkQ0m`$A>Ck08mBt@nC#zWX^{@t3|e9*`r|fC37#W!Zd~j#&tBI~XdJN_jAoK~ z5AWD+st&hXX3w&}ivVRN>Lm#(RyRhYwyxE6KDF5yT+p4l>QpQ0N~_sl?;?eR^KqYZ zr`o~aJE|t?&irv^nXEtst%fR7)TN(9=s{Mz&>VzR^uVrEy8(F4{OobKkxlwweTB4i ze~3$`;&lxS|$zL4o(EqQAfB;!YJ?mvX9fyUEoK z@ab+MCKbaUt)K$9zLVaHAdw4nyZu9fIRl98I?a}x@w2$BXA*5$>tY2L+R7$S>J=M< z{8*ddbAKtCsW+3mbK=eHvIwG+=EPNd9u*k=&t!#!4NU zbP7(=qTPGlQ#DhWEX8*eVTb*%9;Va#B9Cx^+y*$_Ouplivp>VcE$4l_URrJpFx zF)bHj?~^j$EA#SXUc-&Y=w0qZt*E7f2$KW96lQI4HnCkS9!Sr;6io_>}!V#LM=(-lzbVww_--r{WiN8zZ~uG|Mu9D>v@2|jpr-gpJ#Ke z$N_LPL09wWxv8~$Wxl)rbjq;a&9Kx+^`v>LUV0*R453{BlLtqciFpDr%h0Vn9@}Pj z%DR~3e@Uq>JOMXna+0;0Mzw-^F8P(d_ze4I+ml+Q_P@RGNQ z%wN!TdqP;#NFOp#`8x2_3!g>vD4+_AIITes=n?XCC}b^^+S~z9!uZ*=+F6 zg&ZJ*bK?^ORz5kdj2vFq3!y$bQC=HV1rAnnXKEZOd0e+ma-hSw6ze!u&BJ$(&$|$2 z?v?%Pz>}ARPn;YlaG-No@aA)aruS;NV2;YC1ZelJtZ z{S_Z!$@LTdlj;Mx*7bjq5YQx9O4*A4eL6M1BW#*HI%A=Dci4vSJYU=J2SAq%tut6z zgUky(lQBcdCyS$TV4p#UAiygBB}^i*-DOlMO{T^^2gm%1U;rUjfAQv*S7OQj8kGZ` z7{jL%%#aIhN<}`_z~OG}rG3Y1HN9d^;JlhN&x9pJ*T^K!0>^=Bh$FQHkZnwt{3Mux zPzFiT6#fUI_&|!bMpTE7e#2?rYg8pv=062pl6RfjrZ{ranImJouu?vHrRm~+^iFqI zT;~96Rg!~j@Lnd@Sr&MbB55J>l-7A&va^h!GxsN5*2*nwp2wP%iY$;mHu>of)JHo^ zO=4BzXrJR165EZO`5Xh$67?qy^pI2tO8^*ZC$tea_>B4Hh>ZZ)LQWE>x85iV+r!EC zIq8CLkH5!lpuIm9TV^hvmnzfgCX<7GjE^=d(_C8XIiYPLO86q)4Hn7@h|s5sxU>d0 zmF2USxNd~`5nbwbo%UZ~qJ`5wXg^&;YICG=GAF&CPmz!;-0)f5NiEPe$uWpQfNxsE zvn@8dC|19TxNfTtoqLHJ>V2R3WEcDGY8BB#?`PvUhvD%@WRoH=w3}8htiHvcCXPJK zsuRzMgGK@Yx4QgF43^1&bO@>ow5^8LwPu%*PbA2U;1ko6c67S0Rwxegs5@V^Wgy*N zbJc|cEl4Xf|(w3Q`*Cp*Ayr5KVDJnBRn=erWLQ1O-!RX6F zSCZRZJ{8@Dto|y*?5@5tXo0I!X7r3nS=Uas!%I02?^=5<*Y%kZaot*9fUnI6;?VrQ zyHE1aBj)D-2qq9*T&}jk;Uk!Vn_Y! zi{Ku7#p=OcH3077Xyr77^{or7JH?BU`)&9ac<;1)-w4K-QQavVPklMEtcsDan+(C# zj(xq-GXY@9_+h}QlWEC7aX%8V%COVBGS^D&*pq0+NN&z$j4#hL>j|J3gdFA{L@^O6PV&H^>`Egd= z<$sM}x8snX#_RauPJK7gH)A9{aPmPn_QN|1w}3;ade7-1+>YA*baC3QZ&l6L>l(?< zoy`Yr4Ed7nS)uA-$q(&HCvu|tZob~P8UNJqoPWvosSZA~V*Os?PP}xlP35%7RHBtM zO-DbLv_*Jq6hbV}7DwV<_GFV^kz9BI9X>NpFAa?aItdftc_W`R*Xe5s8@yN*7RZIb zt0uKEy9|O4mv>I4H8(Lmvb;>=B$Y^S(C0TX$7iqzemp#fQpX=`q_#>e;64|wv zU~xIWlEWa?2rrGaa0D#+OaI5) z>TYf)$o(b$Sab6OgtVlB|43!a)sujj2dAY*Qm=ZsNZB~e#3GE-@)4SJpq&*HrDY6A zBDM-89pc;s=|YfsG)M!hsWRPu2@aGI#ew{0i&e0BjGeE{Fvbl(Jfp0cjAtl%C$1)S zVftjD?^j;Q8-Tx8Y2><{y`2=2mMe)-UhwE23)=jRz#hKvWv~SDdTmR3AMYJk*YnJeN3Ymt)RI(&;Pmp8kOQ661M^u`bgb& z28E`^uN@}jd^#4@ZLWSH?$GV40o=D36|W|?y@-hv03*EZJF(k&0aK8E{D_ibBW7>z zNYIKxY|O$N*d+ z%x5Q#Mxp|?8D51&`PF;c1|&fvO1+!GYdgcs8H$+4tJ+$-$>+&k?SkoTf1o49cp)`O z*d|-AbSueHo0ZMAy>jq}e4o;~QO04S0^c?l#c+K0W4h&0&&J{A!_Ks8uW4n*!6*iT zX7$>8F9rG4=%So@g&4`kEZNo)psa_^}Dc~A@LD4ZQ*Ph*08HJ=guSJ(6WCcqE;h-{@JOFOx<;rIBfk@E z_*WVpCGj5f)x?zC>6K+yv;-7&)v(@mLkvyhlU*qiIN2_Y zDvrGW*Pd7}pIV)>e~QR-H&N*{{5h+xUJw zEnDG58js>!g4XOejqUj8{GwxBX|0Id6}W}J zy8-|omrXDI@miAXndF9DP+edT$VzAf6tC$sQXZ0KSc0tXxeZmFIBq`OwIF-is?w?& zX{is`631`?M0omj+;bdCFwe75l5e63`k(AI?jQ|@T<7&8>79_{midV9x5e}ip_%C2 ziLPMj564BvK8J@@tNFL`KRxlBc($1jttK)|x+^4+;6SgV5BQ*5PNT!YC6EK|!K_5{ z=GHD4iLnuX%LAEKg;vE#1H_X%V*qXjXkRJ`GcgL>u(`Fa#XtmU(LR3@1(9m2T&qH) z4wd4+!_tIJeh;($vA+XV9GYc*l{wq))?T$z9Kz8t2XqYC`EZ=NyDX0If3!LQp83F$ zT9r{FLNN|8TGf^yM%|kK)W+KTAGh0U_>KBpFpzC*(c&WHwoZXr=>jVs$h*;aeu<~X_OXV{VVS2-&i3=s7OQp=m$MfJ zZ>RQwZzto3crrk@0^}J>cm@X)J|h<_cHLQ6VKz%D+bG+|1(NugW6b&&5iDdo`HKiv z$C1@o#}@iAaJw<)dyS0BD}{}$>8w2Z6V{V2*s3^9t?i(vtPyEt>F3ivsBzKjV_sTw zE8Tku>f<+1PExSI(T+$sZ6rvhwMb<*5iR4T@-J`yK3E>-Uv!`vk|}2^L5PD>;)^N= zh@DC|+W>S-9|N$a&@Im&i1*>1DL-kiI2t;7J7zf6J5D*C4wB?orajvYMRUCTPZ}_0 z_kT(QWT+&YOfzxo#`9M!sqCGv4+Yc)yY4sw2zPC@+dcJMsBopLn;Ce4KnqWY4@o0pgVuUqgh5P)G_t#XfFHqokv$9CYsJK;~mC^QMbT^VgNpbu_jF6j zddJjmr(OuG@@gTzdw%&FqYO%)+6<7h1eKB}IiHIU-dXn=25CFUG(#KdyC$i`Y_9y0 zb9kjEyCg)sAHOXuYsM5CaX#mdOw6|nvl?%*@x4+|ooKp*d+0|pMfnIT;QornXy+wy zC&%+QJxw(=Nl%<-2DCX2TP4)`zb^Wo3wH8=GymLLIXmcQ67`$&59XfmeKUQX9y$LN zkS@%%_OOEv{HdLPeI#2_Wcn&SbiN>qkVAZ>iQg&(JW~LT z=l&wC@!oX3d z0V+}~84xC6^Hf-b-tNArbofCGI$=-d2O9PN8tMLe_m?i)f$t+wqqAA)M4*jI6fT<| zk=&iV!=pRjn*lREs#^GC;TwHAxzN7nouZKC1S)`NE6wR!W$y-XX)ZD$K$YO$6Qfsi=nbZ z7N|lIz3ovLzOCNjW71Ox$pM}rDWe&{5NRts$iRs*tLY!<;tow=ngxG$W9HNLHW(_G zPt5$vg3rGHP35auib{}?_-5zT(A}}bYg#p@7Zs8vdt}i|{A$DC>yPuzFKLyV@TSm zc9sRf?o!&eK0+ZuFO83PlUhIgc@xq4cNhvP(`LvlY{jSTPds~dy7rKx=j9t}vAt(u znKba1fKKFhTKM=6vi4L8YEjh0{NPIYTjW5YUc=BOJF>{#hOqZEsUHpN0;^Jm>iJBl z-2b?Uz(ZK!?UG^%JC*V_7*5r!Mo@yJz0Y{lyGLjBYM=GGAv<{4dG9 zyI<|KnqxKgDUhI9aYJl>p*Sums!h|hcK0rGhp-V$-xBKEKJe!qL9O8sTR(gC{7BJi zYB7>jIwGHr=1j-R4>Vm_1f<3fR`dRBx18hlfe7YtsUY*E(3~DA2b9n^GHbFz9leaZ zQW7~G4ieyPKiHl7a(_*RjZ(7d(o9xB=vc~(KBU4LxoO^`GbbOBv39giIVl@%jqYJ@fp;`j3j7Y1zIhneOtN1m~Wr5VWATt8L^X#8T9-Rc|%&H61lt2%(hl zh=EtTC*}jeIKfizMZ==T=eV_j$b3JGU4MUV2OB3y#~h8&^Hs+@8L!co&NJ) zg@zhvUGVV0x|H>HGN)B)24ePp{?Ljf>CQ5b&{z=W+;RZHR^Avre9$6FDTqy(mZ?3=XFp;p1MiQBC`rz%Zz>v{r5ajg|#a70-f8&@Yx6P9Twtv|2tjAxDeUhmJ#8PM5 zK4(A3L}<>O7(j=EDm(XP_Rr3FvqKR7c<$jbwjF1?)oS$2E~e}NjDL@P%X3$*$b{D!KEHQruO zQ}5D(q*Oc-B@x&(Z++b5!!O_jFj9As8a=|3&oy&$_`N|BP=|>pBoMm*%|MGueoE zH|3cfIUSXcgq4tuO(x1l!O;vXsa7pkzg=rhcjm@s?au2?$)o-7l@e)Ic0#JXNSwf} zJyAR%<;&ILR|6EJA9i?ckCjXNJ}|dsMV1bO4;R^oR6p;vLF7=yX6JQ`L3U4V=4FYS zOQ&Rpdrq(=1JtN)QP6HuZT@Fd?8D8D9Rt*utxGIRk8(Gr*s0CC6wD07kL$HNoT}n{ z{7y^9&EDK;HE$z*A_+t_Gt?^Dq|yI+Nu{%hogwlA^d>iZ7M5VVlZt&L}C zs+MDgR@2RWOyl6QKq)2nB8^-_b1a?C-s|sGmgupD6OB&S$Ke@1EjE)?NbA&VY&5l} ztypyG*)etLbQU>9LjtS7ip`Ka8aDiZr>zM7=GLgGx;9eiamlt^sW~kRA)NwbGUL69RB-mlSYW+*EkLya(7-=Wl8|bf2xL#&aMVMqLitH1 z)E`45aXIN-%yl*oY!+!-?+69)`vs~!$&!0O%9~ISw3&2v*5@Pr8I!&_ zWiH7tB=(`Nyt)V%Qp@ zQsZjS?Hxl=-3U-9E7P}6utZLjV~I6z?_(uE!X=3<2%KQS!+T=4zb?l-98wGbg&S#+ z`v5)wA4x~3(As^WlrXPeW#P5xz3GC1xMqgKYF=(8um05${PPEcX+SFINdV=GRPVp+80~I%OA4 zmT#_|V$p%hsU(tb()aY{y}r-;p0pv(PDU~6lS;+&0pv!iWd5Qcbb6K3qiG#Fn|*W# z)vMU==pXuvdNWaNyn_b(Duzd)D5U4}xs-tuPDZljog~?pV~s64V~8IlQf3vN>%|rZ z@QU>GH1{zWBs4d za4d}*0=%!II##;e*lZwwG)-P?JRw?YgopP^B~7@?Uzhh}hezdV@5oXiw)@nJp)D`6 zCQc<;ux~dyN!XzR_CH*pM8%$#OV`VI@+!4%3}ZhLr6BVbQDOH@y1s3Qxc8Jb&yI@t z$!;hcocQho#3kMd@3lA`G^GA;lg-8oyY%uqM0`8ing{>VA+u4R9v#-G)-C=}P(hfZGZFtd`h((DII%5#n-FzmbkjJ`^Gh9oCeHbRXS#Fokrf~_*B z2^z=zwF>~5N5B>-b*ldi`-EI~$|GNAF4YDpn9gg$oNEowAEO&$ezU)h&$gjgVQn>e zsqV}>KW@L|64aKIu@dWpf=?G&@;K?35(dCNC?t>byIHhmMoPxIlqk3_Jf04xf2~@n zL|8+z6RqkiL!)-J!e**gWz;(wr5*@QuGOj>`d)q6RR2AQ?id|WW0f8$jqbfl6RM2( z0)KOq_JiHtUxH@UTf04-ej-HNaarT%H1+DHwH(lI`B`3n@*(v(M*`QhskA-xve`@5 zVHU@*qbj9|7&A&`S^}8l?!$Sm-&F#q$f~T`F7UMXB=Ai3OC{#2oIb5dyO?w-mG*dL zKgGt!v(3PA^KHK$h@-vO?5Otr?KX`F73RcYK#>$o3Mi5Y?^cJmKNRmwyWHej;)9fr zy)S2<8cx}%LV44bc8O!`LLixgpPawZ@!B)c;T+M>GcnI2$IeTIj_8RHOTe5S00T}8 z+@|mdka{uPs}9czy?Pj?2_1XG+lupTD@{r5${|DWMta;vNskE7AgLdPS^1E@Z8;*U zQNG%%nM1$jVsK2==RR2dN@pqVV0_zEd zzPg5AmMsGi)m{LL9i{2&x8VqjrB_@kziKOHw#_-j%(iYtXQa-09j%Ra9keMkCKC=h z&&~yDpW#_Um77s<8$hQOs8?SFZE66Qtk@K`25cpHC~zVP{w|yOr6Qj80hrO0bMKF( zsvFhF3w6u+u_S|^vMUbn`WyWn7m8*GdILzx^^SnJ1#24`=bB6?yt-1uS7PAw+UVlp zU_NQb)~cW`FCkUS-AHL4?RF~Gri}#d4zL+LAl}s+T7o1!=OCsMHvy)c0v;b-?-SzE zs}yQ8=-kʸ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 diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/core/PreferenceComponentScreenshotTestsKt/ScreenshotRegularPreference_Dark_d19fbf1f_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/core/PreferenceComponentScreenshotTestsKt/ScreenshotRegularPreference_Dark_d19fbf1f_0.png index d392e5abfb85708045c980a4e63bbe0795c4aee5..ce33dd8ba832f3f7d4e5b1f950cdaed70e636f38 100644 GIT binary patch literal 6512 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 diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/core/PreferenceComponentScreenshotTestsKt/ScreenshotRegularPreference_Light_b29dc7a7_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/core/PreferenceComponentScreenshotTestsKt/ScreenshotRegularPreference_Light_b29dc7a7_0.png index 69b55f48326075cbe60c7d7e3eb1f1778633a48b..6bac5a2bec57426063512341c77a068b6675dc74 100644 GIT binary patch literal 8156 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 Li)%Gk?mYS*YN959 literal 8246 zcmeHs_g7P0yDbQUpaBbrAVma4ETBRt0YpHlZ-NpPL5htM0)zmeg=V8j6X_u|DWOO+ z^bm?Dpj08WP=eASfD)vIn7i>i-#6|Z_b)hSocxfn#@KtW@~pX@Ip?#&Z@~;e{9^nZ z92_7c!y9HC9NcO^JMI7v@Q-|1P|m?2#WK2~bH~SKc^pwDG%((Vrro#8J)iL5V#kMd zqcLN>upbJ7A(=v_Z?qiMkr$B+dtUQh;S^eDzt!P4XYx-)@V|Ti{B&kmSo^!MuczBj zpNcqV%>88}Pb!dcr^jOlzmSr?uz+2y-EP>rvyjGCSMttN9GFveP^Z(_f4qT70KZ9M z3tj48&8?7NuD>mxnE!2X{0|O-jEwf~Prb`dl>GWyk2wf9IBIDRk{svtnqp&18~;Gm z=w&TyuH@hM2s~xzaSD_cuxVX}p3ExeO7Ac zPQUoX0}`WbWxjlN{(LhAUcJj&4HAr2pG|IeSZn5$Qo{h<8_ueNdeA(h1MhUmEPr!>fAwV6h}c;(j3Gc~S1 zx^UnNAGD3s*$2$28&d2o12@WTgClN0?|1k(4G@f3^0CN_pYAq&SaaV;bndx;*t{-F z9#v1$8OM>rpOMivWU2gLMw}M;-kfc(g)iXU^jt~HDg+giLw9cTm8AMuy4p9WYX8~F zh98rIK1j^p>$s=mn4AI6>Z|n?#>1ySi)ZA#pwikav{lWFm~|$uF{qDb(i|pXHBTO^ zKzQW1Zmyu7J7i#`Rk1DaCA94E{RGsab<;P3X-50?v+Iluwr2J1OzRBcf9*xRvh+<{ z6);S`1*$vcq^Qq@`ZDAq(RiPLi#YY?I^*=Rjo-E~p?kgi`K#C+Vh{PUn%krtp|S7e2#=F=KD+;HD5z9rWw7h=$9DkJp70ChNkJ&gK~Q9|xugjtI`) z4W3G8uEbP~R3fY4@G$cG&zqZdHv7ewN2_}TA5trkNz9RxsQM$K!~Q!91Q^NKnOd>X z`}wls2~}4sh5Hr_{=ROLP0x0xjCc!aLF|B^-wdQ?TqeY=rS3*1jwQPY&kuuN(MO1K zThno-&qs(3ya0qjdC=73{#)NenPTO=e@MaYY+^>UZEEba%1R;)yA@uOu`i6`7YtTiGUAds$4Azu9NZPT4!g z<`ugDSd69CXsJ0ZtxDJDwZ=$gEIsIXWCLIOEMhxtn{-W(6l3P}1H#F{allU0&3UXw zzFK)I;Y;a$A}!ft{*R-bMO#M+^Kn4gVt>z?7kzkvBJ{X=)G2bD-c~|h*=b*G^xrm! zZ9BMM(q+^(p>!x{G^Xv_mGW5+kiY*M_*9(VF}L~IQSm0nC)Zh4FCKY}d~FfbrdM2Q z8$~rrD7#RV*Q~N+Vl=N-^M?Jo{#M}5T_!Pub1e~^kG)$y1HZU(@l#=9{7;8xAipZ zgEjiIaP70CaTUI_I>cEWxGV-*;XP(09 zF?W-kjiS;9cPIYZ$>#^xTwv-m@xv%HaDTQ*l0x^=#XRrT37EDD_PVNLZ|1|14|dIb za`?%0^RNk1Qjc1;L5vqw#G^-RQ;qgmga`os?e`eOd~X&^>eW-<@jHv;&54MYfw}Xm zh(EjAFl}_$h%5Si=`jwD zV6}lmY87{;7Lg=~v<`mGAO^Ej_PeIQA*bt;Q7Hs09mPwZtIm*dX^IWel_0K)D%q<8 zaS-7Q<=FsAQq%p{zBFgBcjv~K9sp19idcKb_6Kc&0+nR#umQcYMic>J$*;W91T?E4DRC;kU;<);6DpRldwMEghQfr64COCYu#SfIP zoZ2#>r1K?zL%OW-lA>_mJb8%eQYEVCQ>GMlmu

sRO^N03>AhME{eJ{oCib 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 agsrbYFy`mMIl#aRGPq`ZHBZOxAO8h2r<>IP diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/core/PreferenceComponentScreenshotTestsKt/ScreenshotSwitchPreference_Dark_d19fbf1f_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/core/PreferenceComponentScreenshotTestsKt/ScreenshotSwitchPreference_Dark_d19fbf1f_0.png index 0f2ab597616bd15231bf2abe61e75ccd3d1a61ec..7c0aa30fe5611d801082101026629d3e6c58060d 100644 GIT binary patch literal 8008 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 B&6@xK literal 6712 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 STofP{R#hcU#j;0FU;G~^#1)DF diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/core/PreferenceComponentScreenshotTestsKt/ScreenshotSwitchPreference_Light_b29dc7a7_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/core/PreferenceComponentScreenshotTestsKt/ScreenshotSwitchPreference_Light_b29dc7a7_0.png index c1b4557551f8f9eff5fd9b1178c3129ba17e8ee3..166d5cefc217ede38e87d21904968e5af3a5bed3 100644 GIT binary patch literal 7796 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 UoegS!#Znn7GaJ)#;~S6v2T3_EWdHyG diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/core/PreferenceComponentScreenshotTestsKt/ScreenshotTextDividerPreference_Dark_d19fbf1f_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/core/PreferenceComponentScreenshotTestsKt/ScreenshotTextDividerPreference_Dark_d19fbf1f_0.png index 4c45f42be8e8ce25ee992196f0c98aff737a7844..9c007bd1354c8dc020c5ae02dade032cf5e3f424 100644 GIT binary patch delta 6099 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 T*Z^+L9VV??dN+&Jte^fL;EBjP diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/core/PreferenceComponentScreenshotTestsKt/ScreenshotTextDividerPreference_Light_b29dc7a7_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/core/PreferenceComponentScreenshotTestsKt/ScreenshotTextDividerPreference_Light_b29dc7a7_0.png index 01537fb61567898b92ffac28a0cdb7f606b2b5aa..cec1b87b277e767ea8e3741e8b4d9f5e6dbccdd5 100644 GIT binary patch literal 7055 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 literal 24335 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 NXsheqEmV6L@*kU(A8h~t diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/ConnectionsScreenshotTestsKt/ScreenshotConnectingDeviceInfo_Light_b29dc7a7_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/ConnectionsScreenshotTestsKt/ScreenshotConnectingDeviceInfo_Light_b29dc7a7_0.png index 1fc10a657fc5b883afd4372e071045a0e1b19d51..573d8b84d49988cfb624ef4293e21b22b5cb639f 100644 GIT binary patch literal 26778 zcmeFZ`9IWc`viMMXug zrg~S0ii#RaMRg+o^q=4gbdtrFipttt?XKd(7p5!Yp2d(y2ix99sUf8yX*W7{V^7Vs zgz5{kaL#FK_+BVdxN)KG{`HM3x46VYPJep&_5PJk^V4G7w`f#PD_v9iJ z$r@HUII6KHk(TX9I>`^DV9V zLiMuzYU7EN`S(+|8Rxq(c1gZlkHrv656diD85W>@f!!W+|N5zs*{npzTiMBeUMU-R zg~{New{G3it@kv#Cf5TP7^CDvR7Weeht4dqp`k=;#8RML_S@s+m<|e z@+4fg@74d@I&yCnhZoSN^_cL??yn4|R*|*2@4SDo=I_z1f+P{N7dJh z)c;BwwMzC?UX~`6_jhiQh!|)F4Q8!~_OZ9T=u=JmT=@)yDJZXi>XOy}f&T;A5;K=5dvCDwp+BRA+)jM{umG%>3?sE!m%Mq&GUny8Mr} z{S!}~lfCJILDcylZX_r6YbnTiBnwI$s9#4E<+=EJdwHQ>j8-}%GO_8asHm(?pxyh_ zs=d>f(>4am7I>f)uQl}b<8>wTa>=q^7JZhTYAO#7T15Orz0Pem>|*^2kC;cEMTrmL z8&MEgrx;$=vK-c<<+sjMc67M6KsY+wZb(l2oOAxIVnd<}@F~^c?SPY)XyMNLP^EZh=W}+TrTrL>)aPM zr%ocW?8D^Y7WVnp$|&4K`>vXEzCp>gA;TLr9Bh*I&V z_hrU2tZzq8=jzg=;sJIF>;MEopw&QuMtx=6xrrXmX1+O@^sFN;JTAf&q_j`Gl<@j- zEj``@`FM3?++&i&9u0N+NvAD`9Cw}c-JV04y_gQ{E^%dK4`mUNRAF~{qigl>oa~R6 z;E$KaFTDR@|4QBV1iVgr+`V73x;x6m<7x{d`)q532kKrbsy9Kx4!yOX+j|1*yVny5zuTYO*^Pl=YSMFu>I%P*HE%Wc5{Zf46IdSNk|PU!o=-id(?`z*jFU6xRHxYP%bsdn~Q8mik8 zlnfET#Li;uthoAN;x@7M=~$HuSdA)DB@taio~x*?miE}sFY9(i#V1U?INVuqQ)(pb z&h&kco1Qk$KD@)q%G!A~h<#?@(HVNn;YdeZ_)UE?-wNHJ?{vF7@y0XzvJCV*`c@N; z{kq`{RVv%x<`bQe?Q!Z5>2QluqCi%{b`9&WR1S5Je2{#EiI#xhuO?33xTgg%C4L;S z8I{YC(r)t~j&_TVT>UtLvK-4RDx@8h-@jeB&6TlIGt)Qlu?#Oy+^GihpbESAI|nG~ z{#84hAn3?BoR;EJZ%?DWlL9h_!qI;3hm=6LhMMy}$;sbssbsOEROY4ji%>8btheI;xQpCMp}

;b7yWi6_Jv^}edXdHF*%kZ!)l<2H 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 diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/ConnectionsScreenshotTestsKt/ScreenshotDeviceListItem_Dark_d19fbf1f_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/ConnectionsScreenshotTestsKt/ScreenshotDeviceListItem_Dark_d19fbf1f_0.png index d212cbd29989a2e861783de55bbd4dcc3f5054a4..4481d90e04899680d63cbbee13a23ac18157f636 100644 GIT binary patch literal 12583 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 literal 12590 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 Ah5!Hn diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/ConnectionsScreenshotTestsKt/ScreenshotDeviceListItem_Light_b29dc7a7_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/ConnectionsScreenshotTestsKt/ScreenshotDeviceListItem_Light_b29dc7a7_0.png index 63775955804a1948881fca699e8549abeab701f7..3c6f47d986aa91f7c509a1c4e6c300a4ec9de949 100644 GIT binary patch literal 15345 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 diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/ConnectionsScreenshotTestsKt/ScreenshotDeviceSectionHeader_Dark_d19fbf1f_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/ConnectionsScreenshotTestsKt/ScreenshotDeviceSectionHeader_Dark_d19fbf1f_0.png index 313bda88bb3167f5308bbdb6d2cb392fd9492acc..c62dcc3f79c18024ddd15dcb95a578bb2c102db2 100644 GIT binary patch literal 4203 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 diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/ConnectionsScreenshotTestsKt/ScreenshotDeviceSectionHeader_Light_b29dc7a7_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/ConnectionsScreenshotTestsKt/ScreenshotDeviceSectionHeader_Light_b29dc7a7_0.png index b26931092b6e043a24cf6ad1ee6b8fa821fd9450..db9f0c3ece87a09f3efbfaf93ee61b46023ba7bd 100644 GIT binary patch literal 4834 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 literal 4706 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 diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/ConnectionsScreenshotTestsKt/ScreenshotEmptyStateContent_Dark_d19fbf1f_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/ConnectionsScreenshotTestsKt/ScreenshotEmptyStateContent_Dark_d19fbf1f_0.png index 86ab86bf355bfbebf11a505972f61b7984cf7b34..32fab55bbb8d2b04c669a85bd285d1b8c3ffbaf6 100644 GIT binary patch literal 23937 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 diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/ConnectionsScreenshotTestsKt/ScreenshotEmptyStateContent_Light_b29dc7a7_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/ConnectionsScreenshotTestsKt/ScreenshotEmptyStateContent_Light_b29dc7a7_0.png index 322ac116206728f8809498dba9dc96279d1d6150..096d5690bd4fc0b3f5a96714b41546c973b24f6d 100644 GIT binary patch literal 23484 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 PQJl51JzZkyap!*kIAX4z literal 23525 zcmeHtS3r|l*X}Ez=%^sW2q;Zq6cr6H49!q%h;6_|5ke70qO?$?hET);(q_hj^qCJ8 z1tCVd5CRg2fJp=mMIb>S2~7fo5FiB3ewq2d??30iI_K(K5kZ4uYVqr%#=@2thKY5VXl-;|B1F|IT|12y%IK`oz)85pI(`23sNhEe)?{@Aad_ zlwE(wTgCs@J0J@ho;QvKKcN=}pf40>o*)f=y*HHnBf&u82a;Hj@PULAC3!)T4keO6 zB8w!_P$G{dC4!_fl2k^L%1BZfNh%{rWhAMLB$bh*GLlqAlFI1+qB0unsig~BN`t>P z#R^3A+`xUi8`gDRKfQ1FrrqV+PW`nv{>RTVb5mo~Pk!kZd6t#*3^7eRZNrU28UDRp z3%^gv3#~o%4xR2(a_pjG@mnG2sZJp9Kxk}}8u)o6N(#Qz_${wt9rz{rN`eM(1Bq|^ zk8sextE8NfwYca)6-=09oy{mULeo$_X_{8uYL>xo%>t)Sl!dcqygh{-ocvn3@D-C4 zi+T-~m1X2q$HGh6@X!q31QW{9&6kEep2)~SD$??r2xCJ-e(rBUqth>Kt9yJ5c$sCF za=A%dU3Y1yA?$lo$m7JJLx;jWn?^=zyt~Q2A2{V#7*XG<$j$EUUG$EOtcmgm7nZ*a zLU9U;XuBL_Y)vnb>z?t%{6?)%&6k!>8hRxMdANWu*Voe8l|u?-&oFl&f2k|otc?Fo z9crlDW(w`9sg@ZTdghBX_Io(=;g1L+!gU=~`3E3_q-G6O(Y&35!tR8K0fLRqVjcu- z*c}KRIVP`RKG|Pdk+NY&v-eYk%R0#TELg*@91PQEehTS!=hlZIFElVTElm|8`Iu>HAxuy^&MjzCk>UugGnVPpQZj@fG*mne?LtF*>~{JA$tl0c^m>A zCj$vq&5g%(inr;v$*CW{<_>mq9AMYeIK_(nIB6G^@sRo@cJKsOoI#O+Jodm{&J(IN zE2t+-4lqgY*R4&_AooKCTFo@@U(VB*ilhOX!&TY2S#O!BTI0SC%{PG-1wlvQu{;9;{&N0^ zX<3neK>hFmB`|OLSv?&;RHC)rJ-GcP=nmI@b7xdgiaMtG(V3d@u{=3!2)x; zW0U*8#}`JYCfpyM8*C&QA6XBL!tN#8(}puaxV?3tk`z&O5hYP23HQY(+7{Qv&Flq( zDH?d?`zIf%O;}sq~&k5Sr-RyR55s}pF?9N zHj7h7MCZwtJF`>GX+scn3wW+w!_d%0LjpErv*_i^2}a!x*Q_u71NK9v2n51`F9i)- z13YyG-!&IAj^VUzb4=Z-nY~F5l#7Jb3K?OeB|+=rzA6BC-apRB$R=WCNy(?oji>4_ z(z37A)dgqFbRc~@#w^x>IL5VH#yFW2x$o0-kgI=ooc_A;-g#1LIrWCjoi(a^B1St~}E*N90yY>0HH znw|0X<`fD0yYh&Xlg29$G@%GqmB_)!#YDFK)l^utc(UWGc44uQ*>$V^GUVY0NBRk6 zy{$24KaXYB_|#wc*}`Jsids;6Z?GlgVZIUmnv#}ZqQv%}%rfmfh)C>^G90n~ar+vNpE8akN| z5Asv!VpN3+MtkbOMVgV^P^kf%aDBM#(U=bc@|c5n^COyOYo9!0Ov|lBQH|s_Sh%4n za}nzrs$nEfZ5S}+cYYT5lm_XK9tx%SA9sKT-C>LTksxd50J@dBlP-X6r4~^vFtRqn ze?M31pQ+zqR(}Okd!bCIYBw)+iDmZ|*FbR{KpHjtHrb1P<(yI#Bm!G34GNr?9~gHk zCjff?&$?>&rdr#AZTfF))k^b^U+g{qe6$0Pj@T^q_@>g(GNToA>toe_Hg+l))|99iJE1v^28Y zKQRE_lQl2@Gs{1CBT#kD05}?mOE3uH7gzkhclMLu`d3#(OJAa)RT~(j!wX&H)zQKz zE@PmehS4>7J>5SO3d25l<}wN z%p^0UJj?g8^~U=`7mWntA(}2b8ZZvXZXSt4Y5Um!sw)ZVbs6GN`xscvL{|xt@$auW zT#SA4Y^7~Z-Fd3X{k?WMcqSG$WHIdLYmqyLZ`Vt+Pv%#i6dz2xa|g-5226}Rk=X@# zT!ZKD9W%@*YL0ZdC!b%$QQdP-gGidSs4@x&&sqm9!5;i8-$a&lZqJ95(PJ^*-t|#< z|8Fd-EAal5VX})OiqagD=PEr7G&9~l4DnXtp$#b`s_hT>5X10uV{NlBfN+7e1~+BrWfm*( z5)#`jyfOW+IIPn{0{{6p4+B@0ANd3TJit(|rPa)$o;#D}$2*_-GM15z&B@(G-G>ta zoBrJ1-p+t?4eW%n)#1DtbkoOR1FIK6GKHU$adLK^s>_=-k{f?~_7W7g9YFH>IGL@= z_KY!{*L>plypUVO-SK$i!EQXOXU_Xy&z_V;BOnM^DeSj0u5qm6qfQ`3VC^+tQ~3#` z;E?IT*6|9zJJl6aM!!o#```f+$XDbkX}Kjz0++ATzh9z)a2+?R>I7(q0GT&lQIQsjAu%2b1nWB|00 zADiwaQ{xkKiq?z6dO(&BiJnD;a3(Js0vbiLfOqy$iCFo=c=n1|Ha9jMPZ4^dQdmT; zlTr7Bz;8=_q03O*j5c66x$Rf4^6G~fxAL5GtS@R<{q1V66RbyiVm(aJ!M~#I0E=Sa zRR$&}Cm-*tHbi2Bp@s#J#dpO6&*O{|3_%nn6j`zX5V(pufKr980NID`#TTc_T+bH+t@iKFZrdZTlE1a znw}Bee@}RXeqs7R`tKk-eMnC)Txl9BeV*VZn)<+|r(w#lo zUY^3P+{M?qur4=~eip4s)H>tG$W*J{yEfqw&`?34V-Qf@q0Q1R``tdhyri5BaAQok zQ5|@#27ojzWFh^-a1t>f6k6X-%YCgdRxf@){mh=giTwOdz<>3@bC3ai$s+I5orU~YfxTZ-v5El8b`ee z8tbg!eCT~?yI>kUa+B+qjuWMsfUpm{)xfk_Rddgeo)fEt&vY#Kc6(<7Nh<9g^;2RA z^8xHZ`p#faySAc(A*dLLo4Cu~-jxA%a=>p-!aVnM_?#T{=a1lEU_a1WTC&hbusi4m zl}1Yj-nZ7m7>T_!0-j8QVXWX`fOqJBUpap+tqC;$5x5nky*5!jXyNhH@7vlizXDkU zX>(h)f{9vE!9*!f!NNd?6a^4iDpzPDz$Mq(P~k;tz3359Wmqh|$$^Q~=(o1BfM# zFama`0@oD!l^l*zkrQEu!Y^%H2)cWG5Q191IOMewRvUgTD=)tc=6NlKS25X~rv|Wf zX!P9n=~D>IEAxO?AdQ+xe%IsvWAnfcFeizC_d~0`^@?W3;d?1?wGz25?i+l`Nm)6Y9zCy%;|0xgt?6BR1&Quu65~J8v;yg_jSq2WC;?L;BPMFhMAE2|4;ZqL7XAC$WGWqGQB+E;w zSEwZ}RU!=}5?ioS5mXmrs#P5prW%&fJvnCB`razud9JuQPvf4Z7=`wBh^bHAIoDGH zaIOh4PuH~SUBqpfF;_;Qe3X={VysdYUWKLy@#=NHQuCMJ@X*_gXEmyp%0gFH65?Zc zL*cKeSXkX+`cqXyaIAETGq!n$KP~e+=pwr2YDH!b5pNcC^Ucnx3r$OP(yz-vj?w;e zi(2d|Ws2iSTJdLf=iyeKIb^E_><#R%#}!6$2Ute=vEviCkh!SwG4$cWF%~S^mctV7 zc%YtNs!!V%zCFo8VW`5-yHSxMcwo26G#5Vu+H!PhKHTkwZN8bKMWwFW@!Kz^7PxK^ zH9O0)fYTS$bMLSBG}{}^?_=>)yE($$CpIoH<(Z>c+%pVm;f&7Chv}|#2en!TS!+=l zL+o4b=C0IcmFdRFx~+E5UGygV_VKdbG}#Q*3y-jUg|DhGRZZyr`0^Z8qHkSQzIi6r||mX zU?S;5%%ZN|98O$dg>$y3{Q3G|;-wiY;T^nv@_h!`^B`^CK5p-UnT)Bbm_;{1oo*7+ zh3t;SlDfhgLxx+T`R`2XU8pr#PAZQ>ZW32o=%N-|JGz6H!}nD(Q7N?h z7pvLD=h(3VaM+;|^RQ=KZ$*CLFW(1~(YK0Rs-JQkVU6zlCsE?JK)G`pR0hat; z{N>F_8E!EZkvx-FzZfwMQ`{VyXlJ zlnvHcT6~KBnoOUwnBv>vN+Q|!FkyMaTv9|~r1u@}=*srmA2v@igJ8BPHh5+lLrh;3 zAW6k7Hy>Fg2&5>bNjQdYdfDzFl@=bVj>N3)6nvSmauMqBTyT?7&Af<6?<3?iUfo<1 zCpSEnRVOZH-K3fBr=LnPaG4P;tQ4>o6V<+|vXU%~w8E1d77HVybzQLH zH{_RG#f;%~a0T+YhM{fwE~ddF5k{CBDlj(SNM;S2fWeJHXTo?w&&GduQZGSR>&1Taqx3E2}|nM9%c)weR;_2|hQLAa6C5ZL;#kJ#FlO@;kQgx9uVy z@_z9EVPWBlh=n@egfgwUxs?g8TWdyoHTBb#v{1GI7j5`i4oz z6&RPbj_O;wG|8#Cx-YfysRS>bq8StAfKaz^UQePMyV|V@aOZE}P)c8_t@$KoFmd($ z>N{l-zAxQEzRm2d@lI3E#xA5KqAc;w4YN{RB@}!AvS#$cX`=wcA$%W^j}P~yRcny? z3$GH_+vT`+AXkXO)$^%iMg(juYr!OD*}-TpS*k1?g=)EwHpZw`Nhy$d0W|b4{counF(W=%i{6&&%(lbKdFilP81w|1?%K zy*twz^?kgyWj>+slv$-Ntzk^Oqa{Kd3R%?faiS6^4@4t=kM-XEK(VgbCOB4&y+w`o1Vi^M(TU zlSkxtZ-hZQwq420Z{}ftZTW8EP}p&q$4me_C6#P`=@_82_(k|C=^oSf(Zn`an>%8I(MD?9uFITZyK{OZnxAD@at8lygje& zH>dDc2UF`Kz2fcDuC$(1G7oa;U=o7b+k-!xX(LKG^qnY2m6wENwwaIwJP(CcR1E2} zabVrtK(|Kv72a%|o5565x@Dx_GizR$X00jm&+vjaddx~OwI)QlIH>8T>;E9>RRX9g zCA@gxt2Z33v!H4@d8DStX@B5toJdZPnp|txUv1EB;;kL8ZT#J2T5|1;hb(tH-oWnq zl@C?LJb5kK3q0D6aP~eDDJ%70L{z@^d=~t-)6;oNicfNDaQxDk`^tsXqs@!;I|?Q80x^r75p1U64kB57Do|4a(D< zig#xsWp~N{LnRC;n}tSQt0`5{Y`FV`D5kGLA>-m)TCy*v-C!c}YxZh=g7q?kxV*9} zN;!-kJIo#z72l{GOcD}1OAgA;v}6}!9`|CyPNHlt$5`1m^Ky%+?hAb~X|vofVXLXe zcS9#V?b0>tyJ9z-z?;eiZ8(+P_adNcSA4TWSu%!L(eafPP%)y}fK*)(}y|GPac;QR!~CoaquGoCQYU8l*ehodO|EzVV> zlwl^avaZaAm#f{CRp^)vI-`aI4ghc8I?;0{Q6^|p7dL;LlyH756HWTGn2RZ!Vei_o zNsUeSKw7zEN>lV#mnnyVRjxCA-Os1h=IfS+QDUd8xtyZQ0uDamaJAwFuak%1C z%`gERatg5ZK{YJp zQO4Wynf}dsRx!~BIgW3O+fNGe-mHKR>{;%=^sT2i-IEu!G-v+6ep1qj&9vt6$@D6b zV09UAIrnu^RgEgGFt~^RI5|_Leg5ggwd2ENOZ5yzU#< z7mr!~dHK=9>=%^-r-HRN=fSDCp5TuOeS0CO<#^6t9k{%OE97Szh-eKptC%-Y{XSnd zq*V`}3O{Gw?UP}$#nXurpv{aFhU4&KnydYnQg?j*6PPZ)q}UNJOcgh~@PO*MxDrcy z0Llb7Wr0(bwUh$oVT!Gg{73KyALi;eSzNk*Z8|w>XiA01UzrkW z+Iu;?`F%ZI(`um_<7bXG^DZXeDifIp)x4jw5NWPr{r;>eFGpE;8~IC9bn=&pn11q< znDOM%2Nr4++b^pbgG%k4@)C+Q>pFU4wdw@z!Xh4iWG*uVtXa%jChRnP@psS@gtok% z?$|lL58$~~dgR6b14>oXW6Rg7Q+5)&zEcZA(wJxEJQXRj@?9)>EyTJ7d>*ofyni9c z=5}!Zt|9SU{YuY~3aa`~ZD&J3T6##IsnLtBDDyZ#DH&OsJI7VRv%4Kb#^-wLx#Oun z@QADTe3qR7xT+=`QHzCWIl1K686I=j*U^qvpAUdW@i?(dIybG%T}ionm6&B7RKzoC zzNQOD>rT_Vg5LZ2zPu~Pf?93Np8t@Z#7bfc1y7}H7DeUi|3$40-cmOER=r5w&hgr0 z_j6bZ2`Ez}7J4}Rc8Dg+zQNXvnY#fCgmd?pizI+oNzMCY>+3aNN1`_8!7RQEWMTEx zyYVGKCaqr4z!H({G+`Rre8sqUKs@~J&RNDnMfp~>-ON~CPdH121Nxx(Y(_TSO2ETu z=dH|!CmQ5G_OsVv-_aiLs4S&X`8U&9gt5lckn>W*#uq zbvYbPww;yOhKp~9_1g32rI-1oPf??H@fQ4VKK)T3OL}5bzzM)}O!UD#dLHqkaK-b2 zItjBnlc^_29WWx`v&wvt>8?3jFV;T>`)|6B#gR31*n12KyV21^HRKDb44j{b7UnGx z^F#ZsbZ6)@{Qda_6Q@Dm{}k1uelmXy1{ zo^_9`hbz%6j4rsedmUB3Z8IBGOKrnt>)v`AutY0;2P15A%!xy63xn`FuG1DEp4!mv zcbX)DVs!`svE*~yZhOkt*@s^RTcvXkx;W#iJ-gKnW1@T1Kv(}sH+bVfpE(iN2P&- z<}9ZZ_$nut(>2`2$;nio4^cqP9?MZ6bV^0-A$TlL7uXe*={uC=QV?1;k&oXy520hn zKll3NQNQ>NZfsic3yo3IB^Ny+w~*QDPx5ZUpTRZm+TlR4l#So}1p&xsCXRg#9oskm zzAzC{^I|k=u@-N1FI^3B&z1{ z#d{S>i9x4N9}IAOTlZ%w$OgjPUxxHL*}^`RAAyA3vWLm?L0>-6v+%XpYOFu6JbE&! zlHb$3M?{Kn_(RNoR&KBEx#=@ zPn;VSGi^7jU0thZ5b@G+{tDqHrV*ppxuwdxS0aBaldC+FW4|rq>xtJ%;@!6SmQ~|> zpJXe=c~V6KX^p@X>;yH4>RpHN?BtJq;@vK zergkZG45fvMq1cg@b!3)BJ8;hd4u35G%o{dz1KQxSLGIs>%c#gk}eX&Bn|^2K@u+j z1PNUL5F~5~K#(L0Nv@Pg1&LCE;v_;5u%SdJ0}v#Y1)LZqLJ@!<5sCl=iBN>&L2{}9 eK=^+-R8ijYTRK^$#YhQ8@wBz=iPB>pxBeH7aK4iO diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/FirmwareScreenshotTestsKt/ScreenshotFirmwareChecking_Dark_d19fbf1f_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/FirmwareScreenshotTestsKt/ScreenshotFirmwareChecking_Dark_d19fbf1f_0.png index 6cc3826f0c59edbfebf1fb7405079e986d52160d..eb0889444f067ca486086d1b54f2329d34991864 100644 GIT binary patch literal 27850 zcmeHvX*`te`}d{Nrjiu0mhR#XA=$T5QX!SHhB9`>5{B$)k%ZiC`&JTR&=@n8v1V%- zrpPe1!BmzRTMQb;Jm;m~@AV8EDJsQ``$3+27b$dA4tEmLDa0 zrg}8_$^<&}6c~Dzvc?5|y=)r+KcQcH_JN;ANSpuI^ucBvZ05oy9&BRbCNFH#;ie?m zltr7;a8n+GEZCF;n?Bf-1e=mzQxa@Sf=x-VNr#(~U}TdHH|cPb4*w77Frs}plye#N zZTUS%a1E{E5}-1ECL_Q(0EKdXeXsLKT8l{@QfG|NBu8k)4UTW2szWkHDd5*=`GSO>XqK<{tczL6KOn$xXt=&eA1uwKCzu zgm)U=EC0ALCJyzC(#&rebO!19Pmnn3D8?_h#Sd@7!x&>1GwODb%9a?q1^xAO3!D%A zfm=_FSkISVu|1LcGUemk(8PsCE~o+*I9YRXV*k0e(gdvV=!Hjz3iP%~9@`=R7C)_H zRbttIwW@G1USdJeiJfXtM7yjtrnPF% zW7cH#bcRZaR6fXib*^xq7@@o$vmA(X8(MN(k94H0Zik#yxpqKAzL=C!FXFdL43kjwW=g{ zy!mT`Q=fOQm`;Ad$P|5@H!M!T@QBbu8G`|4xX|VKixKZ!2b$bywfq8Dr`g@j*Yzy6)gQKCbwPt^}w)If~^7A_{Tduv% zYBlUt6;L*&(*1;n@BbC71KoKCkBev}KARk5DLegz9;m9+Ks0qRs-0qf^Q4%I;6+oH zuDQ%k+>cE=Gr7P8Jv;}NzEyh5)2!92PWq^ZB~i69tLh+Yrr^S_@pL#Ci^yoIdISb@`ayw(o?i&rosdZ%il&)3#JR=}T1pY>q5M&FX4uUSzAS zjnit}hT<6NP(-&OZ0Rrjg;+7IuG|`PjQ2#EA=!aO@;5a1C|WW(A9zs3OH-}DsRe3$ z35Qxl-{N?rx?FDXA^O!+8-?n<))(`SU+S;pWVWSCOs+tUg&WIw=l&gy4xDLS`RHC$ zqPfr9S=J&s*4UkgbX!@Dp2^VlOL(yr+8zDH7cgH=ouH%vyp z-6vixt2s0D?6JXPQOJ7=M8U|xj4M@qJkjgA&eGY=Ri2tSmn4pL7|A0#8`*@&m8P(z-E zuM1K|yr8W-DWmv&dl|9QP*ufC;&ah!>b`Gs3)c z4+^Wf`*SapDGcZG-IyryttgY*S%>NqT_1_Wm^sjVf@E!LO3Pjx^OS$)engBHO0|VY zo&%mYixsavBNHTbY*5IE@7|&>;mYl;K5}_9E~wi89KVt@evfg?&__|VkZ5m2gq$V5 zUc+y#h*4{NqV%z!EOdtjhwqb?eWI=jnrS;#1$L@#AO7-dZ>+UR*Me%Aar0}61=P5> zAGl=C(=64XAzMGcwHu=s&n1`keKY@n3F#qwfLW$MCM$FZWLFoB`wNdHN9o6yJ0leP zB+-{hKO6vjc6F*j3R^b@EyZQ09Kt2e7l&1=?3MV?Iqm>ZBRh60WE2YyI{#}CZUAeK zI-T)^*NJv5IZPnYrrym^WgqlK7XYqN;{AmbvmNoa*@w!r80y}hD*Jv+I%|%6J(i+e zng;gsQWtj2iHyovM|}?|z9$wjcb5R3l#c5gs3MhucR=|uu$3l|2#Xc&S1MvlE_VA! z4}4M{DEA$@e0vA*y%Pfm5HGvR;tD*$H)go36AB}`hAn#IrzJg2f9`l1Q1<$4)U z%tfJp;+i~8-<;MB@j(r1TFT6AiTE4-^1;QLcP@kf?61V;(G&=Kz@&Hfiu!Q@0h?Ms8c_+uU$zQ*xZW5*7NRI z#Z+sv(&1zq!7Q{zoie-%BM^(){p$D3%wFKJ!5oTZ_|N>UQSzOo@hJN?gMNwsjIaRg zZuT5i9`YmEW6#fg3+rQbIvSR>exb0_VV4Cd)Y31RJ;n1k^cAqv2JBP*UDR-O?w)Hx z>;4%~bH;1^n*T~mkLA(+&MALQu$BR!2(oOXrk{&r9A%+JJ+KrTtNI`{8NGqSnnCx; z5|V#u27WJR1i3o9P})59KrfZS@%j~}44A5T9RA2U-*-kU-9~;IjsZF^Q~@*hDOgCz zoV7lzd*2wQYqahor6{svuaV}Cj%`~aN@1>nS;eWk^}!fo^hOLlK$aI5gCNT0)O_I4|HaXkEVpST%dTuZvdc``v3&>$v_z z)(%5+&(3F^sN^#7PFAx63=;jmBZG{f{`yr5ovLy>b5vDNc zA@|;*NtJzk|J)2eBkJ{40z8K03KD>*4$tZSXdHjnIs|2EfUtEz0I6sB;%jHup^WnX zc?dKR{O~YOiX)o~QuBw+w*d`S4$Pl#XS@W~Yv3b}9knqiS9qNS@W&|>48&~=jH{D^ zA10g^bo`%(Gi+z)yBB3Pg5mv5SuNjNIA7{KgUS`LwDG0-hk_2^b4`QJPb@uMAgl|5 z7P9P$>eq%iWux^`oSSt&<(6*(Sad*gML5Arr!|hoV1XSZf!)>l&BkYXL4rrcN*&e7 zU#dIO2ULe9eN|7w!UGR2 z=w;f5&03@^SleOEFh{cB6iB}OpjoN<9B#p(6{0!knw(v=IuIBxFw&@~cu;a4AD$-K zRcXy3=6Bl{@Yw(>P*>lNYKMn7YyYqL|4 zpR?1z$PL(10qLH@eRvwER8>0f=+EBpGd%Jq77FFrcp&o}R0RHjXn(3|_*-EBZ30de z<;dOyw63fjP8}XuPvBq_>Bq!){s6XEi@-Zqu-y+$JmvM?zxlIMxP`K6$7$5!C&^wP z070FAUAGTrc;Grw9Up(Ppl2PeUbe+$JdRiAwwz_nssECc1}J_0;!*0i1oEFw8bnc> z!#{yo8%*8;nZh);FS)Eg9bWs5mpAxFErjhWeCe7qp8??2!34I0N3etl#y<(La{0Gi zOnY?-4y;O_6x8G4{@DTrn6_zlwI9v04bLEd%piO3#ehi*PJ)l z@n^o&+7Cm38(DQbIzRq*v4Sx5zJHDqkh9HVI?t&44C7$D*(+bC4ftX4B1}V>%Y5GB|sjM3VCHNIM4vcrc73gEPrDnib~L*`e*)0jK{*b|qvs;$91brE)|ze{)D;s8C!LmXOpyT3Q zP{x8GAOCR_DOXHoC(GKHhfXNzb^=Fv-lw%=6`_b3n2${08XG)hyggmnf;2MM`K{j* ztULcuwq@dbxs;Zw2*{ibNmk+6Jq)i4lrmsl`!ttCi?f&isk~J=^!qFmBfqA_bE?K? zwmG~Aq-;j)-alRoO;-(f^`BTtf>-+rVQ#h{c#72a%0snb{k5gV*Z7oLRw$+K&)F+* zXFP%VG7;t|Md{vRuT=+un~O3|5AtY0^lgaL7TLIm1_Zm9V;0_iC^bLEFWJ0_-UZJf zYZV>niwG>K*A^}!LxS=WLB38gF;on-tQhzp*{AMauBo#w=0y6 zc-lP8y3qwr24b|_4V2N~gXf^keyIuqJ@qao&_z}<{fST_-#zG0QWu={*qX6jXlOtD08Y4q z4`i_@Ec99g0gP{;^HylY2Yg%YF^Zv`z%4Xn1q7FhxRQ($2~Y^uhk+dB`O|1A=)0*G zha|*1(G-=)Ug96)!exaBZqrL>Imnv@PIlx>>Xi?Q_vRwqM$^bYQvU`z^erkrGf`~0 zW~Xjf7-(O>#NX{OUY}?=I#_bPy%e2XGME|r@tdr5^&8k*s9IB?*h&TDP@i{0dkz4< zXI>mw79~9!w?$L!Pc->a0AXs@XMuot5z7T->cH#n$iGLpA_TgRR^`M~GVEuFO3qv> z#V3nM&Z5Cp>mXKHe^hQ}D{fwvit?t$8gGEZ+U^4BZ}k-1S;Z*^!*A9Z7ZJX9Pit^>^q=Y1ug z+j8i@uO6Zqi-AlxM&A#o&!D9OsHrg`dPsdqqDES#C|DW9eOrkdXv@V~%1$ay^n!+M@qL~rR$8FPxf9;+ zi2cyhhX$ueyJrg3yuWw30SLkt-HA^-gpv8whmk2?);tsyXG7U()HMzoIdH+eTLI{F zx7C?Rf}`X6SD?qMxt#66sJ+(~`Gc~suV$w*$ov)_=rKftI`Tk8qRyZh*7b;yD4ks+ua7L!j`S$b)hSrTNob(-LFIA@;Xb_Bw*~qEcTdm?-z=p4IIq&IQ|$5TevG1vLcV~L z<>I8EYw$velHrP8J~;ahZ(P7)E&Ap7bwHxGkd&~u=?(8{Z4l5#nV?{}x1_JnBGq^8 zyRv11u3+nyH;M>EQ|=)O2CNs>T9z}!lLJq0h#)_-gX{H(#fTF7u z6`R>(;lbQPcZV7?;p9^HobO`xJds-!;Ym!!+ZxCU3Dcj$;F0d7dJszO2Eo>duy;<_ z$pgf*tr&2NfOMwkd^##F^A@tNw!x~#-c;FZy^Em@LB5F~&RpokSIV&eV}}d?uUp2( z<m7GmI28J%&{Q(Oca(Uj3wC-EP zjyhG^7H5~neTdm;4{|ZqUw5BqeHHw!qCa?U?ILxW5O)i7^xm443|!yKzVBgOy#=ZR z`2_xJ1=P6t>;D%Q7$wRz2NzWitq-@?PPAoUReWy+d3e@NCZqQjkUwJOOLgX&2*n2V ztBF(Q4eRk!;|(haX5&NZTicLs87!VC-aKFsa+OQLeV1Be zUzOXhdfHabs`jM2YTCo7t7e>a-St^Sz4xrH1M+9lV&C9$Ynd}L-)%V?GgZ4FPg>7% zD(>|x90r9}k?#5`$5lg$UuR`BxLk)QPBS1e)wvtd02qJfNomd3Ol_55-DD=_tn0|k zy`SYwHxvi!uv@1J!+&SGHRb-W zdFS5XA+g!DJLD+J`9`jdcTzw9P1tGx&vVx7oByvbz4hkP657eJNmpV5A2-vw5K38G z?Z1*lim7W$CdM>fIz|3NKPE3|oyRWQhRUn6QZhB`8En9;pqG|q|3;6So7=L#p(U_U z5nCfDpb1Dk?8Ea(KAfprzNJj$>uj`1&_xv|8>QSlV+-K9u5~PUepOavBLlEI?LYy|vR~m08~!`Zz2*4i@vl zUJJF@_d8a;XFkWr`cqawSQU#xS}!SNlfr+`#_DN{1?yS0@al~!NN?=Mz&qyCcNLGp zuYUW+SaIIc$aaRxQ!WGHTI67blKUSUSX)`)^v=PRHr4QNE4exNk{ErNhV?mJ6=v`R zol5FAz7(@^PFi%kevn7L=E$9U?IyN;e*1KO7p`Jeh+zP!oIo>8f!<0^Vak)J>|vAQ z4r`R-v{kgS<~mcAgDvDF=CBxOoBx?+n`ptXvPoc2w|d}m@a(64g;k)lQbA|05iP)T zg503S8IV|~PN99}JNo^9kt^#8iX)H6jSb*3V!9B=M%0-0d(&9zfxW>x$+){q0MHaN zKzv$G+sv-JbPJAK_#Q(lrD2*oTJNKoU)=a=E1sJ0L|JSdog@W%GC!G9t%jC<2AHW* ze?6HhD+~8g4*QAcsLI! zbl6b1ovvIKY{)bZ4@J;WReqUaJ!QBR(ZK%hGA|Y(EiU4i6JGz0K+Z1AR+F`?mhq0x zp&eL!$?dS##PqnY0ph=Xy4|1YN7Cb$`2&e9X+eABSqqqYR(ip$ z&*o@S|5o@F6*#E`gY`F)F$dQV;hy8=Or}t(j+Wvqd>sQOd2qAnp#lU(n-*nf6TB#$7E&B)Xlys-KwjiS|?v_7rmaxnd;>vFx{m(5yaBV?U&z-AAk0dH)O(;5_mK+zam`zs(&M2WmO%m zlh^HVjJVH^;2UtM(u9LOK~E0A%@)z{`}q--ZFp4hii(IC04C>`0LRMJ)sDGuRPTD~#;2F*G(#{X%<Rraf1>i1cq-X#}lqma~F*HCWlOKr$|q zDkTNE2x>g$^RaI73R^8;goaL!O5B_c=12)+PjxNqm(;2mc`t*VpXyrZn!10&h&VIR zTewecYWDc~glo`1cPXt+7VnpAT@h{F*)9d!dy_EMYFp@%>uOcJ z_OnMp11oyjc*9nfgeykaJvL9Do!eS0yu8xujCpib-veFDXIdiF-zK=6+L184RiZ(- zJ#>AN7=_|C4)U<#7RBs47b5HS}GnWSPyWVSP3-EXKD&Ex~T_@hV)E;lS#9lm7ipq-mHi<Q?+ufKGSNj_T3p7Sj_lJvM$d~$c$b!-D3Wrsktn$KrOY$^nk5IiFY8eV!MA8bs{pZVu=DU$VAX*agw-OfqO<*jiR#jkW;AHASR zF1qIKc#_M2cy{9Eqt>!2iu%+wwC*BvRy9_af zHPzsK@d#hTlLDmuT@s7_l>1`0N=aU;*P3J&{&Kvr_Q+HF6MLn@7GK-l3SJiLY;%>G zrXm{^hsLGlvT3M{t9L&5B%*_`mTj5vDd?V#T{<7q-2xy$;C2Dj*>M_$#T zzmbX0tkb4K$ILP-jEkrdh!eWJ-ODDBW%RUsx5^|Y zZKqo9T=A^qh78895WNWr@?>*wmc zWXT!$U6c1GZ~B?^0CcDcl~>d}ViTUx3Kv+L_UTld7XRuuWAkcm^OBXHch z=lnwFs|?91XlbBwU4sW~^{k+LAY)T;U6J2!?hqXk*yrOFR%hq2oQhA|Kd_%X(3YDC z7T*=jL|6s%=ZCqsI#k~Mrcc-?EhD(g}y}`Yf&#;j(G*oEn#< zGkkSW!Ztk4Oy6cuKw&&FJ~^!fBY7}=UREow_*H^1o&Vu&~!nd6w~U_@1)1Z z9*JyPoJZyVVx4F~9>JXTB!&d`6mv@d9(k^Rmrf%&G%6=|~SXddueFZ@_fAj-$ z#J68Oq8q%FAX-hH`EE`1Gax%@Fs<|at+m?OD@<-q{unlA^_~ifJ@45|oiGdX$Q8P5 zXZmRCG}$GU_;Q;lv*a}5`g>q@yYk3WdTu@a0$Tqcd>Ro*uz3WVCOE%1|7G_6Wc!gF zqIKxiYrJvxQrTcMD>M`nd}%PU$4x5vs?*7h0N6F3jo=xqU_V+JjHXE7A8`wb!ns=W zJ6ZKi=;2uTao3E=Z(a#x7Xa+Gxb-w_FCI?Lj#(MWZ_$rYg_0sC(g8SBG5u)K*DZfb+~WQGg@tz_m|K2>+Yg5qhp*5$ zo)22?^SzW z7RHu{XGTAE>2BAI9zoah>k}Ry*?@rWAZAKRduGJ>$GjYJZ9-1v#aDKJrW-c5t8I79 zxGAhfyxGX-^lRarpknvmLwMEFRSV)7B+terHmsG=>(cPa=XQf#Dv8l{igeS8*J|QTd-SkQ@N`7@PK!obx~Vc zEdVzVt(Pi~X@~uKk2cnvL}gBsEhd+17mwkOmg<^UR+eTxi=e%hST!=G?iA`$;UB|4 z3j%VZUcOaU{Z(G}uWt=*LE5vSoOY}VM3jZA{?H%A9SvvO^`cA2TrQ5| zGY=`r`Mo+nEG-FNHqb+KtapKRRjgsXmxGQI&sa0>@g}RM-1MqqPE#68)U?7--Snr( ztAy%SNxi2*4Gs0{t(F;!eHFXa^fZp^lvGF;!}>*2C)O#OH_?-^XIvL0X_3)Q^g0#MRt9sh>h zsSU6kgJiZ;`P9kURV%tD29dFLUlw)7@JSVW|FC~hirsu(zI@Z@OmKZ)m7FBfTF|Z> z5fGU#PZtxgWK>=Q96ln74&`-A5w8YJ*;--Bbg@jZ^W^@2UcsdsK=pCnYX9tHy;6q z=n*ft>Ui?v>YnJy>ir&hNOhZ9076g7UG)`pp{vZ|MfrM2R;P0ae9$GJM^>+m9$^g{>Dl)7)Y9`U2aczx{u);eyrt!il7NA}VrPW$X6VCu{lVb^&v zkn37{+RW1fO>G-Z6Km>vLH^S9h?d1AKgKQ){B;LOuM~^_qU0+G^aU^3HAu_owC&6B zUxvITJz5l)4cv?y` z`5~xYt#-Qd{r(UT-qmMc9=0cdA&m5h&Jb@_Z~?k`>@6o(EVn97PZ23n`S?xK2yfU* zOx)uDfUb7)s@KEoEiNf*>&{bYUMEB4`9U$RcY9%ydOfh;zgJamP9*oztW(?BvR+50?E^Z=sy^3+^Ct8BD)dCa=g&A3|gQmOPgCi(s;g;e&&uuo3i_JkM zZ}>tKWm=kl%+UMb)5%o-KVIX{o+pZw%TterB|Q&rdo6AF@LBZod{;`{36Zi>0&N~W zs-C7#5eI3N8dtNNfQXPQ>c_20r|A=WZZz`Qu0QKl#^vmv{X6dN!8?=R zSV4qyJZgGtyVn-%)`OR_$NEgrw_ZGn9F@{#hx*UlPjRI6FoSJbhxC1l-L)d0?DUj; zQAkbhzEZ~3{zxcbEETt#Thin5`QEEzv+82UDhTAU&|c26LwijRBgwXfeyQCEZXuV4 z`OvS)N($%r@@;t&It6z&obFUiEqpk}`PHW^fhcIY{wO)ib3B@IaB_SgO83_!dgvx= zv0wZS9&U|(0ucTy+0IWhI068MfP+*sf>XMGf?fddM;5J z{*4Ouso_bzRO#a><euMj39<{qn!rOeYONF+b&J#-ubC1J4 z6Fc`${$<nQ0*Cj4 zYqYrT+52flYBM=&-`Es-&i-x|Z3$nM-KBpPfa+M?1M59;`=D|BOl$*2v0VW zO0;pG*NLi(KhsaHbeLJP&|OuRcasfCj}sfip7AtIt19`)mRND=$rYV7iE49(2 zA7)C5;O^mjP*S$l=)oP@w&|crxpVyX_zT zF|9|UzbsrfxsO5^4z3JD+f5_LW(Ag)rvYV6#kULZn_uSdeNU}j!^K)EP70awm8shX zKbLSH(}HE}y-{kIjrV9$PmEWPBf{{z^h-qBMcwwotetC~flZ%>iB)*EfIHyHisUklTwmQ8nIehpuPw#^2m{ z9RtYLV(9*OR53j#*c5k<`4i3iLwH!{M&0z%vd&L^)!|GW*PlO6fFNo3iuLBNO&4rN z!Db?CV!{64pR@L`a&6$4j zg6*#D3fn;-&@Q{PXD)$2n~XuAZ9ZEifnP!uQt=>=`zyOMr<`NGX20p}0v+7l-QE1h zw|SOqH26fz_q=mIs}i+=SN|B}Z2<8jl5a$DNP88#U z7!JjhKun9o)KE;1fhZ7D0OVsKfZ<4n5E^E(Yndxv8W-Tt8Y`{qp>WcKdf{48)oprm}m-*I_P{!dO_ zzj5P?|Bc=xiF>!VI(FX{3$~9J);2 zkW>I98(nL|TUgb>e8;xd7RGn7k+fh^807&Qo|%HQf!(q;gGdK~T;z~`p49wj#A2)>ORMHY19I(i@p0k`>I!OCfwCxl^)~{`ePCVLT$HILip~}UrV<> z+aJ0CBwFJ*IHvER%fL@Mfz#m}x&yQo2#d?#pXozi_}N&Fl2_~hGq<8NJ|39cGBXnJ z>fe(!yMB>G%6x2AuKc$$;bY5=B4w6p++6-6u!-wk0|=~uQ%C+K(2XU)dJ9u$FJ{v!#ZVO$^1vp4)^wDY~_8u57DM77el4j^<+%c#4EYp z%{(O+y6`zDe*GKWSW=e$ar=Ik9J@i?jAySK?KP=5aXQiE!%un*tIHM8sr>?A4L96j zk6b{{$QpFlxEv_97%=Z^`$w`(YsZ!U{VVe|qe8T}c0BkRu=qdovym3x zDIzs}>a_qhlSV~w!}#3TEJSaY=M%Z#N(;JThu#1C(MK|m$rXv|9ko~&b4sL!BYT|n z0uZyf3c*!3ZTZJ5s?;hBUvO*K*)=ABYb)pK)wd7+Iedz6xf765bN(R)^Nf|X7j%gu7H6< zV~DlmTR@*m*X3)POfMey+xf;1uQBM|K3$Es03``Tz8&RL7NdE?)nb7TXd3bDvv)0f z18AqJNK*;h(r_n0)AZeYPCX-T0qLSd0piPAZPO~)QnHpU+M4TQ`$VF?i$rZRrSeQ) zrRkm3Jgt!NcODl6N|6Ojr211LBj&|nj4n)ZEJ6j;J+S`n+SK{V$~3)!au)d&pr)?A zC|FLjEhfJm_t`0%|0WlhZgWHwzul&!#;cK>GDOwCO)(Us^NKA2%Cr&1TvBAMn~Qa( zZzuZK?I1w>Pmy?&CT^##>jntQRAnu6DX+Pseq0))yB_pXz0cKS%z0eE8cU8_v|j>( z29Tl;OTBOvZof}ArDcj8P?-n<)r*+Sz~5c&E8o|H2v}W@E&3GE3=zER+Oo}W1n$#I zF`?MgodJC@B7Fz`mauHDx_97?M-)SUu#nX5)F=(|F%xYNcr3btUwQvCu1`%s3|Z{# z1-7nxWnJIJa$$?p(nPB8;^wSNBLCU}s!|e}L~1=W9)FI;tj0JKK%ihp(MLl}6Djwn z*jv0_QZR4o!>TYFL6KJL)-V#{F@r!1e*)iJQ7^W?L|P^dR_cMei88=efRcUztARiV z%>mIM&{>fz5a^3&m&A|6*7#rU8%ZW_e1-=LcWAcaD={H2`XKe!r$6Ekj8rq5 z$ki?ERzd;ZGPW~r;ko4r9o}NhAiq)>igdqq&LD3UGCbHcZ?U<%9Z1uP?Hn!M#d_+6 z_!C?v;%xnrcD#WK(T_1T2#vEf2vcxSD{iTKbVyZ%<)_%zhdUwW^1##hhcJ1l!75gCiqsi1?`a_=jzFqWA zTO0V0;TduZ{@udn)6$D)}8hD@0d%gOJ68b9f z;eSNsCqv4byDH*VjSw?qLb{Y`xdPVPz!ovBfoH_yU#S&Biy{Lf=MUK$mhy?82T5G8 zb10T~C>*3)DpLH2_Ni5TMpvzBY*`wU&HefWZ$bD!WK%;GJL=TBD#@D>?`-aLx;Elk&Z<>*P-J9RciRDnPH^7@ojr&fA$R1OJi%6PIZ9^av81`Yu_w6A)NU# zoHMnx&yIJ(0bFh!7czA+T(>^7nb1f#Sz$9dE)bLuh>$4&sZbosNIp{i1W9+KDlvB>_E_$cO$~HXR!oLW5I8xd({WOrari;}fho&miKJDB zNzhcIn{FNd?W#ANizv)yqT>z1P)j=Kh-ceQnWU?n2(xltpPXTEeH{08-xZQ`mahOv z)hOI1DIc#kN}&-uAslI7)TgJvI`7(%v*gBjLOvWzJK9-f+@r9y)a2KWLG=nP=#UBL zjsMt3?_dkW57^*{5N*|13!7~vSPVXRu4WWa8fh1~__Dvy%7WYL|NUt%9z8a`QoN(U zQ7P7~{@2RzNv>dKntsAoDe-jupl!@cjMOFNLZ^+k;Cy5Ea%M52Ezm%Fwr*5lPL-^F zyTHyenwGz!%(XMOHJxj)U3&goe?fg0EHHq)0BvVX6fS43uBchGOu>31ug*chZOl$` zK_X^p1THm)UP_)>>4bhyeU-R#57tQjw zcGq2Eh&9OhH@s`Xuhq|-jTsn1Awq3hQC#_mB#!Dwv2^K_qVE_*+8yWczru>cSKLTbB6*j~yd)V%9V2)Jm8M z-8#)$53&B`-7+~1-kmGgaE9boUu%OJM!H%lL*Dep!oVWTAy>h6b#TRj;#xeE&K;G{@uc zrB*_gExyR%geCDR7nx9J*pA5n1g|ov>yTG)-Be$BVW^XN=h!A>S|TkzNFA=cp@G;` zy;DJdngb``o{^-Fgp(2&6Zqgdt+^jJaUIgx-~kY7ClG_p6!)&VVuRBOD>~TB<6#x@ zIlVP2t_|SJ7ryvWcFSVW?)Iy`=+eTl)v!jKZ`1fKuDqIJC@cUKp>n4vUa$|(elN<6 zGns!iEq>d%0}N9uL>+9#BIq?+wv;@S!R!L-Z7c1G+{$#CO7?~8}Z#rX=ywp z;$(I55!Gp(&R?lPZKo)4nf1Ya{Ml+?a0WXFap?5r7Jf(-qgy5)?Rjf83eWoN z*zT=mN@L(HQq#LKVmWE`2F9i_UtnG_9OqL%Vn6=XmAeUg`=)yeNQra0Uy70eo$Lm+P~kGb8HV> zCAOURqQ8p$5Ksp_^<#B{cXwEH5Vj$hTl9LoGrIN@SyO7kjP;P1( zQ1>vPr5A<%QAJb%PLw5C7g%AW8dn$)rv@+xp6?aqHBg$-R1TA0K;li=LAv7Sn@RmM*Eq;9Mqe zxEEU6P)&~MG_I1Y9Ai}TXx}_71&+n^YI8%RZ&y@stE9P(o?XYvmtfO?yq@B0ih)uv zC6|E1v`T?J7n)^)vvR4B#J|(dGwWdG)~iONj&T7+x<4D`aQ4JgufUdngn)CKCP^T zdGbs0T`Eh8@J}nsuBjwL%6qdQw>`Y__66JJQqL`nheGv-gSE7U$GwB!t5SCC*P1hV zKTYq7jlx8^P-2@nDmy;qLC(>F|1?a7TwpBFvry^e4r{=9d2gg~%9aSVI2_e{I_sdNP7Q?d2w9EQIDdIEjXI2U)06RjJw1g-Uot~5M}v5*JGWg{+j} z&zy!%pPcKjV21#Fq|@x?#G?rgu`7W0qPB5yPlIoAnVF)xw)JsrF6B}=+YqLH!KC~| z*d*!)*LSrIw>SHA&qKB$e>LNXONV!s3S_20V_d1(wyU!f5!8T{_v^3gA~|YOuuyn>8+rm_QmzqZ^-WnZBO(v7re2HB9&YW|W7=!@ zx9%*{!gz*%cM1MgxbhHNu4vpBOoR;H_04HL1)xPFA8d`fk)84Jx=DFypcI(KI#Fon z9_RY$G1Yu->33w{F7Tm}9Cj1T)fQM{=ygzb76dR>K&UeL*x_q{kFhjps4wVb$OBd? zEcz^W;JNYTqjS;DNC}_Tt>Er<7wy>Q8XYJ3D9S~+mBp;ob|y5IdUJM>ey3;oI}=ex zex|LxMRy<*{6}k#@TuzAkMV9^p9s(QHP~=UMure9o}O+ z-rSdIy{#Wm6M$T={mixtJ=c!XP>;+y)+&OVvY|cwrKzyee3(PzBxmH}rnEPJKcSCuqNU{D4f@`?c&nw|x zKmwy)_+nFRrsL6oUQ05sS#+&{jh*7sX`UBGT;oC{}obz_X%ucH0gt8rN@JZW7*e2Iw8`a^oBdGa@MOXMD?rNXpX}dbRwivxV&FvI6Hx zH}s7NR%+-%j8br71NBeKI#dX;B{)$)MDwP6$qmy!>@0!-7lR1Igz)Zc3SVrH+;4b$rB)2^i zQXpZw{7rHb68-RIJQ3I>3$C)q#5F^0msYlWvyrzq946xV1vv29U4tFLn2qhsx_?|Y&dQ9=4@*2L3ZLVL9h@f9{`f?S{%Y?`IgoFua@{anXJ~Ia z>a&s}&f8;VfAVuM!KKsj{PFNy;gCnC3i5E+KBfFq81f7h!BH{K{_PA;y?KMrqKJ`e zI98H?>iANYymiq#A_=F)sk}0*0+@N`he?B)f#vFSKOQ$~6aTgoCYJ*Sa+RLb$pwvo zn$@@jjd8&$t_1OX?E2fML6&zM>?dzHN_xjFlM9>Mqo_d+mct6h?=p1wzJrE!yF*u( zd=D2jvd-w;IP~FPj(SX|k`WV=U9+M%jm+TO1p;_rYT@C69`ck)xpPXY-DadN0JdXk z`o(<&Hils#r>}+GsCyM4ezm=UUzyUy3t8?a{;CUF{@lGxR1r3HC4z{~X>d}*egBLt zWy+h*gv!{;WH<9o*=@N#9<(}jwRzZ;l!%3QEE4}>W9g~#-@Kns z6=xxNe(OJpK#EokO-+1n>Q3_vpm4OYzm}e8H8aO*$bL1nx@n`&6F{x^DwyxcoiV|q z;Ue9!^Y@@6x2)*^z_W>a>N`Ba84&{quXrU!;+pEbtV~oh0kMHzzua5GS0}XQL zrn~P*vEs}CI%{trne=gwaZ(&BUV0fWp|s;Sw)>XHrR(LP)_D=a;L*BsM?=4Uj7)># z2r)CU)1!zGi#LM<_YOpt^2K8@c|q!j*f&Y{J{)6u+Wf zF325J3mt0O=r5?(YO{gR)nmp9sorb2!1)BvER#eU>j!>f)G^UIrQ`Jz4jErD@u%WN zppPE5jc@bC-s)B2a5A$DP6Kf1X7sFM@EE`Z>~DPCY7V#|Iy5S#YvI<|PbTXnCf6e7 zo1S@>tw+-(Xz0wed6=|x!mhh+e?vhJt%ozV`FL$06 zm2iOStYDdN+if4IVfusx(3q$>_JsFX*>A&_6~p@WBj^6gDnnX4iCcWB!pY3ucD9J* zHP;qQv>Ojm#XX61wSyJDbMs-n#;LfUx3Fl(M;Es#=LVM{TEhmHR3J;X+QZ$&3DADWyg37?xtpidU(&Zt+b;NK-It^`n^fq zxnKJlvE{e0xSj6-er%jk#?OjQ`xxc0x4#Z{)lFU!@oQEm^+G!~(F?N=AT z!GjH=dRfH8Im&Fg(;V1<5bAHL>|?RpIBAzng2bo*G%lC3hAoM0Y6U;nu-Js%R7VUT z0LgC5p`=ZUKkI}~W$h-P!x&KY)HSTEIUHj_&u}HbvG*N{-;~wAmvW$2z*Va74T#Uh z`nyeT)oVF6N;O{nO2eaT0RQ=}p;kPm->CtwFiz3ipy5~z%`R-}mZ7*$?uRd5TQ=>j zW7W7^w0S$v!+D2B69cn@5TWayWe4jTjr}WStC7t0@qF4ZeM0x=eO#t;J>2P_pS`>% zP~+1hRD3@LYr$D;q4{v#TnxJ}q=$Npb9Edlw0gy)e0kz_<^+j;c;iDt!}%G$?ojv7 z=D``frTbDrc4GebV^3+X`{O7f_ZIogHO09XnCd~pdL?OHZ-59&(theBK4)#2@b!DA z-}e_pZ&v;hkMe--zvkoAeiI{{)0`$$eW5Q(i<>7v)JppJNU!L4rmuDMah&t0V zwt%?L^eG{glQSmw{$3(d>TtgfSCcj|9`lqUV>*CKU`f#||9 zKrY>m+0yvA-l2C0 zzP8!{)eACRKOY23NI_b(s4#w#fdYqAaq;pPpLDKp+9 zjhpJ{16x?TS(9v1#EihBQB7#wM)-7Y__?EQAI+xKasYD@n>Zd7&1q z_GD{%xo3jDVou*M&a8H+t!M0b{pxPZv)~LA7^`Igd8!f&?HSuwmY|PgP-gScJ=Dzl zA(lr_;mJ4n9`xQ%z&h4Q*}?IcX)OC+A-eX~C#a zwa&)u`lgiPhbPVgJ$^x4)%V>9%Y|#k-!%em4&77d)EQFru#jv%w!nBx;#ykg4k0o) z-;)z2I&-1teb7rr>KkHAF5EdYZwfScO}W{lBk(N=(LS%i{y?1#(>yYRA;WmWEH}mx z?Y9baJ)2MW>^BB138DUNgCSUn>p+jD`<5IT*{s%Ew-RcS0`}hy26g`cjzDy=6vCG= zkFfBi>KKm0J*qn+Vy6l4`)k2J5BKEQDsw-7BAkh4t}P&DuErdkJNbKl1+P8~IAQDTpYhyuT}8h2VkJ}{tR%qE54}*m|uK3QG8WXd^=TqS67@5#h10kfG7q; zAP@YH0U}8V#Uky16+n{9&MO;&VY zzPn@+7(wh!qAdMdO*{pZB(@mf3Sx%=j3AB|zzE`WAi_~DHgNh)EfYOy_q<5r6K?DLy z2{jR^0Rw?R0?D1x-}?vLFL&LwUcMyDnUgbnKYQMWK`ZLn7E~Qs|$)1En+qz5y_ANFq zy-}^F)GvDxR7X~t=N zQ?s)RFXyRZrtCNV1R+Kv7rfW({Eg4){rRfBa}!_SlFZ(alq?$@{_XK&=g#}Hi>n8L zd7V}UAfU4HUP(GO_{^8|G2dENn3ffa=gf)N6C!OXO=!V(3sh0q;sb^53B5f~8#Qnh1%c%XpPn722IHxIEZs)h8-^^M%5w$Z_Cje3976$0mbI`v5~u zhQom2+oDpG%W7_7uJs@jJ(OcZ5hp%2l9OU51qdO*P1A*X475@H?=I3GR3tb;|KodaB~Rvk=diQE{pY*FW9=fsbqT}e}@5ciF2Y+EBj0(dF`Dsx+0BP!s5 zs;5l>v#f=!*8IoHS~)iQi0aA0)(-rLVuj*;-A59KpKy-@K(Quh%u}OkNY6a6T+d9^ zaYo~x=lkc+x+i`UY&nGbapwir&k3u4E1E>!58w@;#R?y9U0JlqV*oUw8aL>Fmfa|hEKDSW`w{h%NTbwx*ImVX>UX`Fs=pHDLp23aQVbwOVs_uZuA z44Nw7(8vgyC84uBF5pwsNz@s~KBA0su`Z=SRC|aJLpa;c{Md>5{r)U*yna6bExo|6 z>{F7?gJU{}y~`{g7g*5Z@|<7MYqdF7Qzh}NMoQ=7jX-_|AuiBn+?V0g{_AFeekw5v ztRhMFMo4rhTi}&y79x9EUBr>6`&w&ReSlW(SaVL^F~cG%hlE_$hRBPmD{6ugiXVnO zPQcqm_yqwgC1@`;8Aq7dz;2u*yT5<+4bn+j#hiZk&|M0LIz~P4Dkv8uTq3`sPsxbt zqflO@ApUdAFdt&SV?5jKC%z=F5=MA9JMc3L^7nq}wnRzOXpZJv_jjquWm_GowTCVI zfYvcETv~ao7mhrb2phW3{X{`d{>Z0-;Tl1d?VabzQwO7b#Xz@`{fJ5B<*ng&Xa8o1 zzH?{u8-MAorN}poS4(~YQB{!RnO9?coT2y*`6?1>#>r_>eMkEX1K;Mu+{R z5&HI4j;redj)jeKi51k-{eT4&iWXn>+Y*nX30N0{ZufZn?ZGg(<&Y&SDBB_g)%n;T zTni$#Nh23gm99CB7CAq^K0*ATnxMZ=#I^2gb^p629Vf>a5x7se@6K(gK@OFM$(8Kd&D3Sh?;@aXXL-7D%T&&*Oo|RSML_uD;P*5|;Snz$;p_PEX*&@GNLxepd8Q7Vc74QaAo>~aby_1y zj$Hooo>87N1JDlf25U@;JmxDx3YDl{`z*O@;XGo+S&B+7Ml%4p5Mrlo>=b{JIiI+$ zijVAQSv{NVvBTM69~=PMA;eE(6(^7r$EOzOJf4 zwIj#@cyaK5`W=7^UCC_RJgJ*lfPY$}UM;RI{XA(uKr#kRr`hlAIG_?1;ji{SXtVCQ zOHU<2A3T)-YH#%}vZZQD(ZBZ6p%me^xL(sA)XCngtM|Epk{6Iw9iF!3pfb<$M}Pe! zJ!L;%<%oT!^9~ch2fS4U?NQQNrm~CBjUgOe;5IB+7!^*XPW5_W(*Or;NZPksT`J8X z#$q2bJKmpb&bL=%zOX^3+=$-~9D=}M=#*bs5UI+ji-7f5dFP~iQWWR!uD%&&1di#0 zLhq099+TgIhY7=O>Y*LhI+t$unC-F!;biY{90ra-sbv2=`PYk1?Wu3&mQ?Bm1^0ZG z|E`Z*vZdQ>i_5**bcu-NP+nNdN$EAUpaQKzpjiEd+mD@7_1xqwygzy)k;Mu*5sHU^ z{!CC^%9W~IS`88F63*KfYt5HY_@O)*Hsr|=MFaWtEsH_?Zt3KRTDgOW*tgz|nmA|Q z0guDL-}IvT?VG@RLoKCP@8v;SiT!R?_ic=$vTLf=DHAq2tprEc$#B zqb7#--<|i_8qc7RJaA@#yTp693}XvZ? z7!n1cYiARLK(anU71zhvt=bw5xFVcb5H zL_xQ|jxiZF=}lGVt?tx2{{!3&$}yxH!4jYER-K$59Qr;vGy1LMOfGOE8hlK>LhUUx z(KneLdJ=BPc~J{rE!F{2)eyU^ZOJ4M6$)+Jxuem9IN%6o{8U#*22+$RCVoeH1kk-3#wg@3jjPIN94b7@h6KyPLRf!AQ1Hf3SQ>loBX8* zPGw&BCUJxb_?QOmuKwokvqPsc`EGH7l}pK4NR*HM!A()l?Q&v8;1yZu$_;YNh>!{=<=YMN66iM;cd0|oxSLW9jVIk-WCs2G z(K$Z(Ftr(IWr7w89lxabYGU0rUy6k9vT3npx-zz%+<=6GxV?dhP>z|uNYH1Q)90gx zH*(blQo?fbo@Kri;PU_!eM})>+Uo3=`P(m}9&%9TE|-@)Iz?!tzgCinV2EOa0Q?Ll z1nJz&(TRP`hsa;LCQ^lRQ<9OtoAr^v^nt%{>OF(&EVr%=fNHCnGF?)PO|ihp0RR0u z?R|TybS^)-<5CgXKEmZ}$NX>FVL6K~0DzqUUG=by%i=*kQzd3giiUjH<^?YANOGYB zgN{6%gz4d9I||r>X&8iG30wt%KSZYL-i=3IrH<)G4fKSS@95vT08F#|6?EvkF!-oU z$-#Zhi?KfVt5PjFC+&uatq(IK@C*PFLW4Qz8)R7{{tu+bL(9ufzGF8nEg!@yPExY4 z=fOpPgG8N={u=bY4&P61_Tm{+$l80oA%f)xxB`{w-&nXBf+fwn4gl7F-NH5ulxwDS z4W*BCtzY>acK)-r?G%0BN%y^fA*z_3p=1q0^2+{%Pygh%Z{hd@FRs+i&ko@uR_e*a zsbG@a{3|;KhthvK@HML`*@B{ZZ^}H_tS#OSrnK|{H_T#W*|iT)WP{KGV}M2B?%iZF zO8bg!PwJnXmzSr&p5X4?cb7Q-abQw7|Rz*{xQDRHePa8PTw>x)mTY9HU7 zydB`z7cB6B1hO&|rvh?b#UQ|1N`VTll;xL5GjMIle2voiU69ftdq)#4Z@^5Ljvn2| z46EI)UbT3T0CQ3@00VtK86v*rh;UL1OdO%UO)i7I%W1O)=WH(8u^C`p&uweWxBuukaQtR zULLnaW^}JKRlmQ%UQuBHxjk3Yru#v628YLgcW4XWMV!Y5jTE#oNrmhNg07dMU?E3f z0fwL~%7eph)T29}JnU&sEEK<3kBf(P2yUbwg=B~TQ7Uq~yLlZHy+e+pO=T*i2t?_! zY*ovpL%g*q_*AhYbkU#kOQiUox`^mk*)Z)7Oj z!X=Y7R!GCPVC;{DEL4>Olb>oJ;R=E$tp7(ih7P84 zZchh#+a8$nEe$l+J?xa2+!}z4@i(^r^TlIAiz1$5b|BTovY8KASgCC;tKJA-C}!a- zzq*P~J&~KCv`Ps9nc%PI9&;s6>Vic-E;As=q0mzhxNI{zs&NFI9pqU zA9c9}U!E!ym;A4)QM@;8g>tl!{W32yCSX+^=ZtAw{h)N-u~X<`3(X@H#SldSt^RRe z!zKyTS?BXWtRL}kiy71TLmb7|FvS14jf!)27OYZu@E|v3=Kf)MON}^nTY9XwdDnlg z&#_3>;y9=))*h`&Nz}g~6LXnH5bng_a#O)AAm4XjtnTFl-F2elXIj9qH9y+f?BYip zyP?11r6dI?6NYy@fwxfq%KczA-x<{WE^Q1qyNbr9FI{-uk4w7HD+< z1(p`6XrM|c@DzT~0_#pqf#&tyXo+{)wuLP#uW@AFAc)HTR(+>WH!c4NPQK$xeEb=uDh({`l!0fY#pL1(*6$+4+0TOS-mx%{5y#Zs!AR2C_vB2O>++Y#Hk!dmKm*2Bj;xpZbW;rhtX3 z$KZ#|sigfq+Ng*EDzTY0GH(~GH_n2Omi3u$MLD_alJx@Qd8_%)|DG!q;jRWdNjdkd zyx|7^PJ4!bZS`@ZQirp;BUNbq2ac~MY$u*$5n; zwLx$j;ij^t<#cnFgFqJ)wOy_H?tU-C#t*ZYp$nR7EglL?@PauNkhXw6M4fsx6=PS1 zy9m*7O|b3xb1;q3$|kTQmYGxB-)i-@vmULXyXHo@D!y77h6YNQoHOa~A8$J+dZgHu zM`}O4U3Cmd;DSu@icvJDOh@s(fR<;(P4<8*WuG@W-dLwto2?%Jx{@GS`akbSKQVck z>qh-H<3!(~992w9dlJT<%l+O5yqf|o8OdsrDDQz+-=X}eFXCsFm3va>B>Zhz(S+}l zB&bpvv}U}m4aLFLVc4nvNX1`Q%)L#(CM;-0(ZrKa<9N!aqS%x7^(a&zig*UZ`52$o z#khsh8AO$9+}AMAnV1wy=8Kld)!O(m9$(70kM3!C)i6OXPk%k66d)Z5g7Wm)_I7R} z*duF&TU8SjZY@tzT~W$ij%ZvP$|;DPE8N7)x})XuoaO~Mgo71%$BWhIAP6X!#Ba&^WCd#HI%-vfB|3MYt`?L@nifw76{;45cHh)jC=)8?rB`- zhfke>-Hzp8hre_J`);QOy@XSaI-cm*2Sp33g84=MC)Ht;S|CapqzWN_s%|49KdBdM zd_a)ZQ0v+N?9mx;PT}@O=VYLoleP}&<`P=qosn|0-uc=iz|u1iFHtS_BmCy5UcI4` z3f~(a82~nQ(0SNIt8aQ{vIYcH_z&ma%;MP(1VD8HQ5Q+Cn;WGC6K=J z2NuErbV0HC^Ob_6$YQ{9x{8UXHJ;7z3Bnycqk}TvkOdreAsxUV&X>;t%l!e*pL?26|pUoLxMT zaDi1^YaSKCQB$c^`c!f-n)jed?)7<0PAJd6{_d?5%Kc2z+lkA;mFW|^t}uar7v#)?yq3}U=F;eTs$r)|W_}FF{ok!xR(A$nP>AANUqMAW713=XB-q-&k2%g-g zkNf!!8fB|4WQ8?bx>eZa5C2|iSS_w}3`C4xF%6&B9OjZzCM4iuk=sMKbH)*&L~r`0 z9QkfrFX1Lh^hjp1-W0p!7j*f^&BmkPC|<{ z5fEG!Vo;mkJUoH;p2mwmLfWhk!!_cj=GAm^1fRSNn^*9 zrfYXMm5gB{Q)_9#L(MKr0|&Wo-3n=XIdKnPcs?SX53Dsr!6w(r(kZa(F_)dmtD(U4 z#o;%m%i}VZrzBEgI3qrqP?KEyF@-d)WOgK_R;)UK-cA)Psmv8`j#%AI9VTC$dt(_+ z`6yYmA{&rW5s;~!Y%Qlld7eESq| z(i`{Z@Iuw8yRE(s3j;WrnYfC=yOgyoIVB^9o_yMoxY}2i)>gP|aDOAqQ-%ZI5 z*LTjzN}6~9!=W8<(ibrvm%l{`kK|ymJIxOz$wGEhtjzg@bWc3DPu^!NE#mNb1n?Fd zd`c6YZ1n5>@OPxb0`U(c$Eq*HSv2EPU1~^5>p#lND?RkZh47XOYR4CGllEul0atU$=HYopUD~o#))0pNIh$6GxtN!-<(saM z5KkIoRIr#TkKFd@QK|j?npXmm9{!(Y(p}-wsGZN-bea_180Cf!$hVcx-s(U|IydeT zRzFlSEr>+&i8ABQG|BBt`oSf8yPG^c=AmZi*8U4*Rq3w>_*%6ZR_ZgXRTXr56Dy6R zE}NF7tQT$cmoeHY#u|$;!}rgi)hOD;St(?0?M9jud+@lgC2@i(Fkfe0P&TF3m|sg> zq4J11h0jV%i3@Da^u;$daGfVmsuYk#TcZzK&NUM^!g!tOR016yJ~t_NrCK=;p`=%C zlo=&lW>AuL&SnHzgt@3p>hDSm%5?X+Aj#+D_R@|DpU5@hEr|1uSfX|!vT5Y55uy@i zZtc&iTz2>^U#UTvL&SzDn&Y=x@7b_F--GQ;>YDw-I3=6|P7W&w%r#Bbw``5OwA>1( z`P;j_!F-x|hDfb$$|K+DDR`Bl7C&s?nC84Aeyt8;YUi|ei)I_RzYk#(R83kU)o>)& zj9;|4pNbSf9-Z3#p3KuXw<$Fa52uHzxp_t#pih~tS8cws@%C1zP^&gcXY@gQee0YwrB;X&7Gqc z-Ae?{(Hocd3)X%h&RpfMcqxAJRLXBUv4(!*RK>y_m&O9Pf-C`R5blbc7@gxplF-Se z38SPn%f@OVgBl@2zuc%iN?6p*I21EgMXK9b^EgjIPAlrKl{3DQSO6On>H zRN@9t(}>x$mTs%lag)u|iB+|$=PnF~h2VLo>`r-{Sdhmzb-+;z-0#y9?0q|{I+66H zmQs>;X!n$IDeB5&~%D?)hfnHj$p zaoC$`Cby_Rvr-XF#8oxqpLgBV>o>>g>05>P9~?87_kEG-cgFvSC5MFP{?qrqMy|Jf$P#teokekVC-5#h5Fh9lB#$e_hx(sj(9A>6l z5lg3#v|M`7+Wz_XeUv%|*7+=5&;zp;=19>~2 zFE_t4#vU_O)C(IMG)CNHJuy|*yc!|s?wJzn%{u7pp?Sg97>#gQFIeb8Rn0d0ntbD( z{PPn>S@OO(xt`S%Kc`IAP92Q>PSw0L9M1ySwU)JyG0 z6w2xsbHz04klQaUtCh0~cgsy}G#dIP6JmZGgi?$})^PFnonc(Jgc`;w@Y!Vai5Yk~ zLSiApjU4v+b+OW+sxbyMUVv^XMh`Q5VekKwm#5eUC%ZO2XHM7A%ru7^5v`4=^7bA? zyA$PAuof}W5e26o==H4N(EKSi`nmy+#8X^wBhkp)yCFxcIwT+exc2w#ur1H)CW`D_ z_cD)V|ypV4xXMxHu9?voIylQ~n??3{{wL{;7IibGD zNm0*3adwrCLiMR41gRs=&u@6~3Vs<3dOxz13A4!kd0p{+vUiYkGBSk2U|udZF;?qB zl~;8l%L?kX@Wg&WXS6CkU{Tq^YyhtLlhfWE);`>9|~( zV-3&2%oPK}*J_(68y*P*oGf>FLs4wX<|^9#FrN{zhP6ruvkB)t)7I~Ywfd1l>#a)3 zN?=oL`iX09oIWU3TDi*M)1jZ>M@{b!9(&@8Pt10AsoR5c?L%JAIjM^c948WDHMX%WR!04ZGu&Qv zv+I&A_;x|s^?akz%;3oh3~gt9%GPZ#V5N?$vNDn9q+73Y)eDXt;ZX zG%6{yv~#n(GD)i@_8$A}g>oNCgK5@iMVbDszO^lQlpG>O-(F((0AFsXTEd(its$9Q z=vBUbFWcDiS>D0B4BRRp;iFV31ICr%Bc7a8-c*o-s1ps3d5v6}Hm9s9fmm+=Hli9e zUaV>-DQHT(pnJ+kM`*xnAM0b4o@C)82?dC;SUvMP`*7jRYA~f_6<>Q7dEl0o^HHoc1R=dhdsNv^!7?49>&gCCbx_r43kj<`h{J_ zU646i))r3Byr-`tH=2$+_D4C7kmn1Mk@fkuncn4^j~Hho@$5bw-G%B|rZJSmv(4}l zc?27Vy0%%;;Pk5y@L)E30Lh>Vo#RsJ2|?$dV2{Y~G>c z3Od`7>4*3Nj~qiU)rL1B)J{wOef2DAp?LZxAu4yJLH6 z$@R#K=uaz^Mj;;B2N+rUUI>tl^t0OXgb^^^^hA(6dfw($cg6s;4>=vRBQ4Pw?IskBtpUi zwOnrss7+d8lACyu*!r8wQ@}~YNE&MFTV?C{=F?Z{im>PD?+js3+$ss-JPnktfPnGjr zxP<)mg+3*{)joxTeDJ8MQ88Gb9&*xPoBbI~SC%Ez{*cUf2J}Sm)G$UqDcuNrC3WiP z8E!-5YGEcHoEja>Lb*q0SbLUrZtR{09 zGuH}vjyEM3fUePdH$z-Moz|EV&?bA4LAUXulgaQhTh(=pT+^FKiUe#k*}G#fJ6e6U zN2u%S^z|C;fMV(mRegCF4%FxC+hi$?#E}O-Rz%XgbU1tx)^cS!U*R0tw(iE!|3O_iMSe zYLuPdSC0Qs`~K@{$FqkE(TnO$v<+{!Q%ac^8W+abCH~1~G@)_-4*sOi3vA=^o$|8E zh1)7%Yh|%;?4LPxDI;LwhLa1%FCN(_KqxMdiP}wZByRl32NKj;hHq9&aZGJdnmUt_ zr1+G_vblhF9ieC+#bA$PHNGrx8~K`f7V@Y73E)|obSpPmI#Ut3R5woIR@#PR^H)6A8=1sZ{)(-P^TgZmB9;CCFAI!m15%#{TH7nlRWUHV_ zZ^Al3PZ&Wi(7JYG z#U?mj-;)O}+k;t=?xlLLLGVBcu{Wrq*I9r%*ZFxiH&u=R zdIoFO)=OiRQL!Tf1!}9JZ3%07?3qW@AuYh*(ycEon^+JqBFbYtxg2#V>o7`4xZ4)@ zun?GF9!A3t@;QPjb~h#!wjhHg*4Nk`bl3p<>R8U6q8>p-JZ}xy*AXS}hQtOLe#dKu zk9qy`+k4v*_QRO!6;w>%i)7D4?=dXmEVo%G0>c!}zHSiDm4&1=NZTy8j{wx&g`74nW(ypt8*IAfubk!%cy1BA#)rxEZir~dmiLW^hV_gP8wceG%ju(7Ou4PhFlnqZ zW8MoK$0*bK==J#%T=d=I)F1*#4A1P^m&zL6V+t~TnH6x?zxlP)a=K-}%9<%p(wgDr zrx9$2K)$_>91fXlssLBP5A&hMW>;Y$cMYbtu=-fp&Z)>c!p1P!&XyGf9<`e@F6X|H zhcF@1tXD2~M>&JwyJSar;e8*&s&1ILO%xWFQC#zn1G(UQUvv_xxO$?$i@z8tW4@*o z79?qwbR{vDZ!qX|rb1wb!iyi7%F$b!jo~I}XjIX;Sy};#?KyeHHhiVRzHBFKkhD1= znJk=iwX~x1j7E%K%jzWgTK>O6@U-no!Jft?zRwDvk;dcw8lYO?hjl?#k{XNw>@CiD zAB@=-zfNVg7|VAWjlB9X&PT>VGoR4*mVD;~@pa^Kw(88U)wogtw+u5Fs#)iiaeOB2HckDwS&d^Bk<@g+&l4^_#Dgt4QzJe6-SU zteDC_5&&6>&t`&8-cD*_G3mP^8jY4G49_i!>V(X{^PvhvDv z@g6o8OSYi_4k6H}+^8^0_*T%Uxg;W2;Ci`t0Q&4SquX0fdc$Ccs+P)2zsxvk5R8~q z@!4i@n(&z4Uh}l*!?`#9b_UrQ-ZaB}+d&YG8}O%}cBu6eefP2!ENX7ZPct^TTXw7? zyG^qvF@@h3^TiL{S{Yob;w-;kDRj5SgP&Y7E@u%CP`}E$Pn+R4sc!gc+h*pf=W!F< z?s>%E*P=-l=MC+U@gRvo6E`7JuXkh(rr^Tl@R`<9HW8Mw!l_N54xGR&X;9Qvv=}g3 za+ga}PJHePUfESAK7aXU6r(CCB*UtQ_TmY6{<9C{@(<5R>22a4gXv_X$@W{-%T)UaAo2Sc51d`z9h!d?kU&k^jkFzbS;s#7Im{#{}snmQnb&=*Aqc0MaFoab?&=o*p2ai zq*-!%n=(8$tnM1uT4*~pQgC8eyvsW{v%Ylmdbv>zSbY7;xiumSjkSs@J$OJL+d(74 zEAk^u4NGu5T?a1MTHAZcdx4JSeLs8Wm+ASwb7c_~7V11lo|w{Tg7M(+>O4O6ILP1} zDYz?NjEahtt`?)MdN9*+j0{eT(h&_#UcR%7lh65$iK*+1?ONlsvtF zCy0n12}CD(dtr?%u(4lFE*KfNNJ<*~9TaIvCi`WlYjrF}RoZexuymZu+^S?FOEBY*9DNPC=c=Shgk*`;IKH_HV7S)YwsEUn^V8sBZ)zpKv*iUBzW5v5l@Y?}T zy+?B+bu)*p69kLBy89Z2tCCulNZfNUC-Ylx-mo!T+n&mu)K>Ib1ZQ0z5{5~5!QC8; zsw_CufM$WI9A_pvst6okw6>l;dEL|&9Z4l&1sqHm!8x)EIC1L2OprPreA;s0mN*az*gxwSb}Ze>C5;U+ zDQJv8^lM4KR#i-tNdnFL)yt3>YxLCVLEwP)OF0X+yuzZPCe>YToz{T>@&sA7xek_X zYU=4+yNXpSAuZkRr+zZ=osf#`yOWBZV(+1-5o57D<%N}ut`kwhSq6r3!hb@E@%HB1 z{HHDav@(Y&{_$p5%v*BcG5Ix`Z z8+^Im&GiZF7~!vvZ((D-3C=%$3a#!Z>`Pkf%YCA`v)kb@<6*yR;cRZG*rng$oP-v@ zqw|!LE+V*&FuS)4V|f@X`C|Fl<{1?Z*TFKirn$;U^WS&hf49*QN_rdt4%NUj zG(*rZtJ6q6Vyrun3G6_ks-QCqtZ_`=YDNU3-?ni#1Q< z1kcqyEw59FPi+10@6FYIAmIrpCIEbaPOk5L?Ln~T1$%+8#|3+I_`f+L(C9(S=?B1E z;BbTfvq$F7$49_26ZFTy4#wcYBLE0{0I}o<8}xtuv}R3%pTOpU!{FyfvA?H*RQ~?K z_ufxHMD`GaykpN{KoIug1q5M_E}(eWV@nW(y<`D`5Ve;pK@|2%1rUV2QUL^EuTy4)>=iUOYu=xM{W J$}}7v{2%TYN4)?5 literal 23484 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 diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/FirmwareScreenshotTestsKt/ScreenshotFirmwareDisclaimer_Dark_d19fbf1f_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/FirmwareScreenshotTestsKt/ScreenshotFirmwareDisclaimer_Dark_d19fbf1f_0.png index 53af1fb8924b5fb347659c739dc4dc74c23f6a26..6735848b606ba2343e7b096190c8f5316993f454 100644 GIT binary patch literal 96241 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ν$nm@z4vyiv^<`cH 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 literal 82331 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�I`!4GlEv9GLcZ?OGtmkJL3uo^=GZE`TUq?LWN^ z@x1guoSY;S&>9E8T-~~%K9c#E7F)QY<*K;lRYpFzzzdnRq!y-A+=6th;z|k5GM{Zn zXPQwFhxVvkakYtekEdUgUrtHO@=WgW(r;&b@DRg~l6udXc$1ta#T$^{dXchbQpN1m zqjdKi%-*Z=dul3lm6_}m$i%W;naeMuXU)Butl$0&-c63nxRSs2{)P%tqCV1?7xVNR zYdFe5!%PK5>2}^7@Uqr#-Ytb;74ldUJ|LFgV5FM^vHbMp^I1b3mjRpjDT=-01sSO* zo>Gv+E{sPEzMgw03iR5dOs90s5cWsd#_BKnxO*uRhKsX{{tblAtN$91K#d4NuK-|_%txhHd5p>T&% zuYQw*v{LQ|+f-aZrDOV@G+kM)BCdI-n7~xo^33yX2pSvG*0MkVOD2^80W1c{m3L2e zcjC*RYiG>HHS2E#u3u(gAt@Ox)Q8FKf)7e3@~=>r#Ka~McruYu#pya7WvJ1-xO9b? znhXYCQxZ~NEBQBpwE?m-0C+m~MlXJ0)VQsz<@f%qUFfdH@3=qul9ROA>IC2Qe zM#wx=TjiCU0B#4_edn`vQE|?~m*0yMnLB!CX<;CFp>_){^K)N!dX3_HoB13(h;v^F zRpmO%VBCT^psLm!N!m6|e9n{UfwqrCrc(v+DV4?6M#ijO1|~mcIB-@o&ap^PH;`@v zSfCQyjlD=dNz3U;4zy0h`QcC65uwXEwp{Zz?cmI{h;C62el!XSw zw&u6vfV$LJ$kmbe=jtAR8gTpBbShaQKy_2%yQku@7l9tMw>m&uW?eRsifT?R);Gjy zH#Vn3hg?i23vXP;g?mO|b}Ygt=YwY1#0ra~xOe<^r{p2<++M{LylUJy!I1FTQ~nP0 zZA;|suRkjwz-Aq^>@P?J@Qi~!k>h&U$2q6UI

yaA&1-lWvA(KYHVEYY8*h#4}{ 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 literal 82576 zcmeFZ_dlEc`#&62-KtBq)M%^JsB{Fa-Ktd$HA3w!BUY+r5OiwQsv;MP8nH>mNR4p0 zINy_i=xJ@W>%gji4kN6%C z2qbJ`eBBZR5;O*ZggSTa0Ip;{p*;qHqCh6suUdyV&r{d&qWzg$ky~+#oQh6PcthCA zT>oepV^cP}qfm49!mO;g>iz=;)_U9JZym7KJ7^%Z^G|^<0s^i!+fRVL9DE2e(386= zAn--OM1Hn|EnT#TN`Xx?m^9e5b!HVkD~y5K{B^sn+=<)wq13avboJqI(VM)yuPUXN zaNE>J9$E#AqC~DI=+vLJZwiO9Hke=|MB|b#Ym>{(OVHJkLM?rXG#riKZV3RS&sdi9 zmil5fn&vnqOt8bM_X)v~utlEV%{$}IPI)(uwO;z-sCGjo!K`X;la9us5hw5$1#EI?3{W}cuLL=r^DeeYdWZ&5R(wifi z$AHzKM9cPHBmNSh_g*%P-Tv#Vm_dqgs#&SV`TDsMzwWtydS0gvcYp%tFZGxjtivq`sys|Glcs@xx>F*lz#8v7ukrBp6loI=7f{x z1Z5kpWzwQNo;h+dzrXdpSLDlIB^mf$UM@`wdBgBT@3ZwJmQ&P&!~G9-8WayzO<$Kc z-yEP^<}aJ^ih(j1uPin`76?o~ee)#0w{g4Kon+A?7#n4m!zd;xyD^TxzbG?{Slqq! zDwCV{$KUPqeO*5fD)zer32KLRr{ZT2+kqwTw-iUf#ePwJmoMiwALReWH)qgwc_L%% za_ipMJv)t$KYrt}UhAVtkQUFI=oOi#qY4sw1Rg^FDyS&Ti3ueBFeG)Qp%Z6A9)X<Z`-ev#*d9 z9p0Y7>B8}bjv7hW-_-7?W+_>|1;HN#kW|OlL;38vqi5QDN>w;9E6n#P{v!X;`yiZ{ zzVmuLdb#K=$LX=sHZC;s@i{A0L-^h(7vNFuf{;|5mmC` zXgE{;zb<}FXjai!sAyoU9OeJ?&pVgs72Mq3DP2|(p8rG8j*NAt^lLMRzd*wLuLnf> z9uE6=`usY||MusdyxsTBDUHa|e;3<^-OKB(MU0N0 zOx0Q`L+=Ol6i}=?dZ+ZZ)%UhMmCtq0q8=!}U8yr%HGLRy1!Nru+C39>SUz$ZMspqi zif^ng7x(|N9lRxhsHd8$-#RF>f{=T({VNl`I*QR zbALCD(dRl3|8irwM{W}8?-PD~PXTBuIwWwYO8|&wr}gHxHkXWampZx+@3jq?ZTsl^ z7X;j?V72(GC*=(+wV?B3t7-JA@bS>%;IgebY_l|KeNviG4Z0<|P4>OuuEY{FtoV%H zoQt*8!WHqzg(F}mi<0Z57k!u;KXo_4SS0nxp1d;^r(PSjjsZ-V zjsf4JP#PK=A1pTIIonqwzG00*TRGTfHoM!_g@;BT1(jTj+8zKBuw2=d$Z5{h)LmVL z1ubYyV9uQ?#oqF4$ukd|eSNz+Bn6F5-!UApOaJlw*5=RVf%uxHUA}_{7)`rC2LI5b zy)A#!+$Cm{ED|xluvh{EhrnN7=Dxe@>|FdNuVSf3?7|Yqp|Npzq4(KWh>M*@@X#hN z8%Y#+@44MrZ|4CSSOTb6^X4BRRruy!MCJm<%TN@akwA~!=xmOOm);t1z@|y_)(V}S z#T7aW1VQ^w{I{RYyc^_c^J1BV0MY~DMV}Nx)9Qle)a1!_k|0P>;=km#Uo&W)xoW#V z@==>9<)tKzTd2!TAx|*kHK#-As<@y9C0bCi$$RKd(6QUQ5~KFZ=#@wbSO#~^JP^mU zGpgkF)xaex>7x(FV?8+K!DQY-_ST9REi`TfN!9|7(&eG-9s$sfqkM65yrS~oG&#}- z2xFM;53S58ZK=3=Z$}ohw=<5(YZ=`#WtIAaW4^{UUkDAI^>3M0MlKQv-GU-2v4*kr z8k~ge?893HQ?*yvjX#&rPhq9bvGFI?OMEjE1(G!4beZ!nKK@n4+x&8T+8~m*wJEci z{(kC?I7pA^9D(!-82gN9T&bEF93Dq?5=6o%%1mkJ2@FX?-5{LR{l;TytiM~-)>%3e zIe^V;UT=te3C|7)_u_U(Uma2%_x-iHPUA`~^-O*jr#a+xo^xm#;D)75`Pscqt+jkn za#mMGD6Ka9rDomSW5L!uqoc~NR3wow7D9L3bwr-txw#RxR5PNC{bHK66k)~9cZ(ax zW*o}&rx`4L^WPKD%l)%#h~4U1J-;1`ZCb5hb2U`dGD~|Y@1_^se5und(bCcD>N*UHAAK?CRg5X z-JBtdahSOeEL;~icOEs&j@;yiP!9<7@cjnGz2g@w$P^yc}oJwFyWcDRb2 z7HQRRrnOy!qlS^1^p&9bjF9|4h4yB}2%c(iw6;K`qMf7iiGfgelpT=?-U9id zpJi7i^=r9{@VUT0Ff`*_3Zd+W262ly9VtmlYmm`EF6)j5itZbRD2lAAgREck9b03Y zZRFm>z65=uI0@YQlGeot*@|L27$`e$#G+jehMvY^Wf!&^7n<=-hW^TVzH~xaEg|=X z6GVeE(Yp}=v70W8%@s&e{KjNNwmUSRMY-Y-b^65gSeR&QZcAEix0CIpN~ZT}>(&Od z-gO*H`0k)fq+_`*7*^|rvamXBjz`5L#s2z zBG>WVQ?{ckwVI|ypkgq7Xl3TUDWNf@ix9+SeCkf0Rzng2dulQQoQ#!rRZ&o^+=O(RQC|=*1mge2CcmtZHW4AQ@85uS+bX$(wV4H@n>yh1w zEY)+Ln;^pp2drCQ&-*qR4hYl_ObyO3-9LJF^TH~3F0~k*vF%t!0tTz1=A!xuH(S=E zsH?J&;AD$yDzj75Ya^PrJc-Zbg;|Vlwdjg^hEi@s_09U2xeBSf&Xl4#9Yf8BWdu+O zzxjSAUw4P`fWas5VzHKvAD`T1j7a(Zqf zZawqzjDr2ibBAP#>s~vVTX(02e`3w#teYElRty~@tWU+;>*f~sGGd$U2LmTwWcV^8 z^f|dAmNu@YtRN>;VxPHD>#s>$TD-h_|5*f*)Z*JTsRG_g{2EIb;6e#;_}Q{ar2!;e zd+RT+no05b78P<`)%tB)=RgA9`Av+cONzAZfLL;_cT_SO-4@G5s0vyCDyHjF#Zao6 z%(5I>eQ`!XJFAxJ2}B~6nyC`I+~jScdLyDBCRr17_aG2k62)R!(;y%QV?72P&3KY- zve4haMeiXhc3{!LC6M_;8X}^)uTRLYD_pr(6Q;F#_A?7e&|aWncLh%HEQpj?Hno&sqo&bZ~oDz7x;^U zI;b<=1K#K9;=ZbSbEQ71Hj56~s8uM0%ZP4VaReO3=xM!e8ZzKxvseMkZhTRa?FHMn z`0>`}l^!v>;Pyd!V>OaxGgy)Bc~oXLcwS?UXk86%r=g54Ww2(5iO`HQ)=~Lpv!mP$ z>Cp9}q<8!8b-(QBO>=koQI72%@E*R!G92A>uF}yh`9X=$$pcF-VtT*%`KB|Y9mg8*nc7_tYKn@XlEXzVEyC#;il-EOK$!;i?! zs(Xhj^qe53^e^gv+C>SlyC!7psrG=m)~(AcgGbHv?0Q)HDk=H6T*JPU%Cb?b5BGWt zoWpq9U_!d^a6p1~Q@bg7=Czs4b6Y6LN5fX0Xzm>K{*D)SmEg=VTwYFcd;A0w7ERL6 z;|v85P|ZD=5o|IXnAfgT40VG-kFm|~uh;D{nU0Q-2h#-p4=znAkw{wcYK-K zjXgHr_0~4o=Y)dPGG9#9&i09XD=>v8?#yuhZ^YhR^ci+rUbfs)$f!*#)8j2)h!Z3w z@+qxKm!z<8{CsZsRL^?S|4@nq0n0q~wYU*gdIT8!ohzQA>iLIUkMiLYABT@mHAo^| z4#hM=_aBsj_c%6e>Tb@+pMype>lmqlh4XxSpI=_@`O4+tc6R5~>ez2A;x zt(-13znNAL>go{y<~r!E&)PX_0Kq$KV4h0|P~gIh^;_IgDcyIZ)kZJ+U#uxjS$>N* zQzH9*YlO7dlBSJxH;d67q8Ih%Ui);U@3<;>Z7{$9pn@mJ&z+Dh-}Lq*%6dKd+NdMI zv47CpwALfxT%XHvh_arzTq_|{{1?`2JqRTvrRHN{ce)g&n(pL$ygl8>YiPN~x!#al z7r}D_qinX`K{IMYW+5fnP}>xnHghHV#O^foR3&cx?2p=6$IShSZNAKA-UQk?G(|O| z;w-?5NT5{Ikink1+_g=%hKgT@gM=~|zvK%W1A025K(Ot`o&^Ob!&DK8+q72_aLmK5 z!nWrO;_o*ISUQhl4FwNDE^Q8T?p9;ki#%N6#~yLRz>RD5=nh}BVU-u;S~kaRC_J#q zyB^7uV)xYapyf?rlkyLu4qU|IT3!TLMdh1>``E9)e?AKRAI#XB=v^geF)Ev3MvC^< zP!K=%VD~|p+1Krwi}SCPNS{>1Gc{j%9{f#5lA>D>RdI$M$6L6C+u{6?o3$PY$Gu=n zMJ_;{om0;pK5giR zt9w>*%k?>w9K|E-jdrp@%Xx(?@}mgSZj~NunC8#5f@hs31wUY_gl<@&oFcC6*maVr zc-T9?UO~@tQ>}b3z!gaH|4SM6CgKbWdhhI0a~jwlCypc)DCPBoOau=*YThlu`!@W3 ztE{R)72PIhD3QFdHeWS=_0Y)uM9~oG%MVA0#2)gA2HFc@0(qoiF=FDJ?OWXp^V6AU zbx#UDOGKvZR(?_YkhBQp+rOw$d&1c3t;VQu zZz*Je@JIS4vw1VOcK(F~Vr5yy9~xA$QH?Xp`VW`j2aadhw3+Rn2P)&=mzdFJD;&6mfu5O&@B*_q0^ z|D&tOJVVc4J2GnjW4N+j5ou+2qa83hT56H1CvmfufW=OW)O{u*mhMGLK(wl$@*LcQ z-lH%zJ^LEY86Xsex+T5vgW%>OY%egwY5nZL%5Yk0=vI{TI%27@z6a_Cp}}Fex~6)?xQ;N^w~Y;NOz4ZSS16*2SEe zJ*&Zm*?vuUX%06bVxzadS#{19-P%zD8Ltf+XWoy*wyz9+U+!(wKmr=0HkjzUHxXjp z2yK2e$pk#+zb2dr)FDe!&$gDB{x_QaI+9dp9z*7K9@Nka<*h6@J13DJz&WvDjn$sH z?!BS_bJ}iXt6qg)`dds7M%E+`un_CP7E6Ako+VlF429<8N=i1GFN|wMKV9tN775ypRiTUBcZ>HJPMDW(k%963<=0q}@mZGY>md#sd z-$22vTurVPkoY^WLm40WQ%%!XK^T(rX24sj_*9B2A+VPI>WNTB?Lkt_edYm@scWxV z)i_VE=Af8#!~?%Xx%URH!jQ2W(VM`rdRN;4YDc>$ZJtpIdLhVD2 z@?FQ@)XEJs)tMDDv4%_>eZs;jp$xq9(U#y|0?WoZO17lPH!KW|H%pzxcdQPeGZ1w| zQ?J>O2SOnw@5N?2mwrY|8;J=wk2vV|pVe#gS`HbS@#}tb+66i5wC4^komEFex+mbX zFh9n@o6877AX>$Nj`6wvc)&a&G!>n2cGo!#^VcsvZ#FD$75So8{N_q!;Bye&nTM)# zR^)a-(xK~h5L~8H;TyBm>_mZU-x}?AtJPo7^JF(+;QMi$514-|%s;k?aP@BT*0Lj| zNRc5H8%IYgm4kR*%=5?8rCFb}ip;T9Yd&nQ#X(1| z1k*HZx_28H#n*pzuqCxvclT`nbR!RBKw6rwuP74`ww&8r0Fv>_Qb>6U1fW-6ov(B| zm`_o+p5e`45b-~FyuO6ZS$7{HPo)1~en7;6M%=%~(SPGZcbq^{b?9hM)P6O>zm(z`2zC!A$K7|*YqL=KhC7+`Xv$8X5Lj*`?J!sFK1+Yk z>6{7KBsOPCiOk&T&4=U%)VTpU+qkg6F4Pxmryn zDN4jSs^3jlPp;BhVTmu|l?lbRTLKNf2R-8pu-oiNu8@{uUb!;ouSC_`&tbB9he&7o z&(0{!HC;)lUinf03p)QidB^EWI5GWF@MAP~rZgVvU@iYoO2t?D6Ebj36>0x+e1wJg zdwp=`{HT~tT@UvhsGn~J2T=>iA1%+*c(-DD$Wb`bQ`yD6Ns7mJ?mvOxz*;R`vD6!7 z>1T$*GrE6`+1t9jp2xYlBwBj*tPw9ohtSn?u?Oc&->>u^=~l75qy&Hu%_*+T(nYoM z2TFg`(kGGJ1!`If;}i=v+fSygEYB<1Jyn<)tiIH9{|4!r4-I$kODNdq_`eC5=b6Eo zDUd>n>fp^w;zzD?-vnk)?mg7S1{fM)>~av24eh>Bo=%y~*`S4m0bq;g5g82p$gc@u z{dbm^4r$NpZm#9CCCWpXB+0b5+4a`1$eRs$1o$?Kj0%q^Sq&-AfqaweJ~}F@VSTpZ z_}QTXs6%5w5*e-hIzG%MGQY3WT$k)nc-)7N`lNGVUol{7@e{f2w%-(IO0%hI1Xuj5 zeNKy_^?J>^*9Vb|+Oj6)zcaX+L*DzIflMG4K{g-8dr)DkRFQr{SKA!dc7muL^?^^n zSxN+=ayJN-b&f6hqM(*ZZ5 z4x8e#v!d(}p^KvjsOLW8XND zwiayg_;u6VP_@CV=`+J9EC2IxQw0}Orpj-i2Cf*i09{%=+lH7HAc4R+subw-fmSRGKRL=k(>W2$} z;ueMj&)V0_J@;tq)6A9LVs?79Bt9wh8%M;tks{8A29dtbRCP8j4G4AF{oh{U|4Dt( zu4ozxfv67oeyP%(?9EEO|8RXOL)QSn_st-5Ms)6l`|{V_Gf{V0^u0y~WauA9NttYq z>Zv+t_o^iK@6J0#xE4{^7+m#MK2l5@zdAWnOIdtv=n~-*Ff}B0{WMrYjMV7wTOIy| zv$j#PkFo-KPXQDiH8YFpG|=UKsjKY1U$K&U|JT|EbJU>Mx2e=dD*bra zIAq!DJ~9qdlUN7ZEMZ7i@OESB?Aj7y9Gq6W&n<21*C_-FG!yhxLyt38x)sB3f-D$D zu3q_+dsse#jv@LlGq+-2Y=mC-;obez8sKAfj1|`+C4*WW!gm8$LGe0=zO~v@om&!K zx*XK0R-bZH$W%Ha!q6S@L0JBq}PY-y-x=qB?$mo2DEocg@vb~H{j4f!DMjO?ZLhFzRs5SaL<7mbdtyr}Rpua&E(#U}*uLVux!z&+ll^GKhNC zQ~*w6)KrIc7CMW+ccKP$e*K{z)px%&o);(v$U%D+Qwfj=r)so)DiBcKmhUMQ!>8$j z?M;BDq%-R%>D`H4WaqF2ZU1w;Zd1YPQVL_}Sop5QLwHgnJ}4*4Z>nqNt+^QzZpry8 z9}I>N@8LHftnW@>Tacm^uKvgw@ z<|V*ByA~M1Hc|P!2wvR6Xi8kxqr#l*{`K`QXxdp-4`apac6;qQAY0J-o0$Y^^w?kW zwgag?w2gQ);&jfkupiKYDN37Ft9#lo@^IXzrkUu4ZMJnN^p5KDU2k9hS)t!O9GH=} zE&_g4VAi0Nj$%JuT7t>*z)foepcWC6DR!jSlWQupYRZBB;R(V<8|A8oR|8vYGHuhT zxpevXT(CpkmPcAxlLSVTdbqcm)REI>HV~nnCvdE1Wd!|P(VtPP;?Pv#OX%)72bryY<;#)NcKHimgdUI8ySe=0xWUz+mB={jGO9}mi0fjGiLD>pY-%(0AT(7X(^gt7Lo zAJ@QfE8Rv$d46WPh00{;yQ7j?A%8iL?SFY7dUc?3aI{1H$%5Jb#TFH?sk#SSAl(Rh zK=sCZC*4V#cVAu9G47)Yt<1)cNXL+F4+J53_`7*iC0;rj;}5~Rk20lRxIQ070MLN9 z$CyEe`HjQTo|(BR_*<^$9$fKnPK7+0F5?oyC3e3-6ph24wN;TciSOzNs3ZWS%V{e# z1xHjbs)>--^}#;3e^v=3wN)x!V~B-#^-LUJI$@!Py*M%o69TgqYyGz@CK-(<#mGG+ z7rlEwj=ZrUmkmvv3$EkAea`p3RICV+#-05TOqRGZmp*)v0Q#_A`zYI1=!#PiJvJ=& zQ*`soX?q-H3=r+cu=b-x02uph(o29SP_3%u&M{cX-GRdRN9|S%$@Ek83t4e3aiH%x zcjY^^o7p?AFypT{ixbL?(b+4dcLP5yyCLD9GK8huRHz>_2v>I7`JJN!6LqoC7x9!# z_rE@8_#^TeP)CvUgL$FSYQ?Wrr0C`H=|fauONnl^YRU_piHHV)q~#M4Cd^mI3=oSx z&Nkn0M{)0-hn#hTtB)qOmcA_6mY+Cz33K-w^{PiYa%xD}S!&FA8XYGkoxQig_b4pH z$JzB`bLpS*6N@iCZq3k*(%m{nglNmjv=XO5KT;jGdSa<(V)iwtcm_oi zPONAQwRDo{d1?3_h2R=>Uzy&|PIa}zM^xbnnHu1e*q=7>b*O^Nmz2ZYKdr0OGh7q{ z_=evXE}u#N%h_ePFd&V#F&r)dmmlqFE#0Mh^#=aCa4hVg|Fqyxb2FP5SOroDSU=)q z;3DHr_;Q2wZ=|TbDKI^ZjFt9YZ|-s13~$+#ld>-L*{M@T$vy!YH-9X(}tqGKF` z=^K@t?nfak)ja(1r~8uMzzXl%lfpcgEY<2%!>w#H-_pBnD-=(u5)%a8mwLSU!6QMC zkY#Ipzq%d$GjcbIua){Kbhm$%va8Swe@|l})vm^s;lAni_OFuS7hyT^&8r0?SZHY2 zM7-yU6Kx3L&KCo};t5pG3?AiuGkt4W^%9aPbs{^G!M6IK?ne@O+y8>PGKr3i9Sz6O zXTm2`wf&`+L&pPH9$r3$`ipqsMC*ejuRZT?yp~FZ+iO>Qix=mX!C)OFbALFF^5M&hod(Ir^K-m`9*Pb^FyD~p+9%Q>C9P^V5a`t#lm4_G z-jDBaqP=1s;)tt+wd<$SFaBmmG)UnoZQ!FAW2dIb*OcvS#GD?2>|YFhl)n0osS+Q5 zg4bp`Zh2;i7w~Rn-KC`DquMxaqQ8l(5nnRNqX?nb5a01!Rh9MnMeD26jb>c}qF(W)tiL76)_|bBNQy z$ko*^eHlItBbW$n_%M*+g%B44n|vrL;5bu3n|%1*nTYHySj%jO<`Lj1Bk-lTWYe_Dd~orQTvoZ~*-LV_)ATXen4R2i zamko?5^XiVS-~#lFk4QCvrOwQ7x&Yoxe;DfjqF@ld0QAp)K|id0@@18sbPhNT_uhnLKY_Xrb^b7lhismBXIXeNSUXUo8V=}fDn|YO zTzEZhI;SY7W92z?y;Y7Za(EaBF+qzJ(yGQHXS9ta{G=UoI||fBal_O_n{D}pSV(PL&$+O~%(*-aC3)EGJSWLQvSox6@LI+jP zK!1IB(%|_fRgs~q@q$6V8@zcG1LYcEI#1wF6Q;)enU9(|@Cum*o@;=AR6h1(P~GGX zWATrFsw}dQaJIOLe|za!vcd0!Swz56P@ME_p|Nxe0r|^fu7*r2Ezh%9oL|;jW!7oD zABMnSj;}+Ruql>2S83isy|x%yXtbtv*c#&xe7n$O<>7SKN;tDlg$XpBSAZ zM8$LjthKZZXuTILr&(IbKvNfJTaI%(-@^|q%gx>dwvi#E$lpQJM93#p{{cFtr`h+w$c`T8=OK z7NicJY!EA0_?Tv-?ifrcYcd1)oYCEt$EYpt37F}ccGlQUHM5_8SW#bB&-6c%vpS|W z>UM20SVQ7JnL07IDsy@oLRO@=BO0C%FM`?Ypj`VbDkz`OX1sX3R_xOIdQ6V^C;tUuG-8) zrPe!bxs9g~Bq`BnT-xPjol-m>V|G`XUV)?t0i#|%hu2`nq z;~N$^k@z-lLPNQD;+OJ2BR7^zz=RiBL1?eD?!4x7>Ec}9UbI0JE3-)hoP+&&v9+=7 z5%uOjHJmEYV3nQoPODJokCslR8g_Jll5uLad1fWPTONAf2ts@W6taCi>Oc^@hiLP} zd-pks&8ke3m^qrh#OZ=n5HJ+zsAkY0BF%GL$a?Xn=*Q z4$0^fZ+KFHfJuv>Qv)f-#^hAe^IAy3{26D63RQOHeBYU_bk2OB zv+ON}+?dfCt~ijnm~Hsdl2%AUW~SrP?*a?)E)+sFpc%mtRSF!ByK5p;p&tc(p*= z{=q4S$|Lw5x%Be`1#cAF>|vAbC?%y(<6%ho*|!K$z(@YJ28B7(U}j#BV!k>vHLeuN+2QmuOp-@HKWJQ~qjzes6oX8W^paUsPmOB$pfp6s>Dh zDYd9talRMQZ|UfK?*nu7-2C))V6}*spKbJkafzjO*Tk{f!3iUL`2b_(lYkAD0g4#94 zdN0z_JrWj!Q@m}ELc+(4!wi2ruOlf{Z_sh2Tql@W08P~%JFDhYSm3G0 zHx9yhzA&~lY;{CyAzUL>lNH&GQjP%?+q%5tXI)CIjU|t$#{V%nvnW|{&VX|@(po?} z6w-X?ou!al$k)P1QxP-(BvkMkEWXt23jR227;wM&&$L&Lhs}l??dx6@_H|wr+&MT( z%9Z#qtU=Lg+f@gcUj7x;ktR)Khr}a4hC{gR3_sCyz)jeJMY@00s`(suWeTGj+jfb{ zn0#AK>rpLeI;xhS%<1`q>{kycE94fupl!5#Y%}i_k{UlFqQlBZf5qI$&e(h-WR8T} z1JR-s+hO|6>to7&6<9J*P0Ru%F5mWm=>m)CPpwieM>E4VgR6WT>W5|)yz}1pDm$$) zims^CJRQ*2%WE!k=29L5wM&9z}-E z4toGtI)R5aHFP{E-CI^?XMfPMnF=yF-8_pZ+1?;3jMnHXNk|~cn**CPxYApf5y;jD zuzQg&x%S`HSxbtF529rG&;UtCI%1;uvL3$m49Vf@rjfMd$^aCIk;Ltaan`&B*hu8a zZY17^GI&; zDG@k+lNrV)5P;5ih6sipRAFt{+AbL^I-WZ!@Kr|YdnC0S_uVED35?wXz))FdH_W)~!w^PtX zl>E>R@0%k%4^!A_ml%NIi~|I@rJ-1v_~a?1;SGS-zy9%%bIbAcR6 zbZ9{e?vSdWd!tZ}BVntU(-o{#LFx<8ZprR)fu34?FxiJ)>(kH(dHT2m9d_c{Wnie> zeltf-nH5}yQ_X-@^A-+vE;5vSX@$youd|ohZ=-JZ=Mb_1QL^vU z@BH{#-!VXLeGb|!C@gSDBR4}(_DJt2&=1p7-IaL0i_f54i92+F3&&3IFYKEG41>@| z`odg~4273L!3ZUYE>V4SLt(g%Iqorw3+&cr>zsfR);ngJuI$YPhSiM1R>Q|IomIdr zSIwwH^Ck>YxAIj&({t7(d?^r7r)k^51UDYtTHsHOhc46v=ONj;QdEem8!!!apBCyW zd1V>KYOj(QL)jRt^Ko;{7{*|wt~1Rusv0p`xn`*4wfeN1)az~pxRD3do9ni8jWr63 zab*)|CjhW;4LOLs4xs!c=eVq1Fg=wI;?p<-VlEpx{7gRYxp_q_<6U56xYkrV3IbHO z&qo$~3+DZ1o&f_!D^`|uFgw`hrNws=z(|50Ygq}=IypG?)^oD)dvwEo;C!qPV?FN7 z(juve+p?zB1c3W%jl-<+5H^A4Ww}0w0A~9ur_;m1p`6+2F>Y(MgPVbfR`vPe4?jr- z?BXEo(k-@%5-ae)viL4kmj1Nu^>5>)+@%+B4!QDT3y4HDV^4l9M zfo0d03QWgi`sww$=uBnT1ZZh1CKIJ_SjLB1U**f~JJMC)S5xJrSGprGD*ts)c|Kye zx*tFmzFf^D^|DG>6v*;#cy%06Mx@mHj#bb6XgN%)A9!MfUah!vHyuCHL%ImX#xDld zg&mfNq$X$iT$YL>EOY988h+(=(?Si3mkXjvK$p3bGTrBc9~Ijf!5B>kMjn9>vYZQ4UVobgJxcmNc45e{h5{&Qy;;85B!Ufwe-8`zGc57$FVyG*V z66pH%2A<38d<{*e%mK^?PRl3?hRS3iSA}Rgg>ulWH(@7;S?cG=s-BUbFjvnW`C}-M z$UlHnqqW%N9?@9N$GNzKKD%b|qdS$YE#N)!LZTI-_m(jU{cY3xwC128sS z&G=%GiktiZOkamNv8Qpp#zXh5RzE%)L<46ovUr7CkBrYPeDo^34v4VDRQ_b`UXT9w z`xB4++SeT7y>QLy3$?({XSA}J@mF7lOU4vN7@=17xvoQl`&WVJs-j@Nsgbj2+_AtE zyp!0#BUblJ|Nmgu||f`<2%u$)5K@5)LRjw)RjQz-pSyRE1kqq zakY(Q`%rGmhnc5Ft=9yqsZClMVkDY#ZP*EpeGzCDn5!RG9}AMMYHtc_LZgppBbHY+ z!#q#xiROSYY6%xdK=ApL!+ANtk${NPMEXTh9K|Cx=LUC8j2 z{=0*}F3>cP0pSuthg^wwhgguCf(9G zsydKfQ6FIIsH$Mk94T0XvcJD=eodonT8zYghUU4Q^p(nRSwqC}w(NC6 zPP$jg@j;}%N`)yp&@3iPUDDKv0<68D~*Se_a+}fO-8hp9D1`?`-oeJQ0 z_ZQKedpUB!R)tgxc33EFu+j2wzO#Pw{UyNn8Nc0iVA3{ONjmd|qorwHSnQKW87izG zfpT${K$6N?_BJn8u?-Z}6Of=BQtz9VuJSP@dWlR+rZ8;PpYwZhn0|+bMm!9*)0ktQ z+lGePrmlW3Z=4k#LA$su_R&#hf_A6RJ;cT^}QNn7|8JJa~ ze}|;ALq*j0itI;E@6E|RA~{O$a{1yV)&Na3efiz>ngb_E%S=|XEw6+1ftGEk`2NPjq4+r7i_M!8e{|+jmI}G~!DXxcxGc zYqG8hPE}rwC1JMT=rSzT101dB4(!XsR@=;Uf*<^Wx12*9QG3n(5J|O zkzh@OWNkHr_}9-y(2XEq{;=sNhS(R48@dBNiQnrXD$s+k|3F@GZoC5hFaoI`TzEtX zgrcW~X?JE%rc~sCRf6iQkINMEuue3^mBS{?{#}=X>M#=F>CU)q`LEsdpM9S>w%Ca?`5?G!{5vq;>%~BR$ zKmrkRc9{wC&XJ}*b+p?biG3%&IBoTlH&&`VKAHhQlbdSF4r3w3`vyhX@eR@v>P?fF zN+6K!F&lZ~i|crWag&9I3SIW~Kg?^Uv|mH1%ySq|E%IIsP4>*U_|FfL1Bt51jigVO zdRep|3!hH2{ANsZw&kCiWG%^uW*EAuYI+6HEXBn~p@r&c8ii_3#;$_0X%_?Cd?Z&i z{m>~_g8tTenB(96IDI!VoM_2}u<@!j&!DGW+wLmOVuk{#!mfpUr!eGa@_a;0LT1+M zo#D|yCiv0DnF+unoYK2-_77vQA?3PJ-sVTKQVofEqR(4FlE4FIXYT$FjL`bxAqe$= z3_N~Yur8$a8T7vD-o&8A&3xZFns)W@m- zlcmC8$6+U;n|g{tCa944Ww+^bn6_+*@Ru58rLPL6OuB6i9qxMC0-#ev^Qy2{+I@GT zS5X+6gwLeEkNHQ0mjDqSC9o`Ax`D&n2|EY6Ys#ig+O0#m{!xAZYiIENs_HK1@WAns zIv{@mMh1Kf^(gITVh`$Xrg$_|$OYU)m(IR+%4$`E8Oy&42-J_t$G>4jObDN*182aB zhh8)^ibjh>TA&L#X8A<#OAWvoMeI2%_nt65%2f|7uhm1k%bJYc;vngT zz|b?*GALak%sX9D%(e*ShrjTeQ=6htm;)pVq5_uJ^o<6fXXj!A)Tqa6jP!v4D%CR2 z`VF+Z@Ji~mg%FkSqbeQ6-$C1(2I<;5XsR0kW5!9b7)dh{d5KQE@Q=xwMIzTEn9lGpGerJ7!RB{i(_D9ZF+2E(;x@8S#4 zcQy9e9-EJLQ4gM~knm%*+2B)NAB5SY2F*X7xiQVQDuxCYLW|u*qgpQr^tVTFar)ax98V@- zJ#Hh^bz#OUFrc5wOU3+J$_-%6CsJ#Ca<%;1O7(< zu#eEZ?27w4F=zef=lvAyo6>&=xy;`RmAL*~t7*)+R9pyW@n=6&phr(Z6NqP3lLYB&Qi)A}jm!y8Rd4>x(rPm{&hDYYQoyEh;01fjkVO;2U1i%=Z;y6_LA~04W zR?f#tMoY?uSrveQB=-h4Fcn3DB-wG8hO)NtTQ!fxWiTUk_aVcuyc@2kflc{ZS!k9; zq}{jeCjjYn*Q}RJA98=1%eQeQhQImgmqUS0z%d}SZLc+Tquk{2@XtPn z+%kF|_zBiG?Ma*{P#~P{xY^Xb>bi6K-qUnkYsKHecH*C4 zTXd_HyhF=(i=wQCirk-=57b$?ZBiMhTF zX+aPKDFXzgyGsdaB_s!Fq@;5Ir9>%3y1N;r8JMBFLxv9NuAyd#`vyOs=lR~}{sVWd zd-;jASj?P#&ffd%{d(=a&pPI&>MXPF$Iun!4ft~Tv~IB6#@57LU$sa&S~RmclL6sxGW|&4O}gG_4*&7tg*CDl=5+8ep(wG*ORXo zMYRz{A<^$e01|du;DWWzZM5@W@fzti-AexnuK?AfG~$C+Da*1<9lb%l7P=U#+pKD6 zz*RW*ILRw}qY0!!OErPBae&IK3D2*5g}@=H6&CZ z_%*Z>ES1(HV^AqMJNRKcQfIm2g0G|&vut>Sz5C}^4#?CBAUzWhdALe;E4c8XaU60cBDm+}p=0XkWURB>#$Q0PJrtYiz zCdl)>f7Lvz12McYS#ABr38-;5Yo$owlo`GCHtTb(^-K2|1=r>| z+lL0PX(HG4Ck{>vf0IQg!;_P;H!p5>NTCzVLdGz0sUXWql`uiivgD=+58eCR)-0`gC9(;E^(U{c@tZ9MjWCGlN35CUzm4C zTJxX@k??8yp_eEgDYEd(746g)ve`wiPk<7P#c$uHkLOE^F%*&7nkgbP70{t|k3w3o zNMYX%>P(SruEk~OhU9?#Vs(o6D&a92iYf+yPhwtG%q9AJT%dFoebqMf-IjkxZya=c zTPfu)rdQb0;XmJU2pR_Z6pR$Y>TM0!Q~HzWpwKawS>(|RL^AtoqGbDu77()!&!u>- zPM@~*COPbUPWAFqF*JWWx-_P0!eSnoqIq-O1VVA(Q*%FW;`bn6DA{9^Rf*v8NPWaUVL7KO>m8Hb%SVw|DUW#5H!Z#$Y4yBr@c)ZjL$IF=^|5i@abh zhEOWMQP9e@O;o>*3urA>?$||I-v`fBg8jPzg}E(Vt(>-f5s?G`=80B69?vPPaaRPQ z^H%=(6^euF`25;s9FulsrFX&H-}9&?#r+j@ViVdBn_>Y7TGsKj6;4hR)f!v*R84#{ z2d~l)eAe62DC7U5Wjk=XSOxC7F-o8L7uohbmQ@l2!SIIej=0T;6^5-fS9ylcw&(X% z$Yndpn{B=TT%T}c?W4NP98A(-&*15^9H8AO(_bzcxe;C8_h$6DVn;=<*c~7_EUbbv z^;Yzh|M1-F+`rcln(B+Hg?h#syw4mh9tbU(SxjFcOyqo|l6KV2{==Rq>c#dr|GPa; z*)qsGn4JzNJyJqsqeMTJHd}i2Es1wE%NHfEBDEnWaOg!}05GARcoK$V@E1+MclC*p z!$yoBLbk{Fi-mW8^xOUZFw|xW^U1aqex791ZG^a}-Qs(FJpMzRgYh^=+5d^X-;-s? z$0XatyHmg82E+(~D$obh5CSjW47YLt71C~b6^7{yEq=~`?Ni<0s+S}Md=2h%Q#2=6 zzt&OM;85oiahvZmWk?oZ#7>Lr*~XlJppgkRD&p}(xzrLk=V0u0;9{&V!#m;KB(CSW24v*v0A16d6Turkp4N{7~k+Mc~x{^ z#rMfZa09?YqEVahiaJBF!$EvNHQ&c2Yro|qO)w%~;4f#J8l%Iw?mxvy_j`Z@Zg}NV93l0Nwd+i~sF*J)oe*OZ z=n}$^y5d;_I{1VY%>Eozdzc<#OIiK`-zpUT2Y2{V=5ij3vbesFur9Emgncug*3SXF!W% zuH+FyY zr?%eS?lS@oQ&l}mymtv>FP;DcxuE+JnCXXiqF8~R9L+2mHVKS5?+H zpPI_jZYf-V1ZSBsT!8scZPOTvv@f=uFiO_Pz6^BGr-cEnjB4kgI$MSZglI+o(JR+Y zKvqjq1}&hCCm)A`-h~?T_0>P}->fX)3yDZLM#0r0uv!X0I09OR+C%$#prE?4Ax&t1 zYOReD6bZBgdhoeU8V>b}uF72(T<6_12pn`B{!^*#J!VL@3b5w5H*CYTfg*uvVJE}- z`qkjKQ}Clr&{3?uL;bI;SfeS2xH>fYoB-11H*#5jJXyC7pZzZ~q!f&fXroBbEvFB& zPn8e_W(F~50rPjLX+@8L?q0(1(HQ%rJ0G?*nd9J1)8z0nHKc!4b$?f zEzee0-RtC`-=*iFjnswRv@0C7(eS=U;sV(NH3x>alvKlWHh21}XComkqLwrC^k1(d zTJ2IVM)$fT7Vn4M@69ErU?&xYDT_&z4C}tdHd!<1U-PG$&1`BlGB^0DgXKfj=FVE{A8p1b%j zNkko~4+W@_9Lr@bt0anL<(VKnoa%w*0C}K_e5GVl#BVLfRa!Upb|gnhP6IFl&Y?C3 z*TqiMA%20~{lp!}3Nr)5r-YBYH#e&`o4?9=Z+3;y(|uu@6Ka`?{D;ywL>KmsyM9%_ z!WV1+`Zc_)4e&j#8%5Y*bV~v%8(EPNa*OSAYj)*ItD85pO6lOL?4&UB%V&d{=Ig6@ zX{+1L8`u3Y0g@*U;j9uRvA4C3`-PmX*k@Myc0D}x0rk;Ta)_+OGCFa0otZc?gxLDl zmG-_}cN46GzbT;$DeK;{%=cDfn-qr&Na4Fm-oGsgG*%$==YSqMK)jmY8%KqBS~Fp|Kc*lDGkNO^ml73IXg)7k_4`q3weMa8S2S; za9ga!+gG$tp2Re%y%OAU37rE2gtZa%P4PL~+tTuW_|JDa;>fco?Eyv7LgNjkgn!8p zQOKVWd)+}#mAE;_RWVLKoAJFKoAqs-=FE=)5dm0Mbzn~yx!j4Hrq-S?}&U zu0At13jhrgFdg|4G#^YvzgQ9{zskm$Znf;C)#%z1UJXohnD%%BhROkjcRX*~z*rc- z{1`kfv#q53b>5v&wkDuX0VrX;<^d?gVJ>zRKu7s$Nn+yteBH6XM1Yp!kiHB|TzMqf z`?5{kQ=C#~HYSc$1fMFza8!Ridd6Gg=-~Sx#X<2!OpUI>08}J*Qo=o@MBn{)4(v~% z;`RKjHjsHm!+UC=|Ja_IAM~riu+=n@vuHWPI7j0RgJ4O7r}o6_a!U8QV358L z5+XJypBNZCN#&8Doh!DW$kb+&hkhg%dtSEUIiov!0NNwtCg}k zIg?<2U>se)QWmGhx>HVHk6fk_ZJ^w;`pkndT?shw4#k;B#D zF@I8IXOM~2YIx@RqNtRh- zgw_2ud9kYKAHU@}Y-nfA#8ueE_{Ny69(_@fg%j7}Nbl2ekR89#{=T4}8$$8g7K4jS=5v`L>MgKf#p@Atx3t|Lpj z$_ViTk<51?@3eg6jRZ<#B_PeiVKn)@^`;Tk2Ab9%P8I`FaAADc7bv^rYW>%&$MOva z!!@HP{ASeH|3p!+|+G%N*bw zCqGFW8Kb)JzET9hS{LSoLt3zbzESGsG>U)KBPs}EUH=MaqnkkUOCgWcuxu+w^|afu zuF8wiE`Gz=;y)Sqb&08;>3ZF2152ao(4s)ew?^iHaxxzb5V$K;33N1!M5v|iuye|g z?D0j`Gra{2Dyh8ZB`9nd00lmLC}@r?%@Qnd^ISV*G#^mZ*l78-QbgLj!!h zmg>icBK=bU@?u7!=*`bWa%)w57zO7WX?#OQ&hmyjcfZ%w^j`W!rn8@Ey9#xklf)*E z`AE=XT3Mjlh78p%H}I6EoU`{hpYEvRl%ZM-h5OAp^($&5Vs`*jYrdI`yanz}=NXJrgdp4$11a&1oghgW?=W?L(Xa9wG+jlE6B2 zCFy-KE%dpcgK1!asem2wnmR0u4TPl7o#f!3%j-khqfxDXp!s=U#NNnuc1|6a7z zWGUb)bdgUcR-8j-6|xJPe@#b2g@Kv1857>Bo%0(5@9|F8wib~Pz8zd?6 z4h}1@#kvob*>SE%Eriy7G@HYuG{=5k^SyjlvTiR3>EI#D5farA)#fEWSPrX$PmJ}Q zxX_0Vu44Q2hqBEeyK*>RWqnaAwpl2#+g+XdLEB32=^}S|0%^GHzga)6kg?>l6Jj&{ zRk2V08~0=_J(hn3$PsJ*IqO7ED)fgSM-?{%&9E>TGv(Z6^M9_Iiox1SHo}7AfU(@C zO^=Nh@OsJ(8}uY7@QcYD&s>3q}C2GC01K0 zj`itqQPgXEdN+&31ZyihbMaj@3%B2~S#g&OPp~R^yna}W9deKP3wlQRu&Vj^(Xwm` zbkSuQD0R7$(f~jCq~sYUA;&}{2elz@4I+;Ekh*jn1riC*9jGLZk}(R%=)rrG$x0aY zXp;c*JLBqVqhpMC&GJKPjx4_4T7YIy_OY9Rg0*qS_kzwumjW~IM8rPVkG`S-(IZ80 z64$!GoJk}3VRR-2YWHbSKIfN7JHWDM@Afc#5p{FZwXOivIv!B#p!n^bt0k*4yD8kW z25xhIRnGP9Y~qJeBu))Ito3?X8e=9avX5Om)_Zcc97#p|z`M8O4&KHxx@L6(i&hWr zvK*_bK6z`+_dj=8ml-I5*bMOfX${48n3&R;xMe*WA5y%WNXXF5x&-g|3RIkX5tfw1 zbyWSSjXRi=zgH}M64rfXh*;3ot~WfU#s1tWtdyEs*ZS%n%Ey0K*zss7ES0n`SB3M+ zuAubKy-mIG@)KjYA>k^!JlP03eZAXEcitZ^U{TxS^VZ3qL|L;auA@6dZX<$MZeo$u z>=HFg5Z-M%h#9%n^Hwg;fnN&i>~@ho7HDu4x@8btk0Tp*@5KvqDu$P1U6{j1n|_@2 z;VlZjUSPaKolaa8-ML#cv*)7)yCr-$D4Nc5mZB&$9b~ox>dAB0>^W%vb)s4yJSNuV z3bSQdnuE>cr{w@9TX?pp(;jYx!tFKfg@SxWsG`jk&8p@8? zWhSINFjrQy(v{O;a-GMRa^LEUTf8jZ@WUFnG|*?d$ZR`4SNe63@eR5drg2<@p8#l( zOxD3T6_2fLDvoUG<}wcazG=2r0w++cj>L?fYSnq2(%yK)7(oAwAPRYAv;5a;V*snY zJ{kYxa|_`Wh63uR8#3;<<@=2#JiBe#h>Qm@gbhSigjr}26uAO6jBvQqgRUMQ59qLdw} z^{i+0+O`Km*$AyZN{CrZS@FEpKC5+E&of)ux*Y_*ZMYxm$)28B?B|CljVyN2Gn~hW zKQuq>#Pg&k#Q2C-%WF9*v-KRf_$sx1erBT$jXzUwTNaXy6EBrn0X(g`4qX7es=FHl z*_U|Qc`wLCU7)FASK`sBODzeve@k)ReLb}LeTJZ$)5STq+^Ns$YS*b24xg2O0j9yu z?lgOPzmHda9r-aNX*zYcrF7?G7(Q|hP0u1$qmJ2>9q-}%8A9&ywrdficPOLUeEuWT zh^mLxdyyu_s!+Rda3fs`{*5{lcsv&SFxc5#wLjl7rG;eV$}%IOmEZtHgxF?5*d)eE zb{|k-M&*@~7=(2{VGH2eU$9;uJRHA5%#Ejn(MZ<*e0b)xt#@=Rn@VD}l3dgLOb?~k z!nN*E`_p23#pMO(M4B{f(P=C6J~BVxlx)E%!Vn8rYV}m~5`6;E^fzt4)e3|H$+K~5 z`p5IF1wnRNT0)H45}J;}{Z!_WMe1jp-khT`9sVD2k<;?y0$ANzMS{7TUFKv5$_@kW z^qAOeot!=lyRv-FBWSB1w-tc8NWja_pO{l8Gp7W9Mp5D@d|Q{9rbGpHZl6hP8PIiF z4MgGrRnKuvh|f^WTk88P=r5TWSG|S5AuCrLH@5N7v^o72O0Z`>BRm7hO%j6y7o5-@ zJ%uBDp9ITA?i7A9#(iA0Zl}OFfXnBtYLM|sPpkG@mF@O}bgXVxiMxw>jfmUIcWlPk zHm|hWpMK!tYGO* zUN4=E-Ibs|by{|!&tyqHch~a2#RzGNT5k0&oS^$;{;yCoz@V6P-P=qx4~6pUoBgYU z4lkk4g~6yVmG%!bC-+ z-<_3Xw0y#-5Y35|kmXI&Oc1O-%x2#B{KJJq*Giu#!Qpd7E4|PaZ7&!r_d!P3fMYO+ zw@*dl_2psXNqA~Vh?Uucv4jh+H&$iHjs|@W38!+f>u{%k$_E1*pPOpKF;LU*Y9$ci zJF<5?iGo>~xilqL#(At|d~%*-PSIdLVU-F(ul*VcdS^HE@b)&`RgaSD4+V)+dC6n> z0X|rXMaBhMkeTy-1m4xyy398a<=)todDRK)`2B;14-#;wv8#dGZ@kqOTzGqzDJ0Pf zq2&M~U|g6L^FDqra`(=0oyMR>-n~Ocmx)C-v&-N>=b%lxtY7aMHso5unxG_Y&p!33 z!f6huD~=(dPFUdBpY~cHp+_4aDhATq!2(CQW&VmBM^2A2;aH#mWzUdHSubJIq3zF@ zWE#f2mg3PmR2wVYjE^?>;CHN2nm@NFH*3g4YCMZ<{winz2wBbB@YEHu7Z-whDk|hB7pC$#BeUmzJi?%xCEBe z;Sdh65x7Q!$VgqO3EwivpR_QL7HK=YilCK@i*;U03R)OEnkS5Mri)+ zr0T8bnq*-tk&;>>jBKPDc`c0uUj3PJT%2U^XY1Q{NoPv0zeUPTT_Bi{W{UftL{5<%-@0U>st*9H5r|Za6!M5nJUJp9+ zE2Up=%IQHUKFtaEU6$;H6$Hk~zg z0KY?G>)g8sc7Ljux30;oX85WK24lW}7|B%upZPxos>{A-%YG$%ul;;HW=b)K zBWMkSE_`jK&^MnkDl*3tq_7b=K$Qvi$9!!D#~dzr6BjMIOPvVebvdnB8qP^8cG29K zZ-U@cG(#cw7yApYbvO!^{RUmTMCX)OW7hefF<)=`^pHO)_;)|Po!wGc6O%L>9~Zl5 zlztrTyjrTao}cJo{*N4Z@QY(P)P4G^-#wk}7zM6ybNp|k^l98Lz?i_DXMp`AjDz2+ zx5ZPh*!@rIZ8lo|75#+uND|1Du+$?-!YI8}{oK2X|0R0wQz@w9VOm$Kd}`;&#e$l9 z9*KEM#KxJn1!}S7D}dZL{U2Yk0dzu~rd%%7H)DGYq+)A}P+ATcsSqp%eKk_H7|{Ju z52&o!NgchQ_=#fql&DjMkTw1iacoIR@1tfovkKQtQ#PmrJ#)2xh=NB=v%RKGLm3 z{a$K`lsMVRp0Sk>*gRNHi>|KTRg7f^CGDVr28d*0s}JX=wJx5(Op#qj23VJOjprdq zo0{n2%aVxX)w$#u53((~XVB9K0=YO{Z1|3y22L=-CAcq43mVwi75-uZI3)7y~TT$j{W>X=C(6+lvz9cW79)nF5|U8OlXc z-DmgZ7H9fFDkPUO`?A=1=vBg_woZAX08}TsIY(?8wf7+vJ~S)H2 z*cn!ju?HLmBE4vaX99NFG`lxiB`8aNu*j|X6n~QNbV@Qb3@PR#OBFpxY$hO2!I9ay znvAPL7H92j^5lmlA>X9M+pxzi3*ydIi0mAMMY8OBiApAoaWX--p?6V zC6d5pXaj(Uu$oe_iP&BY)4CHE5P3=Nme%)Z2yf2!Lz+~AqU>#m5}8?pv#-d3y5J1pdJ@Y(DBdGfTriY51;CT{PKQ^ z`>=EObO#5;lH6XLWi%ZIi~641LLpX(!7BvVxZ%&Tiwe_2y5;Fb1~l-RlFYUiNhHr> z9}0aC^IT{n8sjI{!hHRCar|Weo6iHf;qb)Qz>7j>V(fJJ;|{gc{8G*OY6#l9yXO2V zYNf&KmdL!e~Sh;l&BKp#*s=))lGG(&UrY)fy zYr*HwyV8-sZd`iC$R=P{FId>#)Q}XRJQloY1m8KO-gmByfgQCWJfd;XZz)a`DL9jk9F2L(q2D4oqN<(fY4~-1fI7yCXAIunx4AOKRd`lSTC?T?HxaArKCXBEiE!!iD47%WSU>E#u=+P|OR?a&+p#dJbAjyvl z>BZH#k$&=57Mq$gqLH*~nN3pP`U%oH%ADpCV~X4{bCSrmwN34lNYClht}!R8j#`W~ zo~LpW(C-urX9LfxW3g9AqC1@a6#da8`*keo<{xPMGS6Br%rb5kp`FJ4t6yX7!WIE| zAAIcWxh?#xKtTl&7>O=dU-FUi`QO>`~ZS9oTDPu9#;uTGh1F_u&&KO6*ls@0D zz2?jQ7XC$8sB47Gu4UbhPNq5)!^N04D2m#VMT$@?eLttMSRZjlHb~x)-67G%B$`pZ zijMmDfOmCuGrb|mXs0`m2RjJ2qy=8;SDW`B-u^YI2)$u?T7;Mp-`uEm1r&n?={SF7 z{)V6;4YAo1@>ni%xF>@{3hH$f*X%^-S6rQuL1xXm!VnkKk4u>m+4NLO=I~*{%HqXQ z2Oe~KROK5N-%o=G&R0SbFj`7Lm|&X(GB$d{1&P=xmYysiypQ4RK# zrvuy?aP;KbgL{V$gQf@EW+5*!xTH|qClU$=7O^tN(mXp4c$iX1q~Py9mRYB;O8+$RnT}LRUa`RQ*&<0jE zRR?1dW~N&BEVJ+nPLZa~Wpzr1g`NO|+4rKyRA=hUNbZ_j3MfJD$XL}kE4>qJK}R2a zmzK~hA&-9}t%K@L zxBEG5!OLNE&OLdY=-Jt+agq2S_4kL8UMfa&0{ z5={^%LHBp{4tmSRWRYSbkFP{okzV3i98$xp@ZS*5You|oW1fs5L(!DCp&-e2!NZlB zNH*T|lagkAUuUcPO8e3^698cGx ze3`=oXN`DC5@L$Hf^Ut{N`Py$EyAKmf(FmlupCyF9WvFvt7iSat?(-X`@&lJ4I5uc zv%X50k%h12Xng3H$ZJFYz%KFS1MMWMRsaH)p$|~<&p!NpB(&TL_qWl=D+qw&TbVFd z-@yNde>JFrm;R}^Fz*hp@UOM(4vV*&QoR?uJ(#a&%6r^FG~%Wvsaa9ziGFmxzq1Oh>!8; ztM2yd13q) zB0@M*7>CBM6`um`SuBrsE|3|IhJt4M^nH_6IW z+lSdVc}HPTttxt8?{BSjn8eogl0Fg@H_g<8iCr7R!L>0&eJtv6G}%ksCsFM}czW%8 zZ+5z9r@r@N!%iXI_)RV++G#Ap8B@ai)tZm(*q2qK?&{E2bq@*G4wg48YJMGq1R(4- z!MR=jrP0_=;;t=w3^fd=|ATJB*s6@Z3dF)24yR$<8`ERi;}Kzf|h_(Ehi|^ zSCr;D2n~SHSjlA};0cyM8OQFhN1=B=QNWwlnt=18wezz7Pa~%vq z!qys0s{)wF&83HPlq8?>T5>*HA^}if?nvwy4;V?E8`vyo1USCl6mFlTKrtd5|7QgF zdl*JlK6a_ZF-eE35Z!fvCW^U<4c_TT=k@lFFn(sIS;xQT0lF)ha|e_T74u|4kD_r7 z>9xYuL%>kKt!y#&W7)iqfDZ4myfIla<^7qmVB%zvRa)?-_(Fc3A#bSh{H?k5{!_=b zpSbww=~4_l8L>K_lggb3_ck8}%??nVu#KgOI#`SRq+n7+^n}Wo_>(6%_}`K=xY8F% z`=m?aP}YraU9U?gWM!60tnQIMhlP3+Ka?3vOdrQ7zg%mp&sd#D&*R_hc=?H99UIm7 zak0xL$(@|_qkk@Ci7Igjan}LWPsrM>hAccFV$qMVbO0ZN^`bfLSGpWx$$e>r2T6dqUTO?}%UO|Ys z9-!A=In>-;+K$!trK9qyZ(C8$<$vEHXb7pzM(+O5vM>=RPyg*>i}UG@vOuvP z0T;uk1WSef(ARM%+!3aIlZb;O?z0RdqjqK~ET7PsdQZ!DsZa6xR5nml3fDnQQO7(D zpbCs{t9@;F=64R}31g@pGQ*44Tzk?bNtrO{gz|m7t*Af4ALgmWMNaDGRu2TJC71;E zcUW}xpSgmyDyYzruS8g@y!8D!yVe3eeVbfbi`~YLk`V_C;rHr;dj}8OrU&kxu;m6e zidkEv$bk|=WsLntL(=DhD;lFz2UH(ZJqGZ^-SPtI^Jt_ba~n^`e)NXm*5s9_c1;ClZL*zQI!*I;4sSo z2Z+00gRo>4vL^r4wGhQi7SxIn`pE_v#rP;w^ey&FpfDao@rAVJ>EJ-ikCrvwoVe)l z0ggvJR16v)d^+!vRw8OOZG`@d+~XOw+0Dq+=a)osjI?z|o# zzz@UC;7 zAwHq{)&xNMK!xdpY!G@lc4k@E77+`QKzA)fd!Si&6vUwcS!+2R2fI%B;1QD0o6J^{i7r8RWQJPs~c0@ zqf1OQfFG1siofq~3II_YoQ#$D>03{RUL*4T+-w@zl|=_Di@gbKT`BHFDkmgYfW0Nc z+gIT@vr{QWh9~j6{4Z_+RUFa4n4hN`%X^EFSFco)Yof%intQqcbksQ27buJPPG5S} z_e$+j1mtIv+jJa7(^u90U(vM&Hig9k{@ zQOJ=+>$xZ8{k;qxBc|G7T7@Uv+|Bd~Fmn{X%aa>q{_2vs%Xt8zX3_5@kkDZKvh4j) zku^19(O*0AwzF~kg?^2Pd4~V=UU$-285j-!IcA5G_=@gytH)*PI-a3J{|mNn*UJGY zd&!DM0;J)LW8$bEzT;fQA|CwmD@ZwVy*z+<*mQK=Fj?H2zoh250n&uWyFYWOEe4XE zB`~(Elmav!X+6b9?9}aUJDg4Oo6x#bXbK%~iO1KMIqE}qol}jHiw!EdJt1h{dY>~& zHkjLz)qr^TVR*v~^eD~j>N4w^njNvR1@5D0N^N@u(DZc8nVJoaUYMQ0;=laDE=jUJ zpLII}ZbxLAQXE2SmYDWZL^5KgPO_>BlELq<7?%cCc4SMb*t}|0^@;#$lOJe0;HO8M*I{m6I4VTVKa$LH3spXed_*dgm_uL`c@|s zs879%uHo0bztRVKe-Tk-e-XR1ns(KpH#c5yZkg(~|6R*^PuywrmW^mT?UgtmQTvgb ziNgpkt5^PD=Vi*|4Rw%n-~c@c9(vhV*109<+&3dwR%wPgI41A2Fdn%*H!OqQX%wu(OjeA z7J<(O^lF0v@OExAfrlgVm|w^$`0k-;4FGp@a7T?Ls0kQ#lszp z>9B}pEC;+Jfr^wmiRZ{X8?%ES6YEpTuyB#SR8!CGSxL9oKW!+z7HgjRXi; zp7s^uLW^I7`+a!Db2>XThB7yr-3zWPiJx)_Lf->v9aZ&&(H(wRn1deN&l+Zh$o?Rr zikIJ|T1w0iZl8s%eT6Ha!SR3XV*U+L}DlIOyy8x}HQUrs?Pd zm3mQU0Ar^=kT#nZHB)w%u4fYluzJ+gX+^{e=r309^)p25ei)(EiugDRB^reEh&GR{ zTG6^;h|#GyUz_xyYywW-Go;%FpLc|*LEWH!hh4f)qR95T zkN#>m-Cdociy&T`Jgs_CWAz@~vS%afHrSc<*W^J~XPT4Ei87V&k~ zsMroV+z{Svp@YakKD^v(ap(e`Y>%cinl_HPNN024W-T#CFlMU&&pdSSVxOcc&MEtw zRd|7cSzoZIQdZ6$))+Xzah>qD3LVeFA*Kd4C?o&7CmFN$zg-ucB7>e^YnvC^=Z&R_ z|LAtzu04|<-1NhOiQpimY~IQBcvb@O`i#LI%swo$mmb4eYT8vw9Z3m}_n20#_hWNo zs_9VDd@iThG25RsJmW}I$=`~o^qPhaDIUt4$X==Wt=HNQO4PEZOSr5RHScF(#P%3s zXH$6wLUNgij(@T4)sA0qMN{C5F}P5luIF84JHS*#Zk=e^o$tF1XScwdmcLxM_Qebc z6N9&9L?dWofLS`>a34u=cg0j<#CBhjn;(zig!H}s!d&?^HHO36h)mUcz|-;{E_x0q z&7bvu`%5SMjQp>yVl5C!83NwV*f`pbj#~>U2zWAwp?FXWVMP9_UcB~NZ8ap|Qi3?| z=PsTWrv|dyLN|u!D%+s~UhGc#yD1fy%Oz(}E8mQ`fMnf^(vOedGsnI3Bd=Ah2|1imm)QC66jyLS#t?$mcl3x=`cMep2yr5sK+CxZaG4_ebqM z!n3pM%iqOT92c4OdoVdE%;0<*>ERZlRDrG8oJHw12g1N~B}1zYM^gr(av~)CNYB%H z@wg6y;}uQqOdMkB1Z{s8YDGV3{*+&)4kJOu_2>Ho0jvRdvN{Z|%j|MFTA+~p_zk|- z<(RLF5GQOjbKP-yo}QP9F>=EVbNv_vzfB!FZVb_pJ{aC16K5Gbz&{#ssFD(jIqYz( z!nVNvRdqKj219X&lC{N4c)l+}F#yix<@rFfzfVL9lxuM9weesE(O}o^#Dq4n`)OFi zF}9262f>JvWon7lB&5}S=D1oMAPu>bV$*j}nBE~JWs%49Y@%VMKMwInBK6v!N?#g^5p$yH?E?}5`6*_?yE(bQXZ6*~Tis<&p6!gmB`4Sdlxy8pro;A?>11EFKLX#{s^CDqBhHSgXKrT;wI zi?Lcz6h7v#|H7CPU&(hgYX7pGb|09Hsg*XdNlv#ze7p4gQLf}fhs3o^ZNG~e$gA9e z5D*~c?ebMVU^*oz`IECnay>8pFMz&Nr(Th7s*vU(*5LVIcE`o*-^#xt044SWlsIyV zA~Ce{ylJpeB;4UCzC~|x8YDo%!^<dh}#x` z!iNN3YX2w-{uYb$tzwgUe>6Vj3hJmClbH+Q-r=U_SWZ~*BC6cHF=gb`E;wpQg|V`n zg pM%_a^ka=bPi(JnaIT#vGiU#qk|40LtLMr2^h6L!snGo}MM; zsTx*|A&|ba9GKrFj@@Ri4{Gq_U6{ABO{EyG0VKmM#bHC4Fp7t2SOZrv{zq@6$=jS5 z47`?zL|0}Bu|B;ByxCr-`UPNm{hHc{#jp^Fk^aT6$hJyS^F7{9;m3OzAe83WfUT^w-%0p2UY_BQ6dk9^^1DIz5Ry- zy?3-yACw~0>-ukkA1pcn3%V!01X*!{fGMpvg}ym-<(5e_ide|*a|&zDi_>X(#(ogo z{&Pqq{A(0R=6J^+Jt^qqiQ|C!)E!o&6Nm%z^_Cb`J?)rtyw#eRKL2n^Z=8je7HZ=( zc`*vXQE^zq%^Wj(|9Bs$na?ZlPZCU_3f9hLxjByJo~Px+OiE)trncq8Mp&Juzx!VG zjB3pSmIH>!(t2nb^1`R=T)>OE&;0H=937z&X9uSErQRd1-2wrazP+Y{!OYX5#z=Pi zZ*cN*%+@~}U6Yg})Ed_D!<;s`lp<8P3<Y^qgUdHi;_QN3~l|7@c^`*M^7x@ z(S8~AVIYb-N97zTd++QC+OSp%#11p0L?!cybT9%w4&i7@WpGw^$9~A{Z60=<0J={z z^SWRKPRu0o`+D^e_7NMyd8MV-QO1Th?M7o(ATIUFkZ`GL8Ha~X-x zCiGuzFxT;;2fMZ_QM!gYGQgV%Ob5C~QhxnBlA|UpFO!=K()ubnU0) zl6(%6s6G~H3~s&7u*xM1s)kz7&UA^732e?&$8~(UBm=;99nY^C)<-a6*9U_%m}I`P zmrUIfFnI3CAy7&&`QO(3Yw$mf`6kn`Ki4p2TG`azNOmM*Qcu_T|s5B7dn+s`aluNN}7) z9=yuZ)bWg_9dmWg;!%n%=^D||`m67N6t@ogd}qvt(@)Av4Xj&N;lYC)vr|Ba}aWt@i7`&xtn6p*h|XHqQCxg47Tj{14cTbwPr7hccbp zF_qP0)*CAwQnS~E`(EHR&esxvH(CR{k>j*%aCn~|NlV#vNj-hFptsS)X=p{MQn;+nxPgBD&jTrE!{AU_c7ERod?tI@+Am*X2GxV- zJuH=$|Ht^~P>Kbq6S*6;w_W8AFwb=5*LnT88i=vNqiXK!799Yx1mz0 zau|MI+zrFOn$_sancVaRsVO*p;}F}wzIv6_GKyir24E(8+lT`O;QfQMbHfV6TWmfT zHU9EJtHbDXmQ**|uocjL^%yAj-G?IH*Uh_s^}5UBY)-&&B}2uB?lxUgXYjA31q!#k z&fp3ipDSHX^n!+AsKnP54#KVYR9Dtmk1SKJ?Yv~^b(b+iu#A_31r`YsyyLG!LM8(@ zLgo|(n?N9{$a;xlN#9M|@Dm>L+X)fR@ctigdaky`RCDf@HQpe3kz>erI$XY|ZdvcK z$gfrrfx{efZM)@&W6PWIx#flXLc%=z(rQ2a4GtZ=lBXzoVqpq2ydAMyszq z72aSL<~*0+ygW7)n{fAOd}eBO*JSkDL)~KTRj{ZC6aw{$G$*TS#}D)jQFsD0TTdQW zl;oh%7i@#_zsE}s!*j!$?@((-&$pVA!2a5Uzcs>{7YG>Z;>B2vGu7mfS3{-Ho1g99 z`MfS3(E(Z5br4R5h7d`tl$*2WLlv>&W;t`Spo1$8-#f{0>=n)2It{8|8IpDlqd+JW zP1HAXli$L@rKC6*yZvpi^$xC0we@6WoglSd%yD;}5obUZMHsNJ8F8h3pXzY0l|t<) zrG7(&OgB^&4}HMq3n%|zdzNvPqy~MnubFen7lw6i(xllo0mAnyeYTHlkykgc~8&+vd2=C};g1$Sbj?iBE0C)tJcQrD^C0fp5lmbG%=#qVW0Y;r} zKv)Q{Qg|7BjjP_}ID1Kg8yD4DH4$*gSCnt0?7U=Y!mJc%tl#w^X(2W5TWhv!3Ji6{Fa?w@S$PwSi?W+fAbGH0%+z_Q*W_|xY zwYlG-N2`)LeD;!MOHI9yu&8j2`>2QXg6cgI4*^bO}XtQ+cTHp+51Jx|V&X ztIGQfvWv4P>AA*nT1qW32kakNan1Dc?{y<^e+ByCW@~b$l7_gsI2R?`{b8s*1I1^J zmhk`aI`ich{3@#tmkt5h=1ymH)?;E4`3H|RT(XJX{(3p;XFAH#Ocik=D1YnLr>BwX zPa|EPY~ttwuF3z>1$6wks#Q{gL{Vm`@{d8g#WKr0z#nm#BB#OEqCL}yMQm7d;%b$IJFqLlu{qpjD*C=rSVFU z?vgZ=7La;JnrJ~ser&qk0g+&0li!{p4@H>A_V1WO=w%7llW*!YWSg&UecA`GCsn!( zGdPtvY`cZZ5^>00T=il)@dkcXTwHkB;2@Wl=Js_u#dl1Yi zEB;M=&Uyg#CXD!QYT=6LdX*2&>)KpgR^U-g!dofge{Mp_a#H+~Jmaao zBRc^HdTvoxtL4YRB*!Y|2pa6UzxGox=Zi0bpGWida`i3_xT}a^Qz~?*cWZ6=2*1`I zv?uJaN+S!6xzDDwWV7%&2-G*50CpSn%io214{|Ce9}>=~g&+&trjm2zbF)QCACrdl ze7s#)CRz`C8Rt@GrNfAqlO*J(LFN(HW!07s_|$vE7X$1By}w5bT_LmBl~wx}sVA$# z&fk5U4%Z2(o_X*B!c|S8-gB$}>5k;EM)Q`V$2lp}Zw*m3!|@I73rNM+Rog#Z3{r(b zH#0H1{gD7?^%Ac-&MH+%WnRbaaOY8h}g^mcu}pOgVKu64eo0Aw&!C{rhn zPXiYP9s6dD%|G!zC(K1dW0Z;lJb(7qj;OwKZ%%pcB!YRtz6(zYa9O~uEIKy3#a{DR zT5`~E|0OX=;Uzm+Jee3YK&P_JOwpa0L}Bv%M#v4S2QBCMD^|C`rlTxz6D!L?1f>GNu;urC4x>ZOm z1XCY>Ss2$+v{Tqh-apbHV`f-}N-lJZ4=+P0!C$uik{WEijYGg{tc#I+G}h-(g1oD( z_i(6LyKF(q`U*xPFvpcJLHac9Nzq&z;^tG;b4(0DnG0PqFQb6`JUW0N&mdZQOqMbS z91v2C)Jo7<@DUjpvmX;uT!K~~PWIHQjUoX&vv&MPHAnvbtKT6B%Kk>zd-V!sUHFo` zHjch*B@}<`)&r`&t`oPrx-T8Vhp6u4cF5S4m82d1xB|Nx`Yc|$nmpl3OT}>I+!E=O zlsh&up+G$n-7dHm#Z7lX8!7wctr+ZiKCZT+q_G*4^5}!1@s#k^k5|iEug0YGUzR1x zet(szk^20m%yT~ETgo6dZOgr%0^eol0lM{TIudW?k|jG~>jErDd`w#kVm?hFy2@XHX+?UXV5!I-L`uP|6347l$!fa6<*u(R~a2Z?kG)hl7vcA(`#)_9UVCHbvtGr@K_!2 zZjEFc$DyKmVfk3SK<|9UtoCh5^Kv~}Huh}6U6x;n6t((*ACv9rSC;zC`AX{nPZy9w zu5B69+o&G9hJBr*Yl-R;Kq^TKEpzb2ifd zCZupv($PODB!N&hw2Lnw-r#%3s2(q{{}M-%Y}Dp_^SdN{-*+{(mhVc#Imp?&(1ZaE zFbAQ}qA0UD6UEHzba{ruN0&7reMdekwmorW6|H*XH{rv{cKUkPLS?~yC3C-S1v#lD)+HiI_Do+`u(2k`u|S7cYt1JIvibO4&BRL{#mOht$l#6#*teu4J`0!D?>bUO+GYf1aU4jfD~{O`-;mH>uge&NM|?6Z<%ao_{J1kio%UwQtpPwC1MRW#+ekp%N`w zwi4lv{q@>%vIgVYTNE(h<0zpq;h=9kry_%H!N*t*DQgNvl4Km@?EbuPd;kyjNxMaM zrCD;wfqY`^QU>FmyAmaV+>5QEnxMB@HrY=kkIqzfut)fXWVW8vKc@z*iB#EGWp=ZS zUHOQ6TR4KwzZ>pp(jr3tlrc*;?$~)#Fnzq}CZQl%AG3QznqZ%CS?Z3wRKR%PvYL;_ zi{V5u|8IDNhp#jo0+@XK`GT6(C~iyLOtCj3)qHnLzUD}#8b^B=>?c|TGC#aiu$IHL!{Q#+ ze{9carw|iLn(FXA+kHbYTGS^xb& z*QL7;zAB;Ta0`6diAz}$)m#138!T>CDNAUD<|lYGe(WtWS!~0V0xi?}C9Pqcbnd4y z2UD1&wyiRESy|GnV082DvZa8E0)#W@{TisIX@xBXJsY&%I2nrHQ)tD{P&T-9Q=n2h zF&rLlX7vZ+8}R2-=n9@^qmAEoryYtcR7bSk z=$WPi5hwF9y-Rrpo7=F%Wo~ROO$pOM-*YqsIEdu{BD7OnQH4!#-tznVi#K2hUDcep zQe)I|A5a-Z)7FL6n-^Ub|D=-lF{=+sYJ1y0n9%)`*-Rcm?m`!OKP9+cgQqn=E!1j* zrsY(aE?d4l{AAR@wG)p-X>N6afje&b&Gus2W&!h0nyVRCy>=+)HV09FEZQpuER19FwFs;H;yJF^rMd#t2d=` zcI7(n(Gth`T zM*^C9QY#MD+G&SdXV;}!o&jwtO5+M-quz ze?p`Y??_78YZ%}Ni)*W$z%g;;- zjr-0L`-zbr>|8=b0h)sjN5EOhDcegb|K*4s+#`Vv%ArK{l&VG3MIuk^$C$A1Ly^My?_+BR{hI16j=Y%sUuOwZidh^P%9#K6*)I;JFVj?b{p?C# z)7FpnlQKts7Lq;*+jFAcH`yb9w(h|wPUR!60p?fg$?vzpcHLEChppR03Kb)zVBVLs zGe1-{2=*+`{y=cj2iVP-`ZCD6KTXl1fZ4*WuS>L;?U2Cmps5-r%`e95*590kM2)jgiteq6z`?8@8)M5gwl*BK1Nlg#_;1B0v0eY_)KflVHE&5;x_sx8H+nme z3*je%DiZo~deG#6Z(c~KD)sB*X;aTK7DBa*t%V)HWT?gEd6I;-cAL;#uXGJtpv zEQQRt+2CLthrz+J{**=z9J0?|vmAB}t|PQ@*`7@{>j&~0X>ddKZyk#WA-V_)*I(-x zkiyYMH}K21Pa$xc5CxA!q(u}hCJ5h|boqDvz{yYr*cD-%iVn07Mg|e4GeH1a$GW+q zD<#l3cM6K#QYUV1Jc_f3Atdz^9c*l)274oOj#Oy^vqw?N!}TW=oUHTT2RdMvNK|Vr zH&bO){F`3mKee}eZB=UAG@))vL=+eB*YE24oMj^`csB?S0R<%XAR>c^p2700TKE zh{od!0Jhk*-{6b)1kxUiS1ri;hRgrKX+lZO7s_0I+V9D5Z+`ok4lUMS1Ti#U%&Xe? zugcWv|JEeD&Aduu#z`B$W&iwF_Qx=n-i&%tC?>k@FMHe4oNt{Ai0#2K%UgfHZ4#WG zQz_mS-e0!4Qs!6s&TcA~#ojQ%@i=hl^5cO{T$0}rm1SlW9neO;;b%(C^2|L0m$Gmf z{&@J=XAmbHwMQ;>PhK$`B71PH?!z;ypQ}+}vyEcS`9G&duveb0$a7IHkt@ys&x(zP zpMMN6{R-E)_wDc@D>suse@SV8g8s-9?4QtAzH{qB3Mx2QrY*D&Ck3@ga`apF{wv4X zgJSMrx+0|w#(n%#DWT94MmM-qJ{44^O9{FmsE-%OD)5(JNbcGkdo4AnD|s)2Q&bmo zOJGRKQ2tKnZo>pF$mj~#YY~q)lDe!arjy*&PUJQKVW3@33Z^`9H`Uis&5`|rQWha{ zce|{5L@|mJ-EvTLSg04gULELTppZQ${8*BE)XuV2v?k0FC~};jGp@6}cCH(`62d7e zCU)KtTI^@afU@m@^c-ChrT)#b^BVmv@0;J0-4;=0`8S`UQ*R2G;#t9K5`m$IPbx~R z#!oMRrhLsbzf{4;SF}7$ZUfJD$@m7LnrYp>=T=W;+h867X!(srQ(Wu*3^Bh*Q?qR^@phdz~A8sg%pyR4m>cPngj_kvTh z9`{#|IRfBxx^m;ym6VurMRRH8BKK*DtTgk^DYnCa4BB z&2$M6`sA`y$2~7Xw|fn0C}fiL8ozGE)Rcb_xN@s^A4e0}_a9u5VlLOyX#Akt{E{h3 z`O2D03zRA+BrNBg45@Yi8CmmPUq20}YmEp{h_fM24_O!U!`EAA55t7{6TPur7PSMB zEL;__9O{E~Hk2cm!ywrzU#iHM$rThmg@NTkb>S zAc;?BfJi|k;xQ)TJNQH*MytecxBeaY6rBV5heGz@M-rn!Y*~4qH_yLc1OZe>vyF*- zCCKeegt-M%j{j{pJKxn>)3W8z6eo=|+A1XfsQ}bOX!2C`Sb~Z@Z@~?)i*6TWjq?t? zh|~~vb;w`BKwYOmx%cx(TI(a+Z=C|cEJsq#!nFV5dr;u`9#~i>uo`I`B*K{2++73);q7<+cQ6`6}-@MI>S@=)XW7x zKTAw_3xKT4msKxumx7YHjlKaOdbJFhWOa3xP7IhJ6NJ1`Pk3baSjk~PNb8#Jv7kJ) zg;7J!mb?XE5F9;PIofM2?2`tvJFx*?TMu_m$OO3jn(4UCnM8$y=md=GI@Fb}_f#!7?K-*qdAHrI{ou4y zUFnpTfCC2wj>>`lI8fj;YdOEPT7n zG$2=dJ2FjBvUN<{Wzv=cN+0F>zSvw)map->|^8xT7q`$0Jd0NN9N7~j_sVvI-~GF0Zm&D-;Kk)?l_S} z+EfGR_K(jprz*#C1LuLWQ;glFQz-4@QqY^h=Ib>}*8Lb$#{sYmhf~h%+y~s#WV9{G zGGfnlcXr-N#Ks&1eWVo48DRiCA(Q(Sz-D}WNzS>xfM_*BkU2b%Of5X!%FUb`);XL2 zYMeVg9WE;YdjG|u*gVw+#|Cfp?F!@MpLhzpS|?@>4}SL;#?EX8nx%2^qkMK}0?seb zh;X-}GLz*hVCP*TE#;w-U%^2KQ?`gP@7Oz!4GWP(ZJR-m7Z_IcnzEs*KxSIXsPd?s zu8`hRzt!X?9aZBuQ0uprBygVI+yWigv@<=Ze740H59zEHuGJ0xE?lD0EBxVIQR^xa zpPJit2j7e+!MFjnEJU@0&{_F8MP%HDBQDLihq1;2RKsF?17>Bji}jIDZN)WAOR3#j zG#Ng=#b?sYU2#1_(&G*|f-*XxVXLgFahNHs+4X1$CoqR^4D(I0wE-p-3uWk5#PjG zGo?E}^Hf@eT4X#~5?#Q#^BcPq70oGuGh>~Zo9LQ`?!L6WxX*7Jmr`ZD2>Xk^pCeg` zOiS*B=)-v z&OXqLW|7XA7JK%!wzL-rDH$J={t>nt=C!OGGjaXp(lU(#Scef1aS64Z)GOqtO|)#p z>Ir-Px$neUqLC@wH2V!DF%SjV6B;};QZDpsO4X+$CKNEaagS^(B4b7QW}Fh3c%J=k z2`P6O-N%7aQ;8H|IJ^gaQSIi$3U!jh6z8obyf#^-?-_sD@^xym+Zul8_L$UnK+I$9 z3U+HxyO8HL!gx?~&B*?TK=r$KMlB5M`Z7*1Ymp`!p%!vHz}eO^uqp2PAMG50agYf2bHt#qettuS9Ch

1zKb;R0Kvg{5sFxhi0o4 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%0AkRxVeV0_Zo$j*J+^QSTth(~res$>a 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

0HZ75T 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 Cew7^n literal 33377 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 diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/IntroScreenshotTestsKt/ScreenshotWelcomeScreen_Dark_d19fbf1f_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/IntroScreenshotTestsKt/ScreenshotWelcomeScreen_Dark_d19fbf1f_0.png index b45934b6fa6a9d192d4e5c2fa53090c14e63c6be..866a0517e43a2e51da0dcfc1608c3a18216f93ea 100644 GIT binary patch literal 108253 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

M|xc4y|UO@oAabL+^P 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 nuN=AF06 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 z zYgLOe?{&f~N%Pt4W7rr$r?D(XvMG<)QJF$_SI5K}`~mwJU!~mN!k20b_&CVuTY}+C zZ;1GJ-M5v=?6G6Em9IX>JB_&}4-E#4?@JYIT}#Dy8_S7NENpQH4PtGUIN2H;kTJzL zr}DOO=4WUXr9vp~E?gW4iU=}=5?>;szc}^(vTkYq=UBTudx|A$QkV8aAY6klXC^7m z8$WWYswy9bL8j(k6cu`KYqtB!RX*Q{O^-S5{`1&}e88T=#X zEn*+*N}jFjz}0(~x3>7%o7fGj(8|1uq~W~LOlbf8r5|gx-f&nczf?kCMlayPo?J)GisWpD~;@J2XCo8l6u&liMiJZ{UE)h*y~(psr%p z5`1#*0W`HcQzaq6{~X#+$Eww8xp!mNcC2Mo%G*WYZt|Q`<;T9R!8-vo_IYUWhZQB} zeAQG*_4~o70G8H{!isMa6YF0vw2VEUk7Th!ESWvPg^qS@Ye>E!7=rwFX1&xFc$YXt=p-wh&N$s2uN7u=+@*kAeRId$v=}x381TPf z{?WiV{f2ld194(x!@ML5v=Y+GUn`^z@lr+fzC|B#ZA2VPd>a#lM=%ZtUeUYf`ti|9 zV7^ox;o8vN?kmC}!7WA6!qP-wy-XKOaa|t!*W9VBFKk^G(Hc8-IdGyOE+>Dgk%zJ< z3t8T%ppWslL9pY2fhWNG0>3Iu9eGk?Ecv>+Ze=dUE_)J!8TqR1dGImh?keX#keK4b z&YOCctf5(xrpW-u+h=x?M*p`zG5`PgKn{BHz2C@D09ZsnSJfBpc0@P_lxysIoB3If z6Q{cI)(60vXpyfgjv_XaI_`k<`+vqICuC>*XPjv0*ufEyyC2b*j@tM_2nV&khIL@Z zS8!7ekcZt$G|f!=1G4a$mY<_PVv! zWpl9dP0tP!^`+T}E8as{rC@C>$F6Mk)mcz!Epk~y8aS&ijp_ zNc<^x>oy-qVSW2VNIjb1!Z~d4Ap>kuEz#?&qR2O(L+@V$yZ4KxFb;t=?XLg4p`S3y zm3N8pIJtVK^Rr&eXSF0W+x{?OPBvHGJ@$$);lX~<>=w{dID&lk@|Tqv&j9}TYk)0zx#tHD-KeH@ zNgWYWJsFw|et%k~>T_0uKj*$-hBw#cQveC`@57db*m~&((UcY!FoRQ!`I{o5>D{iR zo83~da$y5A&|UfY$L8SWUd+w3(!Rk}r^Rq@= zM+{D)KcM;(`F_s-X=sVsmyZxpR#cS$Gs6iI#&=?G-BjQSWAkYK8pS zpuFalU4SQCyin@26frt@+3t~fhBYK<+(KzCg0ElVO4$5@(WjsyG+AZ@vGrWqC@ zis2TgRl+B=cr|u*(?#}5A1*;7e1$m)eLc;|L9t^Up|?#dZ)xQoB_3~@CAO08Ld4Z4s diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/MessagingScreenshotTestsKt/ScreenshotEditQuickChatDialog_Light_b29dc7a7_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/MessagingScreenshotTestsKt/ScreenshotEditQuickChatDialog_Light_b29dc7a7_0.png index 7fc971ce6e1b0ff096c10b6118db39aed8134c54..0506b10e32ffc4576cd4255bc0acb89beeabe524 100644 GIT binary patch literal 34687 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%0ALu2;9>)jIBG>B{H|WE$o7YlS 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 X@#tC9L`Q;I*rTPcd#Ci);}`!6SCO(Y literal 31985 zcmeFZXH=70w>Au7S45-=QY?r{Q>oH|1woJ^NN)<#35Y-_Aqh4VkYWR+s`OqHI#D68 zl@bh15&{xbqy&sW0tpH4ihG~EpYNRW?|a8M?-}Fy!5BbR?zPrjbFMk(HLrQcS(+R1 z@08fd!^6XW$@qd54-cO)`1!tlEBMbi4Qt556Wws>!r7}4uJh!`k*h;lDnDBin-`kq z#?5VQZ3At?0|_+P<#6q+P{L8aOtS-&M-sT>lt&>qJ9bR-;&yD?yG>X`{_18N&z&zk z$Bu2fG`~BGwY6`>F5B9c>awD1gSQqKw8l>-5utm`yd*M`G7hp{2R!y{h! zrXZQ9@3%gkgF@RbO@!d@qIch1`!?YJQnq(Tma%HLu@rK3Qr*o&Q_WnuM1%-AC4?A(*3gNRf)$@Axsie};Ngi0M66CO`tLtnb1@xq(XWTk%DG-l z)3J4f^L?I=mxt$(?TtjqpqBDfJ%TQw{1m^jolBStjZTueAp@54YUB|7at;!jYT9(_ zDDTXV+~nh~QNF&gx8O4mr5fWKPt*!S-^laMq@3SVtg|wBJarZ<4pvk@G5*s*WB+LF zvvVW7#ixXAlpDXsyAKpVytV;(RJ9svG%gbqY7_^Guk%?+Jd_}ZPn^eLps4OWKyj`a z#XZ{RAlIvr<+neDaB|Rxke8c~=IZ!FYC8{)0aknlamm5Jgzw5>h9ua)l;MrEz(vzp zEm<5U%?)`NZVfh#MEiW2bJ#9n(#1P-dz;pN}Y6uhv#j? z(l}gZ4p*-vb`^tE)4Gn(&_I|B&6^j_e$0X;)D!?C;a};*AMb_0>)m+V5Ybm3u9~L ze1ypdGOhu{uj7Zo5X!?9u_P_ZLtR-my*|w|5j=M*xz0Cjns=tUOY{am_ivXePuNP# z@jXKyfY^0O20n0d6B6Io=&WACAa^ zhdtYT1kCUxW-||u<-Z62&q?Ftxdd0FYArB@T9}YS6w+_nXQ0qQCkA;?miO)U=yh67 z{04mj`^2HFSaR+ho$+#=<9B+;Q=Y8Y=sZ3r$59 z@tS;QUrG$}sO(vpsFfiRhqHne8Nu*jm>N+;B^g4C9u~zskpGUgTqmbtKdDIvHM2Qo zE)X9ETQH@qf8oFmV*`j#$}0i%F5@d&^qMLkyO!<7^T$~8tkM8oBz11$g#OxB6$g@3 zIhkQ(z&zI+GT4pn;)yadxT8O)EPMZ$Y<<9*|FHKFFx{qoIv+JT$ie{KShT;UCp5ec zHX*}1vy0mIIA-&*D(?A&uoEE-ud--FEf+k9Cdon zzB1}9U`xBp;qFdCSr+lFbi=aDc?~&S=|qheHnB=4`kRSIE?{ zINOcge8Q799|1GIjM%}c`-R=`95sg*kE7EtDGIi{SUPHjf2-d`2@NK zam9AB<)8f?kv;ocu3-`>?;jgwrK~Jo&aX*2wpx_DBQe&aicLN)(g`&R%cvs2OqGT8dmG=M0SZP&NdiFELY#hC2IEi{rafT zT?=cEq~SEv>8GAtTU&r<)Os|28-~}yJPwK~HO$UtB((2=w5@(nh7WVf+Spl(VvvcY z7|QC0LXp~qZ0nY#J|i>4_-ff+v*hp@!q8}&f=qOklD~{T^M{24X>xrbeDMY=&f_vk zJqk8SDYJO=yv{}QP?dAk=p)LjyYeE<>!FK8#=s1TCdNVjalmJ)QLLRa9cD3nG4f5UU+&uT0iaC*f}bO+UcOY!}(kO?x z_Prja9N0>2BL?TO{DgUrP<6i5g#eMBq5Sc|jJ4XVf|{zOOeZ@uzt&y;`E<1Ufci{F znTv|y$)r~=+k$ka-EJCIUvI}aPT2o(m@IwYhbjHsUR@a~Gh8{5j+W|cG0N$sFXf^( zB8MwJ)%lLxKon%deTOTAEFepM)pH9hZuF5h5V*pVvboLY{TVlb%nY>OOFM8ih2Je%=tV8#uWWU%r*Zr2GvcZ(Wk%CY! z(2M!h$fR>bl}E4u)EsGJjJ7j7*x{NACu!$-ww|2qyDwZV;}=Ug*CU!wYQH3(lSQq} zf^Bit19>r zGV=My7&Cr9gLsFu&nP0~g7}%RkAuX>_z=v`#u2~i$w#UxC5c0Ih}F>w*6uU4qYErm zXM=b~;EL44(Pz~=NzajIjLJL0*KcpjIp!L1-Iuyp|AICeR*$HKJr`e`VWDq*Tb8VC zJGgKr9xqv2M&mPCX$yw*zw~w)`(;$rzhET7_)7+1`%=!0wPa#;(B?v$@V3ClvbN^I z7#1CsW!0AFiEaA~S1b4EY0QbaM$aUcA$-CXhl0B-J`mCS63*r!Bn=O~p!?>gK|L!MKvz5?rD9W6vf0Xo@;)IvCmS5 zPQ=^HUyBB=Kmc6w6x7d&RaRCFEO_Hm*~Qca&7q2jnIp1>@5W|Z1t65wBwJn9&-RJ> zmNUAx$tI-O&)&>Z`1+;;4ADHOb@_Xn+=ffK)B%&8oB4?5R#zrju$g)Vd5`V{G_y*hCJD_qc1a>@&>9N4t&J8t})MMKn^| z=()MKnY(&pUC=`rB?2bVo%ea2McJTO*K-V1&MR?h@nxvYDb;5fDDX+NOI&B}Yp|2* z72NkyTggAe4_L^)6w0r(x{1Dx^(n`nmq?hU?-~A1u1y0Ar*l__G@+8%y@gb(U}XX_ z(cQDG&O+gnGL>{meBM@(oYiL0b0Ey=s@}?==_vC3Dx8r*3aZq;pG#3SHzXa^4uF~p)%EnT!YOQ=({ZR4N z^?1n|M8}D{zRkA4ALjtKc%HmD@0dLW`K%5qzCfsk;ks`EDSflW-kSh{QW^CoWgj{e zLPcg}omqNUMqSbD=^^G5-hT3vYqB+j<~H0oNflCv%%@(QTboY1u_&a?&euavyKeJh zNz}y*E+ETaD;oyLw|UGU-M1cuiV+bgLbb4myjR!&?0O!mf;?LvBFy0AK_3jv8ofN6 ztbNemE)Mdb4l(9E^r0*y*B+`uwul}#zmp%cdFm;+jEXX1gl)@-{lD5`?FIdd9vr|Z zxW?`>ro{}^SqR5uDZ~1YEu1l7hzR&yCf$GGU_!d61)L^z12SNxseIXyy>2f0I?I{x<2*tHTx6wEq53RQZCPFOczWW7=4j zt-{Gz_(E0&HKc5rbjFVnK58kQy>u0mv&t(A9r34ny@_oKDmf(kZWTl?GP4@8_w7F^ zL1o;B8tS0=F0|9m27W8+&m#6%5i5jf{(+_b>m-+ww2HSP*zNUBFwH#Gt3&+Xu7ql~ z={vs`0aESK674=!C{W9P-sPfNX58KsI(ehN3{MRYZF_%x_TJOJ9{PwMEd{9X30d5k zgsPlC0nM=pZw$72Flf3c$}&Kcg2aYGbWn>%4$ZFqjQy0F4|PzJzZ6#ONsKU_srBXU z;adHJ^fZhBmD2^eY7pOTLOEFOn`8e`2TCfoRWL-Kz?_qah=nhrSd$fI&{8+5m}0~k z65g^jf<3XQ0qH-Tt?~>rbKf4Ot5?w_jZ*d>DLyM;e8mUTlne#Ii~|Ww%`VC0y*ws%qWYzl=ElsClUms|(i)t%)$Hr2Y{y zxUl%b{Jmj`jloXe=D-fmciiBGo{6znJLE+fm=?kXxG}S{kXw0objow1abrF!u(&1r zxZ_Y#Ma2FSvaO#AKF^|I4DSn7mlo^e_oiTW&6tr-wGTJwNw0ox(6e1OVF)^w3yU)} zfXyh_u9!~92aK(Dl|c))>dB%Vqh%K!n359jgCn)=erHFC-3Wzvl*{0+$WI;`Iw2dT zb5~gP3ym>nV@I}H{}prCk@IS>*j)eaU)JHH#(NwonAnXav;|k1M_n>&rg#>`2%CN_ zpmx14uP3LqhUX7GvM!Y@7?AuB)b=gAfSRn2sq%$q=JHGanl{R3IO9BT9(G7^*DBvR znu3|@e6=ml7T>@GfvXp_^IY>H-jcFZ-;50`Tb?>Id&D`|*ER z*{`Y~j@ReL_7{ax&N)+ra7ZFVx`$~0xgJ>RPUB$6Wg=2>cbE{oOgasdTs82yz~=gs z@vBmXCfbrB3ZD6kY2zrhCvx#RpJuPW$YtlFz>z6F&B7$Zi3FI(Ycj)IOFlc)_D>Zm zdV2G*pGb=K%d_$KuQ@86IOUiX9czmc*aA)`gB!cl@gA>(QxMKDTQrDTc8jDqia2>( z2Qn$`%BK!IA1BzbiAqx0qUQ2Bx6B9V+ihmxVXT;Lb6iL%ff4`hj{z82d^zS>-=^5r zgR)RfQE-82pPE}ZGs@{Sfn?_bW$^=AtX%BB5;J4clZRv93-66;pidd=)@h19jN4{u zN9;`x|F!==uG`k_#^7X1Q_JRM<6dV#}f&ro&?ia zWY~{tGZIPZe73%moYyl6u{s}hC-w9#$75?EXdmZW&k-vm?@FgQ-v21G{?pr`x%x?4 zcy24>Oata^r}@U9E}z3Cl}ITConHsgES&-%DTzx4O;kFoR{uJPjfT941N8Do-~T?Z zD8ZEX3YCg@x*&a&VTVgqLP1%-4X+f@x$nJibM^4-?UE~FT^RdfWwK~j*23ZFpYJg9 zw>s=MwGj0|z@CAjG7`?$B9=``hkl(aWtD2H|KKeiGP&O_(%T9$5TQeF?WX6seuC7V zj9g!$S{-BjsYOlv#x%0I%4`1fz2^0&)A6$ZafJdyq`mqa3Yjd(SPcBV8p6lti{8|B zdtJ4#W7YA_QM(0nS1&+G^P|b?tg;?B$uHoJNSYI z@WQTe>eBS=qYj|f+mn4+CkIu_qw>j&=?PSg5#r3+$Dt9m$|C!?mybfRt;5OFT=fFi zcrWrxTp1hB(7pBtc9-M+e{QOk)3VU9)dv(7^?7N{O95WR|g_c)rWzSRm$f>SGI1>}!s0R6cO@+)Sh9%{Eaueu&nf8wiND)QO@9z?2YFbe>*J|2SQY*%7Tl37{tnX>+q#&Jqb1}>Ef@* zW`5&sQo6_eWlC=rP-9j9<)Fh1c9!p4gaKFXdvklR4F2XWg=NRGqiNDc%$uKs*4gF` zSlc~%^9=<^n(T+VqDLVw=yT`?(#X@S%crb02;S47k|~FH3K%!;HzXg0>SQ*CEQtto z9g@YJzdxWam?|ko`f-uDUe-UmW>4KY4I(~WhVvZjF^mkwo>EF@Q4fUeQ??>+&1>jV zfKK@B-4m=ADj_GA}hWCW!1)pvG^2tD@mMk&1#? zVY9ebPYEgJS;dY0%2-Nl8QIePRK`?N&J$|k0KUp^D7MV);bJ6F^oPt}i+??|Wa$W2 ze&4qAkNb}m-S_5{Hs$npL(ex;Pyj?SWN>4EIkC>!{Z6lQ{zH5H)cvI)`_Sn#esW$TlwZT4 zGUVu3SX!B_Lf|GgH?&r>1-Ez;>e$dFgZK^F#!sVWPsI5iScm%_-yGZTJua5fOHMkP zE6E=7b>hhescooS`@BQcfj-`C(l1vkJLDpKS=EGvn#{$8^>*T2e{k*9?L6~*5`=o) z>*wTa?FA3vbrn=DD|moNS_BvRDQWM!il^r^;wP80F?;c=e&LZGf3BZMP8L?Jtsa9D z+r*eN2f}_Kiv#(rnq}^}S3i2;Vn))8=TRL?R>@NQybqPk1=~_qT3OkR4oy zJS}T@osMc_w+2ikYVR;Un5~sVFYgGsMj82OTbhGgVI=GR3dOX*zLk^)^)l-QW^d(~ z)TgbJ0pd5Rf1+9m3P~lp#M(%imVObNR<~_Qn0C%bNPzVB&EBNv>jdOMWxfQ~V~ItV zI7TAmK>`YH)7{-5kqB5H9f+?6lc4aEV=~Uk19g22D?3K+}`-Vfx z!Tw^K6u22J36%@Op$d7A=Ox5n?bDyG2SMq~gOEDCO;+|T5#Op_Bl5iZqEEuHwr^aB z_0L~?FlBAhiRA_mWqejzeuTJDjsnP(_TKg{>K`apsAzdTWjZH;Zq8Fc*n7)6vMC3! znT1r$gNA_OA+~f@{L8$CNPR@>(-`4*wL>ZsS@EWgglW_J_6~}O%8R)GmqGSnzr+W~ zkmFzJkJ$&5W;f~f)s-&&3jx_?xDlOWxaFYitdoJEsuX_-cd%li9aD>BK%}Vf6AT!%kl}c zuoiym+f0@7dUDaKr*q%8V2EXXceG|JqZ1<9bpUQMjM9QHhTN!Ka z+_b*SGm3Wp9MiSDqxMJaE??TzWun06Q`}^ebXfL&sPEiI<4soIiVIy&6lB5{su*YP zuj14KZIce2AX{i2+MdU1TfwkuU|A1CG8ak*;QXCd2hKa2r%5~I9{a4^@bhBBcz1{kT{+UFcutrO&}P?NikjnUrAOnRJr*`z$5QSJU_?|}s_HPz z2`N?YkxgEki7>-8A3iHNuU+HOAy6v21k$zr^U`-c7oBXaiaHBOTz4kL!RZu9yi4jn zQqjKZ+PiKSr4YS8juOtqFLnzpxgA?*4sxaHe-y`8uU=Z$8v4-l*{35i$-Aw$W$7I= z{CJyP^~Y;OQLcbvc!x_tol59_%;uACLDl0&(*Mn0xEf0-%C+#T0c&*7;rSBs@2c7V zqOxG(;qKIOC9m$6 z8s#mF@$XSNm%1`D{~qFNpuPU^!|zHE+LT)>?cdMqd*BkERfETOK8NOK+&XENU`pp> zTVCI^9IADhbECdL$rzMYWBRrmPZ@g{FlQ=Q!yAZSao)lt3|q*s!m@`o;6QS$x#zo}y%<#I+4Gp)LX6P?yfY^&+wZFcgv@EHp0Lb`# z6+_qM)(jdKRFG+Rxp}#Xh(ZBQLjrsOk*7ubS{tuN*DeCL_$4$##igmKctSpBJ^zJj z_*q(pHC};EoPI@wXQSSUNVR%@%T3lV&wB6_rHcLxWw;4%la3ChHsm<|{FTBBYQ!hN zDhc8#71+rN%C|I>-Nxef&Hf{SADQ>e`3O(&=el1%kg^LReH1jxwroL{u;mao8{32M zdf2?ri((HvSw+raD@y2}wb3{hnq5FrFp^3VhsD& z+rtS0nw*0qBOj3}Bx3!UJ1EHr+qs4KpZZp}l!0*pB_sFx92BQb(EUv>zh>Wwg6wdI z0ndA<6rQ))ed}wME~zKMC)`BDoFhDgyUQ8E*esY?@E_N^hU=xy%yhVO%jj%go>zx} zz9ceadmA`?M1R0lsOHw3W-IaV<ADpg&^3!19zVlyGVNcKzpLD%upY{6#+ z=-4Q-WCmu-)aJ zo2(f%Sr-_Ne+3r&(z&Vi*Xk60h?Jk!1>oN|OiaTgfD8L@*2QL_GT8&nUj|@>DUSAN zKLl;?jv>yaR$95h4G|K|d?}U`w~Tn8devYjw{DGqm;DfB$m8Zf+@kKUIV7s}(6iCw z_FX-?Zq<1Gm1g#%BeMMJxnOwH^myY6w0ftj;@AGZJP-5Y`b0x10%PU^b9x)k$?=X8 z@2^-Z+5f!N4aW(lr2nq8H!r@-;Lihq!^TaJ3rsGnwl&C4|H7X$ZW#tK`si!>{gr;2 znK0I9Ht)=Lr-iP?PsmSZ22s;l z$+NZR5*@c>h`HK3P9S^H^`0aJ|8%c6zu5Pv`%~P%mo{bo^lqj)wQO+Y9X2k?AXi!Q z>VOWT=r<8@;qsKtRo{#_uXEe-5+xzfblXQSpVgT`z-@XzBGA%9%TFvIwK4+RrlWG#b*%KjUl`ER;W)cbaO@12^t6AyXYR#unnYjZ|8X{M!`JkOxLQY zG9g_)BBU*AC|k1ieUG3ryG1WdG6e%=IVq`KMa1sZFf!9F9{>Ks17+=$H#uZyH+W(D zsDIAg40_1VgGS!0?Iayp+_`$BGDC+aD8()H?ZXyuyZQGj{ z+ECWpO{8vpuAGA+Yr0*P((a9ogK+f(!pL0vl+O6z0(_lI%4#ixfQO5fezpkJ6-XWi%!d7!40hIf^%gVy#Zunac={(yS@>iJ$IA+*4ddE9AfQ5z z1NFG86PTNm{-gS^3kExb18Chw+5;k8GP|rhRA1Yc*{7}W@qF13S!~5Nx{Bc&kX{(X zA+U*Jnqzk;>4K<*O_J#xCGB3r1ts!0-aWtdg=o^0TibeTa5%6Q9TOX|9KA3{4D^s- z3YU#!DVetU$X!5F8tjzg{U8f|K?h$lIL#%$L7n%d>;^QZe-HVel*^qSz?8884(@dX zXH5?m-BeHVxd($?f9^#uNq1W>hW@GFO~x8KVs| z1C-7TFA*K~0M?VLFv00#B$QUPq3!DfO@~o%X$2mhR&`gusp_M$iFeOd>7DBWIG)&V zM2SjVTj+x*iYi7#J~+S~r}_7|y}Xkkf|np{uouK?^|^(iQTkwKBC2Q+^8VAtYL1)# zPB|`@gc2*cs3;9zZ*-pwsr*e*$^4a3jI+bidkbI!dh1_ddbVKsoe{-}UFk7uvUjij z+TlHTzN^@}z>7qRgU2IRbIG%ajgd60>u(NFvq{fhsmQ?{W>hygwH%;T7o*Amw>0Z) zNutqt1BsNgCkg$uKMq?6oH;ybGFDnQ7swi79SC24R@VF94kh{8jj-6=SdI~NOLLu> zLUogiM^)4Y+X5g1kCyFudBk<@UX@Ia{k^ul*N2I=>^(Z`s{wGG?lde(I3-naX8m;Y zW3CuIyi@$9KJ87}dSmY+wb09Yj3-f8dt4w1gY|?u7N>5mEQ|I>3>RemH-kH7Llafc zauMj^f|37bM}n$nAxs)R;~c>=&CLz22PG*S{w=sZ*`dzdgR=a8$cmf&ux|>rfi^C5 zrYzUGFpBl~W}aGbo}gvQKXDJw!{eXTX@u%BKfk9)qOjK1#yj0u%=&n~J-RjY{?9|D zkUyA-9X`n-JTc>vdBg~{&3U~0H@9w=qV4^>q|$IG!^|&qFi$AHFgvPv3U|P923Ng_ zr{C#s8NEt-?Lj4)0nYQd<@`Dx(g!m1X}Gjy3v)KUEJ!{o5}ej@=Rd11?Wc9tpmEgj z9%VWU_u9dj2}nA*5$kc&wfgP*OFg#mT>HAUSVNkh*Vka{JNkAh!C3nE^p}DZ;k2pN zUmt&!Q7tiD+$H>@0adN%jK<*0U(PROh=yu?t#b3G#@4hZfgSbnTS0XtHW6ZW-=Rur zb5ods%T}5SW6(wJJQ06y;@XkdQ~8G7@sdI5HmV`t`9|rlxi)xQ7N`1@0QBN3S19$3)wBE`^?cGVn4q8*n;Fq|g;lu?UEb5BjIYzbu%N&#_%(pes?OpMiCk zx#%1|!!@Gef28XBgGjW-y&2K0OBvsQ;qfYOg)| z#p=9CE)fGFElw#nS}F z_(UevUn`fZqESJA>)rC9&<@WqfLT~yKEqz8I8AV-75Ccg(T=d9&A-PvY?!Z5fM9?8 zC9Koi9f>vHDsiA5n_#Gdb*KlJQiVz(AJ4UDOG%XZzunaTLf;HRqIBd+@50f+_5_aA4(L8oLBr(2bTC-Dl}&$u zGfhb4`n;z@SW`F6OCTR4NOlhki#dmSYFGl!c#0wa0rX8r8H=l%tnQj+=qoLxuUKmM zfKT?4)#oN1`7?)cLN8+m-^cQk;_X~rTyBy8UPIE?+Jpt4H+M#_Q#|5-eW#qaH zeArC;`!g_(3u_D@_h|W84TEz#dgxEIC}Jv6-Jy9hGm?(uqKI{}08J?0M0h?B)I;R| zMh=Jc(E+cU=Pfrn0x3U{i^XJUAkxv$>0#1B_dg%rSU8LyJm1TWz&99NFbfTp6ZQV= zjXm#&pyYIMn1e*D%rWpNgTxrMB(<%1T{5VO&)>XRgPhg@oJ4jcEVy-}w|>l;%SDyK z%OaLP72@W%NvoK1dIyPRL$|ldxMYG$6=%K6RhgUI4C}AZx=<&$Wv5Jl8U1Dje?}y` z4JWZa&S;9LVAq?=5DKlIjqY`534HSA!d%>BgjRY!sTh&UWs;M!>Av2R??>W`r(JB< zDKUrRTj^&SR(qc<#b*SzH3Jp*ub#=>C}W2|gw)ps<$lU`0{5|zfrOC+V6WiQoTH#@ zY?`u57TO{!`1}18daw!s;7%h~4B~AT4{g4RuohGsE+;)%DQ#ILNa8qHEycN!A7vp0 zA{m++XXZ%V2*tJe12#F0S%;H!Uq|>4G0TDg?8USW?i)0%X?y-63%;->x3bX&7|b<@ zs~6#c;C5Hyo||_HFs2&LM4C(R`Qf%JQ6FrqpTkCf8{>}#HoQ|wdCiRi*rF8W8xiXukhZ0shiGTy}_a6P7IYWiGYHhK2^fSxCq|iqOvxMMi#kjC%k&m#DcrojGWC9Uxc0FS@&^`KJf4G197>${!#=oDlfQ^=p zSJ)WL;u=Bb&)_QcDOtUrZ-vk!l$@0j>CBv!9f=959rMN_d+48+-V*((o2;hfA}d>( z4v}1`Itwr3G*}BLA0;2Pz)Ix=5=f(KEUkQ<9V&j^7Y0Kzxk+Dsg33dZcmwr!t<=ckIeW=8vm* z$(4+h8cG9FPuN`jAge>}#ti*p{WvVBmHI?3NFAE+Uf(s@;}JZZ(008&wj5WQbN^ly z1~+e^LjM%k@Ti=5;Hia{9;q#AC6-CwZUVj>JmWf~!EfBE{r7Qz8apaKN^b!oQSvab zB~)<%SL|Bp>MxR#9p!fg0rx2K^ZX5V4UA?qpTm!K%@Vh=#vH}cMRD?^yc>z2YZpPbH>nMRCW$s}RZ~C!h zL{f#n`72?+8A3wL`yp;i$%x0%f~Z!TKQSjfYnQ8^QAe;Dnnf+iuJcSaelSoR^r)#1|rcT!h zK-LlLm5iXq=5hJ=7gnO2)9qTvPspm%=PpJ$A5?ZpsM^oin@{yX*GHuG->f~C3%J#L zTu|*|j4k|yHrxxKgbEJy&vkrjq+S5);5oq<-|#8lYCiWM?y|v&*6IMW;7>R^&%0iV z`CTV7J7a`vW{`FetA9|LR(%ZM>X{r2;v61ZLME5@&t&j}NwAmH9 zK^thz*kmBDdgL(K=w4}wS?1FQl{t{O5C**(Oy?!Mk?#3Tq3~RDKC8+;swE+K8&ChS z*~b8!lW_kBoQpHuE2dA59F+M3GKXI)7WMaO8Ijv`&VvPt^d90bG#5t$ z;3^%bE=2e^@6(aqo`I1xk!L*&sUsG#x30!v#1n!w4~h7VqX&)26|rrLG1l< zX<$i^+d9z+y{)7ZYZUSD`G5pzk5~!_Xf7dGb*7cwnD9fkPfKl6ov=tJOzXbuby1be zXDfjjW+wQNECmLo06#=UVTc}4P;wyrgY&yp<8gw3Yl)&T+6%cW$?Zi;jcV`Afo|3Do!mX&=XF^x?|;HSHv z)YpLO0W=vc#(D^^EP;+VlMZA{lshb4=bE{2+E*KaJTi3}Tb9*cXZDTOl~cN?01QwI z7+~vO^de{`fHuXSfU17F{3E6=c&gBBApX=q3T8$g9Cv@itV8}#s{;7-CQHgq(d6V> zhpOLw1o7yFs)ybpxRPUuSnU?_UM(&a2UFUM;|nZ>1qWT3!nn@op3=p6CvG`G;7Do& zl$JlTLj#*Wx4EpO7d=AGhHgZ=Ir%f9ZK#A8;olx5N-j{rw=8aIXK7vUh10M3tTw;# zlkEuz2|+;s0^E!E`Z6lxCIAY>eiw;G0IaGqvA&Gw?K$p<+nK%>3n8=sLVlSn=-G*=Pny|=~>Vkr^X9jd?SKVh&r|OubcbFb5bA{ z>ng^WqaG!7gP=Ef%~pLcvVNTma6+(Zb>-o`M6;)`eJStZi%{jH%usjhcM~Qp)A1sU zo@@_|Z*~tfAniq2FSeMlfUm3m<)U~y8xs`z$8~H)ecaojzz^Mq38|i?)AeY`jM9+<0G#9&cglN}A*4dsjD3?{s083$4vS(> z#l5=tlflk8Lr%y7E4BLc4R?KwK}{7H3^} zxfhdc1oED@bX8+C&1btY-|6jKVE^JjVBdCQfIs~Mxc#s(a9kT^Qj%WQCWI82E12uf zlu>HBD^<7+2qOvFE!6=~+S|Jp!d&x!1%OmJuVJ!NCt*6<$trsJ3hPzK20K}l%T@8> zRy4Qd{cwZAxm|f}V4AUi5Gc?j$WBzpfhu6&&LfGOh3<)C1unN%suFa#NSfAi)l>~9 z(fw@P+LF_@Oi)&r^`H3Y;O&+P3R?dP`1x!i0Q72PlcmHt$20Rkr?}nnnbgBAzzx%S zgQ%G+zSC{2@1Cr^p!5%W^bg8Lh*_p2RBCQX2Ibi0+PBO0)$TYr4gl1Ou92RRAZi)N zAdW>$l?6aP(E;f;fBZXXVhtHQ2W1Q~gT|J9tCv^m6S$_vp+0CHCaouLtfAf4euZby zYeQ#dnIXx51BZ+^waG094=_ zYyaO+?%^HAMhDI`j(Zd9{A;Mi_Iee5sIOOg4<55^o;$L94@3%i$l@^yPT{|P70_C@ zOS-MiLIzo(H36_OzN_fu?s;x5iy$3N)+GyjxnC?M<-fE3PZ|lTYJf5V-6;bYbQsQ~ z*RVHc9y#_eUK8E!>=0JA8=29?Fuhs~ipp?ChvaI1&gnrsn!Ko460ybur@hJkZ@&o#I2wJApWmfBN&mSb?a8EoAWJA?}a;ME}vW0@Hk+y&Oz{n z$TUr8GCZyXN?Xr`DGcI1hBq(Lx}!+#dx9V#A}pWX##zb&dw2{O|3LYGy7#bq62>e< z`R_dRX=C($g1^F$O=&+HuyTj$QB#ZIC%8nn0nlPT;W*#K;;d*0Vh*iy4Tu7gF(odW zP3anfjY2igw2JC89ATHAb4_lb8h5JWkN~Zp2;Ar~e}Vt6S#nvUJW`=Q^9sHY%r~bt zXo8+nbPj^9qc%72(XNdtfV(Tui>E(sn)%)g+9k7VpJD#C4_1|+lMiY(~=D5LM1OP6mk`u=f6om)@5O7KcL4V#A zPtNuqSul;C7E#yVtHIHMYGyX*EtEzG^>VF|R2aYfJ*j;;p}e z4Dbe*L{kutfTFG6)RUMSdwFIU+fqS60R*$p?ysPA02wtUp1jiWHR3ZJ2*_W49 zE7gvCbNUlIzl>$3M!Bqm;>lkTGiXi=Y8t-vMu3ZuW_Mn?TLoU-;E?efHor-Jq%(W> zI`G<}bHmUNMBuPwg2W z44;`hy5mmF)hLhAbjqECik_|D)jPXuif-qMn$JzenHcz0`3@9v2}mEe@`F#_G<)ee zm);&|iZ~>c;`q7hx)beVX*YQ32C}B%dlRYVHqh{?PiWOZ6=`N!CnAitlOc)bg1rC# zUa|6Jqdr{T{MOaA)*ow{t}PL?g(dz69@$g+5S9xd1xvAr()g2n?QQ($WUE2LF{>@! zOqPFpO2;AIbM8iEPxdBkb{BlI_th39W8GiHPs7Z^!fnFQDcX?z zv>leyAFQ9h92%W=dO3aIf7eT5bjUiT7||s+dk5XsA9J`mxR}V(f<6`H1~1p(k6Rd` z9u`@)^QsHq-SO@6iQ3g})u`$mF=w61>WT2N`l8?i*{)S3!OjE^Tp!o%R#__|rrOuSMnOD<;YVAx+#vgYx~8+GjFB3!aLb2nn~eNd&KoYv=noFZFNdT^6u^f8rS`X zUwD7*pe0R7cR}>zcV_{o{5B~*ahm&YZTkHC@C0_J zMW4j?d2PyiN2Cc}3eaCcndjcnIAZ|I(KB%+>+4p}L89yKt@zfAO*k z{!(2pTr1;X75!^z^8Oo6YEk%byJ`I0Bx-M7v$q@V+EjGG^ovaH1Wwik*c5fZz{trB zJmJ+BS-d(lvXSYPF6e+Di{$w z_h>o+ufJiFejWC4UnRVId0JxeFd~Q?vHtSgXk)>1?i>keX%z}|3HbTphKkba!g1F! z_Dy)YL)&w?aif-;Wj)x5g$u2m;m-NYC2n~vM!$4o!u3GtSh+)cQ-yN6TIFh&8{0bF zx@|~q+@hs&xfM41^J$=e=JfK|(r=~W&wwynv=-*~JKSwbLaKddy7viHifzz?e04|F zQzP62^f`|7Hl48bGpdr)I_%xDKw_5hafSo2p;9=hIvbgQOR67~8(SLPr&1PIackxf zKJMwwS6!bf#Bq$kd4CEEA>tS!*wy(`wFmPA)0T;diJ7+D-(x%ikL!=E`qCYWbimSi z!joYSZyz6bVg;u|U_>h)e^{Fokba#YN&pwXk=5h%nVQsKLX zglAmA`Yjar;&1RzH^qH$Giu+*db~ioHfHF@HN!#sF+C>jil$fMckRZXO^vuk*wEx` zle0UdNotes!XZQz-FwtKw}KmzOO&$6x!WJOMX!XVtHS2KEvcZ$VLuY_XPKi#3Sf<| z3P3UM&F7%#R+e;Ps?i)FpJYURBj6YVK)O-X z;LqekXh4~Uwp+zpUF}=6{f~`&cr8>Q>bCK{-WMY-(p`z=OjBY!ns#Ank;ah2VMk=&YN81?QV;wp*zqb#);8Uz2{vK2U9Te?X9c^I^bjZ(#sUvHgY?c^fOjSie zGd-~&W*NYe;O#K$upB6@!>U=vxM*Ozff_AEllty<1scI3mIG`qq`_p8blD)WJX zd8^KOInSE}Q-}>4x4UX%217w3JC`k@OY%B4?oh2|tJI!u&In{&`g0?01K!~yaj3erZ(>;U+KwV;eb&0&Xq&(heX$wu{J_n58X)T} z%72#<->kn&boWLeVXk|;ceaB0PC($8S5Kzu4^4Wr4zKUXFcmazH-q=S%+7TzEq;*b z3Ohx6;^3PkK4dx{6t$Zvl#{SrYo)o#N>X)ET1!@)OImJk%BTw%oh|EwCFyXM!JD-{ z!8O6U&|%FMn+QPEccS7iogIh`&g%HGCCsr&s%(<2o^vDTr8e024>j5Qe0wCEbXj8x z4pLd-^Lwmpmd%=$Dp(0r687WlC>bmV^Y=b2!eqwbb9A?Y{q9#)sKc0E~)o+N0Y=4|7yl8kuY@SYQ*%2BPWKXUOk zzsv;sB5M{AF2O^+O4ACMpbGf+mua=o(l^(c9ZwVDbrxE%)dC>NwFzGOs*_+8KJQf6 zp2L_G=l9Opy3;tpEvhuEFRM4li&U7Mj%}!nZmA4K)W=3;Z`&6hvDg?Mn43&#oOW{< z3tf`JwI}Q9{5W9Qs_h0kE9g@c?ptCiS_4gTK@p~<^#x+X1F&oqSmWncqIVcu3M^$u ztNII%;HtgNESAnIrHZ3f^hDWlcq8V^VjluNYu@LrV&CkXg(eUaXL1`$ zT_RKlrK|0wv!Etx$XDl}Eb;o2<)f*+2sFWCFqGJ_3!pdKq~9QhlD4j2D$INebwcBj z5MST7wo+#nI?AGTXvSVm(1$-mKFN*T_+|}hr7oPsM^+|%x=Hta6(gMc#byLh*%L<&>}*JfFXMHfP@lk^rG}0 zdX=C;KK6~yI=C3C_d?-TJ80-eG+MWF85qaPaAdS_kCN?3`V(;oi= z(%h8#aet22Mg2KVEr~UUkdYrHWqFCgiet!n{Pl5VRupu0NIimAVzgx3PAKSGeTgs9 zOnZJR{M_V6n+`A4ZN)pfsLz4lKF)2A-r~|CV7Dmp%uAZFNA@5uAo;;4HZy zF{#5%4^F&>*`#12Yu`mT9fBa_x1in7ktd3t-f)2e^{>oq-bV?2; zsLxdt2RVl#Vj>#NAAt3orA|21E%NXP{j8|<9#^%|TYiBrraI7PqoK9$w3uT$X-{3J-BG~Z@X`n^-Dnfg{*JE3vRqcy@Db>L_M2bL^dBLL3D zm6(cz_`~K5Y+Lkn?z+e6wQru_aXH{+RJTyaly4h%{g@*@8 zV}L~c1S2itzI=BqXEP5FwAZlM$CR|&&hh(-cxV9QkLf@=SKuP^)V3BYOJ5hS?=TB9%GesidWu@+_fO~Ud` zOkW`P&;Bb_V~}!q+xlVt+vj&PGwKj=2X!hJ4U4J>NXdaWcOT&C6xc zN}~SeRlvzuX_S${ChP-ufq#4T`t6LJio_WdG-3$9JP$VIX=yk{?QO)V_^g5CGV@!J zY>zFk`+1~nuCPD^GIl1fhNQh7R&wR*?M7_jm7v`;TN|6G)pdqe&`TRb$!|Bv1K8dL9Fz@*oz+%m!!RqI>{WQOJ$E; z*IGmTh_%hGmknnx+dzT~aHqD@MWWfONZMzFqk#tSiL`SgPEpt+BlxpX8iq5=dqr#~ zP9M7@hRe2DW)Az+A%~FeU!y!dNNxi2D*@3O$4K}(eTjs5AJ9NhX>=HrzR1Zl3P*4_F)eYwa9BqKQrF8 zN(2)00j=f(N>#oRQ^(Zb(G2(J1b18xYBC31F(H*U zYA;$n%nJ`HqN>+eG?RFXoZr!yPjN!#BY4zS^58#$i+sF&4(wT6qI3R#_w3xsCS{$H zCMV)`l(u1y(b;1C+2i*d!3mTlf7Z49g-=;?4RI!g!K8eQ)mD)I0%`Qq0Fsuw%=pB* z_50tfV8=u}vlP}mkLZ^D(>Rc@>1NhbyJn5)4b+@S@}Df_1fUqKQzj-TqtGnx9AJUV zSkW|WZAXW{{_nwnzAiYiQ@$R0HXd+g-OC<3Hap2}XbNpc~sqC|} zsC#f>VbaK1a+-uobg-Gy-0Hm< zWvf;nMP%p~q3C!@KZ#oNXn-Vx8TtOQ66|-2^vJF7u#r4PjbYcQf$c%J0nyf{bzlMM zfRJLz8m+~?VGXyETNk^9d{wB^+!RdZsAasjsaQp60h6LYU$1?eyN>+(ByOTc)N@h^ z#w+1^pX@#ERo?;{GD{rB&LZNO8v2A)3r++TE!&WXnVPqm8r!s;S_45Taeux*xCX($ z9)uM`dro!asTJtu7r{G25!k_j;~L98m&C4Xjf7;49gxGAaf~dVzl`IKO!y`jB4H|1 z&-emIgMN8+JtB+YUO7OqTjAE^bq||=85S-Do0 zO}}c#b&norqUpg;rE4;#RCH1w4cd+?i+>!VriB+)JWdkV-vE{)T)DCxt!)HJ2A!gG zMR1+xY)=oJ%8Nb6Ywo+Y47m+thKbs}LHzcMZVTNX59F{mL@m0Jp#j#;$ia5&{Mm{e zfe{}#*2l6&`cO{ZO4=>?Q?|$ld8t<`@Y9jB_tCFM2kBPXN@6(A`cR<@LXL>FQp9cs zh?amfkaDUJy2NT*9+zea5hg6rw@^(MBOPZJHEEXC5*)?!g#GF%x$D4h;h~-RUsLLv z>!ay}AcPMa`f<-6AH0?5VDCHDzx(p_8s|q~oXhYx{e+RalkrYrepX!pu|`HiYsIed zvEEzW2HQnutv3aq6tSQaMqTKHXM7TlIyD&I?#U`LJCeZ)TbuYIdh*;i!?eXD-`WQ4 zhzsU;xEt_g$)1R7u0-7yb5mebLr0@+JY#1Ylb(Dp`E6G$GxROwnU)ExoWCOw3lK7b z8cScwY9N=2|MpOia1NQ=fDBl4WWY6rDC<8a4;zB3#i#kyjmU-GzFG`w%fDzbo6wdw zllzdb;<@_wj(&2_WBDIJjaW!mLSHm!8Ys%0PCpypIG*3{r+a(bRp}Vbc4-($S>5dt zcnn8g1y-OO2MaauzSwJ{PPX6{&P;%y7#8W9%HVdzL&j`f1kvbsxt2{>il{#Q*H&Un zZ`>DMW&h4y_DIyTVg3BQ%azjpUW%VNzGhiC#|@o1Ht{5h0@(_(N=UPAy6w zY*5{KHOK6{MJx+G59tAj%=n_ys7)E5AYrOfcETzn0vy|(fm;mcF1ji}ll<@f>LBR_ zpST0)k+iFItUK8Bf)62fp(M7wN#BZSt&4iD*dC+x5o4kllzsQ4Ivd{1KjY%3KrriN1W{`f!yBJ%(5IY-zC^tS}ULZQB z$&RQkI=+5?Htw}*-`z!U?d`6GN`AGZ&EF;o6jD!L*rD_PS+tJzbn0q3aIpYAFJ1dE zcCK+OZ1q@8NO##}2Wd9&b-4A4zOJ_$JuJ0S|0a#!w*Du*Wc3klKV}3Uh1F*e5|Pq6 zDTq`+9ij8q-aow}`(&6`@U-64e8bYLPxO43#yKHzCd>ic>}<8xzTSM*v2@`Hx!IgV z>L9f{MkP&3bmHc0dtiq|)wPQyV}|8dJTgI0bAwxVaB3k+^2|e0WHEkGtt}ub%9o+x zVq)#Ay81Kw9K2|vr;ty7<*5?R?bBSGwpy4oC)if*wR%_F3lf>vn`2U+7>w$cMK@}C z;Cprq{)3g!-Pk)g+}$~IZ$*JJ>_!40S$(dN$1^es#YmZ@Z*H@>LCLFG#bYb2b-^{% z?A=P6#4FI`VJaO@^rI~sb_LH8;3^v<)Xriu_k^>INN$YLT{p{$F^_uj`q-ELj6zT* zoC5zgd%V|$>pHgqhyz~*G8XK~b;Dqv6)kwnmL)T)d5X6)Jk)Gl-q!kQH*~5OCs*IcvknzVf^DG}Vd|~?IU%F(!u}z2#Tu?t%R21g+J80Q*t#iU| zu8`WpbGIil>%%M=-yan3zvz;`0==+cVWtHg?%O(0UR*>?Gn~mXqN0eb$(CF-w>ki} zxn=;O!9%X=+1C3`m0RG-#~`Yx2Q(X)s*viQX2t+;q@nRby0DU&gZ{6#Fg!l5{Pu*-JvVUf6YPUgyR!&k z{yF{&n%*dCM);W(GY%d;RtpZ8RjHxMgF)%5N*fWb^a=FPRE7N&^4b$3g*}82{Fd|< z3Qc3ss_wu!IQucQPL-z5O}we5_hxh-TfRrMiFS$%zl=6){|~%r=@2~UW~VDkdO& zD6m(B^Q1zbjGg1oBa`XRW!Y3rNWmskrNuO`6VyG@i-~-TPFj*-==4|Avx`bv_-YO% zzZYpE%&A*&90nVES%{mGOg!DPm5(&K)@5cp3tQB#DWPZ&GDf9%zXt1bG*{|3+44tk z^J6c#w0`l6xF%Ts!Ca54D7-1rSY=i-Z!vL$BL%YtK)nb3yu|l)tr{foovYiq(4(kj zn>Ag4tp9SkZ7Z6Zlwm)?L1_j0K|#Q2Pp1vt(Vq*9_Oz$=zcFz4E}bjvt-9S5kMy{N zvGrKEG9QR3hy`+p*pDdcnMFCRe406s$K}psEyBtqnSEn)PyUFu0l_j2G0%nTfos`M z?JfeRlf%nvHn;MfmHxc5qrw)}LH=El8#}O+_0%_URLP;v42cbx9t`}>A$ z|B>>Dct{$RLv4$O_YiWR;~ynWWIS{}RRem>z?;7pG{T)~kjc;J4ylpUyEoMEBCffn zKCD+db}lo6H{!R6N-F!Y-2?C?IFPcLdZVb=tDSqGuI!?!T2s&N6D zLvALZq#fY$d>}zEx>OuAfvZA^#x`glp4w5xLhJ`K8k`^H(WvE|zE z9rp@vdIxUS2G57?Mm7!PFHA^LqpL7a%2gM-mvP~9lAbdU6koAWtY}sYE0z_%s?@R!LcXsaitP5zSL?!`s zkn5K}b8%ce+5=u6`Z8Ev6o6wyg9uYh+8BzXu!(F2lDK$CM^j9iEBpHf$V8G`cJESV zXH`&~2C?;e&<(%M?ugzpZ?OaeDIQph2mp7~FAn`w(WtunXEBPrLqYmNa%@-+yDM|!n*s@_QzQ$dl6kpG8qX!6a#q&iY?_T)t>>!{pmrdEUMZK zB{vAg*PP zuau6C6b-3;LMmmP!>846v?(pMu+U_8eA*C5R2B38e#gL^`IT>iqH}1q+_CbRw382NLv@EV>~DD#${tm0>jbQuGfNow!=a1w$V;jPb}%3w7#R+$Lk|;B$8G5{m7r zJbWky#I2!(HUGvCJL}_{Aga2$e}L!1#NUV0#{#Yl0&@Kcl28q zs-qTF9Kr~txKAPG{66^bwD;z?@)nD{-c{;))4Ar<=b4Ux1b`+Qe$de7 z7%;iUP>wimMp`!4ln~HM?%39#mKdXsNTypkgyW9kv>3f>jhR-8o3l^a!qmw-(tv?^6B^!Q??y@duU?INy}$q+FQ$1&s8X>5DG4*Xir5;eBx7nBhs6!N)W6iA32A zoku3t+Az9O9k=Qq)6WmZ`bq85uF0t^xC;VU)z;B;cgCEZb#h^_u_$Zc6#8)Z;x4<& zcRLTc8@X#Peg!tDrpdg!$DAV9MADHagi*O!=RP#5L= zk6bwU$DqOkReb7ULrBBsuS#)6z9Mk(Ut)rbYj}FWy{!j)} z(pD1=c76Q|~7rQe4f0Wpt>vgzIl)56iVDH~7Ev+JS^7dep0+P*7l<8Ha z&H^%vJS8mP(|a^asjn^r5*2NpQ4!QYQtNa&H>5#xyOJ&9{J|W9xRH^maz*Y@>HeRhRx2kJj1A*7-h)%V~mWf!#Tt3dJU}L~a%&%LkfG5{u2~E1`je z94Q&nBr8rCHy1EcIiPY)W~i97FUVMT-_pGp?)U7w>mzmbrUO?CM@6ZL9E!691Hx5M~-~SHD^xVBfIxNB}9b}s6P_q)C&}{Nu zZl$z@u+5o#`xTVmYyj3fSs;WoVnbXGBP7MBU}xeC&f1eg^KxauTCb=0KzqXTzwYid zHKUT@I>SlUVl0HP38qZNII+yjR@Aw^jjn)bJ^>Faau%(C96x&8kQq;N|G5;FV}#p+)i0yvb2mpUSRElki(+~ zB(ljL3$9IU<|Jyq3-2*mH`GNk-Cwi96j(i9D#?_v>S}ANTP8o1!yN6G*?Z)Jv3&h? zIyykWinn!-R)_Ib~JECjfRhP35-<5brwV$lZjn6#{;H_s~cN(Q=-I%1U5gr={N<$vuy7}Bt;zU%UvL~2n!5G zg;E~?LrlSLlU`wsMic;TH|QI6a_0YFzweZ8;>3YhP6u=Rado*PjK`#R%eKjiVl~o3 ze65>#+cv^CX9qemptk&6YTU|b3z#mde|4()(F|$ahYt5FmRh&A>gqUb(*pxX#V__D zdqMORj_kq=dx!de|JXhU1z|ry|F}jT;1|Q@ zrU$V=tAM1us}pzp3B905ni{M6%c;gAhHK3G%|E}s!O~AYDk1@%?eda1vs^UwmH|c4 zBzJHod@hydfdKF4W3jS$%xRZyV-8u#SFE~Zf1=NZzKtkYp^KNvjeK#rFomGqB`u{k zWB+R*XDY-S~~LcTINqOn2mb~;EvVE7aL7OQ-(9A z)8C(q+tjZo+!?3z_{1o{+s1esnfi5!djTHj?{5q5uGsqdDSgEw?k)SKi_fT}*cTN} z?Y`U1MjCv9B6+6z9f?ktSj!g>A63GqhqwPFLmIp;as%^^HMtzlnsH>gJ)PdNdFX!d z)UmCVx${T)o2M(a{chgWyCib<_lfGbJa=VH@Jchcp^7;++ubq7D{*w7aE#&Yh@?BS zmBWHOu8uIk%&X$1eA+H+3klt7Hauju1l}tY-WDJ;?|M9cDcbVbeR&t-2^}fgzrQi! z@2qHy-xilht4F>&^KE#OV3FQT8DOci7v+`6qbtG&Il4p{NfndA%NN5z#X=)Edcn>= zA~vbT9+Cokd<7*9_1g07cr*b?X158skNANM#}@=ie>RkNy&39c+@L{DAqbdam{n|v zkL&dRcyqwW=n;#$B`4d}S#xdiV}7L{@rfIZ$P_>nHm;kqX&7d@+vT8t-rwZ7%#1yU zOc)vBJC;hDBzWYn;^dl>M^3kL=fi?->$+Coj%<%>c;V`lRqX&~BRzq2)s8$;I)zU? zk=<)`$n8}JElchmY?8hH>%U(vCdgVg`N=si_MSV_vo?6%A6d=#B14SpO`#ihF_*aF zM~C<@{BLhqch&in(*TdL!0pA$Q75YhLsOi>ScHU1j-y|*=SSn)>RLzW-~bjc7C+7F z(*Eeja^HcA`o)J2FO%mTheW@1)>JXjJdp7+=KWPe2WU#1M!2i-c+zUk)-Gkt0Xf9= zU!g89tQWBN@=#3unmkwZ6lKer*GGL*gI@hys!mIY3b{VWykO}Vev9O$^3m}{E=Zxa zJ^DIAANUDTF*jNbjCpJ$6SiQRSp6)!B|S%1qw7DqCXH0ncZtkl6Uqb?izuYdMI#Cdg%d}P}kPmm&a z(Y2wD79RD@ZzZc>@X%W=`<4f-lH+Y?%9wHY#gQ3hIW{6 zd;+%ikEUoo_}8r0r$}@5Q<53?$DWi(luFl@j-Eyz!R=guG%TsIhb^K7sg-S)?d5IP z4)8k-{Tef)<&J@{8{5bUc7oA$5lQ=%nVW57Luv{Y#NLy~Cxu^Jv|PL)7)3IzS^s@Z z)*g{-rdeBKixU4G=Wxq+4kd}l^|4>UU0b-?tA#K90m@*^tA3@U^zYg^W575Ie4_VN z*0JX8UtLho=f%9sOV7bEO91E1v1NF!)cWOI*akDy0=5DPDMxAaF7xZH(N_Mg8mSw- zpq?gy^;+bc+M<*4-zsVH<8vT6?J=2)W$KJg2k`y_qpwr6_*mq z^<^rB`5l(l@*;oCO-?^~xcMlDPOKCV$i_5E z)ZYs4nxvXm=y`D459pgU?gX*7PvmyZs>vKXpHi$?&y3^syYptIbgiw zUTDDe*$cRn_6(ao%+|^X@wi(HsQ5nkUpTi$>DNPh0y?ifD-x9hB18Ga)Kc(6K`La( zgD-6ADfON2fjxV42~&?+f4HK%m4K=gJ!|lZ zpV!x$8Ollu<{f*bOj3d@tT{t)*VmaOsDFdn@LgT?)$&%<7M1_ud!VD$vW)Q12OBg8 z@UXf}sY8QoF&_{P&O5&FO&l#0s{60}4E2F2Akk-k8HFB5etO1yMj4WM&Tjiq@}p?pnV;ff=$90e&4^`%U8Y-4qp=`oPdLzFsZH zpRPSAGUKUS0KT-n@HP!T{g>lk+5G`vPSNGtN_v9<9m39^=%XvEra+}J)pgUM7*+Nr zFZ1#36rY0%7eLC(-6GE8pwNeCnco4Sx9+KQxpT#OhN%|Cvj_a z=5nBQD`5>t@%d4yb4zpmTwF44tirA8=^KxfFP5!$_m}SFx@YKIp00TDuL?Kxl|1tn z3042MdBNB&DGDGK<>V^nu9z zX5pP#&d1AO=9kX0e!3yiL9z(_w`tO&d)b)5Vhq;GcXGo$SQi);a}$6n=q)VOw0$*T3n+wYuNW<kq|j_KN{U>@m7!cC+k;%b))XKl|o_ diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/MessagingScreenshotTestsKt/ScreenshotQuickChatItem_Dark_d19fbf1f_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/MessagingScreenshotTestsKt/ScreenshotQuickChatItem_Dark_d19fbf1f_0.png index caa2c47e30f08832bf5565337d14dcaaed091515..15e3e531b91a864fc8d6890c9f75fffedc14cba9 100644 GIT binary patch literal 7881 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 T+WJHq((c@ECTH?a-?;y84aBOz literal 7323 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 diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/NodeScreenshotTestsKt/ScreenshotDeviceActionsRemote_Dark_d19fbf1f_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/NodeScreenshotTestsKt/ScreenshotDeviceActionsRemote_Dark_d19fbf1f_0.png index 512e7a33812b3343c878a5aa91511af71944e414..2cadad8e28ce93795653b56debfbfb2cf150a6a7 100644 GIT binary patch literal 149734 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

C_u z+L!)kpM5M! z5L|csG7R2)O zJz$?tOftDzL8-aycTo1_ccDqrHLzqdv!lg`9Ba18xCy(3OtsEaazGN6o`0pUFDQH6 zkU!g7Sn&R;%*{U{klfCcf{-AR>vZv4c$*JTIj8^&DkmLcPOc$hA(5^6y=Q&nOoTux zflkc3FS&mwiKujt*23n{;Vs?mLPk)q2dNJ4d1<1*?tG*~`pv#+Gcm z{b*+#=bfeA&IM#u<~b*a=}dQzy+@t7CBUy&^Zyvo_pQ`;+lyzT%I{D{=@704QqJi7rd$BtYJU z)(6gIt1I;O)L5N~GCTc1Je`c>!xGCIcj!TiSbT0~FZp~bx>aUjyYQ1olqHdQKaro; zEd6|bH6N#A<>6*1@-jxIj(>yCQWVN_CIsa?`*`0bU{@%R>F-(x34Y9 zI=asYc^ddQn9B(vm(<9`+))bCqSA&cAy2R~c4qbporUvW_x1)!K=g2N6;;;>)1HRg zUS8P8j*?tYpUE-!R%Vh-!n)RPDT=O)I>Dnx0z($$9K+ufjJgzb?P20y3@{`Ma=Ely zid3fYEuQ&`7-hHdo*#=xYs+bd^uEu?T=ui)yI94Os`2eB0Y##cqq&^M4+>luHI0^w zG3L$8&8tb2H;yz)6(?v!5VD4nq^XIqiy%<7U~<{e0ZNE2c_*|%>a6ru+xWWqxI^iT zs2jeQ?%r5+t_7oo^i?~suq!^iY_V@&+a+@mr)ag_9r3x4x@wvymwdOTD4M)~z^Bz# z&@+O8?FMdDOsQ|;!dp963@(ifHjf275sPA&)J*L~sG6sDdY2`K*^IvBfx2CO`$Lr$ zJFO~?<1iHN#8=sR-h#5HZMYNt&2U7fVqZnPRf3o~OAg!3*~!!_Wxvu9kAgq@U&%_I zy~+~8Kws8=Nh>h3D@P@j@?|u?;t@kB4IofqV3$q2$(ucAu=q$KOo^4{6lOpO<2Gee z;dQ9!dii)hryXP@RQ1%UfJX5fhsu~!z;dIv^p>kwbrtS&X%O~cAOfMiSH0f&%8RO! znW7?8WeXy4l{VDt%~(7dB~`ES3FCjRgr9kCWzDEW0(H8~Z?gQkc9tm14R`3bwn~+s zYb1fX6Ty&~Py33Ndzg_w-D}vG5;`c*3}Wh_X<-^zL6jjxB16icMG`WiXh}kf<;~>x z&XO63Iu-H@6;*2w81&LO|J^{e4!K2f@R0ESVma~i>gXc=6&|iOcu|^wFzX4Nn-KQh zh`NCMQv(LJ*zOX{{u?-Cq`KcZ^d&ka$1LYw@IPqzR0yh}lvFlh)FcUXcjD2OjZNK$ zWlpSRHdrWqOq$M0omFtMa@P#`{$dU4fjf=*ZFIIty0QHws`d+?dW0soT?XMJT1 z?7+Fc_j7%5spRH{Z`L2SGi$gW1e98&avM*Gn_~M7A;S~eBeIll1HcIgh@#k3A7uqO9G84f4^I)D_MNToN~&!=_K+S5Sianx z#p5PsTF!k6FzWAP*F5?C1J4O+95R>h2$jS?+o4Qfq%}5fUv7VE=SbGcYRt=Ip?M#B z77O~4Q-CffCA}ApuqzAEMrSrGJtWWEuYyk6{VWv^&!L_tZzI}3jw6PI;+Nn-Sw zVglcHqu-~qtg%&|8Qp$#o9d{i%`iY|8H2&F690r`>n>EUBAoCpRAeT+2a(9#o76_^ zqR@xUjs%75iaN8(AHZDAD%##h%|lP=tw6|ZnbaIap*n!l;KGH&(KHt zDEw{{Q6A)0+7ABA>eA6W&1Yhg*2g8G_&4}IP>30T41ScfcQ6C@I@qeps{E(q0 z=jez@+F_&o^^ozi2=RN)_=Bg!?BocPNEq@vx@fY^(UkTdYXa6mA~nvwFFBhVn`Z;7 zuISl(gxMpL(lkNc<+7jXe#HFqc;x!qcHM zy>&s)uGo70$ApuhXE@b=U)>lE{Hx7?ffeXsWU`!5-MpH5yOozy+-VQ!HIq@jhLfw;sZIE+a zx*x~Yh-K5zs1SFcR7{a9>>TeXAX3x=^fVPsR;?#F53Njr0Cx=78y!-$LJaH)U13B& zixWSClbM9fPFy~m5^ddV^1i?OCt@GuKHw2Owd6U;|#~X#w6`qy+l{@E#D%{EoK@~zk9%&iV>Eey>*Y9FlW_aep<@yD|aCzJz&ApzF)0~teuE%qWXBV@KCHwYi-WeP(tG6Nq*3GUR%(|I1 zjIFH4u)%PNfufOJPBIOb3%Yf7fA>2fv-}nRZh1I&#>%qBWsV60U2qp62S?KbTT%dy0Etex4iRnxUX?@F+PI}Xa%Ap{u+&nO^q(!7 zPLIsJ&U{~xquUn5F07p*^NzW>a(k^QOy#BgK4;LgRfl6AU#Z7k^WTdr^y1T`*v$*{ z+X@)x?_NIu*%%1c_Znr|NgymW_sa?Nt{prK-mMmuO3*H$op2RH%)0%$8DK5i3kfHn zYp4%acUjs!;xKp9S*}i_j-}kajVHk6)NaYxE7OxKsBRD*GyeNT#UwfuMhq+w;rQF} zb)FmCsacKu;2{GB#W(awXYX=>9wB1XZrNk-(#N@{3#Wt%iuUPo|Be!U4z`zOVUy+M z&-WWK)IYdAC}?}8reC82xR;SAppg|tl5$LBugC#+~*)iGXn9315G%+BT_-vtP z^^k4@TCmEiSDD7NKP8HM9R^)D88+H>Xi>7iTB3$`ch-9625Ps`-C1*mghi6 zr>&Dw@HAV=MQdl8d;g#{I#Hy(Q+h{ww+Y&m0z%X~%jj*s*#sl{KXPrpAw!Ceq-$zC z52(i9%{FNT_1SDdoXlA4ci17ux0Y>XTBEDCqzy3-87*#pxQQ7wWl(d@>@*dxw0CkF zAznE}eaCJ=Tr2K9j6b$nN=0%&AjpdQWOdoCSdCRj4tjDtJi4JuV)$b#`k<3|cz$HF z4WUS)z-MSh7%(W%@T9AENupQUsjh=ka`0r!sh;=z>R`E-46hOL{R*X9khme0xfgkfR#+zr9YfJGmlP~D*EgCNKl)ky@veTfBBwow zf9Mr5*o2qPg?TwarEDtA^yRf#G7$4UcTwIZfxfg_*f^-%urxttmaHw5I{q_lZrT@bX!VQqcA8%5_d^a7uBxM5@)>2584^#n&cMIvRFZ4Fyj&ud^Zohp z7I5P~hn30dGt%7|4T?WP(FH9=*c>a$XMXOPK65%yo=p`7etW5LFTWk)bZY|JTJ-J4L0d@?A$#c zI!KKSlWFeAEq)=jVmHsR&;P+sVf>ieM$JTlt*oMX`+6@Uv1-bqNI34v@L zdvROcol$hmgMg{`KejICutWtCRT|y;UNp}SJ1Mz^sYqQtZG}hx!Mx(j@9NDW0go># z-rdei?ri?@#vYM3hbM5CnjSX&U@AZtO)qLnX*=ROe+pq#?~` zKHJzy+D~ncSnMAwLDv2FIw)7ay80w82YC9_6-AinaXF^hk~z>?^qqw-&=4OYN%QzH zu(d?E5?AMB;R%KeE5x8rC-ZI+x6>sjSMU3Wb>J0B{v3fGr5exh(AeUbPBklAx}n{L za0|OK$&PYZJZiLfLGKHLwv@Va$7#eq&t=W?3<<>G#9<%|i6KPBL^UT^RSqBZ5csWchWf>SmCrDjN zKMt5B3&tFs>DL>YdT`oPtp1d0nrC>Ke)H^e{4Vg^k1eSieDebC$P|aj_ z=$pE8dH+qC#_a6HBB$_=6RZm^wwqxRc*?;kdsfMlt9UOR-SN&*UFUgGkERhb2GgQR zccJN5J^0bbn_TgVfn~4mLTM=`{X~+d>dztyRQL@{apAn6leX3(&zpd<0UL_AQ*w>> z!s~}N33Zv(nILm@Y&O>ZF*KGVl4?wEATBl4{yw&wm$tj-X|ve6dA8Nv&KaqIht5ri zcp7`vjHv3i|~3Vwr-)@!8xHBQ35izs^wmZm1IGwCSA}cLnGcy`W8jS zmwu>II=l(yhk-`aajeybduADK>qn0j?7VVf<{eT7q*+drzV|T5*eSt>tdxm!N(%LA zVpv>~degMQ+0{rFHRE>TLY0jz`ckv35@PeKF1`IB59RUKYd!94RK@Da73sUsaXB9P zDXI@{l#GQ&L^0iM>%~(!Od!1Iz3eFbv2j|bA+*y{y+NW!`@Hn(^ij(U26m9J2pD?* z4$5^TS8W({9-buXy7hWO7=#6AX!#6`@L;NOAicL1)mNDPb|>X9mnD3`tMuj2WUirr zz;|x#E;@wB!Gt(f^XdLZM0`Pdt@1wix#vL%7su8WEr^2X-l~3Nju>=lLpWKTpRD7$|J@=%Ec;WFI`k1eEoSh!>R<@s{30Ev7Aywewg|plo zg@B;$JKac%>UyqUfuuNIAfaSge}*;E+k~{#k1uV^IiE^-@#5E1KPEnPw@%yUx9gqJ z(54W)G5*b(_;iq=6H%fwNuM;rdfQ7H0?Q^_tS^Z>^CaWM+bG>#-T3&t@6=6vym!e=MRROTfo@>MiicaYgdO>=F7E$h@n^j7WU6Vs+YPwT6dDWZ zvo04c`RKxZPQ1--m9_C53l>^V;qeol&V2b)qYnj&wT?xKB|kpJ)ab;=C{`V1z7xV7+XllPPiPuUT0*a%}e0z4K?9& zJ{N0g(RQ+@=t$$BrOi_eoc_}If&6zJ9u197>@{gyn0cBPXsWa~I`{fDji$>7+tI>V zOUkK79K$6G54htiN4O@wuD6ofO(DQLX;8Dze5QFfBb-R1bo3h0f%agF7g%F!Iwf?o zbVMP?#+l9Ya*eaVIuQyPr%A(oZ===?VMb$1%1oWIhqqO&lo4GkL58f$We>SZZQZq< znuQOW2*gy@djDNc6GJa}-hg|cw_eI;V5YflgN>vEk;WmH7;VOhw++Jo4cN^s9hI!K zATFkZ;srb1bs$twm_IclW`}guAf6(6r4NX&{S%lIz5V|)qAH(8Q_weHh z--eUz^C?nC((ufp4@LdYhkBZMi!Xa)X{N} zWIg+I*DJ&L(YWz%1t|`TIW~z3d}O${WqrM#Nxm_FoxTRHY5wMBrfV<1D7tIjRp>+F z$nRRO_>9^vCxb~%RVtnM0!mmXiD2zRx#jaC;e6wmk;G;^7qSknCv4Z46f{K{qn|gU zLLM3J#OYa{jW>)PnXpc|9!f2pERE`JEg!xVIg-xwr9q*&*NT*j`vpS`0gdso>;mC5ALPwMi!4=e+ZhUE=B4)#dl`j zyM}o!`52Qe8(v)ACibb9YL|mo3;W#oS%o@9O$NZD(pr>0>ohfczX!>;i526=3h88? zt69UKQ=PDWd%yzGw#Sv9`@Q6+MiljO*&-BObd$ESe43QUwI?)$&vjQhU7xV@;V(wI ztg(zL%kvfo2>zWvxKK1SwM*lV`L8>k>)zo!4xR{~kT)}~3GkQ1b-BPH^>Y{v;?ina zp@d*=$vm3bsM|JZPD3Y{=^^&=a7aoT z&be*oLT=adnC~Sh`e*O{{)H-WO9{acV)QSCQGHz_MgtHQ!R zDjN$R{DgonAalNh_V<_KjtK%6e^Ij21eX&VglBz7Fl-u(x7s8 zyfz~VCCvE;NQ?F)TMOT+xW@nU1O+E=Ksn*Z3LS?a@po<)t!kl>ps$c7OIbim(AGcE zc8aw+qyabn{j)|i8B1cpH!f7-`xLn4H_CmcMCRg^ z-0j5D#rwC(ZS!+{e-B7- zCX@=uzQZm@R@cr>+9&ybn}0(OnfWtD01fRPtBFwU>$glF{M;zN97%3#nBo7DQhn!b zz-8S*wYpt%APvB%@hD}brG29%7kGn|<7~;DReFf(9~uZ6ns)%A7eZVutBBi(SaA`d z)+uBEG^bek!AE>o3h|hWZeXCG?h{?zCCCnK)D`57w`%eKJBbEO(;r8K+Am_CMd3kl zctl`n%8_BOA^s1_28+}x$AVB`w)2r;L(CClu9^9X@U%ctbOunsIQCjv!=#x+mb;z*-9!w&r`y zw{+}nl!rAJn36MN491`Tr7C>>{!7M>oY^*E=`Lw(btL)I4C#AhvF$VXpIfWKIy#l1 zR{fu*YOVw}vW+3*)u;__*2Tq0e~?{?7=7BnZndcB^Zeoao}L>nf3I^$n!rDV_p&XX z5aEA&1Kv(wDVm3lb$2#+UVZ#RF0$voknj8D>+scUs2LA~LO~%RRfa6exBtxsiTjrV zeAzxw+@dkoW(oRe2vDW8?qoR;pzXY@Km z#CH~5>W7XlyT;zXgk*U@%UgOzwN+g&3?=i~8@dzih(t-P{xG)Gd}nW#R1bfgml)4z zpUGE0yLjW4)wT*l$#4f@r|hkA?w0E&MmwQE)F3Qi1##+r@bIsW(D(00j}36^nNsbLuziR2!EYeC> zQ`GkoLi_QilMSX?aH05U)^f^nxWp4y_EI<8 zdU5Mt!=lM=sU;*=TFPdus#W+}f)0;{ID?$c*yD9q66Jt3t&qqTLB>aZw}IJJOU}2J z1X9cWC&0!>tnVy;di{WuLxdnw0%DyT?H3ep?$hpI^rE#|IiEB&X`_EB>9(&rq10Dork3Px67` zc({<`TQ3kckeBXe(fn^Z7#8^-9So$4rT;0%gb%#x|EYuhgIv#V-AW1o!%_oq_)Z1> zhaRFL^C}~%Jbm8M0DWHYrxTJhA#uWff%(_lIP?w*BudjB6c!LmdEFKF9Jn^Lr~u8B z^?uvc(|zt{k(RPiw8M~yumS=Kl6ZvgOg*O95Aw0>7X!sb@^bP_@<~#z_cibRwR0N} z)%t!t1LTf$-M0^RXil``?%jQ?@Lqve?fM0n<~dSi{&tV!D`vzpQ{s!DI`-R-|Nfz#PbU<49NrbHs$AsZRt5hkAw1}1S(70hzCcC4iA z4ZUiuNJM1s1B``EVLiK07IcdL#V|7{mx|D+_np)S-md0579i$%$E?f#Kkf1&@59*a zz>)U$932dA3xOgg-i%lG$Q_L3a)Ljr~k-F46pS+HMfp2|C;Vt9Ph9$;Cktb`Kn6X)(0Mg zkNOdeSxe3$T>IDT23)-5;E}x&uDj~`8W9*`|3I4sYurJvy`5Gr=}LLj^l;*G@6;@S zxQwV|?-kj<(rUCpwu%U>RTam2&oen*?DMW%v~S~n=jV!+{zs6J1WbDh9g|ZjA|P6{ z7VuN=jVf?LHH(s!jXIwgB|m>otH1oo{O=8xMLk=DRalf`Ir5eG!8htWEVbqbg#@*+ z=oL<8jlW!#b#}Ro*$|@4rk<{XU!%kq^T<#^F zY+APlQduc~u=@EcFAwlsC>6eVRb(%_X~v$aJvU=5Q>Td$fO+)y3wWYvuzWjFXk2MW zU6cQy6N0A(nONN-!o9)wQJ{rNuk<6GpHwFSCU&CE_GU{C7D7$6k@c?}UXTTf;pHgd zEB*5X4``C~OvBW(x#Wb}celpA^*x&Q~rx{7$@*=Fc4mfG5VIN64p0){< z*4_6}o5=bdc;x&mxKE#2C>M)wKCVr(3!h{eC{UJN534nwQSQ}xqF@3FMFVd^UwIwo z(A)p&!7mj#)y($q@ttAzzYr4)w2T4ehUsxUZMJk{(@r=g4?hA=HBa10zFV#JzroO4 zbf`=YIRz0a=#}(YkgwPW(?^D_krH-qMoNBqn*%RJ?7WH9(wwWNc*8en8HxJjq~D`ziJac#k`huCxE0_>@Hb8~d!yZ2 zCPaE3ouK}00`@MUVQlktpZVbokxa?M{!~oUr<3;UPwxtm{XI<14>B^^Li4F<$Q!&DCyK}0ojp|!h4QG)XC0Xnm5$%VCl&(rCE-$YDAPP{j>2I7UcQPCtfXi^3I zGs~b_+nT}CMW-$6 zX|Y{B&|?*t`1kmD{Sducci=b4%FCt>?PM#R8YplZSbxcZcu9}>3mM_dY@XqY>3VH4 zkVg2cM0r0b=7mLibfN+Uf9Wnt;DT%hpbEum2dHJflZac^`?%L?!O z`*h673#`GSd_67k-rZFs8$(s^jgod8byU2ygQDAKUR;cnkS-UNEZ7m2U?B2q-w1Y& zFI@WG1Ury`-0#xqaK>EQ?;-eSR7|e!wMTDH(!3pnyw3}LhgNj z!>SlaDlF%o=D3P|oh!85PP^(wdBtn^k7Kcyef+)T?cn}L#zw(@U6u9vvrA0Vr*HG8 z#yaOWKTW7@VdWX~ISq%}n2*miA_RYdXUGnDuzJ|FQAH{&6O5E{4by=2 z>&o$~YCQ{ZpL-+LVQ0AQVYx)#YDS*gXqmpie1>MTEIsLB$9ui%t8{;<9(}*cSb%5x zUSC#YJwNZW;hdLt7=6}~i+Iep{JLTt1nq6j{V^Nwm|X|BnVmouuf(+>Te(U&Lg716 zEF2$|y+Q!lmUP}#EYU=n$-tf1xb!}sdN(83&EW$*h{>Q$ENFnj<_9w88Blp{EBx*A zJuvhR@|CsQ4+%Fb%b%TTt)oR%r!JH!elv}_6G_*SxO~+OzJ=iI5}0q$ zQK+vwgkv?U*!?xm6hT=7f>y4_Vsc}OHA~NHqW9Mv_TQI$Xrozj+_esA9Z|Q#4!Rw> z;9;t z*M4J47E)t0_yIy>0(>v1>8$MnHkaA8kN_6YXZn?BFYgCSYQ|bk%lid9^ay&5hGf*O z`Mw;djX!fp1x&ANAE8{4;5)*tqNqKyik!dA_o!Y(ph$W5d{Lnjr+f7555NjKy&rC_ zVbU?NuO(>CuDP`!d<0bARlqEFsMZHTYrs{C(Acy380(F5R!EuA!qdZvz&?(ltse@S zEFM5|$|~P_R4T$z45~`K^Pozk4Q}q~GCjNWLlmxq0ofX0J^Q+!F$u5tV}~Zmw}bWt z9vI1Rw7KAz&(J7?c)tp_$Oew0X)6!ZutENyWy-QKM3nK+xmoLm{0mn`r^gi1zbgzi zYdD-?>(`lT%QC`6J2IYVFESz?IrGCau|25$C?1f z%dbs}_l`fQ?cpgVtllK|KCNmP8}ta>wSMSzD!4_Fcb#tv zRb5{6Idu7+t=@YoW4GRsoLYF|57O;1iA7?MWuJ?6=AjO~u>_CYmuaMI>Oi}(ZW>xT zju-%`V$d4q{jw^sYgtol>n@o0RRnbpZWblt?n&Ef1?^~$eZqL?+C6{Kf3{+-HGtIJ zfN#tJ7{}7CF6V=N<1}X%y2u#d9)+Mp z?>hfP`_ur&HY$agW*Xn%E8Fgs`yR3Y(DTnEH5dw~E<;ggo+CRk4bDtX*l9XH6|fJ) zq3c-|9M8)7LKS6G1bNLeQ}0+S@^J#}D`trW%8Z#sZ1%7SskSkNnrx|lWIoO&k7R5E z7P+*oo7N)a%##V~!e2Ad-nQ8|f`ND?VxjsqgU6%Uvgey}iKBHu>GOLR)u&gNa#xI3 zG-O$u#%T+zW44>$Wbx9Xr|&|!?AgkWUi-I7eJDZGBYyubh2VCAj23+xM(3b@Gr)&K zw)1e)@KFFEUSgd44Zv6w9(DabwTFa>t#~G7YBgP0P&$r^Qdj{xX3%BGLPEjRMY{Jcz*U33IdB)G2KTa$F_weu+-sUHS9jfm z)u`6ao~x#US`PxdE*$TprX0G)ExC#TU67s0!XRj_57eYraNyX^%QSxdU1k`Fp?&V1 zwc%05?Va6WUI?baCL;d%1{?0$8>%4!j58mvgUuMGdc-3(U8$ur<(R3e>K_2*ou!0@vB_ z2B!r7`QT2ayhuZuU28*TZ6d)H}Mp>UN65T%pMlfa49+ zxny}z>*sB3<*Syhb&Ii@#uR2@)DbQi_IXo)&My}3^fchcr(c>1y9Ed1bKjGzt6vKI z0Pw6*V|c(mAo71wPf>UC)Vzr)dO?094+{|gZbLbAL{_WQ)*TWOMrX!%MN}iY<#ODR z3LuLCIGL!tN5^|&-=R(XARju`Pc2h262H3`REGuSMa+FUc)3{B^{@%|K>_704D3(8 zbpL$pHL6@?k?^hNvctR?uB868Pk6lL37qQ^Yz*ZHnM=eL;7uHYMR^}awx80g5&}n* za?n(tv1CDStaO>ahOa%0Er@>P_VvTFY*zuytQ{hBqF3E^|ITJUIawvA3h3E4Bdp6y z)@0ey&0a!jDB-S%G}?B9V9V!V`CXDt^nO%brMELn?-SGVP@0Q*VR#Gp%V9q`sYA7l zDmUf5b;yk140a=Ibe1zekB!x8tVGxX2H$~rii?A~Xo%_=GgUmQ&tbP*4v9*GZaYgV zS6NIVL@f7P;Qfy2&C81+-uX<5NRe^x=!uoa6j?E+?tJBZ`myJ2PN~CsO=~#A$9HN; z2g>fMY3Y4e&PHOCH#aq#b~>rl=6kDkO~U~VPhmo+zK~BugeqX|gf3$A)u@>f?=z#3 z?Y_F=v`|wn{TZt^wj*|Av0E8g!|BA5!|F^(QOamcJ|!IOw(>H=EZss5}E)QTX+8_LQcA0p?>!Q6vwq8%fVNR zUQRFf_z$)pRV3^5ZU^p)oO~5YE$0~Gjm_ApYhD92On_cag?k8U`}^0RW18Ym@*Hyo z*y}glz4{rhlGu-dU9kCtCiIJT-l(ZA)*AfmXZ$P*%mf}|lV3NgD6?L1v`PpJ>(Owv zb(w9rxHJzn0C_OXkhgcq(e?ndQ`{iS)0OMGhwUp8-Em+E5&!FPLtWbY{Xn@np5>8d7)#@6K9-lAE>)c_nBY< zSz5XVZ*StRztYC+t82(^`8tEe%{(&C{#JL_TPqje`vou}q6IZRFRsI!c6JMPx5aoz z@z)x*lFl}GU}?R>m^ge2{-nDnXqti7m91-f0BdN2%31v_pF@I3e`4d7ZXdVekM>3t zl_kcXl_dnQ*UK!*EoBoaV$~OxxN>oyNvd?7Mo1)l{ft`6;9#=R&*-3l8I73R?{|E? z&oyS5S7z(pyo?J4ojZJ__%usqTBw3_M@zU07ROi6F{zx0xSYlolnv^6>C5^99&V4sq;q6K8#BD7o8>H-5HnSyAq^1ZXXRL z9w(y(4+@o<{dS#Zu<^<1@|BhSmfO2+#vCMBD*&(sD--vM#yP;&takkt5`|b+?du9fp}PliA{C}D!p!Ry!TWsoOU_Ha z^J9+aHYOW8fLGs7TB(C4|I7R`H@3K0^FM?$0)lU@Q6jmILtmHWuIXR!f9YROs=@}v zuknpYg!g&f#3&mKz{-F7pLMa^)}%FWpUYfbvrc+!YBjb~Oy*zOO&LskHk4fEPfz#E zpZE7?@G%XQ_ATOG=`OKCU98q@r~y0|c$yEHJ+x7$H|R&g%SLC5jfFg<31D*IZE6l~ zkn<;qpq#Eh8!}~i)$qA%^qF{6k$%a`Ky`#{KhcSKgS87b?Y(r}#WKa;_iN!!cM+gm zSWlLVnDrG64T;284$+}v0A{t5JlG0ap3Ge|8{2=u4^Zhn29%8_0n@1fP!*=y;fIX6 z_Pm!f)cY+D<5t$)C;%d|qPGdO+@${iajq!rhw8 z&i0B7q0mC9Le&Lfp15ymj{#GRt;~3Z>Zpr4*` zhVsNx1F#JC|7(tE?E@;`CHHd@BO!O{DgZ1OrR7^wE(bEQdE-4pg^xh5%MqejUTgOO zyM4~3Dlh`IdDE8|?KWcQJInQ5#Wl7V8cEhKNmAXo@K&Q3%63}>b{CY%NIQ^4vdNxQ z4iZn-rC92xY$r+^_J4XQ8^lix{g-FNcg0E zd~Z~VKE(s|UZdt&&Ayka`jm{Yb@P(3Y$;6}E;y{LMQ;%bX}nihx_V0y&pSvjR-Jhn z!d~Br8>v2P61gI~`?M`La0_R?u#vw=+!)49RlPML^@SXbN_rPA7cxNdqknMS z!Lhju=cH)=rGy3@f7W57Xi{Gt6_ZFFOPcBMC{?m{3pUxVz9*-EH)J#-*=h)#LnZWYe!#Wo+4avVIr9kg|3Sfck+JAS&Asfkb(ub`)~Zu; zHKQ2;pb-e(YLFra+5+6+Uo^DJfMRhM8hutGY4T)|vXv}itYcK(kjf=u$dGD-_7o+< z>+`d?%Q6>Xtp+e$;~@*TFTT>X4SYqng7(LoREe7*pzE3?$`#utTFV39BDVb5(w%or zy4h|c{n1+jFM+r1eA&7O?bN33EwgTqv)v-9PF0gz{HUBRhmd7Z>Ji12c5feiOOI?0 za7NV7Nb4aPb~sK(#4k<09Hl-^>wn(UmJJ@cA~DHc*%2a3M3$P+%0q^H+6E$X4D7VC z(BsL!f>z$%RE}O|;+Hdt=uMf{UxbmssoMHaVSq+vJkeK;#i0mAyD4=#)^Uv_FLc)! zv$rY0g}yWuMp#$2XOsR*bHn7jrn&WKwFSL&XuWHvG39tl9T4#HO^!CHivUH;(r@l? zo2mL-AGE2YI0~g!?*$C=wd4T08>yQDT@Lh4?ppphLF#3f8?s=Scpr}FE5zxse0eXq zLN8*$cSc8$uG*4=Q>bfjIk{xdMF}RG2YWRLUxaCixB;fx(B~1-xTvSeX>a|03GwBsGr=^-IX(u5tExb~p;8ut6FPeLi$+~JL@>folKA6A zj@^&m-#6-`F{ZMU5btt-_$d9`Og5AtLZ)NTA-k@8L_M@4jnIJe6IAfKfl6v*!fBZE zdd9){m&a)y?zQZmHAiAa-S8fVAgFR1zbp2CZ;A@qO~w-^z2sOPKaCz43z)^SZ|+Vr!wfq$-O6zeAdWJ!)emn zGeiP$YtH~9FZC}Y@9`+hKWGbHjyFa7TQKI|&Dw9&z;{4@1OcqikZ2~Y9R>Xibf3N3 z2$}vA5I_~4F#tsx!ZAwbcHU>cey-^(D6@$C#Ve6~5B#nJ05+H$GG0uJR?4K2wScm9 zMNKa7_31OoLak*`U)sQFg4u4V zw=W8V0Pdy7O^+>(6F9gB^X4k6;1bN8ch!yT<2jo4jD}2pu86T!{~l(?8CvuMaAigK zfKXr|y=bXNtUh)Dp$mq9`N8-=S#~Z#=AX|H(ahew2~#H*65Cs7P57N`FfnSTVO3Q* zKyMW^zK>0~naNVGb%(31Gaq@YZQ5NQp~J~Y;|XX|5wUq=7k$@(M!-u@(m?R`vn~zO zn!KNbfdro&MINV91FoUcc{H1H-J#a@D80Jv{5LE+?2nm|Es7p)w%vGmUnRQehlF`4?rSS;FxAJg=`KVc*vA9UO1obiDf{J(GBvh10a!u@ z=Y8PCs4UnYI5o*mP}sz?E-e^bf))6sBKp3#Y3!aLsfzbblxx~Q(ptpy2e-_!V=uCP z0#Q)TWL+}qk<8qap=U_0fZC-(E;);+$|j6YbK+fb?O{f&^h$%@>pk;Gl+T3B`c3Q* zw3P-?WA@18#4P3FRQE(}`JC7hr7~aFW7%*+ds)Eoe`d^GgY%l-@64-!g8!{+Y?>6K z#{I3^-4>d8=xrxkOk?*Yq6(+mw5FBR%aRkNdeq&TwVHUqMbE`RfC|LM`_{~#+MOkN zYL#k_vsx65gYN48tLG@ljl@)eb+Z57ZdvEk@uSZ5U7ry~!s{m!2w-=q%>6Q`{pu&X z=}ZB%W`<{O7dD-?Yi%Iu_DgQ=MH(5n70`BlwEnZ$H2JCnb`}Qdmn_<-TuHH~OJ%)o znjmN%;n_KaW1+dH+*E#>+ugUSHysr8|FHMgQBj6pyD$c#AfSXuOUr;D-JpPkfJk?D zcMc&c-5@QXbi>d!fC|zeIW$Q3NH=^p3cvR~U#;`kS?jFt^FMWFp69ureeb>Ry{~Iu zeB){bd=-03qemHKNR3ApN|$WF?B&y6OSOs81dn7dBP9UlEqm^&I5QVad%gb;8&J6w zJ5^Z^Ods;va&+E_+Q9Tcb+K{g)G|g;)XWu>eUZ&MifX?7y&yw&4-Cv;TFT|)Y^$?6 z+-At0GNg)_H*VkFTi4Waekj-XC}sO-Ma`G7C*=HYD<~H1r8eHRW*H2rq)|t<#8vip zB6{z*?fy#k$)@BG2!H00|A;tw<(aK1{6P1Bs?VKFXY6Wki(8=4s9Q*cvEks$yKI_2 z@;nP4v7i{Cebl5XX%M6)Z&hyQzy(82WqjRx6ug(UGD7N1%Ief3_Q>MZppbp4Z~kyP zX_#THJdvH5pVmon>B+lc)lYL>58~LByL6NRX^@w(pS7E`dp6|JiSjjTu#(=^GFPb6 zdMXL~oKo!7T52&dX9rn zC9O@zyQjS_syb^F%LAl#8`^N;1V?U-fH3t)ylXk!meKYX5u^P{|MUl*k5gbh&MRZI z8@xC{)672btGC0pz#lL(M{(2cND~gI)yIF+rGLSWJyBR&qiy^wJ<25^fhG8$P&+x! zeRK_3x6mMTi6{Un|8`-~6z9Q2(OHceXLXMeCWXMmT|v+Cv)PqhR+XTZz0LMK_WuGiz*92Qto z{ajqhrEQ3?Xxyg{zGc-w%W}@ju%gfx>s#*ob*F|Le%!Huw3#|@>lsMn8okS26Y1hc zQ6BJxgf2aoaoer@=@$~P9N0WHG*e^Wra$%r3e?w)-uaO;G*9y5Wh*{uwz1g5ab@?T z~FOVi!k>Z69$E?J{9Nbdu&-pEHjGVQq z-47j%C|(E=1Eqjpm2>u&iKL^)BdNU5;n9<4Cz~>tWnYz0ackI`R`n5na9LUoH&RH^ zH~1)6nJ;R^&$Dp7x=-v?b^u@RMbadO%CYwYDls~kD^*AsDOJ(b@8B6GO~S<4?|?ZU zCYS*F%a_rS-gd%$o375RBisF)by2b<1b^L~Jx?U;Kg;9bY!g9%{u$5@Yt#QO%2!CC z$2r&Z`Ku6yTwPcms>lUlyTy}V(^9Xekth3*scJ)lUy+tY^zlTTx&4n%sKkLDR~sQQ^+U=YOa$^St)2|5!G8H`Pm$Rxwn> z%h8(*=5UPgK#A2g^>YMl{4)Ue=N*cq=u5?g_{(CFdXK3LE|@TLPI~Lzg_u}oX~vjo zRq9!==RrzUK}yS!`R_b2XMtl>t+2ARhjR1fFH;^vF1%HQ3X?HoBLKtloYg=#=c@f7mf;|R`v zD6}btqS%x3sLEQ%xw-!&g}o-I?|h;#|}3H}{j16uUG#^*xn%pttJC+8K)UVak^(6uXyWaUlPgj>qcPOh<8#4xHT2 z6^Siq3PazYt@GTovfzh^YNQIe9S5e%M#&4a$^4Y41SO(Vnxib1*V4j|pk6cOQIEa* z;xvwqjcGi4mN6RZ4ql<&=9waew~Kvg$4mfY0;B}n>Qc{(%9*voC#v02Wm+i8ebbd$ zM2*C}KU(;F_zxM9MA#F$+GRw;lCkfZ87YeEGJcTQSD9C(bK2aKUipQSs(dEhBTQTU z!Vi>p?rs=UwnpR9O)@{(kOg~gG#ui6T|&;&f?}2K-1VH2<9iDQfYeRrU_`Rhn1bx; zDt3wLu}9h!2Xgvlx;YvDyoOSAf>Q8^(~T$9T@w)J&tT}#!{wU!r7E0%?V+=81YsX} ztDdlHOfYG~<0dgOE>?s@of}T%x_#m~bfCXA7X%p{Et~ zbs-o)Tq}1TH_83Y`Cy@uBZau!l!oOTJ?PO-$ESsFW zrG`g$oCQoSGf%+t04&Lt1ED`U^`0*!^(}>Y>u6cht&~i75Akln5r4!$n?}KBZss@V zBiRF3U7>0qnBSqVD3o_lz1wN%y%>hKl*s4 zJA&+Ub*C49mMS0rd*0u}17R8N?b}4o6ZZk`I5;|)ycGI=SKz4bZ&!1UnMkk9>qK&& zKku!zLY>Eun79s!`PQj-h0ROr~OQoyhR? zcCScR@?|WNvHsk5>QcBuxB2TBh5f!xL)fK9IRKva!NL8-$M&BuX@$)JUW!KpSI75Axf?3^)8)T5*)T&3 z*NN0kBiY98i8uK1vDf-NqK^Tx!#^LBCVh*tpmM@K?`eRdX&{=I*WC*Jj$du&+g3TY z9G6JsnGJd)CR0Z|U*Uk#NSu)b29ffBZ8-(mZ@W&)wrT8Nk! zAWteflw%h{DOxWNq+mYJ%VQ+JUEp*>Szrq{MtRd$bYmgjf$L&MpYYm8N9|1qK41SS z4E&Tw%mW9VB+t5D4}_Kv-;?hf9ws#@hVAjAG^y?eyBJR?#_AF;NVF>KPx6hZ_weiY zTF?xVE312p#3;Po_fl`3!Em0C=JAc0?ZIfs4+;`iqdFXS|~?AzIU68@#MF98ixkRVJraM9FytX_kJXZWkMO&X~bBujJ?t|uy_4hzkF zQG3bH9AbxWUS_*Dzxuw4RxQvTt)c07$_8obmk4#@7;ga+IXs96!8?EMKpJMWhE^S9JJN+ibmTK&AJn&j30rQ*bDF>PZ}OZlk>$)0 zXqPUP60M@u*c2?D&-jPkt}F21w6sW?|Xb@h3RLd zZ{+@>Ag{tr0)tdrfS6I==mBP3`>E6UVqAxL_4dx?)lf#XF7u+w&`&z7;+i$2^=3

I&;0hb-17NN`ck_V{4nYhAd^DL#1h@|QC(59HlD{O-IRA2=>VHs z{LmQSq!AwY@sp-A-1fzW^hRN&r`J~}g8V(-XBZ?O^K9vu8w|O=6q^P=srB>Fx_s7m z5;y=E8fBdx%8A*y5xrAjj=Sqo!EG9CZ=p3WbdUR^Wbf;70WW=rxX65q%Fm#?gDjF$N9Gb@#aH%Cf zWqMRFLgN?yS{LybEEd4Nn>@BIM`CFC`@US+#;0Y^`IF??f zCg619J-mjVPNS6@Sz6ObHGSg-Ktm$<*F+X*WT!ewApI!gottr=W9L}i4aT~T7=MOc z!-9*2d4i~LM(uX}@^<=V#Ahe%Gm=UDo02Wp9Lw#NGRd4L{(~Sc_6wDGK*+OL-10Cm zC)wXq_bgdq0%!&~P){4m-!8z^qg|?aBk@L?J{ShZl3YG5N)sK+)+i&P{|w-e>08-w z?Lo14asFtWg*Uh57(TjnEXTJ$?X_+?4vZTRGXI0^lXH~u%hH|ZR<`-0ng~xxi_TJ+&ZSZ8f69&Vs$zd#Ejt?kBj4#nH6( z9adH@axnU|;)}0TEMO$3c*x`A=Gi6z^B+m@15&Gz0k#}|+SXS$uU6zm6(AprUY674 z(9Uv5bN|A2w~HXHl#aVTjXjQQzyF|%a9KLgxeo#s zP*;D^v9hB|a(Yc5(G36yZT+qhNygvd)Vt@or1OsJ@e9mB$5vRs9N6tXEWLMZH-b=xu7%L9C--uUH)h}eCGiPpiKA_5IdJVCb-ukvo9T}zl6aA)hRFoX&uHXib73Jr7 zf;V_7#d~G?FV0dvTn_DN@n>^~?_v6nLcbowMeF>W{U&g2hKhha(-IHEFW}ZSDj&Y{ z2!~^O8=v?u-(vQKh(WLfA?_3v@A4kUx`k2k+3)o5=F$aXResm&w-#?B`Z++VqwMqz z!|w51)K1L7k148nN_rZN^70ft-<$S;^2}nj=;8e4X?J|ZTQFoi1+HvgT_HoArRyHu zcn!yoAQXhiQD=pfX?~?*tCFYAzyn=7+)?QJUyoH-)zpFkEhGYPz5_^|x+(dp;*(AM z080Yqpc1{!JC6_pZMRDf&8XWK>}zwjSA6>A{SADqd3|AS5cTl3=ut(AxqRSgcd-?l zO$BW~<3Cia`pb*SZpj;}_;0+Ja;J^M(p>$aM0F!W$%~EFb&j0GeRAA{(O2t4GuITB zCzkh5p1c8uN+0ZGyeMOY>i6~wA~H%XYyGxJv8-43gA~)eRxn?=C6fVOQ1WDL1Nudp zc=VF;12{c^^7B?q@$HsRR+DH;1_Y5Iw1V8_Ce7v!%I>3Z6x0%Ls4UpAFIH_ZPY1j> z{bItKAFho3BTZrhPEtHWe<^Kg+6O{;HoB+1vc)1^R=UqX(x?w6BlJx=gyWNR*``BZ z03O4WQhQ;xSO3NT*0TYKT%!a0#Gk^b;kx0QU#^H!yB^yXD9|qt9|H#z_%n-2FtqxQ zxGeHZsmN=kJ^6*Bc?8POYcc@i(>Eajuazr}L;s&>U}<>F%d*FO0&iOB!)90bdA&sy zgX{&)NgmuwoBJ7%7S*l~xbrZ(9VWYF+azvik(4HUxEK#|#Q|gR4F=kl!F9KKMP+-x z*nggVn$nXF=&5orvvr;(0J{4dgFwcyaP5&$P-3sm5lj#uyD|Yl^LP7y{qX6<`lN|B zo=WBN?_xF=%jhx`3elc`&kjAb_a1(fxOw~Ty~q!3grbiK@Bh3*_t~zp)q&r^c$4RV zVZGB_mSYI2RK=U0e{wN<)cva>FRw0-+M;j@YK4O05q|Zy{s>&%O4GshjZ9x_h5hgQ zA!Y^)lEQKPzi;8)^L2h+;;T*kq!sAJakh2b6yH%!{`=oA9y^mIW0saS{mt%C>@lvw z*bMZ_{k%i|lL|sXY4|7H2|$Zv|6l)5L|J0Rx~cmCu`%tN6oXiTxP*>mH0h1LoyGN< zwXDq!Ed`y6X3#eL&VMrF0Q9pl9P-Zv6jWRgpTS7W2UY3z-nv4gjV{w)v&@3|ov<>l zxO^{qOvf9ZybT$tcZ#dA-_!nL8)+&3n0{K`idH&>lsol|EQ09jwWwL?_L(ZEE9)^0 zO)9qpI99vn3fi9E_#l>h;5UD@>)LpKh`(XgfS7jyU8R4DZ2Oyh#;+099AIcO>#g9Q z@hR|NX|I>5O?N}Gy7_L0(O)oJ#3GF9nn56V`nEpeES>P7{nF+@({kk3AFcTZAPl-vM%4?Dj=@*na_KYQCr!Zckw{}BvWLG34U`)$mQJ6 z-Nw72k=VHFkkDMH+3(-RZK^U{z@gV2dG!H$AoRS2hWKU+Dm3*cHPU1uPiFD_1NIP9 z&~ra;Wi(r2h$ybi?TN^axc(PJ5>sHwDev~+1RzabEKu8@8hz$jq&4$|G9D-9$(cu!xjPL z6$qnMl0s!VIgcPyvg#GxT;mJ}xxJMx7h5wBrht%txBp}g-W!A<)6VUpTft)a zszMAzyqkMV_2k<;Mn|JezMe{q!dE-bupDR;D6RF%w($#KB^tAGEXYr8M68wMm1|x}o1r|pWi?gHK%Fb32_3EzMHn{Z9Y+MUzf!8h^4E+DT~LD1#$7)^2p9zFN4>=w^&_m^ zD5=B6Pct=2iC9Ux==z54VmylZNR4DrwtCBAs;6AYgkAH-VUbydrRJafHOiO1(A3AZ zckZ=hR-L^El7SKY!Wiu@Gi9mIe=c z>00`6eaPZ~{=r$yzqj`#vJL&oCjBEV^pm{D>;)xDO%ZF=9xc51(N}87DE-zW0f7{f zM}uZNO83*aJQvd<*3{S?KL@p6DOIDG(F{N~r%s;4huDlasI)wB1~2zLqWpY6y2+{1 zp!7<-?}d6y;q)WvW}9IlP8%+(Z2bp(^rmfljzt@Z{m&q@NmuKeA>)N;pirO}3r)z= zf6&M>XYx^V`n`3{0OI47y;+5k)jg1II3VTDt)#N^$7)pL-EZr2Fo#yAHAUV=vajjZ z9uOKOR`sZi{|yV?M68w`ZOiYS-FzW;0y{gAg!aj3n1t#2r4LcVxGOe)O@1m6(to3M z_H*KV<^r|7u`_?IYvv)_(BB$IL?;#^1(SA?0r4q+Ln5WWG-#$m(Dkr70AoC%(wooQ=`TpMzjeC}XFOymk9_ zpOB-K-D0$T-f6{Tk-1orCCt_D`DFxuH?39U&Kz$j#f$}o8XR_x7j}JIVYp?5x<2vj zA%XRUB~Y`=>Zv+ehC-abt)2FTNmWjH`rj!&I|}9++P4(;p?bal;i?FdnDUQov=9Uc2iPvPyF%3ByM_v%m zwun#XaBFZ1lDA3oTcDtPRIkz#e_o>vv;Q!bVl8kI&aq^Dma|=9%QSV=LIOWzefuDi z|JT&i1GCqVr9FskmrkV!yiqZN2K;V`^Q3ZxfX3UI0QvFy6yv3Dbw2)o*1O4xGzpES z`mI)f7YarZ4s}Ssg;|BW9WJLo=v4lcTWz{W&fS0dXO5gg5*eM%tn`_jQBB>PNi&aY zy5U%hW_xx{Ry%>JV(F$YHgsC^fvgWzQcAcgm{{X;%!3wuzB7$qzH<1^Yuf` z$oyU+p!qdX;7uZ3gaN&;I6fem6*l6QxUu>}sH--J&G=V9g1NVN-5a=cV_Lg$_aZJu zs0h4mi`p9?RO@g0Gd^6KxKzHf>3xL9EiW4Tpp<;dlWt1Iu4cKA)~ZWI=OQg?@B}+G zf5fzKyjp}*R)W>C)i{r3E(;BZ;)Lzv&iM3s>t_L%Nk@zM3yBO3e$+5aSHam!p)C2- zQ5L;^OMLQR&lA}k1KuJ{c=4>mt0KY6g&$yPRC#_Wdj%Ir&MVLaC&nKcHixj<2F(gM$cFBuo(_zk9zPu>`2d*o$RO((wd(*3D;&W>@=f&2^I7=B-Ah5~yKwbj-Pjrjn7{05$Tq)sfxVC!GbU#eccbqm~`J zsNXW&p+<9sjH48d#WfyC8;H0AnAQGuKTy2=m}+$-vP&l=rBSZAXZ6E3D2rK#W`zJq zrzLy>*_89pRNB^@Et&G_>}AikkO3~HQ2#fR-8)M7?WaZYbzg( zZ0g(RoPl(@kJ99X{PwY9bPuV1GPA1?$5+lun56zxbBMc*Y*{QE9nDC+DUO3l!a3<+ zWgxDHd}yAkNyVUhy1V0@KmTK^B~A#ffwb}k^c?Bp-oynHMvHg*NS~pA@#y$8{L6NK)9M+g1)9UFs*y9sNokL!uIV!0X zJ~n+Dy%&9S#YF4*EN-j(y~2^~G35qjGWDoosvOQypYLPhbI&HAF;L-o9d41Ys#@1* z&j8oxZ9YmX6#sU*2El!HSEGV~oh$WRW5Hyv_Z)Gbgj1%4ZlK`R!fJh`BhVf@AoqA& zPbZ`CQ3rpp*h6bZ^{r+uS%fsT)IAOh!s)kvEO+KtOeiE<5jq!H?y{QopNLz&{1ETS zqn2(9z~mba4p}TYzy~_S3b0GZy-NhKZR^!O(Ec#!75UL3ZRM||Yk=UHA8Pc)Kz#)M^W6~cKaxHWJ(Ap;X8%rjR_+2diqYDu@gLyZcZ?T zqN~JNb8eb|g3;6hDtg=;017S(}!l_ekikJ7cHq$$N80U&n z$=&fdJk5_V2uc29yix*=3ONoTkJ;3cf6yX+PRTmbhiufk!o-i-AOiheh_kWE$4Q<7 zuDjoPjZORHo7v{&iavx$L!ONj9lDLH!}y-RVi;Te95}&OCF;#AdQ!ka-T0*{p)seq zU|Nyz&@ED|`SJiDB<^fkFt&hyhbXvEQ;Y2I{`UO>^)jA6Y?GxjCivJWFX|10Dx#%r zAhI@;$Uo}e_hwcORcstB5U{uem~OgSbsFStj_n2V`^71;p94B{G}&JvT_ECa!+l_= z8Q6$n0*xrlK^C+QO;hcON?Y)(NRO{m~#L+cPc zmTboG{QVOkX_!#oBcNzm0LFCJPxBSm=tMV9PceT^`#Lw+`>JIhzIxUwKNDet1)B7F z4Hv($ok&_+Q|r<3n%6xiacW$w1JAVs_SG=NgXoZr=O2Cu`i&0&xyMpW7&ATH0aAXF zbdPXiezeZz;zvAsJn;Et_0^2=(#)@Cr~CULL_8V`ruu&ZnsHA~zrS4UpVS$G8N_VT zL!@Gh?oCCvbe7sg-qa!BRxjVw-%mY$AwV6v(LXue^{a2RX8le5{J2`(^vCEYom?r- zl>1WyvO_GCfpoclUK@6BsU%$nEQD_eXG!?OVkK zhn{=g#paC?hHrF5rk|LY`}|lV3iNBRJ4noPTpNZ$n8@~fhtgZg(HbhMdg&B+*FE8F z_W7G<^M_|>E4`#vKIw*gS%_Yn!|#4FMO7h!CE-;6wI*ef2J$O``bgry=1vLh6IE@) z+W~mY>jt8w7r)Fdvr&DD&hMOyrat}8=#+|_7k|2d>+xYvDYb@)*NOv)8FmI&Ss*J{ zSb36Mj6o9iep5tx`djqPwf%uR;(}I1 zBbocb$|8-#pusl(E0XJs><$)LW@YwR3twZ-dtnei!8(Zdc&CMthOg{!vyzZ{oCFC&Cb%cqGtjbdW<*n1 zupgonCLWfeVi%@Jz@6b8glNM&>WUhC&HQLZR{60KSan;aOsRN}KcWR+w~Z@)I8fi-`B+7|^;S zN&amf2Mk2D(q`OlTf|LReKB^5cdou@h9Cr_uG{s)_EvEO#Te4T!~)LhGskXc+U|Rk zNImgxpo|a!)L(B$uQ+m*TP7hC@Nq>O)BaE;8?e}{a5}B4YI!3YWlnlL2Vn}iCaGyN z0zA%XznN=JX&El%tg!>RODS>BC!s*lI-}-%n1w*1O!NfX5<1mLt+M~tNwU_^JlK<; zd5ao95{K}JR{MO0oXy&O=1ht*E+i`)tN7+ScFFR&wBJJ~FWpf`{;qC)LqZ%G`tK-e z$@2BX9Z=@s7KdPvSZ@_HQ(!7=L^AXvpG=fCf-~z7Pg?TSLrf@sOmE{M{hwO)k@8*! zR65|cFydB4W;1o46hrr-&2pN450R*3X}IF6%?s8apCc(?+b7iWjft+Ce@zP}XpvmI zyG=rYQ`EG^ktykw>Z-+O_va5GK6CM?ov{0&$M%W~M4Kpi42FUtIybv8{>`vt=+K1vF3WM~z~G=DD~C9FSYfbBpI;kVH+4!TP!T!W`Prah>ZuqHS7v zSZkUnGU9^Zsd%32+!U>426LqCb1h7^)x^I9PyPf)Sjp>_9JsXQkklc9@rDh@yGDbD zOac^V;yF~pZy&9$>D&x#AYB`Q?YtWk_bLW2#ub??v3np~(3^-biJtZaKr$7%x5}xo zInguHGyaa=GSa0#khf$4UUDrrP#%O5SCOGbuMBV0=4|A$J9hEM1OrWFS^PMQG3RBX zdOFsQsi{qu1}0m^r$vg`g{h1>&=;OrmWFilK0+mED?%kkOm(CL8`xR}lD@zX&&QRJ z#-Z=Kwfy>RleONgFZC*vH+FZSWR4`4$+m6x7BrztqCG#PAC^tgW=h7_6S;yKR$+v1 zE+omi!EJ_R7QP?ROS+kK=sJQLM(*vtL+(`f=V?0SI*lypJ{~&#FP_e-*U>U3J7N%9 zR~f0X2VYG>mM1F0A?RY}9mGgD?&SvCQ`<>=)c>o$T00d9Dy@(=uK3)Pdt4AAPC-LR zc*M_gXW)zbB4{Vyu##@Hts5q=)+sLNw5~NM+SPzkYyFHsjRT^NE+O?gllpbsz1696 zXIQpUNTc#kVk+~G`VDT1(CzgFQJR%f|98+pj@$>@fgz_XHmz=v`XP*&k1?S|jk_u( zy$rKJv5VtD$lw9R5Nep~hzzr@3Y8>yYOG=oXoG@*EA))Atw^i(Y$=_<6r{>XEf>ZBPN@?780v!@~m$ACb1#&-WYh zhd;g<*fOuTVCG4DTD-Q(R6deVFbcQ($Sz!ws&c?}Y%y%Dv~*WxCZd7Rd7VJ#yg=;K zHF8K{-81urZmI~iJrd^#{zTtxIICMVL!U~9IoO~5K?O23;(HXHE-250jr86|c_&&e zZd*UVI7!7loL9fL+!6<2LbQ3>ZnmGHk>_oAEdfb8)mryrciS`5?e%4MnZrQpZPumf zGx3Vkuao(`5AfIi9DmSJ#wwY!{P)NSqUa>T%CseO83ewh1fi2BVYvpc%oP)QZnoB= zwk!@89w=V;nI6_O!3;;$D~h2<HGOQ*sl2+dq{8|h_&L&2iw(h-6O_9tKlFisFMR!F42&Zj03i3-w#l+ z`f5F^O7i0jI~q^06ZC0&A()Q672dy^Ycw#irS^%{V!oY=@FqgOdZb$*=>j83mmW#U z|CXSRlq_$eXt}{xR88H$QDU?S_biZ*ln0b{`H5{JIBu}5WGp%OOHPT(`Qf?0(0kMn z-(ZzogH(Q}SEO`u+NfAA7sP~W2C{@aUfbRFdZlOJG<~;DtL-ks3CVAC5^dj9QEBwD z?YEQ%Op((Vl(8l<%5*RTg`r;#7vB_8sCeqz${0ewL~GgJLYYsgWpMe>?x>x;X%2<# zkv-R5(41wqsZfN~P%}50{7KQws{@&mmNFjq>EdJz$10jkIdV{=+=)5tU9^6fFrSC`4vzN0lg3q47#)Nox}b-kzMNacN#L_^4q_ll~t`c_Nn^>-NYJ zqQV;KRvQ$BEDf?5RqVWI@>xVrtn}FDv9~4irJ66FSH=)Wt}I(QnXfVw<<}mgctS{IEDuToR((&$&lfVTeqm{itC@4W4ir=?lD%8qP=QeXvvae*U%1u9@b(qEmu@pEPB>HJ6(LdB) z3f!NfIfhcinpmxWOn?kqNd8ug7Aq~y3s;%b_{IuDdFQHxAh}07Kvf|3Wu?S=TrI{S zxqkI*dO^`*G^uuFQxUPak@107L=hmb1%0rJN#te8pkgJ*T~}daWPw>4RA5%& z&E_q&BC8`w`O!jXjj*<=(tYywz*?u1T;6c1*o^Oyrj*f7`Ht{eWv9Y|=eMBb`39oq z&mr}(p`S91H@K@zF-QcU1i9R1+NQ0er4>!E%ag}_HJTq@-PY>~jD0|ZzEfC5IC8 zx9b_|kJ!!4N7N(fP*5<{Dr)(`*-lk4tui}NC0&liQF@+vI;v13HF7b?f?aa*Y+5GY zSxZTix4zEM=}$_5D*ic!VdJ)wPx^Kf>0U{eRGL!N7)ENY0h1bByyYlzH@W2EMeKZz z%*joB;xKmM@^FeD%SNlgqzw9!5RyPz*1+vmttWn12ik<+X=NlgJbep94O%%JwO4-V zw$?~aqe97xZ?-nKJ19)~u(FBbpoxifH1J@7 z!DYycGWMo_#KP>ltJ>;F7zSM;jSOy$%fB=Nx~ob+Pi&dDzQr~(l%1nLPKHlM#j(!K zMcA!}+&O299lV9oY_b~S3(`yvsfw`_b0j-b*P8z*uA{DJ;;^TFD5Ee))|a+>r)xAx zDCgk0r`H@FL8ap0ZDc!W`V2WY?tp12P}vzLX9+l)Mk*R&oYed7c?7X{3k;YKtR+ zVH%Ls8elw>6P~t=s@1|9RQk_sL19F#rSs%d$^+*D8NZqi2QJ$`rWM`KuJ(N@N3oGJ zasrw)JAp+uoL*9&mC(*nF$Y@Ba(34Jh~_D}vDpVGD3zey%;DbXAGIg0I7M^WG`Ox^ z#j`t91j(Se=-?4%TG{;F_s#u7(C!7Ow*s~_ZyDls8&zUB%p) z7>-&o)>&sTB6q~km4=9QujTKu{0<|RqKv*@w#cM}d?_LKB8bNs_m$+t_h*d|guujI z0G8kkH&ML0SKRm5UTcGfF0=Y~MRQ@g5izo&A3o(Ra=@Fil&(?i zV@^)^3UAH(ZXW0Wwb~K0GS)ui+X~2RqVSYoSM_Iqg^4g_9lq&LvLq5N_^k2t7+FHa zBNmcCQpy@GJs043SuOczN1baEKRixWT`Iy6jvVxy9q5wI3aW&j1BI7?tM-a>-&rkwNn9?-uA{AbXc!kCcqPMdnE~L7fmS7NRW~F&?#GF$DW@ zk1OwmUz(J@)7CcW&K{yMcf%S)dJ3tgF_0le@H=%i%|J!fx-Gm!qsXJan^b!v%h_;)sWSSko8Z%;L1If(uAI3Up5BuQ}54Z zJ<8wVamOYpo*j587RYxn+XLU_;*hZuhr*=sSu{mdIpQRXQZH!huPI#day;M zwmNt|cX;ZX1YuIw-r0l4%7xJ7UM?H0^@(+_FtRTxn ze^A^ItQivcGeixUXTaB5Wk6hu*y1Puo==glQI1KGi5&B-Qn8bY2s>F}IACXF|^_y`rLBy;XlVp7li@*uDJskmI z(WZVFqeQfhps}kAXXsa(iO7`Spg6ZKUC)Py6BIA0O0a41aV7xQ(>91zSCiwBZ_`@S zqA~Me`v@Ks|GNzu{qV)_$GHxKOZ3`31uC?U0@Qpd8JAuf-;nT)%*<6+%*zgniO_9| z7Hq-}W=|n%<;2w5DshPIUCHMQWv=*E)N(QOH+z_s)v|`eB8OD~xPu8xktk+5Q0qDhShPebj;k*o>j(lUtX^C>HBLJZ=(J`0Erjdft&%obCI` z+-e8M+RdCF*;D@JYoaL}6bgxki7M6f{M%|7%j^zs)~DY|Iw&VtQ!D7K&+&SluB0wX zZ1D7^kb(6}2fzic0m{vvjc-L*9oGcDPk0>L#2|R~Q$38`cZt*YEdt6pfU=XuOsB<3 zJeFE_rUT;V88Tm5%5L)&!ukyKi(mN6Rfw1f$z#uq(06_qH`0zp{D6?!Z5X`jPm_76 zyAY=(PL>E7Ww{&gk{DSa4)Y5dgNbnQ?yP5ZUH!8aK1YYn^0N_MWczk$6q2J+Mi#fy zc`KFIu?oUTi_pXh)T=i1ftDZsQ+IuP)voP{P4>U~Lc(sKJW=k~9h5AnJFu*#_kw_elH!6>W#X8)@n#hI zK)TIg%=p;+-gEeII2!{Oz~Y9Kg#UK_z2BRKoRM68yfRoOyMHkK0FPTczwV;W{ccNN zFmre0PHGNlS~O)U!;it5UMQ0>~qm}H{4d>j&dBWp#Ot*Dh0fWgKSu=Bp_gz-WL&*zDtX! zTAfxHCl&#P#V%N9YCb=6LTs_X15;b`)H;?ygwVaI58p(7=KcL~oeRr54y&tNt3Dxy ze*zL#xnI;u+Mu~ai)B;fkox~D1C3e8i}wEH%lgX;&N_z!wddc+RPnr4#d+bNaReg0 zgDwp|-?Y@na_VIjcD3YU*nKiyPS=ghUwSsZw0PX-=?=fYycl?U@_U!nY|*?z=$Gm| zK^Y?(L#UWZuU1wi6+ELcpx`O>nF8potH8N3B8^3)J_A&RVG_W9yq9!7T7*=}=m$=W5OtavyEW{QsJjBLq}|*y-4;iK`o<20Iv6q`lN4;Aj>Gp1Aky7 zv10WSPGJmj)(Nj2v0It4F>cSB%u=cocB+?tf>0}}a@c_G5*6r|-b2O0w&Aj{xpc-^ zJ@jmB1hHu6-Y0L^t#1D+k&rs==&vf}^@C$yLPWTo7GFQ_i|s4g-v&zMLSP)=+}=^6tISlZU4Sy| zTG1@9D0`q@qwv1HayQaqDrliyp`8rQ;@EuqFRljV14`FNb#9;bzB zAS?#~BWZiJ#58fAcA_)5bI_T(H%N*2J>vMZCCMDhc?H^%2)+aw?arDGG`wheVz;r4 zE+S?VLd2)kVo3E5Rr{`-$8FXA`Bu@Gld6^Ytf3;zAyhUcPhq?a{|an1hPVItv2;UA z1j#aH`t-O=&{v*LqEk7 ze6c_28PKI{fYrYSP^$4tB&N1PO@mC5%UhPwYslS3mUI$1Ym6{a#28D!)V$e_aM9A` zaYDNC3h--+cZny$-S!XHj(?-&o(rH|QhL)7vp-YdtpG@N#hWn2lhG*WQYoIsrdAZZ z28o6~N;(J!kz8T~ADb!-`3o0~=fD({{tLF|*csF*9JRNX1W~#_6|pwgpbh$I|Al&c zLiMR=k|?U2Ag(~=5;#{d_P{>*wX&7se}HpO3@jnjgi-aKjT`Zrm2PWA5o-#SUUfn3 zN>?yP!j?C)nTU_1(ZL`a&N{@sarJ6`!m{;9cs+gs)WMsUh4(Ir6>R<%(*?1V$^{c& zX6;F@J|>pP;UXy^@BMrB*+Ay=s@Rv^%*zH$+IiSDSZpTGlZJ#(OT2mlTp00H)U+p*N>gkQ(|}fag!mM5=Q~M+7*pt1`0pH#MqrJ3BEJCpPZdlUho~yaV>ve%K!W3tu8QY^A_@lmyJGR zlPU{f<|@ebuf7+-kr5yV^9+Yjau;cN>w;909ph1Kyw@$U#Hz${rB;cLj9NgOPohj$ zPEyyfeUBL6W^FAeE63*vcI8@McwCujX_)k0e50)|7!w%;VH^R#AA)#J`C8}v1Qv@( zLREI!=V`)0*sQ2oW;<9u1|1h2jSEhrOm;ZT=^}>SJYk-e)%y>S>RiU^51sHk0^60l}_= zS~bL~6h`0YM|}XO_(twE`t>g;`*`;XlwGW90&yXGULoF_RJK%vhK|3tC))+=?WS)q z8n#Y6sJ155*4FuK;LvTArmi!$nvGG)Cf{1QCTIQsAou@UoWGHgPr6gxU#c$31HWYP zOT-q4jwmSekNLuT?x?BFm`>&4{{5G`KYG&3UMfEVxjOjs!upyE^1m;y;(rBe#9p~9 zmQ)7m^`i>}r>^Z;R)w0Kcc6SabqUG?mT$4TmKuKbMH?i00P7XHt2HCA5vwM7Yul+Bf)i}ZJpod9So2)8DQy6$mQ8MUMz(aL^Y%jaD zR5pD}{))l$Bp;KJ$m(?`q${&_JnwNN76J1RT91(Kucv!c5!Z5RY9`=-Zwy+1H4X;} z5bhDf<`&?)q*ulYjgPxt8SC~v9w>8(Y-e7^eeBa$?&jabvf#Ziyz3^c>uZ?e+_P$SjaB6#&#E~qb@ zb#9jeB-t0i9{{!Pv#~FD4gYUa$?8#kY&yKcgf8(__bAAzf#H7J$ulOkVll_TX)pat zIOBhdE&%DeE z>S%AZDJMV@!Cy0ZCDIB%|9l`Kn9V3O4sduuuby5lb_l0lKO;x!R}fqK<6OJ(WD=_| zLSEZ>PXT_{?V=B)!CY6anl*NJ$d>LHn;iaJA-h|}ZqyVYCw;#Ao$N5H0a=0Hve(f# zx4eLox~9=Jcj_{R*o{hOWr21MsXeK3Ol&^))fyXq>DF-ZrQY+m=uHHPg@Rqpi^LEz z0cVPN_fLh>MgJ|kpr6*nkLprUB9~{W$uUR#j#w+bO!DSguO9&BJUJXetu1Ch!ct?Y zaMT0Rn^N=i|CZk9eM^gqnD=bS!-U*<)|EH3K!GspIbDFz5?rkqd+ipkNZfm^#$5T9 znb7TLLlg*$?-@K0TEx}evgb{m`T0_>?M?)|>E0ZRSQ`em9n?;9^~j-FO5+}Y@IxJ+ zLC$Nh-14Me#J}fu@nmRHxOC@mGGIAer;hBcZ#2rt*Y(q_jjY{7DNO@1PKKc zY3T+PB&4Jpq`P5}3q%p5OS+`HyFnVHyOEAX!&<;1&RB?_=XuWcJ>P%eoL}~Jxv$Aw zbBsCW74j=Z0I^3z1;Iwsu8xP=1roanEV{%2xW8{5>5ibgZg`-ZBlj>UXVr zEZ6f}+PO2yp-0o2$t0(6Z-K+$%s+Tjt)JfEH0FA8QhNq;2|jls>TgnwKq$BSe{+bp zlX5vrnfHP8o#y7KVJZNCUBz+Oj6)2ok4UpLugdW~|Bv+rGExMblMtA()G$=v!hQGh zSNI)w4(M&k4@@D4v@vG+{AUz}mqp@agQks~Wd((c*MHQLkkX`A18QN)`0(uM9)COq3E4JjMy7)Z3l_Ze0@j;e zQY`V9cVa6Rjcog~HIh&`G$E5)(qsh2lP-tb1x_RR&7cGW^q5%ZaSR2w-?5LYWBg-* z_W!p6gad+rIQ@wH3B&vGPDwU=r~(8QP=LS=z0E$o{lg_uW@U2G{Wc<;{f?xXoxFAD z_pvOO4*NcM0@XuKIxu(g)|#mgbarTAS4VM&J*dvU|6&4Vp2FLPQ=RS{YxPr@0|M+6{cuT}UI}PN`o)mthSsn5|mL~Fmz!Jn2 zJkh+r;#_Uk!MxkIkdsGuOk8x0Cej;We0%j>tD(l1S=bV86&$T`Ga_?xOqdZ$*@y@X zB`qz41nsLd(7IH-l#dhaPrI}#ch3L!+5zDDibmK!f!qq)#HZ!R+*%(knR{%@;3e|} zltJhOYPuT3iQRR2)!oy|IrJKXvpfzaa~yq7x*akRkr>641-96u`BT~DhL{+{kA$r# z+v|{I;MnE&?K=1FyNTZ_XP6%ixPfTETz`$P@PgrPb5*%6=lcdI4D?%XR0h@|19Ohm z2Y_vT&>Z9*1r+!j-hk%p^44JKblQ|$Sih=bfH8eAm(E}ci_9kOg&Yl#rROgA6Y}b$ zPtFbG>oN`%7!|9?xlN;D+xGX6jsOyLmXe8XpyLBz2l;5#9cGP=*#!ERR?5jFO>eLR zJKRoBw4U9S&qYzsD=nSeL+MZtZuVl4)K$HosS`B(kC5<0z`v_kIcv49`r1En$lQE( z8$Un>5LGvPHlpTeqm;#ynr9QF_Vvr-8vwt*R~O9>`28AV9>DJxtHV;Gb8e>a!gRSA zrY|Ol8_vEuLobRC=_6f0h2VT$u!1>kYvL&tCUJcA{eOAT1ZnIsmE_T5>V!_`?C}jp z>fZ)VCE1eM_p0MjTL-jeBtk9Q0u%ECgJ2KVxd2oU>KinwCOH|^$A9^TWC)eX0=w>Q zj8_)2j)jY|+FR8a_IyH#7tIQEz?e)U)PXz*283IZIf;e zYLjvUNyMs!t-i&N-1&mg8T?)a;ualQXd>+l=aNUi?`$N!|JrraLBjj2euHnxSJcNe zxBghGN|F{B}Di56|eJMzCGJ)K%25v0@=vohId!8C% zfJSSFuaw9xBAtK8ijBUp7|H)o7pXoUUYQRNXHi~rOo9UDSXxN5?W$#r(%hxS)+(j@ zeqJq<^f-3Rc0sXLr*4vph=5@vN4IL(#zTBpXZd<$Kj zMS`M*Qj58sX~%uW@Qj&@dH0@ANkiZVd(@S;t!F==xc_Z|<5!N-G36a{Q|Am+7{oiQ zrj{0UmjWBw@4aKCFG)BX&J&8`l@^F3Jp@5a%YxtKq;B$ZbSs1A(Z$M9T;=)xW`pGa zhSonl0$$)FiF9mYZUCb;cLkKuh~SkxGDorX`eO?A78U5-v?Kgkc9n3m-2^?|C!gY8 zS{-f(Nb!lT52x%H9sT)5a}PmK^Npag(WBL}ES8(wWvf!ax$w=qU4xSMy3Ia5L_5#LXdtJ;gz*Dc+ViNRy#t>gY1 zO(_JUOagL!vb=)(xOKgF8NaYJ$0U~(Hu#_@)ZUb_FAI7vWDOb`?gKlg0tRI7P%wxv z8(buZHV&7>@Rg;5B)6P;ann7b&~Xzw5Usl@S)iEDfL-feb(u42=5}6E+h1xnq|$ox z#;0Fw*86cEnd`E6>nQMv$4D>bmJRPn2`E|b8BG;sT;cLBF=cKkd_8kPWuM$CPP&IU z-n|pu!CFo5$2>r!CoT(l2#!*flcn1ELe?kDLXA8GLje`4O=YTyN~A_j&L5Ey4{k03 ziVsVXzUCoZ4mn$MndEEB33xAc)b!dUm1hAv$|Kdwg}-T zl>hb5Y@vD9UHS#p%dFo0gS}%XL+@39tURm!6CJgEiS76^y78U4EzlJU|M(VKU{}*5jOKDF!*y68A{C#9Q04ZGS(tUEj9c7zYA#9=f3Dw#lW~Q6+0~ z+uQQpB9fG}>`#+(Usxj8OyJ^By2P=Q$ey?YP{V}9L6plO zqiqp-10;+&9^*_FaJx9h`ZJZ*aXrc|YymInO7l>i)n>VD72%0=_)hJDfe zO!&s*qGC+qAX0bY9BPa;Vo#&gVHm~?I#7{WH?!F+8E+<-xfzQm{9BA(dl_SFv%Y{+)=fT&w%A_kj z)zVYOi{7SFq5hLRUc_A75@;KyH#$p2w8MAK8k{=WZtM8G7gau2x1tQHO}K?o6%GFP zg447ckQWVaH9-&5(8;kEeZLG7FCP@owTf3XKjb9ZZVG{I#sO&qIt2AB=*?q_7;zg2 zp5+Qj_w2-Y59c2U&EkjefwN&IK|i8|C)qHh{!wLFm!bzz7jzR=Q?gIJ(a?(~Dl z%MTR@p__PrO1#(5qpPK@0Q84*I>^7>f z!!?Co+`UWQ$13rlKZFI8#uc=1;jYhoB%@G-cr2z!YocokSnu0(Y%*gAW01iwEcV@C z2u_!6W)|1OheytW=z;R;hGK2{o<5wm+cA@?%c}ynEBwkfX@;4Ek`dIPET^(9&!!<& z+Ut-!1fd@UvGLqYAwM^(%`Z_`I++NbB~NLW!c^yR(fjU*qS4&}{PU^JVgE4vBlArE z@U9-HkICrj_N1FLX>Ze=9ozy-J5=9<$4+WzunPFV=sTT7cv$W}YaC#KU%!2Ag!Y4C z*IW`Rz3Ok236NUW$U_>{jy1o6`ipn1;&zEnS5P^UFt$Dan}tSEvt-dTH~+9RV=l|l*v6zC4Qz&1d;42pHbA}M zLpWT1W7eUxtGk7#hbME~F(AGe5a+f-!^BWC6BDxNnah(oql-G5MVXL zilVxL4sl_;HJvB5^#PA$E7wNF3;fCXsHUx%-!%tX|BA^Gc`2GCjQfFSv`BaLAMj-j zQ2oYT)u;)|9M>yK#B*o}H6(MxDVD^z2fqlsA77o5Kws?p%`BG7rRY>51cNxMzLy*@ zh(=d4QqVX0VNsp>#w4<1g9V~~9*fFKP0Xu=7*Z%;@%>Ymy+38CI zQO`G?N-_o1X5GbW!1!Sh8#n$NDA37~2jBm0A=~)x*h?8_+73|+B=1{c$oO8dYZ{5+ zRNYS0gqpRUtp@d8QV_TD^!mj{~_Z-xP6IG$$xhB=P|F0^hJismHIQ7uS)+s4Y}IjBG5$MaMVfc z8#20oux39w3F})dcSzh8q^NrjTkKxLHm)}XOZUd5HLkI?r8rvwDWOZCfQ)rjCex01 z_Mc_gA|3G|+$#vaN22-F+X(NSwzO%m%GZ4K$B(>5E3x5++ zxpF49_ztnR6!Vq#m#DxUhuq+0y)BtnntBS@E?Q#hTeg%jobAnArubbi z!nuWkJ7jX`S#!L^_LW-QgMwsC37`cj)lYFOj0WO*7+T8X5hwY4RW`<~+b5h$|ps%7vgED55V*f#$ifsQY` zR5WKuUMt-4_u1WDcG&7#G?SHPQ(S5uhE8MA>zCmn9|Hn-y|VWw@Xb}|+XBN4Cj-Sj z$K;tfs6UC~X`fU9#*x|#2Ox2J3IBuQc7>sZM`~0f|2xGUcm5eogy_|03g&39r*|WO zHn@;v3~#jvw-9+94s4Nx%UQGaD}{o%i#xUAI4FJjR=K#OW{`1%qIqX#Dh^)&1w_E> zIy-J4%7Jq;!bKt;u`a}dqnXGw(85Kk*(Y}S#xh3Yws4cOoUq=676P)~hig%j2`r#^ zK&D^60BwN-a(qcX1R3u#S7@`Je`;u&amqOfn0q4Wnedt>J?;XzWAq!cNn@X^X&CXq zH{J;}AZn>1H!O0tK=zyh>v7XwhLMtt&pR3n;=w1)fq2D`3KH6Gt1fm#ak6ZowW3uB z<*ymh!>c1~hvQ=^C>FU@)VKaprA(%kN@rjGoDfekZt?d~od07sE=q$x>^0yj-UDrj z`aXv}hXOZby{2YWJ2BkWOkrisuwAdHzCe2fU7lZ(F~D5CRQo z%$v4AJV?+&;<5>sWAoLsZOspc!d^rcpJh>6Zjb3L|BD18y1N&ak(gB}g!&37CRbZX zjcrRViq`wHYD{oz%5*9wIlzX4dJEjrFCKB$DiRfAI%d5<7g5nsNiUq(c{iRz_zyTJ zWi)Ilqa=a~g(uRRtIZ7++#nm-h&jHj(PDEY7JI2^AP6zEw4C9<>KDuE#=vD0|)aR=bw*B`~R6lz$SbHmvN0sd;MroO>1PNukFnmagF$cb1sc?WVb#=-50AB(oaD+>X*9 zBmV=GGV}u3=F&AI2x)B&>9%|}uT^_(SW3WdvZQ+0n|hh@zUMtSTb!{H`bCH^18+#2 zn&v7g%|8(aDZQ5t1-T0^#5K8@LSI!Qa3C@*esm@J4Rhu^$z(cX{Wh^aFM9XB!MQ>V z@{75Bd3vR4n*%=k01F(PeP2PRwS|GjAO+XdwAh=gF9%mY^k`LV$uKd?HuFcsqKee- zB3M8?mS}F65EB$+oJ5$E@r}%egq%qqie9jA)QeBOM5Y%U^p|inDD7yUp0!akm;q6e z*|4mk6|fIPvH(5}+Zq*5`TZW9OS;<4h*_r8$COzVe~>@&uyk$4GSk;y!sWbsbbIsZ zWyHl}Nbc623-@o^4ig$k?XGHP^KVvC^Nwt`*pYgh_%tmK64S8X9)P@=y+_QeYJPR1 zP(-W>#XOxTvcPPY53*es8iaM+0{bDS8=1`_Od1K($S&di%4@t}ECE9+dJRkRZ4Hbt8R`ir!!))M8MHVV5@|@g)?zLAZhN(`TSgN^;jRRRou^tCLe;&;9){~uB_mJ3X1+dF4t?_~ zIwHXY4!1L!<(?~<$b8IXk>o3#eiz7B*kTaA8C0e?C*!+#=_ox}ZW(9Hob}xn{eDOn z`JL7PfmSfy=2U811=;7RB3_j5db1x9FwV&g33}2=t}EQzV}`EOn7BU^D<|26HytpJ z@aq6E3H&F$yCGq}5CUgOfzK$#X5828p6-3`JDH{sBlsOLAjxVSD3aUfQ|B8%G2KCk z1IC6j&o$jHQYKe73*0gNMIQ{x56y~DIwt~L^j{z)u|tts_;Tz`emhV&(2jJ}P+Q?U zN;PYS;L{4U7jyUehClgy&Z8$E;1Ux#HGY?6*c$bzR@x$rUnOmivK(Rt*+o}bg>_A} z9JODvqVxR>I+bdv%xc|m4dlPs?2Z%h9u!uf@3h9dteX=jGH|KPKalktw}tsQkK?|v z22FaY*SB%Tw}oaCzh-YT@&EQ)P7SFRF^?o?Fe&%68k=}Y>BCS;rDA3 z5#xp%c*qyLjt;jbBJch_*&eF-6cRTDgd9fr2m6`>{e&;yQ1HcSdr@FkrZ(;JX4^0XV3w4?NfT}qX-MGJ;!)rS565nbj^ z+#*m*)B_^T1+!lSBaFlGpZq*BH|iMmoq5*o2QgL^Q=LJ+i&4eFQYlwVXC802@A&S4 zN3|&dqRhkf<*1{*<9ynkV_yh2FEh>0P?%2hoER8 zs({-o{wGD^J6|c5)fPBb0INZG;++CF?)xWPJhCoQM<~JZ=$vcjmS16ND60_hukAsW zrb6qp6kcaI3b++5QH<}YO`H04a+)~IL}D{5rSSw|`8YaaVcIW$<}?SyidQj--wNA! zJ}Dl4Kv*@PjHT26ijeKu-9mZV=S=EV)x0_fA_8HziYoQKWX;-B_8)xQA9k`PuzH|L zlV9@7n@+Q67B&f`d^Pf3(UXvywE9Om zHqCz+h*kv<@;kqmr_e>ctdQF&QaUqrhIY^$S^dM*G@6W(Ezkt}mx?S-(fB~RAodVQ zl9kv9=2ZdPWaF^~N_Fb=UQA|Sh!h`E&;1hX4ZzY>D|XUJTZ~FglrjU+!NlA+4$Bo< z{SWvGvSC>OpzYfFS!IPJusvK5FIhdtvpqefE#t!_++wUsKPMeD|HHoyefh(`x_1%4tcRj+WFFgg2p(qY3qQ0wCDvO}l5I;8PzIZtt8Iv}b3 zLTs1x9x1b;IZ83ez@m_m+@ZHKqIF9f+mrLTxubRdN?S@Dj8VNBwoGFd!A1C~JV`;N)!7Qup>{ z-z*gIF2o#@%$)}@YyFFm#ehjWFsdY3_wBuJ$(*15!HdE(cz6r{rk9MNFx6^YZyd{N zoXd7ypV~Nf&Whbsof4bfke#5y<;AhvnZ(#+O?HlnfqIUEa>Y?*7IZa{X3j4nx4Fo6 zM}g&|=-FmS8EbSXZY9D=lCFQp9tV) z(FYtc$rNSj@Obyk>AoJ&IGM?`g4h^u)2uQCNr&LE+VQ?mR-kj{iPqjwwmB|dmpc#) zfoP$|`pJrbQRxoemSimE@Lsvley#s6CxiW8W?|q%Rtc?}%AG9i`=wDl;-6SOoQj>O zQ;i@^o-AXFt-!y%bCO0|F>KwC)QGdN6pk(bPYP2zV_m^1>b5tGQ5X1o_Y7h^b_0t5$n=8Ni~em zh*Q;N68q_(YnmZcrw!JsZE9_|!}g)|sT<$WV6(8LL~PaT*5hkU_t%5+>a~Otwc^Ex?bfeJWc=VX&| zCQevqUF&xL7#Xk0CKekQxYJ_~;(>)Sug>oT$TDSpzE(k0(C^V8Ra_dcX;5!{P0Q!V z3lsq4ct#~ar!rUN(%{=|VkymUgCdbY%bX!?8Mm-Wvt*s_%R3 z_~hfEf3JU+tBz<34V;rhnY?tSI^BQt}!cJ={ri_v+rwwCs$nrf%LB~{z26O!t zdPzOBn!|bKb3G}NPuQG8tK<-@bOUp8cH^a+^L;3IRo{JmuW$#YP0r#vd<)-i?0O+i z)-v#&MgxU1ujl6#CL2ATVkHW>k&>XV`iW-JoLs%bss#`N{dqkdj%|}zPTHLfoUTj$ zVw*fdtD8gwa)Kr0;EyS>pq!fzIvWQ>!;5eNQu5uJN&tb&Z9>UNk7cJ ztJga1FQOs+%L_RU0{cnwJO!a({liK+YkefcJZLR=lhzgaqZ)oHvJ<^b%bw}T8t`X) zjU_;)(da#Pg8WxB>rz-;G`p>b$xw{JFIBy+uD&c&{5$taIcA>J2hH3bxPHsKwK#-f zab=vaWRFUR%c{<9M)sR`f@HTspFukwmq0~AY)Rl{K7t}rvDy^O3OxT&c;x`-YAqs@ zhWr*v&g0JggjW+ewvug8St|i>K6$de;5<{2pm>wwu_bN_aT7}c#jyt;9QDdQqZIxKb8B)ZMU&?NbTMw z(7kG-z5s9{Z&8=^_U$P}>#WJ#j#;DXBjO+VgnNJQTITVE<=2Y&*A?LrJ_RdLudXNd z2Hm4?S)SI}r+1|OLk2)2mbL#siOd5u^vW{_5JNW!D$}zxllJ|2GBHIl7Vj210F=EQYf-B}`Ov z|7{JMf^{ENU2V9s7pAl_gWzWgB5h!H*qmijP{97ROv@%UU4Pyl2N`s0$@EDVTxGSt zPx)65yK8O0^oN}PxSU;w{G9XJLk88Dhr$?h{6@tq^tQc*S~qd8q1DE*HUlXRr<2yJ zFVg?&i|jpV_m54_$D+Sho^Nz`Asufz%fN58E#RnxPi)4#kequ4`VngCJ)&39Z8PY7 z)hw(Rb8%CIo8r~~+z=iyYAilvOogJDRRPCsf6{19r}AopmcMuAFfgEJ0!D|-*RP+{ z%7T7*d};5=9*LFsuieUMEGc8i6239*brAQ84QsWe;MwcZlPG@Mq>Ybl2tmk zG1{GM^3Rpdd84^A!G@`7)uilitb~6B0X0IacD-Z6SBL2DR^r%%5g%7Bku3^F5@92I?Jbw0GkI+*;6j~46@58^n zkc~rP57O;Um`d4>Lf0nE{9TfoLng3g$y1QNhlc|}SY(bPkdPC?q;`^52ozx)NqJOVZSs?EQV~$-vpW z2`O!gLu7$kgXDh!tLCzrZq~{+T23jwsH3CxBw9kUO2(cM#&6b1EC08A#pnzCAqj@~ zhID+D4lpL1(TUNvVU#UoLD|8SK9IT8br?HTE$~{Qz0^(&7sOyjO}{xc_u<_sfBv+Y#hn9 z#~smyNOm)!bYHQ*#A;r;Y0yP_{}VLy2SA>*)^ zOwy74ORNq`#xPUSQEL@ig#%(0d}??Q0T!xWStgK20MT!h4a}Uk(A13h-09dk%M5Jb zEk-`l+6=I;xDXS8dw)^X)UG)dT#1&QVLrAk?n8M{4)&0B$?f*`R(WlOf`8)m!AB{1 z`6lIOx~xQO(d*V9CkDSXi6QQH?n}knOI|;5C`zQiX{qMS@hf-WaXjyl^XB-FVL|pH zFx@GHGAzz}erSgQ{Y%Px-Ld)&ThtSNssRe@-T@42(GmGTV7v69`RDdQ=3(2U$G;k7zf^n`u0%D5C9Qn>fX)8C z-xtIw=%Tez32tH3Z`io@v5EZSR01ZA)DnS~Vo}{`z!fZbt7!_cpT&4Or}8 zW*xK~R16KWPKmKBV*>1(<)myBZ3bBvW`e?!ENs%3q-HMLZHB#ETa^*tM;%1Rp$KFQ zKvjuEJ$|~$Fpg9ca5Bivqwf7FDp#X|ElQ7|9{PdAQqmH#VLocXpSxeHtT1wE!EPb2 za%h++2;)*to9y`ZfG0n#PQ#VcaYv~kJSPw-_WmK~r2U$4vF-h+MS?jcMtO3Qn&X7d z*-9-9P-+Rh^Uw`7>@Q;Fxvkn{mROe)`8l1cr4#BoNU>#`y-K$oLl#>=g49#2&dL;Z zb`Xg8$2_h@fQ|u~i*5@@G?AT)l(-}TxZigP!+dw0L8AQTdUn)pcWe4@)uh8ixMzu~ z4arL5T`l_FPv^S*(9wO~ zH@(gABloP4~4K6JT*rK6uo7O4$ynqNdW8zyAx=CHrWXndyDay!98 zf}l7E`4z}zx^!=6gQwi$QqBWU2{6}&=1>k$%}hk2x{Y#=m_B=;o4{erOn=Ox{0Q6F@B#c+e@yo=sAy%DDlhY&A*;q^-~U$Efk z;kjtNO4A?q2Aor%4hNlv0-5|bRcjhUez}-U)u$-WU^Ceq>iv1t0|Na!VH0knt$&?X^g1J{e8@cC1KNtzXdpzax8!+VhfO4njMalB;}+VrR?mYJt(`In;-)(RrwI_l!N7*7lmF6;%ISq>tvmrbPZnYT zGhKVmasqKtOtN9$k~dGbJ{OMPpp~Z~;1tSWFgAepLgbv+zN-{+s*!-RaraCA5y$P+ zir(H(t`jOCBW;p!F>{Y7AquB7h3c2ms%=;<8>eTk`vStA^Gsv@<1LXKYw;LrDZq_aM|Y{ zf4I8+!l&3yGKsr@KAM742)M~#`chFg>hz{;eq%@}4zb_kCT*&qhn&fgzm}%9RKA`r zkGV%bYi`ei1o)JGGx$?zbHUE6EBh*%-)%n`{E8YRUco6^89qviAN#K*S-#Bb{qT6( z*JWa+0<`5gLA|BWJ zYU_9f9Aw*cqa{wJNnDO=rPLEz7UgDBLsqjR>EZ}CnpyUYq`X|UXApvj?49$AZpJU| zU)5`7L~MbAxIl9+#Z>qOJn|9?DN*k?lg|{CP+NR@CIn4fx#wpJ%-raTk7)4rBbm8@pu_9qbz!+bni#T+vg84Jg^5bxU$3wt2AzDxl?Rn z(EOv5jmKe!!#gN}sr9*tq?CmRA;+`&8RZ2i$id!d0b#E%orl{$mtO4u!;ID1+byN; zmbDNgSnjJ4SJ%y_b%sdXtO(CK@P5BSp7M5d_FvvG6`YIwP5pXmD~TS}6wOB*A;MN> z6HuvEVG6@`v5`ot*yII+eLDBvI!jvgKx&p1E;+jCe5!fSVZa1LQOqIeEVc`DwkaF+ zG#H+zCy|%z*qd_>xI#71PY)l#z{@pOCP(=fw;TSW%1dpWC?o-Y72 zsCZ*($1GxZ+>Zs1@OFQT%*ANbJh>!8O$v4JM3Jm=@Y1E~vc}Q*oN5JIZr#JDFn9s~ zv1&XOE_Fh!(Q#tvj7a7xBR|^-dXYKLsO%0iI2XsG!pJ1j$CTa4-h2JZ>XyHF-X`rM zP_z@t-z(35tZ+nDjlP!_+RNDSQ4c;(fiY zJ^^O}?|J{p@+^NM;7g~fL$(wJr^GH(+9egv->Ct4VRnJD$5n;eVMua{2QW7wFw_b( zk>3el(l7SJkE%M{Ol_5sD~~w!C_^8@VC4ZJj)d#l2z}E|2SO0H?YIm==x0N!l#ogdwNgE2&lxT8=W{4RmYMl=x!3tNvf(S#t$xAF z#58Q3KhYH~s9e+a1VIk+^`Iii_co-)sP^DYH{G=73gu#uF2;{xLqyL&Y^-am&ZJAG2978;Rtt`Dy8k-A)0(HDJ`TZ7>1uB zer7$MvDu3MJPT0reMp|pXgHanb{*dm>{P{t z+cT;aHAy7!Ye8q_J#^u5`uT|C<(z`JkekJ=*%D$ths2blELPBJ2*fZ0R4*NR9J|;c|d0tBBx2u;bubzGX#ZXWD{aJOsL9eW7aXr0WxuTvT z8>r6)k7C)*+0fwzhwM?jDDYEnCw5k0N?v|iX9M4C$HJHHS?4KgJ7WHW7Gi#+eBJAx zd5=TBp?Rw%?xS_vcOG>Hrvp%ibIiQr=w=04duunFcBd}u#&*Mpb5_OqU?lb3!WrR5 zRd%$h9i@JZ4W|G?wJ~h>;HlY9k?_{p7hX$a611cu;MqX+1!NEW~pg&a}4+dh1 zuG}Ysmz=^5K<8Y24@o2u>YUmV)M$_)c*KZ)^F;koR58*dyK!$pgKzR}x>_aBH+Jh( zrAaCZE%jzNGxl30N&ZnZk-2}GHAKF}aYNs=Vw_9| zfsvx%O!I+|Gghcuc3=$?y)GlmDu2)fyQHOAr^qo zS#HiKyT_>IwoYjPF?+p|I+1V6+fgtIG5e(U`yFJoa1m`fT{VtRD{BF5K@5EC0?q&|2KM2nvk?lfAD z2#5rR323TKIn+4k?Oi?-3+c6>sOcNG_Cb9!uQ#fpAYUK7J!<=j zJ3$oBFjxLWd27f$vr>L21@U8^rAh%QN`k2VPHQEk=KrlV7o7oG{ZNuHB%tV=3J zO;#5@Fr$xOcCR=foy3qw)=jD`r&2j@0c|?;XIuHocXD4o?st#&OTqK}8Iy_`o0SB{ zt)zB6dC-aZv9@$lu<=`uEj4`&JR}kd|a&A}Xi0SPd1JpzjD2KdiZT+|H`sypr zM#7zeo(KeMLk?&P-dBNX_&1O)Qb&j`nLg&#=M;S*8Y@&TDzEh^1;+HF*wQM=cE=;_ zrO)4UcRsdvGp>O2qC!#6?}#|zSl9NhEfw@Yv4KX-#5bWXHQ3L_2#BcEdTs}HsscS> zB3i5QA+M#X^rI))3uf?dc+sQU?YCNNgJyt8{@RpvNQ>SVbJrKDI!As)x?}i`Qezp=L5jl!7*nde^jE59DWxjPuBFzlxF;{ zk{tiVlFNuRX#6q7jXmg1Lg2$!_g46((4^Db^n&pebWh3!a8z=nc}uZXUkJ*frhXZo z`<5W!`VOA!$^lMIPpOgD`!zN z(gyuLI2kO4#B^}X2Pj8GtSFrc!a*;xEaeGmz%~e#i` z7F=WRAWtE7wNOw`>t5#&t4TgaFzHQ+NNU&jo9IWU*RQ~<2?FX|6MU_K0qve*DjUS) z2`+KJ(7a)fblVlxtJ4-1LOM_zUur%G*#l{Jkmt!-^kFq#p$QL~aXpR&YeK{25Su?t zIbGT1D>$7kAu#iZ0(u(=m5)6EKB0$pd+Sf=E${82iFeBq9|^*}dyihYFsK$+KJW1X zg4;w`5ZHRjn7lfrY*Xn}cSH$9JyVy8q59%r)~Mf#EchMC^g zeHY|fL2sOl@Wy|!qKR}W5_zF+$}VDFTT!5w&oq6FyczEby_LJy-t?m0BhGz?h|F;z zaC(x@UhSKD9tW?PNsK40l2frdK2$|Mj=*tZI+73Ow=>&~R<9l`PWe2A22NXU`>hPk zY0+t49F|o}lraQ{Bo;lChN>=+YQ0e1c1A{{(e5 z)W7Xi#R(ZjJlLb0EAm}Y5qoQKS)Ev7oM8()4X7^cTjrl!wTeZ<$!h$~{(Pl5s9u4` zL5OzHg5u9Jvzv7(68novPxhT<4k~>-}pg~LqE9L9R zb!HBPeePS5xF>Mi$DN+`mx4{+mqHaya$S4*RU#7)msiH9L%!RgPVJ09D;icZi8*p>7m zd9EaXpyDb7d?_Fo>494;&kfLv-SNzvN$50 zfHgGhCEST0c}9glrjAdLqi|VaGL7eoBfU?OW0a_%>2@sjvKR{U_(Ijpk6d4M=k9B= z0HkLMINpzlmlM^TX@vf)bwWvP%MoO2WJ4w=2b_V0#bAAvC`b9vAzW@ofA7W6gsIKQ zo=_~TxIZ(Bvl)tEn+%G*M&!NyUxd__nfAS*VIZ6Zmiw^;yE*j-V3l$JjqW0GtrEQ> zixOwKtj=Dp2XI{U%7FQQ*Jj+mtCU&07eaO2^8pUwQ-S=~O6`lF=F)3q>qL!2dwzjK z^lq$C*h)Isr625fmyTTF&wrYj#GJvYT;j)i=8y}f9j^S_Yc?a|;e5d+Aha~;tsg);NE}6$dMj*VWUU%@N z+Up(dW!!eWnI!?)ef}_z3eQ^9T+KoA?lF%Y7p34-orHaL-kcC;1HIWAeA$gH-h+~x zEYZn5E$BG`3%PExFP8H7E}5na^zO;3Ka=xDNO0L*nC*0?iEELv%AKDUL(0s2=51*B zjF{Y$*7QJ}`8g)eL{U<)Qq3h2-_%35yPS_kGhc4I4&b6m!HKS?b%Z=_)!dJ0z!nTj z#irP65Km4Juj4rFRmvtbl!+dN`TyC9L7TI(Q)lcd9_gG~2{Q)HJRQ8GHPHa>3LtZs z<16XaZ!aSpWZ&mdOSgV-2$m|}*h6~ySQIzi)9Wxd5rD$KBN}@{^yjrly5pWKkVzJG+ zB5O<**}Fu`6Bs76@_ix9rv|(IMcPH3j#nSz#(?QZKzbfc!xlUHv((%TX9RgT@Z<~% z6!++jdlz~(;ub)d3w(ETj?p^80eD*A>)48eU!ZEPU{-WHR? z1xEO^51HFpvsf=$jj8->?GEKHNSs;7y5haN;aY`CWns2mf#k951h>X`gG2ts-aLYr z=opOZj96w$3m|36PBwDp;+Wm_64`|q*0y8j**FGOr&MD9H zto4&F6(iT(dfxU(hSmoI!|Y8xb?u!DR^Lc!;92Z%F`RA4mfWWETpn5bjcuK5%Sngs zU9DF8%cg^mZ}}XRkAvtt$-5tqS4C$!ono^XjZ@;!;Z8@;{ri~7pxjs53vdNr`W7yl zml#wN>8O=Zfgzig7*>(NIMA?c9NJjcG4PQ3Go41!o1@j0Usapg(9-0SR^*Z~U+Yu( zQcOwq=c9&Yz@P>2CifsDH<=6lev#w4+RD_}jhjfB zpBFDnO~Hq2)0W$6R|v$;s&(Q)@TXYc?Bpu}jR0N+>7{m?v_|%1i(q+jSsz}ZTMp7_ zNl!VXj_H^V9?5=z5G(+4+KX>TA~(L$@HM~wo2XcP%U03&OgJcZqk7GV(#Cwboi=Wr0HRgCGP^iRWAzOL3o7|pIEs-H zz<E8XLsAUsBhkXl9Sf+f@o{q-a$={}}MRCj`|>uJ|47Vi0d-QMz8~ z{1&gvMOKNeQ0fsy47s05*Wta2G66Kbn#m!<{A{)dG2|)a7IV-IZlZUiwS|kZDO`Qo z@ZPY(WAiD{_caqBw*PFhTR5cqiw-nxi+2qBW8y1dA?V7ry?UzJ^8n;qEG62SriPQT z+u;zBJQTWIbpAf{kI9yPsI99d?dQ0wP9mM&M3ElF(|3`!U;0TGeGy@Q*K zb~HT7)LtNq|E3;Cq}vx&#EvvG{qtSA+gPM|f8wykBsu3gW$EFYh-_1#{a?`yKgC+o zY^d*UtmJ(SV0b%0eDe+fP()HQ$r~&RG%9+4!!3|Ka4R6>#D*&t5(AJJo*_%Uicp_0 zHTYzm5bj>wG@9*hzpNtUB*2f(RaP?dG7y>#FA$mh07^;eN}R?B<&eDs z3S>$7bI1vQA_1kN5Q%2tQ}=VM->c0Jk|oo>hD4$E9|XMa^?Lt)6=#Ok(+Kz;=hzDGQ3#Sq>GE*(K~4 z)nd>q6Jh6y2d zOLOiC4JTin3H767<{gb{NvKkxM(((bs}p6H)hwl*^*|37%+_-RS?v>v!gd4Ugwqg- zP$~wElJ*I)*518^XH`G^af|xKRNJKE2x}3j?7>xjDF(MYB7eV%geNDd4i%yX&n$P* z8~QO+qcTGtWURmz#c-O~}c5QP!^-BO!Ko8d>{-{mw3E z#DP`(XgQleenoM@`e$C_Gjv>3(Itp_XW*o~xE%%q3GS;@derD>k*O9cH6`boIyx+* z0;}BHwI0+HNW{uAUa%^0geC8r0`^>a^tUqATL2{~VkOqWwCPn4!~Ic#g8 zR-tLLd}(zyRoUs+}FlHghd@S%+ zsx-#ekK>Dv1K5T(I2V-MYRMggXc-iMAv;Pp`{jVhs12E^rNI5!sk8X!G;MuP zD>PcBU5qjJdb zePf7vPvg+8nPTzQRPw)2rmn+pkHRI5i-|xneE`LMok;|_X$6Vw>$hYi2cy&+jVaWX zl>sm6p*zuE3Snh@=#^ALwHZLTvle8VVo6+Lz=^0S$kHP}Ej74VIXs5O7XsM$cD{;v2oa4hu!o~K~#R{HTb4d@D& zQ@A6bf9i_wEpW{elp3c9OEWucBzQeP17$(Agup zCi!B=(nJJo&z4#XQ!f=I>!M#7mjjpu0HR!Tw1+NTi0$b-puNWVXF6{5Dc3w>q&p$- z4vJ$k29E$+0Q?3 zZq#%j#L2i7TPc{Y?uvm? z^uM=O4AQ(Q2~d^n4^IOl;#r0a7(SS*4*9G2NvND~+2<_)cP-te8BsL#l>3@2N#G#Y z4J~=(t-<;Lu`Pfit_}<#1{pe3ItBr02BcwV7zS`CMLMKm=q_g%$&tQ$e0<*L{tfr~lX}jav(G;J?7j9{ zpY>gYD7e#VyEQK$PTu?{sux7g6NabPkP7ezK=g9c*IO)Jt|c9}d57!z8-mxF=qp^Y ztL18nd&&BiW-qbWw)Hz_!{nfe0LFrg_5G_l*ubPFs#!d3#${Nd8Az+uuKOiu{}_?C(8o)wPT`&WZB8)%U3oim~&cy~aoAN;vjwrwT;%lw}y zj3}G(|C#>u&XZU%w3rN_w%9nLVDVBcLC52ftY|F@C@lYxR_Smu0k{OPrTpzRqh6+! z*lqi%hPK*kwe+=IwPJ_KWdEvU8p-|?7~(Lh>Ia+UmlU+)nSe!42FQ2fv`+%}Q#lIm1iaURXfZcS6%B>!>%cus~ESQwhwKk=^s+k}q0}i8VcLl;sqtw>- zvIH==hckN8fIYkM?{dTimR401_h-t$~b|yLciHJT7S1edV(ec3+^n0z-xBHZv{=1ZsEG<&ze>co^{F8KZkmNl> zn8yu^espM+|F@8#t53DHAN!qtbph^@m@s+f3ZJ6M;J(9qcu+ph{ND$Akyql=y&pzn z{PGB3w7HhLU&0in2%F`A>2%(ek|e0XLH?NfUs>(G^#QOq))>D2Ed~#!q(Z^B5K5Y> z^~!MqxFkb6Z@o#gf0suM>*JtgFMM;JQIU47O3Pdo=1HwFzOZB?$%O%1^FMpw4Ooq> z?bWA9S=Ir6vr;5r-1eL%MX0&f=$)5a@fLKguQnk}p5kv~i*t|MrL>*0aQ<^_B+t@gRqE?r$a5o;V&0=P{qjy5d*=**n=?$tXS!*7U}IKtc{f zI*2%^i=y>^gM_L~eAGX>xHWk~41gV8cKFoREH~^wgb-v+d zr2k{?yJNd+ZN8q@hbXW02`K{LaM4$D+Pj`z5e!jaK7zPOKd{QtKC?juzB^hjxcbw) zN#B+9<-WBx7N6f{!~CBmR>YP&u{aGq72pnK9dqk>yT&71MX*Z!)mbKzgOoCEKekN` zvz9-&Mr-=`@k&aORINqJ!Ohqz_eyGB<9BP~?se7xy9jd#Tg)QW+IR$fJ}Pax1Hfu% z-q>C(FDS>_%TWkg^v+n>1AvH4uBLYT$gewj^24(D3?}!0togA;K7WS2$nPG7^h(XY zch+z!XG?sGn=&eaR)cJ?!S3Iz@;yOy&Mxy?>~RaVLSUa(Y5!A&*Tgn{{RjWsp|=3# z!hJ=q*n3-yyU9(i#+|#Md>*$O7%njEBrXToqyA{!-N(`kAV!m`$Bh?~Cq67Gbe~B3 zpaG{Ne5TpSz)T8`WLurG3<a)VO0OXYziLgy~?x>Q)8f=>A%`MDs4SLOC*#n(`rf36$@vNOJ#d4bWj?p|>$ zgDPRM>9=qx-gpq#+_G>`pWYMUK{K=uP4$s!v2d6yo!3=eEn!P29Rir&0>JzbQX#qB z246IGIrrj53$z8!kyyf!L`TM8?p?<0%c;4Y1`4_VMyv_Ht_cJ7rL4KjGUs)c@!hCt zUf7pC6`qd!HZ1WlzmhFv{M(}WsWOpY?dUuoTUXP$O@bP zdA1EWTLrh1F$wuX0GmSrvHO6hZAHXFY$H7dg$&83VP$E-45CGTKY$e9bM1tPwb&@a9ZNWM>EEkj0n<|xaAj8ack2ypVx)&I3RHL z4M2`zxRhKCGiKGTSEjnl45Abo<pUizvq-GMRa7g{flVd(Vl2HmRZJ9@7#KV@) zc8fhJ(%B%G@w|=T+X>Wqo4^`qDrHejx}{JC%=S#^gIEQ+@@>8e0>DPslF(Db8Z9Hd zgAtwtR08kBp8iEW!J)_<0pLn>`5htu&eU|ClypRo6WYKlv zFqzG0UDs=j6r#c-J>MvV)%6&ivCw+x66jE@iDSWve+Dk-T-yM_s|Nv07m1O`CF@^@cSQkxf=ndM+#~)LO$uMaK94aQuiz9 zWz3v9iJ3Q*g1JWblE_|SLLB{%n&$WZBB-xgU4vnXU>$q6uMz>`o zdNX5W#a0U&P&Dzntu?Fs@MKq@QNRNh&0$pge3uH&2_l36VLk?reOjS5)*#fx126cZPy=tlunU-4CQumDUgE+m+dXU5LKm}QBh-$&GikX!dq84Q)P_H`s2`VNL>yijCVyWL4%sZBtddhJ*ELN~4GY zY(sD-8lhGd+PWKbdU4z*P;TjL@ahnA5332_`^_midNtd?hp(z}`i|*C=q^a+1i0qM z-D9qrh_oAzeaw!Aa^Q+0x!s1?qB*PdF2zhYl}pS&cZt)aKw{oM{?LyaHdv~M^scy* zbnBJJ`qn?bzM=S;d-UQBm0%{2-Mn-52L{fl)q>z5kmHjrj zxQ>}~`!6RpO8T^;^MoO9ORqj?5(?xm|r z2brq~wewaK5HB1OIS#Jm52Bm7DXpyixp#$yIy`~|Gi5~YO)0Nu75f3%3RvOdz?ETA z^6N=z=IIi&qNfTiU(gjlBi{VfvJZvufshxwT?j9>+1?Lt2(k@9)bNtc114tQ{aqvD zbdBknym2X;t)2beaq7L@+Fc>%o%`DWF?&_sV}L=hg0_B|43-T{l)cB9N&QbA#3Ze- z3Yh}jvg#XU&i}AX-u+EaOm-k!12d-QTP>U7R*kN-jRIy|gz(i!M>8)Vz9JWad}gsQHicUw@q|YU3!lwz7{BY(6@`fbPrLm z!)W@x&3seUgTeehR6oz)ZVb#9v$suIqP`L;4MtL`l#Myt&|H>fYBAKsnbc$&I>sV# zV}*Z`o%+fBndj5*I4AZJL5bcJkX}>Z4nCgvUlwg?UjuaCVg_Vd?vKYCSZWxu#Mf8J zw6MJBpS$C_@d_9(>M4?I16f96+rWQGK!qiEa|=O#0WoRK6|0%rr~rEO6yP+{9tB8PRPjLl%}RO!Lwd+eeDy)+%;OTkXaj^ zD&5TGDB}LRq;{sMK^kRnzasFH!Ch7WLN=&@Xrzv|93=Zs)JOabgYQl;x(c;+IwpUn z&3@u`EdzuBV5(|Ps_GxV|HDIK3sebjsqtXe#x<=~_RNx0^Qjre_l2n6WXI!j@LArM4E&k|9FI!yWFeAkd8`FLBtJx3F>jwh z|6xcd6D_0j2^MAV8EEt!)ULDtDJEO~4NCfv>`aB4tW}+YYqaSWI|_ExrF#d$P(FsJ zeP)pUaMGnur+xK9(ETZ~y^cKbM4;J{-=G_IOqWhTD2JyTt|j#vSGzLl6$c?>Ph_G} z;0NKzrf8IFb){kGl-NyHSw19@YUX9ytt;ktqK|7oa)wAuw5iR0YEEg zA7aE$eazTG3jPU&)ny-m`N*mSSX7{(^m~I2#YL&*A#>E$=nJP(ZMlo55+?COS){XI7TT3$ZT#w{I#2^#4y zVw|YW?{OIwt6;^BF>SL>nwUkZCb9yxg1IY4=foUTBFTaB+*)A!96Jj5uXqHHHOtQsq% zUOb+2wmO@@FW1`#e8ie!Yy8iwQL`0PjwXK$m`tg(cxiUE{C#{ zuf!b!QPxFou5g?2(NBPgdBd+wTopnvpA5 z6^Tsr1&UAcxlzTnUZ$=13@1MeGRhb0OjT#2#U&;LKt{*}BP#M{sJdh959}BSmJjcq zz(91rrPC59tkQ*x9sCxi;3h=fflX9CZs2}5QK2n{6cIpg-3;;s9zSM^x){|0HVJT? z_He_t@?hbN?6BKCkV|;So5lA?*r=0S@H?=vbJzQghQpVnkym4gjZfIWJ^H1xu=11# zg7SwS%=C2chr*zJ@#s)w$e#Ec%O6^B%uI=B!C;oJTfhPcQ24u2nk}MyT<_9<1omOdGEbH z%&ipT&_;q0cGRzmwzO>ve6x18EraRc*l7?%t0(ZWZi7%#W~N6N{)%&vbXsmk$|*50 z6HEd$7qoF@fNsHf>c%+h33tG55ni z_f!Ysw#Ms-Sm*6;RZgV#W&z%4fL3$mT&B&`!!h=fnm4Xyu)!OhPXfy(NZzgv05{BG z)*C9vU+VR1BV9g2GVronc8nA+yo7sRsWycm%Cd@x`^V-}AzNH#2O)G1em)p;dR)~4 z4UYrH6`tnq;3Kns6_nz=G5m2``U#nc1=TwL!tg{22G5gVtI}g-? z&bFD+T{xr#&uE5_wkj$rj~)R+X_aUx_M`#hwg6{#B0ezHzHFeQdRasa1zH2@brD1r z3$_(~Z~$xC>s{;eWQLqRJ}~|D>eTKW2@%ma|9=0&j|y&UBg%Bj+526{!m|WBA28R^ zQ_KLn+JikHeD1dI&V??;TL}c)ZnKf9j~@p+rwpjpRV%a*kCEE*Q_PT4>zLs9O=4Lu zK~R#8C|m}q^tf=x*w0TPAR%{XHMGxYry9V+D2@2yU~<;<&rLXOj(#C z7m9>1-R;`@Ack^3KrfSyROj^hWinM`#Njn&(tysVw=(RQYiY!s--lgwlz(KNcUhQA zcZ>bYRJvkr7@`$006Pg@)oaYEw=ZHPVh;NjDq3t;P2wviLZ@T^mP($78FT03k7;8E zR3lF-w6x}}JP>-810G@5t+~n#G7m(|da9q@o2ruW103F@v|~HT zO$g}2l^gCXk;NS=8mtQ+FXPA+RAlqBpV#E!&(fd z$GzJLQa4u^L|mq_vKN5LOt_g-|f7N($dh;%B^+Q547+n!_PSjs0{Ded+r~ z=}G?~U?a0GVjzl<y*u)LVfQEL{d1F!MdwGUJ5Qv5IO9k6>gZ+MfLTyev7YC@(V&fd1p=5BF zG!T1T!)w1Ar`P_4d7RT=_9NZ1%;UhPcVf;5DYaOIP3V%pKu&!!`X>H+RnHX@&h2+e z?^afhl*K=%A|Tpy)L|&l=j5BYVVd41iz?v4<+_8f;#;Pxm~b1Ep%dN^FD47K+^5tm?~wn`%zP1+J0690%TWN27$_3;X>#q{<{)O#xMB8 z%S_cmBSNl;#8!u22T1cu_*of3igK81%kmZ$H$<8$I~;Xl!H*R&_ryolE%o~$e_ALR z?mw%dpn^B@#ac+7NR4-8zC)&2N5Ao7L@P4G_(rHklqpIi% z1i3MxdktNDX??e;FAbt_H!QKSeLnzJl8*${y(h!2MMG*r6DDfM0mo}Ga+88v4>j%- zdOyw!9j}uch#tK+#zIL%gb3)FxD3=J_ty3QZ<_VOL|L(ZOK!}t!xAtzmpM_xPNm!4 z?@Sdpp6?DIgT4)HoEolnF!iU!n9ENMemBE%uyGXa5HBrH#L;mFY zLt(j+{K>+3&Bew%X4Qm^b3N}V_F23Zd@bLG`iSTNB_qK1Z)u#QXw0GsWk!5pcD@)Y z^!mzK6Zkq+FV=9^(zSXj(|0zx)_2J_tt6&{FBX7iF$O@Nad`I zO{CGlYZzsi8QelC@&z)2cbVJ%E%Tk(0bohi-81XazufSD=vMs-#Jj~$5bt{kT&e}| zoIN*a&eZ5vjC8P$6Ig%$!_3xV(64Rpjxwbnr6o?4TUL+2c8+pvg>wT}uugc4usA1~ z$xDPOGwHi8*vsWSmce0mVS3K&px$;(>wKWMeH%&pu3U_Lbu_MTK<$Z1Esn6oFF#We zXPX_!V#?_#D_+4LIwhUEE_tVe$GlZU&E?SPk!G$VaB$|#zqm>-rU{df9*>|u^i0tg zu>Zl=PYji{sc9c6f!Lz1i7IxSI6rwKD?Ll7rp$pyhOF0OgXYsrlD>e zLSKNX5((S{7hYh=i|wSJ~H_~)A(07DOQ$sr=sA+qu*n!+TY(p7d^tm$}V1Nat?@lhIFW{B;)-0@Jg~g zvtu3dNg9YygOZo=E(xbw~ly)}b!5Fv@*TORoE zP}F?3F<}muDk&H9w}~Te3m=|VyX7f6Ypl@uuUwbyYlw`G=DTz0(Kr#c@jD`>SC4Lz z*q*nzT6jic?7Rh83Qv5GNyPKJW#=ryBX3M=e>XWtvcRSqCkI#UNVpGS(qLse5)FZ+p9+9}vaw)mP_z?p4NlDDyW^L&OiA_ffZdoi~+$5^G!1L_^xK zKO!py=Y0=_Ur-uPjbe{c2?FCVtU-i(wxJ>vH3?6o#;B1`jL-~TeBCt7|^@u+UZFe`0rROAj0{3SZS zER-duYV-_|;Oz(An>%oGvZ}TeMr6d)@c^z;NbC3Tg;QAXQwQ4=yJ-k+1LJae0$0)~ z=~Y*(U)iwkHRk9&E#Q1_wZ`8x|9%l{691|p{$woDsI&En^V|}w-dwr<(!{G<*tsy0 z&sC$5H&4!Sl2LcQOhKCIB?XyWYWiZT#Bto?huw5<9b?Yf^OOiRzfd)Lsb8TIg0YHN zu5a8N3D#J^)#5U26>>gY61+Uo=wZZ48`hMur_0zdm|%F)5;EfuvK}iibCPd=gR)-g zOmCuRV ze!G(yhw#XRv8u)4>Ql}Xw?Lot6QeJC%Q%abh#`0t%>X_fonX-TYckDGHdtWQMPRyD z^t58jt;`a)S~xQS^EXYMJpH9y>2><;Ql90)ozRscQ3jUG#DE#!m1_ApjR3g>11Fzm zl02sJeMIFT)=lJN+SsnXbzAZn#d6_g`ro~#IfuTha|Ssi8U5_J z5R9zUN2;8VDAAKF)tpw&3Eazx-bU}SVL%6FRV_@zmO6INT^CEHbBI^WgQZL#EdD@G z7M2|@DGx4lQkkvL$?oje*dH=k|7h_0QKAzvrO)qM?&_DZGuzwNHS-lFOy3PvCa0rv zv_<_2!UX5gO>Gu4SmJ#rLz|5{G7Ui^}!Co%TKqD(yAk^AHE^B5@J*P@A@q?e8uOW-Gv%_7-lpVxXI5 z=J&gQM(fFrL*Q!E?{7a(KlQY<4hZ19kVCVGy~-5pse@bcIFviyNGR`#a1Ecl3<)ib zvY1PIm0B@mGtOgI`uFs$#_raUu$6JgZ)@mUu=Kz%Ia6Hceey_OGH=c~h z3=k(w#Y2UyZ6HyBJ$l^Tz3eB{1#`%7dj%QalkXT2u#|+F;CZ>@9!y4gpRQrt*^7ld zO|1>_ze)sx=pc0`Cw{ql5R9BmskjizuuydGcjc1X@uHe|2UJ;-j*g(f+9#wmeY6CJ zzyIxnO@x#=_fW|V?@n-iVKnd_hOMpBG{%-RV*6E%S}J?%zaW-u3sZuxEiJ0`=KKCQ zZY-taCA&nxTda~hJKu|X&Bzr-iSW}juNLc~#OjfFEVB3$wend4Kb*XrZ_1xbm>opU z%p7C7(6^;=NeuP+zSWy)3qGUJr2O*)=9F)kHRVT z>F!4CqYBgJtby(PU*e0kVFZT3U$fR!W_N>4{B#MGW6n{vz!GcKa0i#MRX|+#-sUyMc{HI7tfG zUzLpu`R7OD%iJ*7v=1&89(wGBJ7t_g9B*7|Du4Y4Vf;K34yC6h4079nQ}BXvW$1mL!u;mqtcS;Yi`GL98)oNA6VkZZ z)Ze7@r2XJxl?b=ZvYDHgs3Z_9eNcY86K7~*_-Jl?II_9*rW%rqm6qrGu?nmv-v~929eD?|me1@lO za=

J{9!K|itPsE8~Pnv$>h)5J?kXuz!a{uEscq{3S~fBs;@DtnKo{@ z*mQ4VHJQijIRrco(bJyjpHSrleNV-L1S#wWJC+45m|5N0;^!0DnqhhuTo%M!%>J}} zkj|(3lJ&N=WnQU)qm*@9936f`A?kP*ty=Y+#=-Yv;5E~=QHLYsj?kuu+f*g5f!A^I zTHQ7`_muLa7Pj8m5#0Bw**XSc+mejA3-0|46|TTk5vkf#o{e`w6I$aBp-Pe#n$;ew z6#0`b(YJALaE!sR`(@?It{LIkh{g@f?nK+YRa`qYACK_(??<4MK^14tIOmw$x0Zn^kuqLyyqO~0DYdECN;Yki)Q3{u&d0as_61q7Wh z1gtmUc|xx+T^E$=QeV!N$nBQv(k$v#A{?-ys_)W@dmKS%Q2RM(LFM34V0-~MK!h#y zGRB>p(72w1zB6YVw18MXAp8Ik-p<8F6QOyY_MDGkm^m9njd0U(6>Iz_6OT@CevUuW zUPQ4$?qi4N4iLgIf6egjOo)dZ=!Zdzw+Vw#6M?vb;}7u+NEXyZaQs=Jq$XLC)Y1m) zxid2OXH6=lVG@-p;J{~?q^3%#XV$&hhj2lXl*nu9PDMRjz(64CvyE0EAEt@xkqXxb zov6SbUqG%wt7efyEZS8`3VHAPQ<>1#JNYmfxA*N2JHdI5S@umTRSM>Q6f&pjt|k;R zSSrHMxdMmDRHIaPTX#HM;R5RU)M2`7$NNui{`c z)~NvcHGk9=p;q|MYte#FC#tABEcQszod5gljlg;|;o?LQ)gGjtUBfiH$>IE01lOO? zM1C?uZ)u=|{~Sy(XV=VWjL4g^Hz(cimG#`EpYa^jQ-e0g`Qr)L?tEc6d<9PMFTaVF zSR~u^a)@|1o1Z^FHWO~zIrJ`v%>|WU!2qNah#qM!L%7jK^<;CcuW^ym!!!~kv~e1= z@o;dAsOOcRb!Xo&&4r7Ca0zH<4qJJlT&aNu;le!RIud5rm~@gKcl&2;s>ZGHuH-ER z7x&l`Ud-$4d!`{p#@X^}L3EB+s??cBz7I`B(IKZ)I#qBrl$qSCN{4%(**lGwG2q}?mq3&Qbp(znf<`b$j;fBuf7xjP1Rq-yVk}5*4hU^+J7QvxR>yRnJ?_N8HDZD=D-f+4q z@a^jb+BqUdnWFU2dOI72o8V|-%{|im@yn3ZZ;_Aq&&UWqYv(Z^#~^CJ4Ao5Nhg-^K zMA5{2Op_N)sT>2&1i>wq>-_%mH0bEbXls(ISn zqX4QqD1dpuoSV=stNJ{nQ9^#*$4uv}G;7FOLF*-gXjOW6D*5dDW11^K1}tF!CN8w; z``w+qop>t1K6!EBmScb?qfF!1kEWlKP3`eFQAOaaXTf1YKHXSTs1e6Y)A{VOlQc<7nFYJD4Wp0!0h`>^V(wB4|@Z~#rl)w9qS^>3hIpP5L7NeZ9Nr=qth^U|1u3kar+|GAJ_ zmmdSo1F0J=IYPVd;7>ZgN~dVpslUncXIdPlMGwSrtlqvNOwzliRJqI{H$|Ed*HC1R zOaa9rUdM#jI(0{*sP^KPyLsHW-bZ%6$}%kDx%~!V1RkHCRPb_@qAZQNt3vTr;d%Lj z63oRxOHNrZ%VZOW$0s!O<@m5aVJBSZTWGC)w}^*2rGty#RT}dN%UwtE^mI zrsXjSb(>EwBKfcIU$(pBNKRs?PxaYG&W*O%vZYKk(VO3?8Qo4x6 zGKBluob_4-lPYdY<5--Q?HPDdtK!6zR@x`aa30IZTAOZTQ!W~p@x%#D66!c(>H24; hZ-?(-scp$m81w{p{FTnr|CxthN-0T}ymfy(xgjo3WyL&XdysoiZp2= zgchnGJ#>QfeG+_kzi(z|f9}lAEWeO@?s?8V_w;kF5zn8hU!`E6AR;2V`ba}XhluEc zBoWc&mzORAe{o_6LlY4}i5{su)blo5o3#7D1WI2Fg4lZ5c|q(L2BDizNgn;l-=3oM z5n`W@Pl=Q0r1askrtW03j-zI?CT3?3+4oTPQr@qY7@X>bIG^>e_l;GZSlVqgXHy%| z`s8RBBpD^q90Y7ht-xyc)oiU3vijlR3BNYb$i%C+f8N;|m<0qM`~YRic2zjQQD~3) z<)`jDPW!2tjTP|vQl`!NTBg-{z08OQ_}6C#vqYAK?DYeHa3Ug)TSZ!*)skL-?DdOG zKfgO}9$O+!Ko}B7gji{*uN|a%|rjt(ImgKw&~L{OKWd3&Gc$wV%PF9%+m{*y+TG#fWD!j z#gC{M>J)g>u_p~c{+w-vD)$ew{lu>lvB^)p2|Kg%{CjuiXO&o4-MX#&pnz$Qsn=p5 z{S^YlcWyDn(C~lbr*#Jz*t|!OSAe+}1Pyb&IRikPA7ZLC~I>dpCC9 z<>)d2;2t+(UjR9Y9s0fgkuwX}ZPa2x&Nw1dG*Ig0ac7hO^D*m@fS}mHpWDnS^xRq_ zA338*Vm4pSjjuWjBPY?OrX~capQqsFDpVb=-njK`j0c6(FSeOWIS6)zZq+IwE&{}o zH*#vAw`g+ENnD+roN2a7Tzb+aYeAPq!;;p2bzC_YOQHR{u+q+cQpB zY6;3uzSg_2wDd8Llq4qEWsViz5M#thSo>>O-?Q+l1Ip=N8qEh^w+1&h7T4eZ&$jlI z7tMLY3$MOFm7Py~M<(l5ED1|QX9+LP(&1A>>{U`aEH1TnPMtRzX4_@50z9x$=Mcwm z%@LM@M9=OYe?BVPUF`bs3z~OlqISw;Y&Rc_%FFQmO@L$b<|2*bZ|S-)&OWbU)G|vY zQ3gItGX}H*`03>Lf^-QRgmTO0OU`RN!mnC4M)&Q{7xA3mz+3o^oWQDEzR0|WFJW)v zslK~}aSI84cie!rX$;)VOY^aEO#Vftb(g%st6t@)ckydPE*fesre82RbZ%S%GcI9_ z5>pdKax{dcxG}Ez+Svjb-Ro{#ckpW?(=I4q0!ktx_5@}wnfX`lgs-7a#le~cp(WCm zLKd6kOkhCcH(hF5qXE?kbs;67`>rYy0ypz>|D_b8PYzI_T;mr{tBob6B&^|j$VS(7v+PjBs+P&6T5$fADj(ds3M6-n zun{`!LdV>=KCC|tOHgc~p^%W4+HWsk$6F#IA`R{?hO!1&Vxk-ugWGpzms)47x|6c? zm4}2?qG~iCYYwtxuwEr=;TB7T2Iw@7G5fkssrBKFSsblAg#m20m#%`qA%^y=p zOkO2HAW6}eBBRY>vfw(MiwTv4w6Nd#hx3{31Y(M%rN%<#qFQNPs(Yqtx03tpsR?_a zG2CgPBm6PR&{jn45@5Js=K@D0J#K31CQHwFA~N&pvP4-O&K7<9oR6j^?pQ5*x-be! zLz8pX=8MAH)Uu$;fv$hhSv>}24O1RXJkLBY5a2cF6HGPUu^Xwqsul64nA4KIz%`ABgX2ID1=O2~Hn2=Llhv(dDQQ+#n zbWPGQ==@`U->M%Vc(}?M5%h&(xj4eaW;*z1kd*?id zvQD}k$q5j5Fnie)oeMV6@;VMxA9UNr#HVq&ha`_cLQ9zRw7buz0Y1FQOJ5@VZH7L< z$;5RJAyIrz22mjUSUc^=q)Uc0VV&q4U``+l{qItm;~eKA0Wr$`$A`b6){F)dZhi)y z=NnptxG=T9Yh+OW4WrjY(&zuS0ewfE`Fz7BWtVu_lK->p|N6y&&kooAE5dK5cL>nX zX=<1AZPT1H=f5#B$4KU<$>F>Z?75eW&lV5Nyg=IHx2|WvgxS&G=8Uxl5i|i7YRx(0VpN0s z$os4D{Vkbid%Y@lf+r@XjK)^Y129$sx-PYrS&k~vHIm8hnt(-+xx#HJaJKJL@E5bA zw3RuVv#J5-#k#+A&x*tJ_)h< zjk@UH6Ee*pRo@5XF+p0zJAnN=-zqHNI%dA6J3%do5GtWaqgu>Mhk zfOW>ILX6{04c01-*~W;^EhKX^G_R}4inWkKfd$V?s{`Wm6}DF*@-ugf*S}C4duMs? zb=b=)u+0$gUC?SLXR3sRn9iWuUif?bT_Q)PIt_@SeqLdcN6S{*Hv4RkhAq^&Pm9`3 z|NZQ<*Q$_4xp6j-S-0!Hv(`N=7R%~8_&%eu=e2XJMWV5bzN3Hr7%qT*Xvalne|_WI zc-VZ(P-wJ__q+$Xy%a%Nkvy_1F}Mg8iCvd-j>$Ytt_s-T+c=%_aTIFW1;V1@JISF6v)Vzs6p&Y=mhSKMn6 z>6u&i{Udo9CWqw@8wS^Bw&2B9?2FT9!Ck%Z=TOD~7T)8-AcH(d%^uBAl%(oHW-< zI*)kZA0I~(G$@TDk2EG)=2@}jfEM^`9AqaMtJ5)2(2pr;k4Xt(jAiy$jvixhV+@{n zY>~q`Ng9KWWzr2W)&w)g&-{=N%P?_Ae6{@?_$^sXd zmqPEe+=j$>P)QCu`90io;4>=DKZ_$Ds#CJ;or&8MTbsVK@{Rn=lA@adT{js!yEG=G z*IYC1xp~!75dWdh3%40vo@7=$rVRtHW>7eL9VzoD=sGEJ9T%1`7xvL;mUR4lQ5h3< zBy_OM;PO7b{Q2G^y1I+;VCG0#7p|z1Xv-WK>*abg5SPPIH$qsz47gJ`L&Np(F% z#w0O@{pK3waT(@ChZJLzDqzmaqtOOBvuKH#xJf;0dS+B}9CTr*Ee9qKh6nzg&b;5c z&L>ka>NJUy+j+Ax$L-KM8sJEaAk|aAU)rV0_g5sXi8WAc9*J%0Soz<}iPL&clhzpq zs95@g?qk4knC*Eb8qq-%khullWQLzm!EY1g=8;m3{lc|L1eK1X9zm`4tM-^54451* z^~2zp$g94#TC&7pYmV2QR!xOn#~-8n7ZAnW!BNN}2zYSOStr1;!|ad;-S0H?m+ajA zTrdJS(_wZT!+U8`?R{GD;Uy#8ui#a@bwGD?=chU7nIq{1j}3d-wkjd3J1}_0MBmGO z8fIpf2?=nMy+c%uMj>7+;23wIAoINlo|#&&7DIG@a+U#|`$HZ0B0F*n;BrBKG_y-* zpXhZGRgu7P3N*o_zvZ7Ji7`9rD17^?cNO;`&JbCY8FY4yhQ7wbxcMYxWwpj~ZV(om zGHbO^*aXI#n*bGcawa|r7Hy|VyiHiS5#e~*VISEgAh#~Rb%6=@78Z{;-sll6IvvE( zlkB~6`$cYtR~p`y`-EsjCE1l&y#&E3zTvCA=PKiNXbg+RR7){}STXT~ImLnC8wI6$ z0S%qflsNPCNxWG&43D9bv@B(<1dI#p*#kSXvrvZCUbAklG(4Xz_dOGVYv#1VU>z$% zOZYuj5%11@YIh-&GaJEbS!&8AlRg?Sfm2vC9YSUK?R&v;j5j2~v9F@=h#N0%mDyac zTy0^rzk>Y3NEL>7X4^vJAn^WP)kv{C$5hr!Yb4!kKGfgc6~AT%0%{i{H8Q5k-a=Ew z`mW^sic?FoNlBGGchqi|`4bzgB3ekL9eFgmt+}GtY`wAsZ3Wx$m9FI-s@zyjruQ2d z^|&Ny9q{3m%z=s@Z#*{qo>~m1}dWs&aklPV-a>Qw@ zJ{a~)qr_7-WRho0T4W|}^BdSM3gH(aFg)j7vJ8|Ko`pe`zxz&9bc$EY;F@g@sTknx z_!tTLBvF`H-NGo3m)fa&gw-wb%&=wy_3^O2OYko4KzYS)`pY<~%X|+j-!&Xh95!KV zfvg$}u#6wOg1a@qqF#T2$#VEx>B6_8Aib08h?A};Z96J_Y^M0r=1Gh2{--S1-6wa9 z*nS0G;m9^NStDRkFIf!Q%2OzoujnzWG>x9C*+{$gZTyRF3;VnY;F($7yT=TlnjWSV zHF||GocqUz?H8CTAcBu-G?1v9ABKu+#P79W1G|ReiPg;>CfVC{_rmo~aw8C%#XYsI z$Y)3>r^*x~;5+OG{XjLP2xJ>ReS$uTqajv@pIYg$r`iL4Oj-An*(a8$a73-O5y%|P zlLl~(8i+K)}RH<5A z^0U7pQ5V`aIdzRVOv@J0V^rD7)V#^*NtJOy1F%6ugj|-|`pq@TdRy95QTUk>?HjDc zS=AKTY2OJPz~r7HUvTIhAF6BM=r5hCeS@x09&dc=0y@B}+;2Wi@?0N->?e5z!P{L{ zMZJ{_Srslav2O<^tAcDw>5fdmmEJ{@^Z@NdZ}~TgJ5FxU7yX7eYS648s@lFKp+LqG zY4I=jx32RQhTr_~eI;cDYPIlIT@O>fV}4u&==DUq#lDx{pGJj3dFIjiw@6n57$M$%6oBUa`zCCps?BGZ0!27J7>ZKpxCq}0^_ESr0XKbc}2ne@z(wjs0o!|tqSraC9rwY-QRixVhvJQZoE19aw&f78lFngqLVoIYiavfjKT=cnx9(L(TReYl=6XBh_s5J&d|3M&(9 z*OUL*cCu!UU@EYaT$z>qgmTwI`cY^eZi)uBStSQ~4)6cTAoP6{2O^1_IHo{90~=`M zzl=>W_-Ki#-TAOWuUQF5c<9}!7H(~ks&;vE4Zz)qP%d`aDd;#Q-uX4ohd&{pHCH9| zoupwD3YZT@4xr{?Lxfa}yU)#frQz^!Pt-$>Y+2l=Dol*C!>l+kNJ%+eSXu3siu6V834+QM$ltyvj);!SZ3*mae_N2VrGrR@$UxEm{k zDp%Y+lG`rd$0K!Rw{|fwbK~#z=-t?{Tz^8K94jR)cKcR&WYsAn3Tr zBR0|)?2%w0$4_ym^^0h@fWEVjepV|%MHMn`et(v8T(GjLTJzDg@!+=Zh(j#{kC~fH z_x4_xWglDoZ6P3QqFBx70qkma_kyXNRhh$e4obKnppMZuwCc&2a_zLE@o}O1lFBjr z$l#ZzKOvk0H8;*(3{5AL^Ae0POfnS3pL`qdsciwL(I?0hKpt%nFs@|#90-ni*Zh@g z#*+lp=Zr=;$E@4Cm&oZdmUqNuWFq;Ey?*uty!uiF`2kpk1W1&2ef*g0+!sMFk~^2< zxu6t{EZxH_9x+``au7o7)@gm=yolJce@PNA5=77qn*U=JfdKTE0nGe2_@ZO&BlOSVH%C?X68*-;-m32GO{1JsK(TALMMF_@MtFz5bAR zrIi-gsd!jax-q@W-1K!`EFh(sr&uwdpL~Y(0+Z8EfiImmZyKaU!u-(Wg!0o_{02^> zHP0CG>G1R#TO*B2wURzK{$4DN{g4FJeOmN>dS&EAfKWS%%-1eS+&u6e>pwTs%JN(B z-+A2SwO*2GxhPZXPoJ_ezddQvl-KR$dC&(AiuK}yH;gPh$5OJ%0dy+rn4~q?25pAw zjqG{K-*@->0Bgdt``0sYtcb3O{>ZLrQ_f)^tImt5m-V7~q#A%+x-KP~zI^;+1x=pC z|AI?Yih`mz69ZZc#P2&+ZW`>y-gC={Y`h0OHqq1Xc;d(wP2-|6xH}6n)LE7CEUhic zRt*P0q0j`j*45Zd&#R;v_95v7;zJ~g_3Sg@AN|1bRk@WXZ@BkoJ?(1nnjA-CebNy5 z!we=^ShS&TN|b+_gzB0bYqp$2UVRO`tIx^_UnXL^(IxFyxnTC!F^0ILnLM9{geuDM z$o@-J!`$_1=R{4+ij2BZ&WN{66T0Yt=CZ*ONZeqsy((Nh4If$gGh}8$lpKCe&%^pb- z3wR=dtHZ-lt0LDpbkTY;wGNk!z68gSF5SA#>M|-S@q?EEM5xP#=a*EnA73j#@5982 zbcBHVL&EkZ+1tp>lM+uE00U8YL3u5ANljdv1{MI|vm&K3S{^+i=AwK*?u1`wGyD8! zR#Xa*T08DPVq4irfcgDj2?g00k!7l;*X;Pht)iDXXZeajCK%nJyW~DG*)-VqU-fj zvj}^F4d~)V71lb$uh+G~u0rQK!=ZV(FoPZP$YbXtg0anith(3OyQd+wcPUN;2w>N~ z>)E;khX;PxK$U(W{dZGx08WkzZW60|YIVyw+a%?G#;=Z>tJ-vzY(E~pa6yOTC$YLd z*ws*n_edLaz87tcy=s4h4MD=}a`Wa$b$&i@V{`a@Kh3NqI-UpUJU1zgA$^sh2*d{Y(z@MMW2}T?T72zZ24(u92q1xIIQlVTGe+3f$l% zM%JCTq_?0KrI%qS*o12;a$x${2jF}AwMpxYloYV z>5a*fNF!gI_#E>!2f+9N^x#2|%grQo(Hzm+;`|0PGV+Mg-A+NVf(*Ns+4Qd!e+DL3 zyg4W|?T4g@i4^bOOc@p%x%c_c)fLI{j_$=W@phAewYHQpZKoLpAY58uxCo$|pHIT0 z(;V(}A-}lMw4Wy0s-zTN9@Olyu;yTaWu2@sh+eL7Y`aMNxYo|a5mO=v_?*LrZ%YOrr0}7moELc@f3qS9Y78g zU4|sCIF=by?mQlH%^x1H8VL(!WLM9wGed+nUl5t;6oT2Gw!HMTWZMA{Q}UR(1`6%h z)qCBK@4s|#vQ(klI_^AK^Tmfh&B7w=_B8?HFMZ3l{WG`3d@FbSq;igqeGdNgZD66n zw}A-ag0YQfH#qhn6tp6#!}CS`*$({d5Xn11z3nFj-hUGWeD5xQ+3VAmyT$WO;%tMX z#Okjusy7pJwgv{x%INo6bs@QKKr!$kRc0dQUA?v+f-)1-N^gspv(pa^IqSkdt!I;y$D$9_--a z(aY03AK(nF&R zG7zgZX>FP#>9?!s(usrDb)ATbn4b-kQKI>1L4bA8h^B;_eg1Yuh~BL6#a^faaAAco zEav!4{9v9Qp1f_F6P64b*HDWOt(+T9eWQ znG-2?bUDGamG&NcYO#7Ubs6YnJDhHuop|x~Y;s`p8|5zkG6y2_@x#+z)?1T#{<9aU zpWv=g-D^>nNx8xxE$zs2AXaz#gX0(T!!c{aA3g}Xmg8dUJ8E?h%}>W)6`?e5 zhl)18uv|x^@kIZrt9zr4Zjg@}kIrhuqy&tOGrc2Y9Am|HLMAeEDZnt?uaaWOmFTN2 zIa5R=;$j$m+A__G75r;_VT@U@)k?L`LSAh1^H@F>xS4;yyO=jg%zRfj{C+=k&?D0$ z?}p>;jDqirQO*jUGj-*QTnZScV-AgeGDXXIT>tY%o$33}nbqAqyZa=94tIi{v#UM$ zWp+4b#okD!FtaI1#Wp%W`~X$1`8^Vpk=|k7dnE?sz@pu8BR){`WrCtBDTh zEq^+XS?B_;AhWLf$=TPuOhokj@FkQ5eZzApg6PO&oc3-@kb`sGd>CuyII6ZJaH;%y1<$n^1oRm4pJ z`NV}^KhPN<3;I}1c+e{#cuDWrdJ)_j<##cxgg9Xd%gkO`5O!iRo>;-Jb%|X2-o=KF|q@-+br^6gl!&r@Z=Qy<;vQlNg#|g{&uOA;;(f-*w zBxajo!C9Z)-~1QO+YlbMn|LY`^WH9pbU6%4s`&CzeB-OG^o3AGWsVbm%FrLMg>_-> zXBmtYjYoE`7uR{_p5)ZsxAZ%*^T`Z23=Jb;en|J+liq}0sBz;-9s*O>CGZf(kz!mU zPc!@unuo2op_fJy)xq8C7%FQJPZcE_MDQ37hK>f2kwyuRgNdwewqJvA40nIf#C)twp7LqbO@te+m;fi;?paFPRqY&%Vqm@wi3U zZHUx%aG@j9y{q)T$dOv0T@EK*ot)L_x1@!5fmj)<2&_!bgB`k(`?SKtV)5eJsY=%T z2aP=oMon&c?wIJF52+7qVpbSA9{vp1zR_EM71MkAB__=-CQBH_qVOu2-*}|qj*D^U z_}z7fyT2!y|Gep{0!`0q#iGHB+{B%!u7jD2oHB?`hkCyankwI3I#G|mwW(iI;;FL_OBI6)5pvHYP8xcLhW4VQV@f!G2eNEe9Wf2qR#pFzv*f!A z6Bo4=aQoIks@4C{Y@@@A)q|w_)oLc!Y8}z0f_?IL+52@-2O~iz#41lbEfLT5x8>iSMEdT#!lB9(CUA_glJ&_YxaEkr{Vvze z@9x<-zp<^+({NO{hW9L(Pqnb;htJXEv(`W%vbsrw&Oq_Gg*5-Thu(Znf5;L%}mn>bv=iPD#~at61FB z(e(3&335*#Ty4Bq)Di!FUn9IHKi=4X%}5i>8n|0`1MMbP1kLF6E!sAttV`nM*r#W0RBDV}3YpxNpJx&oRcrs!ayPZM`=xV8K3A8zBl}OhZ^W zyE8@KJQx^`t}yo+8^=xVTQ;wYfHwkLIbv=^GgEM_%5ls$?_2dZ79Of_IBWr~E!7qI;7wB~H?AUmZDb5$DA&`8jtVim={N8EHbvwo=U_e5wr z#Q_DsSpq@Dh`;=Kvf}#KwbpX4px`%h4~0_UTggvN%GI&G(itOwbA>;Ds6p&_MtcGn zJ1`ZK@06pD2l9rZ5AC2EUx-{Xvx`b4WU{6_5OAJ)P9Y%@BCTHo{eKTF8=w!Y;xP}` z9ICeBO<|_SK4d0JWqCa{TfXv^79nG7PCk?S>oUJ&V|vWuM>HC?7I-YM^NT-)wY3LP zb>bC1x1G;V^xDRm2uIA^G3Ainf;8g%dQHWEGrZChlKQ;O8Wm*F_gLIJt^}iTqCrYzw&UYrm;^z(#`no z#0vEar>O8egu=`3GO_gubzSts@p&A-r!93SmTMhSwJ4z5&%-cQ+8*fGm1;BxnLbGz zl6smc>#Q~*!M=9T>C1w%{Nlz8vp*^nZZz{sOA>YcwYE9ZxN#q`6L;a-r=9vcmG|uc z4pd^xPE4p+d=?m||B?eTo!6hvVi#zU z{ZCon%w^nWqW>j26PN3@(UiBcRo}R^pl<7+J3H;wqJf@{GF|#%-oPpFz1DmAg{M56 zj1Ak|ps9e0jx$wTYyPeIauz&C>(c4V=yNcOTB+^2LJAz#7RdQQGVEXDP^J9buaOaI zZ&{DF+E6X88rC?>r*h)6n?o*aG_nSsG}?X`g`;|&hu@^|ZCt368oT?8gvC7TjD1IVw5KKPmY@?Npt$GE5STU~S2tTN-|#N^PH z2+80)9r`XODoKu;4mCxCi^WaL(!re8=vHIBfko9Cwyez-e)M#&poh)KO_WwRztZa* zWeC;<8GoBAuS4sq)mhslHi>d0B%0?<@KG($Z!Eiyy9KUP3+CrqUgtzLk7AXqlc50u zjgk8r7q8SmGfgzAN-2bt-f_?zMMiw5cs@^e4PZd&nmBG%Fknrb-3*Redu)Y_lDMg{ z;HP5ydNfwcwsO=eWc1C43jz>Enhii!p8(#gNb26TV^L-0_;6AJW49HAU_nX7sY?kkxyH+1o~|_iGK7$OtYpkd;T5l%P0d;6Q(M zUZ3emxb4OB!KQWaR?~VB1zB#Rx^1t~b;y%bzc?}@tnkDHWjzIa?0%82Akp!g^v_Pi zPPOP`O!IQwC(h0}!@5K9y;}o7xrE62{m!uYtI!E)OXN;{mdfEcmLqz(t@ve(WFo&w!?@94i<#Fqt>Kc*@o}`EM;;lIO;WV|L_{L19zag=<%6iBJj}i{GNzM? zbG?lL+u=w*9&wQghrOw@IZjsEJEf*?+c`R?_G{Fyyq-IvY>pN?!z|>AeMgs^xZd9W2YBg=QI&;7v+(54P46Q9_&W)cVsSqa3zhkTjj4@hIi- zP;ezs!w}w{Ked7d@IyXjy=q}!bsx3j<{if}i2Gzig2sN2f=6Cpyxs}b@Qt*B=h~*o ztSk0X*G4AK*&XqYq{};Y6j>>E_D#w&dst()j_4Adee(P*`O4x0*0Z_k;+ao!$A5&* zrlgurQh&PQ*?a|l|LtuiCr%mXQ5pO2v}=M?4tDhQT|j$QKVoD!vobkkt;wuP>v}aM2~PrE^_~J!-NH0g-dP@3>}{Er%bu$?}{ySwm?3FQP(7x_o10 zYgQFUD;8s#^ZU>Y5wi3|UzK|kWE*|$(xy*N6<|ahNr5M;&7z*sV=EOOt$-qS=dDF^ zw8i)NA{J4}>!ZKKrl7437uBgrsMuFM8cx=~SoA-H%)1~fC?|m;cvyBIdr9=oQa4Q4 z$T-cwumLr2#j6tQR~*h3jLmhC`QLxzLGD;@z?w4Z83TO^Lr z;8GJyT7CvjVprGc`d0;iU&Y%-qY7#N4D&RE^}choH(r8sZ67r?9J4G8_Mbi^yWX|i zHFElCS=Ny>qYRJ{HmZ1AV?Dh#q*h6ahjFmgzV4}jS(*OP*>KaP z8nKx;W{ruCX}>ekK{=l7GP-k$g?-ob_HNlQ>Yz+Tv@$9bv)p@XU&FFefTRJ|6#VWz zSYH114<^qBgAI0jCS+O_U9milqzbnRHupk$n|aYV-;L|p5AT6guo_!Die}(c0pF{% zTbuurQUuwO2SiDwH-SN@(Lb8vPQo(2*0ZQ`$TmX+mDC&d4x<4ag3}!By$8#MK0F8flr zH6wK2FyPDVWb}^qx8iaSeyy^;%i0-Ai_(sQu#0Lw%?cDN$>}L~6}o@{Dgtsj%&}Ml ztGX_SHSpQ*Zg??Z$^ZLdLT&>gqtB@87^stl$GUT~!oq1faB&qD9lj6fEVq5~&|ftC z^l2z?72O3}Sa*&9U_A6viTp{JjEok)amClV&um=3`nTz~8;;$?V#05#Roh%t&lmpu zvkFr~elG-@Wou0b)Kx8!o{66HYm01E4=0?~l#r#wVY1w)Uc4PQ+|Fc~W)579E~mt* zkWy8+y8o4CQkqhSpyFopxYH%34oAl7T91GYxb9iV^AxjP0cBTA$l~p+B^%Ki4Ie zVyZvkbdAa13~}Q>SLfemQ^y;p5t^`V;t9?t2ZH}M)%MYXEx*}=*!L-JafH&83h1fU zmwsh$DEJ+<7~5<;T!OK0*UDV(*`)?jjO~d)T}WQIXR#7+lL?i+J72@5EBlVpjOu)= zfHLJw_41@ws+9kHK7*#?Bwf>zg98aLKCt-v^FDgCvi#3(8f6BHdXQZfMV;++rB0HR zPvRoMxpo$x8AMqsp~V4DFKf~9zd#?4UphDdayLCpUVo-O<}Za$?^NKTgN2jL@Y@ja zPeiJ8i`DcKSF#j@nw6qoH?Kop&EVB-jm#|csIFTq1p=_*3bXvv-rsQ}+Hd)!1V!EF zYnaE<+E^S$!?#v^xVBA*F5D2)-0n4Y`9i^|W6{?jgRYBb!N;3VpT_Ed9&lNO)Fb6lyc|<)z0xJNM@FSw5M8f$al<8CJC6sk^5RZC zX=Fyo6*E;2S?g{+IJ1h9HO5@#X1FSyOcI$Kwj$)Do`-WLuDk_IU-S%!1iv{5BpT*6 zrd{7+*5I_=8`vP(S$AfZ>Ef|jIS8NCsT-XW1$C|jQ4)WA1w zY=)&6n1HyY;A%VZ3EJ~JPQa+q_Bof5Qsft^che#?Q6(GH{UtP)rPk7z;yV#e@2SC; zjy#{KwXoyl58m4|Znw;j^6E!C|d(Y2#7McmLA406`*>f+DrcXg(cO;oPev z*5i)>H4!K4`=?RT62Fvz!c_WUAW)d9pfe|>mWAA64?UduWX04+2RA?6_}Q0n`rB1lB`z69b@Z@Lrj;rfjpox@NLhn zc;i>ry_dXLFW;~(2zkGVfT#wq3fTfx@DRsV-Y7RUii_6qkH!{2Z#hxU#u~TSk%lU~ zwSTr`n~t7;M?Bz&#|UsyN8FrfIGVCs7{K~jUF62CW|u&f!D;bqzgD-jGH~16`?vf8-3o$frtuVis;6U4dSD$`y90MKzZUw_~RT< z^eTj{PXa~4L<1O5uNRkjU+%SAKB)kCZ0L7yVof|^Ew|Fi&mU;d$Xf1e8R&3Pu>hsI z=&+-XC$1DNhC!deLfa#UKz1x0t3`3-jUnbTv~ z>vu-<%03?*Tw#@B|I^Q7_L=soMXXk~pFViLBRO(EyhQFggKlR%3nasv>(GSgZ^pz^ zMwkIimX2TTH}^Aa$=h(f^!r6ozE_sK-&~RW!RIFy^ipM_63SN=g(eB0bUxg-{tKqK+`Rb;d;!wm88laF{XZecX4Z|hoRIJ#|sic zcEhs%#Rt94H>O|U@Rh+1Xbe5RF5Ljsr8&nf?TOxYQAsL^N*-RlbsKl|b2$1@&Q}_s z|L_H0J!kU)T9WCjN!C5J%1sBmgFtOhg)8V}bvm^pr*^=4(X^>oK^;CADT7<(gLNk!a^ zd%bo)*XLqK3oh;Jtj&*IADECR(8B6`a_7(0-o3{qWEnJ=fPF6zaR~NV(CIbXfdm;n zbD>}B{aRS8u%oiNhinl7CV@s zT2J61oa?4WA=QYZXW8NgWK2LRthh%DF$X%7{FTO_LbI;buJkuf2*)-jUVj%EpTpvU za;|54Q3ZuXjk{GHZpM|n5cD->K4AQ$WQp~#rLcGdPLRzRjdnra_{`?b7z#mr6KPy4 zOWqt2mEREgl8y+j~pvExJt3iOvPaCfd*qE#IN!rov%2|64+D`}_O zkF8TjsCQ6Ux3I%j550pIPLz@bPcpuY z`}EG>o2S})`2HCi;!)w#qB3l8OrEEiyqA{y=4Q}o|8%O83|Pl$T&X?LRe4eJ=(iZ` zsaf?hmBmJx-7Q_iO0YDpf*wcEI|4G z$5~Bm-d^P6ou0oDrkNPcHLEVRxgUQcrqD)YuiveaNnDrQd&@ z%pi0fzEkaaQC-S`oS2B(P$wf~sQ2{cNi;!A1{$|0ZnXX;P6CH zoX$_Z#E_LlH}E5}1VNy88E9eCO|F4%Tp_eXt5YHi(z*0H)bg8VEw)Rtm>7q;#>NvH7B`VU<((2nN>+VKN< zA4T}*@A6uyTHy&UHPD%&*0<`UtAH>P6(v>>hq*X2^8uYwz4Lj1&xJ+FmySqzjlYp# z1@lO$w6!NiLZ1L5BtUx~_@Ry%qFztW&5cx5eG?P61$Y5fQ{54vHPWKWg4pHcUL{35 z6vt{ZXlaOQ{Y7qlnNU+$_EIFa(Z-C&Z*89pi$mBOv#$&XJSlMP? zkv)PG+aDHQlh3%o0zx-tB_&5`u0DBak<_(n1g><~d@{l>Cx}Nfznl)5@!wBYP+Xt~ z$xL_sLHXDWdiflbfrEmOUBEBv|3-AGAL@fE?%gdD28lJI!`OknL}&4vdF8d^2W8Gd zXXNl#`cRk1Q%$U91zu-yn28eq%xmagw<)11N+)Pl}WIADMc8gOrUm+`c!_scH*e zyNQVYZw+J-KKB2{7#*c`i?-eiyuAU`uY7fhjctbTJ6r3hrw29A`duBoEMtOd z(+*~?SNU|`fNiQ%*2%kN9qux&n@AkJ$R#@$DYierutFNmzSe^%R$oKft?=pGI}SbN z@i(5}2YaGLng4;=05$#ICWOe_2E}=}_;&YmqUj*-uc>hY< z2ovWcvCaqQlc~`Bu4N-zZmo>sNSFL!;1s>2iFO%l*`HU$x^Dgh5ns*LwN{JG0JBU^ z)dS-ZWz)8Ff-jtGd+Hk!J2&HRXf>a5YB`+{EsDQC{swD_U%b=*Ec=VBxzAK(Vx$Rq z9Scq@65l!NIkEbZ4jxlo5u=bkACOhdxS2ehzLx=kS;{1T<`Yj9o-4?JjW@ymswcUd zw#VeGJ90XhqYQ^jr!6QVi_s3W|0Z*x`VLECosPgj5$$Mvk8$lUpajroAmAP^$ zzl+v}n^ON{+I2VJKh&^Y2#x}=V{NA1CKc4z@x)9-v#*KL;R*q4{3kasA{r^?_DJYX~)bbt~M-v3PU@*G~WIxy|`CpKKSvUVflXN zi+Y-mx9QrXoOS6X)Ft(mtE^HF8|iAoM&wr-VsH+O7yjKq>OAh9p{N84(6oEKCZ|F> z^-96*)sg1h73Kqr(Ci9zqF+;@(#I6gIeMYPx z_Bqe#gK}UZ$|lQAX}_~Oj5tZC-tmN`svX8-K)Kk!D#!`0U<75@NPhed%6a+mkJaAB zfH2rJer6DAjxTT0eq)byoOI$X_A6FmSk|OtNg89oIo#%m>Kxx7Zf2i(mB-niDc*eA zYtF>#|FVD=Y89KAb&+PJ^>qW%v(sCfTv4)C8LeEl0C zn$da{c}@Os;(bF`m}vrddAb!?-}IUdQuUc{4ci4jjABU zWAy=W<1|wYW}Df(?>nLAe*B%!b|X<;%Sbg(dL81N^J$^V`BagN5$xP_ zBBn&h8D7Kdn{s%)m2G=olu-N`PLS4Y$DEGpuE;vwvHCIUMs?KiO4tFXyfPjNqz#~r ztH87D^3GwYb(h~!8^=RqciO;<$(X91wTZnC6yg(89P{|&$1UiWjh954ZY|*g9#LNT z@q@9qGKmo_mEbfM8C{THVwT04l4O7r!9dmwMzjERGHaALhC*9y<`ztOQ>iKGN_CtX zuQ2&H14CAm3iF?Vfk*j=VxH~(J8j6IUu(N*QH00l&|U2p10N|S`|_jJ0V%au%}Oqq@xUg#-j@B2jpvG7!ulo2rs}zhPSN|~a+R8h*nGdI@kU6C zu!F^%vnU32jqTU_mvhM%`LFs-IXCQ`kFv4_Oeok!^18Jpm-;=?ew4)#_dLf2zavb? zZ>EGL!wpo+QbnAac;DZ+6S_OTCo?pPwE;S$wWfF8z80l}t=_@w))eQm;2depq+gCc zafs6(XKZoc)@a=-ltI&fE<@qLWF;l&=$~0S=0vF%@wzAv%x7UU~Sh#3<#K5RTj&RBXeHEJyaq@JAZ-c z#3|MFVXPnMVP>IrUZZos@}+IVwT>`YII?ILtDw_p@XM(EBGcA8MkP8{#8F3a11#lW zOyNvB`T)CetcSRIonQ)D6m0vprbImY8vej;JymgiZ5mdBqKS~D1A_(@1PniwC8bLF zMfk$=tAJ;;R7}!kBw?=_hJkU(BH^>$$sCyu9{j*73hVnjjzRZHx`;aBD#bs<;?4m| zv`EX&@(KX+_xacHUdu~&w^P?T(w5&v--4GVdgm_(STqB4ek6$@4pvJ;tRmBTjaj_F zd|QY6--{@DUxnMW7G$lMaIR@`H9lhz zGp<<|?@o4p4wUcqOS`O$Pd4>;{;n(ck+=O2i%qSV`%+v}G1~vNvC`GmD9fnUJNibU zoac;`U9lM|h->@rd~?>MUu>!X2A56-%rL$)3)aIAnqPPZ(lQ5)zU$n7hPoAF0E|Xf z1uQ1o_r!3=7F8ChRk1pACmIRhJSmDwmP@BZmwE3Kcf2=>(u2nFn*p`uat|c_p1zJr zjDzXj@DKCLHU~5A&;VuCVdwGJO@I5Ip%MRsz4wf2a%%!c!Gd~35m5m_P!Ld55D*A8 zHbA6_bZJTnz4scdC?yCH=|w?$ks`gR1f+%zp#|wBAyNZ`kh>qwIq&=4weJ6W*SeoS z)I7V-%$~CM%?d zJM;9oY$_ftft3O+B5UdL8;M#tfvj5fmukZbI%Ut~tW`_#GxSNA;uHE{*!udhexdv4 zh(#lz3MvCxWp}#bgYF%81za+-3nE#swpz(o4EgV2G~$sl;8yVakDAxlrUFTc@|5`V zVo?TeT%z#37E&KuE_>ht3_KFkBTmgfFdY_VFUfJy$& z{1|TsA{JJ+S>d`wGJGS?mi18nF_?NvWmZ8%`;a%aBO>VlW%Qa;f|LJ}Qb%*(b}n4z zE?nTe^MmK4uKj{noE`qMa5d5?)8(vt=kvlIuJ{9Yt%s6b4r^Z>>zn`uwBaS+)fhs5=gC`T8+;oJ%seC9W+Ljx~y(EA+b}mP5igby) zK_uFQo^pWGK~#?E-eO9z-ADX~KCJBW2f`8fj)$7VD>_V7&CrpwikjJ_l-<mbrOWvQ|DDFS$rRe7-px2G z)7P!l)I-@MkfS-=;LmNhAF(p-WuFowBEb{z`k0Z)P<||df#agpM z50W+C78$Qd_7+HAo`6ZP|JleKN-f<=3P(6MM!hq0=;w`)i|M1S>LJw^rSE_>0GenP z-zf4=*GIE*Aouo|zNx6}oOW)^3t0^0+DLR6I4oXr->gZ=i~hcmR~?N>eha~O{mOuj zf+;t0^=CZL_`NS>=jM1ZF-LX4cuu@nG@uNXh&$B(`C+K6Hcs@C)z_kpAHhEWS>djf z=N43ou=l+&D4FAbIe`$D_AE{M8#$pxiYx4|b7RKe?;?hygVK&|96%|G!G1gs=8WzO zK6}kc#n$|fQQp#_+GDWU6h9X=2hREt$$JDqwOS)hEHUSw?{v!3C8bk7DlskV5)q1ezgSOb)k(p zgc(MstT2-Y31oV@M<)mKtK`63c~P>L*bhlA4WBK)O#PNn(KPA7WT|u^z-%?_hexiX zN}w3=VMF&TLr0Z^`!go6%<*kp`gr+_-A^vRej%oLXv$p3RZRRa?BO?kEsaBeZF|<9 zfK5(+FjJGm2K)|>_jGw>Tg2a}%pXu0amvqhdSu*>Hl?g~W&9_FTLPXonM~ozwc%)P zIcK-{4z0UN{3xUnvqnev$RyXPS{O|6B zv?*WRk%@|bR1@Ki$HXhnCiw(v4Gs+Y9R;g%oa`t zmF2+bmcy$_0k^=G8?BuEJq;)_fSeL3o8~+?7IC>gZhta#*omz2`(LWrIZF^JANzuR ztol!yykNtqaVjXgzaS=ws#?xYP76bM?IKPCZjUcs4ySjtZ) zd-6_Xoh4Oog}n$efB%hVV&0LVx$cOn#^TQ&OG*B3E)Nxo3Ru?pC*HE$&hcxPC|usM*|cq8Uz#M< zvdg|flaXO^sLxD|mw3kcObmCxpBW8weDWC$Eh!5ssY<_h&=0ozYszle0hNquJxrHs zbl%~pZ=Z+&AGDtqOOl2xN(VH>G}Mzd^~=mW_8Hx2=k|vT&!|_`m#zd_rLl8L;$58{ z8*a4Pk@z-}d-GwA_At}`CEvx9suhn;ud ztwH>Tlf_V8AkkfMHB1n@uzI$|DZ|*~egku}?ztn+sM+HMMPO~JaDQDeM27}4st?dD zrb--8!gK;V^Y=OBKOBuD$4Uhl~=s9&@EiLfqqjvsrak(9ReH#dKUr~Ss;GB{JS zO&T&fn$rl)-TE z`fZ{q8e3g5^5LK$#Zh}ia`;ebA^Fs5LhRlyD^gYd2;Ea_>9s@!fZyvdQk2E1(Y%G= zj)yyTk}lzxC9c+UiC#8{5E#^QRAszpf92k80TT-edz0!(z{}wzQ6Yo2GV`6K#8DE$!GgG>)tj3E;(}(Z2 zmZRe#g2(TyTZua)$nk?4w@%O1t5yO4G2Ivy^c`oX(ly022{tuj_ZIOMx4#5BrLJvv zl;)z2!G4%fxDxYg_BIJ+GF(}S{*Os1!nM2V9TyAP0h?v3(FLlSFzv$y@wN2y4BO%F zO8fzDSWSFovWaIP-sM{%aoc+qHyE`)w~DppV7tYtgl?_%QP%M+8^5(18(xCTOLDIS zQUWV8h{MgvYJk_X`64>w(Tuh~Lv+dkZH`ww?T%JXAx_pD7g8zk$};q!UI3FE3-=gN zQ##Dq@r2xXT>M~da-ZSnVr*bABE^4A2^WD}9U*+>wGv2~!$f=@vVzTxhN6eny8$9k zPx%u`v_It!y*2Z$2{JI{pM+&_d0TXdzBi>#!S#ORn;C1`KZ-XsJKJWsIfnFo%nJ7F zrMs28@5JjVRJN97_B)e|0ItPR*ejEUa(KZ)!b6@n7qb{e6FE(H)O5X5B z!NSD72;~B=D+$uXx6@KO#3Jk+i0V(Y1o7qttmERJn|Uo>U>V7S_%P*Xio^-uT*f zl~Xr1z-iS{e}%GUx|f^LK}P<`wOm&9;!RU1xzmBUNXUr z<21GM!`Uw$KW7rZew^-h1#1GBnQse6HOA&3{G+*^qMZX#DczIVH)KtP66rm?vx!_61)+6zy+oK3m~BoHlrUk0~K~AKpx`A7f}Y= zv54rD=JV0L^do=LDShl1tg2B_40Fd=C$Zsip3`*0Jyh$sKP6Y0TW8MH+ovakWkY=8 zDBu}le#8wj`pcP148tq_=Gh7>XQCCAa&lI%Fy8jw6h;%h!@xQEtZ4mY|DAugmFA zez>cmwP@)5eWqpYuNadu+3oOB8G0r4_P#48|NPjO#~XS2K877OYzh$tenK|)%!>r> zUnf_P_nJ#&2J$+D>dh1^BSIJFMCLo;c#w5jav{yQ@fd%uV})2X?YqFW$)g!)4LN~q zyXZ=*WW8fgmMf9Qn+^9gbP6=G=;>~jCOWUiwOo`O^=y8LtD|5aFf`SA%!iqmjF9}V zEFe?I0tfF!vlxdA{``&$q-bE5E0%sw$Gx7?h>zJ-98L;KySUd>%ck1sTWV%JE>bdU z0jz~;@dZzO?^)6! zCdnmt5}mdD5jrYDrjff6t+yMB*io{x>6hEDJPBB;RhC%{<>SZit_$D-wX80uoJ|r( zYIZ1JbUC2B5~~H`;Jr3eeDy_#@}Kyx^jN&Fky4j(xMR8fV8u^DZ{25c)D2Ba(Uh+Ru;=Nf#E+ZHNE&34K*t;pKDeG}F;C^!(-vKB0So|?OD{$!Ck#_3B77I43eZJ1IpNI?3B^4x2 zKBg{j;hk!>lUuDs*336oG6jeWtu$?=XUkfDrBUb0uO*oHJ zW(oskj){is{b{bZ0=C%q_7gz((p9VD;MHzw)Tw(fai?e8AqA0Cyx1vjHyBa4sS$YG zl4m0IMiOkUy)_I~j^DmQ*+O$8Ad455;Di+Sn_VkJwCRmL#+|4f0^pg4XQmY0WIv=g z<}&vacPAJY_)T^4?YPXcE$5RYPv33w`!i6^lShLg(dB#xf9EVYRb3k)1+ll>j^AYQ zyFXsKlRSMv*SLD}r#xiEuz?q+(!5jB48j{*P z@oPc|Nx5F$h8e@&U;88bVq#k=b)#~y~cVA)k z2U1?YEphRFTx!W4ax2Lpqym;>&~4Xz3A<8zC&c0`9vNekyb3#nYVCa_C|kYgJ2G+! z0h2ZMEi-M`o@=h)23SaZ;~FbT9)kP#i3yf?>d6+zCjlCw4a=QLb_0kQqpIr(;(m^z z@2${ND7aj;MN9DpHn;Lrw&1u@P0VEVqQyQABu0d)NeLY?K#eG<9^`*XOuj$l(#@w* zB8D~jkR>~vEdnS6$)L-D<>wTmJmSgFA zOZZ~)A29r0uU8Q^O(u#peoTYH1nKCWHgLNC(!{MsmqXCTe{0jzOLkg`W7655KEr5W zFT%nNs~>yAut=IctGC9oP0uP5D^s{C8;bSLVuAL<%`AwF?FUveEn}`%mJMdUWE6Ml zvzsZ6+rZkD%bk3X%$Kl_W9w{4H-o60FdruX^j%+d&(0U2B@k!7VeF~p`Ln~WSY}W* zig8!wP9m4vPc=J1vQPI8C7gnyM9iJS@+PaS7<9)%tD?Iiw~v}fzWWnRUEc@9?S*|z z2lebvjP8rT1gJ^(P-Fk7{zLNrX$YY4|7+mzTH$M%+GjiDrDV)E6A58cZi~B=nvKnI zyC*%6qsz^$L!8DR6Q$r3THS77p|NX|lroTMbPW@yo%6gJFDYIAuHd8!pZ}V!0lq%{ z;|}b7v1`kAE!b15|v`;m9Km^bliKYv$~21r;%8(GBTCAP>VHpqXuS* z+3wFZEdQnZGTRt8EW(c{C0^+XN>iPrg(mbpzE56$WUVxq?Dfo*2)^FNgElT>+pK)g z?#et7ngE}I0()KPoA)SOAE;EKB>MKJq{atTJs!t3etGW~9n;~z$mC3`!wOSr0;Yb9g+ zBs8#n=;$^;=DL+5Vz4I&w*#mgeBHX4XHRztx(=FQ7Pwf$*N>XeD=`j*4i069&^MQJ z1zh$so5^VulN^n$MUnz=OewyiltIb*SlJSI-Rfh{U#0BIG|=(;K^%QBJLe58M%Z%Y z>SB6EGA1)6n!4~!&vrPF_$fFFa%TIrG#|u!;I-MWt_Sw+KD&`6g3aY7e&dI6_4Qh` zEF5go16Rqay{Inh>$%x~gj?12{B}pE=>q@=$UtzjO8P*>lj}>1h_tou)wpLzxRd+9 z#Bb|>Bz7G_n%f)4ZT_6Pq*x?mW_`Dj}Qn7KhFzS9W)cp>nom5g(0wI(?Q%PBt@s zj1?;6?C@hp#tN0RG<;fDEqj zV=t$^7&@vAcf#iXqzkFS|9nl~oH2A#SzIhSqV#0&0i)*{5gtJ328cPzG$3SXB4t~) zwVNBbNf3*!l@D=Pl3Iwxi92wc78S3~F`MnKZqG&4pMr$_-^BAC?sou5VgTMG^4hzPt3gq zsEe=X(D90O&b^EAq#DHcAL;ys^>~o7@20zlXG8ZiBZ^f|lH0j4h1HJt;?;qEa|STw zU+g6s1va#onaK}qLr`%p?wh&7w@zLNNv>a*O^^6&*1+sw@+3f|M~_#8K%hFK;x zp|~A533;{JVqB`_+b!4cHdYo$r>|D3a?I|D9zU)s!+p3511d5)-hr#6zCJYmqQsAn zV*;d@KJ62Y{{iLRO?@#~JR_`q;=$5+1D`zwaU#5eG@i~+N>7Vu+tZD${X;It|EjB9 zE^5ttL0+!QEI#sZB}uk+@lASReBg2VX5=)&wDEd4Y;W^*f4K$sxR0|!x zV71erk>0nl%n11>Wbe_67{tfC#DE`Hamad#de2_720Xgfb;%)mMyuX?6F0pUtKd4E z$AaF=DKM9Zm@KQM51 zU?)yF-@2y$tp%JhhU7-Y=d@^TVgt90h!^)>C+O*YgikMdj(d;@b-5o0uGb$O>p)y# z;M4)^#c=Ek7c*?PjiV6UCDchS^A@BHIWD|dE1~%mN@P_md{&97s*xkhUZj{`YNYJ3 zXlVaAysN&p{U^k!Dagf|bbiL^zX9EO z62{=b5G)4^kr0^BziH*zkt%_B*vQ3#smh5peorgVbE>_O-4e=Tu)1ODH~%R;Bgdqn zySMg!!epxKC}4}}5~SaD1^L-XQu4A@ek0?1|A6b)vRRY06~3OLe^A$fzE-HQm@{5w zr>5p`{p!_$X@#ec^Qmo1h5RXcC;mGL!uM{`fD^C+7-iIg;l2lVsPANH)UN7F>yh>z z)Gp(TqmMR6=2Fx7&m2T?%Wqgb*1~!XG*i<#B=0ho zuuR#orv)tG?~R8YWNO=6Q%OkHldT@oF4bo}m*k1)kaH(5~iLFXnW`Zq`o%3~lzLUij z?8JO{thn=_rJgq8)EUZ+9k*rup8C3N-&G&pBF@XSq$2$NBK~#p32%P|qCAUUhm&K| zcX;44Eg-T^9JJCJLz-&&&OX$`pZe>x8(yyoJ}2g0yw#A1EY z$7--|Z=pZtTJwi@xe|juS5%6cYp+7gWuoM!*wOzY zpp>0+bK=UPLxan39@=)1MolXBmECm5$}wfxu!tQC5l_gy09<+aNm{*LB}#*{5Kp(O z%gm&z%LlmkW@K#7`IFD;Iqa^{d`L<5_<)nD!@4J${r490xw=sWSkuHDCOnj59CSeoYfrr*B~XhxsA|sPI(dR9Q~Gpc)#71a3mM0 zaHzmK^&jcs-tdeGHL#%4AhPtw-0tJu#*6*~zs1m1H7W9I?j7V?egx~1VeyGyM~?sA z;zjU@ho6ZsqBikHTozXlq3|HAwMRy)_X3)d&u^1GW~AisQ@88?MWDIc=0t4wQzq0x zLeY_C5?DZ*o>Q*z@>=u}t_QZO$(6sG;&(jS^!UXS(u@zHV2YA>8tyBEW-+Jc!xxW%y@L05 zm(VaO7tFT1EWs0gkq=*I`#rHzIe_=z_J2qfK?XOjjFY7X0{kA&I@_nv!x3D*SF&@P z8BwJL$+7QFi5*`h78+K7Ptx9t>lPCiIP?{>9?4#qo@ZCGWHNPg*yJYJ$74?2`4K0O z7`4tZEH&}gfD?Irx5<3r!7F;quofcuJ#~6vm@3SpZ|%9Ms3W3%%;f~8YWZJL1Jom) zM^{cZotN4eVzC`Qr?H+D5^!|Y!-^9wkZm(9DI9pIvPu1$6u27M@u$FRcU&zQ?iLj+ z7K_adCNdTmjqN;NBd2(O7OkMgNcP~46d9RqU{s>^a==uMt|3wqsrjcEUdL{nCSO=p zQO?=h-T?Oq&3${b3Cwss!ct50pn!)Qd)9wA{jKWzUj*-lHy0ZAPtB$?C*~Q#gB;Gh zxV4(VdPCDj*IwTs5u_ODStgt6JNMWu9l;dxVQVA7wo<|696u*Oo&M$rED1;i^=F?fN|%CY0x?-}f2kN!7MCn_WG2*C^hMukW}fY8S8WDnzpjUs|p%EV<6m`zQcR z={9YCJ}52o3pjM~65c-+czO}oFV7etJCE@g5QMv%7}luwpFl#0A6-%kP$UC`7Eo}w z3ynb#bN;#}nnN4%C#~)6rf)XCR-khCjjr!}ydB!^5cn!#3aW~ol$NDXMx6NX+`HE3 z!71zE>lzNq8fGE$BN5qJbJ?EFp0=?(f_s6U;~xZPjCAV}C~$Y8*&C5VK(1&M)<(Tz zI=G-wSoe5)oR>*Xv=Vr}(52EC-|e4O%-jFJeY$ZX;igT*G!sz%=vsM-!=FtFs4L5Z zA9Pnje@VOvPx$J$3YFb9xL+n>-+Zi^j~godfI&@pcD%vRt^`6qADuIAB1WAUc}5Uw zfuK)k$&73Is%g&uPi+MYj-O@Ra+mg>T}i#pGr}feHgW;Y1XbN1)$jyf{=bEraW|AM z|2+=Wa*u4KWHBW`jP!?6zjiJ2^uDz>AF>*tMOUr4M;(Vlo_5svyUatrL`NDA!b))Qj+<%%0(l=X`k7g9JH&-NiYJ}`J)UjZXw7FlV zc?@PIc9OE62ix*74r#8{Q1nbNH~>0q3=+*=t_Q1Z3i>GzrOv(`r%lEWu{qlh1)Ep= zUE}f4S6b7bhZ&kjVTu+bq??y)pw7D-d46U&-i$vEQ`D818M58lRNi;^_GDpidUHZi za{ByFv)YG&aUfVzD@qY+K{OjxN85eO1QTL$zQ0;TwQkb}pMy5P5wlh}B7!>(bB=(l z8Zp`SB0M8N2&<>^9|HJ5PP3wZ-|$AoG#% z1lPth5wVM!1gKeRzr+m<+^2oaznzm`aaTY=S0GPr)|ipIRtA{lv?PakD6}eT))qpz<3ZF9L>hz^X=r1y*+**j zjTn{QX^0%LcMoNbMoRu&_scJSp0upa@hd_a*&NP&os(?I;aoCT7uZ0fr(f?&FtaP9 z;W$nlKn-^&PT@Ny!DqTB&!!0B3<;s09M0O39QmD-Z^aOyfH?qzu!{$s6<6Dx3xZu$ z`A$daPl*O*wzR}RWsDzISOoNbgb(95YX5@uyfY~YKeiE$9l{!u2qBk8YPnPM`5d%n%{g8 zHyN$#ls*BWw)fN;QB87Bt&zh6a!qEO0GK!R1N7y{n(V|y!$$rQ-rwygq zPUTh@c+_zr-Z=hozeNMHZA^~+w+&C6x(q4K2ns;F?WE9j%HW<;OosLb&%}e6oS_H^ z#`8=?Bt_GY;G-Z&=Bl$zILC1pC1UQSECkVfssRUiY>0>3k8K9F62l|J{@dp368PB`@j!0j&eR2RSNuo?^d?e9iGp>;UTh8%|zD zl(G=CRW9DI5b>Xm4Ll+F1F_$x?1H#_CB$WdPBeetbgE$9xioRq=9dWI5jXUp?}9wM zZ*{m2GCRHs{0nyXysN#OS?POd?QbfQz&sq}J|oGaR~EqorsFnf+jwhV&1eIH3}`M%ZKOS zFRKFw*&Sce?~k`zh_z30C?V=oTtV^e;1CgH;)m1h4Nt-1=nkSDak%<>h8~rEV`b=A zYb?&%G-!{)f^EtnhcH{c32Ftcz7q)y+mP%S zW~%{}?lx%ZaJc)=mbmo(Ecwmb46}r!)7X1 zn5*+pZ!NE}WL{=E1yxC6%Z*^GH2?kT!$2^{r`PmKI+y0>rET~!D(tJN-V`@b=XNM& z$bUq0s`_IZz^iDL=9OrH*dO3xQ)gPU zdg~h}u`1Dw@vq|ds~9b{zG`x2mZwA=;?&uQDV&z%3y&%8|3fT^9Es@g9CCRq5jZ(L ztpK)u!=uyYQ*68uqk%@7mHFj(m_h3J`1$BZY4^V?>a-j{)$H6+3S?K=c&$ME6KP&d zR8-5ltZm**LX<%7+Dfa3d6>6znB&u^ZPaTB;d9n^Z1-Y_6e5NRO@74tPK_~sU zD)WEtYdE4HRe}=|lNWMfC%OKT2Cq2QO=BG^)iCD_9TObn{N2ksJk3jpUa_&^?B#Z4 zQ(I%jMN?kbCgLqAj{5Oe%31>>ya^R;CZLNh(f>zOj`?n7wd$8kFW*1~hfd9?gL?v{ zw43Hz5)g%H{PNVNtu|{UM(yf@E>c+N#-&S_m~uw6b6-*{zSH&iVe2wR*VBk35LCUMcd7 z>*$UON{c5ns^?*jKplP12wPdZCeAPdL}Guf#H4qei;S8&7X-gYCL#lPAe0P66U@6n z7H#KA1|>(y0#}sd$|X=tHzNr&i)i8%!As2-J7?Km1({puxr&Jb&APKC9O^qsKs4yr z0UnmO_7^*j?+nr%;pA|%Xu~>KDMQkpQN&z;VA67gfp?m%A;|n*MN$7BP24M>NhUzr zjWix8l@iNsBJVFX(;epI_z|98j=MBsW2Mxv&(O|MT>Tvz=jl&KF*ftbmqr1XYMzD`N|(bU zGfx8b4?y+*v?g5QeM}iCaLsU7;eja5_jKIdX~qN&*L9HzwzvS# zwiEQts3|WMAt<0P)gbc5eMo0Ay@!%N%-Qd3PU)86V}-ixG8_p%pK@HP=lW-XfTJ)8 z2f-&b5C;vad#k3zYd632INF2(g3uP8SPc!dp84y1POhRa7)fvN$ z*pR0~K?OR7){0}*a|joAZdZ4p1IJ{90eQ5_2NfN>A^HySG3VAvm_)LSo%y~#CvGdj zN#vilKII%nh_3~T2#}vWQlN6fQ}%B^)uY2cSAP-Q056J`NGc-swSGvEZFu_5{&SUv zb(#UE$3fI0A)Kg0`ry7l!6BZsp|-&SwENL_8=gUaN_1VxJh@whk0X6a7)=h4$bNjtv2QD#1(XEoj(GNMRV9QEfF0VQ z&@BFH*H?$0#^gVnY5^g`azCQ!K{$6dKk@>$ME6-k1;wrS$ zto0%-wXIz28DWYM-)K;^M_iGXm+6D4lHmVAqAjGKBJF!n`jp!S4we0H0${)neL&d< zAm1&s=~!EE2<=2j{KrfMTvGRAHZW!X$Kn;4^2D8S4lDl-nO~3YP6;>;S-THel@IZ6 zLmJ(_nO)XDFe30@OZrU&C)yvB0fRl#fe`}qG{jSaiXnq~Q%3c{|5*O##jgI>A}{+n zWE}Nha~-IY;{Pp_aQw0SKW6_5&?)~rrCe@hs6eJyky%B=^SZ?+mg;gDe&0qez zBD1qQvvZg7zvIpKganxv24q^TvF5isR+7IF7W9ybwY%d^C0_D-hMRktwCLKEez=vX zHzfx5GliD!>Y&sK!mRM<=YPQ%cB%^J5ws7Xg}{LlD@O^j-;gWRE|}?OqCKiCmxS-w zZMNINTbBKH+iw_fRF zSw2QnEOTB7SFWyOdppNE_z|h@1z&Ysty>%4+cHI4acmAF71ip;h?XT5xB&5QN}RxJ zD6#I(Kw+_${C0UOxlydfxg|duD{SEF)uUu0OPdVvn48R9R^9nk?c2|*45&ZV4S4i2 zA{vTDK4b$=G7U>oz!E%)G~dZ094MS1H@BN!uebx<=`5k>kwpju6WtH!-2lcL9HTY6E$ijx!s7aYEj$$oHqm&Tx>gjb}^ObUc z)smwRKjn`M4c+%DSGOR)Z`6D6c#D-nZ-g{oWx4O9K^-}traC+~R=xZ)9dhEV1P&t% z*Ct@U`;K1|I}{Q?ZptUuCaVoQq@N_-n1IW zM8~m!Ser(|D;D+2o0ZGUjO%N53JuKIOSa2_)3wtjHCs;C77MYCf+3(!mt>Uaz551_u+EysS*w2$#>zURb; z9N-Y>H2!cw(&~4U<(Yt$onU0^W}NSRSK}8_ zaQTYaB(UDmubl(@${oCf7xVlitkcl{UJrh@iuzm*1S8Bd@U~{{Cu4q6rZJMK)q`e2q&Q&Fy5y_{4E7>aa4P+HsV!<=&_?g2d-nvAU+#JN)m zT1}D37zv+DY`vfjE4Zt+p7D?bvs%d!x%YWUqFvhM&SU&9H>cg2-z^vBjQzD9o4U_< zFbNRvUQ023`}MPa3VHEJg8Jd2)VwN)61@ebwX$A91zQc$E5d z`?r<6`tYlcW3VSaV{(T%vGp5FI4%ljRB2naO-HD5_2;9?zKa6MnnlJYoFazyEKjy~ ze>`R2Bn3{9qQmbCkUXCD)Fo#h!PCtpQq062coMt!$%uRg*H*cO)tN!&d!M6~6F#Fg>R~o|?tLy+{KODn-!}l> z=ybK*6jQdmAl`yYDCCW@C1s88nrQ}XG1qHlvO7ZY>P0|u+`I*NEf~mU^YFDO`PK2A z;rd%+RvMI(joq0T3Aq!U9EUmc>z0!bpepB#;!3ZESPEb~6*}5sZ*P7X5+WUUq6*sd zF3z!nU0*S~(;Owy@its3G++k97-N=js(JdH-P)wj*%2U7?!APdc?g7}QC)kK#%m)2 z-j~`~{GQ}MZ~7ETSr(~*a1~usFF-LAH91imy*_JNXw4A(GZ>|xsW&yXA1lnL+u$^+kyJ^DYa8hQcZ@L`X4N&mN|>^pZE?3T5L)!(rAEMq z^_X(^{xtCom&fWw{K694Hv%E?1RmRjK-S%B!$iG`lDZLy{Cny+umE^HqM#Z?&m^nI z`>f882K(?U6A2(Fwm)|f3pu2{VSt#&QJC2uLxOo~pNwYO--sjtbf%b!4UU0_=Ir0^ zbPCWut{a>c$R~WGg@tbvBDYhb;{6>GJ0I^t!gC&&1MF{uc-3RCY>GTGGq}G(p`3Rv z-KlEh0)Im*Af9r5Rn6@qxgbXR!B?)kI5|H!Y2~9)vsIf8^rolQK&XNarl=aUYYSi= z9P^v|0Ev+UU|F-9ts3E*fCcR7D5v<4)cH8wdfHBKrHL2d>G7MZpw`8*ih_7vJ|BIae&gJSv#mu-KI&jTbTCluZ{xVQJxs7^Y7>Ka5_ncW*~@w*Va4p7f12L#PQX6HoDff;3P zh32H1n>K@JV^6&Bh#h{RC506@%mK3cd*;XGjJ>K4bLKiCg%+yW$pw^~3y|MMJR~D| zCf?F7aF|l(0AFEiCn3AKl}8jmV=3IUhnv&a;PWd^1^6A0DcC+eg?tuEoTD#+4 z!QCzxjO74ISH8Zhom#*C#dPp`bX?8g9bD->tNwMdSo-E3jsZTZ*Bt5yUUdg>37`S) z5B3A3&x)$6TI*~^=Gxz9f7#|$zfEeHQz#!N`>rNE18$VMCSC%EI6vuN3l}$pX<9uQ z0wQad@y&q69>KycE!4}bIEDm3d?yCNHMn}86&L2CZp4gmXVD~a2^`L)i&Zjw6Gwpn z(tgqDkZm3zK&1U9`}IMi)_OXnx!YQs(^^`AZyQu4yAmm?%)Tnl~`juydF1b zipOGwNp;QjiKQg<+=HlqOfFoXo3x`kDFO# zx?x`my%Ny!mch|Buma>Lgjy9thWqV3)+wEA{`t zNFtczsoz>%VlX7ZknhAaEV3#v$WO0~ycf(D(BF#(m2R7QWddKcgVfy+v$AHO{pPLf z5a7ZR616}z6?ZTM3YPepdI2Y(-3vGX$bvUbFK#}5Ykn77IZs(|*>(|95Ue#=bxpGQ!Z}E1huI_;sHAgkfT9iuKOc;g@ju)!k z4X@!HfXA2tMVF5LNS7{`@8XhjmgWY575T9btmF{*C;@5X$HZ3)o>WRew#cbNoVQ2x zJ(|~)vm(9zgiWC(K;t_N^rf$d+|t>sr{(r0z4pHW2mYsB7hDK6t;fWlegCY3>##Fv z-RDoB;rA~f${#e;J_ZZAQ$8Ch%tx>2RksxlCsRZ^fC*&<46v8W1>b6q!-R}n?I73a z+rWFC&D~3GSN*ivEl8oz7zWch19jjvch5=Sj-p%&lA4K2rf|iVg8ElZgDwiZkQFDhuteTuR z;xSZk{r~v+15EvoF$`cy_y3JphAkSdnpBpBCah4fvvr83>lZIRJjMJy==0l<5PG+U z>rd}%wjZ74Y{~<_4V0SWTm&+cI6XbBtfoj;`-lrv&k^HHj;c>?^)zo|lgF7kaO3_d z_X~n_5AriM<`idEP|{4 zme=sO$c-E1j@O}*7hI}2PRcAQQ(rtYS1YVzUlc#Zbr}XhknR|-xEy#+YY3z$s|=ia z&g;T#AH|l9AFyc6#JbfaQyGt*I1Ma(ph{KfYRh)#6^=cNH(buKxDPXOaCEEL`=!a! zS8~bw!T#X{-DGFQN^d)q=CGC`to`FV|1}|yw%lRBX~+@0Lt_>a(xw`Cr>Ld%s(W6; ze1B$rn%cJ3o)A37^<9FT*E?RHOW?6uW>?alTk~RM(Nsp3mEz$0321b>#&G2sxArgB z%5}`XFDNeYmSirxH7KnZ206{g-IwBWhUY_;YkN3}xj6l1zho>KynOo{O^qCF{Vuc6WoYnSPINpFW(MBiUqRc00K|2Z4Ul-R((^i<5Wz6cX(8586aNdG*k_O%F+Z zn|wC6{E|Q0^kYZ_UrV+DLht9LjdAdj)KnGbFp(Fel?H#_`d0ezUXV02}3f7s|-@uyEK54sAy!_Uc4(xr62RMg`I zG)$#;zN0X9|5jA#>~~I?hX=0qXtx`sPfm7+8APKR-%u!~b!JH+KmP^9{VyBeWMuit zdI=-o9mr21p;pD>Un*w`l;C*=riGKY{{ivqGDrN9NH*y1^Fp_b8iwzHl*M}A!Zj|c zX0=UBh>H8a!+rrUZMLW@T8Ir%z8~%v;kVv4yQ6p({p%kp{M_^=d_<0ar8w#*O4-72 zk?g&$(GlMv$gdeW0fB?={_9pgaV|7@QQSk2A)q7v+Xff)7P4FLEc)#~UGO-zYGZSs zN;=p)67kLtG(;;Qqcsu=%}$^A2V3{gG77K6=DE$jL2eS^3*AoJhcSZuk^i9nzN)M3 zM;kl8+4yvB85d1VL%DggP{j^Ni6+2*l}`(E`LBOA)mtg5XNld5K;n*EZ?02S$a5#x z*M#r{CgoGL3jcuRlIy{@lyjkk(Px4T7uq_6SLd5``Z;t|c`p8q+@sY|J=t97)sVPQ zZN^3&P_tm2<6A4!e}TS=SofWWa63mR7V0>gSWOrzMpowc05)oy+b^Q!o-voAZZC5Vos zA>9}RIxG4ALC-U{#r3m;)0D2rk{nKBFT&PRuDM2HReI~x*?(ZCA9givvZ(6f4PHG= z>XK;js@#rGU##d^mWY3#|6_8iCA2`9yy&r!!}-0W&NDc-FoFwS*gD1hPZz&VuuBh{ z>)d%rOJL-%%CLXd^2;mP?s}Lh>Ec~ihj{L zms|WOD;GbtxYktLtm9L2>H9PG_i{f7(%#LZ{ySc7Y=!1Qdi9jp8N1DdADS~ca)u_qU+Jy2!;L&N zB#{W;%?qiMFRq$DO;)OJro;(chV5ZF#-iFs`8G28i3bOh6Eyagf7RfK`?M^3!?12Z zyrlp?klxCxe40Z=kEG>Rcl(>{POd@a-k;n}klOT=VM0N!^h}9vZpG7)GV_#N602~& z=FG~gL(SLZOakbbYN-V~U$>_k7OYS^o(WLDK{QAl*hSs2av7S5yjVXilu|ov;B#EQdwQTy!CT^J*48dW2s9Z zU7t;X1YTSizWaZ%_nuKrE^XhpTT!f_ASx0-sR}9r0->vjfHZ-Gh%^NRrG?%hTPz4j zKq9?KkrE&fTIh&$6c8b_&^w`o7J7Ln>fYD&yz5!_x<9|`-CwtynRCvWV~+X%f5%Mz z=APeB3)ue?WjvODLZFQ(8YzMQ>h0^DPyHYe{5qu*;+Tu68ei)kaim0LRp($Nw>7Jh zO#~2P=@uv6u;pyY_A#j?hAbXKKTS@{VAQi{tQK`49gs>ZHVbfHUR79$7}}d9`f++E zlfjcON!etP=A#V|IXIn(k#PC)?*^q~``92sSCn{Kw7eL7tBmNBewEe)JF9T&*QL^J z4KfQPP*g zqczq>*M2?<`XbeGtToOR29cVYUOF)e^q7_0G!Uo)UjsBHMjo{i^T4v$lk!RkMneeh zrIBpF4Ro{p;6g%~*yhxnhmMjlv4lruW4^40Qc6VE2W&SxPYT5^JZhoL`W|0jb9non zTB^uvaEzgZt4s1oo?+vS;Pc1gh9jjsgSP&5R)jLV^FORlW+T3aF`acW@HB5VO6m(y z$zk_vEpginCl8tO-$*Z3c3WKZrdk(Sw8?8xK{HN!A2B=Ste(Z&{xrf*XCyttl3{A$ zYc{ea>rIT>y3tF+eSz*ejhOtd*wU>G%MO*+38>?|BXz}&7g}4f-DYTdnb6lWv2-bs z86p;g&SZRqfFa+bhyGT&cnm##KKmGY6ptY~`lnI6p3`m*T7HWb!8BXMEWcQR8Pa+o zfi+*i5JNUR|BTWwTHid$Wv2B zmopdlTxRWI#eFWW>NC4ZV%6l4-k~Be8kdwb)M`i%p55yhk-lsfqAxU5 zx%WA`%AZZs2k9#Kz~ZBZ(OgfsNmaPSNU>twiv`~a93CV?2?D|Npj$&c1Lnco7?f;d zJc91s^X1-BwDKM6e-lG4DWde`jMDm!t-o!kv6Vfwxh4_2mL6T^-<5`nytBzGAa`M$ z>G(Fa{MgiS2FZP%!L||QX*$2TS9$VJ3@^|3=6nE)&AqDU>UNF$2j-_9KhpdB>v_AO zThB`PI@dYMGn;EJ^Lpo&?9LfmF1W1Mp;{X8qHwR9EqVqy#@$S`;wqI;ENqp5#MaEM<&C@c%r%AGLT_wmWw78=RKNB^i$_GIg76HR2tyG7w#)T*jo0 z$wFwhfcV*>`HDm%lHmmQ2%P^TI-z{}B6Epe-Hl*p&=Ze}JQBbFs|$^;Ad4|+-Qt1% z6mejupUN`QM@Fy3-;`!!kYvb+mGs1`kRviirIS5#Zi!ZyB3B!&O-M(!g**!*h-F}Ucvo79RD6~z7i5XGmD^QlA)#YY#&yp3$$xu^mO13>85A~L z!`bc(C1~ugud~cDWOTcpZ@n&Xw{_4C-88;D952gsib<+k*r%C^`qykgs7hd`6;F~f zAGjSIJsIvf*$u8CCc19TOrfN3Tw!K@hC`g8Gau=y!5KBUK9{YwCN0H<)e9 zeBkPF+-Dp&$?R04@EgXNeMe!Rj-eI&hIE&7_J!JW-Fh#sRMQ({9nx|tw}{`P2x^5_ zc}h$hT*n6x`xi*_ZaR;}2k;XU4GDW0eRf-uWmVCE5s$}2Jb{pV`b8$z(hxJlduM}z zEnS#-GD9-vf~*fN;1tY!;Yx?sK7#1->D(Ll!wt(Uvj(Pl))O9Zj#=<#m#bb@{n!fH z3URLQWiyVl&FRZG=02k+P>na8`b%l~E3P}frlB>{rH{L6bAOM1$p2J~bx8=3$3=Rf zoEJ(ah)4Ma%RiJqAEt`P6hFxFp3aX)d{B;*MJ^QlmSPxaZM$baj zB&?+Pap9TtCp=KIXK#1&*SwZ{*DY0*uP{OKKG)&K7*)`Rx!r-K^Y^}_%P7^IQ8Bqj z-q^BoKQNj=w3fn+N{!V{1j9&i!d4@EM3*ZpEDkh3uo6`u-G8<$~8WX=ovR$1ZwMXo%hN-k{y>9DdHU8-Muk9 zfk4AA31Y>eMJbI|dpqB%UCpuLGj*acYl~|Jc-2DoD5t1N0u4h zs@tAJS_VUn9L(gMquTX+&@~M1 z^24li>A0&eA3KTkKg3_MREOi93h1$4C=DHcM0i?;74%E!BUBU%-iR8ds*fIc_4F8S3?y$8Sk|Z*s|v;K>_*m@=lM5(w+;Y0bn0|`^k8O zeruCcF`_~Bhk!*T za`VM}T&)&37ylJ3tNtbIf~1p27_VyMZNt zWFG4JhWi05PE&sSPF=~YwQsVq2UZ?%1+>^=sTFs49#%t)-g6zV|P9R!Ywrl`gdf#OK z!$N6%?QEHC>l1IE`{f|6Lm0|h&l~S$jrKc>S6@c_=%XIo{H`KWTY>Y6pJSu(@~1DX zvp{4$lza|1WK3$p4U#_CgTQzL}9pACSRz7I>b>lR0(<737Wg{`)#ar*C3GHU2FDM}4*sG^vv_;|W zSAt?-8B7pxQXAafpHEWkn;2i>;5p7?Jkb7e7LA)a=DIPwV(RA311dU%?SNkQ;i6v8 zQT&*b!DiWxK{G!B7E}GEk}*%s?1Qr1yBei7cf+QUpneA~zb9*R!)GTZ1SQf-4KH^` z_WjeQakaB$gZ?@Z@K~YHilSLhHbL;l8#xnO-rZ(Wrk^OUh7_JoH#P}WU!E(zhxrgj zxrmtzFQY|7@QIWtd*;@?ck`c;Bpp*HPEe~EYon|ZVos6TqVUY;BNr+5j`Ko=rFv`HGI?)OC4#HrQTso9q^+>gBXy}t#Q_Y z+h11CYhCfl_Q3esiLxL~xm}IAO)f#vbGo{cIMnX+7!t0(FrIbNcaJ83D{ z#SX*!oAtb7>W+*(Iegw1&vlsz;=tXUC$`-}1eek?x?M3W+0NH{oG&qAYqV6fHJaas zg4xga=GyyNDllBl8{6T0vGZ&aoLK0G_zxC7o75o={POx*Q6XIbU4vDex}6z=0Bnp$ zB{0Q@ozt9GUu&-W+e!`F-I=lc=se*VdiCXDLpgo!9u33YT6}b^PnR1H2|A}T2J}W)tVHP1 zt<`)^*se2MQDzUjG-EncFXL%L35E!9iCZiB(b#-O+GomkKcdLlN%8tIbhlK@@M)X% zLAWzbB8*DdSNLLD0Brb4?-#QPwQU=3?#mO_pVvsw35A$b=qcQ%`rOdSCo>G=!q^}lNalh{EtL>62+ySE$X`}%k)KWa|A?K&(+7(NY z9+Pg|X*{0N-M7Q{zP0cS;w-L1v`ktJe^jZT_Y00gEZq&|_?aquCrp8V{t-V?AEr?? zkTn`Re&FZ2{DwAhb29?9Y0#tvveW)@Y7dJb^R_VWgn&lKuv@m^F$UH&MkAlk&o9K?G8r+%!`u3)*Fm|a#!^xx00(eB%`jxl|QPZ*V)V>lEv!Y z=nqA47)>gSERN447?_4eb41yQB%XBzTjA6~>I^4Y;jB7Neoz0d0e_j-#1SgVo?ox! zawcD_8IxrLRMvefQAMRicV3#QH>%_zBag<Mwfk1w(6w6z4s2fa5CE^CB=uz%ob>_03B_XMq(E|*nT z0(;<+69>1A&R;{iXo~x_Rz7qTu^(%qm^;lt;A#1T)8XUA0bM@qY05@AWuF|vtgcf-z;FT`gSQbdAcr5E#{#dKFR|Pr{(5`$!v~YScTn-e$RffbB>eO zb$}SK0K#fc?(Us{`@cjRj<)eqcuD(RoN1WNfi*fEWo?BbY@=>4y6F7|m!CU_j8pxr z-boDy@kW14#KF>{t|Bku5yxceht1_#W7ziH!7-ABJ_ICc&Ne(yqZ7Km3XLpypqREa zBzUFuIeDz@=rm+YJNWn+(uhsNh#2El5B=KRDInlD_=QK4+NjwA8hOp!D7PqV_XoMA zDD&!oxJieYb-I8MlED!M^3D$T1vC8s$7@GUaU?d6{dEj|G{b+aLEb=y~!;exY9*2*%s=U{K`3&GC*??seOo%|=8 zXcr9o?iQo4f|7=K=B!4vK4nLtaAcu*0Nkgor2}Uh`DlD$e+v1oSk-Pr>Na2BcU*r~ zJnfqu7!B%|nT|Ec0TO<5jZM$=i`0n`q$PUtTUeQVj802J^dXD*s1=F*tY(tq@Tw># zHas)_azD`07A_v@?L$U11cGP2zo3&S2WwZ}OU_I9{nVDopAOyQTN)&3tPImn`g4(@ z-ExSPf+tw4tO*#TSw_-KeSPsI^-oqKRj@KfV9F>k*hspLSy4v<_?9_CW5=!JrD^S} zP4-+jF6Qe|tYe0|^El0hnNMCHu(Xxgi;2#6R_yRsGQYQUlIrn6#AA*JF{GMQb0e7F zK4SQEdu4#anq_Yrt$gsn64s?dqnoD;I1U2ADIhYLZ}uHZEqs-KtIu(^SH30HFhb2` z@B+~%r78TZ#Zb;ru3=aMrdZAHU1;7Lv~#a0#m;2A$b-+{>Fczq|Pp(I$FNmKJ&r@c25O$CdH*5i@6D?zd(Jr3X%O z$_~7bfxT$9$QI8RBt$9-y2iY4?22w5n~LsF98;^>tFAaKa#lAd)0MjUD~&4mpZ(*P zNqy9a9f`J<_u6?mgNaQvIW4nB4#Iz)5a1j9<8{2Q1FoDQ^8y@R2*i4wiquwO_iq{a z-JfS%Yfk;X1`VVo?g4kYKR+Ay$Qq2inQ^zSmir%5LDF*}+G=#5c)eIasheHOp^MmH z(N>tg?DmffB3_~pV1Pji^ZnKO_9*{)zQ#SQf=j-Gy`T(He?h{OS(=^0+A)r%EV`rYy;#dY``nzPrq*5kR$b}>NoF(Hjq32V}A*+WeaRGJ5ldg zuuI#wo3f~NeR>KktA89N*k-{dhYFgek)AB5Pc`M(6@RMzCP0PfkL_}XkcaIu&8vK& z`YNE>>Zkm|ZlPD56blAy3TdO_K+@N(Q@|9Phl|C)PHsg5>kCBEeDi!@q5b2lnX2w` z1UHody9Bsq1PXOJp-;UGrk2F@$3+xa<1uQD&NXGy8XFwrLG|7FV;nip*<5Hq8{Y&* zVMg)2AIYxKl0M5+o2yAcefTfijwY^hV73Gil*qaM+R`Ipf@wd1iM%rHC+QfG0sZGi z@l6wsz%0~^ue>$UF^Mg9gMmx(fX4p0VOuB;s!%tA`sa=Ma?kKix{!2&{r9@&w}DW- zRPs!*DCO2IjwQD$f~~x;f?tpp-Yw|QFeLMSHjn0RXmwZHLiT$-um7l~g~w+(jXE`K zJD?JlE4Ncm!tjgt{=AfEc(wsWc=P=BTEZ>XLn|=rYagcMoyM~~kl(^{;P^%KpQomt z1Wpw2;IW~9Imfuh6udWJ;cOXqpCzxSuX9m^T$Mlkmuvf?`YU`AXtr>NPavYGaGo9z zlp5b86T~tsP#e>-q9`CH1f%~9vf8Z9RY*sVlN#^w+Ly1=T3)NLU^RHc)Z?E4Pdz&x zKKDY(WUInM-i3YRUw0e0lJ>E6Px(*P4tTb;Z1u78SuEZJ=C;Gi{peF{1nKx1A91|v z{xOX4!z}XUn}5E%y+Y^(prbxip-YR&4*njWnw;ujAH*u>P(ITo3NLJDad4i0m$Z}$ zGIrBvDzn)QWY*XsNHL2Y6zmgB{7c%JWL4>kE%Ws5+irhG>H*>4-#>ofo%^4Ty#4);<9@(|Y9s@MOpHKb&wMUhM6)+`b;@8_A;GA=JlKEp+-}c2%wJ%))dnE5r zdZ2cJ|9<`Nci;YWrSi4^zbnCp=zlR*{=V?htd#mdq9Rm8UAw9})%bp*N*me(cl~pXywEDq`p)_2N;+ z-$OcSkZk~?-d1@?{lV5l%m>*%vxy*A9wA@FK8(v}Z}&K$k7Qch_EJ`Fv*+OkyoVKT z$Zc5JfG&pTK8S)*%QGtw!0jBm`|8(l_&c4M{QAC9-tq(W`(0Nsv2wMm(+Xd?yI5E> zZ_Qe{MgqY}fb|Rm;7TAl@(!JJRO_Q0f7%)|C+cgiWLGR?L zqP*Jo_G4*LHqvWRAVExj{YqWe03zemmo=0-@I5-e_AE<86hH|uVLH=~UbbgyqLgBm z({>DfZcH#qcrGw0E#D3`YG&)EgY{Nh17A3%VFC_WP7&~}W zx~~vdz|E8GPk|xj2!!UaM|P#{TaC2fO$(NwL{wtHBNZ!Nngkp(rLwR@A(bm#x2};U$wn53!QD2;uK|-dYX5d->n1$BboNU(R%K7h_DF20vyv zwuEK6!kF$Dl=fSK6$}ZCT{!jYWl_)cF{+SZ<>&Z$RGaI!kLpp`|Azn9ak2OhKdUZT z79~1`%T$#!y34P5-g9eg;SK$gi#fu`QE7p-Btx1GmuY}pHp?i#PR47s(qnSvJTh|U zs|lQb?@!~hwo=DSadtuHmwmR@zQHLhi5>isHJwNsn94yF>#Qtn(AMnZiOmU*UccZ$ z9m>;=@FPkkhV*|ZrAya5)>xk$8GoDzjTTjXM zC*Vqc9yL_~SWYj|PPu~c%CD{1*8a}+pTCVFc%(${^(Mm)UOKbd#xdcx?~?Gz5v-b0 zwzusQcD_+@v~7g-H9-#PP2#rK^pf1fRxb_7IT!!u3I6fkqGJnLLART>DPbQowvN2K znjntIwtoIxhG|vMC|R*h?gbitb%C-Dl7F;MuIbXn-z&tOZVBhy=sA9o8OE|;a7#I& z#ye?$qe)c+vqova-X1`;%6DvvkV9f)D zA=+k7*gql+;-bby(ynSqMp<@Q>k9h^{GQ!6W-y_de2deOt1$x+{y30bG>lhxsK*7| zG0r!)sZf${F)nye$HVn|N=s!Uw8NX4*>d2=TI=AyL?#_GcaS`Hn#pJPj_P{*rrrYhKdZr?bbqnb3;zBCy zS1un*BK#RLr~Lxn-sj?w5|H@27>TDb1SUW5{X1O2J_hg#tva5Azh8W(D_aTM)GP?c zI6B3xX0GN8Of6wkoUjck4{XrT6<+$2mR5bXK*N|F>4Ja#Yvm$1 zfB@pHL@FJ-@36f3B6f?zp8A3`V1f22G96|8Jq~?l;$pM;#*fO)Sd>x5)WN<9=f5#u zl$HwO68IaHy9!$!y@c5=q>k{?``;gsp`!PCui0dHdK1)FNYpjfeJp#U0?upo<7RO7 zS>|Q|*h#4z>t^fVy%yG3=v4IYyy-{c$GyXrT<9MvDs2eU(?S|?m7~#KoKgzYp zKR;_6&AzR#zL|9q4!D8?@8Baw6 zjpOk5veeDJ9FBQoH!;`eQcL4R*Ihoikao(@JpP?C$TywTOA$Glh>4@|U>+NId#`S| z!#RRSZ&ZH>mFt1XZGRo(6pYy!dnD&sh$VfPD>reR?3=>MB3;-^O+EM-VKfT=0Din> zVOMQ(*xquP{di5oci{#hR92wt=lB!RPm)O>nm)PV^%@F^p zzO~!3aMe=Hgcy>TEUU}HL;a>Ld^8?xJ%aaIg|2`h#fM}1rD%VamQP20@`|dmF0-tO zU^i;- zRHfP(F>JOSW{=Ro1H@RnX0cw}K!IwQQu0el?v}+-Ry2I;gzlWvP7*lo=r~5q%_$9i zRaxVk7$EU(ebxz2|367Q|4h1u)t_FOae{BrheSmv6w!dvxQ5(zs4 z@O7sZi&Tq*lPu@ez^+kdOLnkL#y^IxVLU*9`gFz5D}9jMu30$s5m@gHez~IPSWo#I zds-k9zHRbr{`Dv3KB?oNviEUL+3xg?pHtJFmkhcVg?v1;>4!c44ug;rliXy6lSX*P zo&>9B=@kKsB-F4fTO~|MJ6LYF1-MI{J@i;0#hDY|)}YtsXz<@-SX?V4?sPiHc}li? zmVR!?35nP;LHyb((&Vn~U6gc5wQQUDGUEy>??{4|vFkq^&kE8SGmoJ;M;FrG2)ba4 zfC2aS^KfyylxS-|U!F5_l(xNSDT`O&?|SMO;pIB&1FSmY74`OA^{bmPK+Ph+zt8q` zVCU^Z?Q&|PnojWdJMD;A-jl6sL1`}j? zq(J`4%Mih5^Wt@}byNY}lg&a}_yzMDJ?Z45lJDx#poHf@l2*b;1F?37H@;e;#P!MB z)_nt6eP;!`IN^Ac{_zQcu7RIoelT|7B5VJEQ~a!qp6^ZS>PrW3P0m!Z6r96$lbi3b zlVlyy6UeFvd1sz`tpuOsW@!-z>o;T06}-@M+5Oq^LTASx7)@QU?wQ_y#)jtuZTq_S ziOvKcoYh-YApy(EF?*-JcPMujP<*;|b(rsW-hkv@{>}FfrvCP>qG0&l0vWP4X6_-r zN`l^`B|IN1+wQi556E8ma1tL^u~&#KEB2@gIPs@_U|j(1TL@{aWbBnP3C>p6J!{i% zU;SPnE}1O-`4q(R?RiZJ0Q3xuL| zHoW|`y=bUSiKV82=VE365Wijqte8_LG1vv5uEGsuSY-+tcP0q?Z{P3KJg=fn=eyj3 zIWYA+1>TUMR1#2iKld>^3@5V->OY)=BFStynWfTqEDsWvklz0 z3fKJ-t83%BY-PZoQTH{SkfNwINpVd*TUBY&p8uROmGMaUlEv!)s`*yGGZxq1W71H^ z%mjI-bhxG=8ZcdJx%Q53B7oJs_aJzX)zX*!L80`GOiJrs$co7E00Ee1O`t{QBVmsn zE+G4lM(<)5N@7sD_9J{_Cc*H67~#yHVi|)VWexLF-OqYD+4rg{-QGF6%F7Si!73J` zkzPb%#<4(5G&{7qAF0KR3<)ims`v9iK?1&D_aa0>)iN5U&n27xur2`DrvhCuS4F9b z_w$Uup#uR}d^#AgRXPcZy&}&5ad28QwBv1hlk*i8bo31M(;hmDU$0-it{DU`AeGF1veK3X8zVRegY5RI1kzJa_OjV_&{Zc0_i(=BczxG_LgrTq* zTS4A-^c;^pSu#qrRXQ6KlQXK=4&7&hoIr?UOC7cY*w5SI-5C6~H`#hiYGCeA7?DG3 z>?%)2SNmb6I588oHy*Ocug;C>AuF1ryAX8o1G{$thYQIHV?kz%<6w!a#I(`T3qnih z0EBm^m$^Q=P#*?4ed>2Bplw5T1nX=Rsa2?dtJQuxz;LLk`#1xN8PZHL3VopUzsWaWNd=sm5b zYmRI62yzYgLiskQj*jcs)wx;kiMKi^<6{g}2)oYo(kbMgUL7w;mf!Kx(s2LD?D!X! zChQs=Q#KAfH|HonTPe#i>jjaQYbtX3?LzOpHAK{U_$rhWlM^oHKZirhYsI4E9OhyL z82!XzG&AsLSHf-K_{3cAA$4lsf`E7bG^+qDR|)d(&oYSsuz;E!lm;+t9cVhvDBa2i z-1cskJ=}1lK_bE~wv2U1AGX7iMb`j?LrXSQpw=TwAPglgySn+5;j0}5>#v*Gq#hKG z;Ao(zrCL;mfq{)Uvey*gNHZJx4l|Y*QMcj%N>*0v!F)g>^%i`tUb-ml!f}&UeA8WI zdWe_u)T8b$C=MtalSK~Uhprjp2hXA}q?wSI=PI4an2%2Z{5=-yg;;U#A955s=4(? z5B&XbrdL8o9m}1#Sy|a`*V|Vk(8>n-9o07cuIsu$l10KAN{dZBRU?5Ct%l5Cq}&^9 zB1r}*wV^(ZN^#qKdH9k+f_1KAZc|?|Uy3vp!l#qT@(z8aA4|53Mnu4QJ z)%GJ@1o9yseI*ddwk#NQoZk!yLe25MH4#sEp=J)&1a5!d6rZTcWui2VIc-R`o>?x$ zo}wWbYq!`%jlHRvmTdzx0-8;H;iwze0?)C(kd%Re6<2w&Lg$ypEWEwlff2|kO69&` z;mqoY(h!tM+{F;-OC)G~e%8UhEri;cNx&MWAuG2tOWZPu6t(514g`!X^nLDFzshJm zZlx)0D5DrKd~o~ulKtT~mNn<*gbyCL1lvkw(8Z9Ii~H9wTXNU^>A{$wbrQnPP1Vkz zbR`)u@N!p6EWalavDnAmW*#c^L+2F|-F9Te&?ZhVy7|}iN|M!9c8y`Am&e!7g-r-{ zmDHPo`Yak#WZ-KGO!I)1x8S1g1`?0_qhsi;Z1u^JF~-ieH(9m0q!9nj2;==E6B74! zmst{$0KDkOAx#wn8lFI4_UN&3=k{LTWvt|H5s!MG_N-uE9vFz(ItpW2VW(fTG0N{f zr7>82_&RN0?z5(J2X3dYe!KFJ_BNes$y;(2&%;p1&~CD?6jD~#DbgmlLad&0mpp#5 zTa<4Jd4_)8;9MUMRDDw1nFSUIa4kyf&9+;2e>c2lp9Lbv1OYQ+_#{KZ-KgP>6^W{h z1j(i@=JhQR|GkNBR3;QvV6eX5IYPr}w)To0*WLXx6?tZ!bgwi>x5>Nk7|pH4mi7@e zfJhI+?`;6exG3h<8GPvQQQ`#-XhPYzg(ZljM|!JYuG&Du;yDH zye_wKx9%Ol7GNz;@hj$v#3KzZepWzQOh9c$1W3D#`dW5m2zt-n zvZ+4^e#nfsCMv%r6_`e*(&(Hi%NHQC^Sj3`tq1*uwH?b=U%Cm$UH@S{E13SBf|6w zNK6p;IJ{k*1^}UHS@lrWZN_k*V*yOdr%Vq}P_Kd2UFG`&qoig%wzErPQNvdHf2-Y|-}r{G&4juh%J=gyq}uJ&DzXTUPq}3AJl&!hN}~hk zJ;GjE+bo?El6cw3dVT>fvgASoVG&!pjd!9&{MU86^?%-tr+mxt(OvpUammuT!VFm` zbqIWLrGXZESVMHO_=q1)H?ct4y^i?350*7=C;tXsCo?JaF78)Ov5IR2B~JJ9y9t_o zOU=0@%{VB&tsy52Du+S!lTHIFf@BDEwTCuu9|KPjCtT85?ZtNv%&Au_kPqj{G*p#c zNV?2N0m=43;r2WBO*C5kX2hv-12^#Rqf9#+Nwg;~< z7_Ve&habBK-X)8aYe?K3ekH_CU)qP)sN>ZskJk~l4_)7GN|voYL;e*ajxY#lfk_1> z0_FE0B`nA|tEcMx%%c&G*ESKl^asVIwE-x*`#ByH_6{HQO z4^gDO^`_@s^qtcD9n0Q*HyA&&u85}#%XBQi0cb8ThKlRQ2fc@;8tbqd8g@=k5BvSj z7Os6f#vsWEXx4CK)pm@Btg+wi$&(y76Zy?mPZkTzn%VN)!f>LfK^clJRdCE=Y$nJoJaY+nJPN`zy8)F6kk$=1NR%qvIDQ)Ph8flf= zGxmWRt^NhM-|n`MSXpUX7<>OKp<_&zU}i6(4%1uMy?#&t$kzH$S}l^EW4KgNCeWcL z?L)?cTYQguY#4$8x-SBJ(UCvl z5dFiyh_2ylvw-7NtF)!bJR?{yO4w`AvYvZy17=V58krIXSWF)@6My~emSGvL|DH+1 z=IH#27W6JfEa=}~9XW}fHUhtDVb}k{vq3CM<3S4y(9K3uG^V)XeJnSE(}Cz$1T zZ}j7{y%B-xCVDbJxZ8#S;tzlRD^SS_VPXJ)gddQnoob&i$?zD8_vq&dZ zZM;7Zx8RT%U(0n@_%BcuWRqM%kC`A6NLgKKU4qOw5bWIGS7`*Xl*gnsD%md=mBa?asOioyJg2C2gi zjnmEK$1Jn+;vZYn4N4yu?t%otjmPxh$h>(3Zgn0MGhl5Ig!Hq)aap5aTAV@un$~6q zZ8ZN(l}&K7#7k~sq+(`=1rE@%pAn27WSv``ik^3uPs<7Ww12gxfD6|~2gm1X^SZrQ;Bw8&(BQ~*F z!Dg&A&=S%%xbe8|je>R+L0_%esO8R`YB$B?|Ws3=5`l0h!KkUl8iW1KlyK zu4aYEDN0p;pgHH>i_3y67AJVB+w(P1D;;g|`j0C&mMvJOg1j^DgTe-mi5XV+Nsy4t zw-@cmN=vxyKXfTVDo%d7OZ5sZP$qXTRcnWuyPrmxv{INMgE-;&=Wp&*twM4LSsP%} z!>=h1TXHCS%RXfbvyZ|$PFm*&U<3(s#c^efSg7&%MV)Pn1t}6iBkyq?PKe|?2aU0Q zhM#4Z^U$dCPp#mG%_VYMz+=k*rIs$02x#+%!DkK}Nc<@+sSn=gPSNY0p|oAuS2c)V z3$<>RJeF((#6plA8mX}F|Ge@T_T6YMTCE#tr9F|@m8^-PfmXyv%`$lXHW&-%aoKJ2 z$Us6BqV1-YmRaZtlFOW9kV@TmP(ayL=M46ZuX{Loz$&rPpY*f(IJ)0gyTfig9y{d( zICN34%fm(}bAbwk708^&(EeiCOpFNF8r#ZlOEL`OXWy+cL1HQ(Meda96D(5;)Akht z)uf_8vDqRlRFV#kD=##)$%8%QqberzV@1+h*RnBYZ|Ap+y?4*+-1N!{aE{(2qyDbi zn~>*l9;X0r4}rfcC%R@OsTVD#1LFK>-2Fr@}X`bnMOc@K}7wP#te8;5nyFp zbZJZnBW^OYG%1+{GWHDtD7ry7H5N!dR;jHSz{<45ZHh z`)6T0PFf#=t2bax+oyr$=*3~b96BXwK`2NARv&qEa`d8}b!(pe zpkb%1{gq^SGDA>bwcnJtlLxw%PT_r%Owv!6s>P?EG-0Tst^9q5-@57 z=nQ@=Mt>m#K*O1aue0WIO~FEAvH;c@d{Q!9!*HS^7X4mFX}Fzb`n{eu6wf|qtFCV;gR@`8pj4b7axR0yOX1yxrnPVT*sGV^x#{F++!T!63 z3>#Q$tj<{*N!a6oma{)6<0=lBDTv)aaNxD}1CPpR1HTx;b%8xT7O(8#Mdu?8Z`mVY z)=Hq%spc#?KBMnAFY9^FtfT?JBH>i1{fEE7-Jy+Pc)!85O6qhyxXR+UzVxVMFT{gA zZNjP|XZ)1k;jl~t)Ak=dO9tHMKr9%W4;LcRHxE^49CEymE#(5Wv;pc5*i%M#3LSQz z5{=3O!SWYU!(Cw$xOkthSi)8gCO?FlF0ky5@ut_1YBkQC_2gz=1RG6YVcdUzkwU$# zYHSuNBna!1mQTs_p4DiLT_hyDiA7%47n^hO0#y{>b9e&EDR4L&F@OQZ1lgsZl(cok zlbp6_Y%#lQ;;%(J!(vDcXjX(1gi4*Exbp}K!hZ0qW;)EdZc*3~W<4^kC(vqKC@qw^ zc30(>bR>Zs2>^8Zw`|@@-I;=ljo>JPQzn)<9h@uheWAt%>z&3NAuo=k&ZUvxr~)<* zhmRCRMu8G$`?%pAa3;alLpV|rU&lqKKTnVK<{F zYm&_g_h4|Ix$qlqDWkXN-&Z>GTZ94rPK*<^9B0|B!f-2$Wrbq zS2c?>NnV4Q%v&t-S6>FjHKJe>K#f-0ToxP>g!UhHe1G7;QBX+3ACpzS1oTo3b^iEt zN~`m!7J=57-atZT>2i#Rv_@mmdFd`=hmODjqx43%+MkGIRwRi6t21Eh25Qu zlHDC+OGq3;ocGgZzlaPE_79G7=dKOSI1@i$`X@sruZZY7#r_wFeaCqw(ufKM(p7>sRip0)p zrji0ms5uK>-BJp=DhhUzc3I>QpD>bvloUVj!#r0!)&pZYXLdqkV$@R9#bCINvjxZ# zf4^Imgjf}oXIDydO73gdx##S&!r0_TFM3H_5S& zrX~oe`p4;E>c)xn?M0MvWIllVE+NYHSFHU zP4C(z0%Iuik?XGLiCzW^Msy5_I2P`J>(%92rt*j8X@mS2P*z7Faz4#QT>^#w8 zTtY0o64;3OlFn2e$HniC4adF8%4NYx5M$KHS9YXa`!cJOMe{vr;AjT$<+MeYiS%lX z%LM?u7BDiKVu{J`uF`g{-B|uCVDzzV*=ILce*6-wjMl(QKL_VNTx_=y;I3~4Gw=;$ zLDI2Zmqq9S-*r(?f1E>pSEA~Qb<@%-MAU7m7V-4Vzwv!v6C-Ql`g!WV@$_+R|BjY~ z4B=C$a5glQ0a|GM|ANy&K4NWKjFo$?0Yv}E<=#wnttK@caqrK13DzS}%LDAC zP%CU0eW+fcP<=!WY-z90b2P(J=&TuJ4(~6vzEEYSo*Nk8jodxTA2rlsm`7YXVdrUG zW9r;c zZ{y^y-=PdE&^oSfRijlGGjDfM#0%RNBedf@+gtU$Cyy6vlNP(Zcix@&$&+)fG&gyxf zmgWUGXdxp~c{VO~=235zDJpZQ2|Y<)C3PbX_|5Qn#X~a|Gf0aeM%KPTV5%73<$=}? z`z}p>FKi>y=gB%OzW4evU*rWsag1fn`KEiSsXuHFfi}J4YkHy3nIhc}zKaO$T#=y+ z5;uuqQV99bW>XvPdAD%n8_}~WGEq?!#+G<#7a6RQCFMF&YL#SIQK}K9gyE>zmbR5+ zl_>eC76mt*yf$cZ4%hz-q;*!ng0?r1WIN^O=VC@J^*|&fRJkdHHN?CI5xm!wm%gIW zSz}FJyQtojQ7Y_>VEoNCnxzKx;MP|Jb)>BZ7+kkcy5)O5s72Txl~ge8z-8uCese9i z-1^bGt`626P^g2qZE=G`zL*zDN3>fcOP0$WuG}y_Q`a=SEd&R)xJ#o&mE}_py80+GI+UIVo>67*gsjSE?3zj|1a1%0n}%jW#|_7fa`Nx64(oLwo|xQIJvOBd2rZTfWO7>wryn7_7GQCCb7M@r zq_+BxcK4qNKXY7+8_JBlJ6eLe{BZu86PW~cLVSh*L!}C*QJGI0(GQ$f$1a~g#`M>p zpY+W43}A((-&5~A1D#Qt(JTvQe&e0lyhmr~{X?%o!(jE%VT{;wa0uAhKYjinSdNuX z5Lq6bTZ8(ElJ&4iuT-ZM5qR=Qx`;uvg@0U(LA$S#07(DuQC&Y?7_gJXexh6w_^@H{ zLJka7UH>BNq!DJ%o{|GBh>Xa4e~`O~Rdx0(zJ))un(gk}c@E4PHd-B=Af`@@mJ0U4 z>gDVGORJT>kAWY=ypu@Xu=*dXDlT0Ci?0r|`}3cgE<@EAS^tQ9zPZSIoyF_WrUaMY z#MJ3qO*2{J&ozfSWr!Awt%Gmv=Qa*^s-njDjfcXyu!wF@ees(yzx|M^ z-ZbID61b{F8Mh`Po)3WxT9%KBzzqubmiQMQ%RI1vwt~ihQ17W zI`S#^gYN(p;9%Ybu5SgIw9%i(rLTSQVz68JkUk+HGO?yU{ZaYvp?tfsy#0D_$|(qr zZ_oesAfX&prujosB_nDQ996@C*#q84v@ov@D8vwqgAOcJ_7A0%Q!1|>f?t#QP0^or zsK7YV04RZDr-R46*EE{6y#EFV*Em!(j2q99P(RIf_U8s%QD>Ek7MENd)54)@mdzF0&6Sgrs#+1C`G($uzE5u8Odq{HmTH)qqT|sv9kOi&OqhY~axG`(&b{}&_jO&{i&D&uk?#YW_%y|X^J!=; zML<8~lvOq?U!#w!3Q(0&6xxxSc)FJyb$iN-^v%e8Ss2m$G>+PGIJr2dzB<=7fkeR7 zr+cl+AQfANQAMNNy5DSoXrPV$pYKzm6MS+7-AVAeuadh;+;Ir|?fdC3# z00=J)y&?hfp@Lu_f)&g61)7dYcpb*6^IaYV*&9tX_y#9EcFX6lSOiLXYYg7i_7hfI zg6`mS0v0+rNIw&e(mkx`Xabl&>9m&7MAv-- zly!+=L+&*)q|=d7tbX&Ce#mgv()A>JDSv#x@MPR>Sa1gABgBK>GA92 zHGSPDAM#ETzKdqNW2=^f@sD|XYJ(9~>*T5QT5^#oONM>TmsyDj|ENbYe6$*0q!2Tx zSfU(BZZBuZ$@&t>S-fWVqX3(-o%~nM7ig4rW7L1mXCuoeCH2O#_wnscBKmF7B!(uU zWZs3G6j|kwWWb#VCWR+?hx(PshtQmyl;#DO?d7Bb9_h6I=>nMk*9F-8&jkn@P5d7& zK$6`kW8yzoU9zPAcq z#p6pU`}AFSo2jik+y@yUbq=NGmhI(Oj@#*SeO`ssJ9yiz0nyr^U=egcnE@uu3I)&e zWD2?4LKwkJgsMx4)y%~k0soko*p+v3kK$YdRP`-PVoe4*D!a00=Un$lzjhZ081%&1 z9YA=QX?RR*UYE?|Vl-SGtwsK^h@_mXZ#qi_fe}=EVEdlsKvPTe?6|o=xH*ln@TH7%=kx1%4fh*MJID};E@9vs=7R*2f#Jrj zW8aO@x4REbcPU)v2IzI3{jPIfhokDSQAq+;A*;hy!8U`<3Tc@l<4Y7`%W03TR@c|* z1cgjYfT3g5Up5;H4q2lMCO@|)oP)=%ul1je40^DB<6+OL2pwlC#WXb743=2LntgK| zO3Ysx_|;Gle22%d(PD|)&_YxPs=X1D@ueWe1xHNnSm=etoxVz$%VaNvI{jnEvtk7V zuPHU;_L$w>ioqs~GL<5HBNWI`bu!m(LHlRtG7~Jf2KLmP+g`;gy_W2XcYGAd;P-j+ z2z^AGV;4y@Oa%XD`uU<%Lx(j^JrvuXqEsV!qoLoBJrDRJQlRuyjBuXugny0tk(;xW`T22SRauA1=2RA>a}k&afE(1iUW2`~ zm7l-9fPQ-;@uX|N1ROa?QGx);t)pXCiEEx|L3>HR7Q!^51uzl>Z z%>|ihP3t$yEl45-*cIC?ZsS2&?4+rcuF~wf&oMe~kQ{pd^vSs!3|oH&DU89{v*TVK zTsLJ|x4p!E3|PQ?H`#l&oRh3ivQTO-S$^;JnUraD%(*m+w^!>>rc#;C(W>^ypTE~A;tz?BiiE_;WQ2!#uh zeDrFZ@?$q<+()LvJk!VvMzq%z_}z$$J>}dD{Hf4kq?vc+3Gi7YV z`Su1Is2OMH7twx+ag*V|#mDMpA3rjPxP7yc5?vo51|d29S?l4Z;RpIa8+Dk|p8vx9 zfMD(rWJqh$nryX2P=u|(u|oC0_+mhe>&Rqq&$JIB;JDcCfQT|y_53%Sigi-N2lICb z;>x}@ZTI5RPAjp(28+}>$-o$%vf?`7J6uF_^dhf&XWVKq;sPFo;7Mh0?yP2?YvxXK zY0963c6sGX^ipxm)Xl5^EH!R%d@ahC*+GhWy8pdLo+9|U_AK7B&E5zLWtS7=5#dNVm-cEd7{V01XM^)b9w>q1iKxdRA(-qrr4 z>i+#?m4TV0+F9!}|IBxm)D#I8Grhb>4PBH#UOIN4vBZ?``uU))^Lnue;29>r>oXC3 z*w{^rd$hyOm8m**)yLRlAYQoU&i>`xSQiP6QzeIvOK}~^%`3LF^jANL2+?z09eH4_ zD`osLJ5;KRlPjNW4O22j3sK3*XpO!UAlEB6I6Y|}7?B1x6{>}oD|`DU&SX-SZ5m}h zfbOx}8egznOPNp|on9E)lEKqGz7_6oO3tZQj}}doz;ZLyhJ92prwcuKipo9RgcIE> zid`z{f8A7-Rh1m9mJSJxWN)ecu98~UOTr)^Pp|xbFG36lL_GU6UBw4AW)(i4#5{Ld zJdt0T?mF8M^I5P1E>^h%pGR8F0Y}$Lo?L9Tm*_DqdrGWc^Oa*Bzs>!FoS7(nF2U#@ z7V>d|N4EBj-#@8pKnCiirFayc2uwLIPS$&trdyGj@s zMP@85RrnoFd}`eGX!rZeSl5_(2$R&jbd?ZxY20l->6qYfy0dtKvcMe-;Z7RxxLQ}; z1oJjUyXiz}McW?xEEs4H`efP0D)5o*kGc0W9^E@pgf1*it+{hm^>GV0@=O$dA1}6x zJR7`kxL55WfxT@yxVc^s(GBDTpN}sUd*OT}mwU3ou7M4>Q#BQoC*=4!Fau=h|NJ0D z!ht3dDtL>}Gy3?H!MZ)1v_O>^DLiJjATa7EzRQ6srwZ~Br!)^7SV4AmcjPb*-x5M} z=mh_uceP(PT_MDXM1Mk5II_uL_h5fDKOKB>=Jnfyv8 z?9LSo@!b$+rCzu|ppc{Mu%jxw@pqiPRlw?wTOJ1EZ>~z#fd6rK4|sp;CF~N=3vlOJ zq|{Bhh-u9IUd`6zvjprHE;F$L^R0o)a{mkc+VqXN@9VzmH5as*!RAJ3-b^SEa{Ngv zay730jqXJDbog!l9+gz_QIKF5SDZvAKI`=DpCcsO~o z=XgfDI4nN{U}Oawx{h+;$>!|pK7%B;`9?nKnD<^V*b22WJOo9i`8WfO%o`i_ymtMs z_Hd7XZbxA91Vh+CIU-uG$mlFyvd*~NzDe|xy^$BG5cTGF3A=@XCX?=vuJj}zCz;{` zs&|OYRsI+6T&9{3=>=vLR885N53ZXl8_(P-GH#Hi@1vj)zF|J}jcu)m_O3pd39rqM zl%;_<_MI(`nIuNP;~=GhZ$M(uep)Ry8Zd?yyr)ZQj9zpUxvPwZ*9`>8g49z1X^c#+z3}TNHz~ z=XIIm0Sm9eb&U?>7EB_QKi$rKGn!wXA_M(jSix2!=UnO$;vj0$G0^ELGub^UgY?#E78y_N`LaX4BRu`_(U2P|U&BTs4wS+`= zbdiI8W}drx%X|7w&_Y`l&s~Nr(>d6LOub0;s|iQEdfl2Q{O~xXB^lsW3S2C?Y8Gx_ ztg^gH|5}=zz+8$p4WYkG&}q0K`Z52KSc*(~oAdK3MIwBSdSL2Mu>z;Kw@-h0c*~r# zc*Ukf;-v7la{B7d^Cfsh_ByP^*A55|jY{ei{ z(d*x&864n!X(5v^<;L`A5N74Ci+dbL1F25)5`0`#*UR2dOovQwW7-Z~A9|ME0Q}xz z>>5&gxnKeLlc#2=(PiVF0PHCPW617ZC2^w2RI^tS5hr7z>U=xx`TR>*gy~>>w_)C= z3-a&Gu_R<3-mPj;-pIJ3^uL8S3RSV~qm0!bmNuKHxr`0#peAWE973ht_n$S6qsLu_ zR1(Dv=;gifgH3F4s;Un>+&MV=g(hQ`CDxD3F3TDZrxBVedRB!>mGF}82m=@j^=0R~ z*xO0$pPWOM`JaMVO+y#78yiKj8WGbO8wRmB;UWr>Kdrg*-8Xi57LifAhi1%i8U5xR zgr4$itT(=kOl@OYPd7gn1?h+ztSO_jQ7BqI>91;00L7YP>Hu`ebT-VJ2vJwtVY2hz zVig*gA{jm;&+YVc%*Yz)nN7Y=VzR;kZo5{8WwK0U82+L0M6k4lX~3D3j0sQ25$(EH zw97Gcz}TD%lL>OHfHno)l=w1k(&(+%fy^WxwBjMT(f2NPyEa^9%B12|3aaTKQNP7GH}>x3 z&3Ucs<&&-@OHWbY5zO)$ZI>3v{uX~H?W@t}Fy^%sy>=i<=-G0yOqj8|p$ z=RBpVBw-I&C~+Hz?NN9*jpSFx3b=DZeeY#(H{N`@o_Xf3>-ud4xh5JA6sbL0 zrZ_XUAyeB&MQ}%C+^tAMu__@VseJstq0hH&<3_{~d2$9U=!OFkqMS4rl45R?KA{+) zUmt@A_d)J{|GwA@`CWH}X0$yaOT%e^w0EAi9>2#v5x><|FG0h*(`Kh(DOcPRu+bJ9 zq%(=(B!?0SoOhjM;LwSq&qA{i94$$Ief?4@EcUwHbZ?2&lZ9hTztBAPQm-29)wJ)I z`Sv6}pXQy3`6pJrQxNBvN8_U*AJM4oYxh#+P0evcSn>HF#g@+jkL5-3BF8J|w$)qkg>FIX&9TB=XldwEm8P?$=#FniiL5$`w^ugPZrN z^K1p}5|&&q!6g{O)-_V-(rNYpYWNxC@ACy?x+k3dJx9qk9VBpQ07h2+HU=DuQ2KSD ziQQ|cQ`9IF<9~C_y>|UlviP3ruo{Eoy~33*fM$stgy-q94I5W&v^IUl%$6^;zfYpo zN##x>rmG_qu zkVxopVBQE6e`TJIoentsg#6fC-Y4L0eVB9+$>qdqYd;AKOX*W^xki_9tRQ0`#xazs zO31U0+X%$vK4+z#$*0CusOi0;P45!IQh>5q$xfIPQQFekE|}sPvtJN z9kdaEE<4JfGEf($1u+)5AXrc>hYXLQ1%4_ZSDg#;U)Tda83-nz-D0UJ->G;U1sJ^IkSPI3AI(s4xcbP;G)atjf{tXn#2e2zU91(cV1 zOlZm@&73zpcPV41z&=mb?mbKMI`h}&;-OMc_bKXSi}V|FmH=-W*4O_vxt5wUNJl3L z6;{;WTvNXxqNo%vG#pb{+Zd@-(4^qYY2$bKK)(i89!mbP*UqW)aLg>e1V)E7YYIB{ zl^))bX*ikH6M!m@((5>H346}nblr4UNv={$6N_Fm@k`&0Ku!dy7cLmf`?G|%m-DRk zP+Kq0T`o}lY|rBqOiYc*`zCv`yVKIW%0FsmtipFg2x;&cXc6Z_pXPj5Zug!avRG#L zC4`(~FuDHf8l6NrOE;F$drtf{zN3r_c9VZ+!_8CZI#Y!NIMV~$^-&cU7psI`jXMyL z(mJly?+Jt@6!8P;IXsM??CnQk)|{JN|gf|NDu3zs(&G-3t^zGS(snq zXU5&Z7%|x;jcrI^Pvp;>nIeZTRnOErwAk*Tk2uyuB}gyI6}Y452X5ifGJl8Lc zu`OMl@&ha#`jyuF14zn~eoLqO6H)avbbJ!~iP-@5T#AidHGg2OKbc>6TZn1>-Z*?K zvF=5KXpO-(@!r6#QFnVzBdia35!p78b z$-^*19wSxYbAOW6Q6k1LaJ+rL>EYSRkNUqeeEGR2sf5jmlzm!Wav3uuT&=PwU|oO~ zMaiIGam_qD#5nP#;dOGzNr$o<#PAM&H8QRdGz%zAUaQ)d&Lgz(xnVS`unVqyg1ZC@ z^Cu&Sc^kxQDU@Qj-2qFx1}{~ailirK%+YoY0B1vvK?>gDcUjbXGtTzr-D48i5al15 zk+L3G?;VaoN}VZi)eF`|R3cKW6ATJW7X(aCo>n-V(N}<;)*OBo|Quy>Zz7Bc;`C?-)OE4a*K-PlS> z9VnjtVVmF){uR*iPP;@m&LJPGQR z<8hKnX^Z{=!f(LNSyi&UhmBc%H$T?0T=U-lt826}6arr;SJkw!0-iW?;oK7k+F!Qw zyK{jzfJKlmRywC4NXb_E2p@o|8XO2u$d50Vcf>X}o%~iFW{CkUOq2a+2nM4y(OTRJFI!!*&lED$CfEUN>@|KfnBqT#^j=kbYrx#PZ7P@aw?lHCXDwc%6S|22tb+k4F`mLP2 zv&JulN(8XD+Brdnz6oJPC>N=r&E}%IrI1c5+1WhiQWlyC#KUPspzA$nF^Aj7M`E8 z#9OwBzF>7Q7a9|Nd6u#?@f((sUs%@N#+D;@t;q=PByB^UZpikewOwy&jRtpA>+Qfo z{3mZfl8Iz{o+rS!pMFhpP$(tqwc(8jFz)VI1(GAujdIEed{nz8G%6^X$j*t?Saz8~4bB4D zYL$UM{1L5p#5N=BQez$Y1-yrB5XZ}k8Q^#V`Jmcsr1_sU;BOvsE!U`~su zA#qiA(ct_)*Jc}d8i%~^#A^DVWd-hVhq^@9;bKjTL%M;j@5w5o6vDzX;bc;Rn&6JW zvw#2r;pac5a@=spH^!PDL_aA6$aU*3K!JmY7*-=66zoQZ6h)gd9*BZF{xE>0Zn0*9 zukfo{`1|`m^>qf7tDI9BKPWYt7pjTze0+1ysZ-?&s(0kof?O@@bMT0qikg4xv)Q3M zT3GuGydjm-l&fJ?3*IrBvkHs&NTnwIdioOZ{u(bOL-%pyEl0$+%5iX?SEzWD1UbPS z*K#vzN=!-HT(%LU#K><}J*Ugm{eB~x>pH(yL`oUBkNOsRXNln9qE7#3gk?nXww)Bd zVn^4v@4lm77xd`Lx`61JP=_=guEb)x({ilTVi+-Ie}iq^kjqOGB%>40o;L+BcgcJg zhY4qmjw9C0*62?B1$!mQBGJR?6wJT;s$gGhEXqu)yDSok=EBl}jpZy{%LQJ z2w_7#vv-S0nh3o_V@%|ZVr)=JKP5gXq!oA;I^P6|2R%3{3!nmkvdJg%voNXBAITTw zK@c@qXNMlFQ~J?RNG|=^nqOE>Em%CjY^1#gLVLn9v~zU8xJKza#qOBFpjqe2u`PU@ zrR{G9stjDZ)$lY?mR;NxA!7Y&c&AXF8Se9n({l_MiZmfWrAYbv)HwlMuN#jAUm-d+ ztiI*e5yCXm1!m5kY;Y&E0G7)z13}dDm?sm8t_7sGBt}VYi{UKV&^2|C1ZgK z)Gkmh$0wvf^Z>LK(ds!3d+1UahgM|q{5b8f5nM%iefCpuVX@23tEM|WhLnQx$~hb4ke_9tL2DUA`g9;0-; zKfmE}>fDDz?JEUxcQ#ls zfaSSAOC0|{o)6@mfaePciqJ#cbl9lgu|@Yz2A>+;y}lhPnsRk;RM_K%es%+CS>t1QC8ryLG zPp{TTF6$t=!St(Q&LU|

PlhBL5Q!#+O>}atu~1^XMRMat}StG@bq3+49!bCdSLy zYZqZ3gHK*^x{o;{e=nU-p7QFKi#NOe9?+Mg79MeE`8?e%(EyXs+VcNGCH$plHdt#m zvFa{Aqh|j4h|r?o=YHQXdTWp&DQGIHdVv70?}Jh(OEGFTmWL1qkO_sg2z8VE+9w~_ zhMC;9uO!G2gTre8s;=70)ObG!&*=P;1vTJx-ZrG9-Kf7zo~G;U58}eo@%JFW$4?&b z(ED$Ivpm5E04yv7clJaV_42bsDXZygbDO2HbmBOzj>}5BBru4?mzdau$ti_ov-U-i zQ}cS~omZ~n{h%_$>t=jn5HV9X;U|a(r5wt1u8wi8gj`5htkBXnjG{Sc=1qF&951@* zN@FxD?0m$(C$}9fuY*2((qj@}1_z;2EXYd8YoTS9nhqrSvw4eB??-ZW+LJakp_N`D zzQ;B?O!+>kigr-;!Y8PFZWD!*)ctJ^Vx-p(ps7XD{UF)a5h}ProK{7S7GyR&-+ZKf zvbyA%l+l8Ex-X{tec8fAq#0Sp$aJv9^Mo^jP4^kU~88>#!!y_i} zITq$Xvh>g6O=oS?Ts+AMjK2B3Hx(rAL1_t|05lV)j-o49qYI7}h!HJ+kDY;df3_wh zdr;ce&z>s-Udn5OZq`3Wy`I%?=G~TrzrpcRrd&xmn1+l}ndO``6L^&qmV`0$$89Va zC-f7N<#(eTvz|b`?~Kd_&xGrTJ?)*3`exfdUzO8XkYdXc7@4|QRQ0mvW_d&rJ)`Z3ys;$wNsXeKOx>4 z?ryqG&DqV#s^vUU_0Ojl%~IeO2^4_a+lFYRU87F%)t$+>hyur!QaD*GfJFzyLL;Qm z?+Av9H#(qrubu-kJx}P>11I18hzg4cZDU!^JB)wixy|RQ%H&}ywvK&Sj;9*?se~$N z?Ifx&YtCL_S!3bSw8R@rHto^b-yt8z6uz)3j(~7I6>*XEua8DrPbp>JvnK5y$u=Sl z^5kE58#f*##mbn}4=kp3Nif`{BqU>+2p@+(jqy%$xZ~q_xFWLSoM;-Yu4;5hSqmP7 zTcQ-EX@O4$F87&u+cx7i9oL?H2K}}RU4m}D()I7=i*bEozCK&pavCPea2Mh)eID{Q zf{@piJ#IHlynxxfhNU4w^&0b>#3&ybRGi?BPu5pmICZkG*7)cUj7kVWcSDYhz?xP)`n@~CSOCV^S#px z@-~$hg(mZu*5PvQVgLKW<|y!Y|-vD zPkWwSZ49JmRG#_10Mz)_p2LrUf`Zt(^Vo7Y>*O*0+zIHRHG~y5^k?ZeTYwtQ7KM_G=>f-3#)zmQJ0uV`g!iiwR-PS)Oa*My$DEm2&H~j&^T3{WahHc(y|wC8H^Nb2CuVRny`_!M%wSIa;WTub z#B|-W!N}Q+g{LJi{|<}A81fRz>a3+o^e9d*M*F)^gNPubGntv3u?Zrnt^*zz%uyLo z=Bu(dhBXM&d;kh>=NO+sSFW~=(($c)w}+7e$Xb2*4E<0rnL=q$}pSZ?*^{XM5( z85p?6HoaCdBi+&TQRsb%@{PhN_K)9H8*~i%8%i4xMj(AL+-&wisU&v8^eNy7SG4}g zW7ek#x=1}|9WJ*+;wwSVuAwYk)+SX8A`CXf;*&NmrwkqWz(AeUW~xM^N|`Fj0z(_d zIk=R+@F%!0YU?jImnZbtm8OcWyh+b^#9b#2yECEu<7v#kh&`C5w`Gr!?dG)4=*b}f z`q#0}P5aG$toXUublHC$Qw94$01om0l zAi{xp>IRqSfs=701v%PIp4krCZBnL`_8|FctW^rR#EDXxy26$;!`CQRN!AhH896Sn z77_Th*aT}KRp)b{-)Z_&&qUtW?-(+?``Xy$#RR_9r8B|X-GKs!W_<1Z2HITd7YXc* zVSx1augdF=heL0Q&lcdpmmdsmnHQ`|2rrg!N$_=L+Lg`~7(JrjzSj+kl+0AW7VCed zY3~HXB0*)JHmtX*X?RQJi9ZX;$gBdL$G+Y4Nt|WZh>zvLw3%g3y@Tai_=n#3B&dCP zry6znN;X7b^p$&;{t)CEZSz9LjhBiH8#`I=x?d;pJJ!YC?W*+Ck9-HT0P4GaqPs zaUrm+4?H?txsYl(klxu~<5`7M5;DB#S)(aPg`Xhzwsj)b+{^dSLL-JC2oxxpGps)d z69K-o;%vypWq-tN&7BpiE+It7R<*_uEanhb)zu(q=uYGD(jaEk+%G5e(=l$~Gxg z$68>v+=kt(({JiEYiv~;U{1BGcJv!?F`?v-+#!pITkPFqpT}8a!UG-)8oQjeVNWkL zG`~y~{d8?x;kZ&rC}~~&R5`-g1ubzrw!0~5Z1h0qnDo{h#*6dK7=m9B#CVIU7A+|6 zMbtg9X+bx|m5vXKG=&2{K5;6!-#&^)X_ou`$iAm)yFrTb zkR54&PvEDAhilk#bgdu@hYqYk(akN-J*6o2WzCLH0!GL@K9n3X<(deV*KAlfweF}m ze^o-ON|6;$PHL1Jnc87P;bB<|`5z55Y?eyL7~yxRA{t9U!1|(KZ2+Tb=)u}CdQhlq zwI6#4#B_guMQ}gVV>ns!TbT0RC+D{r@uZ~gZTy9OH(gs^BA)!)wnFD z;iaEiSyY}7D!Xmibozvn+mx-rl!QS-E$wFhuvXZ+FCHNAet9qHDl70_K*MuY6}pj^ zN1t_L(>zJytoU=)4c5QXTDGG?iLHj0T%=|?EE2+awMX)5H9Q4X1RG%DWVU`Q=pfB7 z7VhFNmSr4n>TrDdKHXf>Xa5JNw-*4)DDs{V%l8L-2K!TY~3@MS)$a<69mRK0S^e7LJB(T zW>)aXB}|(Q!>#LwBZUA>N5CwnNEcz+@3>;0n+KRDV~7~3;~9pVrJ^pI^^*PZH0k?W zZw3GmWOevqFUf7*iSSRA-6}~<{oT(G<7q$zcvZ-}Aa(+&#szJ7Q(L?EbNI=7(StR0fL0Yn%a0JL(k=;%fI#a704O5sfa=3%o~Jp9GV_o8$9C zy_C_tfPOUq?FnZe6J}58 zY)5>%cXzemd;2;MXhW@DOU-SZ3CsL-U%z>JX7n6)@gD?FRXn$u-Q~hdbRjIbG{p)b z@4(1px=O0cVFw&?&ibl9(GeLerUvo@>;E8^LiOp8aUtOUsioJgsW-Z9h!g-Uk-24Y zX{363T@K6&M9=^%Lh!|QIHwgdR7NGwryyBlyMas7ZqHxU!l*aPp51>&%bav!RP;Kk za^cQ7l86`CQ>u%HHi4Tqe2`=bhzloI4|@zERVPwSDK8#mF*;89&SNHkNA5e)#TF;R_s+oGQB=ki)vM}_?#*rTPxYbA&l zEM8MzXsps_>JPwc>!uaqV%3%m_)&iFbG|HtVE+HuDON0)W~c0q#M@tpU>~hO1OrR1^}xLM^zhhIyU`4lJ%?(V z$52m=XfrG1;D{`2;JX8)i4K!RmleRisAMSyLT~ruC#7>w@##v zIm%j=9y|lzPI~_BJp=e!+~z;f!5Z7W_|I8BTLZ3m=wQsR^?+lW)ooHPcG~{{646ET zYJ!`IHwq&n!~$a6jvDA=djR_Q=8&Y_h=U$4>L0WjmFBY%ZMN;7S?TCz>4#z=2~~iV zWM2v3SD}*E&&T-FbXz$Qd0i3lMReHeN{=teLTA5Aj?XK2Xcy6jC`C#p;%tmt_P&0# z@qghbA&7Ukp?YuyKRiCl=R;>sZzAKzA(MLVQOL0QC`savHHM|_xSY?v`0lu&7tg17 zH7ZtbOEjOc=myT76?f+kI+XwQ?#IuIr>hlumb+v5Ts${b6NS3~_JM0kV63;^;6U3WHHsgcQb^de~J_kdR1 zK6R)5f=O=UCXDbG7ggIopRXl58piW4xGtD8d!*4{E6`#5Y|(8{%XRmN+UtN`$l_lP z(Z3v`e>p_|a)|!#45@!PL?Ckcf00b~FNf$~4$;3HqJKF=|8j`_Kgl5~FKF#A0oepi z$?;u~THN(iJ>9igZE-7Qv>5*tUx06uOwd@Q+Q6)>FZ7IUIYf8VrIJR(`2&rB&9Ac> zuGtoYeGCixeIeJT?|EJdk5=_oO&a?6hg;js-o)We=k9ATw)Wa9xvH3<{ zb2jST*XEm;WUmKj4_5a-xi3-ZpuO+}mBu_k&Q|KasTg`&z8AD;vEukT=fWt`L5BTw zLlG~=p~4!eBkq1UkRI+h;rpbcwTZrg>$eNtBYRSfpT+J31?Uqq*-9c-rl7%)2FjN~#v=;3C>olmfkc zMr-crIe^T@{Y+xIv<9+AptMB{e`Ttr*661J~3&U8mD`|8<2 z+U!}=ucBiFXI#9aaKxp}?^19pws_e;zQ}Xmb8TF2 z4f}>Gt@fl2j4kH0_Zy)+mYk0AQN!oj`&cMUF|hnci4<te2vU~*4Hy)qp#@Iw|}=;a16X&w{Ub zJGw~irWxYKmo-BIOCNg79uqdhuG8kUt;Ifs(;pBuhKK^L}!Q$kgCe@doWbg28P_&IA;CgozKpQ8A$Kr zVICKAjq{veDLSV6&Ok;44@>JX-}ou{y|&a`9YdTJTw8Jt{5h}VtDWm&dqkohd&J8T zRR@QI?@u{L;iW!HOG4n#p<<7}<#*+*o_gWSM)-Po=wC4*2do577O95vWWGGw-t|Xc)d4(bx(A*tZ3o zLqe6`<0)8nR)Zw4ph)9npa~ng0y3VU`J>p<##gKElpVdq#`bHjpHxQwVJvl8%n8y}HDRb3Hn%`k0I!;IKTgqa*h^g%a}Tw}Xiw&+R5bkfp^8Za%9hWB zA5n;yESFqNGYOnPSaK_=`Ab&^??w2F^O!UCQ6w47UfBx%(RnpY$B0vETF(5G@Zr7~sN90Wgw_`7 z9oUi9Ts;4@JeG5){)(1+*}@GbdgA{RcWEDRmjr$uiOr;h@Q)@{(@#2_jh9I0)9_o= zRon~pQDgLwOt0V1K0fLuL{9J=oCZ*z!lR5F&LHdr~yD5+!~fdY35 zP~Z)f9|A_(NZ+(9AmM&j-C3yo<&wA3RF;Jq-}eRTrfYu0OavOY!o8;#M2X z&Zd#$FM=;dL40v9I1IR~oH||6cDb)f$r%4P)FmJW{)f7x2dXGF1%g`u+5y-ktjOdx zCO`>6GlszztNUeP#OTdD(iFu%jv7UUQZ|8w^M9x@#$3Az}hmGgd?-ZMuApn zL*AiE8t;rG6(Dl!Ao!&~J?bep!OcDrSZMEF&e_k^wdH641WIj=ejFAasH8ILFgeE> zFVUs@D0#{YCbEA2y~AmKXSP)u~l$5W?Ioopu=oM^zH*G;!iF8i1)_~IC%}j0$;vGxwK*>~ z7Ui8N;lyv$!F)FC$7R_drlO`ptdz?vgIj$jwb|oWINx@%5JG9qoAG1Y5=U_IQ}`Zk zVb%=sAo9Nmo)mx@?Y2TN&PVizHe;?Pn#kyAU(NVr;ZDt z(eDjp`2PmE-6w)}Q_auVM)H5&uyayLJ@R_zv9^}5_KY>-8r^Ccp5)Xk)^fPsZ}(X; zN#f07xacR6E}>KnGtQi*I>iq5_N6AF;i`*0#*NxlidlG)GeQQc3y<_N8le=P?41>U zeaezM)lbY=Xcqn6Q-*C~bT&A5w3lF(uyB4^BWw8Et>e<0S4X(_!|CgVw9d5*rtysi$K*EChPnpEV;U7a!m0 z=nsiqHt(4KMi6DaA*P!LFl7p!eaIOOx)&%s!E683IhP3(=SmId%FVYMNhu* z<7Mudh*NoEnyGzpeNE>E-!yn?dt>`F^0I zid^6!&#LRW9Su#Pp)21EEKS2+xXdq%Uc5hYL0(^$dgp6oOa4BdWdYAnVB0?Fm{`Ix z?uvLz0NzT)OS45k^W`3s{Bh)b7&H}t8P$q8ffnxR1Y~qy3m$_;jk@n?q9gefzZ_4m z`=z2?E_rTETUqva9!#iLK_mr(jAq?`|Mqb?t7=VG9B`~5&ISB_oja&{+*?m0Koa3b zscW^uC*+uMFVjIerA8-}f{Jyk#r>$n6X)1#a(zf5Z6=n_SFdDBuaqgud!Iq#xRnz+ z26Q&zt9ZGIHHh^lxO;A2M|(E_9E8US?{j&T^}?u1w>Sn}iZOJ^pAXHGZ_D>PI_=!V zh9);JZ3mbP1OC!J3)c>H(QYKN@k1dV*onR%&u`^K*Yq2UCY@_;Z6hHQ+X}8~WqMkS zU;?Uk_R4zpB>Hq$c6mB5t%kKJ~5hr5J6XGbm|uRZ!DfPVaYU?!>U^Q2XG(rF32zB zOfB`tk`MQFpoJ0$tJFsivbqW2#6kUyK8r=7025u`UcLzst{=jften0z69pAD%-JO< z@(W*6GQ;{=iAFiR)D|&#F}yTrOUEW(xiAmk`F#;^d|17R5G!zPoLRZWgoNwldU;9f z^>q@mhHXwiul%Jg?Z!4FK{1<>S|LWbLG}K$&lU%VNJSq zH-L=40lg!i2OibML*<5P3a)=)$9&9d32V^q})_nzl+B{7J_TmK)I2NLJe!Z`xFqA3jJkA!t!BM-oYm z!jgQt_i~Z^oplL?80_}f2Rh-wm6oz!&ey{@^W-FLP%prj$A@9FX^zECaqK|M;rmm5 z>oNDe9RRnM*^6ae;Omk}ZTK8!m+o_#c~<+ZN%uiBZ9(hxkX_{$*f(D4WViVQ%}tbN zc%CXMWLFK>?&p1f#QIeF{RI5al+R1C;Ue9a6@mEeOx#m_(XD%WLA_`CW}hLBv!UTl!CG-|l672~ z*D+$TJzH$8cGTjHKg$qvCcJxA*n3}kxEK0s&cxV{sZ`6sXHgVN3*4~Y?BVfxOP-5L zl7vZzYFdUL|Jm?pi*QH+{rb*GuXKTGt-Lxctv1ipB8?O%XFFmxp6Tw=u)GZWSOrVlLl_GQK}Jl3p? zhuY+KULp9&wZ5jKm3CDvEWBFqo!Ni^?XXBc31fpo8soXk%`yP#^X+M9xXxN1e(e?-M zz?cV4!m83yCVgMc%zFZ??Tp`7$P;uv^b%w5^yTJ@X*IspZ!`5bYG9yQx7IyI5oI|7 zb8wi`VIqF6WJib5uU8Ajj6#KMO@v_2+J`_fCk z44Hj#N#2`~ESHmOKR&)3=1;!^uE!-RHTwv(<;(PYS5t7J?^#WtMMX8&8FqU2FLKFI z=~b3e@_aIXy|zopwePz_Oqp<{W}MeptxxmtU37Vx-61cHl$nXy@1JnnU75oN#~{U~ zeGsfW>r|1}2r?7P{4}h@!Q(iNtg_wdg~%R|mw9f~cZuL{#!}d9)O8xD_oJJZMS9CY zT}#*LjJcfNN6uQ$@b0h(tC^fV?f7+jHRwgUxbHR`FbSG@oW6;@%Ph+hEUOOmfo*gi zjRb9nrvVykQQLJde`z^+VK#x7-46)lD=Mf8Um%H#@i)ln6zs9*iK$HZav?_e;d57I))s}H{&>g`2zl|@4HRD*QsSPV-IG!OBg*~c0xuy0g0@T~(h&wk)_uqtA z+g*Df#*y?f?GAbj!u@H*QtbQJRgpEJ-=kJfuD#s<7+taKH?^q*^E>?&sTmozAx2*4 zC3DZI7Nur<*C}f!sj|rn{m!g^Foc5I!fSlw8W4uDLY0RpHL?iH^qt0@I_7@#!^AT; z zz4u;a@4aV8_Et6-*?Sy&l)dBNa5#<-8HcQMaE$ML()%;M*Y&%u-~YegpIs-fb>H{% zzMs$MWB7X1!CEvcEvv(1x`BMvxYc!d^;Uft5lddZ@u8=SY#!YdtfDJkwhUP>(v`=U z>|9N~_;ZhHB06HW>9}`vm$=8oCt?2Dt<_7|V<2TGk;WQYL4BvR{ii9v2ha%`HX94A z3ElW%XxBs;d6y1lV}Aj!l&ScBZrqxzr134nnTBq=^XK|vtsj_EGseHJ*hl31&A9Pv zVZ$nr-_Y34`aQ>eWcaJ$OCI*UVy13$+EHv>@@J`9aJ<5 zyk3gYp)d9X$<$38%Fo>6l~XzZ@pzo&Mx~_%CKzap78}IW*$Ca^aXnl^g!m=yi)TcT4E0XXZn~C#=H85KaiDN82&1z6WTAtAV95n0Dh(Ta+q4fo5 z>f5z}lYLr=56OUEINo~$sf#xB6Up|qhvfS{jkUy7kZN_nn$@Z_N;7uy l~w^B&= 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 z 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 z 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 literal 148414 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 z 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 diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/NodeScreenshotTestsKt/ScreenshotNodeDetailContentLoading_Dark_d19fbf1f_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/NodeScreenshotTestsKt/ScreenshotNodeDetailContentLoading_Dark_d19fbf1f_0.png index 1c711b83f9af969330325b2e589ba714cb4e5ef9..56a5ab0fd74399a36e1f659532ebf38b1d2c0827 100644 GIT binary patch literal 19572 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 literal 16422 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

er#Dd83lmv$QWJN8lDEe~ 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 delta 68111 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

P15In~~{~Tun#t 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 h-zV(gK@*!O*B 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 delta 68875 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 diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/NodeScreenshotTestsKt/ScreenshotPositionInlineContent_Light_b29dc7a7_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/NodeScreenshotTestsKt/ScreenshotPositionInlineContent_Light_b29dc7a7_0.png index 5ba415233b789ab8a71d71be15f15c5e7ca14c1b..02546c7be5902be0d215039953eeac8e1c4993d5 100644 GIT binary patch literal 16795 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 literal 17321 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 literal 40957 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

Q#{L!9mUiWwK^&q!ER=RYQ7qRKDZjU}O$8 z19)q`D<-j4u`zUF<5DqhZKXR_7)+{9# zikBcHXDqKtL>-;_(R9P%q>=nX z#^?O$|5%DW9}^_V)}NreuJnopPJ5>K-6jEg3wP4_!J}u}<-XxEoexh95j&CBJ*K-x zkA(k(4o2eQdKZBwnPZ01{V2NhMWH;b5_R6ZbgS&W(Eq+}Ze#;m8I&fKn*P}<|622} zF*-*IES;#gj4*-s?WH>Hwl4*y*(sgU#@!w}GMO=*I$*8}o5FS^;V`|Hd#2QjoLRN> zp8Pr{)_07u+>4PWgmdGJpcdsGxwUANd1X>R1Qw|lfgzvhpZcLrr?*pD_L445Wr2#VFR&MHYPp(f#AwFOU*O2E8ZD;e zkE~sc2&BAf8R6JQqZeBmNj1{;`_nq)APqf7M!d|WZU1ksM>~8iM;Yw>F(K_u%i;e# zv%qM+xwX0Jn{&aNlg7yD9-i?{*aArc0-G<8p}H>Voslrl zsVf7EDt7ddzDica&)H7&Un$}K>@a3cwbIJYi@@x0{O!91M2dd=*G@MQ(hksP>V)Nw z&Ok@f_5X)OjGGXXeRbI!=5s!}pgIcY^6G~7@$>Me$^PmTjk>Pso1dBL*of?xNVY)4 z#KK$Kj3>3RSW0_1EX#J(4(noG*!ELQyhfTbrGdx_iQ3_1A%QFvQ>l4V(okTDdjI;~ zqkh*Ax#Impg$t;%e|hy%l<1V&(DPEtQk2J{Yiz&o^rkez!V+EJzg!=%JiYVV;-u{! zD4w`AqCn)ncW%n+O_VQvm6>*FCIpeab!TX^>}kKly(WWC2gBHk^kubyh@po_T3KA! zXy09b4lzDNF4s8bnhCl*lcr8j5r+m?_1s$U$MS&kaq41Hqoy}{@!i+kthuOF@JQ8 z`pQ++n~$?eSujp*RtDIhxqqyDq7!_x?A}1@qC`8nk791Y4NMp6uSu7_skVf{JA%D? z9oJ`Zy?C-OGW79nRdmqM&;@poUJBGdY^t2p$DDoCEZCmT{oIF z8h$=Nm9^vTZIlqPebFutbGQvws1P)_mkr;bGJCHgF06PIvpZX1#3F9USvy_7zMk1tqfzcBZf|vZ8bnlQ@n#F zI0niOEP+c^cK~*0f>L|2A@-X^Lq3frVWpSybQcw91d;Iq=jGvfD94yVlzzvZfjQx< z!3OE_5di%0Wv=v|tKaWW4<6j1aP+J{mezEC&IgYIF`6*A#GKpH<|Vo4+wdmx+N@>P zpg>bxg!xw>J+M;rI6UMQdUc2YN^3?9U-nze^p!64>Nz`hdFBF04bEU+Is34&Zn?Tg z6bw#TWcd1??FR1n4(&D8KZ#!C=rc3eU?=dolvhGW6emX-dDV`2fxzAwy31OmIu6ay z+nV?#jDy$8X}YK>?i8kr_5ajtGt4wd_7}Y(xJ81+CJ97aCZG0~D!>JX`PQGGUui|Q z#mPn2R10T#x-I~Mw}Eg`QKZpvF0*fZ(zUuEP7TEm!6a$qk8cvW5-qRGMafAIT*gDn zK5yec_y8BRdZ)*dt;W_tuBp28r|#HO#f#-1Y}0;zp4W_FU}<2j*G^`t*KPmVux}+a zNva)RpHa;A=?b*mOAO1>k(S=8j;-?7KOwNS_Kvic`!E*#-T=OD2wW3=WkvyFXAKyXw ze|~@d%tm*2z{Uvr-xF<2&0qgJM;r6-|EuTd^*0$uXL)y0*TT$V_Flc)_mee8;cDI= z{VF^b$9p3dT~}*NJET;5b<>KGyylGHbF^$+AZ}bG+r@8Zm(y3*Ybegcn{nuD9iXH&q@&`dH?!jrQ|)i=b9e~ zlU`Trj?=jm6p1Ir;o}>#R^xAK!_%Gh?3SNMnI!gn*e%m)p*1+E`{%b-cEGy@um=Wz z{~R48@@4;3%U$!%2d;$f%8pVDqO&Zl>Q;DZ z^vflVyyC|9O3=QovNTCqO#q_>X0Zh5K9<=3|SMyXy9aI}svgcjsR_^5PU1bD9_X zx-!*oT9@u$6j)dF!_5E3#0@rdfvHa|fp6QU{o-Dvz^?*p)k{L93_s)1ao#PtY4aA8 zq$REE^1(KmT6}oudWBaBCtvAx>RY1v)YY>5>)&iW7t+nK(_IyHNQK<2K%h?CIMWde zZpENE3E(-lz+6km>2ho5R!mOuyp-J?+ui)8gr>D2;@+o-C29v9u?DjE{!lJ0A_)6A zWFn!U26nY#x7hZ)P|oTg??D>tBWZ1ly8~S7+7n>@Bku$w>6gpACH9;NcxD^lS`6Bm z;@520u~zRunGa+Rxa+X~{$NtkwYHQ&xAutnqy_)=o6RYmuWM}zh?CeN??2Q3Tb$=Y zn!A4$OS&|*8)eni!5?g`o57yNGz!YvYQQIn{APE5ef=r1yA2iyGaGC9f-TQ!`L$im zu!CF6rKDC@>rUz`Xa}^wYzF^z-#lORf>B&zpW@hF=L!$w3eS`4lYT|!fb^Xn<7AeK zn>l5Z->#X8PjpS_GT@}I5*gQGXDkcXob+W*dfc9X{?6+0hY}3c-O1enOnS#N*~Q}I zS+eZ>RIb+LNye(^nejdsoAdR)AaQ!*rMnWPP8?scvKT$AV%XI8MGxI|ykl|ioiBB# z8fuolIH-C34wxT_On^GpV!pz-M|6_+H+)Gh>KO!sXww7%^GPOIf3(k~XQIU=t7#C# zi69*=fCQT3t7h{x>Atox)84|4rde<774x=f2RNBLd;2`3PU+e7>hGI9Q(qu8)rMz4 zEbTJ!)7RyT!g??Z+9AA+c*IQ1=ONm6I4p;jYZquE* zd^pQPMkm~UntS~BA-yw;$$c77d9}|A!MD!$b7F8;rhBXK!R`zC`fNL+$z~BpVu$0& zr(yK5l~ziIG5|_P!)n=`owK2v;z9MrgRIxRe=)@EVcJd^J-tPgU7Y|m1O#*1QL+$Z z)Vc+%XRygj=HVf|q3gKN2b@nwx}wedLpn;y6AH~s{^_8k+1s)ETxHKSDsH(`zh+vG z2CH2k)+cghzgJEBOesuyQIwXq%1+%$*I9KgY#R~1hC;A{2SZWTQw%)5R$qf@276H% z56ML3#zmvrJ-up{Eh~Pl_HATs^II^EY}9;Gp5YdJm_(l-yzci@4U(GIo==R6#q9`$ zIXE|2?9esYa@#9bLfWU$`JKVguUR&cE7n;>;3)n5Q1(o~yVE=b#j=aonWC=ZT}cFw zdD=>0+LQaRcMjOoaw0R|eSLrB1U~WWcy&RU-DA|wzOUs{o3v78xD)U1)#Gp7G^m$E zx0#nZuI1XXI#42Iaj%Ei%jgc1^-Y`$PMTKBV5S=f11Oj1Unx;M!6sEO!e_~Xm{{7Q zSc**@g|-AD$P-m2eiJ*w@xsT=0_uGy$1H5t>;0S-4tCFX&iiIKYgjj(4yqMW@Ty&8 zEu2IRTdzK_%ZjGxi69cGsMNM%4f`7JN=L7PgZA~HQ4P~DE&K+-3+B=L(0)4ImSbA? z{uHA3ANc2`D}i{k{q5>YWZcCC+4PX=RHS^8`~#Y0$6#r>d+uY$I#;$WG3d+wze;y=Er_VGze|ga;nHg6n^Osv8 zK1_8X7K4g&_+s&fMYD+ljh4vCQ$g>3x#gT*89QBO5`U;iD`zCojM^mMiGS}T$31+d zL?pMCKM>cw zulryJu#7^aL)vks)sOU!d}aMWnOK|;%+or}m!^epcZu+?b!OaR2kiruTxNq@D@e(@ z{+6bF$n(M{b6L?Y%TI;JhlXwFqr$a_4&$;^%C)jvQ>#J4zlBJc@n`npkHvi^R)=xs zPNSbtdWhHuM|zri#jvKDpSNqb_-0TeM`xB}VzdO~ol2g-emq(I1y8}%u6opxGnK2efWPH2LMSW4^OCUt~)gZRkN&s|*2 zy`{C&KhYt_9wYgXdq(54fsHlQj>Z8P0B6d7i>&mkQCxF?@RqCG+F#_7j@>?q(|T3> zrUr7{LNOho$x{|$T^ft>-OfG~*)upH^=y+WcbWt; zz#Pr_n~(47C0v5+6nmH7ufODccJ9$`L1lfrHC=!rX1p@0TU*ojDTy+?HxxWYAs5Eg z5!NgE5Bk7Pm3OF;XTN|gH+z86D#?nb?&h6tyAw!5b70aw(7+PD27j0 z0{hm+uMDoa?ASNses*s5QHLVrK7ZObrfge?|2?uSeK(g0TF^ zRbfN`EyX~Ozln$1^&NNkm0;`auh6ss*=Z8v0*O#T{FnS9U6!3-l}=2CxBeTF1}6W$ z?qx&2EwW?Pm#q0sahb>5M&qP+#ZvuX@E+IJ?R_wvxAvn)N%QDNS17f^hZfMR>o?VNTLYc*|;!#vdtsyJdZq~$fjc>ln_rZzjS}19R1C0#` zDz=~Sbt7L!ixgGby!)_4*3KyFIn2#2dIL{u=l<9#n_@WJf36&#_*xrQSt#zczSi}4 z8~)3+c7`LXBQz5LP;$EykEx4C0dv6=`Oyz-+lV@GW#ygXX`QvK0#g39Lpnom7y(x1 z%<91?$b+dLRbWmm*zhOzimWiw>-Sz3hwYr}y&%C;f0rH3 z^nSx6U*ybAix1|(Fz`HL&odl7VES|V>r6R0>L?C8fr0GuX$&*ZUfdYs{+)RW-ZNIK zFq*EP;dsTR4tpXr_Dxx-PER1gli&0-`z63q_e1fApHh-VBxTw@L*tFs+4A^T^TA16 zH3cQmRf|mYE_BR4K@K!c#bv3ujXorRazuo!V_4Xi1XTs26N~nVr?f2Bd|OQx1@VU4!c*NTbHy8& z`8a!EVyB`_^2rfR6kstGF1G<&k?6nKH2+pB%Wg+ru7(nI`jBH1x+6M$6vD1y_kHi( zj*ouXwEULH&wCAroD35Y;uB+YGpGB_KD0qc3reZX%)kn%x*lqJg ztDNV}y6G`Qqo_b67>i_GosMJ4qzWtKuyM#wv`&J<%-e^Bj7IIOT}G1(yN<(L65iGHd*}91mS?ewKb(D zN=paOA*xkP@Uc+(*jlTgkg)bS$gu(VBKLY-bW`0aMeLgjdq5OEnscFN@UG*jtl-9l z?{aAG}$M%kz(l?Pt(-!Wjj-2JqnDOT(1@8|5TmR~%3bnIt8KO3FN~MdxsdIDe7(L_YJILu2$Q^VK6X2wv zwZYDO@*eh74D0C1OGz~Baz2+fAM~mpeqIc+(0pR&qO%vSFfWZ?|-r73rDy1hBd( z;5Motni59={Ej!8YtBytAS>8onggHqB%$b+0|Q&ce1N~l+B#R%En-a_z7yV6mUU!) zR4s^iCo~T+SSvEgfiC4Be(|berdwH@%*Ns20e35`EUGq%5YV!Kq{6l_0#m+P^KCg9 zUzI@%6^M(>PjQz!SelfxC6UJ1)9H%re0~y&0?Ec(hhY=jPr{e71>&ORgMoiFKLmiW zxzdkWmT4&B!3wGMzpph}cG)YqC+#L2Z@=;=vtO$3xf^X3KlE#yQU?vvYpa<)^onxh*lS4GM;BG0 z>tAoDR8^+^wQATkkvLRIlzCie6z=%U7`$HVb#;aR_)JE(hTY>n-SpV|il~+gZ$C@2 z33Xu;zV5c*Z4|pM7IcET6`ls%eICUv=IUx|diC7L7aGu1B@nHb3p@s#54N1@Yhunb z^q71{<7(?2l>T>!_#`qqFwYm34R%BBTTW5dR@uw{cryq7Xp5Xis!GBl#3-h;8pz}J z=~sP|Cr`02ZpwNhbT246L*>i3|@oKfltEwsb7!J@<$W74Jm&(DyxvX0{Y$QY+Y3^6YYlatm*gV94ERTAa_FS?l9=wLVG)<91$<2gfq_?u#(j#d z`1X(z+_4niIjZtQnuR(-Syf?#d3*&vC<9rgKhKX`xEAvo9|Xcg8luzWBPP()59UCo z57b^e(FS0+A4hB}XASFaL1lh{JN^o&GaNeKXENtAiH^vXRn+cBb9)JvF9u*ozw*#r z4d1GJFKWjEVU6ke2S7Hs;NfYvtruEoZF69TX$}X@$EJS2o$4oapWXK4{!yO}`?&VF z+5tRl@kZA+8T|1~M}w)UPd0zgs5tpsqmTzkO86B%HO(r_>h>|tAj z&LzWwGuOF>4RaMVQiG8pD_0TJat z0r$1Cq8)wH;RFq9^%dS)TuE(9JFFAhxVa3}itms>sf}KD7fufDgg# z)}}-rW<6aZfKHIHd((wRAUW@=(q4G-N9T{s&^T8M^=yuO(e=*PvDHhHiye7i_i8ty zwr{ULZ1HqAE0+NP!3xtd{$tbUh~wY(vD{A36Vmt<#kS2pwJwnT9VJ;{0qR? zB!ziQ02h*uJft_D?QR`Nlr-#T>w$-lZ$S8?grsSyQT8ChyKTGbsp8Da=aY~5_&d6|Le5Ki{EFjHddI6tP83}xM8CMfvks3?;dc1aMV-G`F1BYdrBl3ak$8jx zSzx0DWiQ7u9E&% z!9_Q&HU4mB)tq(OqSA^f_uas}+SbGTU>=SQ?J8y5!dtr(V*I!aVWB zh<{bV?_Q$UKfBEeE{f9%Ih= zv~X^DW0*c*PxM_UbyjI)H?Q4z8);+~mhl2GQHnB`jPCEc`E*DU=feopodmPzk!PPrCU zQXFaIA0euvxJ~+KDSVe}REUIS%y0KulPw3Q_PITbG`S|Bb1Eyvtza8-C0p6}6yRXI zBfRYuLe%X3c`@Zw&&AZWz^U3FQoX7B$(&g?P*Y#&RD3WHR&O&8Jqn>O` zNvvG)WYzb&Xp9mX6{p=2oFV<;pq}>@dmc>$uJW$qcLfc)fx47@Ghy3o`4n==T~}(0 zc}neTHh8zGfy??*UD=6J${DxgT$PAA$(-U%B2~-%sFn}A+?3N!b6w}Tsq8s<2w&pM zB};sSl>51d_B?3%;MKk@vU9yXv>L0dtj>kUfSEEYug3SoJSXuK+(`EB27|+NMRTx} z2fDo|J}MxxcXjTLs)O6M>)WLaivGpgXdB?MHWv4MU;?QsIIT5+y|Up@HI=w)?$TAm zUXUGpQ7L+(BcEQ{-PE8+rU7b}CEVL%-LhNyFE1WZ{`nmMpnY|YN1Bxe4{sHDl{-D{ zTNy9RCzKcYY1J_Yp2BE#d`lj;*)dhCH&6TO=&u?2A+3w2*DBPx3LH{wU0nq|&=#<@ z&P}bboHs?@R{rr7nMlrWBYf}Y397CZ9o{6;6&Og?=}Lb9wItUCbtm2!@BWq=62FDd z%$V{i{DXS|2l5rc`t8*EPD|>9A8&rHmVmxC^}<>>&5~>0vum?XW;zkyWW46l!hBCV>sNtc51{y_Gk&2yw65&FLvW%3m zlo$n&<(sDTi5bTo;QxGliMDNk;rS2v>3$7OPUI}?wlM0_%3XDmP0)!)d2JkKwO2#I z=R3x-Ns+0Ol1_xGH<(^L(c@ABA6LDeEtJIZ{)^}Ge_h5zgL{x-IIcpdNwEt6fcZFe zx$YsWZ9XhI1QeG+J>b|jZL7;Wq{1bp0?Hh)10~H(phCDk&AajIcBq9)HDF$i0}i$s zj|ITTw{8e7(XGCl&=aYcz3&#~uB{-P*TV zR_Qd{ab;C>Jz3;1j~OyYU;a_0_rP%YOG1w8Kd0IRj*78JMMiCU3YYZ*wJMQ zqtyn2F^eWkUEJ+bM(u$(`n!1OP_0K_nL6rzrOe7 zLB&N(nw&*r2dw z?g9hffgm#@4`eVM`?^T?v%z~R$e6{cY&T@W-iWu(aSH2ty>y&EN34fv8c_yMgs?ni zJh*GoB{urDZhlKt)huW8*XVh&VDA$rfEkm%=83L<-!^>Jkn-pQU_^g!f?f8Sg#uGtY{_>FKEb>5)xEbTqgO);dEOr(Xi9 z;m`JAKL}Gu8K7fhY398bkQDQEenlHXbLC?41l0Xp6iVJUi@%8%*SNN?H50rJ3+bra zHR{HHBiag?hAhgv0ZwiOvRz3UJDSe(;Cv$oh71PWNa6$mE)V8NQ3Aw?C~~a4+CYgf zHmvf&>ENShq|fGv<9eBz{)4NXe>;_blszL$ry1Y3-kMyQw&c%H6WslALWGjT)XDGP zS3WHfIP*PNdw1f5Jdcoxak*eM|4ZDlW_|!bwCSwxDs!hj2YtW(eZBI)qAYd(so~SW z_|=b)j5aXBR3M3qj(@8O;Lc0TxEyPBR#?Kl2PVM`9>FJ48|)`d@?s;a#*6C-UWnHH zRTPDJu%=Jiln1!?UQ08pM*~W$*ebI+zmpuujl58i$2T&<4wxJP1C9Lj5t z`ZL>x;pLyCA8P{n`kg7^=0JP*%C-QID9_?_qxygRa6$+2(0I=&Sq2K)*W>n#h7@?-;?T^yctu z3TxKG6I5b$B7!!AX1+uaXj!F3?a-g|@Z_QXeP!!GskY*er!ass{X~OivLl78s3szN zCRxakS{)gf;cJ=&`0dl10Q(^2)NN8k&G7uYc+*>t@&yOrF2t((k{#!0$6|N#$Qn?% zfuh3wqJoIxSL12G$T?LI0bNEpsCx|2YdL?-r0sR0G&39iP0pEhm^J7 zjsMkoWqa%=AAr?hG62Kji(OKG^?ShN9hi+t`XX`B7 z#-;prc8YlEKizZT<={3%9F|$kgKf{*^4UBtcXjV+G+ zSh^il%iKswonb9v>I0ZZPiTRF*aVHOn+c$Xh0!Dlup83#ZuhNFN2C(K|9fisowUvR1DvfeyKjI>(El+_So==IZuT$ zv=zvC$@wI7o8;R{ps}62&dKaVEs|yYjhI_S<)-_1_htZ?t4a{&{oBZ!gKw78Z53Hp zqEKuYqpz}7XUU=(YIA@(n(Rj0!L{R=5|7+YOOyfR<#(n=im{@M#P}Vd5FU8ZX_#@A z)}`7J+~i-5gm!r;v3!*mpjA2MkAxN2|Gv)aW2p|VUNNUP86aZOHT~Svq2w)}>3a_q zKX@m$W$B6}JZGxEQa$W5{Sjslj09h7SB(lJ3y@FV?HT_$u|3sLC|151d&rXq-m+eX zd5_MxjFJheH7-w34njoRKg3zHdy%6~Gb$EZp1;pHyUyZm)zxJ5t15T7@NjmGpYB=` z1o0C1dFH5{_$NI*p4!8|5@Y^^mcJ(%cSHr#<7HEyi8aJv-=Q2SfCFcfV?XkDtFo_v zNR(+H?a?J1N~5Z>=b4>DM2W4<1o6NSZw{@5Hp|wnF-Beo3YxpLrL+5*?foTDSQWdK zG~I{birjP}5O`&c2D&;bZa&5Az18!&f(5fKtS&{>%$sMWEh!1@gHAwN|8~UDfs=c{ z*|Uj!G;pIPZyUB%)|&D|GNkMeuQ+iNe^c2i^UPfmD+ii3LqoQfFsXTX+vpRqw>!~F zA9Z`kdq18mHNG|2p#ht&S+Y)1hwt^khc)d7L^m*-qn&|;NNCO;(pB{e8x7TL_P!`B1WLkbF%6P-EXG(0-K0dKbjkFRp=V3{G&1(WjYRDkd zSeP2>K`SkVO@A+Ponip_$&S?;@AU~4`<(AFPT|Xa!R(-NAtr`lp7S@Ao0IUj-Oj#J zVNmh@(K?`?H*J}=)&)s#1G?Sq%&jloPm&DTyEpjIk(c)k{X*nNjy|+KA}Er+;DOrZ z)0pjOJ;Pn1|Grz40qg1-ay??X=60O;u85>54&*QyYAnri-`!+))!q$F7iYs0094+T zR)8|X@-)%5FP{+dSYIq4HPYbO{KL*xib??;pI1MWwDJ^OZT5lDI+w?A?%&Y8l0~f1 zqPv0nvJ&`G@^1}RAQ>u)%vUzu{)C=;)(y1f$6+5Fpmom zjmyKrb|0s%=O2Ngb%-o-Y)*>TV}v7~c@)iT%oSV^{ik z&*(5AsWn$00#~bJZja*T}0WZfyoG9`9x$UIlQ!G9HD)S9cKU zHW8A78|mK+ur`ciscxES%v()Zc#bWjyEhq7p)TNi7G8g`unR(5{?Bs@lI!1;_1aG} z)ZOWytekM+)vAj@)TZk&4EM{1tJnX)V=0BnO3U5KV1S72G~Nylf*u|jz9__EN0*K` zAbgSCrDAK}|6hb!8xzqQ=6#`XZB#hJHI&{B2znqLzEl|7Zw_==QS@VfSnqjOef&+C z`&FZLEEkzk;SDuS*JJw8lqs4_@)^WyTbZUo>m%0Mwh+P_jq8TmPAx8f(A6dl$ae&wp1%?72&W`5|Wre8yiJ(P3tU-y}U$qb% z{#fepV-t5b;hl(nY-AD2VfYKLvdP#1=0VhLvq`T8hY5KN%`l3$u(>{y!s97V_UB|E z_3Uf;qtC3Jlk%VIy+n8JuDai}A;Fz>ZmQFWKeK`XM`UrHZb$J_%aMb&P*dgu zQBtm?teje)$5h?D%j?S^_9DXA_jKdwT(HEu*2)aMi7V*0+!{ z-Bvl|`D-;(XY%Vv9^|SfjRpjrj7XE3c8jz~@+U-wSOYkPYH_JA=i|KCU%SY$llrfr}{C*d+P2P3BxxF z{-eSev%1RPBnOwjSbFTa-B15k3I8cf9n1s>?HX(x+a^xF>|s8LGRj$dSIsNZq$y^C z>Cp?GY6{>EOUW~s$X}GG4K8@(@2eK|T}AW$(9B(jZ0f;lo!B8*U!a%FM;-^5PIka= zqf2EfJkJ3rO`vuP;@p89qS@z4Kl*}h${~nlH`@4F_FLd|Vo&)}{yF6p)=rZl=-b|ScLoX|=IFo~bP0#vS#XA=t}6*Ep8cuFQPoX*PDHSi$pzf;AJJ_%zB&ZBxtYQV&O9J z-nXcUiTguPUoHYK4Q}~pR8aGLzlU&Kp^D?Yn8y7aSJm~mT+t5}e{Y=rpP4;E1jk^E zuk1;P|LSk@@Gw_&gYgagr3kP)=i-JQ?=|_M7_vE9-xx$Xyk7z}&Q#=R{l_EyxE%?xl~Nu3IPe~0-w%BXaG zD>XwZT5XQ@+BI~UzI zqz}BxFpxf!fTf>u(RyPPy^7GDdLVE5GQV#A-+Bo!G{1(}(l#Iltf|j>p*QH;3EsQO zq&sg6mM_m5s4sqV@7g83Z)w;!WBL+=W?vsg0#;O0*iGE<1HM zF+=c{y>z{dDMT7_(Edd=nj7TNC4NZ{_GqV!E6_K%yVPhlJ=>$vb*85%$<`L`1q;iV zBoj0CLcCIvXPZvvcg!2L^45JLR|mR{Cy|Ot>BOx-agwj%2$o{F@0!Q-K<;weA={Lq z9=bZn371$mhQ4-HxOD%}Y6U^hELm!F&V=+vA^bN1Np#>*E|F+M9&_G>fo`BL3jp7A zs_bHDo4Qx`r$5i>SJ2XWi*81Ykaipjkv-H<%DhlNTvdA&W`jq>Bg; z=0@t!@BTC{EFM%C=oq|^+--rlRIl1^ zZ}sMFRzjtXKY)r&QNrIH961kY+QK6qL3$$P+iUNiymp1a;)#NL(872y5dp64DU816 zRBzQe4|_~aUrEVbp%YY*(3klt#A+Z%Jtd>*CEDi^D}qPw5)h2H%&@UBrjCw%2pCvd zKy(0R_2kbhT4g4HHH?@Db}imGd!tePtSVC;^`#e1gYhJxt>Lh<9>RinlW>%AMenRl zL4;YKKDjo>)@EAMi=4o!jHq3`>7gQmKimnT6BiC$wP$f90-wK2`ia`bW0M`K0h;>b-<2wZP>?<;TbwMH;>e!(d8q7*21qG-78&j9pCQo4JauTt zX&x^-==4r`9nG*d5QsJJd9ejZ8x$QQcyWL)Z%#JOQUvl%3nY1L+@8JU;SdJh^Or{t zQ1=j1Lf!2y`qV1-xS*Q8-C|KiyGhi`cnXA7&5L$A2s|3zM!slp28^YMs}M@%DV9|z z3yB694Arf&gX=#t0HTo+qOnY_xof-f7Jx^yaY+sNZBk`bZe3>VphQrgv&3(ZvSoSW z*(J&^I7I^?R(D!x>A-QeNYi)Fz9n_Q~dnWWK&4s*xCyw%d z78wM}8)fRB8blPI((*MjHB|2V*8+607l%c0!tMf7*cCd@bZWb2RL}~T0+(V>Rn3k= zh)Yr0ON&~QurD-W7ao|qQKW%vR6ZX^M+z)@0GHk)7ivMO3v4z8@ z(~me6bU5t1iis>loq1~VZZiNq-nHH?-GFYqf>%!9|eBWG<)K>9S#U0LC^YmySW>Y z?_7|c58_XYoMWlU6#KypyCmo3r!kPyud}0rQX2O`xq^3&DKLRYSyL{ht+ioI-Ev&; z*j;4Sj`Z&~n-0N%lGI)xhu8}ODt09^4M`V`l6`r&Zn&@UPrk*s2=00}qB+mvatvx~ z+KP7_S9Ct0$qVY3r?j&isjuuJm2{glv~P%arN~cWKAG8i*FPLqzikM4TdDC%6G+1r zM!Qn>ZFF;J%u+rM3NN4;kQqK1!VzF^$W!;p13B?C+#PH~>}8dscJElaE79^Ko;~vz z(e_*LT#@xHsGgy7?>-5D(Ivn=kQCAua{L(pcubT2 zyrdT*KQ^Pk#P|>K>u&qIGnYUwsDGYo-XkH&qaPLb$OjA|S$en8 zUi~d4$D(6X108Bu=!P4n&)gcLWPUts8WS|m+g9P@{bSQ(Cv93+gfo&sLyQx=8mgS=nZ=8o1+1~6dboe{D=3Xu zq0_}>T24Q_V;7;w!WLXimD3rF5ikkS5YplmbkyRHr>QMrHO-p2sSI^>F^KZsPk zE~SVD{JrS*fl|}D&eMazj4*b!rW}4+e=xjrr}U}A2>GbpplO*WsI2-In!wyD8OLG12l4V*9oQ^;ey55< z@#Fz!#>5Y~Z^rNp=8|D?SY}@=G6<0@5dw$XlxQv?0Auf;bU^7(n@m2w|4#!|b=BZC zsWl246U}!p>O-s(wrZN6*K7=Y3@$5Ce)ZX0Le6g3NC2xFC%K}Mofer|-ywevc`orF zI!?VVMTe>JKYnySijDe{{qVgo9QaZO$~hA}m>qo13*D8eTVb!SdH1{vKE~d+@uh(g zX@-2w1RS}>h*&#<-4kuU@jYK>XRNetyAtL67Fm0|*Syf5Z>4oCE?p3mU0-xs|E#`y z>OcPLPxY2l_Z<{L+2QxR>iD24d}Q~A!Q@j{Z#faZJf<36zh4}hJhQP? zfO^v{@z(cb6Q!YF+`;u*Xt&T((zcD$W@fno2y8w+;&(#Gs#9S;6XVW{(;|EvTeDyD7z{5KlJ2QC|uO$g|r`fHs@sq=Vgy{CS7hnS%9 z*((7`pN(Z3FThmR8qN|X4j5b6OURXW7D|w^4UKGOEHI6K)g;)#EHuqeDV)A1+JgLh z`NiR@vwPDQb=iA6M8UE|n0fAoO=EMNXJoVwI9&w;h^%WK8EMLO3J{jjwmLb8ERD3!6^@d%W%GrypN0WSC6$`)J+D!IeC?k5vL<~4t-cow`VFK3vwf)eC{ z^vD|>xr+Ctt4bdnnAmxGPvvjDm>m_Gksu!{2;X+h;b`WNp4rISx7W;kf16jT>Ycf} z*8d+)ub8SK&T4+gtI1$?}gySk{8>du8x+ L^>bP0l+XkKo1um* diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotAppInfoSection_Light_b29dc7a7_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotAppInfoSection_Light_b29dc7a7_0.png index ff78aa035339c982de5ac9bd4d562f3ae04d36ad..c324cc2f257d9c4b2bade144db8d50dd0970386f 100644 GIT binary patch literal 40860 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 s93~jB6`4($jsV-(;(D=6{~4S{0D{ZVwh;M# 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

b$DUQpVY(~fQO5A>}C@!|F{RUX9z~yib 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 R@;OkR!PC{xWt~$(69CZQX5jz; diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotAppearanceSection_Dark_d19fbf1f_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotAppearanceSection_Dark_d19fbf1f_0.png index 0967e1dace814d15c5588f6edaa2b6e24b0775f0..a8d0eab5273d9491ee39d1e0202869ccc578e87b 100644 GIT binary patch literal 12837 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 literal 12874 zcmeHtc{tSF|2HX8A#I95MJOQ&V;gl#LK0y@xFuvC`#MZ_SxQC`vSiAV?6PMYh3xy* zjGeLX%NT~?IUjX@@85G>zw7!v&-ZzL*Y*7I{598{&pGdN&ilOA*ZckA-dz=zL!5`` z=;&BfZ{O6WquURsqoema$OuNZi>EZ{=&rJ>-n^mXVLU%T!RvIFEB?6?vPhor3gN8T z_fqXk?`Qf0AulD@IfaG(dZhE}`|WNG(St2N)OnfvfnU0N*Y>eO|Cjc|z|Zv& zW^gPz%=hCc@I&V>I1K$9(yWBmoQTITfFB`wdM5C5&*Oi6p|KJpEN{Y(+t`O@^1=bX zC6jspP@*Tk>1 zE;)x3g5m3ql6NYXvmJcZzQ6Js+$9Aj?U8=SavW7wzE;X#7Ze{&Yb9A`H|@$=nY2!t z&`u+^=K?R`(3@tu&6dK}kv>c4Y1k?Ju2Jel3a+EVy1o=*;uA(dL0+0-qWYTMMBmeS zxv0K1C2MJ(q9};&(w;4dns(mJ<7!+9#j~~c9K5H7TV7FAlPmGrRhq?xyYB)DZAUoI z4{wlydBf<=8mtYvClihma4LtR{G!(Gt7p=U)<^BK4;q9q3Kqz(HYiphchm6B>Vq`! z9M>hD1YyRy4-D}$>`wJ9?nsn=?6JAjieJa+AG1q6dEG_l;m@^L2b;j7o)k8)Q}c%< zdXTT$A88M4oc@nqJre^77%# z3B>R_nQXV~M;V?rlo({E%1h4TMkYDYdTAWjn__ldH#R5pcLI6+M9Z&+WrmKHa1y9x zTi{VK7Wbwwd|7gDxJfEv74ccw?3Olxjo99w9b;K}1hhr^l8b{~e*rIi8215T? zGxpxRfQee*c00AGvq5+jf7e>L`|w!=ZKXD;@Up0V4A^8rh;WAQZ&tL?*E&1fWUIVE zD->YNYydgAe zOQ)4Rz_I(;9+{n$PW^TCpBO&-;27?HmF0p6TRTE6uGd#1x!_)s@#{7{I(81`=E4`F zGA@?Cp8e1n)b<*X>ip>GVPEs=%m;b6eQ}wplwQ$gmZ0(p|sa z_ih(~?)(BN%k67-?@ayS+nv_Rho#)(fKqHaYZ)WiKbBGQH$;Cfr zA{&jigkJjdRKT7Y~audHG17Jnb<(s0n>Cl*X(a}$~{3&YIj=A>VsRbB@o0j`vkTWCzj zt{}6@I|9V}`2}7dUPv3Y`!@1yjZRp;>oVZw`wwK~-alqqZ-0f9t5~n@KTz<@AEJ;| zK$pNbSifIzpj#2h^R;K+_rn|m!{O@ZF<+PUeJ45#$&tb=DqOL!H# zqmADD*2+W2QPs-Qc??^*Vmn%XwQsyeZ7z|GDM1p-4X)&UK}C^1T%WqFOspo#va8q> z^|EKRF8+Na0l@6I$4r#=2HOx>_Z#y_+iqoALX(&kjFP^4=E|@%KUZ z!|dwhFnf!G6)zOL|7SPA%>O1|@ozhse|w?v0)6cq!MSRKIV$i?3YIyL z$M?=@SzBCAcaNMuxo3!f8{gftAKaMpCTzA=+z+-@d*n}&m6=*}Wt>d5faeWl5;)E)FnYR-ZeEi4>-qI;k(?i@r=k_vsIUdn*w_1hNT-rNojXM-Y>DeFlS zIAVKywN(|NrCGWU+p4%Lf27aMW5pC&>Pc|eRZ@$-DV6d$xfwGSft+}*A=P(v6WS6} zR&(dP#c@K}`Sfng*w!MRP04LYcp8c_K9tT$xh!hmdebaIIUALu^P({eaW;2++Y=yRxI zL`$j5LP5%dZt5EMy#~=-&s)b(9+FU;F;#C}o~C^g<+HskXgcpo&)t*eJ}|@gj?A!j%TYwk*Pbq%toYdbiB_cc&+5#ITZ{j! zMy>}!OO^SCp`ZWbQ18Fc!b=%nCa9)UIkfL1D)Fapg&?FKUfr2NRfV_*crTzc)-1QT zriFcZLfHn)c2API_|edz2C}Cauq@Oywp!ekOZ}dd#F2puxB$xFZrVWPW!mNbf`ox( z!FV33?X@e@Twwkbj|LZNu4s2;WLeOH|6@(VJ1Qx7r1BY74RIKJu0wVnfXVH+QI_fw zTLngLBE9C8&zP2S2k_%qz-LmT)jll!v%Z=?XTFfEEfsdH1&L#R<-cUsmW|+07_qVP3)&%KE5f%nUJKhO= zfxOJAa`L)&eXF$$^&NZtSLk_-58YBJQ zJU^`EGfrx&3e8T#`K&6a4umD+{57^5jC6}OBjx;)8xfk;*`=mxx&zSLO*ETCb}28H zx$zb{I6-~q@J6oF$%{mn8>(TE*0@7(C=G3{ z%%U5vc&@c+-gr+pJ#CH}GJ?^rLa9R<&}owap?*fE_t?@(lc(y3qcteA0W$T1-Dt^a z0`c?Wk66Ki_FFV5P3uIh6kKdqR?)Xlrc~#=aN?9dhY6cacBiyer%=loX~Z3G>iDUY zS8$0`aMeGXbBNhJtbKNh@QknP0rldc;bbG0jt77Wb;Jh&dk%o&fi}Dpc ztNyixFwLsZ?bBkdR=5CWxYW?2TK?-ngZdk$KRv=l!l*)7U*2SfuAlL}t!-$v%YeO2 zyh&rSkL?2YAzZy|u+U$Mh$>C0U_S_DVnjDedFTbRnlF|{@4DIx0ZksCCk89Y zL0B34$J&NcUU#ToYDdoRSdv}CiE6uBv*hpK)dcJe)rnZe<+UV4jMHS5svX}^D4)xp z2OLuW@j?rhZDC_&q_iLAy}eUOYCNj2G@PGQ*g<1U>Z`b0F};wK6=~>Ds%XU(USw-z zh~t)stdg-i30-w!-2w zKh`EE_{XYq+4*V(>^^5gX@~q;IR$^GVt>twc{8{1%R75h5#_x@{7oJ^-JE7MyBlN7 ziD6Pnhj>xdl2W;B_#iC8;--_Ga^a{>(5KG| zHLd${?H7GVa`^5(`O?{0F7WZYlly2M3FU zampe_o;ZW!eIYy&qIZg2Y9?RB-YW@c=?9tB6ZJ*%>|*5^W*MU124<|Klt+Wdhkd}e z_E~+wNqu)lnD_&a>163JZ-a|Gyg&hy>=gRuuOy|>bbI@CsGCxK3kC*lZqvD~;jKcY z<)U`4qWG zv|H`Ya#zx)c=>qcWch{rdi~z=jDo8ZBI=05xv!Ix0ac-JaVucOgcCEPVJh5cr;Y%V z6SBiW3~!1xQR^Q$w92r>a_Z}x!I$K2x9|<0F0NrUoe3A?r{qf7iR?FwWPxV^{fE!I zyZ`;WGOqx-$Eo)1`aJgdv)2ZFe{>&X>SyA0vVEsud84t_fUDTuvhvMjUeHRJW`x`J z{DK|hwFm*AZ_^-a)w^XQArpzGn8RnL?uSWjs{kWt#IzV8zcfYh=03r=Sm=H_w+~^u z^tv3mO+o1Th5A|a-AuvCmX3QE&W{a^73L5S35CQ(i88NY{lZQMNk^TM4soNZ6`tm?Q6bAXlUqoz?@cnw?;)bY zh&>sdr6wIJ`89fS7Yg+6FL?1=A#H{q>JV-?AsJzgZ)zI|CmdQ#IH`7py4uK#tP8@e zlcUQ>LCFZ~1F+V+xPh5JeSY$6A)7gaCVv|IBsb+{>yUXtlG&s4^6)#+hud1Zu|13n z1MDc5+Pu0ggmRRTqn$2|RPPQ*v>+zK(x@P6zXS|DCZfCN4wivc{;E}H6FBihkM@Xq zrHZxO!j!T_DVL$7ffY){?HM9ppXOTWId4H%edG=~AZftUui{#&aN6A2ufh!2Ifpfe zI3J{Tc)`$4pl-p7Z28AFmw?C=XDL0jJZ~69?&_3CC(cW3wbHY~3;ve1QD3a3PN;L|p(L%i?0%#BbZCsj-Fl5Kza z|Kja?cFU7G@vU8{V*HX3x%4XiG8YW*Hb?0At$X(fdg;%{qSC+9+^ zvxUD_scb*P?Rjdz5hq%_v@+9LOiD}o6j|JmQ6bgqGrb zmv42;pB27PAvmCWZf8QuFiO&ANGaTHb;uyTtDv^;aEJeK3UP8cNpv>OxmIv~^n3uJ zB%y&d4Cz|QK4g+EkJ}(B6@Jo|8uplalM)_dFq#k@F@G!G%}x7w4ZXYhz+E{ub!+SC zy2|ntM%b^j@p!Hg(tzlq3O_|Y+qqZHc+aQ#f+1j=k@>xeq2h@34H~^FTH=yRrIrn2 z?bk5@eph{Q4A9ye%7AUw%>Y~AwwTQw#VGdKceoZ^a8-`r=66@AWH%8Gq9Aqz6e<>u zn=o7|^%`x~o$Mrjke#uu6d&oB8JY=|rS&HX#B9xckBr&yy1DM5zG>A=kky$D9@_4IJ*M2&N!bb3hQsL&GO;ksFUms&K@X?94jJM&elW{=6`lXP^l zY5B?-s6-|39!CgvIMNLj$B>Y3rSnFz#;dKI*`IInY0~b`Q)T^re6uMG6*7#X<@KCT zX%{Umq*<$LJ!YymI)lpSD>bpAGg^?_3H9E7{sQEYGp&`=b>Abk;^|d%$TKx_Md4%Q zeD`4qJVoTDu+*kX)x;N8;mivB~r(*Czv1afo zzYc8*aW*)74DkKES9UM8DI^h#xL{S~2YK~{3h9AMg+ZVCH&GyhiUgu>Udhfh6M-(W zoKRO`?A98jS8?0wL;(w zxWIOD38aLAk_9f0hbsowyL86w6U?j={Of_ zr&IuT0=WWCe&f7B3grhBPr1GBkD#wDrzmQ5yFV-jo4F3K+)w*^Gq*wW(6o}`+m^7m zmb1CJG~o3@vz;&dQlfgr20c~>k_3bcU-W&^^S$-2owJ@%(ukSnBMEHkxY*3}3t5xS z%Nyz8I0m}wD*2MmO2zF6e>Qjm@G`QS`%cu;*zRa#rA`60$SPi;rd5m$OD+_@$qXLF z&>HZAulrZ0?Jf&MyH~O+Y<8*Z7A!A1wzt?C5qN>$zpPKycbX@Zs5!Pbt;e^{*sO`p z`)KR)7My~d+Z1-o1;iuiGh=^!vO925DS*{MpN}+QxF9@$w*~2G{)GT837~`9a$jw$ z>%ORRS=$6*%pO=|KFwv~iHYpeD-m1mn|uOtRzcT-eiwDwqh*s7wc#adY=||T4gpU2 z$BRjYQ@QlDA>oVG1c7`$5Nm06xUUyc_wqGxKc8t2*!Du{kZH1r+SqkTL$30*l~`4L zLdE3yKAQyb z)J2xuylhRKo&w8Z#BL@fY{$fJY+wnv_$p!N!7QS3Qe@9Qtk9w*`#2hxU=}JT8NJC~ zqtDqH@B8%xU3W>;vU98a>|aR$Y<&_sY2qQWDQ$7h3#6_hnKth*W{sJCu|DS#Hv0N+ zxPFSE@D>|s^Rf&Tk>7K&!k6ljG`jpM3svo|p;qT@cJyS3KEd4K)LXBC8q@ zqD6oiKFGx5;sT`)X}&zYnsw`jJx25@ER0@wfc-d0XFbPq!{FZk=!?87qq)wQ7}Mq{DaturQu96m5wmAI@)i@(#mSvQCu? z6T7trl5W$g3WhN1RJ5h#g};;Gb%g-4O39Ycg8?cHa zYfJsB&LE17U5$z~4%uif;fk;p)T}6-+1Shakv+g!rFR&Hz z&gnO5`@b%}J*6Hpi+bD#Y3PxDpTH~LEq`_3CC0>ljKwk%IEg7Bzc0?bTYhB(WW9%H z?Q*O-Cf3@=!ib-Z&*lP@sQvH4hC*86+=m*XhJtzpzi4Kl#FR^uR)LH+#DDmGLD|B$uKGvKvFQ{~N^ zE*jnPo*EH+?%W!C?-1;+94#(~f(Ue(E}y|dVfUpzJ7vXXaxN5SyWl|tRCtep4kKFh zH$1WJmB|ujmTv;;n(dK>G^w(@94c)q*YXoS>^Y2F7+t=UARJzi7+h--(RB;LS2`RX za-B8gC@&wTUHN>&MB|)^W8}?o_vsbkEOl!X4ywcfWQM(F=qyqc{$RS{D zD(CZfcGQJZ!R27A%aM}RYw&!jWOng$S}?7)wZ2E$Q98)fdkz;T(R?w>Mb; zIFsAmlhl-j_8QigLQZ??Ib~hT-k7P*>$D6UoK4BrG@t+4dqbDLk83s3Wiy>u zAz}+a?)k~44A{?uJsIZ9x^If_UOxh#ncpYwQG`}Qv-GWENDo{(MJNH>ZbXrXUYi9Y z^X`M1Smevea0Qi^-VJ8_<=dPblk#&x$HQWB6=6PitV%l?7Vkeie%`P*s9z8;Mu8Lf z$$c46bA)ui<>2i4 zLKKMe7mkC1yE*_#%}dz^q~+H=`tU3ZL8+P*rvr%lAPl?2s1u}}5PY}e@%{6a@hlbD zZK_)T%asN19UdqXoyu#kOmYA-KX_k5S883%iu$tkpJ2X`pT5^Bjtyz@N@Tgnw{$%) zYi0>UfK`|U!C~<8-;PFuE&gw}I{X*-_y6A!R4M-V8%X}2=4x*~eeEe=sG;2Aibvg` zDQerfsN8VJn3^}bXyjQ&p~mu0LWP}-xKGURLZU?!YTU%(V5p)v9|ZY&EYh;|qQf<1 zBxIm^?T1xRV1O@^#8vBZ(&qD5b4cvEC0u8cBQ|_sD4G;Xq}S`NrDo z6VIgBc1`z4f}1?i1N+O9*BSw|-#b>{?j>GfKAs>_NW7S8mkq&a(~DwJw9Ijj`7y*)R z1Un-Mj}aX9aIa6PFK~+hh;#Bx-d<^t4`t7}bPaghB9ms;SHkY{^-9fWV8)CrbRC~8im>_h71GOoNlm@ z7pcO7E}Sv0?$ykdELa;T_L}6{>#Z^m;Xrl$TqZqb!rhrE(at;r>($v0D=2&sa^p@R z&cbnBCQ4@@__Xn38=?|~pLzuE=;XrLq z&jp8H8L8OvBXmfz(WC~hmhJo~6~RIIW4dw5lTXUG`hL+u+7x3FdpKbfh1U+1?3v`) zijkj+@tj!snWUU`S#&zK`w098fIeB_P{9p`o(n=Pcpm?r9Hn_^GENQ=2V7zffZ)R` zWC4i4b||s-)#2l!?;pf`ac*+t3(vGQ%)5c3|Ao}kuu5szT4mi(5I~}K4n##E_6jy z%X8zBElV?c_(5_>*_6u zpb+qD|1b>SkR+V=hy`oy$p}DoXSIPFzCGOcdG1neo3Z!-g|f8{E>%VHofsFJ4wYov zO7>ZR7q%qfyhbm-{HYnI3qjB%4-s+L3yP4pDA|Q92@oz)GLTgR8&s2@jpwv9l`Z4w z?q%U!g)K`YuixxECCoXOu~v+dkiHKqJ?K+p-E#}JHY7g&5e4#{w-%?XzoFM<;;xQ1 zB@Gz_%prVgoPF?V^MAPyvT5EyBkq)}7osMOLZ2fi%HFT}bxTTLKt}*{(?3|zdUMeu z%g=A_D{7wX{v1?fe9a#NG$6`& z;B$r{I%II>0rK}VjRY@luF zaZR4%r|?_q2akowtZpY|X&d(*p`&{p_2V$yx-6mNxc;-TDDQTF53Eh+RaJ_(-L`HF zIKs^nDYBc8jA+?-;QbzqzCe`moH4 zjjR7TC#%VKfpvJyvGU6By@gE!1lXn#gT=mHN=?16AgfIfwWq{n)-%H92j&G^K7F=D z8r$ZJM9ex?@3!!W{X;YmyiP^gKJ1Fr7rPgR8G40WodfGK@0B&|r;!^W z9)Yh^>`?$_*OUbtpDhISR_sc7+P{}1*K>sJcs~Mw+`p6xs-zyt_ezlX5s!=W&J$9r zZ1<*Vq|d~^N64k>pZTA*tNj?rZ6bMnHgyM8_oe=;bTHVuJ)s7d-&MX&9VKlvOue92 zc{}+p+9E|WB^TE{Ig2;fq1opTzs>)dv_2zdiI6^>s6nkuU*S9u$S%Vtfuk)Q_z~(|?BftCIM)%n_ zUDM@K-19T7cuvu>jRq1dR_o0^>=gDQ8?w7KhUNy<{(zF4Qwj`3ni%S&;Ws0&xOQdxIpxFfJ)i}G%2wva zUin*T;$fiX$vuH58#~FfuI&LX_|Jk&FfE=v-RGdMJ*2`@;6xvI2F88A8pB82{lHgM z=GhoFX`*?A$zZlL1!lC!gOB zrvG{_Fg??!(v(rf`6YeLMZVeqkhz}+Z7VTXR`T<>d@)0>pd*}khA}IMV1qY7p$0}* zz4A+pBvirwFtxWGFp_l2g2NB&#u->8pz%MukD)ROSD*ufe>v97a6LHG=h2qH$BH2R zgbHtTAGUy2{B+wIy6{n1#kQbXR25|Nbk`~Ds0@gy%#A}^SD8hLpjoN)yC02W@UPF? zIEfZ{MP@PLSbk@#DisPoOQJA|-_MxIopO351KPQG_Xr(FJ)V>G$VN?%hkt)7$IHrw zxF#YGngP-j7vHViD_+Z0HH|W&+#x~)(gXh8_V0f?dN;B^#_PmCvd1(}NB?ew0?k>><)Rg&j(<9xdPBk;RR3v%YK|kTIRVOa zAA}wiw$D!D{8)iByoLeTfo^IVbdeo}hKF`{+^xj1w$S@s*L0uw>HJ5Nlp1|)xF#av zclXvZ`E4X-taPzrH3sVMzb7=_d*5ImYj!I5L#KQ^@0C+l`!STyT6^tYN7)JB-s#q^ ziC1lGjA?dY_&D7M{Z*kcOuT@_>4@lCx|Pf0Q6~OSdzuw=n6~>F<#%yQ-N@a~yr`Q| zM!vcoP=novlpun#RO{`1SceLllZLE>5~HaPMBF23;cX`8Z@R*U;U!@!lrU8nEi+}l>{XTm<6eod~sF#_Jv=qd!;M` za?{XtKa>LFlKpq<-c6j(iq%xn^eNT7#K1E+`eu_ruBWmdptbgmi8tU|DGl+v8*tlx zDSjlc6`|?$(tvmpb#n+!F@jGNhljC2cb~Er3_Y#ea6WhQroudc6a|dD%^u7nZ3KCN zYSHE7KAJ!^in#N8-ZTXLi#J>4B@`f@kodtzI@xpzmG&I~N>5y@F@icZc4eXL za8-=wbM!a?0SA=?clP>M0X9PtODAa?&5rqzU%C zrwpvJm;2$Hk=hooo7qeL5T#d1&c<&FG`(B?qZpL+zx#7&9IWN`Q#)N!yOd+Kn;CW( z%FhSn~{C$(bt<8b3s?>)~@kI0e)E6#v?F|PF4Bt&8$EE{Of-J DK@Y|{ diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotAppearanceSection_Light_b29dc7a7_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotAppearanceSection_Light_b29dc7a7_0.png index aecd2b62082a4ce5114fa0a8841c3cf66a03f483..ff3b997181a9c77ad71109f96ba4a789cf1a7b4f 100644 GIT binary patch literal 12619 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 literal 12667 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 SQ3rZ({H}NXa{k4;kN*!m*bcJ* diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotPersistenceSection_Dark_d19fbf1f_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotPersistenceSection_Dark_d19fbf1f_0.png index d619c670c07fbc9dd075ae186710fefc95df32aa..e4a809e8f90878dd68de824a971957cf3c2dc28d 100644 GIT binary patch literal 32132 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 literal 32149 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 DIZYSg diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotTakServerSectionDisabled_Dark_d19fbf1f_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotTakServerSectionDisabled_Dark_d19fbf1f_0.png index f1948c77c2181b29c33b81ff79f9a11a806212a1..f5310fc88d5e294f22ddcc932649803f0c5cb5ec 100644 GIT binary patch literal 28812 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 diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotTakServerSectionDisabled_Light_b29dc7a7_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotTakServerSectionDisabled_Light_b29dc7a7_0.png index 023b84a01e9302683246ec322902aa54c82d638e..34ea45c3ee2920bbd61d58cfee8682e2409108f4 100644 GIT binary patch literal 28542 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 literal 27506 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 diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotTakServerSectionEnabled_Dark_d19fbf1f_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotTakServerSectionEnabled_Dark_d19fbf1f_0.png index b6019533b7ad4f4873a583f563de37f4e45bcf3e..3b6e876b7191770f9d340d9b246d2ca19b467f95 100644 GIT binary patch literal 44876 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 diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotTakServerSectionEnabled_Light_b29dc7a7_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotTakServerSectionEnabled_Light_b29dc7a7_0.png index 0d2cc98188ea88697fa581a2e74dbd627b7129a2..c6271875d562908c8ee11f765c6aab5e60511d12 100644 GIT binary patch literal 44607 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 literal 42564 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 CPVIdF diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotTakTestCardResults_Dark_d19fbf1f_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotTakTestCardResults_Dark_d19fbf1f_0.png index 1e7bb644f4c84a6bef1e71a27b78802dd4f7975c..124c1956ab24d37d774f66c77c195187c9d51f90 100644 GIT binary patch literal 42947 zcmdqIRa{hW)IX|H(gGsV(m2vcN=Qq0Nw?D7At2oi(jeX43?V~<3P{f&snpN|3~@I8 z^nK6&+?|_qarPCTVee-@YdtHz>$}#DP*IY>#UjJHckdpq>>Ek7d-qWJ@7;T#`VbxX zCGQmm)4h8i?#W7uX?Pm$E?XTuwrJ<`huO|NuV`*=R?1#j5KP^;sF}3ay{r_eh{KZ;*B^VL3bPKE)j+OebTA zffBjj74V!4JTS8R5-;rW*;B#s@6W2MoV{Xy ze~uVL#rStK)&KjO`vPte0TlssAT(IOZPz6qu!l?1Kg--6O$OXdRT_3JG`{;LZbt`d zuIauU(RUf=*&NH@wk8K&`ezsG=ldOSg)}yUF^e>VO;5zKhbE3Hr`=*RtDE0MCf}s& z(C|}Q+5$NUu+NR%wyhlXxq;lo^|d%rUbpROSsp5rjgb^k?Dt`04#MAm*=^R~{p_!U zpZ(*o+ZzvJ8A(Zvvh`u&Q6!oyMP@;T{D$7Y8C)(l(n_v30bz0@>1b)oB_re<6|x02H9uqh4#pQz$$ef5 z?eeKOa^IcHUv)n0!)7lv>#3;eE;sGJ+-;Z~!{uAb8wtHQ-l{m)Klj5wuerUf3340E z7H}yR?B0R;z%>t3K(d&z^r8~X{^{VnfZLn*Tfanak449Uhcqj-i>;D#f%O)qD|M%q zoCYZ^=W0zX5&O%V$CIMk7EG8#6ax+Krx;H=9AMoB1Hf5mk}>j&hcEDpIj@j_&qF{p zvPp~}UK0P5eSIPdm_M?rOs}OHL?RvilmJO@@6&f0Ab!7P)%Ot-G{LyY4Z;$dh58;Vx>c${ zP-UD%gwhXldmL|H|EBuA6G}qf!?n0s_l&SAA9jF{a^@`5?fYh6z(v`28*$8*Gi9`XSFW1Fpm%Xour` zu+quoaig0f5;t3RoZ$08(VP6UsJ@!-lsvth{#TxwPc$mD#=Vfw*Va~n9jz+h$U1

e0H+`;=SY7@s)i@W+UvAAMtZ7yw!d7ldUY;bSgepyFdQ`e`VshJ@bjGhsS zOJ08c`TbOJnOQ0=BYz}*7mxL9b@mzZb}-;dW_8O02r7{vRm@msD&GS!%?oigF~|mX zyU^&Gyi*MLtin}B){(`aT_Xi0;Jlyu=;p}++{bgnrT&{jQdE2TN-I5JqRf%kIL|SP zQdfE;bD@)g45s}!Eyq66XnsFT-`$7S-~Lt(P_t;|04FTfOmpnNZIDh`1D*Z^DL5vhpRB(7nkTj(@Ol}A z=;Npk5MrDMQDvz1<{M-veJ+kRioK3E-`|E3Yt?>_ToSG12Q9}5pQXDEq>ZwJmxPeJ z4ImNftM0JmxMArAMYe6zpf$jfm^0Pn92*^AB75A=oT6-WAQr2LXsqMP(?0)SluV<@ z4fcTdckzMP2$a6UO!?H5VG?DVoGUgwymX1PH$kR30wj8MAhGk=*fWX=f&XGwj*swZ zsmkc}PavX!M2rl552f6$*bLfB15n1&Xb_Vjds%l;@Otq}1kp@)N+c%UNU;VX#iZzM z=Os=OqoSJA{Q6~O)5WjCxG{$Sq@E@tbZm4^tru11ch6^7x=+6kRdwglND#~n$Oi*} zkL1jOPO9EEIXC+OAxtUmA-s8eredqJQI9Rfo*wIfQGFkqoYz+6@WNc)(Rd(OwNSb& zV9=M;`L^_mk)-MLi^+d_AYVLwgtdH5_R78T66cNgP^+!8*AL6p+2Gy7L2B)~q7Rs{ z-%T@*u>-*76a)mS0%k#U%1_wzOJjEo+HsHVhxXd=?nk`+eRIARHx7jKlCxlbqK9Jh zgcQQwCyxHq7jP#fUh7Q#$FjtWsP=7ms$N^!9%GOgaz!Axj90Zlw>#THG99|-8{bbs z6mo>-g$}5gar?_1nd6y!GM_rhDhP*nFm8a{QZ{Ehkt7$gilm9WqwBA)z4KZXTC7d1vFHSe^vzT( zr5yW{POe_q4v_8&^z1dDrQ(C8)9zF5-T(irTQWL9f z5DKv}%OcY#CYCJo1%#cPKC?Wj0w~?U2P6Ca#KC_)I-)hI?CELO~%24e)y zhz2pb$UX0^vz`Gp1w7(|dKP-^RJBw_RMleQJ>@bF2Vt;l{PC7QlA+^MRmOU)4-pVs zk+UO#>{!v7*Qe1QaQ+ixs!ETK7(0fHXXHGT7iJ4X$;DheV8k-m+Bnl^BA3!O)h+Ij zEMzSsWb6&(+env?OeN3)V#Ncdo{8*NC8^A@4;*fTDp#K&f?4&NO9QY`4CdGkJ4<6V z-(C2ICa*QAmSf_*q~E9udbw%`$W<$BQ}~q6J`1$CH;}4GQ}Y~*8fN#<@+n{mZh15> ziV|098JPNBi;t$JhXa2L*EsJ{%1KHl13CW-4)F_D;ZrL7wRt-Of6jdaf8Ljk7Wyh; zFP1$!_)Nb%B*vI2*NoEt9T&Cd)7tgCC-v!wMfD>f*1sueUH0Z2E?=Tz>@}%qeNasl z9U*hUq@44TNh!V#BtgGapgYGa2sc^Q^7?HT*c|6XiDR8Pr00u0i`#0! zp&`VbHT0>99E?Qa;tkJBu?IuY{nHRoALSIicg^s?mYRL{PM*|7PIsYg^FnURF_jH3 zZCNoXeS7>*E42mzA6g32&y^t^Do!n@p!=PHX@`dX!c6hgBN~T;yb2GP5h!CF&(;jY z2r1}fV#m_?U%Bt5yIc=nuiQb!!w~aVVNOC4wj1IC2ISSIH3diONy_DBW~-*8B*}ZE zXh*u_GeAbH96^6+Xi=%1UsGm_i8oe~Wao(*im|XM`k;j*J6G+EW261@+dYgoUpoP0 z4T6SXs+B0`R-YY5Ca(0r#B}iz^;8)R0U#&`z!1|=-R~QRTvf5AdUj|HHGuO3X|!`D zbuZz0O4#h!8{z;$%j$J;mI{qL)kwC`oj+G(i$o744>m-1_K8Qu0L?e^!QL^Wm)ZIw z_ga3)YBr1usMQz>Hz|K*8%g&-bD-F`0bkD4d}ka!9Z6kzcqt9#9j02Ts)=U(>?sN`;rZ?#%8O>Us6_jPH9F%6^27i_0=-~&mLS$QWjA~&gGG0?=_gE zzb!VGsw1LkwnA|Q^6|iBog)7}AlyB@npU+7q!M864uHA;O3^k{9TZ1&7B7=H)B!c`EWrUM~)%~&V*IIokDgOn&by0Nug$$`Wo&rIl?~8k(hU$B<*Pb zEk3@^{{W(e=k)+AAj6^m8q$Y^gKJE$jfqk8(%is&b-)Hql8BnWq!{6siVqKRe^#r; z)dsdF5r(HZ7~77@JeQ;TNIM86fZKfD@#L2(@eT;Wvyry)x_-4U1REqmgkzAjaW8aw zNayaUW-kMdfH%cZYhHh%WNAf5VpEL?xzL-8U#xAjErb4@d|3KamhwSB>0ZTKR&uH2DoJOnu zp&H+teuCVC3cXLax90$(()#0!jKrurvu-1B}l z2Lc=Z`b6=W+=b?xhsr#Q_3%;gVw;__D!t-5{DXOD^l0iz?J38_H9Ua2%nGl)Xte(8 zqj;weoG`8@eZ2JF&XbZvFL@qb6H=&>`83Zw=(y>JKP64y}nN?@VnV zqDO$_a;!ac#5pYu5v!{P!YT$MG`UV}j!_#8Y{)#I;P~v~+1eq3ZkuPh%g000a2jBd?RprlKo1ANJpTxPLA3Y*v}_;3e&KEVF{Y#?){HsvKyswb*a-n?O7f+cWZex$k%D zVt{fmTKuJZ{UMU7888%dpOXjiPK1finyL7jY1p1x)2wkZ@PFNaY4N5$1XMK7SaX`` z_((#~oW=WKW$6w^f<&~P82N4GnF{L|*07#WSiLE_3uuh|@vl<{L-L4>7l1n9D0`(A zH-LGQhu9+sg^bU>azuh%h7eX8H- zse0PeBk4P@_2i&lv-+wX4S7gjKx?8qNW`R68sK4}7s&y;BExTvShP+0i0-9sL5>wT zgKkbSw@ERSyz;tV7Sdmm>tAjfT<;fpjYL%NzwVcYwA*)IST?f54H!xm zU??4cp(r@|p8pKnZZ(!qM+b~0lDjw1E6n_&S%4?fOL2p)m(%y$QIl#DEx}2p5*34R zo$HBVz_lAOxkeUd>>zc3eoBad$bZ-yaA5SO!EAAXSOw9es4}yGixR56@qKR8Bd9RT+ficya96US@Q?nAMxrBvl9!zT!MBCm}5Wg z_S5-P#YR$5|4tCo7-0smcaqJ-gX(ku7>VkTUp}%xi*5y&6foy8pii|re}}6cUJr~! z`ZuXVI<-}eiO&HPp}#57Ji<;U(YzjqyXo6|5TcmLtLrmjo(M<97-|)dJSJ6pKO0(+ zj)@1JVKdi%3Yd2*A%#D9c1l^a>hIP~d`!L;%HR`Y49GdIAcuA0olL#}240o^k%akA zoks!Gd30d(`S}K`ahFM9l1MwPGma$7OU?G50EDlLt&`!iR9IzR>vdRi=?3Tyupw!) zoP9BDycvhqyJ3i5do-0*)3+GlM&h_csDoGr!cElD`Db{gVfdkXCQ76%tSqAq!~d)7 zBb!2Rnij9I$1l@N_S3Tg+s#Tycl#Z;OoIcv&%>G^r>mr6%$ z7MrUggH0LuZI2CpLKFVe^?02dfSb$t?@IbFs4{rn$o*G4oup13JJlW2b#_;vWie3Z z3$02O}qS2-wh-+c6kMYz2S9Ov9^xV7<1A_&c z8meEs`Hw1@Em5ZaV;ys$0zs_zi2;AaTZBn~4LR;`UnpiQ#qLs@dP+9C7#TqufP464 zfRc8m`$GU?VmZOVA4aDhgmN4)7rHRy7k?7ZneJqmx<$;}YqDdQv$NRcD>g|*PYhJj z?>_N4RExA!xbH1=&)y@V=+*q|c(%go9IjFjG$3YR9aWBR0#$O|S*Zl!TZs67isgVO zvpAgm`Ub*_Oj&t7$v}!NcB6!h0OAWYs-6XhHR%sP4F@(lM>cv<|Lz;Do9}agsPMMd z_gHqb4(K^b;1V$cj6gx_&Aaenzw+{OwM9FJu!Vh^x%p( zh~z(MWUkpR6J+!2Yd+|XPyrl`Afc)bC;dRteGk_L+UZrU|MJU*Rs3qHtC?-xo*mN- zYubq3Q$VG9K_~_j8=1;*^TInMW5H(Bt)D^%>@+Wvi)_O=m-)rcW0cV6`T^Ic+s8=F z_>7f@)!+X^RIG0sRR%@ewv!{V?>uW$*Cv>rJM}nugV%QMD<6U09}kPQscw@_@z|Z? zB*yR`ZIagAW3mPCM*EW-VlK8)ej*A_8ro6uF7ba^oA%Qyk7`hh|Mew^4Xe`r8Tq#3 z<;i>E9b)YwpZ-wXa-5z=@yx`7wO8FT&8Qg0;+k#L?K=yAn|)^-LSSaD+*6oiMvwv} zV`LN&)Y3FUs-~29{SHA*!YXySi7^1ORb3W{WPqw8h?vUFw(8~Xd~CNttDcn@PbQ8^ zv(9j!wfNaSV9!y(ccsR_144VQCs(PDC+UHmr*aH_>G*Hw=@K%jcU17dcpQGuY)Unh z#RG^^Al`Cj;vf7kmeZ#dQ&G}?O~4gR^?@zNqYe@&3+12LOqV9OIjd?s*tp?UC8TK9 zd=%eUuQ*MT29O;UW_??^0oA4rb&C4od=*@H=_?OQ68}?qGt74+`8kM<8EmDIY*jVN zTX`>N%*hn#f6-ms!`^#1XBJmB_e`tmZP7?OP;F>tVS}UgEP4RAUS`@b4-No>m;fJw zsY1+54e1TcZ65)NW&1}}#fbM^4fYSyKG35hOJO0bY!@G zR2Bd!1YH|mGUsdU>veE!m#FoAies5XDBI79;&6;zd zbYWFrB%d4C4`PoZawJU|?PxHw!%)x>k_uqN{A18+tY^y6st@Kt-2fS9Ob$VfB4O96 zn_tmy9d$P)l>$#fi{we%ggVD1inJk?rh3E1Js<9a?vAeps6o8@h89G~{2H1s#63g*V-MRCY z*O#ZjkEtu^JT|Ed7{h4vVdj<8LZWuEWB|M12}FJk0Ub2iKd$rw;P%Dwu@>pGE}p`y z$>U0v=Ti+>U z>XB<0cOF5^PZnnwzd|OjA|*AZJ}JpZ7&q3j_t3EZeK2Kn%u~)j*(Y=UGBu_B_ptpG zE#w{VRkPwOdIB8u)S1-k+RrfRX2u+SvD9`cf#!VH4_*~t7r$nj_gX;`JCc}`dBHcQ zH8UcHfJxRmtw}fKVh6mc3%Cg=ScqTz~p8;OG;^?cC z7G&T)E}=p#V_ew$q6N#jX1faz_r-MpCRCFxFRD6vG6nGQq?OksCT(DBhh1}D#x{EX z9$u%MkNZbD?vD&2YC84>cfNSBX&B#;Z*CN`Ou4?R$utO;d|Ubw4vauRwH8@?H@{1A zwFaGlq-4-$L~fYLYo~@>T=4{yVvK3;RcTAahdlI=-oV1$*H80cUB9bYhg@TRUXHjb zw)LIt5A(7R2w&D})Y`EXD+JN==K(d6wGlhL@qr!^SL%?6p*PTFhZSYG(YEUy&^H+Y zI(#%MiqS0CM*`Gn(5&ILd?W{13fGUC@7Xp%C~W$z#@R%u^@@@tseh#F$uu5opc%dQ z()CV0M*e#aAZ{Mopicnp&{Wa-(Isb()#(xc);yz`MGzg|hOeDx{?@(F=3(d0z6|^a zi$gRt08Fy@Z20ajVLzKEoXw&SX)peIEWIBLu+N8Pdhc0EYm+{%T70MqQ&D-UX4*0N z?UgLmDEed%9;IOEb#NbrVYZ-~+HJS}vY=a~0tZbM3rbh$|1<|s7uUUinGm=qc5~D= zW(qM>~eslG9je+Fp|%LBCKkz&+A0be{Z=!ugSV- z1nYr=q;jrE)yNpCyvqV;T+F0wNy&b_ z1cFmfZTzzrMISZ8ZAN|s_h&O<1$b;vmlZZ!1#i6Fa0=>)6q@%|o13mNf{}`t>5cHe z!^cb8yBtAxsahc=8|12U*&I`~Fy5#9N6SBaNc>3PkW5mSkc~y7XWgm8eXo2KfTT_g z{5=lh&FHvfIshO46Cn(sWsb?vEZdg~Emqq4n0O?htY8d$_f6{f4LQ%un8~bBhp3-| zZzj;ZeDI#8J}OSbCZafe-eS{_J}Xt+viHl20TF@i{bXn@hD!MDfW;aj`Y0I6_DeWu z!}YKjTwXpxA?h#mb%~*EWQzyzx4WhlE4oYN$=;&&fESIdi2JS%)9|x60(3)OW5X1n z30i9AneQPF>^IA2(NE0ja8-(!gtzzpuNiZBEzkV4(Uad(Q{6RoH$-Dmbfbvi9A4*l zk79|6!UzF}OHA<#3NF>iH;v&7yKAG(H`$~eH&0|IKRPCslzn6#v}Te{OeUn`WqiCj zUbdDm&rhb`jQOza0Q7U=wbw71Ibzx#SphD9Rk3pOM2#OLRS zG*qr$r#nQpHOM=Nv(NhHfcAm@K5ao{AbOMS!&SxZXgU!6Vito*D4U6_A-ww+v3fX_ zH~`a&LNW1xrZuz9aR1`d&YR1f`IOv92=6V1@73WT=m&bzhf!Gz5_ZGNe=STP&#Kyv zzJWu#^acos`>rmIXHK75^5k=xK|b$A2^g(XsR6k-`SIO|hU!3q!6m2I8bDwJEl{pr zUuq!yx^B8he8+y6WVM)Thu5ybws{iY#m4~)yW>pC|321BZZ818pSqjuB$;6>MS-{^ zefci_V#nyV-1N$L;|ZA9s8$goud}!LL(f5Ru?8q^mA*?sfaB4`V&n$^GwmJ>Y{bJ- zS05EkSMPP#rapB!ozZ^vV%iso!yxER1XIp|L5{#LuJs11Nu@>j9Vmf!9>@L}aRAu- zyS)R3qVbmQ5NND9GWr2K`R)Vn+M<7H9@IAj6g~|Wqfe~f8?q=zc^Lv-FmwCPLuuk2 z>!ntwJd3EhFV#yV@tDSnkW8H+KT%-Vo4cXRZ3#>bxOGEVGUw zp;E40Q=LeX0kp#A?*dTDMu`t%|2@)UZ-M7){FA$fd+#3prYwTo<(|qD3)WaWyc_r6 zl$_5J4S)iL-BdJ?>h6YM%62e^;{aCo6VQDZIJWQwpr}b@ZKi z{<-9Y?vD1)#eDeZ-n*X*zL*6C|NWUT?*H#Mv%@iC(+s@_D)pP73fa7i(NB4LPj-2F zmgb8a%6xpdk4rMG0j=F#su{2KsO|h4uM<$x1^r@^hyVnlt=av|-b>c8^Jsg=@@K(D z@df4HOd6p3Kbjl~rnv8nR?~gfK0^0}2IznC!F+ABD)nvNHkzyb)A1FJ#|Mf&py^t8 zgsr-fwQ{}#yRrOHy=ZP!^dG{^z~BOHGR} zZI|TyUjMzXATM5T?)0l6)9kZjd@(6GN8gigQd31X4yS>C&osP1y!yTXMn>2}TGybp z^|FRyrRCyniGNdJ8(0Du>s00FE;a|CE>_=uxlA)cdVnk%{>A--R`{ zV{@{b_0`LlrT=@^w~EQvF1k~jcK?sHG9AiFc>isc0nM2_ zZ8(7b@7v^nQL?{_{(l^EMkdBvmh3+@?OL{VK$bt z2_9oNYq{xk%6{^XU+L?$LL94pe(G-uvw1X2TRmLN+95bw+G+os@9(sv>gr5qRmATl zzvPUUW`*;$$LyO44Mr8xOsda&c_M9yXKhQU=oDl0$jf#<^#Q|2e*`BC!^8#gg-!Ze z{Mh5SVpPy`5OgJne3U``x2WlK>CD^`w`aL-+eWn4$*_Y4T|z0v%7S6tM&obp(vc;# zhWvK?q1eBn8RT_Jw)Fet2ft&`v89SdFOTS9i49okT5G#I&-LG$!`9QCg&7U5xl?{d zyjS6%;h)?_pME3YFL5*7RS=l}lN3M#P1`T|)VKClmdGR@>_?P)EoS>jLitku=WV2X zniXcDvAV`*RNzuFcS%>w{REoAtyhTX&NvY9-yu;A!u@T*FSg6bdg~#A1kojKJHZom zggS%iUmZklPtI(oKW}I$4<#o+#sg&cN_!(fftUY~7Zd-sJaFB<1O9yaBy( z4eraakK2T;Syaome{_Mp9Jgp(_UHM=^c(_gp`OQd$LB=KnHdcrb~9zkf!WsgnUb?~ zr5wd$^TlK)lF6cPm`9Mc`Y8qg8>45>x3|A-f{ssWwf|f6`vv@M3y+$U`E0(6!|_iU z*k>W{ljz9j7Rn;m&I?;vqKLIW06ZM_bU>-^C1{bWWT@#ehoY z2E4ddbW?e^UZvk8l_IO)_*g9}m2!-Hi@kh@TOp`WVlZbS3%eetWi}KhT)*>EMnl(0 z4F56w+~#Gug@OQR9U-ku4ZqN@w+)W0E7PqA^g?t2eN$Ggpu%`C$p*$G%{*Yjyvs-> zj<~Grw>*vEr3a4eXS;l|%OxAM37B{|++G_qi0?Nax^EydmNTC)#<~#W&XCmE3RvIL zd~*di2?o?!1exXEFYE!u(saKY8+ODKc2+Y;dc+76C3Pi0mzJaIn_01 zDR8I-WK&2m=FjcFmZn5LmkGIqo{~2!yqegl3HU|NW}cO+Mp~d&3X3`l+lsdZ9HdNY zXMgh`gI$v@Dm)ScVIK9$rySWtLC@7&XR=n^D4MgCE?&kZDV5_`bsH{=HOq)UDY5g@M18HgeZJ zE`=7@voJEYXfN}9Q6PZ2Wo~%vfBeY6h6uAkdwfIza%ynDOJ?e<-?hSqND5#EM(6T$&qG9UFZiQu z{D!gB#M@+d793b2XIuHSv~qrTi!ZwUarnA!>Nd29#>Q>=_6=o%d?-w~I{Ks0$ zl-5XGqQ;DBzbmvmG)H1%Cp9Q#I|Xbvn02F%X|LL|O9!F26y<&6bvYv}>5YL$!X76% zj?CHi(X;k_fuLxk$=KJpl^ls4L2EH%^= zQKBU2c(;Vvp$<5KWm~38;W)}29;*rswinWajlZ$81$@5BD?k?4kv=}BdwjH-6RQI| z-(y`44k8-YUQccAX_8jophy=FENrgC!>ZKNL_m<@+q`e@k;}_|9~?4N1K6*87C0Z^ zaqlh_IV|}5&&K=m`uGUUl+BLmrc%se@2fA$@%YP~3gXdKySxkDc?AA8{Tq>K@q#y_ zNYpRwx%yV7VOLn`9KVSYJKPGgZ42EyM}CBnASfp&Q!@uaQW-ZQCU020-;RH3n4Y(~ zjFy_ve**)*7tH{cpk4~sfkI4pb=vVWc6Us1`{%L4; ze78n9i597V_sMYOWQeb?gXoc>7q1RTEA^-M_HXU)rglWhP%v|s_P5cR&YhQ67Fi^T zoMILp5`cj0LH#5L=4_!yjtlQ7Y=cXgmTwGR-Z~`EjwLMYsXekqgj=1%lL(dK6OSn`;C2p(>^QqBj^q)f<^giYjN&V0Yg5G6Ak9dF7nMH znbhfe81)L7s1f7}oes_1^l$dz7`U#Tim4l|t2fY$$AZ20OD2SJpR{=IP2!4@3t6oT zNQn266V1Xke*s-}f2hwab_{15_{H;Cr>9QY60@}gMB{o6NG4u-dO;P8_>FaOMt(=C z=IaxL4%K2@$GVWW#(9@yd_2XlYup0;Z|_9JqiuqVQkcr`ZDGeqYas&F-~C-L;9K-^ z`hYa=+ay_11y3qIZ($i!!uSI?_dGqPK1#2qR&|U+{o*pVgdM&Z*vH|B0*Z-@LR6uH znFoHDwDQ~?VYR~Yz|%07kc1KBID*$Ea8bC9E%n?1d2 z6IR~45muEB$Lot+nSV^NjqIhTt@V4Q14d4O4d=D@XSSnurAg)Vk7qgBC$~&AB!9`# zC0t-0jD~9gcdvXvJL1z8u%(>@+IAvMa=X_ehu=QrGy3It)S!Hh_>Ydm5Pb1V zP)fDL>NSp4!LScM*_vTzWAh~AXOtLOFfGH157N#xB8RwoKq`eVN$L}x;6F(zSw34Hy;G0b&lUYE-|%7kOXhFs@KuZ z5s3V-6xD(Zfn$>R#KhDkaOYPD347Oke}GR-KH&Emts`f})7UYO;oVMgPBQ%vJ^!yx z=NFwYM@kWXIfxT( zF$^s|Rt=~TXX4jCk0s|7Uhj;spKfh(p&Yp&d-fZ!S=C9JO)js)4ea+w(>_Od7AxD8 zUE-wm6>BnPW2t#ie~4A3-5VT2Zhr|$M>Y~xL!0b_`5)>Jj+KV_pGV9l!Gs@MU5CnP z&vfpUf0L9P=6t`&=w`&ENJ~WVVHbS079qMjNaZu4%f>xL?<1Bk-`sLViBF}$X?VO@ zqYxEvGW4E!tzPrq!6rx@g~~y%(?RV(nqHj&f5U5ZvN?;MkucfJkz3QWuMhPdw1r>i zqF*cUBr(QGL4?Vy(_Bi&K8`FCd+cJB3T2kr+r_g5_{3x-Cfg&I!{Ozj<#dNbF_z1PC9Y`*PrWQP4Tl-uJdsPWI=vOm5**6YCvG5qN?=MHTA})Q1 z>3W^6&f9td)D!(F!w60(Rvi*Nz;rT`mRD@&ubASR>?O{&%pUIZ!3G{k$k*j?MdFS#=OD%(39b(@x=F% zbAQKyv4u4|ktUYzq$t;yadJ`pwK)pIk4Ql8px3Jkj>er$Ew-)_shot+R4;^>sXW9p zME32+h#0J`LB014no5QA{N~E(`oP?0XbUP0IjtC(FkoBjZfUIFF!+_Bezgnn(Fp~< zaAvFwpk2*<;7%hWF_ew^=orrv_Ox)vEB+Y$KcnK9OxkO&e;&5OAI-e=C}68|mMGK# zH3Oq`COdnI@Zdb#u8W{Q5dgUj37oudyuA?p0?C|&iKtK{TGtcvXl=C`CNKN}191NL z0VuiT#(hM6Cpd}z8z$asgk~q{!HsI87!K4n&!&>4AAQur8!_noo(m$abQ8Yu!yE@l zxt34TIC-6qxLI(S%z74Wo{ep>uY*8hd0}CQ<2<$JW}Sbqj&xvXp~oCPgk}*`qTslW z@Fy2>R(q=uj|q&;!gHEk>B+RYq$7{I3YlGlP}bqQ)eCD~VL^C`PEyxhSlKHNk8xQ3 zlTgKf*0$@YlLPkA!w4rok<(-tb?~Q*a@kYz`8f|J@^Q#3YMExu%0zGBVISuGy9Bpz z`t}n_iHJHb1Fam@(x{vLAi*3(HRU z{A@Y;PzH{7f9H*(l5h@%08Isps zass`ocz01?;^&&OPMMA`J<8Ei};vs-201LD}sS*UGUnG=|SnE8M%2<2kcZ-l&G>EI~KMI6%u zT}lSyu9QKA(Iu|lgj*zTe}1RaFS`#dkpKXn@FFJFPKHxT0S|u=_;3}9+I@2L>IYQz z{}hXc@ssPC)AG>Xyr=ey-gxFV;mT4Vy!Jp`^dWPeKBp$<1xx!W(>u?%g&#Kp`JhC) z3StRgBhf^O2v4+`G@}+kGs5_SmnQdA5}Ya_5ziQ7i1LSj5H3Lb26w&cvosaHH~26*1t?yJ;hWj0`v zZkE=}nV|WbdN>kymORxa`H=19h7~tIQxihocrOT1-s5 zw#Lmd-6)M{?PSz2{WjV$t~xG()fNQ@4HI(VkXG0|T=eMo2)6gu!4|&XJTbYR=V;Ht zDK$BXD1MzXrXjwZ(%*g5J$YE(J?nOEM`TyPZ8(`N{ ziKlTDp#%gB)cbZ`U?wpsdVc+MS$#II@R87H8$TqCw5)(1usI~5O9V1V4Bm2vX+hW_d37lICdsS`N?%k1p-)ZGF?rODLVC_6Jq}go>xR$u|0&31mD{I`eyeT`Tsm4gk)_2JU_1o1 z?XiYN5X!;X{m~n*+i+7To!{vN{GPvB1@YQ(eawQis>PIE+vtgNko*yVZqi9)zeS<;G0pyqtXJ^F zZZ>-8x(Kfc*h2#tEq#VJ`gR0{;l3|ex!M3ExBuIL=u1G)^W^Kjy@*iH$%CjKaxq2& zve94skC&4QS?5?kR`mqPiv@+Oj@icUj*;lhi}?9~Rdr$s4V>1&4L_r8;M3Hev6WJl zwjj1qMoIy1-o3bAzv?tWkj!U2BQKnNs*eor_auI{$LWq*+Gonej4hjjE59Je#UrH~ zmNNvz;~>at8RMTLq~Nw>lZ$E#_-0MKHuy@2c?`8tEX3~QbvL{v?;uo{tuET>CcRM^ zBB$Ez@fZ-T(x5}wP82SHa?+ZJG$%YofM!rJlKX+9Np?B^v6vPrzG4x)l!FCNPT z$9-6w3yAkxt)`?Dq4E_7(5b|FN)_k?As&d8fz8{Fe9e*E?GujU*(?<&$&gSVeJG-c z4fv$>u6(^de06p{1!4?G!H6qKG1H42dnHT%WjRI^MtrZ$+#cTDuMw>%LPYT{+;en) zsi-D0A$_G5IJmAyC%A(C$_^;^y9CS?staCvANhepLSR!!uiEyw|MF~P!b<#$(r1C7 zu!@fcvJBhsnF>UF<8{!)eYJ2@83Ca9k`xH5$Iwl)zt)JRZoB$jH<+WwX_Dd`L|67d zK0laSG0Xj@gq3^@y{(#OVD0^BJ!ST3-fi8FSXqM^L)qWHToY`td|Sk#3gl#`g9+G& z7IHC=Mq=eloR&_nrB;D!yAV6d3;p$u2hYMdZ0Fnc2Ic^RqzQ8{CgdTdNr$LAT-oFMvw&HQ$*?$!XE`P%@uTtvR2+~pFTdN!g>ophi}DZ0W(hv-kF>B?=0vEe)8Gc z<%|=#h*_x7*{l&L5-AyX;}OhU{DjY01<$cYhjn~o(eW6e;2-|1^L@oI4H58M9`MVv zeIJ%ReB*c%JVPDMz7A2y!9wc67d-~Jv->**_wDa81M^D&U7_1-nsn(=e6D1zG_fggiXrHW;zojoT zk4~OMj(2PizJmMPThB~%7bDIwxxaU#v|EineLjMSE%=IwC-8FP8(msEi1s&&wkBq~ zx$QJ;Czb3p`}o&>*m_QMLT#MB)C+3NSm)N*{%~i!x|d}hzt9*PD`B-okx3j1t9#gK zXZ;6H^aHrqD%F%6>HjBd|9*OxwLdbGWjw8I>pFeY;DoTThM7JDKK^PevsdP}J1i_$ z02vfAv1;GxML(#}=vMW;!LG@2C&lfg{_b?xO&?>ra zogno?O78&_vhUm7h@?r2%0~qzv`j?Umu*2h9riMB=YM_s$tOlZM*r@Y&l=5QB*&l1 z=lHpG5Q=adfMq=uiup>9;YKM>ZokWuXedyugIM3a9(tPTyX@dO`is@$8j=l?P8@Fi z&Hbe8>2sj!sffQ*6dLZ-t3`LksD!SdAUw_C4Mg9^D5xK|Fou(2o>c@N)ltIAhtEcU z0||%eQOzYaQztex!*}~6rw8M5#k7E=b zoL`9YHFKgss<^|HNIW(^0g#!EQ6Q1-{jnoGTkrjJm2XIyM_&)JUpa(u^9Aaspb(!U z87G~{T%mpkyq^K8uH2Wz+kI%`JI6N?5Ldkkv|9q-O6n2(5m~2~n7DK*HlQ+NC~ihA zKVp}BLd_968JABhpXQ+8^MdTm1uc+Ix!!lI0FFl>euTD#-_TG<$Yi!W$v%4e2l!BYz5j07V0rR%%E8E{6vu&YJ#~QV>UGxKr(JUMG{?ksH`#E=3`-px1_cGFCut zy%w83_5jYM6?xg!4+1P-R$Abt#c(|?2yeYpS}e4D{mAF%k`H3wOUhAO=q;ov7>oeWg*1vjQz&fm_5?wrUM~_21P1!UyUY<%22(j))~RY1 z@ZEed^9XRwHPKA#Q)Ie@UXJR<<4D$C&Ubz2+?JOUFRvlhJRYtYyFi6-2nN?x&DX;f zHF;C0mUj4VTqj4jUYE(42ceid++)`un-E5NTlsSg zIH!<2H^Rhwa|C22wyj#YaQ`^@)>N7;hJNn8hu3As32LVL%?>=1N*JT;r~q_|ib22k zN0R{3cH*&KP~{0?7MwrFFL$}Uu$%<&sn><2yrb=_^X5nwlY)_I6u36>gtSdo+gP+&S>gO4{h3-rvi{nH%^b}bvO7>7WEvdG0rG*u z$pGDiRM&fsGR4^iZzy2klWu7=cizU<4bIqf!^TG zIhg_H%wZFjE<=AL#YBE%qHk1Dk0|v|2N@mdn4NUG(QJW(JpZtJGS6fkvLo!HUxkISvUSO*#d>12@;W`U=LeM_!a=F&27gkFlD9 z9-m&>SK@oFGE%0!S_xuO?_hz0*)YO7D3;FGN#Y+}L{^u)BMI+%Ify;JHvn{o!eaMs zNoXX?B*SPj(5>54uLcU(z6TPG2kz=OIc&a0V?peQaST^=8HC%S-k@y^RXEb$CBHXj z3k`BS`cseXgs@K_{3vVa)CVI04tx*&PA;B?skz<>KJv6iKY)Eq>Vs9<(rics^S4EO z*#E`eTZTp5er=-$ph$^G4v`?^~x6kJ#Dilq~M ztlC$aW{>9)GEiNqIZeNk!wGTUk8)L;J$@USnq z2Y*i##2YN9{gh&V7`_v)v1`U3()5rM6tFyAF0|7+%GXGzHeD^0ROrMIark3Ii)h5^ zBlYNU+JYlwUM%qGRk{^%9W~ly|9aPAZ;!WFA(!giOv-DRX{lruQvx8U>&T3y)U-!# z>c77F74Ll(OP2>B>Z6x0Jnte!{f}fL7s*<6EQHrSY-mMy0E~t1F!d+c)9nyC-g&-F zl*5*F*qoMkJg9jVX?aiCseFVAMs+hg6q-;zxWPglfuEa)8GeG-n0cyGeWI(49T$6I z+w8iluNJOF9O z7L?2WQ(H;-hFR;j=B_LIRESP8E+@pb;a508JkXDGy}tTo?{^7mAkX7+sg5ia*7TQ$ z&y{`V$rw}4*g{(T@K=>iRQee3553w{2w~kV!&|rnK1tu@771kGxm5g85FQT!ufo*hrr^k24#u%$l)D$e|q3HHRgAFiSL zFeo!7Y?J@GdD=Dk95^jTt2BTlV19#5?J)Bul~ye!v{%C~YnP&ZpqyoGU|}>qP6+P3 z?^j#<7ExJqt5YEh54@tgzw3SudZqTCw1ZE06e9!zDo*7Gsd$Xdv1rI@&K%Tqbs zPF2H|oe>3-@96k#3uZ>Qy|-xzADzjS%h8D%>t?t9_wjAd=MSr)#)q@{<%gAk79h!K z7iPD}{SMPJW_H@-Q;fy(mj+{}U-<^xe?C;!qF=?0vX3=I5D>#0f2sZ_@c&g6;$3ff zrDSXTP0-*XTsuFU!k?uTzbkbv_s)8(yaQG&D|bhUgY|ej(xiCuA|)8YEp6Fn_BQ`N zi3<;m@WS1CF`S!JS%iOwQ%C};+7sxU4gJ7$s=Y#pAp`%Z@J$)xM^+P^yF^1E=_Rwg zLx6wrCHdI-ACr~`N9!?&JR>Q5p4O51A!X7Sa-i&y#UkjRI$Wx8HNhVmfYB**>Pnhi zMAI_b4)rmprVtZ=vVTDG?lNkWwWe!i`Dk7XPW=jRhxycv9+T8{Y>OS_3+fm90nDaO zmikevg*}Y?R8}WR&CoB4yJ+gB5;%s8|K{DiV&`@-{%0+9VV1l-h42GEK?Pml|9*mR z5-^@NonNY^ga8#-Dvhs~HU*Rl{*zD9vdTJFLiXl)sW1;ONqZj~4-p=h^5t#pNdfL@H+5b%M z5v=z1DxGW@_39G6Y%N>-Y6cVak}6TL*EEsrQiCA6nWw?yGWz#cPt5;*_6vRp3^7Zq z-}b*X2ZXo_|7p(b8^&!p%W$5kmCqucpa37Tee$)J&<_T zE={{}TDTk>rNy-%I@%}?R6gtFwwYJTJ$S5Bkdwc2uDX`HwRNLxB-h`?0;|^LE<(&U zR6EOVde(~0L3KL27K({%1~bxkqr#ACiPKeNc{{~kj%(SX{Xx&9Up+sXHB;$1n#fnX zRE;*9nlv|}dgQXPu-)wa_xW9F-wf9ehbs){_B@5r|4~15t@PH}u=|>ghP`VAotpzE=n}06ilAL|zupoRkOa9L;0p$Xp&U5?OL@ z*u~l0)IRDj8pO!90g4TI*G#Nj8}vO(p4a5?&OASy7lrkJQ?+Z`xbsFOcBFb$*59*| zeOmHB@q`~5k9lq|=His|R?4+vv1UfK$+MNSrORW!^xc`5X(T7VE-T^}bTk=uyO@huTNzAFLF?BMs?NT--uiYa zUvFwNb^~OzGxOM48Bz*dR#{>zyG=}N<~$?+Q@!SNv|om&Caj$CqAWnbbs4o0@$-{g z7T*`b=mPTHptSe>sF`dBh7v2(NPmLPZI|Jr89Lfa{q#d<-OD%MR8}%)nr74Rc&ui3 z2Z%Y!J*lb&0duzf#QBDu`3dIpJ?8|L)=%FuUQQApeV?Ct1--=d{DQq!SF@I(x_z~f zr8cnodQ@d5f?4->H37czA(%4U4VwhY%2H-;G)HNAlSIH6p7$r3_ZEYWu~oTQVM!Ga zN41F@W>sMLOMmBmexCrGX1pdlEjYut$CcLg^iNd&;Xw|0yFd;uiD5Xae#!;Xn_@|a z$f7sFKHq^jf)Y|qOh5pdBHX-6)vNj|fDw&hTM{IPi9wFd;chqaZKw%v@JakSj^~wo zyHvJ!{5Py!jTt>VTc4I6=cl=x$+NaT-oQ8=LenaBd4gUwNDX`200+ZL8=+?spa{1- zO+SvMkXC(f57)&VYCv5b$z zOM$vh%HezT62D|2^Q$if65yipl+A1O8!>Ft^`@#FTRl588T##&V0{v1qm$}Tfg>JNf&FH} ziTffAQQAtXbKBb7gy-=VO|R@e0fC{4=77(^RFlY%U6av;+!~Hu6M3!XL2GrnI3T?) z)b-m#OJL|?LAHIH`FMM?ya}@u(~y=UJDpdjCBcp?aHuKF(qIW zH;u4*le=pXMoSK28=X-knSrD`)5w)nK-2|}SbMydm>=$L@x3wkOE&QE6dk-aV-yhAc)SuFug>hF+9w6Jtr&r%Kh zZ<}4PXM~^bkb$P=5b=sT!yBF7$8z*6 zkl5Wj>N)=$#!i#D+}_BthopPek0!N6Uo_x)n*>?P3Z!y?`}QZim_>Wk_s-!Vp%Cb>Hr#iG?wo6s5WEiOyoZ2=wa@5mhnR3iuxKqdbUH&nKTvFz_`!#X zt{MHz5q&$I577V=cbn$zsfr?h53Iu%ALv??>yHsGCXMVH3K6VjZ+ksHdj|e!m)*v6 z;{Eys{=hwh_2agE+X|K}a$t9PDz~z!-PY9>Z#=8fzJ&?>#F$Xr(fL+HM|g79IO8g_ zgPe@cwya+s%KE+rnFSK%dp|asidWp8F%$rD`CjMw4u;iLGMusNG&Ga=`I@W)3I*{$ zMPNlLZn;jh6?*>JKDTb6W0K#JS*-GcLBaJl=i+wl_&7`gzwbfFg)3}r7`yBa-`QpT z8GmXuaWyoyTp-;uDJlyxajQ?va{am^-{{(j7Fr)a)3|gs0xlnn@#EXH#a{l~gTpk0 z7O0UR09vfG1>(qbJF}i*Y|*am%m^#py_ zprV`5R+FS;#6zfkc;c;%EMdTcJlHtt_wWpR$1IhD&?3CZ7_!lAlE%b94LN9!lCqWMLO_FWN$RNbVy>ui*|qJ`4=c7w6n_b7V%k?xZkA*A0tl=A3yzeJnKm z<+>kCcXme2-j5P%_=&5GT8nEe$5Z6_!{bl(=|<9b5ka(Ret%h z^?#4>rSIJJNV}|Uyvxv)0LMN4>RDX-bTPUYk<9PhHH%4@s(TWwF)`SVG^=>?B%1~1v(_$7Z_^;dm?4rcQ5JMHi)u3{+e(|#K}sKYSt$F`RVLH9wUBlx=v_)|^F-Iear2TAnC9mC0$)B!za z-A+9Yvr}WWydjB10$O)jXUNC0^0%S8d-bM6eKiAx@do0A`*Xard@o_r`)zc&2@>2o zC84@~Ejq5Xicj%|YL2VnLfzdzZ^Xwq8XRnv->W^r46i8$%AA5^gpj*RIQv!&o^vy< zZy4crQ)}#NY{_w9IyrI0C&^;ypM9oFT;_dUyyU5&jLF%%u5l|!@6p(c zx}DZlmV8`5_R}vic?s1E@E#l`DJY4_VI}~Te(Fe2&7QG49|sag`Po5TVLR0HbdsE{ za{;zfZpmNzS>oySzrPU2Y4}4(fn&$r5jha$7=?B|q};d9>p*2t&dt+m#S6!vS04xW zw=9PrlIYj+I%F~WqecF)q{K_tu?<9xpFyOtsq{nm)tv6G z*N^YNkq8s_Fgv?A?FVG-j>|5x{C}sCUv@oAT$7}x$u!>Na|*EJ z2NLPFME=0P30U;;wsO?S4y#HEN<%G@*#UhQpWTN}!+dQdg2TGYOEx$I-5k5ei&|Qo zC+5PLOsJitK_u8RpkC#S&KiBGM^L#dBq{LLIrSMB@wq_3`%DJ2>U1lk!sueNl?rxyiZEmcF ziH;OuHNKzKJboTC^CRfhxox5POyS%?=v@w=HgqYaE<9*4?uv*{#sE{DG?oV>}^|f`Q5}*qe zuB@rZwS0rGY|++{$)atbeZsy0M28c2j3o*jQdle&LS-EQpW71>jg6Tb+D-5@Z(%io4aldz>U?J z*a2EKCNDTtOI&CPmkx1xg8u^d7bsFvQ%oN8k8L#iY>s!@-GG-E?V+hc6z15WKYJ9J zuRiGA{7A&dzK{12#tVxL@8UGWAl+g=5LJJFU3d49lC3NC=glsho#~G@3^bXC98H!* zmeRm!YHeiPL(l=C!gf-lo09iEW|yZ4d5QdLJ;in_Kg@;vrg+c=o4XnMCiF!^=)k2vp5SGdGKO^;Cr{ON z_8_@eeS6kH*h{7n@Ow7mJznnVIZnzn5vd)lL2_PKb#3sHF)gtSgR7{owTMR>P|J?C zcnf3k1NcpT%H=OW5gK3+fj@v{Z@N;T3R=aC;wb*L#-;#ZvfY!5i}ACys>cpr285Px zSlw*M)MlRl?^ci7Gq*Qh=xzcHTt{^H#eys}4sCLV284pMuGsuB(S5XsLi*_Uo$D z!F?tiA{F7R4rxV}*vpD=xt_f`>THIO(I(Q6uba1c#0z!)jwMn5UIV<1LTg$#tmRQ5 z0TuP~E{VfxKncR9cQ1XG>X4UG&3jg1w++!QXTJ>wS6vMh}D(seaM-Uy%Ym&hnknBHMtg=#>~);>0>SdRCQikWQ%q5 z2Vlpuf`fwbko3FC?g)Cl#b+RM2@0KZx}t-n?(xeP*mi#HdM@L5tMGLlw|-}tENr6fIi(JYh8ThgZVV;(X!?`gZ{U`z*!4}eV;%J zg&%r=dthRj`#>cDZz@az=Ga#e$m1l~5Q%qfvqpM--S48x2j-E6LHE^JTfz80mu%~i zl$Ygk=3^x!Vk4xK^9na>{(QL)>y6Xs=m9r7ofJp$yqW@mg_+TgWaFNjc2c@@&j@_% z(bO~S+eJ?nxs#-qWb}^Lp=>jxerGw@O~d$=KiZ=X`?-$Pd0)fy%TjRBC;m_<@mH)y znSGrL9O%Il&zr?amR8?o%Ia<}yc%GhSj}8=)eY3}+kVY@gz*y4FKj`!p#>^85uZBxeB|C-aY_D~%2pIzHfI+8(*b|Y znIP9N^)heyIz&Q0ntXOWb&>ux!zo2xH8EE4H*bpiZ0|Mw9YF|izY3V!yI54hm}wY= zXG0Eem>GU3f|r3}mT$8k%HSZcesR2n62uD0m4<9l5!BHOD2oI20>3gro)T)*79|+A zqe)=^rN~*G{9Oa3J{4osrlQn?ABI!1FIBTbf)4SJX$@5U_yizQpfGwJI~#`j=Dotd zFQ5b{ZJb3CyG^6z7kuTL(4-o(b@lH1`!fah?Jm8}w6)$a_zQ?;q%iiTv3x z%!vLUt)LSUJIxX|m)vVN?G9)<)JfD(i6B+$aFlC~-lCl&TDF+SROFVk2xUAMs(1;TTwyJLP8Ha)vTW ztC$PyeiR|8Pgtn5z zWJx|12&VHxfA9l@MiUbHRG^QO<_X#}nzfV)4$@GL>N0zvw$3b<)nG&ZmYHM0WFtgp zdd~9ehc5q7_8Go>W@CSFU$8QR*Acp5eHw(B9#stAXC(v@7hs;mj+!YT2E=>rf0I zTV)Y65NeqBTHOEtkN=k!A-&Q%wcu{?@9Dm8xqtVSf|Q9deU19j8emII#^&!n?hXBO zO78uC{v${{tIKArtrIeq&owdjEl{i=UhF2{7U6Dq^6+k|d&Kvpq*LpT)ijFXNAGZ& zA4TYEc@e-G*IrZ=e)=}8Er50+yLRRbXGn&m?ARP9_KDvUS9Oe)O^f z2ND|4`-@H`Ds3j@cU}uwdg(VaC>lW2AR&cicM~#415x+vKB$=VK9ya6^CGlx`}O9{ zbv!=S#TpyjtzOa=?op_JweKl0b3%@%HuJN1T=<{>=e`t@@*%8fMlsXdMd0G7y97l9{gr?Ww|U8{wq7air<+i87iKTAZ55Ca~HdozCq5;y11`Bod%QoL;Z z`HEl6KYqKZwvJwXB{G@zN^5M(edV#-H3mzesP>0T%1!t+agNXFItZdDEb7#;^+fb@;;26ZdeOv6v8KU`$>7O z&tqq?my)N@GE$}SzC-r_4WzBS!D5G$+4pK>d-fMpw;$*(c8ELloKm5xzm@?daEAPA;ZF+(kt@Jix%4fe4Mj3%e3U=DzXaP04Uu-+)t(72Z z28Az^7w6Q4P+J=zo0YSp*13`1=zrdN)C{>1rn>Wi zP}fr|ulE3$W~@`zwIPerbyxH#+^%PF#%GKg-=U%>v4T%n1@9eO@rtIu_w`vX(|Aqk zlaLPsDW4-6d!leCu!X%3V+u5y^I;5yz&v_bm_5>LW`Of={`bPmq)R$1{L??P=>I+o zGyTk(@wQa&%Z((t9Wr2-cq{J%$rM3+l6w;w&x~aWlE*f)-uyQFcUSS3vCF;(8vl$k|N+{qCwyTuE-DV8tyb-@omB5v17ZLj0l+i$KOrwI};6P+QR&BoR{7`T6++# z-#FU%=`CAi_F0bZgrHZ~yOR^XdRSO;gk18h0?k`Va5%d$^!qmV(;Ftk2#RK7eFNxc z2oEdvloyQ@m$7K=>)(?7st`r_OQrjP+lA*ho#b}7`MJtkbNHw+2ARx_hnRj%i=G|^ z{AMAME_pqZs=x(=JqNXG7>sohho5(+#`3~-E9Q)CZHZb)+hyB_1mE`gZbQzdmpb3L z$q+i|Wj$V!q{j}>Z&!Yhvk!@Vud?9>myrnHbq3Sku{%1a9T)jSsZ+@RD)nd9l2BuG-PM8|} znC}#Ho1w0+ll%%;6}vsJJ(lov;mgh^e3gK4GsX8>-xq+0==b9C8xseo?d?K`i%yXX z;^?4<7~$-WO0p>9`zDjK{Al2v*G8SVdVM4XR(*sp@?u-;5@I>qkOj+SoVyI?9!{+I z-C;Sgh{=B?^zQdl%hE>ro~p_lu=tbIQwo0g<{Br^J^QlT4}A%PhA$JA5gLCV;v!fv z@?So)p6I%&AAipb6PP}1eSnMD;fQDTv8uZ3nZyC|qd0`xly&l183B!3NMA~}P?12J zX2p3SpMJ1IwZeu)mDT45;q-$aVe2yeayZzv==4=HpCAV1*-p|Q3C#?o&_K=^dFD!~ z*!;$3f%+1%VYogsKU0MFa$+?zVcU-hz#Uw6d!pZfDPMH`)TCpUUOuNuye}m@Oh1oW z??`3}K|B=`27O89S?JEC!j8y|QHPaE$$eqL9Ct}+#Ag!J=4X7E!A&!ma$rso4k#ck&%s~czQz36Hp!|6%DatYkBu^K5s`8M^o<6P}%po0OO67P>kH%#?1 zbkq2RwKwX`#6B(f!$*>w55wKk=78s$tGjVeUvn5W7T;0~-2NXmhsS^X#Z>L5p!n#* zoqXBQC0v3e==L^+Y}7&dL%;?sA8mQwjH3 zMo5M`OJMOYs?GTt!LJ@bL<%qQyt$76kIjwZ?!Hp735aHHeE{(zlgW6z?K^N7ikh}b z?MH*ZgUY;XLGlgIlJEJg8QEsb9-l*xV+Cncuz4nP>x?J*u2wt&v%=E}YyO_a>&Q4C z*||SzR?_HS29hCVe|7Ny;qPlS4A0tI9l#SaD}NAPv1Xg(j)8~iy1TU>k z(0O?sol9}|7+u|y`w($Fb!5=Uame*__?83ZN9K8s6Q=WFAv0)=N)+Sl1Z^*5z7Bu# z{ z-p8hCw;DzByYUQU43T8Fx@}0Q>fDyj!JE@|6?(tz$eqGXgq!?`VBW23pbYLDYs$?za5R;?^Dts@j10RPspaEvdF}I8O^# z^sr1h|FN7vy+9YRabNLG@NCU_&j6FZ;5V;K8TFPj^8-t+;jiLmg{Lp3Rx&R82iXp9 zzInApZ`q^^Ur!D2Fk6z*5TT0L*JIRad;95KDH{uyg9sFykn5- zhzRh4%wO+#N_@%f*C5jNT72oae%@4n`;F|U=-Jg&Q)gTRdbdVuzGcyS3c{1&)FONIr zPg74vCjyG&P>U&RBgM2cyVl_DaOLbN^Ym$3*@%w}EMoWoRH#_h1E5}vVkGaFTd|q^D1qwTOs98CG z19kqvI-|Ix(%$i=sQaDV)al72Hbhg!dpv?GFh0`YtN~GE2F{DStZU+pd%ug$&gX66 zeSVtxp!Y8IXx%V1;7Qb)`Z#v9=M$ot@JOcUv0kJKQ77y=%ts#Bfz_W|hTqa@;|Lho zAl0uIZUfax&#gbFvt$HsuRb1%dR2S9I=@gc?wAR%DN;O+fr72eV`QOANOA{Hf$g1XM@3Q1mg*H z1Avw6u{*z(qW_LYdN{qhs8Z6^-uqEQPG>S%&@g|)SKJ9Wa6-Y<^{e*lQ23tN!YpmuF%`*FA|kw5|MFy3wxKGarB*=mB2fkzW{`{$bgpAHbB|9WhHTezzBSg)oGc_s_1G-0r!6!RgW5fby;i9L7(lFWvV9iMmN zo3ghlIs6vRO5tu>Nyda)zhCkxO}v?K z31;8{%x4v8D(||?#v!x2u$v_Ek;evJg8su1~Oeh^1UV=C!I?Z1FO$jv*8-bU>-As>HFF}xUU4Rttt>zF+kRn%NIV+9>H z*!nZDeDX$OunIZeru&S%A2evvpb);T=LxJnnkRr&X$0`7lP6cSkrDLAm3uOJsx)0x zdUIK&A#Kc82b#r@;-8ZPE!3RtK%1C!#TweJQlAKeym$5tN^ZCLo zVyNr_wH$BsD$SiGCBRA^%bseLmvPgcS0)`><@L1u>X(I|t*UGguK3p`tp*LqV!{;F zlygbvb>Tlr;vEEFbHKoR$b|R&tX+Zg z2SqDf4$lJxu3-RDs+QbLZH{`#%X?ZvTPpngy@ti0&VXasGHQ;$A@!FYLI`nuJXxz@-lAwh=J)Z0pa*Q3FxM(#9NVFC2t!v$7-IfuEYn{j8 zaTVr$I^Riv!{hny;QU=Qiad}K21e(-i{c!wA1UM)&Gf^{mg2|o*lyXqf_e9|K=4V(cmWr|J)WeZ~H#yiK`{0 zOvYnNP==NH>HNJ_xZBx7ToHr)$31`-Eq@8nQ(BJSVJO5N@%>e+3u+i|Xn6n@K8o-C>OD6bc$sDPccn21L zRkpt{+l!0))NCxf5t#$nlkmshOQT)D zWf33;AIp#z@Dj%tU=i=;&A6s}NU8f_dEsO8{|6}b1VN!tC^uD#rNI9a8 zF8Q`Vm%3hx?!}W+2v!Of|8h%SfQ-_jFmRhotCnU5&iJD2Vpan3=Tv##fu$KB0F%KHpRdv6+b3EsbXj@xQ=$PnWy6K~s=R|Ga5bkx7E-85mZPG&19JNWVem-vM zBP}mKfU)YxjJ=fesU@VJq>S6iGlgqxT|An4kN`3&)^FP7Hdoyw6&`xPcosFc^ zF2|Ve0wZ6}Z=5vqlOHePzFB&fKBETVFti!SV)Ko9j9=#8I3YX7j;&{BXx$T%Kp)}( zCdralC{_pktz_Vs{w81zhENE&;9ms%01{yU1P(TPN7FI+QTM;atS5-nG|B+R5vgu) z%8f2y!uLHC=QLmLUp(vc`V*OTNib+w;LE{q&H`^8Xfp=9o1z zTj}bp=(a?~ibw)J1#oYC{-g>i!hm3shfh4k(?K1V(pAhYfFd;9C_jNam$eQP_XEMG zeJOUs~)YIA9FhCBl!vANG8QKG)vd5N` zj-)QJVP#cg(atG|$t_OceLYK>LW?5rgTjFjS6H%3UP%0If)SIq17sj7i+F5c>VP2> z)&G25xZb1W#Y`-XI8Tkb3*z$_Gn>*b^Jl!$kAGd-PTRvE_4w~UST+aM{&W40(kiDy zT-`b)R@8}ZFZ&Zenm3k|PCJu*@+V6gdn&ULX&RQ_pMuTLozFup^)VnKw0JC2t}dfdzDf(B!-*Bxo^4rs4Bv?9)&z=nuhsr@?+)_~sz(xs z3K^3HSxuE@T7GB(;LF0G#g2mWsFC0MGD|m~$A38ukt(zACgia?aN+r+8GaWUL;OOL zf~6OR=K|C7ac0;cvkf$MNXh+cI>Y(W*W(q{Kj%KC^H|%Q6m31eJBs(f2~AHl0HdD= zh|)fvoRj>E`sPdD%g=abyr0k~RiEkp{yzi|{R`{%V&aNE65cJPZ~wpR;Cm!$@t0Zh z4kO*G2_^fVmNg*5>1G~>iXn4(w_yVTJRp9ej740ck~^gP5s&gFPygmDx6W(r2kefU z+6=zY^UTjAtq?ZCz%HBqs`;2d+IVQzME@Rj(~T(eucTvEkv6m=Nbr-@$tsC9& zpEL{8uM`nlwC}YXsl6RJD`2;P;QFJmRXFUX3C#z${1UJF;`;$rI&NW| zn-9y88(%ZO%(Mw{!9Nn6Dx0gUvYUf@7>xX6)3)wf4kI(Fns7k_$wUwMW=WO2H7#Zs z_Ey%bJE^$CXL+Qp{x+Iupk8I2hqzHAkY-p3WBhnYM8Y@UEFjmAP6nX)6Dx?4YXKlt|_vfH`)4ARJn29nkU zTJT#TAJjcW{u63U5^p*93|sYGinzX1t>`K$YAUl%6`4r-FFg`Mns^;q^s3=^uB?*d zV}8*>Z31v;@+Wxr3eH}5;`7jSK%$hRe@(v`e<%VcIX}9IV?hJ)0A$@#O9t2Gz!do= z5DZmMMs&#wHF(o_fgK7+6$evu!zml{b`d`L0AVVVD(a|5Xg8H5=(4G|g!8;#!(FT zLX6Fy8U;Ofb3Cq=8JyR4xtxK3S}gQat>wPEajZVDm%mu0-?xnXddubPvP0%nW4vVqUe;6XbgWR=TmJa3A&d`wK##`+|Jp473&hT`zL$IMNyY2tEQXm#kLLA5j{ z1(@4%@*N8~pG>ND;|CG8sSNlw8}iB5KBR!{yb{C*fPmdsg=L%RkC+;o16goRT|xB`W!!_WZn@%%zW zL22G^?fX(6>UYN*-l}=6_O1VsXll+MUGv-%;BT&m97h%)e)*GeT36P&Z{S_MOETy~7H~Wa z&@{SU=EcK&?q^gblpJ!S|5$_ar>bjsKsr<@SEH!9%R=m01i6}6G1zQ`4vN7rQ@s%F z@OR#7SVQj)Si$3`YY?dWQhScvhnGEM+UX0x(KpC%rLF=>kjySzC*K|W@8IQi{~-VC z6(;0ZHO1u^5TI?Kc-rdkLvugy`>W(9t{zt!9h5@ey$wya?dn##nu7CZ3oBHs!+`zB zrw~FyqURpLfS5OpsQ7sk!RAKA1RTMpU$=BJRo6H>(|ULXcq@u7{%Gmwz}#z?weAPj zl-p+|$`TFSR1cGLBZ-RYysSfg7q6zBbB1pPDh=jta-?^X_zY4tYgMjwPfs6zkDPmc zU3XmG6_UA8At#0@zT6dW0~DVxBV=lr!>ijl2)E%7|7tuyUC-+zW?xb>c^Qsm(a*Fc zCX}rFVSc|mlJa`Yz{dx#E@Jy8(!X{)Iuc1I^v-Dp-fVyuj>lB<%}790~oLRHnk7R}nXLefAw0)I$fZLpu*Sa8fO4BU| za5LIoaV5;5XCNBwJQ^V(N>LA!i(@MO*-g}&Rl^8`SG%hzU?rD*4Yh!TdWoWLkctE} zU|COYUQ(s<{mg}Nv5RBtRf7>cOeFez}X&u69(Wj(4a&T_~L{s?+!p5ren z;^O)-i2Z&VE&Z4*qB5fXh-$l|3pcEjX5!se7kT(M@Anb7QCJ>cs_#O>%VZ^<7=B>E z*#Jbs%bIeWYmrL=br}9VyYaSR6Q=_P<`@Eia^m-X-Y(SAISPg%&TAN_PkyQ87vyD&7SKq^{S`bp4p&((iwTrK;LqiL z#2b~`lmQ~kMB(1hQKO-rkyU4{$<2usera$Dg4f_xWa4S@xIX9VzE501u#>u)u_{%6 zly9DW`#Ld|blKnSn{Og>)19~hj7zrylaX9=p7MULDCBx=!{#`{d1n{$`Bn0gezhJk$WM#NnazobB<9q&*Pb& zoJr^*>Pg<@yfzhg^svTD&qsml$0iJWad?RzEmhagBZxZSI6H{*GS+U4pJ z55I~(nBw3z&ksG#?;Rw$Gr%v>%fP?b@yQkHQ5+oJBBupCi{15Xl}1XaFrSmhz7dDY z*lS+bH85NY{=1f#F{b&4!2}#tHWP!#EYl4$1IknOIQUHSL2K^X3BI&&_d7V}3$|pO ze|n>%cy<2`x5LNaT_JmL0E{wVJMNEThmje)UXQ3Zq1}MMXcc_9h|yf|0GAqC`9;Jl z=k@$1a-#J~$x{nwSC=y%+^clS^%qj%kV?x7*58Ld8aG)|4waJ43N6ZxqIJHsl;z+F zM^!axF7=kEAolxG4R@aFUGG7zj{aA324?joK6vsjK1&RfXjy>GpCMVue71db zeygYgp|r+5&A{jQIMsmweOB%^;06&1H6Dl(v-L|97u6`8V*@fYr2Wt^1Fqh7|3(88 z8$@94^UUo0{LGNB3j}nV^#FPM^nUkAn=9XzM13@0(kMhdnL~|ms3;6zeU9H1ZEc*y*gjN^TqqE(4H!^oQ4O1n&pF0x}T> zD!iopVXSpdTe*O1XmRmRba3~BDUf~l`nXNM?FlBYQ?hPtK{~BQ1V;Ch+t}Za;#PHb zGPRb*SNZl-oIVnb-kc6{nI#MCTC*Pd#ms{;r2>of@m2HNUq}kah)5-tG>LEc`HyQ- z3sKSSk6il!`DBcLY|0-;I2-i^|M)1^Y`!2t0$7|jAFI&S5|K==AYbtZ9M=^Lt0rMp z7v|4C^vZMB?e)nBs8bOG(+EvxZ)YwvaqT>e^)GPm$A#|(b1XT)c189cJS_rd^_|#* zIB*ikUQ7a5R1v#39y!n&pX0OKpnoHuyN7Jnc0M1C35P=^U5L@v4yoiZ$4$-}-W~dyQT>aCCCDv@i? zMOm{%5s^KlGO~qiV~Z&bYLG3229FkGO;KD%_H`_iCF@Yu?AHugvS0hYjeVZ;rJj4A zAD%zp`EAzkobUIX?>V2(=ly!mDN11EBLsk$3=ARN^_j*?Ca?i zg~GceZc-4N^RqsFH8kEnLq?pVubG*P7yiNjE5gCZp()tcVG=435mVzu@NPQQyARbv z?~WpC^Z`RQlGvFiq0sjBXWE& zI@DkFw|n1Qn12Y}xV5YhH;?SxPj$8_uxx6loMEq|G7hh53a7eQewK?xuu(x!;?!bP zq=F55Q|+EjwqNfzrvZ%yE?ml(m5WQ=)0HA*AlM$+sh3#ECN{!^`+BeK-J_v!%Dyz_ z__;rKHbkTxBW1*Sz(r5Whwo3-{zgpqdQB7ufF|F>bmZ?r(HtVROIl5S5taJUh~c^8 z04czNbZLnH+5G3bdgkQ1JaTYjL1^Kmm%tU43Vs?eWl@|4%UZ>N!A|O?gu2w2e!dlp zOmfF{r||VfbmjQ@+H1y|4O~}r{bG`oyK^@SCbmMkT$&f(FaEGSEsDG@up}RO&|X}m zTX=cNIjsAqxb1UmBnKUDue&tf;#X3hvo3c#Fyc<@8%- zKfJ0hRxO0lq&!`+w6CNTsr4;%xLA>a6aFhlZ%*#hq}T8(+jb-B4!qeZzUjRs&E5EZFP;{ZTR+#Gsa#3%3S zlTpUCf2iGueP1c3yla~U!Brt>yhJSwH^~g;MpuER;BHP^92#*RB@~F6pRuYyEuqW z|0b%NncJlRe;1I;V)Of5ezlh!c%$&Ux0rEbnEBm-p<7HUsO z#R7;hza3MN#iO#_?1KnoNHp}Kjme=(EG@#Ys1{eb9#9)d8(+)I$j4J@J#HBnU%x$msc6*6#8QvgZCMwA8P4h%E{+8r`Q{H@4_K~ zuAw2N#CHnn!fd?&8Z$!2-OoD33!ROX82n;^nL}Wo*PC3g7hG;#4_qNx`aWPEf-D0u zaR&z^ME5VKou1}p08q|>pga2N(tJc>WilwpEwfdu4xq_jN(wUT;skiS3$Z6Cx7WTA zeXO4HR|xASl(DTS^_lT0UYJ!gqP=XM=_#_Hi# z%U?oI1h$(d)qsjwuELn)v%1egB)^?j_oZEN@u3t3o@+UWlwq@9$jH`HLeCO3u&-~( zJi^SfQqouRI7xuhfO+4_J1bC{MLF;l=-S_l#yCD3^B34Whi&jMYvpeS-%C5s-=_bp^)x|TEc#rCUx z?)cgH+)j1F)RLE6G$27wZmVefBzTvmB+%Fb?*@$l8R0kg_~T%cu`wpdhE!k&Y|x1< z*2jum#jf`9!XKnxG6{<-DQ(!UXK~)LcXj|C63{+ZF|5j9WchhCwGi7R0j^8U70ntx zAKBlszPot92=_5PsP`yn(|c_;>l=OYvH_(b$)fn`3cq-*bxy5^7}oFA3~8aNE~Ix_ z;4)4s9Wpgo0%*}9jQjoE3{h^y=dJymCzSVpoD@8L8}_zIiPmIM>cJ)tS(5)$=VroA zU(PNwSI$cs`3cjuL&84vb+<|m;qh~j+M9B+7c2)UDV{PG$h6J+?|5~p2RmYPYg%AqOarwWA`*#UX|FU%F zjQ<Z079LC6g&Q7BbsgHm;7H^HLsJW@ndueDgoQ6q$Ptz^;N z)Dc?KUalva7b^4wcABD#33NgD}J1uIkeG>uTQCK3}6)>tXPc}2)+ zMtlj*nibMju<}0JKA&z$#_zfWY7aoD5F)9xh9=;b5gDRLQqcVLDIoRFKB+0pn9nSx zfF?MRe0gTW0goU2lTQ&L3r~kll!jGbI+5x#bDL?D^_n*FIprRcW}TfMockl=Iu`|Mo z%Bhp;&Uwg3%WC#uMQQ=*2FitUm&odVb>urJde12GOBIe?EOsyC?jW6Oy#8ePJ|e8J zf1H@mER=!Qo zpp%!T3|6%KCCI%qXYm}JJ=eX{M)-x*Pv!c$YbG$rg9*!aN635~S0Y|AzRfdnA$W11 zN_`%7Mc+X60dPxrD(Cu!6Mmf9r2YH8#svf;+gQQ~!<}x7yvmo8A)ADJFYq#fn*#WT z2!LWkHODnsNJ%w{1GYyn{tbUd?F#rgdijZ0(SZ?GUi%o}gsFf_e-{qzFaOT4tK3u= z1q^{c`_OEMVpRRYhgQ_e5JyAPLAmuBCfn`2qvL)%Bo7hdktbQe>BebF_0-dy2acZ| zdJJ+WU+kJwu}PZG(rt)%0~zcKX{YUy^gsY@CGeFmjBF2+55$Lh(sEnk8RQ`dzS#b) z+hm+?qpqNDzO$pHLm<8U>Llw2UjqSPmT15Q(A$D-n@dd>`Xlf6r4QGBwZm=}p#F2m zibA18*KJJUP^+@H>kXI%(A+Bs2kCymfC2wSy6@wOJGl&a%KkLw50jV`4tJ9(?tR`*Mk`@!Y%Zliz?{ zKmySH%ySLz{sOxS`WhsHR>J>zNmkmW>}GVk@!ApJ@i2B;_`BHZ6M<@01x!vgT@~ar z-G2K$+Ms2rj{~c>)dotIs!iyOdr3^V76JJZ@hFG!w_t%arH2}q&psH!mcNoG89mPO zX=+lP5dYa@|6iVW&&%tXLW6UUXLDW|m1n^%;rzlp3NJoZr9JX?T9TWuLS_A~9NE{S zouKr|Emdcr9o5!vZTMXEfa{udyo|c(uV}(;j9$n(*pnwKEopbEbqHB(55#0Fzy_9g zGz*w=?U*xgiV^}B*}Ku?k+8one<`O9A)j& z=;aF_kRbHbm#BL7RCjeLQT_29vuV-a%Co17h{AwUcWV}>B`=12%gexqst5+#s*Tdv z-?o(TZbfc17Y!=FRUOmWH-U9(ZhMZW#j?~Wg&=F!e@mc|HH$+EE8rvSbO|U`#gv( zV3K@4T)XCEq!n0Nv8O@>c6~5P%r&d%LOF*KM$agF#FfpY;Kowi)r$C2416ZgXvWpt zV>7X+*5M9jZUY~)!|L3*Tv$Nx!_x`s9+s4<0S|?A5%yuM2mS(dWqq)KcOyzGQ9InV zW%aEm3oi#{9`=)+=KAsI%pX7*0Jkm0NH*+w@W#92cf{K=LE^iZ(FM`}c<(eain9YBbqK3rBx>MBZmJfOxE! z^Jo6&6p``4e;h&HVQ)0zGW=<)HpJhc&4DBdfdA_9>Pa4>ZZv|PQTW>nwse-gqLKIA z-;mqrn`*MNJ^TS$)|WJC;iTl-%ThBJHTRV`B?&UwxYzKHD~{dpd_^H;U!z zHcUn5H?f=4T;%;>GL|Zxu~g_NVSb9BV)(Xv<@LSC%vVR4@cWy$igjkJbq@Q6;!d~V z+eiog4Vc(n-e|R`UJ!wRM_fA1Tuv ze&Af6ZF}654Rh@?{+P~VfhF!1!8;M&I=R$G_=VAXBtwOE3sxyv#D$t`>`Q&iY)FG+ zuG|rN5t*6ZHjt(LKF?eMc82C8*Vx7!f`|(sX5UZg>ES%$_fKi#UhV}LTlFxt@_x~h zAL;ZZ?=uD*HJwS0+d-p*sg-lgcmWi<+$N$7RprU~8hJd5o^mY!xl6uMAofmz R!QwDu*HqJm<=wm&@NWm^bIt$& literal 42948 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 diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotTakTestCardResults_Light_b29dc7a7_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotTakTestCardResults_Light_b29dc7a7_0.png index 25787438fad719c771bd6b1a66fef06802d25503..8ac5d4604012c68592ed278154b7ae30f40b8eb8 100644 GIT binary patch literal 42758 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�x7&?0&q%7uW5qa!zJ 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 L!mw2TYUIBGbhk~N diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotTakTestCardRunning_Dark_d19fbf1f_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotTakTestCardRunning_Dark_d19fbf1f_0.png index 278a6fd19881bad46f92f07e9b0447f380f62550..06115f878dfff0d2144609553260bad0daaf9952 100644 GIT binary patch literal 29700 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%0D{ZFS9wy4;D@_+wM z-kA}C{oS6s#(Wbpus>_QP`1Ah4E(_M&!wW_+jXt~K7w#%Sxp_r*F=u|wYlI5?a%Hb zHxeYvr2amX8&V#D?pFLOXD;pk=gotp>Hfd)83GTBN77RBx<+gtr%H4QoFa4YPQ)}p z%e^#0F;~byr4+Q{&^u2||J+{oPa*hz9n3RP1pd4c`wTuxUwoeItNUt_VR?z*f)5#B z&E9tgKW$S!m-aHuyaRUpd@*(HHk}M?RDM~=$Y}9=4S}v$n9&v6@+j?s;(lkn`&8vY z;^0h78-(RPXsEpEKx&xGgyf3N7#UP?t=Qg-)N>736*4X#$7EZI7n^?_{iO3~al6*S z8qxN&P4jan7b*Cto%B*xW-n0C^}ZFUUz?ot|70NjLq~gi>L93l-|4Ij4QR6bzsdCh zXX(Eo4rLIBLy++1u^L2%=TgU8ESqbfQwY0AqsO?z;1N%8;MbOmaX&$bf5=MOngS*R zdbjR$^j86fpONo(<#;Xpq-)7BTb~T*_?Z7khL03<%cDWnTSsStI#-L+&q#Z%TE?B~ zd>(x2?f@z3-bEE)f|VtlS{skIS@gxH}q|4$XiZN+iugDceTDn z03{W!FyCxkQB*0BmBG&uD3@_|uf;7lmDfGK6q&SFe{`rtiV@FDru&)Um!FPUItD3A zFD@wbW5WwJsn|!S`*6fN9D&xDN5`nfB*Jx#jJRX}mB~Ec5g)>fnuBzHY^v-dT<@PR z%Uh|nZJHkA6)T|Su%EJ0IV{4RBT;G;XE*S33>&QEE2EM8xvY~1+CJnO%k?~v*_FQk+CC_(eSzN)aZhl-RsAl};R&3x&l5vRloan1f4K=L%)X7_D z+;CuWCaN3GX;wRJ6?az5zM}w1bXf<*nvVmD++YXDv;`f-X0+#q8;_?Dy+$^<$4&Im zc`27khq$v=4GOr9WScvV5BIu+Ey|{d{$ZN(Y5D02sgkK}+h5!ACqtv4c8C#?_6$Es zSflBqUnA`+zxC$s#(qoo{^qa90h`z%CaJXb=kSV8G-J=|1m~=ok0od|#D2G~v;?kSZBE_6dKU&n7w*WUxf>(kyY8PC?eR|wCxSp*9$HIy80z`4ptqVX-HqR+K@oE{b zKM#r@Yh(67Yeb6m(9-WL>8g(rDZWte5j&#p<0hRqquez2y0acyYNqXXut)_Uw+6a4 ztdHUaXKtMm^K;t|C^qHl4y|GpgTsqMi5@{ z-(O{hc#G8IQ&cJ-s2c4?FZ$|=pWR4FsPP4NX%}iU+ zTB6^5;GXHDt!!j|>Ea{pGCq$q+s*ZlElM#C^3ySdqo?+ZEZ&@zQU49U53>70;hX%( zw)P#~-P?Mu3(eM7cn1r6e5l8T%R~b8k98P0r3&3TgO2wersj)S3CrD8)|bfB{n4cdy);Z zXG$KHzFPEtISv;zBb)!AYX#*Ia*J(>Bg9RqHZ5ybu%l(BX8r6oni!6Sl?Fu{KsL0twi9h) zGt+M$J>~DawfK&{hwx-a?AD?)Kco_|n_Sx#^bSM?BO5Q2cGFA{?xkz(pul3`b}uO# zARBspLrMN>bGlG`O(4J2%)@;`qC8tO z&wIjBVaaiL@lP6=I|R{h1qCLE5{&B5)u5gGJ9YG!nknXM1>^}EzWIo5j?*!&&)N^E zyrJ_|P7|;=en{UUvaJA$)v|oC$B1Jyj=rv;zIr^l{Z+A`Y^DEaK0Ib4$V^QbVdgwt zPoYi-{LN|iea+V{PUk9qy2PB(Rz5K9h=qjZgN=3c$lJfy@|tM%ct~n@(z`7YLa2lT z@%J{Swa_amHu#)Cex4JVr^kv*>odg9|1R*a4r&CQCj5!CuHMkmqC2*-gH1}@=p8-R zm!`#IUu~pj7;6%3UaU?BU4to7iQ2NnvaZ74tgYp6+_6ovO3FYlSoC)afO>rB@t@tn z`*CW4SgW18oy>jTk}D_BJ1mm>fyIxriq>iq*5%LG(vs`G{u%O`^~FLEEo*X&>*a_4 z+7$?jS$ounkGB0J$WvHLyrW#sv#XZ=?!lzLOOBWauA?I6HI(PI>~q|bC<9WApwr06 z;C7t|k4G6L7_7hF6GVwAF_!|M(kpO0SeJ*( zAC2bUFeUf~U5<9Of0O^Ovo8YGfLCxz$_R&DLDeSu%B(yL#o<9jhRmRV9w*_ED7orD zX?tTpaRC=B{;X~xx$01_YWL}hp)-rN&ZBkgj&~LrhHiiCJDm#Q{k@SdOW7@^bjToz zSF6RCz423Q4ZyON%uJ7_4pkZ zwEXW@^Ft3nT{-9=dP2p{889(dZE+z|GyjN~rB!B_=RkQnJbN>e{updACQjrf?&@_f z-tp^PMIweD5?n$i=cf*T80 zl7IZq83X-Dxq^5GF|L^oi$>5JIcu?ZS4*~M&9aDV=GNluE#4mFXB8LGjr_!3*=cr` z);i%Rc!Gn2wkKy)pl9+!Dg3QmD|5XYfxBvA{yNXP!&N>1J9!bcjE9DpoW~FXYD3U3 znKihH^iZOf*&G##yX0127#XxFj~hy{X(s9JS!#mb86GGPqo2H8JmU#)|_-GPkV`tP}CAXjZX zYANq*^xPNEw<)HB$i@ywbInle^OJ{J)9UywJHz}F9jRqp*x-gE4J#uXpE?31rt`7EF+fXIJ!va@L``p$fU`!77xKHaBAFhz`xbdzdaG-a_rDHe=y6kj<-tv; z*6m^Hj;dGo(}Bw9NCt1y&wIc*VEG6uq6y)&#yesUB`Miy)(#IellDIueAJGc3VvIh z*z4EQmXF>^BL(}%2tC(R$FO8c|1$9Z;T@cRH~WwH z1AfmNKPgyzSYpcIO6k0?hg03PxQ`U9R={> z|B-a$w?|r4`Zv8r>osP(YZC>Bg7BsNL6GhgzjNsR{ta6Cs0Gq376RNSabBwNhbP`gp{wVp}=W3R3LjnwD*^sD#6&6No(nzi?Id ze)YACE+1rlf#Au$%8fQbES}fK0+bE@i&PgVB0u&_$htNV)JBfxc(E0oehVTUE=G++ zZ2o#ogmKJ}V9xPK#4-Tj=uSAWxPqwB!P4Vj$UVr^_ z=0uRwpbpVmOlQ5^>!Ft<5Jz9r`+wSe$)4X@gV9r0Q5dYZgS8pbAWH|%3hm#uF zxRgqQpUz~yht#uPvx*mdHTDal+;%KCAHm7y&YSKpzrtUks{HBnv`@Z)YnebjIdj6E zY|3`Zh#$)D7Nd3I1e2HJJ$3X{Zo!#QzsG53NLV{5L-~185Oo?K@@>tgs(#!dPViHo z>v&Kqfi1nf)34%3L?beiX=FutH1N25@RF2%UW_6)*S}c?t}pp1^2F0F>b%s^dO)0S zVVB=|Ga=Y?EDgS-0_o>7M!7`VrmOodgrTY9D!{)Coq5FIwuFF5GNM)0FKPrP!8HFp z3y|K3wAx7H3Oco3E1la39aF)Qf_QWs!n-yM^j3#<7shOewSwnenXy{{XCZ>>x!y!rdw*g6) zxvA9G(ZO@?_MgcII(E2BRtSE|Drm!wtQ}19RxSt#U?3v>rXY=xK?~(KU!-Lg?P6+n zdZv|8)X`X$t&us~G) z=>moCLw%!;JoDShCVZoW;>*B%R-}K>iVwPG`S(7DBxPptV?tB^B#l-{!m3Pc{yibr z;>cBHE1huth;aZbuGvi;8m#Lu3P;T;O4$QQ@xAx)~b$ecHHcE z@Cb6IM7(B#jlN;x$PgED zqEO{}WG!b|^Si4Pbb&5wCWX{8+LaYTtLyc>MoOW}fWeY^lu(+ts6u;ki0-0lcc04% zc2k$T?}m*ufX^FG8E8d72}|D_5RIO{`p#jGh`gz&iCtN5Z?-i5jg$q6nwq%E3q>aX zFWembRYpKURp~~nlNXZ~imX7?GhqV_Cd*|72KOc|Bz(k;(d%!)RG)WzfIx3q?NraYL|!x|}$Z0Q4tSRKPEo z)qRYq2X&RZyN>A$k|@aXACgq^M;nJSX}G|B>wkx>nzt(<(exh&HD03r=kA%9u4FmV zK2Wh(vYNsp3{-FY=j-dt)8{WseWMX=7BWXnjyDecpOmK{&N2?*?lw&$$2E)P|I^9C z*=6Zz$Yo50%jjTH4!Aor+k16#Fln=i-H?>rPYf1)$R$i;Ged4ZpBpEOX#>28Pj;6et1Mu(v%1LP64y@qdlW+N9(2j8Fs+1d#`=8D%9p8cY-}_k z@3|=4RTtkt?BwJdTJ+^qEo^AiHR}ajz|YY8u{^yV!uu@-BRi&mM3-j}i>P%is+50- zAVvb=FQ)M@ODexJ-9OK6H~ju|A!ymEF2{(&u$LBpy=O+LgsN)k-S%B}UVH0RSgNw# zWTGnPzk9r;77%?!>xvhA>Q3Ky>BXp{@6QN$9A@h^`iV}OxDB3t@yl`^^yz-taEf@l z-l_4)bUE?b@E;@YVfG9yvZEG#U{PhT^9<7JnJ~o;l&M7X`mk`8Cb?- z^=hnQksEeg@zAUZ7?DOA;4$oQ5}XQ~FZ{V(ri?gco;5oJAqM$ zdEM?ioHDa_%4Qv^EUTRl8oH-1aKNV=20y>83}PSsy#B#EPzp9SB@kNy2y^R5S;uYS zh!1Ew4O9yX%4U9oOOfy&w+_>+SCr zRhgFjBCyp|5hgytEDRqS=V*6UR<**vm^SAZz>p4)#O6O#{`CfCQxol8v?`rb1u_tx^Qb4cIt ztSj4n{P}YN$cF;e0!i!P@H#y7m3>B-tw{OjMP0+HFF38NkWoQy!zP{SMs6U&eb1G( z3r6HB!r}|<{+SR5T_(3lxo6f3Jp0cJFPKaaZ51l`^dQpH3qHBZg=`peWzFr1$;tJ8 z$_R6eY0I6>{`(Q;^1cyi_Rb=_6p@E9hezrN`ITYchqf7Pu5T2A+WRb@iXG5`P~*Au z>)d+KB8?3Gz!#K#f)9rno~|7ABEe=Xpa$eW$QXc6)gN|GK0E&YN3`mo@KJ-I&mlCYHsf+6a!+l+HF~El#>07D-RvdUbu}qPK=&4ru@6#g!2N zpkHmsuxx3+Z(gRvz))gDcy++&ztLca>kZiN-dksw(v|k8_oLfpNt`&85Y66|TM#j_ zaqfK}n6M=OE%r8@HGb^q=TY}`rDG^2Bmeu>Lc_sFo5;aDm?EqeG@!l*dBc{?10s>DlEvUN1;}N z!tdLlPIdRrh3+wHs>_&nEEb0sS3MpXfLy3ncwJA;VL)QHI@3SMX~<7{z|k#fBBw9$ zSrymT(;Stjo%P@LUv#G?`Cp6Y03?)T8r*abA{MC} zI_YDFg%4eJo!UGNQ;fn}G*|%!L>0G5u%0+LR+I1`CRf^L6q*P=O`ITBZ08w5BCI_9 zg^v&|d{4x7W3OXVkTcg*pE2>yJe=??jaKD)=f@ru`sQ7YV701}=(L4!UR}D`AQE+u ztgoP{#SmgY-mXY*-w>SB5U2{Q@pXwq7ZwuyzH9u7>+J+np9ll3@mztK*UDO)-V7-1 zd(sCBJA8G)%3ab$9Jr+w2Xym!)Zgp~Eli2QnajPdYY+A7op z7I`aEbiJMY5C(v zUa|Px(Su^%S5!Clh3Y-BqM(dvm-QDL?>VPdl%UPv6P3xmc~k3*6xj-H6t83eAldwXvJMI0=` zQ_#sf6Vjao-Lzlggc#x!XF4R+G8!#qV3G1JYMu=CDKAc;-{Y63Jnw#_>v?PG!tDC6 zse#Bl>BrK&CPw(8Dn{T75Ut|XX@6QQZTI<%D3+z^2D&+1<@KJr&f=E4R=a!VE`HC-W!GMqp){4J zTcXPUM?jDo-%t2QSllkF?iy6b0lx^764M&Y7a{t zV;aNUjP=bx&*1B+o*m*`zRASguQTkHw2vJojy^t?m0SfMau#sS4VPKY4UYKeJk^;P zo~i!PIpeaJEY#078f2EjhFWVK$qHw!A1$<`T4)Gl{X7$Az}<0hK)6z4cT^It(L+3p zNw*&;Wv4~wvUTWSQ*tRHD-gS=aj!Q4LLrEwSxI=QEsNUzL05kCN>b>4LEV(rhi~S? zFWXFLAXzb(G!oRinkKcj_nk)K@k`am=$%LCA{rUnI~7+wb5LcQpyA&$oYn1hqq~=P z>g|Heug-!mAJ=znlLFqLTBetVv?)Dnr(fUxf6DvLsHVCuOn4O$ zX(}QbnnUI5nNM_WW~J3Ea3Rkxmm_ zj3fiIi!L|z94Fmr9k<^SXa`jnDgfstf1n|H$e@E-FuTDLQ&9SH&TU=dckvC=FQ*{= zMV>uMPXFJaN%-?RcKuv6%z2h$tqa#4U%UD!;WzNPo6=#?3VrWZ5?V&38vHSjcN-M$pE@-vJ=75xA6$nMw%JMakoKRai;-z;lDXz7 zIrxxeEjyFP0$+5CI1ZaX+F6kvAN}uwzpR9A%ub~hpR8$#pj@!8`mP-SBx(<1uiIz^ zyJFoczF)ho++60~ZJJn)^Q7w<&0WU}S@QMN^}tPZWwnI4-VA)!OO*3Z?^uLh{pp2z z6j~swg6s9p>L0W!p*vw=ubH!UzdqL0+upP<`?>oHJ>ONq zT%!og<}xswN-ucL`O2V$gfS(TMq^9;ubqbz5)&>@|II(a8%xgpVI|Roo~pAtzF!>| z8Zs$~ka*JlZ9I$MwDREdXwV^^oS zA<}X`Uh%Wop)Achi{wNhXDCpG?-~;HX`zAEo0LV28wyYQ=@4^!>pIhytZQ_%B@KbS z{@m`?9gn{|pviLlT;fq@c&eEl#QLgA$>E~lw@IZT((sMZ4cJ_62bW{ulobx|gRuv0 zE#L1vMb{TUjrwJ`S3%6aNN5FkO(FKu`#VSy9MSaP`DsPqtr*2_o8m81c=2Oi_#v=6Yc>wG>vqmWR0+=1n?Zu!o;vq5|HJ@~fwcItc> z8$o8nSpL`G(cP@a(XnCrR1iheMvdl+`-)C1Q2Xkmjuy_kpe{;f-K=HKZxiZ5yD=woNk8Xs3V7ld;6td?r!yd;~*T7 zuoszs4*!&D_8hP}%MvM|E3Ii za4Jx+sNb9P)*M9_al$)8<^xIG9Swe43dWE7N6+Ji2(M6Hl_$Bq-Dv0)?*GIdm$?AE zZ65;unCixfupgL+4)ZELDEnqU93Le;745ODBSvDs)L5IJlYBGLIP=8fphHRgoWm$; zeJrb60<4!qL=L?kug8zTXC$hGYB{FyG9}o@ulqw@p+5yh=p&sky3<~C;l&SBnJ6r) z&ODE>E@7jPFvTaXzF!;~^gf9<_K6T$EN2FS^}!ws3mYPN=@8Gc%68!LxGQ0c&4V>x(^53m9bf;aa9JU1yh1x!|O}pais- ze)S@%EwPY*_$x^<72%!d&QC);nXUGW91gzN!Ok%+q=`(LNGTYhuRZcu$Tv>+NO}95 zN+d_hmxMl_L~8=Q=CUpIPa_p$Et3dyGxQ=u&B7}?gX7F=C3qVQ2M$KpC499dKXWlo zt=Vxet{3iEY(4t8sOAO#a^RcwbWPT*j_K;P5pvbbV4D_g|Jtu78$E^eZ-(JxX?qS8 zG0B?EnXm7Bhk4i%EZpX9I-iLA7AEa3pwlYnYU6>(dt8W9A1}P2+T{+^x9RUthhPf6 zg9`<5nmseucx{^1(ob>5t&8OHbjN#slVy z4B)Bg{r$ggn9*^lCPP6E<9#%593W)W4#xV`neZ?BmmCdw8{qZ;9hAkYd?}^jJS~Xu zod7+abgt$858?V{GI&J>mg`%MmFdL9LNy0_`ho5Fe-rVR`{7ff>c0n|_~C5d`Kobu z4fdi}qFjLIEijz)&g_{i@ox}@)G~f@=a@stu2)vaD}FuA52)gR(kY-Dq$+yN#(gph zq%rTBF>38^lzNiX5AJ;mw2P2MpZ_P41<-qnN4CIPfw&-mMA8GuPX@r9fDo0TzLPqy zONh4h!-O7HG$#)dHqmsg)< z-M&8|5pICL{|#2*>HP&HZNvYczsM2{@bk`00Q7v(o!TPW(-I6MZ%<847H!eR}B0ISdMm1{QDk zDo_Y?gu(>H+?LjQysUmE5*xQm4<;{t27F`R{ZqY8KX!8YXE35NQOl z^hm|#^_5jKWtp!;_I32u!-*@zz9oSa`FTX?E(K|3&9co`{`F)s1C8N**hDXfyj?66 z>?_bN9bVlK>Y<2IQEU5f`%=(`Kc7TvpjDl)_g&QxtXSnWv>8iCJ%As$%+9qHeI z*w7L*0($($UO*FV959}C(-=o8Nz#BGeFvzw6|WM3LshKRzG=*3eGl?zPWXL0oVVEN zG*|uO5@ctBa?;gu80G-rQ|HbuSSp~AWci&>SJx6lGD?Ok;igF6NW%$(<-(@JKZx;- z^1M7=cIw~;GmXz2z=>@uM0cN2}6Fc+5@zm=djVdWx%qn8Z zL<>qbX4gi%u(b^_De77I=}Wxn9;L<4 z2P|m!KQVKO9e)5WE_^Mpwhle@Dix19kzd$nMjDvEy2RMvU5yucZ5NfDLM|WN2eAyA zNCCJOFFH*s&0OYxk%*F~9yp(mmf2*%R(vCI?BV3QS+p|RC%dBBWU{WQ;?Jh#qX?o0 zZzxo@pr$>@i2YC~LH8u93dipFD$x#&$v5UY7p(lA&C4u#d#9{K$h=cY&pHl4e<}EI zI%xc{6H<#`NuAj-za}6k(ssOdkW^Y0ADRL9LC99f(4Sp;m%AUduZy}bQpC>(Y=E#J z?dcDv?;Cdn;*lDlD${@efw5!}`{Y|Y`T z=Y8(G;%@QYwKN5K#E+Y=p1u3YUhFh1vG>KG6PY(bl~OCL+|03(E|z+4vRp|A3M;Vk ziLj%TMqh$h2oy(Bu&OgTzOO5YVt(LGYo^p#FsF}4IV4qh%`x;*3pB=!h*ZG;Qyor9DdT;Cbf69Z*u{ex-UBSZPep{3QaQV|orZoP0|k7ZXmG zEA}8EL9$ytEuE3(phd(ep|l!yC@HyKdvFB`yLQaRl-{4eXS$TckhsNKfBo1| zijH8VS8>z}cQhRtT}ZhQuPtByz=gaMdB@cZG@@eb^&J#Cuu*tj55@T@;hON0sL1GK zKc5ERbA4>>O6UQlJ>>h9_yXCY?1V9rk#2=1Zm0JM4`lC7^*1m8DbFt@ux~gMNp}AF z^13P`pw;m>Qz#<2x~4k5g_C#JGLV^>=%pL;WBB@g;8y`|BmQyZqzBQNcYK3}^)b(2 zh|ls;>+o*vCpwWK>h>ahoX%uLH8vQaX+Vfbum+{GHEGUwhnnBS3egf0sng4=!#p2I zlx<7a^z6!-i0Oc>p>f@L8Z{h=Gp|z0`bO73GC2N$eXzQ%2~<6-^z?meGe0WV6F}B+ ziWNXfMa|0nBQ`{8w}%(_(W~?#UZ@+w@ga3M=YyvC(Tf^A{a?x{SQ;^=k<#0RRj1xH ztG|$EqTzuEt%LyR#>Au^?V1tSbeQ7 z`!c@7;Q5xsV4M8V`gG~3{tbrSvT5R<>eV`d9i+qRB#OV7Ho(_ZMq#T^g4=FNA8dx_ z0L!+CHUde=HqmOJB(`a|>voD%-r@Q^{3^^R^Ym!{z&j2{7se;p=6%$93`;pRq9RT0 ziQAMcYCXo~^~Uo}H^gk@hTmae&m;kTD$Fex@?dS8?$Mv?ZiFip9IS0LB61OIc-xU` zh~|%BR)nb>mB{a*F`x+~5t|O>j>+J-uYWuY<2wdSvpIKCK4xzkLnk2YqpFlxAH)LiD{9cX;Zq<&MCu~#qa>QxOda0IKG2jkO! zB6U5^1@%muA~vmNb>(yXIJJ9eMdteqEFvgf2%`d?X|wz#6Y@aSitNc4cc=V#ZiowW;W*M`pUS6h1fpiA)+jC$M06)vNEzC6UNsMGW&$&dD z6N;~=%ka27FI4dq{;fQJHh2T zdYCO{^Oa7%&A>%}E9L(aDUgT8gpGfh2tC*L^wsj+&nku@$b+MesO&4$_7+lp zcO2-?hNrGlUq}LY+}wG4_GyXYC(xpfxKUII-VN#X{G%2FZ(?gI{yQceQ`#e_9RWQG z;zMfhyLDMYprr9uvO1xbi_Wu*MM+e4ymAU}PlXNp_YS)Ymt9~vcOeQ(fI`5!GfFXy ztm}-`#l7OiV&cl`jw}}H{*D+*J(Mqzs4e2_ef85lK-qrqI<-(K`=$Vg93yGo?tklf>d!Q;^fO&J=;`19yiG*7t*` z`_}HB6Dm&`Q{L*B6Bjpccp75(V@$9h8LR`Jt!EX{Em??b1eqt>U=~w8_8o2=S)%m{ z8^w16ieoP4i=w1SlWLs88%!pYK}>UDB)1Vp_+#fg_4Uk9A6)VCLchK zON6E_Kgu&?g8D>R(Xopn)YSt{!iI0`**~4+%M4wef4JbT<#f=S=G}=PK66^z7qHQu zz70K%8SP>}Fs|P=E`AN}3|w{krR)3@+x?TaqJtM|8&gbMF4V?r)y%;Wx>~-m-uPk# zJXA>C!u;vkmP_}Wl|=XJNI%)G$t_satBX{RW-Xb26sEG#%SZZ@box&WUFlt+6L}Vu zb}l9RMtN9^Wc6=uahBQL7`^8LeVSEVBYb71*qHpMolAHDadGjU1^rMKObju(-l1(T z-M#=k`MJufl$4#kb@-?v@8J42wa%KRZ24AdvW)s5Wr3PUyNxN~hhz3`|2d3cT^=|p z9zqk7%0BOI+CVOEP4EDl8Yim!%;HlPQX|%e^ZL4e1nZ~*)rT?}T5MV@I^{yqywK)@ z&*Z_1o~m6xKdYJY6tpQ947=-gU!h%6m}W!8@T5?&>K_}M#qJ2dn_RMiL*x`=O?kcd zX`Nk{x?r3H-P7nAJ9`uAb;OfZAbzOoJxZir@hAy@!{Bm+>@6dE6@W9r> z^TTgJPHpABa*_XU^#$i-=Z4Tsy+OEJ9M(viy^`MbKvCkfmISOc3Q_;t z*u33Up+_5p;?0bPb#v)Yp{ZCcrN`|Wd8G}iVy#JQ^o)BFDfx|ihq9^Hj`bpAayvA zmeS5Bx9dx-)6ZmYVeAH|o?oOeXbLz|0&o+{$*^eg%Pn&;!s9|)RombM(DUsR;yy=FQ)|gDM zgZHI26|A2ejze}^qp(^pZ5*I%q^}KeW9P}qFJoXT2;_AutV#wA=@hvYDNqz?s>lBt zexWX1<(RsC2uWVXV43NPS^^nuy1ELMQS=}Oy?)E78^E^K(`4Av$q(;QDAZUOuA!DT z{q-zv)HHeTDdtG%NFRnu9Hzuo}?}0kNXbauM*Y|QsEvGl`*0f$J?m%C3N-nAJe$wk&8wAG#5pZHXZ{T zS9siwP09)Rb3V5KcTo642fwo4@NQ3=lyW6&%ML7Z-S-bzJ|b#bV?4BAi~r&m%IjOb zh6zs(_-(c$c^f_THsUeHmHx4*oyWNYp0ri-mjR?xJg~f7=pC#AubcQRur)8j5q;n> zi%uLFL?BB^(@&-o2{M~sBm&2UCShN=wNQ`|ZBm>*QnersJ>3nzBUU9GndZTizS^jL zi@lCH-R@#jm6T1~owP#!f+M)-v!7WA&osVzhy3G!?V)m% z4ZJ*(s=L?D5|v}B4#CCBN)5vBO^5NPN&vrOR!f0dT(wA;x$QQfgOrQRNSG;y$-0_% z)voTpco{j)F6(0qTV#@qznL2XxKRNI5zcz$o=xo9b|wRSMuejMtG3av509q0SmR54 zkdBI!!TOA!szQe8^k9<@rW?LbO)>$Gcr7RZnq3OCv z(!ovAlgt1sDjXOJ^kD65N;{134e^URebHhgy>HkkH!si*7!G<(6uB$J6|+Lj3&3oO z%^cNhD8$O#LBdQ)*bdfFmK9s>LWw{=1djQizE5(IE(c|Fk(5Gl&Dr!@U~veJ^$&^;S|J316lSxiSzCVtJ6VW zm|Is0`<*-kFlmte!{!T&EA4gTo^K;z-LyRRYau^{yiK>@;*UKKC06tVtSy#@=b7Sk zX8@?hT%GchknTNk*pxyqlT=_o;(}wc|7lDB+oP^sE4$C+`bMqxNlUgi?*1ln}^2bx|hC9{Kd?(Nfs3J87D$bb_5mPOy&#cO+$cHgE0Ivt%wrvvJPX zLJv=fqai`rfQSnayyy-8x{Xpz7j5bR5toG=!;6g$dyN5nM;_3*BAP`gx_H%*i|4EO zk@z^<4e=(}?D)Xj;i}4^N}4Lbo0v3Tp;vmY^zNo(S05eZZnR&E_+!4NUv<{ppbE=i zkFd}^{`m3v-@{5t>VID1nK$+}o{$H_OkWB+Vc>hGY8-9UdZqQ$1OO=O&KSp97JC2+ znj@wWkmvUL1;6&P9NI~M$du0_0>CRyhtFKS-0Pfcm+7Q6k1ovXZ#U3!kNIq%434+O z@vf!IE&P?_oeMWPF&*VLfc_5!VX%FyFNV=MQ=rFB*3&8hY>blX-M~N~Qz3KSIM~jh zbo_;ad2z$DGk8=C4=&5T(^J#&98aD-R6L{d9_P17=AhQteZ(1>t({c7BH)Vzn2+Wz}{0}Vq* z#=r^W+*q{7c4a9f)G$o(6z^mpHYRdzhwY|NQSX3WM*4Tr-U9+%0^fSrb-Sv0>z)+u zxcw2}Gy>rWQ?w#4i_qdVHSWEJr3#4qN6L0%zVg^^luYF{-(mp4R&8ld|IoAe8>DP<#)0q8h4YI~ z8#Mf|k0?hf+5oA59rPE3c*e;CNM?fbvl$fls}r8@j<6uK!GCAU(cFS*5nXFeq+Qt8 zuE?#M@NSA7)WjSd#7xHPF{#KfI&!%w=+xjPT(56BahZ3Oc2Vy=q+|hCQSL~D#lx#Q zvd>^)|L}{48<=HW1-FMOJ(a3CiE&Y-=+7b7@_{lyn zER)6lKs=mxS1tdM)39E?4cj;#KR^YpUbnuVLsbt1Sx&;OMr~O8sPQ`O5290d69i4r z&V^EcXdnK4(uF%{x%?&PmxOoGO+Iz%-k%ee!@J9_xy4LYjV%mU@YHF$qPrKAkAPE0 z6MsCSt;7Xv_JAOjp9JW4W&IhYC81mLaoVX^=dQ@;oLMGGNi$;5D$Tpj*@GQ+iM}Mx zi4XUu{y6O$qC!f>ucHp^fN)uc+3^K?Bs&_{@2n83UcqzPrb9+n8iz$$$&C)#@n-2v z#_V6xsT1Tj{bP0(ZrLvdxS&{y1Ur*|qmGBUX`h?JU$4teqPaH&)1&0qKGpA(`ux(5 z==wew_UDJrx&iIezj5zdt8;W5;#%Vt*;{DQ_8)Li3F$;Yj76OR=4R8j#YE4T$sxh$ zzVw|zT2XVz2MOq~Fb|LqXr9_c8iNv&fEad0^kDg9o%+#ZeC>WZx~v5o@a!~<CY;RX|Lx{fJ1OP^vlU4y9mLdvkU+MSV+cp^g0d#cg%q;+v6hfYD#OI~a| z^>SGVcfE_T4k^wQ{I*3}}OkPPx*LojdsgNAwm62@8f-w5K0@iKDy<;i0l!7Qy+m2CWQ z3}m$?xA1C*RrbnNvo7@GFIq)Wv4fbH?8y~D>v8M8D?$za{gAVtrRoLqBVbX!rDD79ui2I>zk zvyI5Xeqd3$3AXt3a&;$5)?Q*IVMvMg2TOL;YK;Z?E9L+@_Vsc`wa6QQWCmdS~4 zd66pO#JuJ_*}U`9?zIOKbwCJv*{MRobXrk$ps6**peM=19@8NNED1XVyzBz$ZnBH# zs6<@Zd{=j}b(`j3TDAEywB6rz0Ni1PNt!Tg=7^9k`ft2wNetZcFmCUMTMyThvSRe3 zZe=zziDt}eed$fFPmw5@pQB?*3nQa=Nzv@*Ms1~rSlet|(=kB+QwK$Y&ynLIctf(Mq}uySPH zqTdW4g+H4>dJQ8md`6;sD4mE%?%5SBa^*A-Y(IG?P~O8(vh(P*pI$|Vh%meH$y}E_ zSQlvzZ66Da4+Ajseb1xwS(asA5|ugciYzQl@8YPnzQXomeHgv~L8z}#5HMq2b_ zWLA7!^$)jc03E5Bs1q%AH{}YpGb6f>aaBaGw)6at4C9p1D|grP9G#0*+eC<0N~@d9h*1NzQ-E0y)5QR zXVcusrD6TDW=2xY5}CTJk}jojuOMAN_7sDVHQ0Yrc=7nnJYy~(r?R>Db8;v;(?nO` zG_OGBZghdRTOFM)UE>t`;vWi@-+=Kn2e&Ns1kP@@vaYzaAg1>rQRNwf$dseqsA0kJ z3hLR)U&HlsC(3FOTzR9cUiOd&i)i`kdkBON+xMTGUGr3-y3}msjf#eUVz7N9>TvsIRT}nTS`v z>x;(^AG>`T)z_ObyI>L7f7MvAd72>YdzjfMy&X_kJW{M(te>})$5hyJMf85vf#opM z*<+jLhI#|h-l%W;_o_a-yPv3DJbpb-!MAooruORUz(*O_>17Jfm7f*My!QVek(bL< diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotTakTestCardRunning_Light_b29dc7a7_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotTakTestCardRunning_Light_b29dc7a7_0.png index 27dd257d0dc584d967f89550138cd5166b8aa04a..113b8c49e3a1bc194a27e14a5aa8b38bb0b447c9 100644 GIT binary patch delta 26595 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 Y-quTD+4X=TNTxo2s;Pujcop=20BQnYp8x;= delta 26671 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 PVlI_uYEKK~-}?U_u0e<~ diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/WifiProvisionScreenshotTestsKt/ScreenshotConnectedFailed_Dark_d19fbf1f_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/WifiProvisionScreenshotTestsKt/ScreenshotConnectedFailed_Dark_d19fbf1f_0.png index 16a07222b96d5de02c07efb8954592e7fbf68927..cd9db3ee6fbf9ab28b7ba5c32cfdaeb9c0cbdce2 100644 GIT binary patch literal 114402 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 z zC&q@*+vv^EA0Nm95)02^m4v1f$|$D#tu`ArFPT_1Kkj{R0szNnDezp$gLi9A>HcKs zqa;LqYDg#(oV{WK9h&pn0_dG_$WI`Br5>O+e{nkkNhISL54$8qGiZPuQvHTt>X-ng z{p05#^USoTB0o>avHl#>qy0krfxsgQy$N!XWT){Ne;BY`X9uC~IceP{WyUoeW2DoD ztY5U~SacyiBnO$N;bzZLw5mS{Olsm!5XyK2g~|gkO0C>Cz4tcIEq@44*r>ue`YYSh z#~Ju{8Vp1HgVfK2vKBEQUs}WL1XsmF(l(uIoA0{qmJ%;#x;c#%6G)wZW+;4L*x)XY zQ401}s)`k{l9znF|MIz;N%fH;gd9o9+(&?@Mi48b zm-$-on!^&9O||6iQU!(Yi1YC8RWyls8`sTov&y(_0Kfw{ZN5*f(gG5)y#c=IfpaF_ z2k%9c={!UYYZd0Y=ik`X0AB$SF)hC8=?Pa0n2Ws(;-R>LEM%1Du`L0S*)4Gj3Q=S> z%{?|UOJ~2)UyVl}arSrGI;skpk1(Q*mmPd=%B?{%IA0FJL3cZl5sz0V(9`Q z4D)$wcZlj47F;BrlI1$K7)DlMQe6)BcV_Bi5%3zHMHw1$GO0-lYR2RBU+2a i-w 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 literal 108637 zcmeFZXIN8Pw+4!CEa(Q5qS8ev0s@K%NL6|-(j=j5L3#)^79yJ} z2mwM52_T&ikP;$*j2RMb*bR5X8GJP(YxvWAUPQN5zlP<~?MZ@G@$KV~w{SSIgZcN1thBPdvS^LOjY)oF%w$XsxFxoo%CdkDTUOfd3h$Yie<|Hx zKiT93nZX}$c`g9#-ltoc@zZrkuCN}1a)r013E15FmsjbvI-9e)5(!NbL zu?oTmhml+*p>#4MLN#(u-Hl!gZy6cL2U&4y{i_YPMg z93SMO2c#5OE7k6wIgWvm)xx4!uct%10)`SyQ4!^tK3d|7)y_GFx^j|h z2X!2%j%sTwA9)6LIr)QMm=4;aM4eQH*fHd`ZtY>XeNIu56&s-rr4KQ~lxXnl=&nb` z>t?Jc2!LdQYOooBM|Ep^^3~o6l5+i=e~=>ODeGZtFSF@K3dUQ^)9okcor{AZok8@7 zE~jMw@87}~>#RAN4a|gW`W?m_l|ufQ;M-09P=_0(LFv;>%DZBODq7jfp6$Q%-f5A^ zjn{pIAxDc76Uzt_4O_WoKX(FLwZ5lj>6{H9+PJj!HftI_93Zm4+^wpNz<^6(pc z=wn#M`!4qTL#dK)8F-vnsvLK&;zquxr!CdTxO1L0S{Zz^)Ob#2e>CHXc4nzAGMIb}jGNw0Z8 z$c8xS`1nUlrU$kjhKZnLkXR!psnvwWs@M{$#O#U`VSnd6DA`>aO!TP3Pp>XetBt`f ziVJN%$TmQfFlJ6)h$z3p+ijT6|N{GE=d5bRkg{=7(zs z>k8Ya`8@CM&|u~LFd$E2fIKQQ>aurg&Iq^dXcfEwsBJo|GnK7gSx=7gQ7!pEQo=>| z#l8)_LX+6RWK45FA2x&C_m{!Y1+E~ANlS|9alLKCSj>!zq}*4mmvhIHut3{Vl}Jv# z?>iIodI7ejG-~OeKQAvc>Xzy{1Bz?xTC2hjM)<6&+LlI{IpwUowU<-QLv76o(tgs9 z+Twh;&h}pl;9Ds2^ZEOM5v!{e!qxB!a`VHRmYF}z_NMHu!f`>%Hjw1)?Sp8aBuv!m zIBtc4!$VrF94Ez&>jQ<#BrN^6`ZX`p!N2z!qb^_}-sTGA!=&(ly5psO@C^(1Ic9Ld zan8pV(3krUz`^s)%8%*}tNNT1#N-VzMD4q`_lzHXm|dBZzdN$quj@x-yLacHQ^i!d z0?{hq!H5R`0rm~djR?VQyfeBHF$^rc;Ha5i*T`R_>6d0jlig+>g`=(xo$vcs9PrJUSVg~58ggT zeC3aC%PrMri3l(fk(8?n(yn(H{yfBM%fPN`+PU&_l@pf`x1RtF$)dr@g+{Cc@ZC% zS(We!bz)0`TJCNY#tiH$b^#eQ*}xL~LzgC7n>Pcbs^|ci*i86V<5Cyo9?uS%sT~sy za1bvfNx)1j>JOM`_L)>~YcyhtuidEE*5*iPvQ+}TxHFW0jb}?%$P_u7;P{R(mwf3H z2k?GoT-U1J(6gjA#1&n)2cPd*i+M+Hf)aQrP=~gV95B-tCjZdF2>LkHJN7kA^OZ_| zZyimwtZf;;0dfv3j7s2@g1=^>q4Tb3LB0I|HRYF8+HuJYWilTA(nJTx5fZ*NyF?#c zLEYvS1}hdS4f!X7NJC+IKYQ~GF0*i?`s2negHb|^&7>o>;zb;6GrsqtV7+!q$rpZj zzzhX|&4_wAS;N=Wx7&tpquOsRwF*3I`hM(YC@CXs_(dD>Wm^)PHo6suyITr%vRGVl zU5*s!D~HGssVr*!19*3izUJ5t`8-&Dxc**KhkAY{@k4gau3WN=-t?J~4}Ylg9pMW3 zcP4&ia#^ibYBAH5k(KDn3XRys%|EB;Pi>dCASb`edo_0Jrhn)RHjTw6nL~XRe>qM< zr@USdK#$h(@FVD>YJW*dHz}mAIGD@h=jUDucdM1`ZcqG> zD}2UklH|)Gwz1r;QUd|$H(r;mvUU|GB{t`H)t9H1+k?lPmXZexaibgdg$vl$g0Yro z>6=5{CV}Ww&>mXUcsY;|O)}gpGb_|x^%X3(e=Tent5Z708mCC{@38f5S>FY9MWug! zb~Mz@CnJQ)Wy~m286)tb9#kbmp9-6ilnQT=Ofz7-DkI!iVyM+(Tj(zbc(1OlwK&o% zTa<2j(_->9%TnvE+2#>mdj9&HE7<4V2Wpy(Ei^C~^GkHI*WzX#eRuh~44w=kZWbRl zB1_n*eqhzp8yDbtnjU?U3x^-hpPdGd~ZEJ=1!1JOxUn$=5qQ%kpQ-Ipk5LDM^p94(1rt_o7IFoa_4`|=Gs z`^uFPz0{cLeWV;@;9ia?2WK6`Ssy1-t6e3bR8uCy%5QBp67SscOA2UvmlSAgt_f-w z_bk(6jsOM2tQ;?nLNLkj zs@CoF5v@BK4^VGaiRHcuO1ztUjo-SKE&bb5ao?*GZg`O*%LTxEk%oF&@(MAJHjFB? zeqAc&f4UJrK~j_^Xs2Qq~JFE23`tevYVlf@!;A+=M4W{ zjnV3+xdxpIMNuc1Qn93_M`J&@wOIVQ@#0e!cVRUQJ_uR7o}a=nW&7^v3sWP?dZQ|` zrednztY+C1XXFq#vS84kGBa~%YuyO_!#OGG9r=pEO^1R=@)tE5FFeGFll{2={JSb2 zQP;x6C0$xs&tK3iBX<$SA;n- zr(7VKF3aZDg9^P3FT|6`f_&P!Yn~f-KAX%kB@Ka9AM%cp7MsEZA7w9nVf`^^VNzyt zmf_>VrH`uF7Y8Thdff58$PHMKC;g_W&;4HdpMYKr_cDWqt7HV-k&zOVN)0 z@~ir99Ak#ZT(MHs0J%*dqV0{EDpp)u2Hhj}D*f|=!cD8@5!`{ij zCy*w9Pt$;y_v|W}+sJ?{8tOoqPh6roL{K0!l=n$+HjW(e3j4zt)XeJML7wiylR98neCx6*abZhgp-W$2#e z#v60V`(VCZ$w-`iRjrLF9{k8S0-M@&_B;R$sycu9?0A!A2A_u+9hLLdZ$S%hIVF`` z`qZ4^IMWikLAtwbX;a747;~^O?b=$nso;8#$&eR^4Te5$MxzIkq2pxT=Jn*lhE?G= za%1;>q^>8SkJwvgUR$!H&up}gv7MoW3iGp0p(Ijk6RL8?MO}}@19c`h8`yk4uy}41 z{=Js?Xs+Wyi`e~#Td{qsvc*IgL_H+8hire%jP$%@qcPecxB+jr$;bhJ7jf3d4;Y<})QcVa{7_nA$I}gxiP8OQ)%826Q?#2WivJ5d9WQ4U;%m`N*i_a^h zTq!Q3FjrUPG5cJ6`QJc_;q5 zM2*9&5y|2A7c&|;?}#5qrhondH{KFQSa=l_iCxn}KT5sU^A^y@GzH->G(QS&kDlm# zQrhF=jZ(6mBrbhT^eEctYiN-h*h_QtMwD!C9@V!p*V$S_9}88!??bgb&oJ#OySVa8 z!b#)BjP@kOV)tN@V%YI8;h_}$Bfn{b8?5KfI0gI=sW6EQ`#`N0M?&4L-e@<$dMP!0 zJ5TKVtDx`w8#+A~)Z1KLZEZ;B0ZBC^cZkCCDRp*mZ@js@)3xfRi}S~?`6 zGuZ8%L=|Z@A3g2nOv&7M04PTYybHL@RfjH9epjbk)1trOH}t>`m-cxnh+OPaBhzmI zc}VdqXjJ+!I<+xK$#{pbR4nrIY`!bt$$^zbz+K7?Csz{(#v58v>YCBjmYZ&BFz)4Y zw$HLPK9(|A+Pfq7Q`6lZu5BS!h|ZlSQWxExzFK$QJ;@Xw?e@P+p4+G~I?1r4sEYh8 z8ljrcjGtMfR_g&o9hg2fD<7?zSOixPhFhKUskAT962eARq24z7(PYRuEQep&L^ zYgWcQN`(&B_qjtji@#5-W?!#!bt{zoSl8O-%CjH|u0!$kRWXwK-wO`!jPVz0elAWph_7 zE)`Cj@NLxIU5?^RgWhIJsu+L${5zq}k~{)yx34(olV!gQUjt%=rNX!BV4j7PYUUSU z?y3lBKWirwyog?V@RZo^fRL<`2y;Ny02GYdJEp1sD|(=>4&_!Ni|@|`szi9C9KX~w zJdV5V9U0pKx;3%-k(7L;#B?*F4$mSO0M`@#G;;QvNX1xnq_+DDSbZ~OG*Z(&4|^T$ zP-t1lPzhUT@a`8!uYJP_NfVMm%2-QQImXCxer5!hB6Agzl~5w9h`(}CEhJYBcOj1R zLtQ9Wq-{~wgqZ6V5 zaOErhGO|(ofqUzJOLhU;*0}J<&uD0rGzz_3IYLD)-x^_)6`E{?7rIn`D;3H%dM8|W{?0+}Rb6es>iOju9l&3+-n>47-MdK%faCCI_S8n8FFD!9! zLPPyt;=91_$_Na8^Ca0MLg?kT^CUAHAmu;q5g3_SftJ;UOl zZhh#7hCat#)yg=)kPk8|$-*Ub7h;Mr@dve@td+a%naPIxhvJJX zkPZ0kb&HqzlCcePlif3t#qj-KkhKqe1B}kKGsF+3v4g}8x#8}J)-KjEn>&6hm3P~8 zh0O+7Nbns`I3~vTuhhYUB2yM2D21o*DDHzZP=yi6ULF`l+w=Dp8NV8v1M*kX&^u9Y zm`LEDBI8FiI_@1Qh+w-oTdw-;3^vWz`IuZJ=5{OQHiDq=1oU6|{Yci=lF7(ssD@o) z!b)~YU*m4G>8W=106&_LoG{BIG+poND<0?4klVOd#r5)6ounK+uf|AtK8D+|=b>Z5 zT(V&Q2qAyyLDdTMX~~{aq1~QoE^JY-={LC(->G!q(K@HnpFJHfyYPg6k1Rz-fVC+s z9k$a0A2R}cCNLtzF%GGz^(9KlI-Pd2VDGZnoMy|v+XB`K@102R}q=npECP? z@xKC0eJ5QJmBfsEXNtehEBpgl@iI z`|#Ws>tr#)y-P_?dDh(5eB9RE;>nG4>;uxBf28LbHayJ6K*z{(6!z z+S0EO3FW{~!cyvIY6K5hg`7BIQ=|l{(pvgCZBDH3ndV9(I1=*`wEi>H@qYnhLd9>X z9mq>$ln;T2Q;NG3h4=#)*-chXy>@T|Ikb1g${pB5frF!ReCnN;ly&w!43JcdFwhkTB>(>lhe(Asu?o^@i z1_ebM2b0_iYy!W<7>VGYvbP>0=9v(}^!wKUV%`|)*@zt=zTVX=QrDneQR!L7UD$%@X;7*BBC{Y<5F1~Q^M@~ zhfV+STfppWykp}(vPE8V4Qvl0L_NaE4i^(M@!}84AO47qq*kj!y#-Be{h4qVW4}oo z-D_{=t4+G#H!BBv9BpuvApPRTcfzNAJfGKH1>#N_^pYq%M}|&c9j{0nw}|Z;8*w$)d!pB1s?nY4!syC{%Nd;6<((T;?RI7WXu{ z7~sSFIW^e0Z_)c4v5Fer9(Y@SX$Usvdeu;9&Kevp-o(`mNUsSsDHiR0@Ze!0+)Xq( zBm61A+Cg<(ii=o)wHF)zH;1}qG{< zAqQtO8}!Y^@6D#n!@as@ZL*HVzlAp^p%xpaP}|--${=~{U9-rV)0^n^4#Hn_d zY7Jn;jt~Dw#=i;sa53eI;N}ToAO4SrFFubm24pN^E@@bNd62L;o zE3!;kJ$F-Ii4=J4B#@Nnb{Pgc&xeiL7Uc@Cy^I)m;P*^H?#lf03pQpbmh?ckcj|p< zVno)8w3R2ne&!05*!sA*vcQ@N5-cW$2ep?bPfGf&SEDCS{65L&7;yWh?gq@DLt*C! zuWp2z;7!fu%)&=?)#4*4Pi5ZxFw1Qi_zmIl{Ky zFx@*UnwMzU$L9AUwpUEU-5(t}aw7Q}*oM7U(>SL*AL5~MPc`!_-jX0szfdQMLou(6 z+bBF7LTF_M<=0Ug2GecS0s2*ihBhuT%L<+`$9plKn~@m$0ME?P4gS)!{oh0s)CidL zBw*6LBF%-rA@%BZWsi{FITdDJ__iQx#mg=qFTrFv;-9YF`(xE?Fh~#sN1N z*;Ks&=F0MTgst7Zm+FVdCTvdc@@Y#7`ejB!8Q^`FDE(`j*IH23oXsEpx=W9s@g4^& zK4>X^KN-Ll-SEK{8FmtrfD-6xM9qHAjtQb!4{bTu5$5wNz$u&w@QU(tn^ire&Hga%7}>EcLRM&Liv>4EIc^ zJ$92DKo?L|41c<(ueHK>4#f&jYdPk{_r+P2gK=s`GxySyTu8X_WF@_+)^aCp4MgWq zxJ=As;lLKFkUc)4re+AuX?C5-&Gk-fKt6#)+^SLI)YC z-Jh$}_=D^_<52;&P6AL0vvPjjovKep4PJ9OYe?sF)u%X}IJ-hP*{hL<*MKy%Iwt;V zzUoTu2Pa`1yc6w;to~rD9LvoMBb359u}bKVJj9i$OB(7Ahl@}~rWs9$xAKhn@1Y+{ zn1R}31|`APirM0KO=VmDy`s3`6N4Rj+g3@41~PfYIy11(qK)2ZoZu&`Z!r*X-F!(0 zUTr>-6V=j6ei^)zgo8$MGHE5r8Q0L*Wz2lKbt*^JsKvRUT)1^-4Q>}I{^GeTq$m0T zDhQId;#|s%zw-x)^Xcj%D@fC{rmJ>88V!ZU+RE9RLnj7O6LXwmFsc6HcZ#b8(9%|`*ZuS>%Zv+zo! z=Q5Cs7Gcnu3bGaAG5CoW$g_|o{g-xKHLwTv&sIv=1bue(Mnx&PxaSlz?$B5qIDs6dZ6}C0Py9U0byXk2oAUU$U9UiI@n={*>$Jp_Qoh9etX+rR_GT*LAfZ~wl@=s( zl5iTRc7b4(wL%<+7H+R?^qFuS$3+)d0hbU>382&%<~+<%JX_LZihTH)jYdcYn#HYz>I2*l;%ys4-L-h|UE>rc zPiYaeP4K~-2pLfBGI!fhyN-KH<8!Uu5ws|;Y|UQ63YH|l#lT+ei?0Pe+1mR!D@Baj zVZc;5BVSu4SNAr#o@g6T!_GGLhyi)M+9a4m#d#vEzN*C?^nCA zo!Av%OR~Ve$6H`01^@;I*XdsdJ{iV(WjnnWX<`PF{@2^wb`DVjT34Q>tLnYtu@pzanZ$N=x_Bt!S>aNhW+8j;e(3ZkQSia~B{ zDfKeFT+1y`)sM-Q^5!JvBv%UJ$s3?yXAw|B39@D(o1X!by`U>gXxS<7-)Rb}pLZKV z@u%Iu-Xo7W4E>Z9qG)`A)i`)>`^`&Mf3;m6x*ZHp?Hbq>hX+I7U1J7MQ5*?o#}z zYA4^U?#Ue=-#-z4%Is&@yleQZ@e{c4ZGyIY+RL>^;WI%2lrD!UV@V^B!n(Zs z%t`~JZtO&Q1L^HtnwsBuj42vUNp%x}WiJ0&8jWjWzL$72!3=H!A?opsh@#A9W zfUSQ^(6h$@`bR0G8Gvsr|v%4$hxs; zJ6T;Il=*bRQ*3jrxn!}H>!caZlut`7?SQFW=bkKbBYNaW<3-Pz+quMw7DM6YEkZ0q znL5;_(X3v_C1f7h^$y>|2ER4c{p9Zf9=wxm-FNa>s+5zW?+QQt7=>Qm~EMJ^y)Lp5ee=Z$k!X$GWamnzIgl+VR?dvRkDWqLj&-=C#3#t2QTSx|dpz zHS3~!F{_E7vW~^fN$HC83|^Y7L}s%fFw?K@osl(Eo^fA)wd==~H}laX#Hz^;|FVFg z)Kdp_-~`GqZXxsiv|z#TKeWDu>7*jnsoS?#hDRU1`QghWRV$MD@&Hz+4dPE7D=J6_ z3s=Chxt}qj|A?nLc+nv|e&-Am`e*T$Y$ohT3(^s1B5bM%7q(L~s6v;4muC!xD|n*Q z|K~~BF!!Fyxm-aGb-}-4mK!NC7g{`rW2n0uZpZ2ze(7~iUGqp1SbIBSVduc`INhab zagR%SSSa3ZcaD)^r>JHS_pJP_8@M!?IxMvQ-y+cpx$Qfjc5XCa#M*kLQVAhOP{)q!PuzPC3|Q zgdKjX-yfD-peR?~}_uJTVDM?HDH zG1mVANB{!3OEPg1ie1&+iijy4bO#u=T-$ zOjEx8thRQ>9Y+qp;uxA-@BbV8QfK`EP$}8T=jES@oBixQ5*|Jy>%Hq=p>2|_K}Gb4 zTZZ#_5&>0T8MADHg9{^vp!%WU8AmXxG2)B`8E`Otz*KWJjo}@JHA5ex!a@wY{&6 zEaP?@uLy3IM$PwSZvA8P|9)e=ka?h&lke<2(9_#5#Q1Tx5@r|05nO7@C-GzUez;Fr z!mQNhp+LB;rT>t4MU>VzD%aSMEe`S?=}V^6YH7#zh-OD(c;oGi9+m4>s|g+!axmYV zms9HeW#(>)u8jYZ?L{5;JHN*7@NN_cJT38g46s3t=T4s|8@>Y^#E5~ee!9a(HwNg& zobT9n;*}CVo~o-b>Ra835iqRS>J692`2QM87_E-HCQ9m!Vv)JO)vS4GLhL>v*FH0_ z4z%}%9vQ=z=~ZQ_E7I_D`^DdO{gFi&T<@aYq=chNh*Gy|rc{4&pndJQywX4X-~hl| z_cwErk}gF&ba&4cxHW#3e=`C5>i~TGfjaC?(QINM0J|$2ft)c*Sg0TGe%9luqw*0= z_a30%E%(HGKbc;Eb(vi^QDtmg`6wjBkp{Hk=B{}Y4dcc_l-tXi`i5m=MJy~d&Ra-& zm77{>qyqJUPrnF0qOHvR4Q{%Nq>9u>qR_=rKSp$2baV*WJ3DleOpfujA-pbOAGb#w$EmHHe;c0-Y7zOB^QyB3Q;*EjGP zIRV&2U{C4VD8ImgQKv}vB^~$oXFblr0nF(enK9yGp`8CS;$-)WxCvBpa`a^E`ZKr? z@YM&9#_G8;dO=~8Pg0dTO$Y1ZH&06IxI;&cSD&TV(}FRGp(SCffSvGE0_Kt-6*@%U?`L+(gTolP9h!|Ybqi{ zd~zRX#4}D3I)Dq0_q>l&;~8^}eN7Iqy~}GB1Js(gFpM$M_ouS;6e?VY1Md z;YJAg2x#fRiJ!{V<~N2=JzkBQJsF^)%2)dhPgI{cfBPSmKJ@=C`aco;zp#Q_>Y#cX zq(f5Bn;f}4)@!u5U~lpD*-W+DYFyVjr0t%HL)Qg{KHt`h?b4MJlHUI8b?S#KcM_j! z=TB(fPqY^9G>mIYa1C)wM1f}ewThryq7C ! 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 diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/WifiProvisionScreenshotTestsKt/ScreenshotConnectedFailed_Light_b29dc7a7_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/WifiProvisionScreenshotTestsKt/ScreenshotConnectedFailed_Light_b29dc7a7_0.png index b0504a8745edb974f31d86429bb8c0999479892d..e880274abe3161d2a4c70736ab7877885743faeb 100644 GIT binary patch literal 113817 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 literal 108004 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 diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/WifiProvisionScreenshotTestsKt/ScreenshotConnectedSuccess_Dark_d19fbf1f_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/WifiProvisionScreenshotTestsKt/ScreenshotConnectedSuccess_Dark_d19fbf1f_0.png index e5cea75cf13ef278c0bed2568117640fb3ef0ab8..2f536f76c805cd3e2568069ce49d4db1e3a9dde6 100644 GIT binary patch literal 116492 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⪚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 S9$A8~sim%`hP&|~&a9stRkt(mz z?P<84+R2sWVumd#m|1vGU2km32w^td>N5oIgcZ#1*zG|7lkNP60Qk_F*b7z!3vD^# z4*fMzYy|ocH~Pc^K1?!0S-}TZon;UBxZ$_!0QksW{+}EF|29sx$di(q2e@VjvX}*` zD&V|-a+vcDKT~bn4=)MRssRSqlIBNN8%UKMgO3)C_ju-sni*!K4{VM^H(xReexY8! z+G@At5@Ki-NZnaGm%uU6h_<0ip!^k7CSLQq(4K5vQX}G7V6%sSm%U>K&{cN7n$1pE z4b>>5uFpFnu5<}cN^c=OTI=**JrlFcbggVJK?t+Jb^*sP3iG?xdV5TFO^NmoZ298u zeOX8Ryur4T9FlxDXvMbqwrlUnX6XQd%)3FYw#_(YrceZHSTnAFC+V)Dw;Qhe!zGt2wHg^%=x03;v|$6{ zg{AQVf#a#oucI^{|0r3UZr9d({jvy0Qthf|fw6IcE$zQqSfVMZa{t%vX4`0Z92;ZM zY3NtytHxLr8FTL#o38p@umUIp!rJ&;in9cQe!Xip?qo>wjjx2ni)GPOQ{A_}R5B6< zePCMNV2$?<5_i5EJF{-gXJ`IA(prCQO=IIvC*fVNUdSNY_x?1seHGx?z{B}##^NW+ zX2*X09PEY^NG5DqWu#le-3t>;yG^y7D7FO!YDCqJm^mwLuscx8OlxM$;brEH1zJ3p^MIUT{ z8`mlnDb`uLL3h$JTp|PuRm^QnAA`XrpoK+Un0i%{qwSm8mbruQXlmnbZtu=AD9Ko} z^VsC9h>tD_JfRY>oYDMXYVa<7cyV~NvvJsnQ9d9jpDY$9xpASO@OnqB`yDSySm-i{ zE3IZEj=0wR{3A+-mHKG8RcuJVq}tEQ^nR$Sh(<@~$92EJ!eO62L7RV8R6pt8{GOhq!#ZoY zmm@4T%iR>$;yiabDF4+hGvOqG^P}^2Ymeh{I)9$48mPEnj%@eF)Wcw`zxOI?MH_D4hD5PK+t_4J3Zo{rqRY-uGQ|GqV=|5spIEex0Pf)idRA!3i_6+XI(b>!L=eenYgd*Sd5KNF+ z_+r$sYdTD83Q8~7YmLngr+at9cS{6c(WQFa=n*Q^h|Z>ICgpr{2X+p0CXiL3srB6TctJVgpH!Z z^`r>9(%=@oB(7rixT4qIUC0PH?r^N3llUH8^on4 z=e!4YHVN2V)fMCrx2nWF<}&q_6n;p>Ir5jQigU8v=O`*BXt+R@>`)=4r$>RozCfX= z$9dI3gE8myiCiFCajz9Yh+!VQ7<rW?+S_` zLbRC=M(}%e$e>lT@xv8OIk)tLd=Ncsup9e<`Mkbu@w=r;`cY)MPE>KX4sT}Jtp~+D zBW16w{Y3qWqwiRE$vx1yt!DpoOC(1L7Ps9N}hJ`{(yUUlFoom76D~}M2 z{k3v6Lfd0Yo5Ry76Wkr~Z|2*a)vivUmTlDxfiNx`Yzg~}QmH~VgTjX&h3m*k57Rs<@?pCvR9 zikRHr=~gzWNMTOp_~*x}2?xrl=K4`QzrV#=!LlL1=+xcb&8rvITdPF&@G_C zF4SF{J5+bJfEVTjRb7&-E8`Hd;i@eus1-aVQ_Vp-E*2>SqRI@nu-J|PZ<}NXF64yD zyuyukm$s5UdbFFbY04yV;)8)V&4_qWu_Lh!SbT%pq0{rVbepd7_SX9t*mqSBs_$)} zva9VZ#094nVhy9@Tp8`JET|Sdl$9RuDviXVx{j}1Xv)UK5vm?#TyCY@2c!D;3w1=Q z_<1>RtnA}RaF}}+Wb31L+PrL=?iAvv0RgUb!L{dj)bD7neA&-qK^5rbfUQCyDpftQ z9Dw=!Kq%UZX$#uGC5-=r&P=+&bt_+bRu{9x5oGSZ^yWjcQ#oeLW0fzPJ|+(d{(JL2 z*0K2!g*cA90pZ@O0c+R@{+%O~x%%rL9~zpN6-s}c{ETI)LwL8RV#1$N?ysQ@wHr6($AQ@hjxD$BnU?%6tivOXIjwjOqi+ zLV0C>l6_nw#@}M8;#TBoBT2e=0X!}&PF)^y(RFA;AGVU3Fxn4<9Phfjn1~fW@R`(| zeOplyH|y3*V|C+| z40MNuYn>;!W9HAcn0t}sUm9>#gWeZ}EH~2seRhK2)5)c_=!UpijEau*SyH!se`gd) zyyaCt^KfOd9$xeBHI#knQ_~6iuKqjrLU|cJUj4))5uVJ#%l3>W)d1 zSH5Z6BzU+ot0}^GAr6?>AF9Oy3n?Gf!86N0i(2S;AD;W!78AT*`EiUgS$g)8(3=J# zaNZE8ttTRXcf~jDcbFXwIa^O}`L)OVd?6ecFsI#q$*6W%KLe(Pf}GqK-x(yxc`=># z?QtAtYa{>jc~4B<$LL^wTAq2F6jQwbH0KNuJ|4bny#NlsX-{J=N+5!^;bAV5Uw1sI zA`%!)#ko}85aC|X!3{xNs@Uzx_8ah^zQWcUnu8dBC07$;6sx|FGY%XYpYc^Nt*Bwt z6!8(qF0YKE7qUZ)$GNa!kojo^(Xjlj@9)PL+;N$H(lsI=|hvAFgObWAJP(x0E}hx00L6Xsz5=ShUQc)^t?_&v%4VbLGQy z%bpz7Xx!TOm{+?c>f=a7Vr?nxqZjd+%vI`cojugHn4Wk2nn!7JaRz$x2YdIz{)E!` zEz)N|f-i9L;o29U%icT_vpf!a!>bban|zZyHk@>`(=XW|ZY#Cv8|AAGh!!~zSPC<| zYJvyB8!u35(=n>iWgY(TI8ux4z>uDfH~QvnPZ4tDsnw}dC4R3TelA8>ul%%`XCi2jKqM-Gk}sbltE{b+-?;!6uG} zVpW!YV2e$??~CeHbqrh?^y(*Iseb#-9moE4AcPzs_di&dik_7u{2ctMhpfbWQ&dsK zPks&RWmkSocC0-}gU4kRt11*6fj#{l^;1LJR3{jzXr{s{W>$jW?6P0qL1yEubE%+C z+xUjhhpsx1SL+(f{;S8+Dgn~erLp{-tN?QaDX=5^FdT4jXG^RaMYyuRL^j@b-YxPn zQW0Y-uPn~v_QwiO2v1O~L%TK8(nJ{cT@9)Ui$6hG0yTlS71gtFKdH_fU`Z&@`6_#_ z0LNJv9dgV6^f;%kIXG7Rca;Lw=Xch>$!OwyY@kHeET}kZ<8Ucu^aZlQva@b!J=f7A z<>QhueE1h{mt(W-R%7Yqf2#@<(oh9hS%}o}=9w8j+2o0+p=_;RkNtX5uc|@now7}N z-~3eb*ee&|sDJB*XhyKN0(<+|Q(KwmvyvpOwsBccjE|l{nm|yldaTA~)W4DJ|j+bCN3~yInI;n?}S7{r-Qny>F&os@1#?~~&fx-VO3&+ZPQ=AT_H3`a_UG_#_ z6La*K|Ip1+sidmpIaWU#$^Utft4<&YudXy082Rrj&Z)7t+cvi}T&8)GkX%O_M4Nu} z@1(u<>Z5gK@s3W;bn0fkDM+egR!y%=ye#H|VIefGqJbM3b2^dMgjZYO?j>F=Ed3bl zF%>3}6P(a>&sXwHB_kyW)0y1VXvBb)_t!m^-Yd0EvT04_d8<2wm*5twnM<*skGlO4 zZ&)L~_1y37!!Z#k7lNQ7Jo5t65zB`08}OZyM`SSGw4H3a$D#Zr1}B%`S%d)gG$W%dv%;u&)MGj#Spy%O;92HPhZ%|b`G$khZtqk@>7+6YXLD~$2X6vCk%-In5tIjDjP0v?g6zBl+_c0p9gP8uTpp#Cxz#xbYz|&<(d;Dq_*WmFd8^#R=!#mFkVzRK%ctMXyqgD8$KAy-2;y zV0~H7e>z_`$+ftP9&GHAYm<1bJi6W7_ctAR{M!AiBE)aFsZ12E7hj{}ZLCS2|6t~| zedpnJzL}0UE9|!*cEW{|SoWfcTPTHYYN9-Gvxkr~8fb1?Ov7ybO_#EbJ3h+s{fWQ- zW5!I++gL~}!#l{U?Jouho>B~v=0{HskQK~v%Q9VBO3*7Mh{0|35C!Z~6E;!PB-$qR z1L&Sor0CU%4gQo@}OOuMeukf*V?B!1UDaH%&4%CkQU z3c2(rHR$FLBMpkH%>*jv8wCGq!!1+(v;pO*nCWAc_dDdXdS+XJZ2KO9I)bw3fswI# zENBFao$FBIVmVbEL5DgG@%`!B?`KourK3qOSQMn^9@xhbs|gj&Y;wUniJi3H60+J+ z)Evd9ltP`Cb4rZRVacw5lEwyu9~R-8$BWczq6?AeXQVe5PF}uK_KWT`TxC0sAIm|* zLVrPoPx$%;<}aXI#C|Ddr~uWEfk8VBAFy33qzun%qMAmJbjFcbU{R2673|S%$$nimG#D9|hkZP6}>cm_y$Up?4#I&ani&->6Th8nOKIS0{$WT`j3$rPOZw zrK2wL?LiIU z`ipkG*chPss6t{MWB%KibQD{o&W8nj-YdmO*JG7>K>$!b9F05h?l&CQfMr9)Ll!1o zz5K{Y>uz{cQsB$yB%3&_#(f*OM)`c9lQ7S3kWOKNW&Bp<4)bKS9e5tSNFeWAk5#k3 z)+4mD22nM!*TDw3ZOYEGHOoVgtcErCM`SZK56T$t*kg8?bv$Q4Ex;ZJkq-*Gq6{wN zyV~w#%{_tNlWAmXj&$mghJA;a`Z29hPW}u5_ei3Eqfxzxxh-WBXoRN&nLtsnA`26P zOcIWJ4qy9?e37v15a6MEp`6F@SIz#fg$E(&62w}D`S!4UJwN;qTfxRcSj^jGMB7|X~OsEka zh7vyBV!>R1^R1fwq%9SQb-vqiNUmpFH>EDUVtma?*j|3Njsa?H_ku-I5&mm+-Rf@G zF?J|9Qz4X>>M{1(No(+GoXqAam6aUwt71G+an>jmSvUA$e7@O76k^F+*E76m?JLer z=g7jadm~WHzU`=8#5>&^6egq{7JK~=2@Q4hg2clNbX~I`(9tZyp&7e1B;4^~qz`KZ z)MKa_KNEDH&Tsya7!t!qWSj|S=e1UpC$5hiiT93-d%D#x+$UJ?M_Gz*HiM_MnQuJk zX<{CZz2qyRj}L)qsX%WXS0ex7Z3bvWmCv0kT()K`M?(0Ds6fa=3R2P{mUQNKECcbq z_#}Uy&`aW2lm8_Kc!@}=#tsI{#X9;%Y^YQ)(lv`EbQ#h*cNYO!eSDeUL64P+^96eP z87_@YZ7?I4XzrQm6zw+*!1WCud=jpB-cSwY?9mbT*RX1XenUEei>yJP4bkyV`ZDe! z^gMPC?1m;VD)z2+C_p~_UQ9Zh)M z0&NY3Hc*UeJ1{t_it1i@15NH38*O{|_jIizGf)o+w_g{8-LQlb=53#qv#sZvJ#)-c$@y~jTrojkTs|l8knVA*q!{X%xDfam5NqbOW|pJFcG8D~vubH;P0hF|GtoGW@(Um7nUV1#qSvElVc1iDzcr9i1J~PG ztojvi)L>v`xv9PUiPiJf5hGPK=g3F$4tW|bZ*!g zFk^S#Q$seW<4@8To|E=Ol}`=r(VM&b4rl)$Hk6h94}tIYTk<1U20iBL5b){Oiz(V` z$KDDBxFWz>f7*4wY%VOV6Bg|DuctGql@U6P&kM>1>B51Tfy_-R#v|r>4TXsn)}lMW zm%Ubl^pWMg2M~T+fT4n83SOzYEKP&m!p=^UGQx$$)H1sniAv&eB8C4W1IKY`#)sg+Z7AoWvJFC7Ry|# zPfL+-rjdzK9P0t~Q+^8({TTm%t+6a-;_JZKk6n1Jpm@Uz@>|lh)gP_Y(`wuItDI`o z9ol>q3aaw*c-4iGtbivV02}=6-5!n$k6nqT;Z=DG{xywe);ngn))M+x}Gr9d;!J^)B^jO5ocusWbwURowJCuP`G?~%d+dq_c*S#yTvhz-ls)!EJ zC2OfU)zSL(UCoKF<4G3OV$LGM4tyrT^IG}W8^`HpYt;K8)(tHO-4kdj;bz8JA)^W7 zX>)D{ZVjHg9xKJ`r;{xoUZT7n3hHFVET8+^@vA;2z#} z_UYbu=+qF&#saE~*?wp9YhrA+Rw&jkD385#`{I+0n5{dN^P7oXKBuRp zwD$GmX4X5d4FyrF5IeZ~?Jc9`?cFk`$G9?%^~UQF>HW#)LwM<9TfNi6&vaQFQgjlf zvQ#I38t0&w&(6v1WmKsChv~-1@zHuszwJ zQjPV*{FrX^!SxBKhBB&O7gur9N+O9w`zpg4nau@ygWg11xqDYs(w<0rsrp6c_4PXbNyGLLc0$jJ zYd}7FxUFn(O-)Rue$~(fC1G0RTR3B8^W_5;LVzPm`WRMxD?r$d@6 zMMNVVZ@l=xYb*av8bYo37otW(GHPjqRK9^z}4Z>z{N;s0*n(H|O*4M2WTi-U}`M*YQIR z*Ku|;g~q}`v&=;Z4NRP!M0MF@v}z6urXAx=** zNB2J@tarS79Gu6oU5L&4aBEw>x{DQpqYh=M)>y*hAR^M(rW}eL&7JLaM4h&^{N<Ihbu|KtUrsbiL7!gYoSE1!t|{`)!;BP(SOsQvmt>X}=7zWFB7s7T|IfN3dLL%3tr z%(*|#6VVj}zT;UTOOa0G6W8~2Bz1~xlM;&M6(?HKbCxx@1>IK_i`68*^SX`8WCnVB zES_xY$!(9M5Q5?3WzQ;UyZAIbUhaE@z*BTvJcN!)NlqtI^u$+HEb7|`ca9S~U(jYy z_4=TNy;nLSQhU;-F{bK@uIooj9Kc~cL-*wZI=087OSghG;p#sUkqt5+b7<=8gtqp{eLh4iWCJPuNUR*qYCm)gP~(LzPN}r)z3fu1E*;J0wS>^3j4}Sa6td5Xd>d zJ)FlHTlVxezP-oNXXm{5@HYsi^uFAh9vfCvF}!QJ9mbC6p{e$Uenir+sc!ic0uAT5K3Iw3Tq!U2FX}Ht=a2m$4T)TtevuKh*P^qqzze*5b8~r7biIhuUxXYPjKDl6^Pf$F_?&q>)#Z@DADd+*SI(rSSs2@%vo_)l4%(A`L_FMU!`aFVGeqz(rn=u`& zBV~(uuIF} z5#lDHb{e6pJNk7iT%Z;O&ZT;#`YX3(fWn|K;+mfC&|jD$@1y-5Is1g4`m{w^Vq4sd z>Nn&tw0sk_5A`!oL@y?`Wql%(?x5qnd(@07dkYRWhz-SbopP_4$D>R%<8+lJ#$~2w|(nWrEha9qAuSrPU?9}zcJPSSU8KZFI^X% z?hrvVC8`?dWj(YpsaFQgDYYTmzApHkDz`h>MYwW?U6lc?5^rKn@E0Sh2K*o1s0{|E z(8LE;?OGiprZy|c6U2HMV^pe8Z~DGyL5J4$_n=MnXVeGuDpp;dpx;F4eiMn4e%i8@ z`!rN!dtc_D678pLbk4G0jDTYGTC^p8A-l`=g1si>43_$`16ue%Vz}(eddP-j&-#gQ zuk@H>+{k#dlq4pDYe%qGI2_Iu4dQji0CcGD3!&Jq>Pt41P}j|&gpVQiOz9-rRL|O-GW{9RTHgMU^d-B#P{^2Bo=&R9{MEnQiFE zSfFMhe$(P8WxeF^-tr*NYHJeGt~BVYp7+~W)vdSKKvWd_g^MY#29>x?2Rf5bUw+t^ z>U!@%)zc6rO1IWlve{#H#j3|y?@y4m)F4w$BsgyO9dU5Bn=`TuLVC^(_tXd}sTCHz zglIs4vNt_LK4-b^oaau-<&J+ z51#jFyt@`EGN9m4#gS>v)HT81ii3YVT>y7-a7OuRejFlrj+#}vZu-w^C<_f0y_B*r zssX(|{6vkVcqcz<>u|2Zum7(s}L>$F`C#(~Le!S=q=}H^| zw&XcjwYX%byUSIQG!jmlDl}qg(LTKCuAVYWh6Q zEhWsAm}5`Y4_cn7LJ%{*3aiSIM7@Vu<1SBFaOZY9&T$cBuD44rn4=zkTim#YcSRAZ zcY!uP+TRBjP2#*@s7V`es_D_H&wVdGrCn1X;2z$D#RVBgSl3oekQH6lj1g*}{CvAX z^}l^N^x%-mt77HedDVmVl)v-L9&}eI&nm-k6UOarJkH?c=WhlLHFSSAz1yoYWQT%M z?w@lS%tNoiF-gRxX+-+4D>*hwa_OR#U)=Jxk zzu>GIZ~(RdmrB=e6kuHoo>pq#{Et6D4aRi+N)3|w({HS&22^+Q=SYDgGzk{~^y51l zHZHwK9%Kt9E}KJG38anN&kB3~2g)PZbq-5eAbnt#8Sfxd2?gAL*yA<}nzr6V>o}fF zjoW%%puF)w≪2&*-V_H;8U=?5z*I9Aa8}ev5r;uKMDzy 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 diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/WifiProvisionScreenshotTestsKt/ScreenshotConnectedSuccess_Light_b29dc7a7_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/WifiProvisionScreenshotTestsKt/ScreenshotConnectedSuccess_Light_b29dc7a7_0.png index fe4b685507d879553d0556dfc9bb5bd4f60aa41f..c0c05a47e0b6cbcdfd2a0da2d53139769ab1d604 100644 GIT binary patch literal 115521 zcmeFZXIPWn)-H+-RHRr@K#C|TC{;kZsDRQDB7zi=CZU6bUS1JUkuK7U(nASFIw2}b zFDisU0s*B-LO_B60tC){@Lg-Y>zuRy?|tnrzjDcZo;l{2_qfLx_nh&$fu1JYLGFW0 zOiXOIZ{57Z#I*M+6VrhQ`kSi}QcXe8X zyWzx8U1WD+VryAh%_UI-Q)AmB(&t{7zB+kU>x{Z&WTgCThBW`og_(@bNO=dUwE=08 zORQu0w~vJMdnW1k(u@3-c2UlcSD8+7GEy}rF@ekPPl9Q|lxH`@SNM0nGM#1H#j^A5 zmeOwaoiA~|dwF-h2rTUf#)8kaABWv{zJz`fn%Mcm^j!1(uAOg3Vng@rd^yYaKQDqD z@qdtyZvI%W*_fFhNuT)=uWgUZlJ48?3bDcjTP5vdV(Q?6_Vd^DCY@m4zA#`v*A-+x zKS(QR&rvTJn>ErISh3M5o4L^=%C??fIKB{{^eT~BmFYb0_3MnZE1tP}$`E}A^UkJ@ zjfrU@9KwjNg6Diys$@vX+;6OoQQfq}@jJ(^qhGh`&hkm~(`?e^*NapU`~X#Zp^4YN z(pl?ze^8YR?r+m)q6_RqoS%isrL#*}v8TAbE**9fGk@?J8pi{{R%ZC^Jc{dMMfcmvmmLjmqf-V z164Mp_b`Q$qJg2IN0xqVaoBgq92^Lm*u8umts=r(q-R-*!v(@>zc>^8y6B@TEnugy z9FU>d(J;+Dfu^Xp!Q^<6{TKF8_eV7^O@B~+0?a~6L&hPC1Cqv5!K|qY{KsY~=RJ%H zKTA}*(_OtV)PNckh%YJ>Uk1I#L`Gkac|~vY@)oB|hbD&+`D<`$^`pq@?D-%tQ$iGE z9o+UaK5T}v%3PwR{LZX5G6hTKC=S{W{``FB&l5L4!v@v|Zo@fa=WQ{aTh*%! zfDAdJV;N~C+c>Ipzod}6UdX2(OR|f2Y0*ix+r@NCVrRrH%b>=hz*s-@(lwcTn(l5_ zE=p_PU6{mHF)^LxgqC~2i%zu|Xk?Aey*bw^UZAisLR@8H5@>;_;#S;cf@lv}w`(wz z_j}@qB*7>1PCIbar=vShN;+?f$n1|zjBwFRTd^oi)%Wj{8e8v|Lq}Yawae}5{dJ(E zcet3Gxt+AV!1&oey_lcz%I%AN9#T|KL)WY%27vMzKV;>@1qibY_Q}EbP507*l!hMj z*T2_EtLZEyJpN>y(Oj_3`{}tRt#r)ylTJoMXQ2FpzXoE)5S3RJuM#s9L$qn9fK4or zO_H^6hT!tIrXXx+lL4uQccG^?MLr~b1ie~X+`L>yvU#N)5&@ns)2`)cAAJ2(361S@LgbnT$h1Pr+R)4`qB zpNX}7ya_MhHqcZ*!E90GncZMTN0YP@MoTvPE}2%=<*>f)I#V1TYztQ83o*2Suq)Ab z;*z~1M_%rix66C05d(*pf3+-VCUnlm_tVt=TCpMPpHJn%@fQUH#`?JP46~SJvr*g# z3)O6h(xg|sQX)jpp!!jQIBSLZV-PXfV=5qwE@W-&Wn^I5!xePCrxyg*}v}7I^ERo9#b+V24Jw0 zYt*UJp^q&0ZJ3u?+5@*El{cd=-BfVJ`!73}Wx>b8-)N3p#|r;@v_#-XxQqmQE01nh zPoHujEZ|G+!qvHX@c{k^>)%t}NM*1$mmxb2I`>Aj!msg0AhPu(lf}khln?3isJq#E zcQ&LBl??IUq3mJ`{mBW1?6pF@aS8DuaxQZ#-FN1&>9ytWK|{g&e|$hM_7>fC>Xlyn z8I;Z;-{;v(SpfjJ0!7J%IK?`Q3>zWFc+dAh5Q@pBO>@uStXpN~K3_(%S5*2mb8B;T zrpFeI?}METgm~*%$869na+kY`Wf7s>dBpGyUd_Eq)eeK-P~Z=W5HqBJP5iaPAxu#w z^RPYRfz9|F%t*-3CvX;eB4gc?5e(0swZSS3O@dd#p;z9VUwd9M6V8bn^R0GFH7Xoq z|L8Tpc6`}C@h|u|3+*AgWoD|Fj64mT!Us9!%vshDS-Sf>?qAI3q*?dN9h@9~F8Zc# z>JiaHiS@&7CQiYfQC9-KBV@j?AvGvO`~EF2B->4g)t2f4jZ7lx-d-8EPCYEBeD?3e z-r)*} z3d!Q0V6J&cQG=--bTFjzdFwn`M>@Yjf_i2OszpNg&kqM_u{novOL{~j`NQRG=e4|@ zpWv$(OLxXZLSy1!fNBR_Bz4%}VUI@q-uk)6hF_eV2%cWup%ux4Z`IP{XDp|EkRW|= z@`~zUEOCvK9{7qL>UfJc%`m6t<(_AXxSNjV`s32o>?w)m6}dk!)+H zmzj;0STOe!K`5Nh%9W4HiDMTFnJa@k6*xE+$?J#tJp(`9i=CX-ob4`4=YTPonBJ>G zTX0>a={sKH97Qje`PEp5$oSHne%2=; zT|b$O{Pgrb#PCOVUYp&lBm<{!K_KUR;^%I{ z53)P2+;J*rGciwx&5U8zwDb(gwN&RhrsjQ#kr4N(oD1aXoyBGiIbSVhE)5RaoPG=w zPsjy@#GoY2iES4c;kUC?{mg(K<1iRTFRQVfr0&V9j4(ZIgi)E3*T%9kF?sIzm#^Hs z_)7l}shGJW`0+Zt0Lj(4Y*^<=8eU&=F0-8Jn%07e1H|l9wtgvqySaVd5XX z=Dt}}yUbpc4)}_Y_UY7f2+@|XOYX+KK7AZKE(6f}k4GPY+n7_!0soBO953>m|8#t3x|p4(m}4!9nG1uPhaQFcxi1F5#HrQa z$u=!R>VDO8IbZBOJC(_hCamNx?AuG&6P+@7+wH^AP*&pZGn;1Ajom5%^#_=Kcg-C zy%^Ci5^=_vzuXuzx$tpj8TTnqScrjUj3pSo)E5v2%LHrPDWn1w3_Wz&ZZV3MKN!Hy zZ?ZbgL^v({$V5g5HZzD1uo3)){i6n8rA%%R!>wI$SYnqsNz2`MzYnRmcC;;xN7j^g z(Dgh&C_0Q>)+!&2xI&iv(g0x?s-L}@TEd(gEaBd(KP)YGlQAUJ6BeLaR7;I_;~Xm6 z4*bW^8r73XFqBu(Lmm5k^rocOjrkG&Ezy8jUUVLQDc7>(J5mo+y-+d9ls*4f5x)!% zn*mKw&RXn38nXY(Ib>Ny^KVxxY!*Kv2!t&UL@z45sCp#xo8UmaQ!Vo7h`Nkd?v2$` zGenRE0<7oOih`STRrNCM-xz`*P=^fWp!c0QDea9$9!*uRoQa70CD`SD<7LJ>jT&_ z!Pv|Iy%L3Z%LE74`dW%oF@81I*|-4$cODdcp&Xz%FbXqJ6*I3dBRzfnJC&!rde*gA zWlhlfr3G;3t(}IDpS$*SG4q=S|CO(yW91xX-YE^={e8Dtmdz;>YPwL+{Kr1uS%x5- zGp&T#MFY8R0P{|5h(}s>e@Ch|APEmskR1P>SsVu#@J$1JW8@f&f2&-fck~vPG;kZK z-+&x>6#9>WD@=p2dRD#0H1%ofv{rQx?jjWHP|QQI4{-oYOziAv#j454gAM)Yz`@HH z@B8!XAVd2@$eH@NQsy=|F%VnMm?>6hMJ%`NS@z3rK)NI!T0>c&3u{FSND5x9*!)#q zteonPU!a`4wHtD^=i|9=r)AcD=i=f%Bl{#MitZ|fGS`XDvK`LjL0T?WhYWj1e~#L` zhL_xH;s~}r{fR=`H^FA}L z&{_e&g1xKq(L6Et7;dy8XwW5%gyH8{+|Gd_g?lGdJ0`~YLT8Y=$(_g+iCe$E<@Dad zTB>|Z=`vZoJt z*&?2e-4#n|Sn}~UJ7knCWa1`!I*$Zsx|*5-0Rp=1zjE2W9DN^DrO>tQDZf#vHU@imtj!; z_zi*WmvvVL3ZeIHlOhnxWo4ZB*)9r1S+jofl4@DJS_0|OzJR0{-LrRMn_Dv0=7fT12rRAiYHt5G_ zBb!%)W+MK>LHaAe04_2OMpM`QxVwp;?q6xiFYP!aOq;b{JNw2>`}S;jW61PVXjkJRm;0 zQ=n4KKkdX`!KPRhM5ko&s-Gsk^S?yr0!A-AQr2g zk;XvUk&&R~j{nL>_C35XmBx$pn~5k{jr&aU+Aze>_CpBi_*3#k#8~D3v*dA;JoXUS zo!ua~01HlDB^YVwnCFr}<39pz2Ir!1m=c?U|6YcwI(SfSAdMzrHm&kjQ{(tNR&yIcjszvy$a5DMsqouZRNde+S- z%osD|rh+707CsAQSDo|@iis0FNoH=SfQo#?yh>SZ@xqjEr$_Z_q?I(6 zvynI8q`#jWQyfpjr5`fhV}fCRXNf&AtOHU%Rr(LYZ$dYAGOP<%WG_uoDAGg-V zO8(ZqE+ii^-w5EL3c=&)P3Fy&37KcP?P4X3hgG3G(JuB3>M)=oAv;5+R>~r0un`O_ z(-7)vi|h%Qav*2l$G4s>qv+mw&=h^V24%2kZTjOm%#~_7S!h$xIHgF~UFfD_4~eM-xogY#IJDnOXLWpeGGJHr}V~kTGe)FO9KXiD-V)Rt~jpJKpRl=sVzW zIR+9Mlf}njv|L{?tMV%{Jkywz(iF*Txk7+K;hi=MfuaTg71LcNhwbh3`J=sI8>&UJ z2EI@LnIW=@VhlOi@Gl>estG^<`>=!Fzo2MQb1`5Zb7Zy?y%@Dqw+56Svdfo$&;b2&t0rP@X{~Ez+3h8Ig+J zz*g=jO|LV0YD!j(f!-;wx<5b^8_x@%FVwKjL~np_c}R+;t~D?^GvU}UVN=Sp4Bp(pEvk8j6I5THi7x-)+G zjSv_1fgHb^>}6@q1M+9Qr-to-df;x!LQZ)9$rWV2r#oHY?i8S4a{rpSG2}U1y`2FB z2|~a`Ms)}!C~GH&KyR#v-gqHSKcM$6&@Pm$3hPGdr|aP?A6$rtk0Yp+mcDjK0D*?C z{TT}BxC;D-V0$J4m6rANs~=-kuqQU}H$OyGt5Sk8V*Se^(wpiqFc$!-Kg!6ps@kw- zw$FU~XPv&4_98D&xsJYLgJ;iZ+ds)DsxQEU(D*6S*jt18NL@-E=nV^a3U>O~js&Uxcw`smEpq@9If^C7;a?B*wA?A9wzHnN) zTuK8N$-9GlAs^QeC#cJ3%gg;XpId29X%l)LLXP|$f?dB+aC<|NB(0G@X(FwA&dC*o zAkU6LJz<(*w5%|$;$7aa;2{!&p!*r(RSs6Co$mu3xNU^~Jr}r4EFzkXV6ulxSmoGm zrkutdzAwerv{5=u@7vU{qii3n`_pc>wyVIgNuE-1(TV5t^oBodRm|L`?APU zQz4ttcQpI8HEdrYR@0gTfivtyQQxN|1-?Z3{1&Or@i&o|hHPE&tjiUV=3c=waD3H^fEnkvcv zebnT$wdo@5F;nnK<>Q&y93B6`?I^CrqJCy@q_rcGu6=#}!pWYPkU3LL^wR0o*khc+ z$%2yOd!#~^o;6hUNd;BUpaa;pd}!Oi8Jq9g+f-SfsJTI#f?}L!{Xrf8PYP%`2V!q% ziXl}1%k78ua3V_STNRMRs)2YTjUf3CczrqJK#3}#w5LF4N+#UDO$5~y?&x)OBdUV> zKSY7;AZN;4K`h8q{&}VcP7rAuGd=%0K_p7g{Q9a5;f?@~l$fZHPyv1Z=a3k{5q$pV zARUTt@cG~EvO(z0bS1|EI%=B|Qc&Zzco@cajdpVfyaHbVm4J}R`7}S`-7!B}sTwB~ zsh?Jo>{g<1SoQe%zVw2{8rfLYt@FzzR@=lYZp6L}6+gqI8#K>_p5xM9ZMz4WRs{yi zEgY6t2(;eCtzUUwVcWCkol?wdxYJ}^6w(&PHqs<*gwywI#1<L>TQP}%;}V0uTQajASDGxCovM)0JV)%}p>FBVbBC^)4;1vl7}p;A)3}Rb z{vwy4)=Q|jA_#K)DH_qL2JM60`XMW#4%UXLhUW9B?dP-ZPD`aqIld;bgl^Kv za>ha9=5pm@u<7{I0DgeXU!~~mifo1nCVmLhR3s|~ZhCMzAR^E~!k&}XtNXszdoQ;* zj^>3cFzcq(KHlmRi(P99*s#|7-j=AZ>=wa(+KK%%(!e_p-?ULNH@w7J6QpqH5L9J8 z1=8mqXBULFils-7KD})A?xWx7do%!IeoK82`sUt$;7b6^)`F}lP$cLo`FFVD3}8CROhYV60f_0Rnh+`}%2dR0U4 zynL_1Jc%P}RG{lgL3c7rM%v+$#ALg^7xBWGZM5Sg!fWNXT@4#m$f=}*VD|d51!eS6 z*HV&=fyZXXa+*<7px{}WQoR*D^XP8;_$k~IOS=)Jq&cZUwr6-cEN=J}?m3w7#r}|2FSipG6 z`V%;zHgP@X+2dUa=G|>Cvz#qMa?45Cl%@7_Bj@%t9 zH+*pyOC=oJ_EPR;>gK{~2qL(qmfVvE5QA(#C+CQu3!L4I|Ld6r#+QcmG4@LyZN^Vq zNL_o^z2S}g@x*b2Dg>+J2T>h6l{|Glo5k>yPDc|d@VRABX&lGJ(8-75tMO*`QwGr%fBWh78u=U%fY5vViXXY*Im+4 zG;%Ex;dvZqbH}o!Z+W~?XN!^?t2o=z|$^GQ=nMhI90UX!pgui!?prmHyMee85EGa$E_ND zg{>JNXNa*GBVeBHKj&3Bv=3hSvN^f%$2MDf@I zx=9>+tzD3YxATH|{Ai|=rNMc`^3p73@K@mP))jS}B|Knhe7k*H7Kb7lPBXYA1Q@;b zgW1KghI@IbxBeO(#?!*BNmC<8Wz`o!d^bOcDkW;l%vTu>*UdhYMyq5B?Ae!EJWWfb z3gVXmAXW5@E2~4)`W~30_`3P?kxePbWO?4_#j9u+s=Xy96x&~PVH`i$s?d=Fn3OK ziI`UO6Nk=4ox@Kv)+dkZm-wsKo;qXA!do??mM(i5W?`MMZ+af#bvSZaz?qsl-%|fJ zFhI-rgt(>S)_4AG^`O@kn**w!boX|wbM?>+M>wnu<}Uyyw&Q*fw< zEW94d!c?~{f*a1nTjSy_308qrC^JubxAJpK$Cr4ZyjwFM% zRpn%laU}m95#x8Lx*Neb<*ctlYd$6GTq=F^1~E>c{pSo#Yc|=zul2@w%Z(nlkd3GK zKH=EMBNT^8Z{^?L8g*G5PCv=j)RP||=d=6iXxJBZoGC*1r3ad9?rro~%ogn%|NPJr z6T`1)gIE~OzFQ#ovU9afY_ZXwUJE~;d6hpgR;6p}-iy)!X@`}Evnlnl`kAT$*i;K) zr(+C^s!D!s=TlILfNOvtk2YGzC`?=sw<^Rxj^>erCH3bSPI4HZE_cWdI9FI)M8)6s z3wnzV5}{9z5c`B#Rq%x8f&50N6dso%jXF@+Dtxnr3M^$;$(1Sv;NCsKOXZvy**@7u`!W=1K^m{ikXILzx6|6r<6J;M3URjOda0i7oMN7 zjZiLERbG18;60gzmpzIiztQCz@A&PnmAv^jlVbR+(x$M8()QVuXX8OV6CE>j7R zAhqXnd8_b;2(*O)Rf}N7SYL&2JO+692Gutp+-8dQ#OO#L+1wP#oTD6(vKv~Aep4#4 zC=+BE%;>tCy?F=jHk*+1K`dJobh>> zf%^(migwAX0Kw0%hHy>#GmaQCLkK?7=incf@Vj^M;|Hp2x{h0rC#Y`n!=NJ3Qm)64 zg;#29)OCQ?dEN?1o$Cng0KtX%v4)oP?9?r`$kw)0b4af98#C`Ddr+zx;x0BIEXvJ^ z4-VgbU+He$fG3`dYQ0OOYq%t`%Ewr;>UF)Fbf&e@l=f>E{1ux$yBOuzz7m976gzcc zpI^qOq`Br}Qe#A7TNIA=rI?Bc_M<-8P}xJkjHU-^bA zgfgA#fhof`N89_5E}nuLqJ*?708w*Lh5Zu8<~6u0QfE&s;qi2%rTQW%`dL{y$8Mlu#PaW~?-9IMt@j^ty!SK(5{N^_UNan+vMym7|o(1_u|M5zqVWt!XL_k=Q9(Uq*A?S~PjAH(PN9(xy`}jc{>JM!H5`%|QV-f_rR{Ofy^<^t~QI+h0gYy(~>d=9vW-F-&Rb=npw1#U*bv2K^TDqLK zRa0$p7CtZ9%s<^pW4`<{^v1_y0r!)$HJPO7zgqQ;$KE0+8pu-7g;}+eQfO;|(jfkG zspYP#glQkO?>e>x5f&Jyt4EON}Wo2&nRkEqH*QqN&%@&04^4JDIF7;H%UI&f^@0loyRft?l8oM;ld;>kle|AO zl=k2Fwuc>6_qgLyq51f|c-B)D!!Gqxhfg#GDu4u7>!Mg(6`U#WeH%;eqDlV4Q1!#^ zpXe!9oCnQagg!QlffD*pn*r!C;Ju(+^a|oFDED9^IgQ@rG7?vV4kc+e5q%6$9Jq(Q;c#u87u|1CS5_+DRK-LAVQMnkA0}~Dd17tE26LBzh%qer6%$Xc z!NH3WPn$Qvi#T8VY0A-x)(2b<<*in;Pb;5k->s)K^=CIs;JL`(@V#joE1_F zw!2Ve2tRQ;Gw*#2v8>kX__9p?ZFvrA(p0F>K*Tj5>j6gKkR_uYI8CD{TtSXln zV)polZ$M7#c;{Yf>D3UvQ6VQ!{03eX*GGbhLtC zC*3JG@oPO?52y*cN#d{aGFa#&A{qt9)p)fB!&LO7*d&^nRq1iK89b$arq=@5MQARM z{LId2?m@B2z(jeVgGWBHLr9-$dX(%P?x)-Rm;nTKNV@z}H?d!pV!PS+c&@ywkXr`+ z7GLlMs@d0*`am-|So_wlJJxu_xT+%!9UV9MW7S@69Bj+G?TQmf)-$(f)l`@{_{#9! zE~6C|NwJAlRfm!NVwhPEF_D;TBTBt(juS`)793Hh1?qp`|0as6@Y4{ceJ^KSj^Wkg zf3X*A)Supv93f8%y-^TFaA~Z%yg39!nHt?Uos;Jgm~Tt|>iA6orzi zktrVc4*1#%LafPI@Z6kIhi1WtYkqVE;FRW}H}P`kl$y80M6yvjtad9D#hXe0OFQ-f z5RH@|0}cM&cY|sYctx2jlahQl^}Ds3(W8dFd&E$jaSL3hsEmX&mV=QDZA?}y=t88c`)%-7f@p}PQ z(A8LOvBbW`_*Y*D6^*ps@nowNL&zP>KfPPcZduB?&UFY35-okv!bbLp4)IY0J!E5g zvXAUQp+X+{MC1CBm&u}LXBMa5qKTkiof~aPCsoIp+{D|p#?2+=RK0#~L7eeczJv&! zc=7*=pM<%uHBnsUCDeb0bBxqPT=5)+K{<-lHK|Q+09shFi+O8Av<&D+V@Br^xnP*) zj_ZiI-K?l~;}e(em3O_!2^#^9(dn-kZ=qj#0M*2q#N!DKRb|OX&Y^!{JR#ZH^vWc$XtDX>N3b^<=$bcDbJt|2_}2`znHq9AJ#)oz6@HZzV@5LL7qWCVuZ>5 z7s~eXI_O);s?z7gjqjI-vvy-;Et}UFQ%3zIRUY4IP6%+3A_If*BEO-}W^bA^7(8x6 zFmHOi+k3&YfmLNaInR)r(e&g5NIRJ| zSLU}Gq2$MIoRwcorV70b&DBm`fZsRylJ1snqH32tVrOw%iQ@^>a<0ED2hw2NzU#OnAnZ0n4}Jw#iiPSk`N>ykNuoCGyatji{I{t5|C8c=Ojl9e${_K zAo7%Z$NL>|JKA`M+U?H7dJlWoPhCEXpx2+g@+gmlikr<>^jRp_GPe{DnErMdC{31f z#4|V`nnh4tEE?GPs+SZr@$cq}x*8!+2v(mCUS8aOqf#iET=4;=)8D1a=;;PdbkMWV z+DNk%bkjX3lmf}&M-%Wg)>Nz@3SL`xyB*XOkxXiz8vcfElE{l4U=UwFTWYJQqP}^VFH?0o#Tbp*I#V2uC zGNt8U>UBtcSE6JSyw{Fvycf(`>vzDeTwl*zB%iR$WI>s{=_cTpp^zD2$;Atutwn@CJ0~i7WB?;Mao&3jfk4fJJiA zRl!d!e30$@+ldXn-y89=T&b2}=P{47!D)%hqzQ>E82}XiEtO{`RzaFHTvX3|Mct}s zY3Pj;Q`L1o(;JrpvQ@xc@bVW&XJK^X+sYhI;;cOF3=KED8ZG_lx?aov`FOEsI_)=^ zy^7toJ2i#`E6DB)5)LER9+P#KFa_@~zcCZS7{DO?Ei_{@?ht(cwW!6vYncWqWxe?R z;HYKER5_nwQesKlGHPGT>rM_)@#eJ%q%^4e{=K9O{r4U~5R{e~EOAZNIo&^N!hPz2 z9|JCID_E2B{rTn@9I__M?+j~h=e74@i<$*IBgRxSQ`N9r;?UmK_x*O7;IarPcJYjN zr0h*yaY?Q_2f9>|0UM#~!N-#pbI_Um)Yto(h{kF|;qi4s!?gOTr35dB@*=0m1HvxAIHvP)?vDP^sSV4dc(75c{8-@;D5d<({5{jqH(-l0(vg_1IK7&%tY4 zMErF07R2W%-yk);d6Rk{8S_tN#9mM?z;cQ!4N6=OborcJX8{fSmrlY_0>g92hw zT7n`|pgaI3Prc*nmVWz4e^}t5lN0FBEbW4v)p>dFyV0ulQ)la)*gD>CgNm?klIMuX zA$}Dx@+()tSd-4+s*MCul*zfm1S__8e@ycm2GAGpH!#x|7R1>|GjI-GFf0 z+7QusDB0O5Xym_yqK;_8a!lLWcZZp0n~j&l8rIo}{cEhR%0MstSN4J0&W|q;jAGjd zBB-RAI@UAup*NVXr&^v))9OQUS@{oKfp7j*-7n4fk)_2KUqR?q|JD~47|ktXND~*S z!hH0#4EgY68tE!76@=Ey)aX-L_1D%?plYMXT*V+RKfw8eh%xqHh_%tz&qZkwyzPWy zmGCs*=VVEF&#TM1_J)wQ@~?)XRXFN-m-r3q(u?2Kv+C*yY*C|AbhKml&6TjyO6$7G z1QTXFVK0=wY~$j{#t$G}{S3+^Qg}{je{0VvR%6vxVY0t5uWBKlU8|tg!R+LfqU_Dz zT&EmDY=I8>2WTTd)}g*nyM+r8G@_H10(xN}ZQI)G6oedQtdA{jXLz&?Zv|<>_?e9L z|JD=Pqk3+hlygNcI(!dHldx_i-B7XR6h_gTKxTxCT4e{5lzUaYMLb(Tx_bKb3Uw{a z!ok4POEk)a`802y);B*+X1|`BM1=>didI#3dver-f-r6JTvbHP0^FDN;~M+_ZQYLG z4mv^p;I-#S#iJt_#OV=m9^}mM_qp()@F@>!|lTSij4e zN;NkpP89$U1V9Xhj;E`ORG1x|OuscScopewZIRt-)g zg&0%~#bm3ihQ&?XWY*aJ-5*=L;&rZCcFJU4f^UurGQC?2^&58a zjbCiG&=dm>Je#MpYX90C$kMd-nuxQ`RI@MX{}7@2K7$j_&W46~oNCu@dvNIM9h_7{ zxNySn{`2OK`X|m;Z)81hR=<8ix|+c2!Xb)i%>y3h0}pM6OfD zUE*J@*)D|xQ9^9j_0f%FUGtqZ*SV@T^r3=KvybhnIZ!03ZdH`pB`l10JT|M{>`2}9 z5GNGdjRX`f*%CpGaZ ze36-*cR^{9@l`WBZKjtXk2w)@N_oWefecbjO*S9FH;QI_NezbtO=+XI0jn*2*RFkx zC8E1BR1`q4meNiE{y@M_^wcVZFIc|YTBa|o|wt@nRvR)HR zIU#M^anb?PLAY&epA;B!ZZvVRHn5%I^5g|sa-?QC)GIT=DbyS@C7C6TnV)Q?XvAo~ z+1Mjs3JNLc^FKFMfY<|l{&%~v@_&;>Q{UTYTGEc+O8Lu7!4a1l&6C^~6eF)?W{wI7 zl-mVeAeBns8F}$y*?yatJM+6Zs*f$tLRg1mA;?WE3**W@uV^2`CqKQpy^%Ct?CIeF zZssh1%68iPS=}Fil)`?f5v|kx{M?JwuN|L}nD5@hdb{tkeEYnrxNx7Jn+JMfY3yYz z=@+AzJ^RhE!|rE4A(MD?n>bYIhTxKP3Zag#$g_bo7GRLHUZ9s*(v{CDbV2a{rQ$D2f?j<9k-(moab^LiPnH5BvJ)^`37 z*Otwy>{C*-Dkbjj$Y zM$oIZoRYSGaWrt4z+4$bwp{kZS?UFVL%6qaeQ@Px1hnu&qYX3z7b_hP^jD67X20&> z%|Oou6-dZ3(mHuFT(d7$fV~vGc%APkoeq5ci^*$H&WpI*$ zTNZEme&}QMzSGqX;^kFi?;MwnPl+eQ6}oPifzCrmcySQEHd*VbQpmbZ9pU(v?HKFI zR7D93#QV=Q;4bba3He$O=Ws^58s%i^0-@w^4s;H5bc8Zg2cg$YU4mc)><5|Vgj;@xN!Y;dk zJX5j=?a)aHa{$J}L#j-d?*}=HSv41vd~QFYC;uVAEOGT3V@>%7O z&bW7`JTQ%?mHf6tABz*YjK^xh3fD(WGOUbVENOq}e8DxDMGX2(dtYD_6SR2`= zW4qF>jcP68Xx+JQW8^o>aJ?nb0# zDYGC=`J}op;T&Mol1CMFJnX?e83$Q6;@qIu>dFl-`Zrzh^NqQIS;g6GbT+u4lS>kN zSLF74GPJl6meeJHQgAU_9=djDk=7-2~&X#roei8j*k)+RCEDxZnR!6~8S}?3@&?S7c6$s$o z3!8Q6#>u6V50Wc8{ZbL3i%U9rE^EJ*V6}-K>MS(&j&XpCUsr12GRUg3(&N_2-G!Iw zn&5vC@SOF?8Ke;1h~)xKUbluHplSrIN#DbcBb`MK@DY8Dj;T zd{}^JF!n6(SeGa!bcS9?HkC1av97_tWF!)H;l1`CPI-6C{ExtX*#6+f8mMJGQUohu zhqZhW($q7s`xYOrWmK1Fr9I7M+Qf@Y4&2@q=lHgmz)C+pE_U9&r-=L6CChhONtKk5 zpnKTG1gl>ZYAuIZEvhOSC$dSOXK8S}mHG8d7(CVVL2`Fp*+8Lq@%w8-trgwjWu?xx zNwU*;0VkW`>2L8~-=|GV$~j)S*r)ClSjoK@%;z>o@VWJ2)lk@Q{HIW`mLuoByrVSl z*ifOStK(kBuYU=+Yz%(5a^UflJ9c(qi;7FG64SZx+$FP77wK%W^=JZ~e1mqhO_hmS ze-nPXswmGwV}9JHR7>7(uvN^4M-f4ao#v5qf!P_J_p6SuP)XYRxH$Iqpxdx{lE-ut z|5SCJt9X9}-p-u}@%D3~1KmFYOEKH&UZKlWchmI~QmH7lc6296OrrPEGqT$fiow}xA zYyc&zHg`3}f^LiE(u2btaWP2Ufm8>iC5q(io(&buVz z%)8#gQ~53@*a(H0r78;&N-fcyyvm*;g^$Nh04J?TC-)NFO1k#X)m=)Md!4AMI4@PZ z-A@b(>D8U4w`?meG?L2|ee7u@Y#~l(d_g*>|94M=SHY|vi>Lb@;VYdfkFN71;)l=L zyq|h`z~#w@vx(6zPh8y3jO?9cVs<{nJj;8ajI96FznM06Cn+z1bTNsj+I(WIxU4Ke zD<40OLVV#pX6>izOO}Nv9J%<0gLwalpHt)9Z zXlQ5NkjKYN(wOgLxE~6-)&8LSX@Pz=&&3k!^R+snh^i^2qhf{mod#9`l-{uD``4o|LV9v_4c~%8@Lyf;mn7-&?&(r{ zlKb{bRAp8|gcV$uxhTEy@_G0xUay{s4&7^3#`ndZbL(m442w;R>9!Sxio3*B{+>J@ zPpMHVxO}vo*z@W_h28ZPO}(*SG#|#VM+*r`8?m`b=SLeqcE0#coacDwl+9rF?e;HT z%2|p=h(*Ln&E}Rjw|xCou_*Lh*}*TEX})x%H!EeE-k+@51;2k^xY+XCMlKfS4 z6dm-mZ)-q3y5Yfmtst6(!TfYuhU3NMMBCB&1Mxw{Z``_{q4mBAcN{-y_4w;_{HjB7 zclDD;O)jG98BNXei`r|cPWcymjgHCP_WD^%SkMjHy1s7ie5d~#S&MtbWx&9_@IW}l zEmvFgpgH1mO@1J5l<}#o>x<4Qmt(gBdI?Ty80+-_Q{43tT+sQ20FShq>TIXYSO$&T5w63*Add$_n{CPX|zF7C2JFF^eMU}i| zO+nJ|n-?Y>$(8FuAKtVPGJT?#iPb+fdtI|%>$<<>S$!nL>be?#^8gn%m&r`q1&^D& z(2!qvaRvRUa`sX`M`%_{qxY5j(qk+8zZ?ag&pR$LS_Lm6rFm_?epR2SE#4%2r*=fD zmXgI1(3=&qbBI`CfmqZr- zf7pA^s3yCvVUSx8C0Z}>xRJwqO1w@+CTPV^A0R;p>0g)yk9Ymx=S}37N z5s+S_lhAueXdy}{a}xAktxcuwkxR8e6h;^hRuU)+pZtPcN_SbxV{VZb!WU_lX z!AjjJx?d%-WU#9G91ew_yjO5UV51WM11_Q-PaA&Om&3-*E>UoWn9Z(SQkt;XD4NQ~ zEp=J*uNQ{`R$pgllaR2&L-#!n-H1^iU47_r)5G4_dg#mPI<$wv(8B4bwL9sYk-FN6 z&@V$F)T(2Jf%O=6uOaGSlzm*XJAc|{T&-O1dEHEGIl9bxC{z|-fAMhm;^>`X^JXEv z&t2jjZ_mOy*LSEE5}cQ%T)O5R+5$JD>xE?9?ROYVuWf&3CAB8OJ70#?F48o@Lx=1? z1)%bBba%fXP$Q62wqoU@cJU9$yisF5>7NxTlR$XYq7f$V!MQ^JvZq_JOdc+2&#a?3 zvURs-%}rx^vH*pPsFKvVr!%h36MObmitD;Qn7o7_-?5pzZOroZZh42Qwa$smx;^>& z?1tFn%F0;|?MGXkgzvoz@bcli7hwoTg1%O~92$n-Hr{ul=cIEepQLwmyQFit@*!F| z1to{YxAioi43}dbU|cnDs6aXI_w^Z+HCw1b;_a)2Av~Nut-~01z7+2}(?q4_&*Q=6 z$tRE=PZ)%n?Z*?}u`34CJIeiim&u**r4ZuuKxHr@Uqqw~S3(u%TKUA1zHeyY*J6$6C*Cj|z! zi{eK)y%$1MoXRZvI-BU)Iuj#bYB>dNaxo6F>xNx}?0%V5rv0QYQpEsc41=|PbRI%} zu;|iH=A?p752QW4hSXFW3?F@e{+XqZ*~8`qUboFNmwY;mGK>^j+zooJvJ)XWqEFk( z!CdMYx!gC0!S5h7KcV3v$(blR5iJJ$wvy#<>IfB#6-qk}tCZ(hvzDyKYo5X#;{EN@ zXtB_!I?KJM<8in|XN{pHj8&9O@8>iGETe`ACo$awnS$d9`1#}{miQl9Q^_}$y`7_S z)yHK)&XSRfVCz6*z#E;FmhB}j_Tl1{+=)lk(%AQ2JeAQ>CEB`)N9HX)pyb~9nv@*x zWp%7tju{+d-ZpY=L*C{e!ACLBsW&K=Jc~5YC5DS_JX?6|R(AguR{>L)FV{-clJ20_ zIfrT+1~!W_9qtwJ@esQ->~akwu{tj_!CdS?Ru|W62dGQd?p{g8E2QrAB&nm(0o1DB z7TY8iGOu%)d|l1S@jW?qvfRObc_7oEQ{CtaTBd)uVwlN55=JuHTy0>iewMa(+sV*p z?bF9x*_qRE6V`4~{SsRt?-z2ig_aYfobP2;HPw$?i-lO_V-mBv1|%#Kju6xNte@)d zei4i`ZyU;LjlF`A?a7rDC`f+QNSFA9asKiXq=n(i2O9Ccu`UgWOTv*;E7-OyKJBOM z#}BP6uM}ytYbE^Hae;p0DC0FKwlMS#or^uSD6p4{=oH>TB?Q4%ZWn(ySI+Go@;dQY ze6t@_FXTr=f7c#sG+xe7Y34ic#_86ULn;xPe#S~j$o^h~YwhhWM!y&D9F29hIb;FP zu3u+qOMc*|KQEkHJ|34gPw(gr%Ao73Bl!8%Sr{@yXwj*&pE78^@wOXnZ44?UBHy5c zNxnZCt}a%+=FKeC&Px=EOL}Qwl|ZdJOwlXNMkgvG#8BscxHK7`=wJ}GFd-(D<1H){ z5bg|Y%D$3W*e zC#wY1*Kut{8nR5g)3yrPVi5m?_^XqPYVZVQOl+Z8nOd>>cuvjo8&-{}8!c=xwJ5D;q5hd$Ash2YLmWpEda)6y9sQ z#VYWd+9RZhW3RbPZiyR?aXxeFxDP7bUz?>YA-#{!6fvgAlk9gIUjg)5OXQ`qOVmaF zsO~DF`=%>7@|MMAQesQ>ayZ1Q!yk&SI;&ydEn+2nG+&J|_S>!`)$(7|;$f@J!$7XA9*?zIRbH=DGKwElL)_30X`|yH;Yc`J-cnkkJ$`#8?zHH1aDkuY?XV+I{D7%(tRCud&QZi)2(D z7XP}^bM%@smimYD3pL~0aws>!5QnyMEF)ShN^q$hO|lpI_%WXV_WXz$=BlUU9Yo;d*T2L~c;y#4b)m@r(Sax;$O~3U8x1aD~TG!3pXIgSE zjau4#9m@7lSMUT#Rr3~EX-%B?qKy)74gw}@(x(U7e_;V`tX9-u_O`Fe&F+-Gi6>RA zgj}!Yo#jm2MECs*kP1g0 zoXvw_+VJda)EvhSLW3eWyA%GH9vAD++}MX>lZnn27}?R^?vf4GWVK2dqA;^T3~Lg|rmg#T5bgymWi7 zq|cpp7$A#V%A1KcoWqol`-Fg6kwv18V}z4I$1_J0$8SlEYHi6QgD-`DEHm*hjjFsdt(t@CxC3yai=} zfS2bBuvurBu*)m_q%n&~BJmsVUnYrbL3$sV-ChnJzu>){OG-{W(|eVx45v#=ucIyD z!P>*=D9Bdaa=Td9vr9`4cV|&RP^k~b=9it7{b+2|-7q+o z)ryS@dh4q;_EZ;9TSK%7g?tp#*c*oS-V=$>t3HCQS?84+%g&Wy+H$kWj(ozGuf@0^ zVaB(YD4Ow$JHy8Mk`kRp;rHab2@V9C3dr~!*=a*Of!l_4yRudy(UJSLC6QTDG&4pL zyL?->(k;vDQ1Zt#D?f$a&e}+o>`tS{UVbLMM|Fgca4kJ^fVq~wawJzhlRxe+gWU|D%wlPb*fT?R1>Es$txwZ<~7p~g%;=n)*BJNNU9;L zjuM%pt|CBnsI)z(Fi{aVw2!y^(d|}Ni(MBrj@QLT+#3sw=9bzPsf!dN23l((eai<5 zFk@R`hGuy5Zjf2hLj;LBfB5G^BfqE8l5hK!3MR)1jYAGh&B?)*3W4}elQROj6EYgw zFRqYon>P3HL2@2Uq-CGWH*_oYGaAwF>1#*yzKMPBx@@<#+kSg6Ecr1?vE&xZh-sTu zDSWvsQbv3{SSX4cs%Y|^g@oC#MZQU^v2)Nz^}dvy_AT}{v|;hyB4+gW6<(2X!}Ye3 zNbh)GJ+tv;f%~n9W=8VXT|7P_hIk%(x6G})#5B>jY$~X=v<xbop!g34R{fEl29e9<&l5niHW>$hDoUW4T-T{3X@jdA^T5(eEG*p`&Dw8~-~F(Oi-^(H%F4 zmS1_7EqsJ^aw}nz-vM)ofvq}a;%_$(I$~}=`=+D^gA(D*m(lVXF*<&NuzK;xtq*zg zH?{Ae*J(JtAAHU_wt*E4mz~s$oo>H1{R@5L=TF82KaP$C%%pHq_Jx*Mfzad&C>MxY zuX%!gxlw6xyAhDOc&$Uy_JMjI`Eg$kdnhC@@$8_2#6Hro^ong_@v6y_ht*}gaJ@hd z1F~R%=$ADViDl;LYhS~&S!g;vN*L1?RCseU zKOfic&f1nVYoZZV5oS*~uSN=pnwML!2_nthqcamU@sxd^~)S0_~iRb(n9IU&l z6O3vaDm%IFq4Xr7u6^5TPucEYy_Hi)O*YtduDTvHExj!7=GG{FndApKQaC%kaGk!aXZ`u(`l~x0u@h2w zuP-lP#k7c9UPK-i-%0tjXfLgT4fnYFFds2-U}x!MEIXO>X}MZ9 zT3P#Kp9F~CMCNdCBQMil~<2X04taWXlmGynTh}7ikG7>yM3(L8w*goP9V8I7=qCYg)2+-OTwaA1sTUJ?WKFP>fx2= z!_V5Qj1HYWqvqu5;jcKBb`BTl<=t!7*3=_+8b=x&qo3TjvKg8K(Uhy@gQW`ssX}^< zHD_ijrW-7NEV$0+ut&&mYnrDdSl`hOfL2Id&WO zjjiL#4x_tX;Ftg|Ty+be6f`^icT?ql$Zuu>G>_p9Kz=15TT z+%4y}#pI+11GAlUmmZ(~8oM}CVaJ2VYm8jD4W!vKn^;&`n^@UxC+p6nFL}NZ9`>*I ztKF-2w`d~a);_gDQNjNWUuA?i=kYd0TB)+V5|<|rcQ>r{%1S8V-pI227~Owh?Uj*( z?ld|PUMRjc{EbN!C5?Ritk>xC-FLp4N~D4IH3zQ)^JTPOCR!};VmLg3`5sZjKtf%1 zelk)uIn*9Dm&^$P-jtik_MUZTU_(di5ti{>(GsLj&*ttkgrLs!`Z8qvqQO8`;G120 zSBC_&;LLPHEDZ@;=D}7ax3k(9I~sC`d2~T-)Ja1T!ai0hQngU@@n&~0rw>-^>(G*M zM)s_Om$;h2ku$fKtdG#e3|@U9Hh(*ck2gQ4=d!xhunWe1U&gmAuj%FJwE~{k3Mc59 zoit5;aYb$DmT6!t5wzh zUUX3K0F}Y6>0t+Q>TMB%bZ3lMRJpyB$VJG_w`glzeA$)3j_y4ODh&V|`j0OsaJepx zj~my=-gD~7*!sOTd4plkDd11otmTq}c)Xu<9cFBXVe@ztYE3G^{{pci@8-Pc znhpG7+QCLbw^B;CVD%x{s>q(cVnmJMe1A$DrWRUmXXy=dyw}BH6z8B_ayJ(i#!@e_ zmfB@Nq+)Hn{5=zvC7Y+}V!*F%z8q$D_-2oE$?W6rz1@B9HygsGgzp*GWyK1*MrfxL z)&y_KBwX{V)U)~&HD3^4RV!i>z>i9JVg2pzB*p3ie0mMv?!K{l% zC3-$x^m2AN{waGv@f75=KrTslB-uE>obXZI>A%fI?_K6HUm+8FKc=b8db0ks`5n0^ zEh<^=T{wu`dTZ*?()ZXNcNhfvb9J)Z2$ElluxrN@S(tbc^tWGp3479WWyki@r@y9z zP0j^Vs}lL7&iGW4nDWP-wuzf{6)w<52@PtZ=5NlTS4wXw-7{;$2?}_Z)*HyCPX0Ua#u4KceR4Ghuuml)a7*M0z7 zBE%y@BYn7humFSYk23$B-et;K;k=n)S=`DkRjE*SQI#FSzs|AA-5qN)d)`Vw_B%^v zDU4&Y!7}AMZ-@9(VoWT{MP<#{VS32J-Y8iTCZR{}giTy{v1?avU>vej_s6UDguCBO zM{vLFq|Jt_|s+0bQO56iU*slhfcy-={z|)2;tVN6IZAC@Ah6j zLE5~o4%F*AKvVku{7GhzQe-p3eBez*mWJ@?_fGo-qWef=u+9&&nXDq2VFwW?Z*R+2 zfC9wW|3*yUZ^OJkX`=V`)X%ypwesrL9q`)qVvHAJ4w-XDZ%6w9{5;(u! z;a<2mI6PcDzJ>(iN%{vJW`Mc3n+menAEvBOgR|q7`W!j&CB<=IZGWossIWfkkTQrK zYL3Z>Io=qXad$Uy-ki~SG2arYC(fd)p6+|!lg*^>qK>0Li+l2tH4$==doocrceQJOpwo9rzv+6#>p8t;fi9__!gW_<`o z#m&6O&BZi%K3sSZ)m(|-<9RC7;gyb04PqEhJARRHOo!p~8+U`?QZs~oxsiK^x zpEx8R$KHPt$dX=J&?~Rym=)J$w9uzrbMm8hVxQWh#iv33vDbV#-JrP+@Ik`v{dFTn znO6HT)J>&iYSmBe61OEUALNASAjkUf&kNx28ge%6$FeBmn!+in#mEUzig%+HNP4ib z7%kYxjA|3uk&$kJHq#PBM{@V#~|AwkhmARMGq;i}%155Bp zDVg)$xYZ{+KSSyg9wt^5QBj#I`-6?z!1aKGG61l>q89~n@a-&ReBfD(>i;#` zFC?5=)$9NKF)h+@SHg22{S98T{mf{_jpz8Ey#MOY>8>MSi;Yj~yNM7-5U>SD_pcAu@q+X#D>Ef?cL z)6$I*$-1gCCTeX3NQLOl<#);{%E*qWiEhFqP8$gwUWoyeGfXD43oq!5nTPgFzxDnt)hFtX%d z+4WR5CpFM;j1xx+o0F#c9R;Mut!n>*k7|0(*dX2zdZPy~;h&OK#I;xkJ`aqv@Oh^p z&T6w`?Cy=ub#P*sBllhGmO6IchqOWz-z%8u{fmbEwAV_k0nVlpnoHdb^!yP&DeO>- zgvZz#69Phrf;EW0+AN_Bl|F8^$p?8)8+9r2zQooamoY7y$f zBr(h%#C~2u;J&DaWEme#@Zd6MJUpMIaBaO(mRr%X!<+A(akUUu-cUmS;?k^XTSd5> z_g$0WG{s;T0wuO%v45DJxFu>o^lAc!;D&Z!+9%`W=PbE>B z1tb4@{Rt76h2rf`Hd|wQo`kWYZ8_I)sJ>qB zd|uksQ; z{?YGX$H>Ow?XoV=lQ}4my(=(O{uHIhL`7wN>Nf@-He62Nk-WuZ_&42`INzNLJ(UN8 zH)%MTa}+vkSsWrxY2k7(N04vYj_!a=sy2jRYMz+c|3FNR?}|(BcUW)_e_@muB1kq< zx!K<2)Z$KgRGjVJae{E+Y@VAPQi+$QU)mw|?w6Ee-oK!3ccPF$3CVQ1FSOJ0C1X7O zkYI!0Zh5kNUsc?+#4fBD~cVbsi6h4J@^IXN_a<7_~|X z^V>I7nAg!m;?72uK;KVvuSS8qW<-@ch-p?|6b8Cb>NiIW3aS{*$AoMEX{d}$l->|R zydjs$L_W*sojWPCy&Bcx&N64(R=&&Pm*uhLr)8OenRjqd2(xY<@%IVwTIuKRX6j|R=Ft1}Ss31VBt+IrrjfG(!~2(`YW zHOTooP*}Cv`U>^A>1)QFO=InJbwTuYscopxG{_f~Z**2`WZAX^Cy{P3It3v>Ef_Sc zHb+wZXW8y4x%x!E#w0%wR^_HMJFPXx5(~kV->)7t=-F#n(Uw~~i6`8}bV)mmwh43g zy%+1>9rdMQJ9kBYC%#Mw>_C0)4_iSe5_#(ifyn04=tP=rK9uw(pg<}B<74JnbnBe( zBNi{CD2pIO_1^X=h-h@T)WX}0?Y)Ahf;b7>4r@YgBkp?U#xxG4Kg?})a#&U`BzCnF z5lk8TWu4hQgOcN##nLx`!WSiLs<&T{B5V$ii_wPDEhD{NI2q^1rgtPx+%2k4nsKQQ z%qAHd{Q5RhQ=9unR(i>85IsN~St%Q5%IPByG-L=KB*yj)-nGR1w5`N6LN=#NjWR-R zXGI^-L*ak+0G0;AZaNuv#G0RFUC7pQYT=2)CecjqY=|t9P^i{co;YLnVatI$k8NX8 z!({W;E*hjNO0K<*2Kl-Iy(5SlvnsVO{l zYdae-J@1~k2`dJE@9&!pd2x~U%0kI6=g$ z)yi@Q|IKtS$@-NO4D9zvbLPeN<~nOdJvx0HS(npa3rAEr z(m5Aeyc^1LP3(9PN$E>tv=Wgk`C67am;aa9GBA)?NAUMUWr)it$> zW=`0E;Qc^%Mm8dv=roR0?3AgEymD+G;ylHTsQMJ=FMD$lwQ+81w>CByUFn6-%v9&q zPB`Z^E`va7zJuY}Ifu7m^enwBZh0xpmqVu+1a7xm#~YQ6oe-(Ql1+=1i~rFpHZzeN z$6qDu-)GKbMd-Pm!&F_{{A(j619DNqv0Xx`UhB>)*-b^oNA|zoCLWXi745RU=hxWM zV>~Q%+rPZQGyJ@#&*zypy!>vA$5}88o$L&Jl*u&oSH$|T$poidF`6WI{p&w5`)s4b zjLSk>=2za3w2)zn$i9pe;A7TVe3gr#Sq-g0lN+I5Qgy4)XL!&!-qPJ+zjOJ;g@new zST`HtlKpnSQd1a=yJ%%r&v10plVB`TjK(-v}dCJyfW{fc??AXHo+qu!6b$ zH|6)NEA$W=8(9?qS`R;HGW7IwIlI+EPMAyGNJ| zN7UAbia>md`6NVA2Ju}zpv!gyrbv+wAWCmN`{8=fhd6JO?J=1zRWkCAtJ(#vhC^-{2%Tb8g`D4W`dNtC>yjb)H~osdPTZ-5?|w47b39gv)SBDX z3M>%l=#{#Qg0+uW*<4$6BB8vsQfR?!4pxUt8V=fp>nEwG+*E!mbuHGPmOz-04OU%d z8|9D?F+xxQ8$3Wy)p}1hpOJ0LkgasS8YnW}>ebuks6sQ&)z-{4P;yxJYu;q4n#c_b z2akg^B(|TinZsa&ETKV;xaasaoCJy8=}`tT#6X3XzT^8;EQK*#{wS-G7mmqb77uj< zb9i4m4}7u66(hb6p5A5;qslL`bXco}2FaBRCIk zj`;sy`ri))Jzeg&pYlUU!swH>IY)mjRu39hN$kl1#OUcfBNXIOvA5k9+y2;zWdvoG zchw8yO~t<1vJT*_8y!L?&$J1Ayl-zc4RJk38}9qXY?KJAIfmNukw$u%u#ln|BrFw9~_9w)Dp zA3ooHTn!-b>MKxrV?C{M2E=03B^*bzOo3Pi=BcV^x~Vd&Li%}bspB7MEu)i)nXZu^ zP^G`uDa;7t>)~KvJ2H%%HQ=QK=k$QH+CH9tww(N^w<)d#w3O(+vSatf0qu^zMR|IG z?pt)I5VR`9Ud^fG>HHR+IUHJ;<|} z*3MM)=b{n9n~8u(54b{8-}g18S%*=p9&In93~_;aZWg$hs<;3A=LY|Ss8x@n`d!R~ zAd-~NlCmB>5X}j@Kgm@WS^qJt9UMRbt_99eb?ArV0C(q*_LvnTz}w(*?Hv#r_guT2 zuI40G2p{#pC{spo!*8gNPo>mZaO+ZCPUelSAb%e!pa!%A|UR zHoR5`PX{YJcqiX?;ago%;Y9{EKSew^JqHj>KYwiL8q_FqVo1^M*mWY%c>osMGi{eY zmO4AIgWG1K1Nf@f)a3imFW=R)n;w(7R9C3caNpgV2^=*Iu7_W*#&Es`Z+0Z)V~$Y3 zzHt_a)sELL%b&Jr!`VmmArySwg@!_*RR)r!+D`VEl2O!E%IBXLz9A(r`H3TZQUe8` z#Ogfd?t>6h16KTi7SI?d_p5T0@4H#gOplb8-LXxYc;W^0AOIiniS(?n^p2A~dOghJ zCgsb!%AwBCF#|qu_iEh%ZuNe^(|aECNl7>i%^LlE(0-(;AuDk}9kjnZxUwpIFqF^M zyW8x>2Oob?x32YH;j{!UpYgXm-#iAorX_nA;PMU(gDnUCmgbQ9rk{N+fUuuasVm)l zQ0;c>Ao};5qf*EXU8P6%?qwn)uI2#T~fL!UHuxMO-;l|rggD8URiB5 z*Kq|W$$^+8H3iu4Q2lZzuf`$^yQ*ue>>ylI=eN6+Djy-gRi(%KI(?ZeBA#D5faSp( z)(34r*R;JXj6I)L>Ir{;-VjcAlulmoy!_PXi4ZSH0Gk>t4{P2Dp1!VHglTvJREMI2<|C0!~3>ey+EL zVI-9Qr?INPxWvGg#(W*Kg+y&t%2qw|67X_fc&@P3zneJD&h}w9doprYD@mqrwBXqP z1jJuD=KhNI^^@<-wAWf^#JyVE)zD0au3oD0U&3Khe7OarN7!v_L|FTd7J9BaZYltAjVd#XQ@R4K_5iVdb(=8mCeyWrz=4k zw&gW$!T~+WQ@NTh=)YW0d)*UT$mFm5TF-MfvB&4~?I$+1gSeb&{}YH~!0vM~d*3UF z=%kAkGFgU3WwumOkl*$j`D3Y%L+?0^iEpK~xYv%(cdMjA+h(16Rt34-6bPF?o`AiE z>uN}x14K!}QunnY_fhVIzUj^DL0-+QG8@G~z2AqPRW2 zDrf?;%gTx|yTuQ(WJ_f`5DsU}0$S1;*^b{vuh7das39~tB%G({m3yjKadwYY1{@r1 z-ZxI%-t?A^m zHEfIU@b~vM5I)5tH0GTG^L;#Sm*Ddt_|SreF#9w#n^qV)oF}I9(IDG@qf5brNgyMc%7Izyqs=m{z!Uks!0VT0V~!n* zqS7@)9FruAnY421;JMK+%^a0W2?ksi{Vp?o+O=D)A#>$UZON|d!;ymo%!<={X&21K z(rF$jmb9}lEuxV_fuZ6L3`Zk?>)$0udbYZ~ykRQvL}B*F0;6|NAMuiIWA|-Vhw3Pmds$b1vAK$$`yUfA}*7tCR z{<2rxHpDu`oRa^UiFf0H`jSYBmk@R@84a{E3M}j{rUxOug zicS{)?n#S2lV_*g@-4ihm+@fh^Mn9g!>Kqg{9oVx2uI15Xiy=TS8`7!;jGMKop-ms zA1}iR+&3Y%=EOZ`=a{B9b6&)6?fR~(`)CK>E&dJR^qc{1qcyMu`x$;J-&=mD-?(Hw zl(hXlTV?)?wCO}hU5Sk&@0O;`M+$>?Lt;ftSOI-y44zvF9ChHFujVZ2`pxrLt+Y4P z&D~GA5(?TQzio8YvgDAy21MAlS3GSCSy^=6I}+z@(O59&Jkt|UeNFcOf+B7y4%p61 zHT{l_r?6X(-0x{?%`6Q_13?=(s2IFA8Bv!N7iLp64@6gX0$0XwC<>Te5(k@>Gi%?# z+F{z(5fnwM`fZ5y7N|(b?{%JCNMy~m7}_35<9>u&)0REHFj2#EDml0cLY~9;~^6SBxrqb2E;;J_pBDN0>z@ zRG8=|I#Jgaso{~ZqzpREq`Ur-B{}8 zK-HAj(fx1JuFV&B&!i%%_0}#mHGaXkn21~T;GI4Rn$ty9xp44SyU{2y>@oU1b;jgI9M&b~A(-JG#u({~y zP4b=YIAUBOc7UnbOLaYof0!6^vQoUxnIK-KvgP;lE8{()+LtKb&w5{rX6;DEgVeEP zy`&b8YLZ{*XM9}a6E;}f>vO&Z}$9dzqSp#vZWDf@R0@ zHo@s4jmweM`Zr z6J}gtDdrJ?+8y>|;qWrLS&R<$rsqF@N-rc{#?5jyJBlJHV}04R>}1^%d5xSzTbxbbFM|j~pX{-fc`8j{iC-I$#eC*x@y!@) z{X~|cN!LAaG?;Ni^g9s8FPOpfwRHXw5FM$kjBM@|gP>{*8)Ks^=sINfbG5-D@|s5& zyhSid*O09602E3g=VT3e!*uj83;l#vL6<7bne=UK2-Nz^_#Viuh42~)6_XWv^ztvJ zk4I?O#J==!jP8Hs@>dt>Tx~r@8;&vmZNP0=c0+0Dc`jmW9BZe25r%>%&iO3$XHW+k zsJM6=iY^^Re8`gK7OrsBoN;s}GfZ35#M{N|nDwBaVj044b-@@-xQ(vUL|sn>B%z1F zNZlptKsL7)kN?#ZtbN;k=o&CKCI5kX1Ai_Dj*v3U`h1bvboBjTl_lw^mYc?3^Zds5 zzeW|lAikhsANKHds33?$4o;C}P#h>ketiyM-EQyXeV;!hV(bjsdwJ?VjGLuCaO!3lH)s9AJzCI=^M?%z(90hr`M=EOS5s8nMujQ#>BuV?nJok-sS{|cc0uFL=b6x z*T;QNgQ|$v#=}*i^0k20EYvlf8aF4(7w2GA&vqvxX}i4fbiWSBe)E;Ii^8#j%I(+* zz5VSJ_=|-u-#tNu;W61Oyc}frTIDGHv|XcVUZ1rK z;Myu#vmd_0;?pXPA>D%g)*P0@MWuC(AtFb~miF4_*ijSZBc@i#Zcj4{;9C$ePqz`) zu!3!GBW>)s&ql*UUa`pf7HPx|?@2iO!VEEAh}x8&@`mnk?$1XA+~lL9#j%j?t}d8$ z(L`mppNzfotA11-RM?3CZX1qn`JztU6L7^q_oEi9PjFO#Y*2DtG#h6eG5amT%Fyzi zC(6gZF7qku&La;O0_ha`BbRSG!Mr#2#G*}^f$!?~S@WmT?)&A-PS^sn+00%W^wwvy zC(d~Iij1=_pc$Eq&aZB3o(czB^1{!bl(T(XrUjOPxLWoR19$$Y%cG`C9}(G$6sz~w z{IdVyQyfF?7c2u>LbSEkS|24$^q}XeiLu@mBj3oBsL03x7cN4ifL-SUze|5XvE6kX^?_+HRvGyW~$cE@jAUJ$XM*d47)Zf5HG$*mV;oN_) z3Qhx2Hg=T!yYKJ7l>Mpk?WLa)Ciq0#L!jItnT7Umg6nv!4HJ1l-Q&j0VDpqAoHvv(4iJ4p)Ewt!+x4HIndr5%=vtn?)%OU%h{w9rUu8;=kZp#tO<7 zjN{#%u>?8y!iJ|}gF!-l;lJD9rq>D4S3dHmndTDKS2-FrtZMR`-AV{e29N#_lig82 zFGO4zSW9KLzwhhvWL(~tNK*6%8)L&PT7Tev0c&v~`k#^~gWL*O#~-McN?LCN^)~8v z6wDr(k9Nr$ti%X_ojnqp3mzJbZR1I88OHHNr7+5z@%&SUE{LuiH7y(ScI1Bl0YWlD zXug|diU_wK&1>^xmfFI|fh7s$3ioPJrlGoCJ%JAsB+bTlBWOgbuI8_0I4oQ1p(t~6 z9~??F$s;*4vWzm)^0sww@Wb1 ze3GAyxnIYdiY*C{_4?gnCXJHBWVel<)Q%J$o_76!dc8GKFW$2|bl*u$w0N(08nh$p zuEo1Fu$#fTe`Os%zJp7h=xR_sGB|!!LdvYgtBx#{jQN+WzfSfMr5|FAv<1qzkVmhVKHOOL>WYx65xIx(W;ve?-j)Hb!A?=>8>( z{YlmRGwpsvGX(C+Z&)SB@uI(I=r$QnB|Te)`mJFY|A_%NyVS&^%@|m70daCbC;?{H zlipQblty-QPqO&vnzPc?70wn}Q^4B{KE)(_!lCLHZlYenq~|=cmv)|>m03<~PXJ$? z>hfg_P`cfRf`Eu93Vzhnv5>$Z(-Wqaeh76jw!~?@R^+QNyC;1T>EkXaj^5eauJ6ejBj&C`3uM zaOS{p=IC>{;J)Hkrs`i0ymMkJcf~|~8`r3?aZ$bCeO@y9(eyeM+X)7Me=IvcfJ}E& zVw3m(2uc$MBF}K2z_kUOv@4 zcd`Vb>J~WAHjt0#8`zxeY!(0dU{2pA(8&1iUUwNR%4S#K$HD$bnC5Bm-~cNWdx)Y6t_tLWc*$0C144Nv?uW>@o;FthENl3h!P% z?>Q3^xeh|qb%JsKt=$I~EaUd%c3w>fNMd%b-kWkx0MX?+TQo5QBMtR8%y9Z{YDYo|c%boZst_6B%-CuK*mpQ3fK1Fwt)KsEN6fDl z7d;KT-0HLHRkr(5na{o5X<`oBz*{J)tR$sC{!f0(=Tn&PB9zkKhF9S~n2(__}L z1jQVo+`VyDps5rH#2+$sh2)&3KL8$BHKG5?P(7;k4gOcM=wBHr`>`)=s0);LKVAA( z4h9=V&PzFtto--9ltG!#^q;#uNTG4>-`zo%J^lp*bbKp`=^%}Ta`(ai>-B;pKf*zF zN^zjTBIh7kRw{rjU2{PHkguy#${@q={BtgeI^!ORx;cF1zJQ}Q=sYWoJXBXB!%acvDj#n)F>Xt6-pgkXt5!Qc}a0HZ%FE3 zZKsDTx$2(sA4YnMS4$m$pe`y{E$PE8WokdVp6~G&rQvS6GsPoP=eVU9@=eMbP_GVJ z1^HR%PAJG}s;xHMje%mmQPQ6`{O-PK?T$9*mP#0^*hMu})^DX##+({;Ch@Y$K_0lL z9+}_XOlf<;BvcDp70S=RCIHf%ZK(2t#sfPN-C@p`0U-Cf&u6>YmBE;pDNii!U9mNL z&Y9<0S0A4M7TUHWey zBCMDV=}n&>`QVMs^qovq{|qfa zJDhp?4KoK+;dAExWn{@3Z_&j%owq`XwY0j3kCK$0FR*`m8_EOq2?1sIXY4mVqPb-# zjfIG@DgUVe;2EmEFPM+Txb$ovln10HpW(W!`=H%=TCF64S~bL1%@u2U=^pvRPom!f zL+RA*qhC|224jb|jHdl9Z&98sz(aS>9KL+6WbGn(H#|=4*xq21XRg~a5@td{`VH}X z0~BPa$jgIkuGslPD;UNJ?AY31lXtU$q+j3ph*D>;$L?z_e>|^M zm|!aL?RPOnu``Fv|9({@6zcl_S_RN%aguD!DI|1PVyNg>;*-86bX^mjYye@|of>Q; zdukvL!$K~F__=LInM=QWl(`%UBFM57CYnlpdltHQW^~x|RFX28T86fElSS$aASU5Z zOdO@C;jUKb+L>j6KeVC&Eh*q4-|fam;{53ttL z>Ls86<|Y#QD^^{RGJ81!L1UGCu_bFf>tIdqM5>yRKPe8#vW;O9n^$a37mVVX*>Pk zr2`hJy1p-I+PJ~bGl+JI?pW_c@hv}=BoPWLGa5R<%rkL zn;st6QI7P`=p+IjwuYd2Pgx-7P{d6+)mEzApaqGSLOP3iVMv9pnxo}_f+ z8!8bxl>LqQXO8YZzr_4+F!7WR&-+Ft|!bG5<$zlKn#InoPW#LcAvOLA$+lK+^fkS#Jb1&+a{Z`Et_Gmx(Vx z9CLo?%caBK`~1$Qq+Gh>WAfqe3`Rf0)xag@7ESqb$Dh z3YY)#+z>T>vpJ}e=z>TsAIICUY>t!Hvy6#iPglwyZ1J>)LPn>kj=3*g)D_mqCAHRc zb#)#veJ&ty_3+8>Q5LWML(rC4A3Dl+?Rs~i2?`=U1&S1IeGePB|7!Wyk-8+3$H5_1 zzE{;4R?oS*#Qlk$oAHp-R3et)^SpB+rwX3%ZA7@k=gvEi*)CQfeA`{=$Mu7Co`>=i zuXb7g8l?@~2}Y8=kY{V#ZpcRu_~}c&QkVUeyCEjI)<)j?NpxJ;WT;dXS+uUNs$r>d z1kd%gwC4<5C3Y5E5D$JcqywN1DT}5eJd5zL*kh4MJ}@3!CMj#){e6H?BlnHb7o%i? zrW<5cd#Kw@xVu)iq&O|XdoBx~uRXUlZ0qsY71x)gboZ710SOgnBK6&kwZ?(>;vfdB z>`^>^WeHtO3rpNob3XR?)y#+5@dI1y?~OoqltydKlslxSlUBjZWbr!~o2Y{!C2p)k z4EJ5SwiNf?TgqD61*a^zGVu?m!JsIoUd6PkE!SfnmY~g$@PRV-UTp0;BWi6-ToLU# z%i3TdBj15P5)ZW7%03HWnUlR%2~u4=*b(SN;u8bk%=xRp{2 zc|b;6Ii#9H!(|1KD_?W80&i-_SmRP-KyWq~$jwePSEXeRq7x3Ga*~K+t)ATqY^Ggd z6l{^D1(OXlDtxt9_rLz*2U>>kR29kUdkU%bsHdxOkj#l$^p($``0UmMDE5{z>M@Ta zJJU9(~(^)W)4;*#kR)xF^9 zp2cK{bWU0AqKDI(oT1!f9sT1sy;I{rIke-nku?VYR$q=zM@nze%@a$#eu|rSu~%U| zR~%qOdFA1b?jqBN|MjV$%f;p?g$L_roLXp2WAiJ+TCNBj)RszbNPBM;04e1h1!EE*dmv# z`Lq*b@D1*)=17gS1`HT zcl4@w&AP7LtoxC#(I%SmE_SkGei?r~MnzcXWB)E=BrtsPphon_VmAIwdEVr$ig}p> zcUrhlY@Xh@$cmR8^2Yg4gw$CxWqx+#kvD_NYF}V#suaq`6At=-JmK@QGjBWUW;Z8q zY(l#`#sdBxt|R9YK25)}JQXtF%%JY81&utt-;0+^%dUn?)bZ_2i9YUYWT$6Gq|*0; zP6%pUc7){u;{6|rl`YrIXU?Nweaq^pVKvD*ps1u@iv|>BW(dgFi4p1bshlmgM%F?G zL_)2n$Z~S+IR#q1&V`Dzm@|dyQfzRh$&_y&6vpBKF*$}twaddc91{u#x}69r zVC@!~9wgY8I@t6ehh~b!ph`B1@2e8`+%)*TI>|qD%$!;I0{Ke{RAK1>&zbRgLOChRYLyOHG+8u$qISNoS9H+U(ZGdv7o{(u48vTZeN(N- zw{+x(>K65LzHIJjb)`)_Eg3y;TK4Bel+_ZJUe-riH!9MVM%>?VpGWJ5PD+@$;>_*I zxd#m6o9hK-JyudZkKTB%b|^i0zkkIc6>@SW0{Orkmp-4^7#}&s@>t(zPNrr&-My}kXK7i5T#7I+$DhKoN?}V4 z?kUzUEZO}kr{CBbQ!#W$&GwE*M1bd&Hdk_67iW1F}CtayXs6FfLa>wbHv$lGd^ujs?zHKL2 z=eOEx;fsN`@ zU2HY1{C*`%&<5j1^U{*MzoF5i!h@Z78$?B?JeANtY7^L75}CXF0SZ@Smc z78esfP;k%amB!p$`x5|Ipmir!`Q4|pO>X^I>K5ucA^7an-R>HSR3wA{>FJA6k}E?) zf+BVKE$BGw)dh1b!bwo-kSI1Z4Px3k;5Ps5%%Eg7k_^S_!t|WD81DAH8g>@?Co8Mg zgKJieSMnNsz-s332a(grJ^}We_!WPeuw$b1s=H|GkL5UB? zGeuFaYa^`%#heWa=Il}WY4Q8to$NY%l)A70@!arv-iHXQvp<+Z2{%-UzB-S$Blaw$ z%)bpqGCw8tic=p<9azaRO60BDSXMDyP2s?j0xI$&{;oCVaJjMXO-0de_(ekNMsZJN zTh1*Qj`nq`Ym@!qqtU^n&E;*o%7gi{SRp~EQZL6sFsrJffxMxR> zK+4TKwSESg&ooMVKHqYlS>=>rHS8Ky6dQOCKw}){LzkwvfF(1ZVri#{658!<;M}5$ z{*~G)w0fqKYjd@rSy!IK@x12uR)_p1dF9*p$LpVlLpU@OH zFwwAalxeDImtb$*hCxnY5P@Hj6tp{o?cKiY9)yDXuYx(tbWwhl!1A($lQ$Tvs2FDM z_A9maq!nSq)eFb2ulQlA)D$I$DmWWer<&Vx-y@2dlg-QuN5d{ieczf)^yJ``UvfoN zZC5~LoV8g#)BH5dtR84I`)+zUf_L$sH^DQ8cuYIdom#)H>R%Dc>MiKMa z38g@)RDt+&38!MLY!_TI%P497VK$3+3VCz*Z6_&1K$TTq@mnG2gX`7J<(p^8Ck z{9Y(N!lCbFk5N00{80t$Q^8{}QcCnCSkHZNv~eH8zIVwL`$~0)dF`=`3$!Ids5Y6( zCG)V*d$eSjRheed3x~F*@z^Xj-9r`{$)6KG_fj|{PqWfaC3)M;lc;?DO`{v|m@BFe>_)iUq{O~(=0%AT z0}KNTX+PsJ-6EXZAwnuP;*LOQZ%PCg5b!GRp>eW1vxVU-xyEpeQtUP*lJrqrXcD zO`DLn#Hpf|)iNhAm-XN^GC|An`Sxq@Jmh9+JB5n(r#$0g=Oz7ldvdYro7v8BPq#-> zGRg`?mOlH7Mnxuk=~;XEqfX1&R6vy_NLTCoP(5qzrM!kSey@i|EDaS8e*nf%+h;CN zrpOc1r_`+Fr&^q8ZqGUovKUzttfC&hSzR3`yO=`TD96xZ8i6oeIoNbdYcim6^8RlX8IBlLANXYHl$YN<&_n2tZSScC|sLZri^&!9K&{FD`*o8wbI3i8xq4t#Mr$!l-0P9wt0C6yS{T7zL0P@`g@srWh#MHbuEYia<>7FAz=| ze%vkZxzOP`-?aVdzdDqlt>PZ5JScr`dld0Q`73XTSo)N{Sbz}q(<0_RBh!2Zxx-I2sCD@+s)5w!3NS_>n zSy1)@<W-^cG) zX|HUvHyG_`moB1Na=(CzwcDJ1=nIao%t>DEjxTtA8RlDD=)q4p>kG|>I*-odBWtM3 zKxAbPtcwF1aUpd1ujZVijC2d`jzNI&n!>03)Y{9N3P`=!eATX#yn3^LOzT*+-lpG7 zjlu>mN*@FBbirVh4*S8%bC>pa;YD^}$@cdRRSZxJ%%EbSQniI5=jhY5i1gYl8_hC}CCuF`@$YiXD z)p<-_Ji~~Yf$D@45hXF$2YS9#{0u_lbL7BxQOqY`>>Yfa!D$j6INi zl=u+!bCQD{>goU zDF_rLC~NJ~{VI3{7gJ}%u9P}auW&(bb}XOX(xLwD>3%H3iZDK%%!wRbSZN*BT%5wQ zKZAnYuM4p^wv18LYGPQt2gP&q2{V_}qCO z>J&E&H+n**EZL(*6y%?U3R@J@EOYnnOw|d_GLGc$|6W10C{R3Y1LH}r`O0+;w7i1V zmDT@~u-5y^zHyak3sSQM!3g|Z-N!&T`h_OMGreUs)a0|PfKRBRorViQtB(@%NR*hz zqO~EkKauIF0%B|>47vFP1(T^~ZKqSnaYLYz(zdH_NK)O$96E6SG$Ebd@S~&ZRY=(v zl%BUqT|*RhAtw3-aal&;ftE4VNu`%{f72Y#!gey3OcGgHpwW3W?Fv}XPwSK#esTdH zGO*R1c6SSn%8ZkMr9mJP+mlCVvZ*qB8o8m(Jd1U@RPHWKOCFV^8}^`_;K|>Cum~mUugXc*4_d$ zQp_6fEO8v!zfS@H$Dl#;6IiJI=K6}YMl^a5OJDW*+j=9Vbr}By`vj)g{8Gbix^FcI zVpxk7C0N?mltLKkM=z>ZbrJdORadXUFpmHGe&Y|YPGXg_ehbMz1AN9_Mo?Mig?Goc zYDI)xP9DiG<2u+`)_K+&oeRR0r|C1Rz>&qi3dv;&O3U`9m2^gmKB)A%$+eBxK-CD( zbxV|?J^O+DYw$Z*s~3dfmdY_!H>JgyRn|n|kkqu#d707RQBYa6PegpS#7Pr zjfMlaSb!T}=dPi=<#?m=#ZPD3Rb629F4zo=0B>==38CGytR`ZQwRH$C99?*ZmG^+L z3MTcvGVQjZ8WQfZNLIS_&1$3`WnqIxNml;p6^d7{6w^1$9IV7v(%OcNT;V8)?vRwvQ)hck^LaeOAo-VmUxJrFvC$1UB^>aY z^Gy{^C9J~t(nF+9Th$yW(1Z?5c93hW2dW{b+Qup>4PK_OD{#mm<} zn$bHh*kg?@aAY;=17M^Z4WGw}<+n*wd_})^FqT76~ut11(3UjBe2SdR& zTKAUyNvtiLA`ky1r{Rpk1Q;RR9p0V;ux2i`i~ zvt_)v|0$?)QQur8u+0WHp;MR)uy0D%`&{0~Uc_9;=5fT^TOwBhFnj4OFo{ts-k%xq zSW6tNs$wCAtn8 zg-Wy*x_bv3Z>;_U35InSG>h0;I);(sJ%TW~6IeZ{lBV|6ZQdSRq}v6`o!UdtHC04V zq&ndNadgy|$Clpo%!QrT>VtKKa%FCx{dk|WE zTh7hi8}{Rv{4iv|CZKCupqk-XMYyNnBFLLih$Y3IdP>fM0q|5&oe zZ@d}j%)dF29W1XZDCPykZvNc@iu8=TLqx28_8|4A?1zF@_zBIu>G@5|3PYX3wI?14 zKup4bEAymGG%Vray>=xU3~Xp5hA3t`IT;`HPx83_sdb`f+;N3NhIb_v>YMGJiyBt7 zL#2Zf!ilDNh8w=Qp(lB%+7H8Mv}-v4P23926KQWr`U&bb-PLNPE{GjSi;08~rqc!_ zQ(oioiD_3Df~fbJ2xx`MBTGkj%>`cY&>P zD6Sq(Oxwn}N!ze!wkvvB_I|sK_njIQMI!8sp76t#3V2h2QG2`fV|&y{$sN^?B`B3L zWFbi&VbI}noWOHIl+=OXFZ3j!OUN9;b$>W8FC^tFz3qu-@2lz5XG|6m1NtRuRzj_@ zAhrJI!R3e;-Om8WA%{Q(S@`ER2GzWIB7S!J7Oc*U2CU{?gSg>)B+xJLMkzlmJ`bS5 zuB*4qDX*ns7rLju*?vz6V_`$2dQwaA66r6W_`?5^c{sA~m=eH=DI~Dvzq>D&bDEf! zTPWW`?ZuXO6+Q9Y2>s^EN{kKS2=g`k(LRvCEzyKe)D=fVGxM!u+($#zipf!3@6Eu~ z_#!i}xx?qb%) zYHn%mqv)`9l%t^F!gPnGpzL`Hq2`pnjK_oNql%FUx2>44j(d;8bIi0Zhh?{kSb2vtE(<073QtwH?ppt&*6v zzND9pW2Ah;VQ(E%{t*G#HCJ5cqZsDFn>}?#@Agev_OZk7XmsV+vlmtMc4$~#pa>^5 zJkhIO?->BTzFgy%rfzaK8-l7EobgRfm(4A>#mjLo(Pqo{@(Uj6%wb&uES_*o+6*Uyq~ z9b(Gb3r^rKga815^~?A6Wnh>(USq-*kE_lZ1#j7V!h3Dlfw=mnf~9g`3G;A&oLz({(t%`Iph-Y zdFMBXYri|4eOv2l`t6TbZ3`LR1pFtTj4A2-?s&HUfhp_HdLftp$fx`NAK4+rcP8oo zV>9+9K>pQ8?DP51h<$hzc`RbjklpkJ1&0-iwrwnZ`OIOnR=rdDZj;^5e+|6$k!Y+?~y{n&%p8Uhz_KXqbBE+!31_F3qt-lEQD9s|jK3fOBmd4u9#0?#omoH(`} zW&RmYx2vlt2iW5aG$S#vd|}O(Z2q6uwZe(Z_v{us6?_Ic^||Bh+MmywT{LObU`g;W zdu;~SGkQs+`tSj1ycjU06S&A+%@KW*g>npzmSaFJlR`K9P2afR1J~g->e3rw- ze)@uliMPpcMidWT^`d$l_Z8QX?B|SSQmvXe_QZ5=X)8285fn2F{Z}v+JIi~t<*!%O zP6BF_5S7G*DTi!V21s1%Do`i+xPbRvTHAi#l8*OqkGYYBvyh>xDl{YLkoJim$RMz~ z;B9vlhx-uEs)zJY>Rm5Y?OrNwdU=@tjs|v?x^=s7%IN>vuH*N7vZ$-}i1^H*#&;`A z9kxFE4%QqZ*FeTRmIMjX;hYFg45HHcOkJb&EpC#$O69!b28gQ#G6aBTAtGDA`|;hP z1OZ-!A0S%ytJ;BJK2Z=d=)(ogw*rM2iukr}*6da^n2Z z4@+0TW(EP z&mhkF_Wzz%sCQjI`xv?Ar-%;7G5z;Oc}cB^;udR}va-RIq}WW`oY^5?1Z=BUZ-JyP zSLT;owzv23=aUN*dB51vrUGlx@Jg&DsARHgmo$S}b{pwBu{vEm%Z(rQITj@Cmd_JD zMW9PKmim>tvjx||ov-HFb;W#te{AlZ2 zpWx9mmetU43ruz9PnIB=e&-rvPeWu+neUp^p#p|WZv#xIC0Mh~eswCx_F$_L{e^QM z3JAjrCRZU6G`uB8+G%^m_A>FqWhMRG3}wWW+s4W;s;a2D`!zma=LAJ8zUrNzB^?=g zuX6mpcu@R(8MKxJYvY%~S;CbI+#Q$Js&rU_96iRNw(g!sr+NqSTk|lajsn}!U&#(M z$Eo$M`9aX}+|j#t|IDjqv`X=QmCD8&zh-~$g70I^C~5t;%;rzj2+L6bJACz~@3*s# z0|5t5wMg^xC)~-%l><@IS2*S7N6yujOcpcSe1sTCSPm3}kQ#j|pqn|e;mj}cG2WH) zWvh{u-t3y()9#Rw8CSmhrTv!aq>HA{%t3g_P`LmlUFI7nb$+^+n{&EC5??njl<;>! z95brKH1zu1K#}k4W1sFwe+y`qmkVeR;X>gqA8KN$#WivZIqKnNqFiU(udY{eM{Xwp z4;Du|k!M8{?_pZnY}~b?*?G~0y#d~Ppzm_R##JgiN$WtpA`@qV|CDoaKZRhs7+E@P z&wt>BvVO3G7_mM&y)`1O5Z6#hF{V2mUKU^I4zaOKl#Q`M)c*r< zCW{EgU%S9dyiKnGePiR-;?XL%MIN+w%j?H0c_OZt<1(-)Kp19VN=?r<19#_-6Du%v zYrycs!DC!}ymAYHkbL%b=EaoOjMh)1q$@)czSXbC6>9(C4CGpY7B?irpEt+WNLHyP zdNh<9lI&+<#L3P+IxwJKHe`i?by_Jpc|Y9MYx-VJ9%8jXo~3M9!>2Ouu;#q z1Xo3hxwbQ^&1_;FQH07bropZUUc^`P2~X5`e0^-&W7d9Qbh?5QAu77ScY1P(b|uiU z^+e^yds)Zx*lr~;T3`EG@2r0+*8_Z>?X+@~bZy%Ya!>YtaC3;Wuq9#sWoK-@I6k|t z0f{+fff0aT6_=P@<~e}um6~j@9BkHOoqLpu;#*PI5+n(QHFLj1d!_q&F*@&SJzLrU z%*)|K=LuJ8#e^j$PbPS0I<8D*xHM&(yOQmjOJ$f}kBPClUh5`bw5p%!dHp3vJVnUB zW;IdD=bsQ#Whk@C93Uer5K9v>##lyhL@6$Fdy0AfGsOj+HxU%A zMI}VYxQZ?}WEjLhxU-;pN|3L+$;l&;4a@~vZDHPlX~Wez1Ode#2;5XxbQvLj1ehwR z@Fz??)7Z@vf9-BUY7P~AZGi0ShWaC_1WyV?)SpAGZ4B_HcpC5&s5uy@2fkc_nsCt9E^CMRXY^< zgbsx^j7odZ-v00qn_?NlgS9-5`e5B0({OWZEPI}{xoqQ_@la<_oVcz`%Ol}6SJ<86 z__VuR?7Yf}{CXCN48DsO8)Z zy8q^{*Z0u8iS>pOk{@$K+5Mq(O(V7UyOUDKSDDumQbr|bn+SopR;o!;UUApo1+yCh z{bd>;Zmhi30wUfitwtw#Z`%HbP{M)JWY`;Vsa`&Jn8r+Ixuv&@>!Nnlsu}B#?;Wi$ zo2U7D!@r~pmS(Jr8=kzJE^FY42G;jtjwJDJQ&G#BrVJC1HXYFp?68{~fUpM2(Axc6 zLj_|7YYogy{g$(6k-TDYhcuH%V zjax9>!ciLq1Ou`++S@;{&Qw^x*=b(=x077+e$dW*xH^m=KxEuPEp=auG-P=d^(eF@ z(*IQXjP{aZ?stkFpI&Q73dWNQ-5OiT(4PwFb@4l^P4 zdpBg{htAxeQO&O&^PRJNQ(;1s4^3kkqf(fgudRxarb(lr-0xoSJmoGYMfyuPC0MT5 zdV-whCo%Bzrh4XrJbi2JGyH`T@t6G2rgurBG(*S7n#Avs{#i$`Q1iZ}0ukMOxc>NP ztF!5l#a*ORIiMhrrVBGsj;CCL9EZ2pKMV=_?}Fmck!B_K6l>|?k2q!?drAnsY<7uu zDMhH>20Nu}in|+NNKctHRyJ&1_>K%Zh26jvxKCSiS`yCTu3RRq#Dh?X%S$;=RXZl^ zZw=e{spm>Hs}YX{o+kor_w&UgliV$q-mCsHefWnLsq8}~fp-d7bIk$|MX_c`oy`#a z*O=fCjFO@Y8Wc|#YHIfIfuFsI&3IK_ys>19xBRg|AN%danFe3)I)1;QZ9uQN-#ygMIj?onuJt$D-kS{?Km=RhR*#_M=K7ZSYCaO#ia3t<>|8= z*coMVT|iaBXb6p07|Dn-W|UEqxHP86RRPimn^6IXd^%Uvz*ZF9-HHM21COQxJU0Cr zxb~jU8_U#U|C#gmarb=TCGbqUG+X)vv+n8bp&7^1B*}Sdvv-Nt^2%O+w=QvDl;c>_ zqz+eZ=o{3KX#TFx@)0)Dk#|pT%LTd;ooY^{lU_^aIaW7HOA=Kdbo<&XAin)*ccw0{ zwtX;&DjBv-i=daaA{FHUl`jJ955Jq`J&SO0F(7_7IC1&3X6NOY` z2PW{dFqzs%_5U>no#Xjes<>^J8`5T`(Qau^uG;d9#wfMnLoR3xU)6rOPb5c|ctP72 zp}V&>&w3%83v^3{nI!d0OihIhMs_)P&5X}nqN#Q;Uq0?cu~6xA8X<`*<6MKxBF2B) z%IK54B&8cMg_M+@$FOL}5yhEe{a{JvpMFPB7MBuri&BgEJEbOCxf=K51wK_%_` z_WiKfV@{UpO#M3m7JUJf79_3316n#j{*MFmh@IOVs)Z-LXH2N&)0&i@9au!$XT^TV z6Htw5Fi!i+GvQC0*(n#4k?27DwXVjj~BPHp1UE zBp1-eN#dkX8gH`*j^6ESrl9H%Vr((-{LS4=7VUu@RoAHBUHdYze3o%c3h>W{tL3)K z-g5}4_*o*F%IEw38pH|2DE*97H3{Hq zb_L$QA(txqPZ1oyd;S-xeDyfVz`FY(thu@EFm_>_{4wtJ4IQon#mkFkOGL^1nL`Doe<64Gk70-pn2_LD*~df1Yg9cv8K06=wD$Oi0nv*gmx$WVs{BtQ?Dz~GsA7z({}Bon*+?l}1GqJLF0sYqMkMNuUvKFd}yg++nqcHgvsT6!34j zVNWoSAYCvp(w|w8E^=A4HrzdkZSam6_@&fahu~b+{p;zhxR)#+<^Ok-6m0OWr149; zX`p|I8L`1b<;3r^2q9d>Kr#&v7MWfVH8EeC0{J$7g6M^@nPc8znyZ^wTfGuz<{-dHvt$YsCbS=_K06hA9nRVk(#ct^OxD?)h(LF3s~F`9vuA4~dE zYQJ4nhfNn%zWl*%Sbl-q;*nQMrQ2Q78hlmOsX2}e_<}9#u7Ss2_^?`@AfKSH=I>dL zA1S-+OX5jhknW&$XJfW%u@KTQwSAohsbKo`iaC*{`j!3Ngsb<*Ks{6+ts5J7ktlkZ z)@#LfTPNIvKVU_3dh_2$<-#tBH)o7pc|{V~zO5^EZtKa0?Q{Le_Kwq;XMFnZow;P5GW@V2kXJQ9`o%O0WG<>T}(TC4S9Ja1A=Zq#r(P5rBzeBdJNs{ zGYKobo-n9&rxQJbHPAR||C>A+FlC>?l*v?Qf+?GNHiN$b^hy2F1>5JS&2<$BN!uRQ zgbJgo(U`$9f^9pxn9$y(1z(s7-?iz~J?COV?oo1EOW_VztSWwlq@os@0%kbT{r5vC ze8S+m?WA1^&K(C-6#(8^LP1`-#Ec1Yv{3D%rB#u&Gd3=)GcZifW*+r93Kat4et$BZ zchvZ7epXaEgjJ6e74DO`(!JWOEHkcaaH4~GaVV&GpuO4U=M(m?v1JUW1CM96fNSQM z>J_28vymb}qUBNMM7gSDo3>g1pfFssZCG;My#uafxrr`9Ky@oV9ds7cmmmVYvZ5e| zVsrc2=W`Bbx3xmd6Wwcbv;Y#nUSYqD#Mgvt3jssZKdTdE5h#_?FJ@m{e;?BtY$o~L zw9h^dV(B2-RbkO^n&DF1&*u`%C?TYl3FYfeAo!u?X%mRxQ!dBC&gbty+KSR`bpALv z4;mV@M^GTb!Ef_MGg^4TX$(jkLdH>-3QgECDbcCn>bjxb@tV11Iz`hBuSzfxGD^l6H`em2_7KDN`c3}6b^kg zTuK~QkwAXtj(X^y%47|q9{udkA;6MSY4-`Y6j@3sr_BK|_7?S7cz$ftVEAY^GJOK! z#DO^W-eCe`7AP2`jeC8V|&si zxQu$626F9#p0Tu1Uu%p;VRtjLuE-9_+w-h)CVftdneM7Tm9Vxx2B{h?dSx#3t3#aO z@=V^4<1esbCL@lpx}By!^Aef$uv7`zISFKN5^Qp9zB{^|RPAu4;#b=OJQ}|$4VgVJXdFYkDx7N5SBG?0 zw5Ib4KSN=HgS;^PuY$ay$N^{SF$UPpc-^+~+3hsn%nJlb(i)Z`13QL!EmR{ASj4|| zQ)oAqoJ3hl`vT{+s*r+$wy@WR_?Ve4?Q$_}B^r9OsVW_RlfyIM() zj({778Kef64E~7fuPqq`iR{cX#vt6hi;ZtWJIh}4xV~!367hL=`ub@$zVtowkz(%G z9L>BzQs3Oj5vE@feRZJw#%>K;FLbt-^SZyeb6}0xMUtKCXUofbm@b|C^AiOm)BDqS zGF<|1Qo_lstbh=z)e&d9X=!(CAJb$1-6**H)CN8HtyY~)qNCAve9fDMJ(Ib^>?a$a z^IXXD#W9Fas}iGSXNCsA3}x-zaSC@z_b~mxGBCZ?mt1Fb5M05$1>0Wx(TC=70!(k@ zf5-mcDA7SixHp;4bL~y6O?8LJzD}<3Lrh7UyO4}2sr5wFo@V^aRS5v^W##_tt zi}(M~k5Yqq?1Z4Rr=vWmDa6HKW?93ODc9tK%t5*=&q%RNr4HB_woyEqW$g@G_`Sqqq- zqmI;Gf|yhFL8tZ^v$SSFK8cQm+TuJWfn^7s@yTZI2INN;vS@ zeZ7$o&J%2-b_-rTb0JoqguXm zKr{~-D&gl!anBAH^o`Dx(`)Bu52sKoh*Z-kgE9-36*?H!A<(5Hf8cExvnz$8oRM(w zE7_PJV*C>Q(9G{o2C;U zOv(C1>J^Q!pgxqEH7~MKN*$@EQ6JLlf4CQ)-fw&Rz0bERMeHt zwA==YRZ;=9tOb4(qV0M68^<^ekMInm3qOslu(uvcoB&DC+rRMe>nD8THqdBN#l2G&?~u%@xm(k5s~uqiulujcD<#p$ky zyIyan+B&*VaO%&v^NrVsy?aY+%vTH5oTcOj^e&TRZI;sXN2iPIL2DGQWwiYkK6{{< z`5!etkMqtJwI==Y7uv!cpyqKY%TLn2TR#(`pc!uDLaHrpr**Ms&vu2`D{vX7Xk8W- z!D41sO()pzba?T zZ~XPT>uo`Z4Q{7OKq3W8S7OW(Do3UFDUs-$5nVihhdFh&}AiYPe48 za%AvbEtaszCs${b+zC3h(N3+$wk0FW*9wTror>gqox57BDnZpvP%|J}ItVy{!=8&E zCotIkvX!geQ|a2Bh|6YPW@MO6-07b+o_Z^asrQViUE)aiXgJw@tK>1`{4-5T`ps`* zsT)ya5fSH?5vP@H7%9O#(NeC-m=9BJn{5?jX=?vK%A?KY_YRkxi&@y{&TVox9Q(rO zvauev?Q0VptWZ?WcXvT$!wz`^3^Jo^w3GNX(!S^AKUqQ{qT|{H{1IKq-c|$ThTu#L z@?W7hR5ql3Y2;CnZEM0lL-!M|Y~S2f>J2dhrgHzag+RU?x4Vs=)Gw)iAJNRe`KLQT zAfW+-l*G!W7aAZ!GoH_*2?j=6D5q80v$s&`N&h7HC6!Z0MW3!Xue{utXtVu_q{?!r z;@HkeU*=W&;t|zw;Nh>)$R}THaLTZ`%U^hr3V1d${^Nq2ZQe7^fte#*aRCy?-*Qq6e!G4t*l(HuV6o!krZwEoYp7iG^sxMIP3 z0BUF=6!&^&!nX*is5%_lT@-Sj9&rkxA(Ap9pi*rq%MUK^M99UIMWKB2Z`&0FOa-_p zUqu-pVcIa-ui@)o9<}MLqm6+z!s>>-Me=MBKVRdfJ`qa4L`I~&zSN9>HaYxh!qO)8 zzhicDNR*uVQN#McfLr~SQaa?SIqpY$x|Vc!tb|htq`{QTUgKirW+IuNd>urN27V>u zeIN~@IUshr_o8AU0uz$Z*C;hqDoV;+yVJ_W73*wg=~+QZxwQ_9zOV0{s`s2-)FknO zS`OjRc4X&{3%0`sR~FDqu;jo}-(R=6izr9ryn8D;+-`l;vCmuc0I0&xCfEj(i`uJA zWT*@mbidMGs=mAsqx+cj;QZZ0kpWDiO89;|O2EVueyH?|Rw+Rxc(k7(_7zUEd@?Ab zMyqkLn^JA$1XzK8Aeuuh$t481aEIJprkh;9-J1}Q--aZ}tEE0VRaJqj4{S^N((3-t zZAF&$s@( z`JrNic2Ujyy$+qiWn+IZX`?$aTA zVbxJF0WyPv2)K^}TBa0>N(ktVbe|COiLF>0Mn(*Xo>t`W|8_O#ltfrx6I*(F> zFArA-B)@&69r~RrnmUa4;A@+oW;6U;tJPIm4~l5;t$#ijl4N~LA9Z-gtVU6J_b?@W z_)Q_*Z(|997!ipN#hRb{S!GppY-D>`<8q&tgA4+VEpuFbn~sr_oCekc47|v!u)s8Q z!~oAWmOUu~kG_5?yo`1kv>v_-^B#`OmH=P__J)I1x;H?f(kG#X*eakrLpg8Sv#iV~ zv&`|KgxGrVygWzMXdXmsjl;PDXBPiJQZ>^3NvBla_lhoJV;)4Ou=g5paUVtJiBk`U z?Qh$%mN$bc={LA&XzX+CZ55~xE2I3%jrx#2Fa9jgv;Xz|CddD|aT9vW_l?C%PxNgA zo2plOmR5J^3@EENXW^_KrRyNHK{~ux^4X$T&iui?QAv$t(Xe+3A1Y~v64IdkHxS;N z)!IdM{KbP-=XFZbR_rNFR0-%KC^r>tZ^{NE&)0Xj+@nOCBchyg7 z2vNm&oPLfdzDt7vaL8o33+vldKz}U13cpHIWi0}zK=;?Q0{$j?w8JiO#Oli}hRaEY z)!n{XcxG~(lODsNxa-OZF>HQv&w*YV#&zwHY8yx<+C8K(uyR9^@?qn;>Z4ky0_`)WS7mOfHRu+sNfi+uiqUl- z(VN#injT{pj2o-%FkWUcZRC=?lp0Gk52M#tVbix|Fpco^?!K{mrmg%Q{&W|S8JI$h zZ?8uJoj0^7{(szNcO;lB9^3=T`Z{~3CXs!o-q|npV-@_KD-3zBIC3|+L}{>RRg`FO ziak4_5b7xbJ|Cns2lNwMP8DuXec$9Y@oI-$x=Uz^H^y z`~PC^EyJR0yKrF;6%a)M73q{vKD2Kk|qa_HqYC!tg z^Ywm($}3BwM$v)F%Dq+o_M1`0x0Fjh-CCuNw_GE3jQ@vq3rb7;N7U6AvrT1y zRUYO9Ogl4{r=y8Rr2TZ^J0l+9Q?t4~anF)zEBdxpT98w>yq)9Rk;oDEcPYrj6a$?J zWP3E1n#SwNEb+XxOB9srhS{dC;W(`Xg1-AR7EC1t<{6Jvx05%H2*P>Fo({B%|DPeU;8%$PmSXo^5hxpzjnFQ3i|I@C+^e;k)!or~}*IAcXsT$K$buwWxz$9mz`m5rc&t#5msRYEX3|rre5S+2EGXmO_C#0c8SwUYWnICgX^ zv?LE}zUJj$v;;Ny(xHa}S>W0@aM}c2-(BE8JQrYhv$m9XM$^U(%r1IHp|eq6RpVfL zAW~D(MOajhO`Wi=Lc^m|$N1OFQl9sXk8JR+^5kUKlW_e$q~wnB==T^4Af#Vi=CJX; zHveA=WXz-7=Acq=Eo%PD2Nm(RbW=gQ527||zLqU5$y_t)R-lNI{A09V+-zHzUVuxX zSl(!906|_w7W$8&^tB6jBWusH>IHSQZWwb{oc4Hsxz7GpWzMFwoqWrE05D1EaVzb< z!4Bu%u9se-nQhnQ1a*#e)n(IG=3^r+W(&v$UWH%j>e?WPa%i3>Ge{|G`>!<}ker-} zUR`gl2fQul8P_&h-t%d@s$wU9@tugtDq&7Q94*XfDsE=Zs6^(gBxKB}=VJQO*VV6G z7%{~G&>1-IwH7WQzfluRwtA_m+r;<&7 zS%A@P%{`!Cas__5Z`0d_)17<4tPiAuJ$fEKTHIYJ$3DrjQ|GK6Fk+FnLuRK2>1Z)D zjW}QDWyxR%+-}8u$mf69(D!fOg((U{65jML=`6jD1bJkZuLr=1d8fC2T)uul88~Cr z@*>K=GfQxZa3vpWBo>5SwN(az^5=|-(AbR5&L28(4EV?II7owm1dY6ujJjlLByWAQ zET`w5%P_I?$iRvt$a~V)6U$xpkS|xr8c0xTe3Q*w90NkCukU6Xw4E!}CH=?LC3JfH zvjwLZ80+14k~FM{c?qU;ProST8%;CePE}c^JXQ%NKTc9_@6O;$joUr8b*a2dDp>#J zKNWYpa*1I{=xt(piJR|VGXRSMI<;+cb+MLMcU{Q|Fv9u_Me1!fzmKzq&9ad~janoZ z%hx=}+fx!Ymxd^aUljEywF3kB2-@_Ck+hj9Hy3L~V!QnI1C2o?-6;7tFZwU~-7NZJ zYVZM@Ku)CqGEWurkUN8*-5>9Jqamo-F9yDuH`vj^VTmhtDUlL}ed)i|*-hoCK+i562J2ifAnUxL%`p7Txwx?Jvq+ergdnn{PWV4Vy9|CiNU!M-ye%d4V zx1T0gR=gt*9a-kZ!cbB>kJ}|jKaEO8UH0zj^|4e+@Vsx`chkjkQ2N-t3-t1Yy!W}yT zeizhA)Ybc;W_Q_YX?W%0C@mGsMf;{-qO!g}_wgt!jVhfv!G@!3j-8!w025c*vc-A} z1TWhz-8Dj8Jda-z?$4B$V3^EW?zr}N&BLw>exE1|A1G((uKD-6t{;}vAAHuaTHa~~ zAcpZDi*XGB;_-D-$d!A&zn>>{$4Wj>04uRA-t{#cpbUcRRb_DzLzk0Is#W(kEr!Ql zFX&Trg}L@+T+VmjBy-*!B(69}j(ukf&gN{*HvBHA`Rgh|H*Rw$4fj&IpjIF{=%ORBdLN)QYKEf(f@Fae z8x4oL{4Mx5qvpOy$_n2BA@IoI$?N!**~SwKQ7QrR=ec{a-n#Cg;H+l+uoD;N8S%*& z3DchgeYcy>aJi)GD?>#O+zw309BjBUeB)l0c|t&=svWXoSH+3wF4#g-Ru*GW|0qRQ z^(|oLT}rKsEhA5 z&%>akS|O-VDZ-}^+3OGbOqpX>roTkc1ohu<3tOYzLqi3j(2v4ng*q0Id@ihT9fe9+ z^GL4UwNtJ;f|mY!f}dW04a36zlv;i3FnW_RMD%1 z{{i)E+8k4fepbsTCjHC4WAirnXkctm&(Rz3YWTc56PWkt#I`lLg zHA;Bt3G(>sl0Pj7S@I;wme?PVE5Ee_85H*m#xXE<&hAUV#CYF#4|S9CpY2^S>SIx#-0CX+h9#6IfWs?eR^W8ZeJa|zC_viCARM~-mLZnJ;HdG0fuUud5| z@&{hucCj&B??gS<{c!c=zQ2ig`5LI3SzY9uy9i3it`~#gmCtrNc#IED@-tXLBE~SO|pr0bY(|V%R zTV~!-f+$W$o6>CT>mH!vVSlD`)vM#(Dmzf$Q`{3o;Re=O#V zCSi&2t^}-X+VoT6l}c$_m#GJ%vQ2BN-2EzzjFzFikF{w~b^=32{PA;8RWx_fX}VFC?qGj?K65axPg_yLV=^d>@}>keOoIw{9{rs5Hs~2}V5f7fnygX20BV zM)mhb)qg-GE`!>iijxD^$xT1}V-Y#G0gg~2MM^>zorC1PO11JsRG0Zj&gc6aYDv%c zl}&5qQb`+AO)>Pvo@j2X7F$#2t0aApvYzbY(SZt(zv{u3552}1_)rCV)*vRSFv#Nd`I^w7F|D8o|BjrNXz(-_}99nZM#=O8+5%ub$T}z}<^GH+0Q^afVC6k}+oG?h+STJhX00b;?3QaVUp{${IzPn2;S34G}A6crA1UFLdZ%KKB4r}7&Ik$3y9gRM`ft$UQoE2 zpEzRb-A?hM@jW4lWhAPK7DaxEkyL)N-C}j*{;a}r*K#?a^kUPJ~J2ohA|d62x7Mjbe%2LB?-lQK-!}e{^??I0C2-E-_~N-T!Oe( z?tC=<^nr6ai2s_==t|$BI~GbEmY8%%y;_?@o@r|N<`?5mIV(tS?nj@&>3=cN`( z4T_4jR?rFhygMsu?dsdFenar+x-4E>Qw`+e`jx2_Uca+xt;25YCg$9>O5koxL=FnX zHolgiZhof*Lrj4dAEpxOrmu5Sc%8xHfZCZ6Fd~-M+b7u6Qe%=KUwA6514p3M_ ziQD#ro%eA(?q3li%a@BZRu2Abunw4-#uWJ+Ct?Z`x4HF~OIe)WjA~hUuGi`VOI{7C zi*VgYS=o6th$%U>v^v=A(a2HLb)i?Q&`JxvO}89Nbz>eJIO zmCKbo59(BdVk7DDXHE^)s>)}6WLE}P2bHgG=I2yaybxj$)h=zg9D@-}jZ2^Cb>T`v z45xI0*Nsm~;)Koocs{m4Ntwz)N#s(PuM7fm;(4tp9mcif`$R@LV^fhaYgF-jCl6S;_o-ow547U9o@VKK z8*_^s1THUDAs8=`vp@6q5`!zyyC1s0KHlsiit%n&u$FyiH2(dzJ6XaRIObkAwnA1p7d88S%_kS{3h%!d|5a&BXiAw4OOB4}wDT z(WZ2nRIR<&1*aQ7WYpy44HLV({n{f2?Y=Vfo8tuEMRG3qN>~53wM$Oviq7KHET@Zw z;q#@ZufAyHH6O7EBx0KP`g2a(7Y{g%bt1T3)1X%H*i~2eCp83g99oY~IXZ_6QfTkf zAs{zK=Q!iJZ|<&%z8Y=ZAW{vDs`Km6zfBA zr~~ChJ7FDm{(Gs4dPN>2EV}s(={@~f_l7_Pg`!KbeLZgCvrof=^U2Qrf zhj#Tzkt(BMo_uAGKZ{&Ca;{C!^my}ABb~iYLjLAk(-XDB`r}0i0$P&?LA*ki;(zcF zT4J~9X35~`D?;9zxZ!*BU+)#trA~Zz@|_wlWOdArYvae89|MjfZUP>#TjK94Z#8Dx z7$wRH-xnht3XI;RC+_-eb#k3t$YLdzwmc2a4rwhPXDI&MhY0^AVARm~<^CSwtEQ9V z)YjB#k>K8n;XHN2jdrk)mg6T4ny%t+lV2HCEw;oa!fGI zbf7Hz?Bc-2$NqTVFS0f4uI(Jiu@J%0y#pUFx_3NQgC@t%;Jr~rf|(l^T=&#cu8Pwu zg-Sdnt2p@zm6Hz3X}kh&4SN1Y&O$Ocl8_`d8w(#G4YU~yDh3Ubdci+hyu@xUp?7&R z-&xkzIZ3&t-h_95zIX*YlT?`v6PuIoitL%xrX6D|MDbXZzo;hfHtmC{(AIQLzb<#6 zV!uWvg)sT?!F=)gFh03$j?1o?{0wo7ZcPFCg`mT|YTje)s|8DiJS(uM#JUE_6S)ht z?rmWD;xrzp1J3l|fB=fiZy(4M?&VEF?)&|0>m!zf@-0UdfbcNR6&-ZxJgdK-Q)xOz zCDfg%Q6QWlb!A2wZ{H||YjMaHmoK7L`2}ok2N%PtGh5olbDVye^op;MQQ>xZcl+7 z2xjo85Z-`WKAdE~%k*J76C<+AW_LO8)cx8#5mIv@iqB>dwb~OIABnBBFyH=2hZ*z{ zT9?Y8ml&)D28LAfH9j^1>)%iQ_9yL9rE^_i6C8Adc^*t}Th+0gv7=Yiyz#tFh znRt2Gj~A`X@KJxU79T<_=vb$Fjv@~FTBRC-%zr#mdli2HtxQp0pLk!0+U<(JzoGjw zdF#abJM`HH>I?%T=;gJ)KZ0Xy{pfGQ1S5~AoxJwH9n?k0KOTALjfGxWfQ?{a@X=b- zfH7J9?+5kbACJ5xA^-aXO|kHet)0aFw}YxB{l_DNtrHOf7FDY1#A;bXhNEP*sefBz zuma4+*5(7H!|54#UmDq7?7bT~GeGaN!2M3qB%H*I!cOazs;Eu)O>a>Xs(-n0w0u13 zYnGs9(f8i(TAo`AUDcVcVrOOszh14e-MzK?`0&A})uVMhO$2J#{&}_6xAT>h3ekpb{k7Py> zJ?BT}1lFiuR9?IgWY5X>lT9z1#}7Z2{ctay>u@*r;o)w)^nQn15EZ{|yLS0*4UFfC z)PFq~Wo%u;iryBffRXCc>jkGZP03sHRt&+T<$JM%vg{OXEGafr_6R%H#w0?_@JOZzC$m!TWG)6F4TZ3IO=sQmBVxc!nk!HZH~92 z>IVOV<+AbPUvg1GEhA-H>c}Ixn+K!fe9kjjb4c>M|GH&%Y>*W3%k^gQCw z6VVy!Yg&`5_pYQmhyDJ zT8*+9xL+-Q74Q4mA+DEB_eydNelxebVwE}coIyT{g1_X{EAhiaal|G1*PS$PSze|i zpSlNni3EG01=usiWNk02Cb2iF#HkVX;PcthC!iCUKxKb&S}qyYb~I9Y-g92vs`eZN zi_e>(07_$D8DjRFx*hBnzIn==O(2OD)d54PT6H9M-V?uPX8jeFP(7wI#Xu)%U&C(Q z`7nclV$k%iTedkO9n!sT-aG;?ll_{VXZ92t_z=Al)I}76*CTmJiwfWRJp)Z=LZOO( z|B06qN*N5Xag}4iG4~4??BxYaI&?c0VBbq6?_i>|Nyyl2OP_Ibuk)Pub*X4w_sh{^ z?(ZUWD|?O#9yMZLCACz`9C$g3_w-Es--o(g2qM-q3lUoTf*{pugluIndPWOXdw3i7 z+bH`(e9n&5qtEAlP}ybjeE7Vg$H9xuilA5*E$$*`AmdG2p8Eq~{Tt7;#pou$7%;q; z&J4Ar?KQp`<{EkPFy_yr0V<= zdW6?BNNSaAM|S3gtExmZv<=d?{|*LNrccE zNERpzLWsY;tU*M_cY58^r7xYikNfADMWB9)KK$s}x9c28v{zbBepL-??@F4do!?zN ze50z8{$F$7zes*x-NGLTW$jb21s}qUCEImMEX)5F-|g!gkJJ<1AD$_zKApZlw>ny_ z1&v~%JOJ$(?skMpDXxy6`l+ge*FYCZW7%!z+s89WQFB@UaK6^yefpawc69T5R1XUq ze1)ilevjF&u|KqJZ`F{^gn>iw&@jH*@+f!SQtoi zY<@YhJP1kAIb01L0&;Czr_I z?2tJ`?yha;zJ2q^FQ~G$*y1p2D_?mT0;gl%{Ndj^&}l$~*7@s!XNDSOISQQZd^IX& zGJIII?zR5Q!R|N9EC%>OPFa9aPBsDIA|I1B$* zDiCQ+n0cT^?)t~%>BfvRlQnx5Dr1E7mdZf3!qrLdx|g|pM8^gRZs)jFJ`{N(y`>SB z(l#6!6nhwvSSQL2>0f;abaQ?K7T1~UGj@(iH8D(dE^)s$yZzv#+3k48Q)~JH=6`&H zaRO(X>S0U>mg$*`vXOEYKm*^;0C+#45;VUm_V2eXu&c;L7wcrYu&-?G_YZhcPk?pD zn36xYGtV&__qTYnU^PinryPO~cd1k z9*-){XZHzGLvyf8MarKeU!JWdKM={O-ga=Uymgshwk>xuo$L#DavV$Vz*dTq7e3< zMYh@5xaNb;2-1YzerJL|xr#b11Zb45%W}FbKj-}It!#YcLt?y`Uo;0o@((1u2Qd$w z*Xj_T;zN(hmP6>)09rTQ>h-v;ZLIQ3f7u&@Mz$yb=|zT8DM~NraypJ(u`AqsvdM>b zB5zpz;R+C0w?>u=*^XuGL?xU52&NP^f!QOibfm(HM7w=)-$0R$QFB&BCGFQB>yjVE z?c$bn3*8#Rlq3-;!vc>V#F>>t>Aif~&imU|%~i8`lY@pPf|Pez1SfcC5^f zS1yTn1^S|pH@Z0QBmf;YyeB^QayN1Lk|(dnBXX59;5PfaRVTTwV-r+$;`4zs6S7EhV`>z?5(SGX3T@H`n-oIEN7FS*EK|AFXd0tM3~Xjfk4mb( zz8g2;xhc8RF^ca6*UNAS^U^)edX?@Lot~uK+`T=IE=y?^r?h;IOby zgm_6{3%)7Qtb(}gx^!@v4)qJ%J{ROa7Ec>1NYL@b*j?~}yj7{>+ko|r;+68K`|7I_ zW`+(w-v>8HEhRrj1iQeKZcj$liiz-Cr*xxAEAu>c?J3whT#6dal#;!|KUU?=NZaVT zN20GIOF4^!xY(avfaTYb`oO<;A(H6Jm-#FkL)M!b*kW(}CaR29Zj>RcV};D@jt}bK zPKy`to#l)V0wjzP*>xX^Bxcx?CdhH0+E->)qEI9Fz^%g|EzI!$9QOr$(`2X<&22XS z?4E>@PddkaY7iEiy;VSeVwq;vA$o%4rIT_R3A&#n4`Cj3L%qbdLbyaT?4Kqgjt-9x zPu~a7(D+h{!D%xNTm+OtCurTY{T{D5EE}zk${tGx`^W$Ym>?}2s`8UN?E=1r72RkA z;cCT}WruWSD=F^JTNZTP0&+@l8!jQzy>1!@l;)a>)=Ga}SYuHT& zlM;{by5V$?hQ6dH{|cXqnVgu|jjfi2z^BPT z>VUG?Qt)M;ZyuZp1YYs&F=bz0XnS_LQbmH`Ps?z(;G{r1==%OdSbeyEINNB^DyHvW zVKSXoKAwzf9|dID+mm|fTn^Yv*@s(*;zSz`8h&?B^nF@U4D@!0-@x4wbx+K}9Q+jnC(>%x9>h#bw&xA8_RKs zZU2Cc$xikrgJ_;L`I9mhu6xtIRAQl*#Jn{t?+2O>l2!$=Y?FwveN0$#?V3>zTjzgr z`^B{&6Ef?CSQE|4(ZTdCbewp^;qmh-lJhk)t7gRzjB)0Vm|6P*{vf4&>wsyfBtJ!D z?L!8?Z8dE2sSNJn%py)M4RX81eC`j8{M-AQi49?$PaOPk+e3?_-l8y_&qsEHi4rF) zk!%LFp9GF!VY5bAlXOBYj?jGTNMSz5aTQ4U*j|Mi?puv;f6_~!|L_M zG?g^sfd}7Ru0{3zb`r`zL+ns+2VEa2xnFRM?D8j@tvN*hoke&OUMy_8pn-T(`hBK+ z=;GBNuS~11l5xL&rzozzXx_D=cElC#F}N}j-OhabsI<^3q2;Pk|NGuJe!J21FQVat zbhYu{qe$3oHkaYf-lBJm`jTl4d^_-RtUg)PB#Pa3Ub7EGBOVjM_IS(TLqV~pTZ3eO z6Ro6To#!0f`iAzBZ$la%KFcCg9wsFp0x=mOo=0;M+vFh85Xzj|sWdqX4Q_I4GoG^6 zDy@&_|1gE_1Pg{0nj*NJ<;KE3s+Q2r%SI&TutOZ|cYVySXF#5HVb(PSmWMT>Rw(p` zb>(uxHwc%zJK95V1k@Av=3q{Ct6pw1>@V&~{}Orr!VgMyhnHQ@H^7!ZjAXW1?~JUU zCfd=nq9l>(PlG#5c4{|-L8X5}QSdpZ$#JRohd2uwNa)2zdczP6&dDwBLCRN~KjcbN zBr@>T0vQTk|D1m>?0PS(vEUlt*PItrY2g}-e{7c2Z-NyVy&nG39~fxR9cHx}nqWJh z#?P$EDwnX{0O;l6;1}`gxM{}pOqiSzr*65U3q8becsMBbfc{jAcgMw{5jZfk2PVobm2 za~}>&7DYTkMxG^kQoPw0IxhL9PhvQuje_ z$CgWq`FbsjCqaJ2l(l3HdFjrmtjZfZEC}S8?+ZZ8omVEK%(3tj9bMB932FS!OZlpd zGz#gb-sl5jt)AZD34P<0l>65hYz}vM`+4^^Bm6Tbt@mxA-y|t5LL`KDc76p!%6>9v z`j+f+TVktZh_OEl=QfM`@Ade(n%bWJfJ@FoPl9~cvO1@I8~bv^lJQuc35(Dg9$(iX z3yGvY7&DUmMXYD3Fcv=I*P7lr-Au>1w|ZRKnFhZLY_L=?>mL22OfE9WM;J{5T|{lr zBR2{`hpvNyT)?ducgTpg+!_1>Bzb}97a=m;=*v~WZM^&${(?jHaYyov?h!|%NDY_M zF)K16$wR)pZ*JaFb9x>Pw1*$Z z-H987Lkkc?f0VC6?NMw#YBKh^mt(_Op{jJG_}EL8?r-A4j)kJE6c1TFBFrNN><0$m z@iOp)#^IvF_of4Uu*(wih7cy_i;}@AnHxT1lB$%RX^Z58I(M~20SA>C^_+gDlas$Y zbg$%I+mi$U5^hF`kQ_%sS>^i$_g~NWz~j+QdcC4I?>9Y+rvr(Qi+>Xo;~JV|f-&G7 zlkmM3ZzdticZIh_2e*D@z15$WF6)@JF_U+D|9cuS>?)j_o?e<4^5p)u6VP@aV?=>| z&R~#x&;Zk)y$mopGG0nh#lV;v+tvkqv3iHXS_9s+8B%MU{XsSj7>|)OJwkV*xIYtqd}9sV3pM!^!@%H|m3}oJ zh{6ej-4}-BZn{)F`?RMz*0EkmC9126Ok(q;g?PeY>5qf0oneWX@@z8dvG4MFRK*I!UnkTjX~L+?7WzaXXm z30;KK|BpvrUdH|lzxto?VSmT^QSZc%%KgV9fO1RtCmZx1eAs^v>Mi#_9{K;2q=OHv z439??%v(kPoSM75eC^Gv*kn43vGY{ zZmR)tl2x30tw3BB1VKsfF1;0Guo_nAu;P$`qOzGxOtFG)a`L4pL|gUs`Ks!f=dWHXJ3Ia4%FfH* z_U%XJKh)6RT#9pB;?H0s(<*)*!RWCQaEm8-Gb~=jm_a@+4Clo*A9v_MM@lRA>Bbgg zCcDc1F_j*>>n?dwLlXkFBbWtgizpjNN8zu{8be-mzpe&dBXiJ#LKA_$_$xcYKs|d* zvDNH#Z|Rr5n2*2;0k1u`fvDs3#Hc6R-Epg1?^#FT!tk0Hn!?-YCV6Q6gZtg@o{u|n z!@HxjZ{!EmA;lU7vrBVrQp`DGDB8oTw8{8d(9%+M^zAHx7k~gPgNP!l&RIM<F>jN zAi#k)`_oq|6m(jfph=>IZVp`s5N=@P$31LM^HD!^jPPhgIwVo-qRqZ-k?MWWHsn>` z*Jk83E&2;2?uzi>GdP{I+a4(?ME#~=TJcC=bNt|F2u?~o$zH$A-;xQ-1z5Ah(&^UX zJVfWt^B~b8z(_ z?)KzErI0cDOPzU+fqOpZR4IEBR*>G&=4q6OyXZqQ-WB$}Rd*9o9?M9fud+3HPEG2e z8&biM`hCfp?d8I>^A;$!6<4dw)*xBe*m8kXp3>cUzfZEsj{at-20e^T#c}nhuVP*Q zc*be-h1_qDF9P=Y2Jc||1WvjAem1}TZ#jLn#;RjRk0X;ur_T6|MycY1@JD)NzDZ}$ zh};cp_`%KlYMHzxmcstz9lR3@eJ0k)O&v4DiJieky|?kNQn9l=^PH-`o5AqKW;#`> zeHaFfR}D)GmQ;`qqAO4Xn8oKl2zV_xYX>Wb57FW{$1E+;|;>W4W*3ACq z+JTcmzPvdfc?gCW!l#KRbMjz_(iC@rgrUrGR#VxAg`+)x7LwJd`nRRb`*`I%0fvtu z-b<|5{MrNUp*$5Upw|HjEBW(HmjQzow{HSgkhX(L=)>9XqNk;J0j=*s8}-h9#qsZI z&00$WeDk#a*a_=LqaR@>oO=#I$SEu(8hxF$0lxadXvk0(J=PQDHp ze5w6nwrbdeNaqdEjFcfqImaWcz7 zq9rrh;0d_ya4lFv4omA8G|<5IdZ6^nE$h!i=?{2N1nL>3K(0cJ**Kt>D)IJ>HYJ&i zRB_d4{`a4S=6y7_fizSB`DPG+7F5jab9@vtw(|)_lO;8m@;SfZlRwQG)LO|pd}4YQ z#Rf5hBq58#T4^TgYB{Jp56pfgeBhPDZN9AWgvkBicu@ipJrHKS1sDKTe;IeE#p^nQ zCWivpyR*>^RG%h07wHn+w`aP0Aqe)zWItmz0vL=4fs?(ropbs!TgUZfpAnsE0zpXQ zOM0Kq`Cds%G1Kls3tRHR$9MaR3(HB*+=TkUMRyW~yKq^5d>0>k(8?Fs=L&!z)bX?tE z5383$KD)#B+DD^GzY_X@i2{w?)UkiZ;j211sFv>-Ta)_f1q3~J$<}6Kf*D2r*B2Kc z``5U7Ojx+u#>`AEQJ|Rb)sbV+bSI4UC6((@+KjW9Utp2hg)MYUCT8{Zb5WqJB zFJk6fN;>g=(hunr>z~2Va~xQ=0gkje&2X`MiQzH0wa?IU%+0Xx5?X#S>d&&*CL{E* z$yHL?1AQ=nNojq}AVC8^p!D=8do^>A@AM-Zk3|E<@T}aUjxB@X42XJku5f~wjcfAs ze;r6;P;=fhiy~0I3PD%~kJSCf-L+(z>i%9n_d!oMEECyf7owVU2AjS=OR1`3|8<4W zP&gp|XghCa!1H%c#@yztSw{AN<;ZUV!Y2R(xt<}py?jfDF8Rhgw};IzbgIo~qVq-k zg~PYI%uhNvIukiw6*54phWOHq(zDJF@^`+7u+e*UVM}FZ9LdyLbPA_=QXR zj{BTC;ny^dIEBc>`!_nd7Z>b6#@x$39CSd3A#&!Hk*mPHrkBgeJ`9r9I-zBH0j4c< zdKexyeKI#lOsLhd6!n})$knb>s7ov zWL$yT^Lw6dzm`RQL|wK`)GS2)V-RjwK>)9nj5=}~Ej!GD2G-*cqnfm6CTP^Q=&ubXMoSNMA0GSFcDE&6Q!DH%bU(R5+TFS zgT*V4rb2HCOVZr<`x;{z%>u4IicYFMGN<2MR*0>@aui=h!#VMFBFYKEC>2NJx2S&t zH}@}(_FpmxEXeGUR$D=N$b17^0ukFkk%;f;kIlYKY7(YiwqH!U!*14qgf~AgPs$~8s(OL z8Wq3q7aU|{88-%r&9z1%)mTHa8ss&jt1G&h7F+tX(1dQnjWhf#0tOsD?u860c2R6RBV zQ%C@*b!{jtr|eM*+N3GnJBu2wt_(Z=EPOp!YgP~GPMW8-%ljHh{Oe8$;HOaO(*T1l zX~=E@d=#Ux%R-*l5ZcrvJU<`WU=i}Y^K21s)|?;_$Ufo*o?#nlLB#Y|gBqK)F-PN0 zSGr6a&aO0BJv(GSZ-2xi`G34TK-%EgxQ9orM;O#z6gY3`+5yg2Mdw&&Di2SCb2{tm znr0E5WYGP=(r@HgL5h-|#({(1RQ>89VF)HnI6$#m=U5Nr;;X1$6m2@;bMl9rrBQzN zKZ`c$^xVn@&599O!=`;YdVAccMP7peMZt(rXOFean|)B9cYu;YnY-(}F# z&^WdLAee{r%fn%m(j#Wk4t2J!~P!=pfhy1;s6%7JwNi<+tiz{(hH4{j*99 z4c@n6i*Z&CwP**OHjsm>Su|AhxJyb?vvBDJ@t2xYtzr4dmcyn1}~|SzKjuy&t48ucoG(yY!PDga3?YZmCyb-8>11e^|$&Q``?S zant&5$iU^IF5y*63pk!gPIb(VBuRBdmTjp;08;s(m;Ji$m8F%d> zGnJ`>XMzTEgaxKsW8zBRAuW?bQ9=TRz?tQAZSSrhR|Gu$r4QA3yp{uqt6?jFbva2( z-J>&kDycaUz8|Z&=%nP2#u4mwESePpHXSZ8QRDzp1yKLJ4UenGlVdZL{GD&Xw8CBO!W1u=O zPv3;4sIqFUI3Pu+^Qu0G@XC4Ip0t}Oq7txguwUpMCVkMEY&tAn$2vb=bsV?@t3z?e zEV@Tuprf!VhevNevyC2T&6@!~UbdX=DZ&zqwg^=;VA3)6@E9Avqyd-9DajX=Q%ouw z<|Xbx*gcQ!vPYp099S7Npz`T_^oC1?`)XJ_eNh%_I>r9n*-WWkV!U&a?ay)HSADG$ z3OrAlGbD{IK!QOcv|~{^>_Gw9HXkMh2V6fpryrspn8a-{)*d71SO@sM4uP-D{SS6wi`xsJc7R=5I0&E5&~@Tnpr*z=1W+PzIE>p)n9hNLV*!_m(~>o7 z!qH;%>s&71yA9`%-8IGd{@4vb=4$RKsG)^>iBV>BP6JwCB)vsFJy)8`d_*AcVTNuA zeXj8eK7=Jv>>WHplxtDgwL0EbolHIo8p%#8SOZ_a=&o&Cu;8nP+#DigfjdvaP(=(> zfiW+Q+jKv@;AK#irU{N%*i*tLf3>+4@{)ekJX*04=m#P~!zN_c&Xch)kP$1}YTVU$ z7K$<5KBMN1Q{3ZVZ!C8lObTrK8tQjbA~RPKZUIgLv#~+ml`vSqQ2#K54M7cKLlDX82$A{yL{ac+MW1miY9v_H7TA$O1onqF}8eB$vO?ZUx zcivK$G@Bh4jjw{I_t41d=xY6gQlAO^Oh6SF+$-}k5rHXl%erDXF+6R+QHXFtClh9& zS-5;7E$rpJKK*>#Y8N>TS20R=TtpMMy%Ip@fvQ(xIY(He3w9PuJF?y}X9DU8Q0Kpz zBxpF5Gi_8Zk?#YjKZFF+B}R_;PTOb8;_;P%mXUH3Q4X494bRF~_B>+gBzFZ2LnK8< zHHq?bzk3Ac=cZ;8ZEk&Czo&ga*z$8r(cKp~RC>o>Dyu$*P*`tg-q9dq&<5ZYic2W3 zNz<09#>W-;$xXNoa=<&J16$i=Zuz{wCVJ%FXF!PZ{}W!EE9FnIeD((6{^nM|aNr`3 z?5_x0mR%$VAV^6=sA~_j?2{DB_V1!gOq)L>N~?fPQ47Q;F`U1lL&WDc69c`TfA~Hd zFW}f-Gg-~y7qcHk)+@neb3udTm4JB&iPYq@z(mNNPB1|T$(;k}!l>;tUn8v&irj`P z2BFGesa6$E*9YZ|$MId(lIrJcbStrmXXEn=CO&=#aWcs9&C{YuNkes4sO}-w;%g5P3UUvz~q3VYvN+gy7Ep;!S-ZoKiZOwaTi{VN#Qx zxk_MB4aW)osiI&!E6}8&MDw6UM$EO4)JT67UH-s z*1sAeA!@W24NMGUvGc8iwG{k^`M7-anLRlM<5dfC-+#&WiwCt#^SF=)qR#c_`_9i_ zc%CqSm-wizwdZqmjthlKuozu?yN4ZI=;4fGy4#&~ODRmdQT~>7Z|`q2-yw;+s?+Jj z#jSoqRRok;q}DoN{+ZYWWvSf5bd5+3!yhdWy!}YP#{wsWN1%oYB)|h558se821RbD zrLo`aH9{6Bru9KOGaE=I;c;l=Ir(sK^vUgaz18AoS`QL<1_QL%F#UWUxWxG4RfF)F z8^uTuY?>!#%Sb#ZPD6lVu8>5w9M%FqRMlf3vteo&z*~P5kdO^m9}obKG=i7WyC;TYL z&CB+ofZt&LuZNzs_x`G2W7xj>MlSB~dh$?J;lT9eX6A{`4&vr%8c>FLpLx~b_?=GE zv~0LUkJaEa_29%NmP^8Oal&6hqhMD_mX?N8RUI?)3^P=PB@=ov8#iwu=^CTCAdo;b zrsHM14XP^pP2yqHdbj@~pCdwkIsUA^sO!8UZ-?Tvbndyxwp+gkDg8%8Hyx`CcSNB@iS7bE?|E7rjiCR6-o=)$IR#747CX}%XDZgGiGGptDk)(4aW%1O zLIVQ&k`Ra7JRMVANuGCaf4UmKXX&RKx|N<$%?T_IPad$J1r1liipYNM=)iVL%$Dw< z#41O(lG|3Uf24CB`()l^h~`-iR=^W%@{%c)E&S5nf)&{h~!Ff2y}?&*l6vZULoFz5x_fYU~$+fCHxi-7E+Xx%c~!?y)?ubD08YZ|dpf-)b=x4hD124=Vv@_oKzd zjX`N*{F{&w+pB!^h6|&-Llq|Jc8C*Z$4wmgZ5WI{Cy>SA9v);VPh7|MD%5>tk@L33 zw9(TGrRy&MbXbq3`sL8-Qh%u8`_GE5A4XGlen)o0yI5-fQ6Slw)}t<$%66Qoca!hC0-nLr*ST+}CJHdX^vefzoq3g89QE z+CJDl)$mn@MvzKDFp?zH(3fjt|3-sGbo$o)e#WI46AF>DQA$vPOX+0A(;J&w?t*Ga zsaI#m4?lzfxxJVXxr zN0gMJy0asP>gJmwal)>28z)VNk&9{#-)SM4@bT#Nahfs{9gxPLWKPUBmVe=5=u+tG zKaV=_0zfI{d37gDyk-&)E!^l*kbi45!Q#{q{GFXbEf>1v^*;(n|E$qeB18qWtr2B> zrqe0HXr9{Z=+COrr&G;eT<6A5j)`TkF5?%OVT5Z}I*dP8(|riGlp~n(xJ6)o(ki*E~N zlWm|p@~#9TR_7tadY;GQA9B};tBl3Ds3b&1+W4D!8w%5~)EskbVgF$M(OC-Ntc=Q8xD|SH# zN*+YEaBh2!4D&cxLCfw-Fl@uwCZxH&>8KOkGWugP?flck zQpe_itAf-G5j|5pXT!N=4R;3U(8mC7)6JNeMy))3cf(BclwBl)T*_h#?_$32My2a` zk{!X> zZlZ5BPXuVjLGeo)A?|++uIsXo!cIZ?T@UT=%ZRcq<0z4zmHl?ydfW9en{dm zF6qtz+JQ)r{# zScbo`EC!}e=S_QZPCLb=6FYKb*c%jxt>Jb^tZ_2s>8GdpCvSaNU0SslU2!ShL*^b; z&jm}#7q(w7x0!};8ZY-23NqlBHXB9vf}D7>*!T}m^u(}9i$YB}cJ90)jPOAk?cLM~ zd!TWH{f^#k`o6{j)%Of?KdaV}x>cYsBTT^wfxADrIQ^?0;<#5NTY4wpbO~a`@Kaky z#oX5^7!zY(=5Og+Qdcd;ZJ6>yv@A}h=N0Lzb`aCa&oc9%Kd3RKB!1a!p=ffD^&+&D z-Pro2iWt|f!9$=8mh!{YM%MYF*zL~V`DD6lZGiXd=i_E>;08`6oVV-o%G*nNFB*G7 zspWqX;976zJvYSuS`TqM`Ccza<}O6$`}*fh(Yx_fVb>r{Zh-diGuf`j3VIfp`THVP z=OE#yvF{pnOBZA_Qf^+^0B38{ZgPtC{>aPAetPFoeW+C+g~Y1kHM#@^VU_*2%?gN_4|1Zp4J;K7XaY6n)MDFslfC&f4WrstlFe`NWY znsZCKB=SqMDE`>xp6;H3|e$-QOvagasr6c`jEP> zf01kXU3r75jdfTSGVg0?ZkCS%xwXwD@h~>x#Z`$YOXs7<#$VwuqWn4E-lZ+0-ACve z_osFqs};wkK`ft`-^iD$>8e{mB0f)%zHz%v@@0k1d&_KCMjvDxeOTeDLp=TdKiGTk zs3y1Oe-tZXfpb7brRf1dLBK+x-rx7GyY5}TzK1F2c+qp7!yy`{ z3G3^hP{=7TC`bQWmV1e!q5EcIyy{q?!-n@Z(jap!K)NRr7m@SDBv>ouY0c)Sji|pHoKE*2u^x$8p*5oUPcd^KlC(6V!I}`i<#cuc`0-r{r(b@6rW@F zkU-u;GN&g59CqajJ!M!%^-nO`a%-UA`$d~tgDbx%A{e1VY|x%~Zr!P0 zYck5Hd~^cF$3Jz$ZtbRMU5)M&9Ijl!u+M2Ni9`A?!)#Mz&RBi4IWK&2a)U)yXgnq} zjVOnF@v|%^78X;$_|C~p{wZfSy2IIFyNE4;l%yt|B=r1lli+tCkKK>(R}&BkRxowK zqy7iJx>dMyXQLHG-D0EX=`gff-X`|7DmBa^7nmCFk(){K!tpK4t4%g;#PW_esgn*H z?B4wK!>yho&ShVBhYT>KSlFzEw2y?Nf#O7VOQ+l|iixrhoKR$CRDf+f&!U{8yS6#t zl_GEqS)p&qa$?pqsxI1XU-#y#(K4YfpIkAU17s6$1oSTuD<1`G}?_qt@_QWM4=32E2ciaK#UXnkT8g@ZcI@=1!G;)!+ zsZT@gQW8=mm6-EX;PuSlytyBCdCVsE4D83$S?_}u9s2r58%z8-u^Um}%OA?{VGN6{ zH9i7r=lM0jQg~=5U~P4VF5@9^%nm;B`Hdso^3zD|_MO$v5lyv&!e+VarRqP6KhR#W z)-PqhZ|7Y$6#IeGMHT6YVnml>$>B~m=UvK5Ef5yYqZ$V6_W(3`;2h1O*)1(EiDWld zMeIdohO2$8Q%`r?A7A}`X|aUHyX-$Y3Og6ZV@e3ovN?BV+ULiP4|#Pf1ORppNjnK- zq<}M@!7Ze=?45rVM+1iG}cI?lr z)tTm>9jx*{4;A_WK*srTwlh%vr&r}Jb-`xJn+H~gcY&e+oZSc@2E)YwSiG;R+uArL z&UJ5vuWhXO+Lki)^$XYlwH(>7^PkUZu+g=$3qKj{vs%la`pPZKpdA_l;dCb~qc(w{ z3AyHIh3}>@{)HIR(e&RS)m7q5(V0h7RR4r9mgFgQkD=|hewgBV05?ltHQ0u`iCG-` zJOzL)zRvQdsM#mx)1}&2uW1LnMa*@4y6#nb8QTMdo7Vw{X_Xi~z33(J$C#fh5Y{-b z@(oZM9C#qE)P#kuqpXk<&=dY)cShbswp=JeKFg$Z%2oH^jzr;-Z-!0pburs#(*_BspxTL^p>s<~75(1!?nd`i>x=Y1Qm#zS~);a$7cMs!nazd_f zj%?esAyRZVuAgRJEu~wu_^F7}SD7geZoA=8XMFW(pWq4IKB4Sr6b2yOd;2HwdyaXB zOKNcbfpiz>&!Kz1;=j^X!ksP@Z$3Hd;n1)caDMURcx+yUY**(TnqQs5kyL-D>J$gi z9emx=_MC2Epbu{QAf4{t=2|#ZXsA9<>7D@{kUqhcQR$zFe?%iRTGayY{?dK;fD&0db)u>w83LTdGO+UON-7QJ!UV-VX59-!!)Q&9@Yml_23`RN&Lv79jloD7z^@W;$N>>momnYQLpB>7%FRl?#ksR`AFi z&z3GhEsAI7X%b)siEWlxTVnus?euoZi?p%PjfE#m8Q%PJO#bB!aW9E{6|8rg z-nNh)8{K;!R~OXT0ExmY-s7&zVz&M1n5vF2gfNCw`}}YoQI$nMFQb9Lsx!)Fyqt!S zA^*{)Kn?eC#2(MxACrQ&6TOz@@b0P{mgk6CfL=gZ_eU+>cnzTX zlT9+1Gt3Xk9N9VGcF)L6a74Lafz{3N7;2Y?GO}#lTDRg3!)nJWqIrY?%cJ!dqQRqk zm$J2d0O({GVRc@6%ZF6*p|ns*;i}lB`oyoLF)sy&4z=+?5{kSZpW42*f1u;(Q^{6C z{(_nt+wSUG9xHvc28Y9OG#+YC8(*a;39mTu2Lb)r+;>?ov_s1hE&RhKBt~YH+G#pycHx8k$f) zP2v4jwyEd<27$D2WV|Z3v%cRCskdNLm+MT52@bPzAUKG?UhwsF%a>x|m_;2GdrQB* z^iU}U{lrXJkVb`e>OILSE1r&PEmCF*f#RTVVR0-q(k9KeS)i=V@PTK3Q@MF|eEry!VMny)bb1%T z?U`#kgR*5h$*uzvQ6*M((VVA4cjw&qKK)rP>Ae>@@bP``gX$k|W%IPsjqUQBSOtQx zMnAEMiCa2l>m>!6f$%Norl1WFTz-pU&OWxW9buxUXBI6XNu5%WX1+239^Wt4Y=JIU zeE_=1HR4&JnKcSlDOLIaQL)eF**e(A`tXDEXkH52?f2wZSiKDMUgE;#v^*_;AtzQG zR<^#&SYm}CgIH8(g44aryZ1)c6k-=YF}p--CO%J&9joV6oA*-ECglicDM;4&6_s{h z*L7Xe^;3r1Er830KOIxl6=o=I|Lsq7C`*#qMsJkC?uweX`mlKz>a2*%jTt;(DNuEm zI@l>H+D|J&XU^v!B`k(N2De)fe15gfC5RCq`b%NN{KHPSZU{$FPoHBTdtUKu3be)@ZHE$lgK-!B9w ztjcel{|;C=dag?cEAc3sO`H`ZHmHPdvZ=_Dr13w;17ei$Ba6WCK`TpRMl{lDG^N zh;!-Wtd_jtbiCBsPl+r^l_a$i$8hLO+0Jwl)@TH~zg&as;Jh32zyuM7@K}I~fo|*e zZaAaRE-lERJ4qD1VHp|%lX>dLZqcXm*It^|{<8RZ7_F4Eq806>POs$GoC{*oTUkks zCf~p?xOEM{>%hol8@3OI2o+sqmudAM%EbOZ67dG@tkeJQWEUy_vkb!WwKk~wL7X)4OtyU9I^S4C~vXFYPX9f={o z#tZskjh3*5W490RFzI_Z?E@+AL93MqEFSALT@M!G3aUaL$2DVeavxAkw92_E! z^EqGn8x8jfVSUzpHK}@^t;_QW=8@+|<0d`}+8`UByz^4az3#m#y27B11M$KK1JdU@ zii|v01heW4oL8bV#7Ju1eRmn*Oh{DOsP}e&yN1jq6(#-@UDZ4u2@X%{*J4@RXF~fe z6<-$IQlL3gy+Ffz+a_865(2e_FkEBLVEA0#h?2QlU_WdbL!?L=fvzJ-qq(S@?=TwY zc59*8cA+I>_DQy&P;G>3*{H2XN<0HI&6&}KD>C_0q0+pXvFm!nC_0x6omhAAXG*z% z6nd(np`ca(_IRokDoGM+wbEG&N{4yR2fCNPQtucQ>gCBubUpq0yg`;~(iKv2aZ6GU z9db7Gs*88zkjfk*UXf<5=QcNUFLDPKZsci)T~e^*w$EH_O&cLhf-Tz$MDPZ=s=to z%Tq_mJ&o_I*AiiwjbwEa&*Q z_c7gAEX{fMejc-BC&V)Jl4e=}D^$WewU9J0(5Xx;_n$TO*cnf9CybJYg(05&Qkem4 z-VZ_7y1zW&s>{?N8v)b4dn9hCEQcFwSh;VD2sEY-$d*!I-{I~7;lN9y--7OtbShK%rNf>6$f(YuNEYPVH3H1~#zV%4EocI<$ z4*tSJ#!&O9;j{<$ZN1=zP>4rOMn7xQt6o-jh*s; z^3CHHC_gU0KNKW~9tK}O;6P{!=_r5C|2UMIhY{*j=f58jn{wmvlcS|b`Jd{}xueb= z{y1|?V9JmGe&iOV!pDEfMNw1#<*xt#>*QPf*jRTO3rakVAYS(oN!WTg+`IOo%!7*CD z^po;*GHVlk(A~@W>)Id1d#)WV}i6sAocy=-GUdc|pdJ>s{e|B--jxm%n9F^xz1 z5DYvIUpKt`?#|WX2j_E-M09fQ7|FF6CAcJan4}=4S{yh_C~~;aK6I$KCwk;eROnEY zz*{P3HhPxwqs!0fNrQu+u)_q>QMEwYru#yLH1MM@J_xZXWxPmvVczv8TK!1R{wdP= zEWbR5AV-m-RI5)PbcPxhhlIF21Hf;(}WxuN{{0{TQHy~ zM+Q?}{u~o?$%9_waL5X;ki@O;Rg~*gkI|MQbs+&yUmZ2oI>5?Fe+Ibz2W``1AwF)g zqZe)>mtWN#c6gEoY(#r>k*Z9pY%hYs=a28Kf5SE_$(bECaz`ZMuwcONIT4|f6^%cS zMt%O1*{ef3tDXDt;#eb>htSATu6;{++19Kk2UHFMhI8j;j31>3zKcl09Z1BFLn*9& zUsBvv%-9IHPW8A7;0(BX?z!VudTTnG!Q&#v28TCAn?OM+wg%B|M+Wf8p^>%nwG2vw zR9Z+gor`8uxwS{LclmT=5QU$c5LSb1s+kOzE(}d`j8f_ccF*XHGF-7%58U}xsHwc z9oOYcq+piPW>QKIG8@{vDtFS>qjes7#AV*q@IN+@Z_y=xFSSK2XyxOw5IfYMVLp zh(}s!3KHMc+fqI6jB2?mqT~;`PYBe3n-KVkke!Edd*9pV-{$bkGc0@FtDbvnk;Y|S z|7U?Gi6M(mufiKIjE<-nBrh)78Uy{6}|_ zQeX{NcVMP;@qOs_hAL=OuME6XvmM|SAmXBpIJj3mHTD&K*TV362$QsET!rO3O=_wj zzOcNUTH@Ee)B*F}HlII*uI@mwS zL2mu06HfvdU0EUQ`6qQ-{Vw5F7Yy$Dt%0j~V*s+>Zk2W;39JTRDJdQOE{qi0$n`Lp zVS^LcJg4Qdj7p;nL`c7wQi*$Oh=e^3S|(5P_1`8J62Lrd5fjh5L!DU+b)ue?Y)~c7 zUk)DH%8x&uuQxVo8*FA&uZF&5#SfYgE}t>Sg4{)R$i#yY(M)TQ$VTscXFr=5_*Q(@ z?7d*`V)ElTuL854KeNmhT_$S?5LNry(v^<+@9GQ*NE^|Or3VgbbU1CjnA0siuh|oj zjP*nKKD;a9-WW4!S!sS8NlVq2`toP9#putYg~AYzTx&f2Sjet+BatD>IWnW>=X?%@Vb`0A|+(E$Z( zC<~HnDfS{&?!xBj7A89vsRoDsjY#;^RuZ~IUFCi=BvFaAAYuz>(X^=Y4an&g<-5vXYaC!@(_pLg|8Xo_^0OTStn}evfz&f ztSaDOHxs|9gbOX=;AJHF$qK#~kHH&MI@?IxoB4ffPQ*n}Kw-^t(Dk;8pG@GBPODT= zk#!cm;#u}A5G!E6PrM81uKs$|V`|s+lG?v~m!cjQy#)y`IMan%B>HrS`g>7d3^per`rKZ;z>G(h(bKnU-+rjMAakN#S?b_MVgyQiYLw{M=vhj93;U0D$(^BeeW)T2meo(gChJ-@y>8it6Pe@itEl;Ze+uzS0 z&GMw}7r$pH>0yYY%P?jmH^=swJgHB0j;HQEImbxs@l-~R;Dx@ z(IXe)m_dK0w!71Zt9o+4YNhB#x$t6;cxugZ5)0zI2|mkeUUg`NcU+x2zTVzzWcKTv zF$3Iv*bMyYG>%z6?a_quaU9N-T~prmPHF%#SuOTI2e)?m%J|3j!&laS&Cg(k<=%zW z_gHbQgh`J`(nf*xby-}NJj@6zLRiL;cWvg#2W07o zYRfsI!b=W!1}ip7I7A@TUQk^YcmNWlCk)R+7U->3KD_ALrTNT!stj^uEVQ2J9JZ-{ zMfE%cs+jImdq76eIxl|o?z8z>7lSJ^lggo1+HsF@v6rJ~x=1H(R;HPCwUhAb-L0C3 zA5`s^ye1sFgrY6mG*s!WNMD5@wc?`If;WPmFVIw7S}&W<_Fotz6i|fXjq|@Td@Qh7 z%$Ouy-NIrOo=z3!E?FbysJRzuaZ`bGWW5@ z1J*+FpRTl_$}(D)(+_?~@0DoHl{qzwx_A~#9!`KE_(xaG^X?1$2p7MUs8%f%tZdybBysXH%Z>B;#@<^P$<%kWlA?$5_O7_?@2?>7@{^LC zDk)Rsej;s%&R@kdj0TR87^ACej9};Co%n<8NcWGRfy8tDWqAaMlD*}}fW3QV26+Wo z?j)K}h=fl61$jy7Mx%G@#PnwZ3c-?BsfvJAdx|EMd9Vz%Ic-JtIVOX;#pKcGgZ&@f zl_NQG?+6X(oYMiE+GU7hG}m67Rv+@gUf>5a7YguzHi4cCI%(%paWG>?cQ-F9xuBQ% zB(%DqkhD;(M>AcuZ5PYg=V>t&i(cnqZ2H02yTO_ug~%^ZelnE^oEXI)5)V3ePp_JH zr)l|A$Kqaxnzymr$!_bi#ZRM%-5pXu^IEc{2L@tYqv1EzV8t(2YW(tRVAll;GABK= z-bND=Gw%`q0dZP^wd)1v^)nOi{&N+KXm9&pqKY!>WGy)rY~%JHwL>ppW~7uJmN#hdrL! z_GEXb4Kv^Yt?v-3){tHh`@v6DHQySif&-J@r9Qxdf{YAHnuh9PT+0maHlTCO>6sS= z-{9KB8Z6m8Z;Pzj7e-J-^?!78ke`vNFG8>(<<&%h^xiuLj*F77W&62OI)U{I3H#uh zUFH`=@KRUHFuEx`vZ|=d5#UfNKH`NGJ+p_X zj*>mq@7Gg&LLfX)|Ci#k;KSln{7yYKiOIiXEGI{ER-Y>+L-a1((lfzVs*a7E_+McEXQ|A4NiRo=TcxaY!TXSh5AGk@JLkU^YL zQ-doCdpcv`$^-6V6{lPanO-CICng!&Y@UTBX>H*0_sa`&Ml(NgpOIwN0G)*R^cZbi zVbsKYn5YPMV#Oueg7)tUe(d~n+(2!=xkr{s^q2Y`@;Z&As^g4X%oqQUyY3Zv(4z#^5%faH(e}TB!jy z$v19psvBrax==Zlik1%1;a8J|)2h=^>0zSC?*pHo>0wc<@JK5jUMe94HqT?YxeL1*$xOZuqPWG+)??Cr(q}T7d zT^IWt@rG(5L{+Frpg`P2PcAF6)A?orWOt#&huq{15rNd_UDxrW)=fZ!p)FBi9zZzWp08f4K*gh-qK{VUfYIJsYln*p;~_w#~bN zDmgA65W(3xdfc1C@wwDjI*VvRK?SLQ>7g6zq&AX^HgeJT;p<4)lFuj2EcEFBzx%Lf z3xU_UK+w$mXDFK``yhFMDEYGyJP>}|KDJ)EFGsV}YA%!q=ZZKLMtDil(Utan?@L^P zvdjg_lJ7ayT*7|*!y;0jkEW+6BLILamjqhmc3M2kPY1Aw{S_MupYMyDW2|Kesa_4W zY@ClbVKjuQEF47ogw-tXSCT%C4lHK@RQ$;Kyc|(H_OLK8*2r+qR^KZ7aT*Qn8Sui6 z(4B<6U)&b;agDvm$QLz!&DN0G0*O2OHN<^^#Qgq&yy@C-;V7^T!!-c1j;Ci1lPYhu z!hf9`cU*koco4;y0LD1ga(HrxtUCS=qR5u8-M;O2;;|sG)Ou=93yJh-n&_*Qt)~{~ zcOH=W>w~lr z(Xb2{WM&&`qIl)3P&k8J%NtyYz`C4@#c+KEKw|k5gAxfu^I+YS%G?EDD`goPydJi# zEGaUOe;@&p=WywgIJl7odb6~p1iGo-QOaMyhZ|!_?HxKDkZ8ms8ZLGAj8kw7#Az|e z4;jo~)9+z8m3LZSs9{C;V2$g_oWvgm*Iwfa%1&o*n&GWPd<$aTA^YMEf7y(m_>sWz zj4}b2pW!kdZ|vK=V9*yyk!Suj6>pjbUYeIM?)I<#z;=UHoiR zhE;Sl(UWKay06~mvpad;g1o=naLd*5-R=)M?>`O2HVZ|rrzD<8oe>cfepgU4{*58` zY>ZIDEogn&_r}@}_$k6bKDqXdqX|ipHf$h&e4#AoH6wTFhMKsAt-xNJ+{$#3-dP=# zO&6Po$>Fv|gN3DjGq$Y1FuC|DDhtU1#A?VouQgs@ao{3uuXA0MpEGhsX_DA{Dq#r% zlwrqA{Gs~Z8mIN84I)l~3G?rC?6L8Y%e*gZ6#Vc_R6`gfpghDTs-1{sz7Z*xtvB?aLNSKNcTeZa&?z zxRKPvb1>*yDl##_Fhu~z(-;Fq$~T=hnsf%lTuN=JsjP(L@j%gciUv%0mGhEHx17BJ zectV35Lv5EvoQYt?d7W1rxL6~MJH2(oX(^Voo@O4sPJRtUr4}@_Zh4|@Y5o;#mRpV z%!7_}P))W@8U%R#=bQcS8(kWxjos-vvTT^deh?;R2G}1zv;P=z*}~911mnsZXY$wR zqg48&!|wEh9>#ArE(s^>P<_t)j~%hT+kNyMU)zDD^B;Sq#|}1Yq(e4Gd@Rdayk&M~ z>W6)H+yxE-BxgZ-)r))c?KaCH-n&GY=-W_BPyho6B>;8Y)Ud!Q14S3}va`8@{Tb71 zrnt(W0e(+#AVIxNO&P1p2{`1mf;5gN@uv2P`cduS>jLH}RkxxfdY*?LN^UYuv{iIm zv`uM2(67TiK8L`ABF^-J0nMj#rL&=JH}c6Kdqv@-yc^t^uT6Xo_L9VLW_yLF&c(iY zz?9_j=xCP$veaNA%boJIwnYR&igC-QDDaGpu+J6hkcFy?=|*9f@-+O|?_xND7LbBm z0i#kpk_7EnUm$7>LIe7`Y4KXnOHM`xEC_3pq*>uyVEfE)yE_7#m2yk@yVi{x14-Oo zS4V+^&E3grW-S?{=h&0_bX2{o0u9-Jqc0T|K1uE;TVn$LF6pSxdG zabzDqKB~uTl={M#Bj51<8yE+Oir(#CC#ZJlC_N2QDvk|lS^ahdm&j}eQ&Y`LM`qPs zGxS;OivU0wr$qpq+bwo@X>{Djk8SdYz?|2rNR{Q03oBeE&enO#m89}NB8DJv3M0iE zNabGPqTmg)`*?&hWVsfZ-aEV;J2%F347)vmI#4e8N_!Adw~lv4n&u8akah|Dw<&j$ z)yG91=&&B!P#~K}HO9{<*B`TA)*o``2|I>ti>$;^KyDrIylzmAZ9=rpQClZpeFxHU z0Z=pX-%!@Ho5+WgzyZ~O+xb~>R0v}A2s={08DHT;@YFrTEu-)HmpHr_JNoQ-pu#U4 zEwBB8a?7{+viN`8%%q@l!51j)-N_nkYu1!Ig1!ORIrIp24l3cWy?xXnzu{q-Lxh{^ zUX!wrH#hweZ@(=rIYfQe?+ypujXom$d58)fPadUN-#6?`{8x_gUaIwJ%C$dAz-JPj zejK4Fr=J>Il5bOJ?wiW9`abozg_9*-)GDnMMEYF7o109GSB`uF>=fu*9&kcTd9EDJ z?48SNcQ%Vxo*(1iCl(22tA}K3N`I;FAS~qF(<7hcxi7ObgO#JGn?Q?HkH_vHhXxo1 zJemIfT1A?hMVW^2KhW+-X8j%s*4F1_k`Q}Y&0j&H-hQNU% zK6o71oC5}oi7HFVyN@f>m*`gwnEH9z z$uRy2I|Pq?K|wIvT7@@htcPT!euxg@iK}ceGNrVdeB^6cq50d_a%+5Z@p;KRnnQGc zE9<3<(k1^C0iYZ!fVjWSw0g?c`LZ@+j)$I7EsZKJ_2ttCAKqNxyaYb>tc=aSNxzrJ z_pH5g@vm~gleBV1<)!~s;L&rzZ+tmepW7y1ds6K8=4=x!hrr(+cuGtE^$AnNAn^BJ z@Am&b?{?@({K7T|6o@EGUF%|Fxg=()xK5U&{p8Q=6r@Q<6=XZSu8Wo=fkFs_D><69 z$s#el`uaO{K+V6tyZj}ejm3Q(kEQWY(Im>Ud8)fP5$2tunTUiK+6nAVJN-(RAO7}^ zTHNJCa;rbw-F)H3mx|L0c0>zw-i26&uxBu_>Xpoz)C&p**9}Ey{pUBuIThCC>i>+z zfpe|O3z~v;V*RpWjr5kHbkbltC8KF!U9RmXlFU2fbav|0YVo(SYFnRr6FewqWy}w+ zRLGOY$ckki9RVPZnsux<`k!z#?MaWBMM-o6cyhAl< zw=O$=W?QxCj=#WHo4>9rxz#iEfBSM<+=M$B4$gp5Ule($S5w%MbBfBtjj)AFE$wEx zf~(sz$&v_fIjtb}_46Rn_eZKGsOF{^;6#C!=tJPsWs^0$^vtdAKEK=jYz&jsB{ISt zx36HMrSe*mzTl&{JlWg^_I7@ex5AHwwn7P~$gBieIVZ9D7S56C&dD?BTjWy8ykDFNtYZu(-a3z2Q=$&ZLFvD$DDfnr|I5gRK@9* zc@@N67UDEDt5Z7$DDJ+YF?vfz&DAKW8>wi2lkO?)s*E>b!xUxg9AC@o_7|}w$>Nxk zCD^9-W zO7i4O%vO|6G(da;bjs6dCD|uhVXTfC2AjKU!3p3zbnVT^Wgh`Cd_p+-Ej7z^#Iob2 zXxcBXPk1cRezD?dOWteo8`SQL3yiXqh#`ruW7%jO1+`Ak6v($n%egcw`1*Z+@hPAB z{hi!O-Voz)w}T(Qum~jsV;DH26f8b$rIkl?5f6oR#L)ec9rjSNw>FN2OLmd@EriXo?83I;^*B4nM+IdIu{2l3$uU?c7PgLGSz zvE@_E-F;GX2(bybxSvlVZ@so?98Z!99^=M=rg~gP(RIJp?67-^*kmXv4MgNeFG}{2 zT=ccvrnB>YiJG3hD8Vf@SF4UDxQ(#+K&0O7{$UK`A-z@B^P*$u96`ia8K;-y#rWwY zcV!o@2}IpD99VR~YS`2VYIozbL+ktT4|k4DPhhr9rZS~t+H=uz&B(8E^vv_-xoo*v z3D880>r>&;#6-0OpF)$TcE4L$2j2=J#MHmk5aHcA+SeJG@w+GR9%F~P?y3j`kz)1_A-ueQs;@bTG)JN zW1t3v$%Tq2zN}sv-AXj+VBkt{c9l@C9M$nzQu7><@iMA#k!1B6>hE%;L2(D{%Z4Q+DEH(;=Y43LotX{DhR~mW^1o3eN+A>9qERjZF zuNJ&2O|fSTg*Q9+>Ib&NbFh}U-$Nknx-pxi7Pu7WnOm_&uHafAu+#+d@hqKWj+X04 z5eCl2{R?lcX+Y%!~MTfAgFqX@3@8*y5v--=y z<;Ur=r}x40R@L^K#{9(t(^W+C#&1l^38b5jau;RmX~2H`pEtaXD_E`wyK+(P^6|# z4O9VRYlob!MzyKRzKGR-ImQAF+0x$fRcgGon6g|{dp6oge+6tE!(_$2IkRCFC{MK zJ~P;1Apc#>MDBhiE$Co!;?+~s8ymK{>!bMfea}%DFRz2ducJB&s7CJFMb3aLGH>Xn z^fY#C(d*_UUUJ=~z6)AE-{&HwlKP~C)lFM>6OXTrzSlxrtNtW)tZo+kPq*wv=5>Eh z>MGK%zLjZb+CG6>ecx=#xxsfsbl`5cvdQg!e~9O1bDW~I>Odt(pKl=^)$D~^mEAG- z#=NhAI~o&AC)ZG$E+aQ;zDDU(djv{lO*?7cG=F#Bc9zil|%!bhw_EctkSKgZ1iA=@jCc&rI|xjXkC>?RE~zrPgM1Z$(G@x)i6`BBvb=tQErsir6pK#s_5kHKZpthh}wn z!heMHoOTl)bJoe>RgrEim1yUmEY-`4(Q z*D}p8B5AnAAhR~=W0SY_#9_cyTc>TJYG7kVdVmyJvUjDz1S_0tFVl9o# z;&fMio;?$773JYoc}t1R<~_V5X8L*D2T?2Wg5l2c@c6wCjE3sD|vX{g9#+)wUZn#=?I2XCF|8{8%WH*0< zUHI!CU9_5L4cJaiV&jXQ6ihZ$I)PrQi^+J-J}=_*2W=6>&09C9?ZT=O<#CJMq9WBR za1OG6t2_rw&%Oj>B$SyHtIWEMSF8!s5nM$T`vwEp6 zoGfaJDXPs`ZHG_p@?Jf|YC4k3BT)pMNP>ew0lJoL})j7FRwV)EkqkNq@hR9{!IF5KA&!P&^8*g!OFb0G+)LB@~{EJGthK$78btdz9)p9WWT zfnfrcgtxI6+cbcz1;5=X))qACH#) zB1=8-UrV2(nKKL&n7xu$N8H3?+KAdwO-^FGnaK}gxJw2F(yeH z9_49psAoM^DpY(g?a3OmrL^wP`14L4Gi z1=d8OoUr#mM53YO^~?zG#fNSXCj>T^^yBX2RPBljEjcqQR`1ONQKa4pu;j+@|1dsh zPbJ+98g&Ze-l}&sCY>-QzSiR*;qQ@xK}K_>95*;R9EAVs@b*fm2!yr}$^X&`ZBBkN zHgCAhZlu{&l=qr!l&7cgA{6o-E!B*ttZXjQZV%`$J3=F7W`|ol_oFa7&2ctzf&W^s zHC|m`(7V0KQe90@A;^vi^Ro=ByU$7n77i@{atur|HU;md@={i-4LYnRovFlJ7dswd z#Ige`2$W({|7XP(DoEaqVC&rUDwy?W;))4X#U8kp-QN2;G2cv7$zq^|k0f=&vcrf; zV+ZNa=KMy53i>J9k56j(l+^eSy&F}=7F85E&j0_$tXF6vN{XjAMS$t#TUHr+ITeLn zYtOTbL1M!s^%GkiojReV*bm~mX=K2z6`!da&S@dR2ve2O(Q3oj9xZcP;PO2ag5zFG zeg%7tRvTI1WW|!JCo=;<9(l8!`Ucj*3I0-ZMD%uYKBrogNQu3HqjuPjzF74IAS zRJi<`lq#H~qyrMTI^0dsrtWP*!0xMz7p&yNdALa1-oJBp^pPT_NY(iu>g#f~wCz6X z=RNUmMHqUHPyj)MXjhH(fFmE0or2{*kvPrS@wYvA`+qu0; zF=3O+(&q#gQp|sW7GG3XDessYg9C-ilM-iOT?w)OW+4)*YwR*@d6{z9=#ioG)L{cC ztm@#{MX!Y5g;y#kWXi7(Vn#Uy$FMOr2TCNLGv|>K!Ok}w30wMb$D!KocfGJYnt{IC z!iHlZN#&M)?d+~zqzI_v?-UsuZ%9b*vrQ%3juc>)g{{d0M&ri(8teVv*}dLCz0$z2Na!5GQkbBzet)ZewFlg)S-1eoYcom2Ze;V1aHGXFxj- zMZ$^$+mX4WG62Z*!nKHh**h*{$}v+UkAIWtk_{~_*-19mr8rN(WHTM9NYa}nOms_{ZRdUc+L20l1sSlab4X(kr;o(i?xb(7}( zJF6~yi&mN%g&7k@?knXQFny%wA7Lxc!WIlm8VP4}NFsN!WSfrC9!wIDPZ&FVosu{R z%VYbf_g!-iqG4p^X-#1{9C1GWng%4!9!Pqpq1m*w9rN)93oE!w?3 zEnwYjFAv?RX_JH_Fr|D&M)Gy`&$l>gC4cA|~pqhRIpC51#Qyp%RcsjrtL(0HVY=dsB zWZxV~&8c{)yt`s;Tgz!vG&X9#{(l+og@wjLgYbsv@;$&Hob!m^_>X;?oTB~5>Wg{7 zW)DSQ#3eqrlwYzoJjs-C!4eu{hgQ`Z{i~c!vZ>a-aVDcgxkD$@Zu16Hwo3(1K~tft zfK(5JSVKu~MtHGRj5+Q7E>W{vuex)t28s<^GwT=-!v%IbsnY~eQUI6ztc^P=5OeKu z4R6PA>B|5-B|a0<6M0cGTt)f={oZfPdp+pz>x$y)mC_i~T>|=@nsdA7mmNi8>~teO zSSPxF#bZp7XU?A8IX_N;9p#*t0ecI5H3;Tq1G~uh$yCpfdl%lzWRbX}mQ(8LeV|Vf zMyD1`=+8)rDd-T+M@7^NGEJ*wBSz=EzO}&a6pSGl00AB7YE0n<`VeL}Nnle(uI+^G zN)`TXEkCYTCza?h^6|UqU^;WM<`}XP=@!4|c+LCeE`LDQ#;kWrRrTOZurHt0z-RK{ z=7W0zt40<0%Kn(dc^h(u%DB~*(~1&8VeTVmbKerNzd10ISFbE}z0UHEKd)W0|0SCcSq@Stvni|E?zHt z6~JTc_V&DJlz2!zu4p&D?U5zStE8teLLKqcuQf^AS#S8jJb;yAx1l#Amm!$e72H|~ z-qGnu%06a^hHQ5J?gwSfY*gZSCF>h)5CzWdYpo;;xKYV->5E`ds^prjIy$O(w!^(C zZ8EK~FwB_XtY;Kf179x_UqI$Q=tfE)Jbeb{5{1PeDum&ORF6q3UTjo7(tm%X4zgJ{ zyif*!s^U2+_2$nRJM$qOYwcKz0&sb%TyIP>2q#A6yF7)LqDuBTf=hkHJV%$j$}v_R zlFP1`PvdgR5XHQt4LAeaC!Hu!%N}%wYp96hO9|chf(umhQUznwRL;~#uCwO>hWAVhDIDOq+O$s`}lbXZKY0RJfIz0%=5CaG(FqX8Ydfc_6joct=e-M5DB$Bxj$);e84 z6bGj7{!uvbFyK0_l`^IQA1*?M8n>Y&i>@zu3jb_Ga!UxifE@RU27YKiM@;f-zsi*dS+0{uiId;TJcLa&D80X1ly@ zi&_7s$?&a>_D+F`2qe#Y=WDul6htNnc~)Fe_M2MeDdg$**bS@#c?eg#?t;-nbD=?phbT~-t6F(pEqJLK#fFZ@P%^qaj$Fu(CqLD#$7vLaZNF_vSS@2ThN86GT6-eXSj45k z`uZtApxMXM6i0T@QKZ4!@7M4DZuR$jaY;pS(S{!FS}y081`D46o_MT&j1s?U{$!!D zcIw$zG0a`HcmXSDP9gO2;A-QrizGUo%ofrmW?||)@kBxX6dfxw+^Z|QGWI*5LlSld zfOKIdqDiBij+mJh1>Rh6=jP?fosoaxif%1lsUJ5e<}>sCs4#gL2bP1Jb zV`b^HS?^CMX4TSnehs%xOSwX@RH?q(Q0%-QUK2W*Xt{NFPM*B%X6f9TBID+@AG;*R zm8n3is~OEnYK@q1pP%GXPO9?X8g#S)oCB!=SrXUb9-FOOFGEEZ-&^+0=K+~cfP3Jf zs^jvf>oAjDJ1--(WoWlxTMoUZ0-fkxKG^=YTo>}8>qtn(R9^yj8@`wPd3O))h7`q7 zeCvPb!kj|z8@)JRR~8Y#t9Iv_R_b3lHLlS?JgGn% zjOV^zW@e@Hsj9ATIaSV1bmj+0;t?OtqF(0L`%jX5DAyWQ$ps@uW!gdDKndGCCVFN` z$s}38%qUorMAF`Hb{6ny(6G=4(t|3Ocf=P5lq?G)lo`r7L6UoZhI0;KrEre9P$U-S z+@3QhisO*S7ED!`gwGNc(?fnEg?h88hJ2g(E{7`wKQ=aup`6dvMN5O3k`qKVl z`Nkr>^vUo9k+6dKZ4xS3o}WKJpH#=doXQcfpLaS~`;NMOjr)qVMLe|GP%x!06M9EW zW!-eLv;d-LZy@1ln^PdUDRxI}@6(^?&WaI6QmZ=RYx=Xm%$bf+R$(ay<^?BprDzrY z8lmc`t~Lj{#0D8P?r0X_rS+g6^1W>jHj2;(Y@YKyTM3$KH&6qnelM$>e!VlpklYWF~duK2SEBx*0%lm1jF7#RT;fS_8XKGWw?V(#{Mbv(m{vOiy0ZVkX~Br(~9p_Rw^{FDh_E1-_a9264#aB%7H@a-{saEvP0=rgmR*!+?JCJygtM`cc)v+ zfDSX~lkXgFU>s+48Dss5gk$OqwUN+`S&gr=Ohq{Eb878^9$CC>2||yT1cw7 zdJFErSq8w&9ZSV-zt}X8<0ju?@J(W;vXD z0e8N3P9f)Q)r!cCk;4!L-_OUQb~Zv?C;DVDV2K4DAicfp7VMPo41#6tjXnR zG$QIj6jT&NLK6iMBgdmcq$?;zib#_p90d)%NGO5OY=}ZAA}S@QG$oLTK#&d=Itk^3 z7D^C85;_S42@vj^;P?BU=YIE}`{%vS$sc)=*?o6+W@mS1XJ_W!7I*_TQr&vVX>f?< z1R>Qem7dwwr+?g4{QO*U6=wGrGHFv5K)VHX00J(r5(_T;N;7BrS$>2mwSDcx%zppAU@n?3rka zq1OP@0^YyB=_RUx!0LP&3RpiM$k%*DCEMaPm4TB@8}19X^th)MkkUcPQ*pXNj~`4g zw zaS+@D-*PiHreu!Kg)oSMO~8$~a#>fa#{~c(hTN%h_rA1Az+V3E6g(;Q3F1_(j%Hoj z#MO~2V;=+8s@~^sKt%uNQZq#;wvsb>Bg}5{=zdf98?SQ= zt^v6_bqV&sWu*E?uIl;dLWp^fql!vh_33+J8bHTWmr_y^B!XX9qOE%a0EcpbXD~H| zcf+TD0d0vk#Hn`23Ib6+lPQCeyi_2F6Ngb>K9_bB!Y0eNu%Cp;G`5^9dpDxyP#!Vy zk5NtnYn68RE&`r3i8&HhZDdK1!|0l;2npIb`_JJRJ%RB$~mHuMCk`C3~u%H z*~Z=l23LxLE{xr~VJj2`7)-W|Dk2qAX%5D-jv8E>e8;7itu0y5hx&hIfY?lGW2n`%?3Z01HD&B#)ex zzk{6fed@A(yA3PczYYT#qqe=DoHfK-T+eUOzp&@hJ?)JfcEq@GbEy2>>TPn;s&H!R zl+>S;X1CUq{GU$Sc2AMMxgt+Bo5GJZ$Q?CH9>Lk1xA5I<`d2Y4YT251jPh?wTWx#n^+1v6KBk#33)~6MQMrH>}AYIK$Nw_t~jOv=6!pSz8)9t9`b0jZSia?z)sL8yh8x>k7&lwUiR zzcq}~pYg*uH&i;jhNbeQ&?;}t5YJ07^S17{ugB>(z*~VE6xHvRx%D?ZN}rG2ZXntD zQSC|U!6H>xSyS`Dvh^9KHKaz1ds^rNO~AS37F9Hb+uI@-^Fga4JISe%)D4!KioRW5 zhAbuR6%w()2||bkPJb}Q`#v2tJ%d3D2cs zMlOV(Bji!b)`B`W)rupXNgk0Do#jM2@OT%rPhsmO!_4h3bI5dP=iBUSE%EXwu()}* z+cZBJ#MiA95Y4d`*|;+f!?$_5tY@#6{}fNN1bzJ-V;O6ZrzN#Q={%58LOV_GJEX!Z z1PyO>%&+->k>Doztr$3RJv;0#ej|wn&-}fIBzZuY>dnUim;VPed@1*TLL)gnwgjQA zuBDY4%Yf+O2WEaq=AzpF0m^1%Ws339jncdk=Lx83f|->5)m7(=|AKOUvNqvA`S4$N zXwLts&0#*TQ~%vIi?kVN#`k~*G3n{J&9>Muy#w$EdfMxWxp(*@Sqq~|e;zLXV!{oE`(`i;DaC?QR$q7sNX+0#0$(NDV8hFwK=eL2q?V zUcKvP9C#e+@r%<|*EqeK{DO~2l-Uihf+M8HBD&s#Y?MmSUow0Se;cW!TDEwqHHp$p zDKW3}H#@^`U45*?d~@deM?V0r>yn|(S-3_!&R;EWGY>u=JaXtIP(YVdkm4uUfG6I$ z{^Px>_LaNGp-10}Jx2px^}yr>SU&pvw`ng&cm`_@FciT=n?6}b`)083dsddTtn zE4p6jK5p&`3~h&V#9|*kA##Y3k;pGPf4MmKj)`ROF^vOY2xk(rDH*=7?L`6~+qCT0 zH;QxP)w+%x0HcxI0q6HCqxoul#AGFZBtARgjf|a4q%6z;*qFTMkN^71C)p>1N*9mY z1D);Vu9w-^ud=W&dbN`H#J+ta?!!%sv)S?TUFrwG-b>!^$0Zex@%_@HloYJI4DV#u z82Z7RZJpOIXuo@t$WKc0%)B`3j_!{Ks@nQtfD6nn=g3v(#Slz_Hm7^_03Qh^BU`jC zPJ45P=-&<-*DVF2{?05c+io7h1y=)P_&z4~jKZY~op0b76F#2+aq>(03!ZqG;u zOO%2v_vGI+JDVBL>O=scg1nFJ9RE}g{HieEt7m`(LYfz`0DKa|{;l-?1qqs?fdFY( zY0&UmSGDbEyfk{z{ydirdoPSb9#{9Cn4mujm`9=1XYp>GpVHrl?@Hja{(0Tvlsl(> z*gPvf=&3Y$V6CcZaxh)#YFMCcA)B|8`hz(5(&~ND>8cqB;a&-F}we6dc zVZd9Lt^}U(`y~^14KF#ZaHaE$W43=q?2+;0D?aCi-pZbQcJhJXqrZ>6|19)i-yfF* zuM8Z!WOL<-)Du#`MQ44Q2JGg&*U<<@J_cRz4{}(`g=)fBO9!$PMPaU@7nz0S0kj4W zk(^B-@T;ym)p?@?t>w_^`+3a6z+#WWd@FkxlfU0()HuByZWSQ6VLB zQwc9?)Y0R_DEX!i?~X^*48u_|D93`9)Z;$rsocHdBVh-D169)Gh>v>iVcj~OQilvj z_d_`?%$MmsMJw?*abDu5juhB;YfrolOFmqWLU%Dp$S})xer*fkg;+E-{IU?4MC8R*OzcqoSX!HbT$HN3HqQ%dcrAvqe&3xUHYhVM%D1lO<+0V98&0&5OV z#o{Kfg&I)k+by}3)%G8NXZ+4GP3#D7mNM%7V;jw#tRQ9pkRBV`lWN0K(31CC>Ru$M z^n9SvY@YM>rBM0JZ8aHM6(Ir!DigtnH*YT$dYlC|*81G$NJC=ebrst6GbR-Jj`Ccf za;LLnOP7X#foR9;vd{KN9^@5s#*UDkkyYQd-B*PR4fniWvjD)~s!#_4Ml@us1C(eA zevUbTl0mtiyF_u~Jau&`M)P4rsSoTzR<~C4_^}x>`OVJJ4X?6(-h(=OYiR?$CiaAn z{|KU_|TXEVeLY3F&@+iVFRJra)F7t+Jw$# z?Al~mmGOiQ#kg{e-NmTqj+4O8>${4Q#wTs~*`9VjfGJep>L~sL{1TEiXWF+Oa^bt=Wv_Smn zPdJ|8Ma>*(W}bE+l$)OLLsH*0<=YDL(BJu4vn`e7Z7BqXAs2rn!DlIBq{}>3k3LQO zToo*Xog7j)042OW>v^}#5U4NvK(i+`z()+Izehqn*IpKY?Yo3_Z@X9?dsGIB0;|8l zR{86f>GJDN6WdE;i0yc4HTitJC>Yc0RV2O(q|f^K&lLue%uuN_*(D-vN)CeO9Kz@r zSvotUMzA}tkr1G$*Gw-5LX~OHullnQ%=aF*LAvJ;?*^`( zwS9NLhC!6O1AWhh{C&CXPmpZdh#;y2hz>C5PBhqb%oGDX{T2W{Dh*XnK%4dLIcfvh z1A3ZQRiA_-ysq&xZCn50*|TdJpLeTjrQF9>sa)P5A%9I@1oVe85szqu&_)#8;gtUM zd6b6*NLPP&2g+HCZCvIYG#yUNU+MEv3O3J*^q1YB6Y?<|+oFyDZ|8OHs4?xP*B6Hj zG$|o;4MfIx%0zJ*Q1Lw>5QVsp4|na!G>zzP!K#R_|@oX5L@B(*pz;9Bs zZG@bXN8}h((vplwT+qJZI6GxbMY+*YDd-a|*1fG^?L>{ajGh#|ref;gINL}1uoz&E z%g`FdkC%iql5{q5)$y3jta(q3do$lx8DlzT=IJ`a!|Y`&IaVyc`?V0OAmF7_8rNsA zWaT;{gv?&dlR|3<)LY-3_)JmKtuYAf z@TZzt)^L~znl+le!kwhT*Y($m6j+CGMQr8mO=I#+-R3eO#e*v8+|Z44lM7veSx9Sx zzS+((0-Qx`vZl3iIlVe$_J-FA*Fy&MRAIBK;&*SAlH^V1c8~=RZ$x7gNBW2k(9wSOZMP$_NAUi=%3v{*{)XwHir@9!32vQN1Q*)`Qn;WKU zCAil5v%ZTlBm|+=HYkPMOoK&ktiFJ8gDZwtF&zABEPj5FjISeGfu5e(++UXwo}N=2 zEg!IB7s&QGz!JFHfrzTBBbANOYR_Qsi9TE^?IiV@Yn%5>PC1#)Frs{!bC7|NmjdA90FTZvK?IE7XB*{}DNPc$ApY_mT(?6QPRF03*7De__t5@Z zJ@Ob<$_%Ac)b<1b&Th_tCSqPD46PPd}&*Lh85tPHX{$fZB`p0Wd) z_L_Sy+IGvn9GgN@pDxb7m#1fd$_3WoQ!vQ!koajQ+ux)ZGtemD?HqxJp-gLWn9SQZ z&O556zCql{1l0ZV-k=HkB7EMLu;EpJ3~T8ku$7OSWpO_r+DEvWbSYS?XI2>&pi7@4 z&4f!qeX3UmN^v0p*G77=qp6LiPW>EO8*!(^>iSIS{fG7z5b7%oWYir$lw;Q?nNRu>mWAlxFU)r9zt! z27}EVgpevgvdNx1_g>q@mcdQ(*|mPS&7!$wzrk#6^J(9ExvQn!Ih;Spw+bF_RFAj66r;HV&J6;V&`i{0x1 z%acohD70x3(A7uaA++HOzwU-N^BSZ;Tjj{9XZGrV(j9y-|z~#=bPsDnRDpLm= zzV-MTR1dPxX={g0MsXyzy;YeQz-I)f=PgEOXOFvadf)OR>U9sUv4d>3#_Edx2B=KB zR_MA#8G$AVv3y98IM1ArWhG}-4%IK1pB0HqkWmUu)6 zyIpKL=9kgaei4It%)`aDduE4>4NG}b&M!lc*44w9i&3ad`@>qZvXKLbDze0w4C9p}%5q-&taQ@OAcY zi3a)jdp-A^ax?4w_X7v84DMRKO94Np?*`!IjZlEltULsou7vt7=QA80PW|8|Sly5# zzU8T)la`f=eoOW37w2t-dFBs}9{N&SMM{7eG}NsX(}uaiI}?X15z$o5)>R>J4W;80 z09ZQgYr>F<&VD5=xg1*d2QU$o8xwXV89EhEfu<87KHXpWCm~&5leF5>G!5X0)N~?^ zJ^0MS0yrP(npa=geCRQf0~17PFR*_GGAbnvtb}>^6BLQb!mkQ(lO~~N6uSJh>WuNj zxuXsc8=#DChL&TUwj;b+Le+Q0u!G=vqavH0Wo|&{Z!wx0lMXqH54FL=^9I(1UB3hgJR!qUrWeWqeUh@*^_x=;|@@5-?#7tGxr+PbHotpP!m<& zZ_hrBAh1a!y7=_)B1VX$!aMG6ZyOdhH^!}dU-3*;rfFdJM7w~d`g`7_o*qqUtSx9@DyhAIXiR*Gmbs?#tuUCqJo=VD*6ff(J3vZ{ylTOo{trXH&eMwOOn9# zUw)p33{q*B$?|8!1fz^bYgSvPc$SVRR$GY``XkfpC9F`>lln%P=!Dow{&(%UpBKIj?J8b0vS>(bYP3 z^vqEh40a50^G|&k?65ox#{7th0sM>8nXo|^ED(nH^V&Tx^X0MKGT!FrB757&>dmg? zgnpT>SfRr=ub;huqC51L#&yTXoJuzj zom0PgNSvwX(1;=KO;on(LhY;a`(=giePxjT0Xw`rqSEIt$%wsM&;R+8w#2Sf$O=qI zZ=+&%*uh_5Uo^kdfscEsf%M=bTbYg#eBALq#0EanHxBcH5A_*lU_30a?W7C%fV~r$ zfIcqi{m+fS4gXi2Q~7u-4p;O}3~tTBmEVO=r6CCDMl{BxOhuFh)*}J-=FU&MG^e)N z+M@Hm8`vXQzU{hLGZ|-FRF}=RjYz7euiRAZI#x2W;v9JwQ^0-aB3D}&p@B4vzbaGZ z-qwyiIX=L%$WCZ-qK6F#f^A%USZu9Bn%IIDv0zdY`CRwJ5jU@#j#T!)j_Q>)s9R_; z!A>FfPHrEEo#g zVS#9o30NTic5B-)Y^JY8N2KEP&;{-67gk+~@nfj*WyjrD9<6rtFrP3Gc0N5njwuy! z>(#`h1oWyP9^J9AGxgJxb069tnG08wfk{<^_)FJX9;JGaevE#?-nX)~_7(6pJHf^( zLgrOatnyj5!kTQpA6E6OmV^aPYJtFP9F0UW>{!;k%IHpxKTKD1R=ME>ey7kXDV-h` zDgzwJYJe-HiYBcO;INZfY@Im0w%N6Q=T?5-y%b0C5GLCH2<%=OFfKG9--H^gld}E* zHIHc#3Gypw)$}W};7?U3D@~j7XN290gRXjOXTE=yJlF~s3i8nx)a6c7q4hOb3mk$C zUI31;oS6P(VQptFt-#$R^Y!a^12ueG6m~}(WLfstHN}B%Wu0v(0aqt!mn?7J*QXOA z>ZXk`aYq7=f{ar?5@MLvl`N~KG{1AD^-;yh<*^?!5sozhv8)D2`2t z^WpuJ)J36CN+`UmzOeLaki2)!Av=r{`JOfWvR2of3&CD-$D60}(!Q0SM@!XAFo^r^tF&vdr;ZdNjJ1%D$V}q;Gx>w3+pGIh*G=5@dT38+X%=KMp z8wc(S#|YQO^RmFw{h)`ri5WWo4DhF>w0`%^PTs;P73Tiv_$jRCE1N`F{OGt)C>f(# zHZ_f0^j?3bfmJcE=q#vq)yz*RCwy>gJK|}R7EpR+K?Zh*A2{XWw>k5N@dV$2dF$^g zMo>69l{OD7AZ=EwtE6$2yHN;%D*JXgAp|9mOtsAy(DLg~D~}4A;c6Lu(;495+NT9e z=Y@>Yk6H1*!fnkSy7u$u7<+BB|DL^q-R0nfKR%$f(iE;nm5vg>wKM)i(i!!Z(VC}%zLU7N|x;BJq_vxF8I$%N#5i!#9lMwrwNw2ni$51ja8v5b=? zdC(3PtMP_(bE_h&*%b-F?#Nuex^jQmBNvb+k6wmw!?e=89i&}WGS^6N&6(vMPr7@O z31a7xrDH&#zK5dqj*SC;cWOWrv zdAgJ?u>Kry&ACD=+%Oi2@jJ_X(esv(-82a33j|VOvp{~Qu0oyf^S&d7Dn?2Lu2nGg z?E^bZy{$aWk5sk1e2axVU))m1!txfcF!RZA`}nXhx!`00H`%C97}nztHvIIVlPdwL z+^0Po>P236&URY7E!JA>tZ08q7Q=_7xZrAvVo0#Sl@l(o?`M4{XV_!tTt$-IvHsY_ zL6c}ww&XHKMj|13xn0+5d47udiAe8C}Z@l6#s_j4(_-bD#T)-+OgpF=sQ6+dn% z#S|i9EILq1SI5c-Of3q$tK}-NbS2(#r}C>>V?e~Vhf+b+ z?q8XFu=Gvn;Y|GK*)i)0TqGr`;+!vXat@(XEV(>PiL6z{&JnzvONpS;;lPzWHUj?p z8l|3$!(;Nlo4%DOPNU|Ng@Ci!6fLz2S4~Q~-)0oqv=0jrV6YTW$pa;hvY=C4R-9S` z%kEp+K6kNlxxDM;q-E!p>{f4f>cx>j3E(_+E|slc$=2z(FDmRj?>f<|{h7xq=TeS{ z6{)ZbyyFdjpt9Fgop}tFE(4h$X|HO!}u&^GcX`Qq9H>Ed!kU^;G%M1QdEYR~|8kB1>O|_~&Pp0346wtBq592N>d~H7D5zT{#63_twH3b7 zigGNHvf*|d-@8v*+FaF+yek%|;PANAX(=sQ4i-2BK}6$<&%`@xb=)iZD4v*n<09Fd zv=5uR0I}$!Ry&rgR#Qk1_0?cKilF>I>*2C+Y$vHsRa#4#+%vlO48N}zy~pk2K5pFm zRzs`NyU=-zloNB)U z`tX^e-x(#X>kiHS>@}$a$6$Xz<%sQ9;cgU`+Jb+>Y93y>+hrG1DT)D5aVygDE@O(+ zXB4%`gC5olB0Zh{v+{i`^TS^D+ zljANvMVt}~kM5Kg9t@Dk|xiNH4?{?SiTk1;^ zk~T>j%M-$QNB3W%aJyB>ePwLz{qE{tRG$0q{i@}1xL~K_LF7Js*3Z{19MpfFO@8Hv zBd8+LKK9)p8$^pG+RlkYF8$JubWv_}jlf-;dS8{Qw|E4`APjtZN>=7Z`rB_Ywn83# zsT|JBR~}mzVi?^BIx;bp4?P<5^@NCAuD=&fMk~?6pE6FF+R&H86E6Xn*S8!FBZ*K51xIZZ~J@KI~uVh!_Qkth4Am2moJi zQF1ELHA=|i5G>-r8pe_e>W@Af3tv2*uN{c=&ZjE+|?hZ4x!Y=i41^x zK|SXsxOea9i_k9(bwq4pe57!tGkOT$6t{XfvBl}sH@}b&O}cbr=!Wz$z7>R0&*77kF(C%JoD1UR#~k91oiSg#do2{n9o1Q-!ppgurPi zgOZ)83rj~ISg^;eCk!lrAaVdf`=abFxII*DgCJ|XPPr{u#^Sd=yyW=N1iVRs0*9_8RpknIu$;p-l404^KQpuugh3a z$mfoGgLj$8e=ZH9`uIsRISpO0)6rhEGHkS&)wIw`RXw+$R}?8vc%P~IFZ&+VWnlCe zK6EOQJ-3C3>jI(u9TBx%<<@R}S+;y$qY((;N*c63>dG+jsfOGvVWLNSqO3`g0#dS@ z-}|vSsi#8$BJ*~+hDb!)I}IlI6lIV(sG@smx092Qk2^8U2-|{?MrWjWoxOFU=w&+w zeKn`3UoLO_tr==e5P_?ZnxJijJGG*2*p~x0nkg<$W+F9WCuLyjoKUeufJf^xq-nh7 zrFrSwiHLjAiarl9Dg4fK#U^{c7s0WIICqYg&nMa=Om574xgrxy9d`8`huW*I>Ah{)G8R6^Y9K$m4p=97k;>pxodqzznVsI#WMWGuPC?RPg zLEYyMV6RKJ!l%Ou;Y-hq6yyH##!9|c{8Q?>r)ttx(MxtN3=|mpP^$JRu{;n4H?1UZ zxB+AHKrd*Y`*Ik+FP~GCRJm=`)+2dwBn`Kkl(JRw(sP`A6~w?zC|3}Ku8H!Qg1Hz) zrO83K+O3gGkGmVSY%q1Q^5?W9J4b)&?97(8P{gN#*bSjnKQPfAqUrT^$Kkply^Bt+ z_)W}Y=6@t9J6e4Oe_q)@rF;kIsDi@<}QGWd1(%$q=O2qpF3H~23ZLazU+`=_a$NQbwtci#gg#R_39$%2aG zVrlT(L>*;>8dlv%$M)VCEwgfKYL4#Xkf%?FFsQKQqwxFm3rme ze_r)u&Nb-KOxrO;O3Ddax!@M~lpL;P`1r7_N({(FGeBP@b}wr@TlyvpI~@sS&G(<{ zQ6eDy@$pq4=3`1x;=fPtxNbUr#Gu+J4dBbGX-p}n%X)aUaj4>2iMC}M{y8j{$1~7tpsi}WI)Tx&+Kw$IoIMX z#I6w9n8@QlM*GRrYIpg3^*0d^u-Q=YIHIEJ5FmY8e9999*&;8i4VwZ~sYW%1wRKeO zj_awGodtRH_oe=YZa1JyzfZSZ@L+o{9m?D2G^^6xvcC!R{_mx|# zKWy?9U|mt<^?zrt6FDjGE*L*PyT=1nOYqDm+Tiu#<*3mP>pKsdAm+Qst8EkCdd1Yv z`LLBp=Pgy_@eF`I|G5+b?$-3;mp62I;|M?k(O-RZrtOUtsBBCqN3x>QPVl!@JBi0b zEUO~Ke*-pDI|00RrqrF!@%(yB=i(f8@ zC?^ak{K4Q332IwvtTFN1^@_cw_d^BZ<=ohW`uA6az;_l=O7iT@yVT1Ek? zc8_pFY9$m>tjVhPx&Lsbt=<*@mi-^wiifTbBJG4(&}vJyZ*>!XtFvRQFGa1Tv2CZps{MjQx0 zOt*33a?nQ!K0pHikA+0j;+&IF!pSap0;0yIr!A4UMh-lAa+G9?JX~~}lzjqrF9MW2 z#fdnPu~=54aG&J`&uE|aNBuw4tfB2*K%$*1r?J-L$(3G_St0U=Y>N~>1Mu)WuMcj6 zNOI87N0J)phd!o$ZG-1_VUXVGq%EbL8N_s9#cJNoQtp+8^`kA~cmWMatpa_?-?u)3 zvIo$9Veax%9@9-(F_rDMz0tDRq9V1QE57qYM^bKhVN{%dLhJ%(2GUzvAygxz=VG#& z>ljS^3P7OwH&PQ(jF^0*YHJkAe*2$B1zYTDS4#T^zd--%W82P% z5vs&p%kI>vV{`5Ab!?F^brERaftl&44R{CQJs4^b`z32daNj6P zna3E$Bb_YlvMiqIxxIeq+F^Xsf!OQ>gXKeYh^tx_X)K-XGzfwDqTQOA3hCSLU&T+U zFWw<2Fm+$(u|jbcv?tPEod$o~pW@@Y<*C+_prH|Tz-Ad?BM`NdfLfZ;?YF~1P+Pp+ z*8qC%)rGn7+mRZ%B&EH*<#x$ZA@EAV!7FvVe@9rq0S!7EPeP3X(zuUdOlFQSgIy6E zL0jE&USwqnKcrp;`7^xKiDCeRikRr<&bcH7w`ZlGheRkn!-s_%4wF3nSRWEsS;7O} z71P6>g@Pcebe#Nnzx7cWUs$rdoXO?i^ItS>4_Py&^dt<|&t89Yq6}OY39e(PZCAcVCr^&Vmx|dD!uUmQZs7U1l}Ep14_j! zC1t7wgkdj>vS~;Zf#eCu3D=AJ_s3c zg$q##6PWrO^mvYt621o9ovG(8RX|1*w-28kQ<#~tPAe7bIK1n%5C>i82|V%Wjmq9{ zT!OGDizL9tA_ z8A7=VRP$EVpY zQmZ5vAi=!=o(}E#9D$x+4Dsnu>J^dND*;yaGPF499+{siT^L!uV-Q2Ncvd#J-E0cGJ5 zZ78aT21&Rnpdhx|Ex%_eNKJGqnPq^*LXmjOwgnzUbU-F1ux3{+0OHgotQ&B}WWRSL zQ_Y4nIW>47J8LHQjmgSAHjMJl+xWl%V}(QgPYz- zF&1o5OJ%KYe@wGNW{1G$%v3*>-dyB_Yh#F>KyojUl?Gg2Uv9Es&Vj~9Ro?eM7~%xD zb^w}ar>qURN(JukM_N!DgU|!z+*=TqRl>Q*;U` zCrPV?GfUC_?66p9R&nXc54``6_7a@p|so;)@Srd|U5cl@u) z89i)@fq5565vXe%dQUNe4bvAThe;;Yl5~NKKsNs_Rb<=wei=w4?N9-dVci?q<+gy=ae~+&*9;)?`x2J%@1`2*yOS}yW!WqmvP(Ky$BAeutvzMK2TQvO!afVb}&_|;`4Dj!Ex{I4lg9nbE;bGC(s2>>Hx4( zSt;t4v)R`6FDZ=r8mx6k7~N01pDQPlb__Pp2ZD8?Th)BehBSY2vv54ZM_y^IoF_&K zjLQ@Qv`JM<{M65BNW0qrc>Ne)>2R=?z)IB}m-})vZ{dY3n1n<=@4es)j;C2ajD;5@ zJXmUJ(8!HeJp?-po}B(>?PmL^=L2g!)vB{q)6}>^hnCK~e1BKKqwJvR6J;u%C;H7t zwGXBj1xi_P7QX!*%Rsao9O{XOqcyzPmh4ue?SYCyDqxt9l_ zt}(5}h7L9YNFw<2KcimYs{hNQ-v9r4HM`hXM6Z*&N}H=AIn-B$M{j&z10@G62qXoF z&iN~w-x)*Y`KMuG5Hs(RYG9;rj~wY;3tQXWfTZo!$9u>f)n zmb@yCScGMtr(@(`l232(TcuIvehW|^>@Uxety}m#Z=u@7J+0mGK5+Z64@HYbk`5m< z{W==b{HcIDcz z!@NCKm7FeH#C8k*cQvHN(M%@>tsM^~EAErRAvQ3kSC8WE2o!|RP_?21dQ=3pA`y|-Ru*%SH`@%3CCM%Sj8viy z{Ei>m%&*&ZcCzf1%DCj{`JGO%5KZarj&X|^g?m5jV^8-Vwm`dY__ycN+-~cq0#!Ot z{X3n?=eysJxz9Iob)w8CM~BXQo0~l?RsRrtY_DYxpn)Z=ft(J;i1`=We&|c z)51c;IcmGbe$?`&UY&L+-9y3uV&6zgeeZC~?FU1r;IDB%`TTw!$CiqtwM*$yvaVBO zt=l48FQQO(&P{A8Tk)AGqvftAV>Z+s4)a1B`yga}=(ITEoV0dI;CU<@Wp7!Qt~cRe zv~$%bbQ+CxgK|p0*5LY>t8az9f!&3f=TrZ9bv>*6i?v(W^8C@)+7RVtg?9#d}B7Kk50v(E1ElL+-RC-A??LR5W z$UFJ@inG}E<`}6R&P<`E|M&rT~;|NPyv(s#Ypp5J8gJ7)59jnps1UBTx9AtI-auPX=o=PVfuc+;7=?W z{ze-3VtQ|Ie*7;@I@@>+&baPQw6A5K?r|Fx;SUy3%KLwoZmTki_ya!sLU>$8cDL-o ze@O$;2HVEoZmN_N_*qADWAF zGzz;;+gwAZgQ+SP!%NrQk5Cy?qHK+W>6Yt={hY^4-0yl-_R5(dlhs>$aXe~NQl?*4 z$flSxe0ar`rH&2$Fxcy??~4B;!thKv{=q;M|Bs^fmAci*WfSz~Sf;6rMCJUe_l#jS zs}_Pb6bZIj;?fJ2fHX&3L7Z(}LUDgyA%6@oY?xA3@V1UZULEeDNKK1Fr=tE&BzVVI zV*T;poH-EesPT@kDB_Rh-!a{{7M+@NvQlwdxl)a>Gd}dMbakfDc6dg_ScQuqS6sJ; z*aTDBZYYm4V$t!wQLvo0QY6m4`A!Ps*om$WMUxW`fKg+;(0k~Bcrbiw=rtaI+}^Om+7>Oqgvw} z;C6EdHiDmX#uyU|!aT<*>V%!uZ*$bv z@sdl2k823DiuuwWL$(hRb6FwV5j*h0gqEB{kBR4DHYbHg6ZXAVYL0}*sKOd!0Ptzo z@XR`QO)y0&?)}c}G!?T{KW#1R6Jo2>FmkqY|2pTX>8P_zn+yN5hdbJ?7H(sHzPHMhsXIkj^lmuqt>1gy-S)aY zRQsG>&C=w3!-y`@=u+VCZXD;(v6tkYn^^L&p>bXK4R6Ys#e@2=pG3>G;7b|6>f|3T zQkP{0d}E->as~DME>iCL+SDdSXoiP5ygFp=`LxeoB~T$994xD8RIQSn;YsdIcGaD7 z(mvX#Mpe0r2ib4PWIctlnjG#zQ{&QvaSS3Ueh>6(U#>YA01EFU zqOT7$_qiXd?PATb;$@?Elm0r6f5Q>k8|q==P^TOQSANZ}qDro34~TW-Vu^azOkmH% z6Tha)bSu`Cvei#%v^(@K-Qb(Nk|1?M=<!Su2<$!&LVmY;blO_)2<$2_ECh=g;T9j7bVWsg25q9XUU( z=r)-ELO?lF)L#L6BjR^Zn$0 z)KV*DO{>a=XBc_A)Cu@S>Jl4gt{0)@enpEaGJJS1j<^W0tY64FFm(SdQM2_Wb6>sTIyy|i z)lc70B2SzH*`HQ;u&xTQF5jv3x#$g>!TE22G-4gCB!|vBuh-+kMIYUvDt;2DZCW$# zSZ1$@VuR-;2@5?enJad;%4lfGu&48H@Y{^Qr~k3{;MwHFnp~15(!UMFH&E989plG8 zC$%`uO4RPOW%{8T0x#m_xB{9*eXL?x;GbOmE7p!ymiy)5JMVj`IGdJoTi$XuH7rPg z8$G);;kEqDxRq4#RepJ>6MeJPUQ<4jcq*B-Ka%lFS>D{WtgB~s{_v&-TTk%nE+A=~;Mo8AYaPSG7@#ND+<-VM{+N3ieWcVed1sm7WgpHA&4}Bj zojOS*BmG+ANy7>s7N5|No~ey*J_cTms!lUk-rE5-ya?QU^BXH>Xj!ZVKJ~fN0Z2bdv?mgg=dy> zJXKg5rkOhZ#uu5Fc$z$B&3!$b^=s7tCMAIIsR@_?Ekf*WJg-;JWNT@~^P%@=ZW^s# zC@7Ky?FSpwg7^R!Vv}!hC%Gn7xb&X{$!NhlO?c&~_J&a)K6N08rATjT!$04w=3D8k zX0;i|sqFA}kk7B*EEQCVisI6A5A#kMu6f}`2Mx#H#7bT|tTxG2RlahTwHl0cgLw4XkmZ$h73{q{B!-UrPL`}Lo!0%RR#h^8bSzRM!+&ID`$+b|Dm398u2|i0Tsvha z%U9UO>fFVbW$htlx=l0TN9jM8<422gWTH2|_3J80VkMYZ_L^;Yj7y8D8OojbbdU2B zOqRE*oeF*m!XlD=SDF!H^_F3Laj~86D9ZD}n#j}h1GTH4rOZ@TJPYPuG(-d^oN=X8 zEc7Rt&_3gdYrlo<-pTgObItg!cuR?bSlPyOj5imW*X=#MdKxJ^adGoXPMHfz1}C?K zZ#9Uibnm2+nW3YdYy=@b({zI^M|H{PUe(;O-w2=0+QHxu*#)K1SsP zKi4qT`r4987O`1c`189fKs6y8gXJqX)6)Afs|z&SE%G?cQeV!Hw3&YL3%|>N?`^I4 znSo^{S zq;i93rx&{BT!;UI_7%%?TIKey%UHVPH_H&%2WGC#*_qVzgq)hm-QPYe-JIUqpYZO} zlbvT=u|6ZmihG{8eT?!LNLxzKEO~qTmmJ2gvgIVf3VwKVClA*;IlYEsTzLrtPlZk^R{KLGSP zNq0Si$dPEq_%V+nw(0pTZx~~gMIQ<3!dKKCQ`O-P#}BsuFsaPWC0K(tCFf3`|DC$k zFDZ=sZSF@c0Y)`+B2Cc+35H99Ro|RRSKj#`trRxqW1MBpg(QXTS4WX~FLA9kYx}u~T_eCN?l3Y{6q5cGZjV#g2!SQVOS&+LU|;3u;9CQB+@l`6CZ zyro42ay?ae7h&fNhoBk?0YDxgO$mUGN&K*JPpSSaTS)~~{~wjV_sLneg-?b;Gvvgp z3#ryg^>Q>q2%>J!y}umMT3Wx5MH3dq85&uO+08P|A?%SU2rd$_a1%yNx(m`IEICO3_=c~OE!J5sqw!<{hKZ$uZ^lO z@l-e4DgR&Si+xA`-M}9(uH&D>0U9wp+;JMnc5Rgl5?2m5v7M_%Obz0nzw$2ZbEkGG zbC<&0$INAQDA=FwtfMN*mmhuU^X`e%40;YVBfvX&#jBG#%t~eGlvt!;Mu@al6n|Q5 z)L<1qn@8XqF$Y@PzS-p^qS(+vU`9tvrumwHU+G3T2$26{)8;-h?tPN&SbJH4-jXqfMtgBKK<@s+msx|wqRZL-pT6+;K@^kOOju+x8vI&rNAcW0b>z?fj1)6 za=h45OF!W2J%aL+`!y}eF9f3$uZUU*M|^JeoId`pTa6-ZFX9PAqzf}vpd8)cJNvtB zcD_3GEz(d1^_jNGIdwLo{fPVA<(qAC8DoLdB;1NlX?sZX9iT;gdNp?~mrAWtyQyjgpilyL%uaD=wbO16R%}F{k4U(zp;~5CAiGtxJ5}k@D;nNlnPWB$yJbP4c;fv zKTMfer#DiD=I@taY82t3X%5d;o>>L1_k|-b5Pt8mocymI<4Fm+F;-Tq$Oq96Wy$~x zBF#;*GeAak{L=qUHnyq4l#Qaa)tKUU4z}OTBrh|ide45!^y3bmIG?A)u?-LA_P4li zv|1!9Q*%(S*Dm#WRgJ1IeR^h4y56vs4<@m65tj8j5Y@bt&Ha*b%au+LD3(0G%dp# zXX-VpCSh@EQk=~d9VEh!Ug@^!Qd*7vy&42noPpsyfGV2wY0vRq{W|wm*dMOrUo^Mc zbsX@L870x`!L!aXQ2TMSZF}%ZZ}-|!Y`I^RuHtT9X37L^d^ar95e-Obn4I0EaVprA&HV!wN6^okMcasM&U;(h{1prGRHY+R`uEEEt=A};U0x=u;;9Fn+Dl+NL zhj}6WzE5{0Ol?FQS4-3b>qth|+aUNV;w*f`L@gMUO8xJf+!kCxQsZyc3_lOG%bBix zH4hjOgdw=uhc&yAgG+Y5>|C*?oZUeWI+J&`H@Mxy_ACH#*g+K?bRc~o-7mFLT$#8XUvWI~KHPzb;c5%NutiQs2>boyh0pHf90n*vYI*_)y{Y(0VvWm|AtS%99f(p|p;$kN}Kdq9@_v>R~xAY3+#BM48o zUOoB;-%mLz-;loiT4u41?)>R1Q@FxnnnqrDHmj91I}L`MeSZ`C0(2MtiqVEE-4TAaz6Fqv^P~X90Y+g-7=o) z_rr8YB24NW{_}kkIYI}U^4izT6w~-C$B_oz3Uj8hj%g0F1YvsSxtpd)iG3e|ILtp5 zLa8$P0azbAA}Q7}$z;2EHq%e0EkK)1apz^G9#G5Jh`rHzd;Y&=ME=q1pM+Q{>ylQJ z$2Jj~0hthYE3I+1SAC9|?|kxYF1+6=r$O{rnf>|JD!LBYOeG5>Zk44<6@l?WHkia% zUaR#Yn^tufT6m7>AW|wm383G{uI3)>jbw%8-QFGdS<=|*8^^}V{8m){lV{ouj|x_C zXoeF*=fLj!Z~M|>#f_`aV?P^1^C?PM-F_OPrlL6Pn<<9Z@H$s9+Bezj}F;cWWuO+Yjb3v$H!x?VPG8<@QIl| z&!;Z&h~>GG2aPdn;iKGkpJntK8lG65<%pB~*c;(!FM+wC{3ad=>SC>Y3vf44bq5&R$}6z8=aRnuP_%iEq3NHH!OF1 zB|Q(m^Lyu{?(M}_|5yyD`NZI)WGTL@mron5%0^JUp~*_+t3)vV(nnfM%D&ea7G^?b z?hFf1lyk&9aha`P--3y-#e77M;oBTy1hk}7p!#P<*6PYHydK%*Kn|z5(DMcm!k6a7 zs=Y<<1!`dauUksUeLZ(gX(dTnd_m8`a>QS(2;JbmPTyI1l!faDPSz@&Zk9b@EyHmo z`A92@*by*E9O2=b@^Q1AD0QWjT32a;O5A?pY-|m>9%@Jlqsf==b83%eVu9Wea?n2WLu zJ(wDlHfe}w(;+C>FaNpJ8qINrtE2^fJzL7MA%$LdfvsWszNK2Tzx{(6L!oWX0Ac{~ z-5#dqSpAP?E{g<5F5m4G_82EdeGtd*VITh1>L7w|q^($xfuUztRQ9FS2%#keYP%g^1O^z0|sX)<+*jG&UuIB-tyPRNQd2o2_qw;D+P5JDXC+acM)X{8lVG{;&{5X z*i+lEThd({X5GSve(ID4-)pYHtiAjb2(({N{KXD^nZD6fkK4a2QoPL3KVE|qic8G> z!|ZDN;LE9WRSv!LYtAv%e1v zJbZDSH`|b@zwS=r04HJsz@VNfF4l2 z%eMpXkf_aVdk5`;pXAgYgY<6dEPZ4;m@0L=w%*XG1s`HU?jvTn{Vn0xSUc)ypO~ zD5&5*}B0}fKu5oa{$4T8Vh>$ zp{3!9IrHR!v75i@T>0olm#%nk5{|qy+Wq@*egTM{@AnWS9D(I0ofw=0-2Yb@b0&Hl&>)f(q7+nyR8wzpJ2Wn11v2;-J?#iE`mO)xdE zrhLUT`Y^ll5QE`QgSA{|>uRKOFfnZbV1RJ?Y)C*FfLsPsrYog$c*Y?HZQ?1T<@Z3Q zkY8n2o7&0LBL-iy*%7KVpl?qHaDSQZIy6)(4B%?_q8uF$`^u&{>YO(iC}=ojb>b8= zn?u6ZHqsict44vBaG!NmnOy%>?g&OVKo*CEegcOGh5~X}f+!}=6@pdsAH|-+pILrJ zl>c=UQ_O-yalhggY1BFG5*o7l<8{IvFbjv*Ra}71Qar6Yg%7~hlpJ|bC42GoO-u?S zK=!=O21tZ0NjPC>CR-`T!8F+dnn(xqDf408R0`k>QPG63>!+WDd0hRh5!NS5A<6E0FbA`87t#MLj>pY#7hVu5Z7*=768EXGU4bEnB-a#5 z#Wp?+mE+LcV1r1|EZ|cpo!MMZ_5IBD3spph4%1w&0$EeEK8@_=_jA##^Ej57P%2Te zwYVJ0BW&$Ct|FVXIrO6M*hJjr-3v)q?cGqnCRI07MmSGi`h!Lk&_4COW6Wv9Vok-A?}`YButESP1D&g z?hO^sCPNGdNYk|4ReODdv`^~ju`l}*hGvCXq+dD}E-onk+0p37~i%{k1+`oj+T z&OGPwfGcCGTwyD2y|t^gVKHub7ul_T7yEd!C@bNxEr6GzXcd|9;r=Lf+^%4X@L--_hEgPmG1ReN`q;ZeGOkFH4- z!Bt&+&8W)9N`L&((c#1-=gRz2foWCJT#MS6QWbHiiaa*gxwD^?)GO0nDV0<9Hi%t8 z+5|8!{oy;JOA!HCj<}5$$Fi~Q@fn#=wAPecO{O8k-Jr>Q`1qKO#Y*iQosNY=RkMQH zR}f-8GgZd3z6JGQ#O;O|Ohe-cT!^tCBKJHSomPl4IB`(lUU{G zIfbwjvU#Dq946&pxm(yBQ)xvgCT@d$IRr$ zDDp5DsgWqnnCQwxPTOBi9&90n_<7G;ryWCizSpLG8%A#V*l@_6o(dEUuDQYIB0tAC zL|DSh=yl_5#3Q68Ubk;$8P+D*)XtsBTh&wAe&|o+a$z0%doNFX{u(9kIJ_|BiB}L3 z9sb!aSy$3dn$(;Mm!0vMeb@DhM#n^BBGuT>F9FKZQNW{8D+j(**m5{hX>#jAPIm~J z6^zo;)#Aq7SA$}tiTl)zy9g6@ouq`=rS5Ra+HdVBNDkB&eu7d9UcDDz={SJ zlFfw=3{81WJYOi;l*H@lsq9|Y-+r`2iU{D2|5BA}&i&`H&^2V3*1a!TxZxTXfxa@T z&o=)z^IhlnlvD?)TD8tm2iXj~pkmPaK}0k+(P_lDDfB!NE}p1du>`Th?2NRHY_n39bAQVCvspeICp2^vevP*`Ex@=G1QRXyoVghO?Ckim@Y#8M z-axfR`sE9sO8>EwF06SSAh$ov*PH@<(A{fx$*xohi}}A!uIjdJiCn%n;#sxkV85dw zC(*Ljx1t8KOnfp<2wD>hFqQCHt2d*6+hV607yDNydaf~(YPxeoO+rA4xV4GGe#T$g zCoG4#^!Ipb-adUVEa8Z21q%1@+hdOtr-O-7Q*J48sO2WJ5!T_*uX38E1!|L~zmPPu zVa790Y>k=Jr?d=SDdVLy|zJux9x2&PkVh zJs;UU{a049Xr-%xEGI*oNNa++zig_E$5~CM-B{I9b{NkpOZ1jSe$BQv74|~bN1L^U zXsJv|e^Ua#Z__;!rMCXs?3Bk*I#ArPPkU+8gq|jGE6dDlopzfRxLjz2C1yCqF`>BJvL{=6Ig+j_CG zI?_x4RpU9RaNpxg*Bt08*`q%BbrqOpEe_-qjjxVO=5L?JEu{`PdPN8`d9+)2_1c&x z*gDcbxMAj)pnIw6L)3~D=9;SefDU$Bp4`pvBva^ACDjT1iiHG}j zFFtFtpR-MEx;-{eykIiDdiB9-g5Bq_3hN!&8C4DG6WSMQ_7E=@6hkF4Nz8`?GJ?j;XhNU&5mM)+!Tx%1lb_rt+u z&Kbg@Z%_Ep#y-8>_8{|Zd)r(mq=p$6eQaz@Bql%gv@po(crq4}RI;JH$n!Buc9F z2jB7n0gCOy_FeO&bF- z$2R9nkNtU4xe_BHq`bFOC2AAE?^;>W`Hn>Hj|5qi|7_~?|Dx_Y!$AE3n8GOAkw5Oy$LEMG!t4tl#cY?dxr!eBtj^65_Io<&iU?h z|J*<4{lP;fZ)Vo4S$(aUxletLnf`-*=vIvIuC}ev?Xg~a39Zc8cNU<8^T|DytH$n@1l%X>-8U?RNN8 zOKIzl3=64jT}z*7Z*$tXy6|kIY?b-)J@O%;bdQbzMgcT#xzD`y2}-p@ zfPSa)6rHDneDXd-_7=DJQu< z8h~-5q0R|k;-^2dKvvEWykhpo_z0Ue9}Gu~AT_dUHpu+Gd)(oF&0VV1GDDbsc3wh+ zE~>mY6lm4fJ~eSrSj3!P3A_1Jo@WNKQnbTfo8B;D>>05+Ub3jv=8zhv?i9*|w_!i! zfRB`?ywI0PW}s?6JTSvk{vqco4pmpQz}G?ZJf*tAUD)vE816(T?IlC5Ec)xC#ZNyj zC%7KO#gs*>3Ra40BZh4v$heM0M@RL<6$lzWVIHFm zqG6k}pHS<6IW=0o$*%drP^Rh@-q?Eat>q_B(qoA0)Q?3Mf!(UHeRw3Ojx7L>10k{gAT)Sg2E(rfqcE(!X1 zW!=bA9&)a9>?)-99DgNuoVf>?Y~37gSnwd#HsLZaE@^K2uTGJfe&_j=jw7i&DPHPh*Q5j7O52`@{wRf0 z@e0c}{p?o+MRrDErIK`taucIF*s($@c`C?=oI>LOe^^i@rdoDmTwX;1#vS`e_mVHD za|a?3!norcU9t>?cibkFEoE2wM;|8;PNY&BdM_`>L8Z)wBnKK>Gw@T^a<5iV)qPJy ztTx;*s1@kmcL^WivY!o-sJ>u%szqJ*3o!IXVU3^?+fDHe%SW1D9Z_2;4SSlJj$^Fx zm$xj7w<@qPKI>PXKu3~&mLy-OqZ3g6vE@mUQo`Degd8o}1uBGQ+`N?nsNE~YK2-fpNgdH)s`#j#AE>Cl0&V}qi3s>r11iboahp9!ud zf(Qp3u5ocHh}(Pa?q2L<*{^9Wbv@4}c7fWiWv*QNRoWX}I+}+4V4FjhvRBxvFIIfe zb_0}{YHGgy58+d21+JhhFa&jvGznsK*3{A$-)HY`E& zbhkV;-g{p76zlL%ysBo(w_9}N!viB$@$V9aKW#4zzmaxOM_9L(Vd>iV*}8Rh^-PnE ze|d^f;fG_bqnqF8rWb9VFMYb0>-oxXKLr|y= z2o=1lavdHP{o;;>4Ie0Dwvtb_+VVlQ_pFjD^QL`G15?DRmSA_9De*EHX&eycw_IFq z0dbk(taORjJ%>6>Y3+xFJlN0#Et>CHn*s@M`(=t85Jn#79g-pEn5~dRdw|W8e^I7; z)!=>y1C(D_wJZiU<~dy*AG=pItl~tsJr+|e8_Ua+ZmNX6tvJE&hHZK?LjW=MFVk9KLt6_Xo`2Bj)ia>PNfN#OkfS zXa{7T_m?4|f>J7JLX0MD=&+D8-Tm^BdVak}^X08A)rZT|44hZ&VkZ~nnH0KBHmyugS()OK%P@0V z5BxKqrYf=GkX1~>B%NJo&rg-3y&A1sGNJri5P8>mEf_OzpZh#Dz5h1XHpTy8r7<(% z0kTi$Qhf3+?9h`LZpGCIa-|Y8`n5vJ@GLYe&YlNR(G}SH?i8{}R@-@1!uC9HS@Ume z=dRjRT0}^47U!!yn}s+^s-}iihE;qU5pwWcD5G>4Ghuhu93Cyo_pX4LB3Hfcf1MOK zpw|vCcFkBcVD)Jk8vnUMQQ8-gG^SVLIv%4>0RvE9m-ZRDe6jFbDWUK?)tAs5{>&T)2RNHZyWRV@ z$#wnh6P6$B7l#5px|xT3Pv-_STQY1zT{Zg`bk&(4HR3H&k&mY_LjQ z%zkgA)wnh;*n>N1Uk_u;KgaBaxfz8ZYVhr1_^V=I+K%Ekc&^oIed%D2aIkazu(x0O z9r2}DThP-mCzrPIxy#$h#j_p{k4XO1jpHt1S2AH45>-9gAcIofsa*j`?S?}1#>s=Rz$5p;AOcS|Uy}>2E+L=~H9+YxqsTs!WteM%O;UpD%dHueV3=}8%NjLQV zH2)f&^Hk+%3i>iaEs2i`#$U1&XD@mR)fyhDnIPYLoLA-h17R(vN7+MJwdsI3x5_A6 zOP4(`+7kF?gHaS})iqvWeBwglqwd*4gqn%R7hc$TM5rpB)-#1o{nE$gF#B>1rwPwo zawYCzo+w;`Ai;o#q#Xq#GR`qWCiIX#tX^&wiMf6FoMeP*6F}CL+OA4vC+r!?%lgW9 zqWDKby`e8hp2k55-n?iIMFU)KwE&0sE+<{0defpyfJqp`7q}s?RMOG!yzj-$&7=3P z+qgXNH1zaWVUaWH{#vj;<-w`zv{D^sjehOX9x%`SP6}eMTGlJ>Vd_Q8obX{ZpW8ug zJxU?<8AdGJTY1oatp}%T@zhWY!-}ldb^XGjb$=fmT&Co|E}lRxh)$ZFD_G5NZo+MG z=riu1WrPP_!lZ-k)40ZN+LK*~x7?ZDq>2=BMsel=ba`3{=9fJ-byON!5D2NN5fr8T zH5@8dCDitjw@R0+tH*Qy&3JzB$e2_S?l}1jqlt#9d3| zN<^f&8~zJvrFX+CyES+d1Y7#w&t2?90sOuFV(PG=J9NgK{fkvJ&vRE~-#dB3YJ8+ubjjd&W*6MkIht{dWFR^md)Fs|~TPRJP)f*r5 zH#!`mUm!Cd*qmFyo z?Ut+Ay0+~x%&_1E=T;f%9N7CZcV+Pw?tP(s_X^9RV{&_sl;W@GVUZ@DTj2BVsAspZ2q1iSa8@vUM4c@U3H zPt_5FyJP)R-EZu7#@;Yp8xZi6Z9B(|W8@`z7zJKeH~%o6AVI=i&OdXtBa>yUfBxy# z9wcY&+_jASKDAtn+jziz7It4VZr~7VH?4$Or{la25tHFZ7Bv`n8=UA~=V6f2=D?&a z)>Jrp_GpCTuDa}XG;K_2s%`&fT0@XwwSMN;mI}D|J@ImPItIQ#;p)CIr39;>#4cJW zvRbI3%yzWEo3o4{v4u@HDbI`f>at>o>utI>(y2Gy$v;5d_RxHVW=RGu;I)YRp;i1n zpL=ar4Z`S+lY~=x*}t#)LnK_UPeOiF&(}M(@^*O*jLk4guV9DT{GMo;`Wr-Fsjvcu z`Q0#%X+w;Nu4&g^e+u$#+?z0_?-SI>eGP8$X&{c~6XJ#b7Td+CI%2>u+?N_Q!_@4J z{SPaUwa39<&eX({P^y|zL1*`J#I`%L%RK8sqP;;#HCfs3PGn(Bw&JQcR!d30(<(`MgGI1?IF>6YSu z$uOJ8+kdrv>yk<|#Cpo3uU*JfYdEl4jB>W{tjYU~vhUQRdp0I9>lnuFccM1RJ)I>r zY+ivh980t1s_Z1PxQDeIqi*efTWl@eT;&>bqt*=KBAdT^-F)_8Btf3X!8g8Y)H{(= zd{snO7nlb|o7(eVCSlo}MtG|U{Kj$v5Y#de9&S4S!$I*@tE8mv%KJ8jgH&d`!p?av zP$?%o4<=Uv0XWYIn4jeYZmBY`bk)5>_m11G+Siv^~s)lNln5CWt#c>^RwfZ%y%#{&`cn*8Hj^yX?hZeVTHIgfZ zH}qz^RjYznMnD} zU?Kw$sv1rb5o5d_S&v7N@__iY`7$Ph2STBtY~g#@g_C0YvZ}Wx9hu}ag*X0ufiA55=!`8FFYrs z@03h>jF)=BrpMCFVb259i^6@=U>3syhGV7TL_z!}@)Iiu zLQU6z|6Be|`(kcYxr15?yvK#}YdvvSThu}33&}=x!8!h9@5?BCMq3Dzx2Re61cxD4 zxb9OIWY1?{@o;w-^LqK2b|2SbJU<=RgYS(i5`Nh}mi^FQF8At7=}+ASir9kpOgx%Q z?BRw_{*w{opzaj2=T(}ScxX@C&1BEZ!(P@mzPVoP=bg3(N8?e_Ix~@u48| zq_v$ym-;tY#l>)XJH?SfdOBq%H&1`L(e(4^mtNl8wyh0aQfJYGfl=zIgC~%|d1;!b z*UJXJEM86H*Q=|hn=PODZq@s6sa;2s6^4D^BqP$5lyZE;#rc88O-$toGU4r3b|U&s zjAqZ?_y?8l(X|h+V_C2qgZVna?}WF8K|&Q8HWn0h2SR%^g97d?LQ|PE1Nt#auTZ-XR|15IfnK zBx$C<$BG$cJ%FxxgEDw_Lgz1ELoOO*yDnw8Mk&$RGsS(mk8^ii5uB-x4?5@Mum@TA z`gv!etH1$5qAGSrL*9H1=A$il{4*QrA}7yOj^;H~iV@6hr%OTv!#!N>zRYG-K1k=- zd-ocb|9)m{&^o?A;(M*zL|xNN7zMqw0~!hkfI;L{g9URMuhUNRAcwL zk|=``V^0ZJ>si>?Z)YqK=1lZ58s_4m)pCeDRZ0fJ(Bi0YrCyT~Tfu4EkRwL?nb)tW zV16X+F(E`(Bw{Kq(EC=IJ23^J9*{;ee$bToyr>VQsM$KU@$@a?Bu`9l*Ga}}aI+(j z_E;`WH3O>5hf(dt3spn=?z;~9VW*H*Mym0AG}H`EYNp%l5v;v7mLo3RpZ>Z%q;Ym6t6Wp209R zX5Y(is@hu~Ccam5#Lv+0HMtU=TigWZ?qPXw8770UJJ&XBj~t+Fb9Dvj}cBWSdz>? zXn!vazu_1z$)`{X8^-TWXX&9VbZ=*y(Iw=3FF2pxVL*_cs_S7NSzH>rkm|U;+@Xq@ z5FG`j_b9PXPa+Cbk=zC!0otj|5}$Q0}(;f&Q>NlG_ z2XJ-Hkr`oQd`WS1RbcP!zEJGbrV76Sm>O08`UC_mlAu>_+;%yO+vk?aF-wG!rZT3Z zKVBa1T#52-9Rw(~U%YB|9>4FNyvV$KapoK}-y5o&({6kd$j)MNEoapElKbDf`XQev z0>?B)F)8OFMAP_pDi`{bxoR(icn=6dB$u7fI#elqtK{!9rhWkJ<;XD~rQ5z7OElOI z1p(1lMywe8iA1PH0*m9>@@7X(U1b+%m)+>ffWyyam14J_8-t1t%zGb)@`Ol!Op}%p z&6_F;Y06S71BnLx7LDTL5Re1dD;(kuRB=@wgnjs+sC+is3L&Q%i=Az+Mp_GZ+#UWf z!#7qUJoO>JgkI!I3D<+-cOa}F_%S5Y)(}sImx;rfWD-&XEe3Bzf7F`z+{Mz^ZX9E+ zK+UTur-?cdG05`{T0P8F6(!GU8n)z!*brK+-(@@CH$u(MI`=cg* zzETcHsi5I4{;I+gyLp`EzPN~3himp%{?V)J+K;NJ-8 zq6~jKPf*H#H0$*}fU zVVi^Ki2dv^NyeD~rHE>Ngr1)Af?;&Q@{-=DmtaE0I`7xeQ~SO5``q*K1;uE*P%BEY zF}>kQi99?o#^y+K85$2M<4s(=`30U6iA>Ki(U@tJegBI?CzuLGu`x<}%NZR743cJA zd5DB5Y+$u0_y_})4kh=AzS$!5ii*l3Ro9e7$&cys9v|;2OW%!od2Ob00nM%I&;CG> ziE~Y4qS^LNOEp^3c|uhcPeb*vNbXY>(>Z2s+(M+1*x$_OHSFH@oB5jLXE3IId-;l) zD#8)BQ*vH7i#m=DJ@d}zoa}wvqr-U&21#A~izkIK#Gvc$gerfK*mnI=ElAlIYTOot_kEU?XW;%{YBQ~f7t1C<_F$@Q-T$F zk)7g}U%P5MHv=g^sQ+|-{?KadF|td%MA*TTwm|}o3|z*=UQ4{U3!J(YLF$57UHQN0 zrMEqC>XrUVtX`ixuuHBeAuzR@q^Zr8&WD86`t9M;Wa3Rc^1*VDxg962;PWKn_np#* zZ^?sodyc+C{L6}8ZoSFADG%<40wo;<)CA@+BYPpb6< zA|hn>`QFLE9M-`>F%;3JNvuDh3jvR30@qB+#n}Y(&w5QfIlZmJal(&i1;Q&SBa9`h zL#ndzW-Adh=*`@%k*a}wQ2wik+uZ)_Zt|YP6tiPH14DtWW3@e+sEbmYKVlyD|3C%+ zX2Z2)o5?Ob%rk8K=o8a44xaD zbl?5O&E#i_w03oxdnk6iW@MqWX{BJqk&S6}d>f_rEOPqwc9cTs>KoOZ|s^-tGxK^s`FknJtoO( zu|+ZBrrFS5uj7P5z*LRUKau)i=zYMRR~fRY>dPfyNxYVpO_O}5B!Z^s^c zLr!tsykA#-eK%`VM1XCaHP7Y%CwUOpNBMEU009jZe{|hZ%V|AbNnt-_HqNl&nLF3E z%a&g4l3bvdI|qXpS_>Y2AGqKsNBmZYtRZIY`-gE_hwaNxk}jf{LAN#RxjX^JHX} zN<;!87k&2d$hWmG&fn55*XAR~X+s${Z)ZNK$Kc0CLM{tG!AZeQZ2NL-{biY1VW0h) zo?G~zWiL405SDmm)UC(3RwbZgW0@Kn^Jv*B%}eaA=#BN9O(jJW&mhYtU<%5&lN?(u;&tA1an#$^Jjn9h#6b_9g6UU-rWdx5VwrqD>n(7@ zN(pfwr84fUzUD=_6o4adsREN2)|_uRjIx_d=K9IvS9>SLY9z(AMb!mgJN>rSboppQ z-PEA=BL0qEA>}=iOV(huP;k+`kIICB*VbPy zM*c)AZzmESM7LY%9ux@b3u38;Ebh}#fr1FLI}Ssw@UnK*{W7+^!woc-pCZ3dQd6NMwqtC%S7LhFsYLBZr}_Xm!z392D4?(KjdgQa=dla&M_0i` zP0O)o``kNgl@ymXOA-P{X5^xwpFLmj&lLaVmq6aA12}hx3nD^K)j`>sg4&v| zG-1#K^1wTzY{cfOuAySM%Y1j|MhW`lWrO+txC@^9RO*WmQyK_8EneD2<&hy*@VtOC z5{4W4g%`xRvbtNXnA}hq2?QvSW$+$fZ?aW7Ej7+GeT0nc%^!TA%zL*?-irhAXJlFV z{^rC+OOutJ(S@r6PtDsqr)gxu?Q+ZnfVZjXFBdLj?KC0kvG~fyM&(xp7q++ata=6G z{@SvwBMwot>By1H#2~S;tUSag%~r~sTWMd?A%Iz6M%q71iQ#ZQC{VG8_bVPAVI?D@ z3nD5$fP)0l^)J#ipsp%VPjU32$Z=Np47~R_b%UjT_(L5#29PdlH1=FGzV=W~W_9#J z!tP?{3Fd5Ck*Klcz_qmcVmIPoYsn0LTG^Hz_Z1ZOT*UO2JP_w?#;6(uz%@2H9l zx7xD`%$L5@d<>zor7Swr#BXm61|M^7ghk#O+ZGd!e?9g@`McIAJ}>1gLX8(!7VRA} zyO%VBP(LSD2XIP9GIb6y3r2WU;}LR!e4)=yMYrgM?=X3gkxTQq*Y$SUgQ)77%G^97 zmnD%%d+Rpu9LyJ4W?#FBiM3rO72XnM5bevdGTkKNPBdCriTTL<__5!&kq-*fBH{BpU6R5@hT(EC#~~ zV#%`e(_pnoTA!#-NUIf87X6qN?5!SOQGjsQ{sc-l(tg4V=+eF&`^cK536DxGy)|Qn z*%uV7j=OEiels37-8kDX9}P$I!sni>t+esn$?y{Uww9=xV~A=Y!e8bZrV3QDS0s@dtTafn-jf*QQNq{HY-WzEp66z-m!jx}D_ zjZX{0`}6HJH$2;Y9GO-!LIfhJ9I2d(tfB@#xFxo|h$M}rI#L186$_DM$mQ9#SOLc1 z8qp-YeT1nho5}}-_E~+_e=3(ZvO)WKbzXYVGULbaP7?^Z_FFZPd?ya1ou@hARUhO1 zCGRZxdxh-mo3?&;7%BGD?&gT*Ru8FiOx6Pxbc01R>?5G~kq@p$qC|V6D+<93{3R=K z(5YAPC>MZH>3`8bpp9g=%}Ke4lQIW(C_RDp&zb||nzCCNc)YmZzH2FWU7Y$*pmJF= zrE`$4&500xHW%8<+^H@a69*9&y<+u5!=o;tucxpdXHC5(kx6-P?4^Go@}+A~-Qi-! zPo9xv3u>QgY}NH58VA1rb?8x-)_2N7(Hb(m9vY_xa(HV_gRp9^;&vsPap0Zfw>W2G z*Ear0Sf0_(4|>_}f$6pBed#sV&r&Pngph9z>>Vo(i<`ZcIbxK`PCka7mboatiGAc4M<;5SP+qbtm~^o9hJvB zBpgPpDXH_5TpQlXei)CJ5u;krlGwUyb`01o34cgJ^pv78;4dM}+N(%2w#!@Hox2Pt zhiSxA-gbf<1a`UPJipPreNLa0aPz16=FT&8m0=?8EvMn(H1T=sE&3iAow}{x8?-5Zxn=!dlzmuVO$E3BQ<^qme#)T57qj30FX?A%!aXtTK8g%vzX3 zL5_7aR{bt0#c|nrYX%z`h2i(cSDgFv$C!r(z?NZ5Z1dgLjug-F`tcht_uclJ9+LtM z2_z~7V(s!RP%X`UnsGXxFLUl0e(a#IVTJK&wAFhfaO3W4qVzUarhRekz8`w%Q!UXv z_>r`&JD;V<+!k`fc7CKbTC=+I(U8Ryflb%ti0Uzd_kpIYborfyoS`=Y4?n0V#>21> zPFZ%~jD`_A1JC~|-w(k1ztd^`Uj;a}#8|S12H{8$1qbpcKHkiR2dFc79y7HcWXLnE zVSj}5Ff6og>z`~DB*hW-REpl43)eqosu>=7Jx2HaYMhQ*&R}~3bdm2I^WNhH90u=m z)&sNcVu!C5CX(Fqr`n-8k2G(jh8@+CImgTbE{OH4%?_&!a9=@qnF8w&2xv#G)trm> zi_*eqv_PFY=Z?2tXVdtNAHawKj9|MqY+oDKR>^cDBaBIl8GJufyls1qiTLGnnKx(Y zd53?Utp}yj*VV6Qt|p=0lHfd3ANq#HUMd*(c9N$Fmp>r{;UWIul1TmA5nNrAXtlfy zhxl+Qbig!#ipk^Ig=@rb$sj!059}Z_>Xsm8OjYUO)8Rx%Y`#50XLzll)S0`Ry*4sB zFe@*(oQE_@liZDLb9E-aD=g=jC2YLdpqEJ#x=&u8BucGd%ONiGxEh3eKo8v41(kr4 zs%`$~^9?~IQSkYffwWkEk1H{{MAoVQMu9$hSezc<>8jm$UDDwk_tW3?Hhfx-oU}1p ziG!m;P7&XIt}%?*ViGh_prZ`u@~}H-ulz`CCR?PD#MgZkb*MMt5I?s%ybUX~riy+; zf~w;Cu=I`3<`0=_rYShY&25gvgC&4ope6kdtn0Pt@CNqUvlgw^T=c+;0Ra{6`aIF_ zW0ce#Xk$OB{yL-Eq*vVnL~IeqD?PhIzF(;|>x3S{zP4CD#a=r#m>;ZQA#fOls-Q%P z`*4UeCyI6-zI2}oJN^1f?N6~~l$jtQc zpf*%y^W&uV9)y|e*O!X6=d*)my9r#fXC$fp{;@X@`y@jp4sj3LXDtGlBcv|UPF~F3 zI11hb*A}!@-X^{I(cj$`33Ya0>657~a;3=4A+>&1FUk+|T*<~!hVv)Z-~@=b-h{1Gc@N}asR)kb#t zw9Mclp&8>dq+dRWG&f?x_p5+bwd*H|O^fvIsWzqkl;MEcpchD#PWCYC;y?q+T^sbT z$K>Jtrxn|$C&@{j)Cv}zOhx|A15_DO<7x8b-%rj7CDTGV*H7X zWNB}J7DCsPItxO9+djba@iSOAZ)eA3Qjih6qcjM5BE`u7?Xla98gdg2CGaes1yiE^ z9VWz{0FYCXf}><)-Y>(TD=&X*6X|aN+PnTozpQ@^&?L9OBz7)@iJkYhD(0z>A$G&# zPkLFYp3k6E$h`iIy9vWDY8mXu$r@ki{Zz06Zk#t-p=*nX$J=KQhriZ9_1S9oS5B3X zVAb_8-gwKeW{t-Kj;GR}W^;C5uZxZjuxbSs1n+P$IN4wVBY9~NQN z^>&)9?MgEqe~;|tod{2KEFTzAS_GytwakG}G*bQS8x3VTV>TinbhRY(XPVn-r-5vv zO+zRWwN_BMuK_nQxo5(BYcc}nelYJzLGdJ2QmVM-lg< z7iV@|y=wBlic9l7!zY4&hyYEBpP9j|qd{A}Lwv(%Ifeos4&x}p7I%f+Y8bsK^GZ3m`mMb8B~McEdvje4 z_cK5M`%2kQ-rJ-k50cJXU-!)NK4`V7nCITf^)J$T_g0o@g)jD^@Abrt2p^#DhHxQ@$WttED)%0>SwBz;!l(E-U<4( z8TcsZw0Hx-(CBW);*OoaMO~Bam4!>f=>10akum3mJrLhjVwU&_aSV6H%TC$%`~W*@ z*Oz%R1&A~-_lFpn0Im^G^0wM245szuc{4xeWZENC>;YB%&T%}|rNA@E z<=0nQ|C@okSA{0Pk=g(Q+@iISmZN1T%J7_2uV$!m%rl9t()6&px3IO)n;m!@zfMm3 zMhiHu^X=ratpgRhg7D&T??bUh+`0GS&i6jK6SG0IAlYMQ+sqkgd#Bi`xanil*NN?%l+MmD|05vI7Q17YE6KU3N)k6F)JN7 zJ6Wh0aeDL`TH#iYg>5Vcr%$ms3<0+7e@Bp`ycnzh<*9{*K=d9?R!SQ^v|#cR2Y>n6 zaNhrv;3*k`okdpYvW|ZpKfZBBV=FNJH|1>n;c+IZds>v#$2#MUZViuU&>9UF>q9cs zkQ&DpQhh5fYb#3sH7b;#*3(a`{ncle@`-#4@7Xh4f8~{#oOK|s&|POr>NccVgtXh% z7owMKpAN#%GLHzcVQfj<5iF#fBP%jlL zaJ*BzaC4Je0}J)qUwvCXb#Y@eaxe;cuhU~iN4*76yP&X$Diklf{!`^m_UEaKr8BQ^GPK7s*Wje z$>N{0u+C6hI4@yvd%nBQKAJ)IONb)mm7V`goFN8;cS~14!)WroWd{39N;lpRcA9e( z7w9C+CxdHCA&y))HAr?-1(8-`8vn?vGe(O37C<&-V!Z!egJ^};4=l|<%83+L)^ zSn&gYRg{pq-lq7*Vyy{7u09Fvz$=ZA-oKlbH@{sdeVI@4Qx2Dl`%043_EytMy4=Bf z<79WMqS*Lmm6xh^TcnnyF>%Nii<$9Tmut0dh<@b*1so4=6;v(9H9TcNRD1BKOrezs zg;sYN1uP~8x<90P&6Pe4GUS5LpVd2@U@?cd@IbJkXoMuDVj>s+lbg$H^U0$GEcOLO z>IoVB>V}c(yu*oo|1+`M@4?O?F^a|?`llFkU-B6uhI2Ddgk11jMnzae$fC~vYGhp2 zY>`0kqf|czI+VNHW&Idh*d5}v5K#qE-IPbweeALJHw)Qj-Mr(W!{|r zQ2I^(O+Orfehl(6v;%8Gp+BH(`rt_Ot0pM?D8VT!R9C9VD$klkAyz6*qmsBt<)OcV zSXQW1APTPLgWkpoFCWYausUz0;Qibz{RG-5%#mN-vaKDyERhusWj`I@p{)X4l3p!8w3mTtecMyNJSSOtxh3(+8d9Tt zFWh;YaEI^*ljC%tm^$6^r8?QDPbMNa((eSuwc+7UBY$z6t(1T*<-MO>KL2v#bh2`-juQ}8x0ym zF6_@nQ}5hN8=)?tLvYHi-LSQmIgoJ~LP{qq$$SfcQzZ7%LCr~O?}zI6{=yHh0p5Yo zc?Tz?EMasia)4fV1om;^x&Ke6*muBCIKDuQ8sy~`y{zR1ixR0VGOw>_5XwcMBjZha z7LTPrgv8u_C$qOk)CgfQ#1aiEaTHjb*;o}` z0U{J20+b;i!XgkISV2ErVd7;KK9G3#!NI2-Dk|K_ffGigD=XKEsEnVZ)5@>g5%Oi# z%#>Zz|6YXC75ug7952W4ES}?-SX-;9Z<nOsX}yYUM>;?7i%2VP5g|$;DCDHk21wUDH_J{v+eQe2c}=1X6gy#XRNfUQeFT_lxiBSjZ2>z6>p~c zY*=NndTqAR_yZO4%*ya8NiAS$&M~8!4^4Zb5Pb@aOUFY^LHzif5mdG(9wL_bIgO$% znNW=v(?fEI1MA=p26b8XACF=2a!1W|e(}k#FT!SP|DvEeZQ}D&1Re@@@2LOdV|2=a zp#5v*BX?A&4HZEhIM=^^e>UWNKK9&+V$0@ha6ZcLaZ8d!C;48|(|dT?pWwUofH{*P z2NkF5%{E2<0!)d6OZ;+S{o&@E> z;*b9|)|DHzcWAd;Pz{-WhQ8{|dKdvE|a|$L&dYfBZN>{MU2{|M&_j)B?Ux1W@@v<=^mi zSr9F>>r3?m{+oeeC-zhQwrMb1d2~NC5`tvzz$0<-7tQtcfIHilieDTa1;wr20jvyJ8psA4aAm@lA^ zmMAOga6<={mDm-U2(@SZP{*c@Lrtyp<2}LGX-fooyk=+MVD*%|A8ymsYp(d$WB@%V zMhFihN2=_jF@D7h$GseDq{bEoZM|1r$Eh?V_oOh=uRuL=j5BG3m=6?&Kt6UDig+8d!1}risT`z^l#Y$)Y*%76-z6Sotqui%sx9yfs*!Po#c@4zLwe!Iz;P!Y&Z}EexXzbKsUfQ?IS0R5Cu8;IpUrJ7)@=iQvG_7iTHJ_@ z&){s;{!W!5JRH))a%>;kpLa~1Eh8QF+p(iPZtf?A?tKhG6aFB5ePzSD^2NKrOS`)l z4*K;P{dT=49?&YwY+-wqpMT6DAk@HyCU4eCp5}GInjQBEU*Fy6R59vM70T(mVQ4SLw5D z09OMCfs9LehjR6#3W%IBo!j?}F9WitS4T z4y+~zp__x4vdw+vJ@lKa32FDDA40}Mfk(?)wf?QNA)+Eb(|9cf+^zatL%-NEHhvV` zOj2{R3|u(NXrC)|0L2U{`Fm}~dt*)|AKLUJP(j&EobvTgISXLVSF1pcK=B$d|Eq+o zrir5kCAr@*9RtUS+srruKT4h$4^Y6ZbQiu?iOz<)&-I~6>z{QLUkaR=%pTVF>v{O< zPKLuJm(Cu$y*hn%V3t}}DXii~@!BXcwAE5qgr6_MR8Bmvt_VsIlls-O9j}NR06w_` zC@;%AM2L!9d(~G}akpVMYT0(E>EdaUI1dN=o-SDjF_qFTS~JYwCl5#A!;PbZE8Gtj z8)ZXw!SRfeJij*AwQ8xv!YSJ?Zsbg2_V>9X2NcFQ?NRz)phS6dOGWOPAF?Ceq&qzt z=t;JJI_}SZ;lRiY#jp@4*z#WYvh1WD?2ix$o!r!?sGisFM^TP^%l`L>{j2Y4CfVU= zzG3Maps|ugy*5^edKr6;CfQ|V&F|+p?XBPLOk*k2Yj@kU#N&`-p&kMGLPE7jZ?$sI|)HhexV}RETcV5Dr|4 z^z1)^LiAzI(P_ND)x#TYx!$}Wk1(z_Pu9x@`+dM7?ryUwF6%m;1ywf5Y1rYerD*p5 z01B?RM~D5+)OQ-$nOK!#jIZC~2s-{?Mz(68wV?<!3H>M3x=uX0NO=-owQLPnW6r<-b0&4S%286f4{6l``kOCe170R<>%i3S zpr=<_o=ZlA(?#vx^x%K&3y>Y>uX@>o8kqa;f*(uguSEVQkXI+g-q}5=4yYoE5*#Ud z*9fwhi?LvnxGan$txFFH^LEZ3dbx6>$Tf(%gZVzSv|vSBQaJ|t8yZ2AU5F(c1&fbm zq4$j7k|JyH1Uzw(FTilYF$EI>za-mc`_l#6dgN!tAuBn$X#Ss zhu+fS4WQdY;`5$L)p{OPU~n2Ns!gkXBC^{E$8VX`tZuASRZK57?;Y%g_=VX?KJ5)N zDdz*&mhsrSz8%E2r(({N|CSxBgR*o(U|%ey*!Ag~oSd!nf<=%=3Wb$1x~;ksjBna1?7}wM|#c zB&Z3bAsT>Q7?u5>PY&2gQRiUAHN9g{U0-)WqK%R)0y!w+7`X^5m zNF`Zyibx$~&#!5R+5#p1$=!b@7yeK7=%05%(iQbT-nD3*hyRDxk$%U&`yH;{G88;a zae*{(d*vnKaAY4dSVn3#r%3}^;M*~OcQTAxft!F_(iaVqtc z4s(mYvmxbF@4LIFK7Q~tb#kygz>JiAeg0I(&UR+3;uFkYj+nhNKFlIMcwuh9w9tQ+ zGF%!ISgsjgBKAl2pmtup5+#ldS9V&pEinm9;^RQAR*?qm=0g= zyZ(l9cVdpQ_d}xzDHBZQb~7+%RRJ`4^n{Q+zWbNon9;Wm|3VZfJBgP%6rvuJMp{&S zV`gt;_yi;}!^*|`?KTA%N$nNE=6dtvAf0JuH?|SxIYnyhRHv&17CKtl>0-YLR^4PL((6^qIqD^k7%MjTu37e&(%grtDN|)`-LSgXE*v1rE|^`aFmSp^zDkEKpysUg_z}mS@;FoB4m(d-G_h|MzcP zr9~x0tF;v+yi*!kE2I*VErwAvS;E+cjIGq0C}b}h%D%5-#x~SjQG^)AGR!FZj3Laz zjOBigdVfCe&-eHH-sk+zx$krC-#NGcnDKf&x9fUd*W-Fz*TwtjQNUi4Q&`NLbU8q6 zUlu{@1&GC2ko7komiY8C;)H8Jc)(Tny)NL`Uh`gmn6Q&dgq@z4Q959lUH{2cD8kG$ zQ=bzXe(?a9nFo!_((SH@>7@sP&l%e3_7IU6-kM&FJSlDJa@8)w`nZbfJwRL#J#bDW zcKwrClYjCNR_^phHJopPy7rYea)sC5neWudk@!HAw}segifv5?>sj-@7#-|d=v(L7 z3W=P%opOF=d;LIZM$DYOB;Zs7HzPQrZEwa&bCa*xeFkUV*j@PKeZF0Lg2y=G{Uq>6 zW*(u@}ew@0b2JFF{lg_Q3@E1Iv}N1&Rw0aUnC1rA{No!v%tBPeA;i zpGI`s0UBM41}vT6?a^DUljludWZ!lju}~8$OR-b=4I2(25EAq5glR#FxJ zn$fV0qLY)>75Pnrh`GJAlj9X0hg-mz*9P^c75Xq9zNNf~y*}@me3SAKD|U++w7s8`A5ex6$GUk1B(f4+(%oVdj=MjtLNBnv_ z4Tj6zhW@Q&PnyHKIv)aZj7$I5%yiyAJetXT)zegV_`~;paIbwxezjxU`k&o+q^LV= zLzD*~cJD+Xcz@)pk@!V;sZ}m>{QBqm=3IolI}jGlA7)Ru^7~8qk744*$5mFZ;33nW z)>rl-j`Qxo*4C!btM1E!c*y#r%rb5hn{Y_o5PPAbBVPx9F@f@p|8 zH6a0EP8l5asZpCc`NhCaJbhbBX2|yTv%B6tOIP|l{C;@b_RnvhsXU61-DddgsG;ok zmczTQeeDhmgR!|QS@m`K2vBl$Hs341J&*Io%ULV<;ps7xT2@{)b*0z_(0(3W`pHDB zCDeuO#&-*of!2c?&BNk(Or(Y!{N_(jp#d6Y-w5xn+IAWCa_l~T89{eh1z zF~YQ#Qx5!ki}uG~Z~4J)5c1FMdn+Oi5+Swz{nhn}u75R5;}_@VplQQWTQK_v`Q^*u z_4&P(b{P~C{!Ojv25cH_K%n7$@+cV?iC2HKac+u$q5RFcaRxM-BS(Iv@m)0NtAZT= zeKX_=fZ6{|#!&_a=l_D2y!`@<=G__#)A|N5N_Ddw@9KTK_WPyhUY}Wrnq1>FtfhbH zcB`ga#uS8ER7xyKNy`N*H&dOKScXQR%$siT6SD>?ze{`crjjx-{= zlQcWcZrQ}Qd;9u?^#noI$!rFamKv#0?_GW%H+yO6jEpXh;$i#dXDRZC`f-&lVIgX@ zB?C(-4O|cJ!MS7UXY6HkK(2+o_}gH{+@2CQ468d-zB8D!Fni9G#GSDnOVF++tDw?q zJUD}k_3&u=IT2}?xQv$O3PY|01k0%{>ziPFHYF`snf=5z`TMcSel;G?-`N8S#tZs`(~@~FWHHZbY4x}YP7Udibi+=Je*&Zpr?4@q^;@_IX7>=IwB zv;d-x1ZWo6w%qV1TZ6@H0^7W29~YZ|IPOcf*tSgqQ6G#!Z4nPp`uvkb+W_Tq#q4sA zP@SucRDk_1DGd@7>nC*(;q3T72d zGCU@9Gn(H>tc>O~`xA;@SIjVib}%8&1a<`?5J{Gd$a;CGjM;IOQLWV_T*jCj(XSy4 zu~Q5F1~*i{f^LWcnNLPAOYfQX&1`>CKZnd-)2!cm>Voh5PeOVF_q$P@5-}TaF@g#x zPf<3T_`Ctu4vy`a;cgf9)?lvv>;~C0&J4>=4l|{0NthbI_*$XB7}q}yUCo6EQ6s?` ze!lKLs5F9goU>^Sc%CFN)PU2CD}Eyy9Cd%9!uxa|oj3^IUsp$OZrMNJ@uk!sAyW@;DzIX#)jl=pxH0HFbnrOpHy>8Qx}DTSw)l8Z7XZpJI27kRmz3M)nLICxs)quCWQ|j zZ5V_#mRw2HN98!g{CHynsg_;gNMb?kEgzp(&EWqew6^L%o|C=a-9KNHd&~wJmYdbg zot668!hU|U%z`qxEwOW!hSh9w!GQ*>T)b;tL50lAbg)nP31nwBl;@;@hb6Sd$hh03D#KqVNJ+VT~?1WwDHnG}$F(gAP z0X@9Ca+Fgr3({(HLUk+Qk55fj?D1a?x4PR`t~=R>MMiLP%HZ5fxxLDK7umnm-=@jW zF7&r>KM?V~~M5_Vmdk(XF>jK42|BTW&nbGh< zKtz#6)$sr86Ri3_hsoEKE6aMU2lDhvEwCb}hqr_lutCV~`>o@1)PmWMh|ldBv-4FZ z-N!F1WCSnzEt@Z%b~9V^^7OMkPRHKYF}k3gywFlK;KF${j%ezg`}o$X z$l7NK*;%*bs|&@|&$Ky6s4u2eg{{h!B=3(@L0Z=-SjixXDsIc0J9~O>M2A79Gc6lz zqA~4uxCV?|vesIvechFy4S6+>K&)L zlsiG+5J?H&<&z#eHgsOy=I}yGt7a*23G}LPX=M%<)9>P9V*Pzy!$16W0@jbAzt($A zyP23TES~N~AQr?}xKtl)84R@zWR`d|9PwFmzIPIOUeQL%C9uFk>wAI-vficDx!<+= zs5kzVvj3%XEKK;EjOf}JS1V$59!iN^U6N^TBCV$D7l)@loL`!3Rb2a&f)j(!Bq^zv z`(*e|fBEpFf!VTO*_Uir0xPPJPtto$D$1t~tm6!_VUbCK{ zsl?)57B1_>esLq$KH-uI+7Eph|1qmPyV`wuiUvfaK?b+4{1&7BFik4By+E%yT|Q|t zjC+Xh>96bK%%d(R@ zV4mKTy#6vb+EW346E=o2#Is7(p1i;IM`74D|dH`UMUoctUYDMvRT4uOtzmkZ$*8bagR!4t|cD5!c*`odPs zHgD9fUf;wcPG3IMt?b+R>3p}CM_|+431g{USQj;?m8jgFB(UD+Ka}~-I{Zn7Ido3Q zZMSn>u?)3q@YZjAg|%fag{62)UN=Mhp2f>|b!i(e=Kj`6_kpQFZiCHZb{*W_3-f)B za}fxH)&jljLD@&0_|b{%__%U+xlwE7FS(S@BoAlvkjCVPGw{wQt;8#05VuJG(O}0h zd%Y*Iuk#T3BG)mp&q{-P9ZvfW;nfWl@)ka238{-ikk~P6AdXY=wQ{t_-@0V3aZIlW zy-}?DX{G+6q@HbFun$T^H?P8y-9*HxNgvx4*XBAJB!UZySIxVR+mZ}c#3tiHFp!D# zkuOBs9vpRjQB*&?TWBN}9kGWhR~qf?Ip4kH)Jn519UHi|12$V5oM55QX%M0v?z}nF zCuoUx%{g`@n2ZE%jitqF>Q&#LH<-g#jOnfjz$3 zN5&0*7JaOTkY|QR%cp(QUYr_fUl@-oQk-G5K;cp6zZD=Sb$SG%B-F@EY9fTP{9cYG z+Txn))tM;Ic^wfIhX~~Q!!(@XcUz@vuDRc<^dwNACkmA1i_&%*&l3}Ip`H!i4=DAD zxAb=C=OW^jR3+LnEJ#H!XjWP>Dxp9Ap}Su3Od*J$2LFJkwrfY~6AwLSpMFEp^U^_3 zr`DX#Mr$kmaH(Z_G<1t-*QpO4V`jbnV-Nmh=T%8G_@J;@nnA~bWMr=qVv zC3eIzFRns@*&~zhAKUtm*`TFWFhX5dD4oxg{ZP}ro>@ptuCbGgWxkvFC-KVFqTk@wP2* ziMv^BYprE&+Na(cpI(d`!?QNQ!-m$&-+XhZgYU5Ex`z?9AtO7FB~6*y?F&yOz}8wH^PP6{O!SykNA*zNr6vwGU* zs&dT(w_?90B9Y0%RXk&12_yep{ZT&rqSe`eNUJ-oHRVw$N4fgHC-ZLfaS`;K@SpN2 zlb_Dts8wix<(Fcipl_v@<}8h9tyaC}?&zP5G%dVy0THZyO+(a&L_9k-kb*A{hfOCb z-8=F0^oerir!}EJu}JTXr1dQ$2IeLSME!>_UlF3SwrJg-<}Vq%d8=Xy6NWQPiB_;$ zeq_;$TT7e8-AKH5LPd2dKw19%0r@0(Qj}(78S}I?rduxQGwQHu+6kaioSAmCm<7dG zqY22YqTpKoFl_LE%oRC{Vs;BQj>V;O>`orrJ;_w{PN(vRWmbM|5lzQfkZz_40H{XG z#CT(O{kyeRL?F(Uk8~|$zp< z#bdT=c(NPZx|eh2!-N0;``i&F|0fm>N!Y=g*J-tv(~<$3U`p^!k&)!X zpL>)LoDsB4#zgJQvT4}lRGgyPSfKYfMxHmFfRV@_4f43JKSk`isC3JLClA47 zRE;VZWZy3@FKD6Qq|ON;tb$;qOKWw@HhvU-7y4iXf0&hBKc^y;Ha&LUG`%;`;_`>Y z3Lw=f5Zly_0kBP(Z3Kf5&VdH;@t&mp-E7Z>_>*)Pp?&iK*dYzv(!P>nbrgQ6rK*@| zA7U>%>%h1B)NhM&s+qs}Y4`#E)=bHtz#Qp96ReMQuYiGoAhyJWBXXhufdYqfOx65%5dwI?TPVf@SW{bMo24kN2IS^S_PoSpt$_ofSf#!5I{Q?<}?!MT+@xP{}_>-^`sx-~S;cCJ{+M6y~06X=Tc`9!@9G4dAi zy~Ll}JEft4r&N2x%3c`}}Tj=-f>o#M01~jVq<=O7h+K0@kgwG#~4t z<* zYdVZhq$3TeiNmretxb<^{`S_s#%2}ZQ~V(kC?9=FK52{xHTaFG&RI}apd~Z%P@jim zPx)~%gv~S`0po|nr*>&&JpuSMfJ;StDRbv&J zCY{^llE)LxN)ye`8+7tFH$?_fG~qUK(5bMMF1Z@F>`Ih3Jd)KTM3Sd1xBA<})tpd? zApb*iSB!tpsY|J?SL-+{Znuv?FR)3C$pCC2Yz>#~Bo3{j()uPG0()D6yT^ z%N3$Ki@LNTj~01p7d6O(6tnV^jup(jl8sOW<8vQk_E(v`YxyMrW-=;?^1$Bw`^s0!1qs3jP_zfFSrQX~K-?jhl;s$5jK1)C#89P2&H@|MuZYin@FBO;!LL<* z;0iY2zd2!hOGzoUE~uG(CDS*r(lTddv^2rkg-i`aiTh zUw@ddWk9b|i8W-rt)Z10iNQsd;8{@?#V?HRpBv36vN%^0Auk6Oaq9aJG3R)we3C4< z|G6(NHQpWYG^3v1JsAcJqXdB{BdwKF%3rD;dT=VU)3D!Naa{D72TQS2PObUGQ`l5< zo)k?#?3F9ILjqenP{VR=U_5ysO&N8K#$^6C%lN2E^4pa+s_k;Uk!3jsjG$w5`Cl&K zHJR|u76Z>Vp{h(}La>D|hd(E>=u2H$LjGgIK;|s9H`846?FA34wix{~Tq0`m~r zTpTnI%IW^7&|KuTUpc!2jjM7>7QS#je*k55GI@A$aijx3KmTEC7*E~hti(2to`m?f zs?H6z)_I~)AZw(K^C^+`|1P>W2XKSwTMt38pmoq1xd2)oTA}v+qcN<%u>In~buP>H z+5xD-rI2GOMf&AeGGchjx%nk=x|U@B_SxSfO&DGrjVnp#*>`wUShUJ9ulSfCQfST# z@m`GhjKe8Tu8S4RW26yTAY(|Y`u3rgxo5)v@RJ8C4b29za| z>JX%Kzd)3Cht^uMMG^+(Z*lI!k?p(b>J~8NHaUv~rHzkaCE7Ci*WDe1NvdOcg3!8h z-U>S*sFiq(>olduvK-xjHWU`OxN-dfjIxCE2UtSqQ!fSA^0Q-BokrX&i4$G)a%x4h z;l}xMPTEBUo1|MpTYv_VP@{Dz+@fW9WZmGCX7DkA&)t%eV{`M3E(J=e zF%&;v19vxL^EXp_j2^;C#$kn6$?6F*II6{9fw$-Hl^s}WZ@3d{ab7V}^Dew3WWFnHTpWcF6}CZ(2rwj@BZ=E^-A5oqQ8$uS=}T21yy z7tsSC`~$1?wAB-DIgf6Oo?jJ>6d3Od`Tz25U~891`i;MKh56}c zq$~qKlU$cRd*5~GoaKklpN$<*@S++S6`hr07XYh6j70GX*oD^0-k~1}m8!r7yKCJj zKi~&v73~-?fFZ=j zkA*Kt!@g_J!9acrATtN1UV_rDD%}x>1w3uGt1O%wvM9gcntP+t{TmiHCbELDoxiHj zAHI?5BY=27d#+}p)|gn91IW|9OyJESZ9sqoFqZEvxmxP8iI^ByVX%((a%cWwY7-`8 zo6+w1z9UA~-d~j0!S`%D=cBH68I|5$)-1>#*Prx9a#Jk3RA==E-ACS3RTrW4x;;l* z3J^cXuQ`6!Q;XgQtgmCqD^J)G>2afITq6V}DEt8zSHYpV}( zwBN5VXh4xZ34so!?7jT}ov`NfD>f7n56}O%f1)QSTP5Y;j9M^AQmr76@-g3~2-fc3 z6Ud0ljIayPXnlD@P@|iWY+2iF+P``w`K7S9fW~M(A{JoN;W#)^tVM^6OC16yn&LxR zlE>o-Wq}ArQ8N`^ox&eBNv}pzvL2Z>&Qp`o``$=RGQ=Bt;HObhZRVNJpB-D#Hfp(C4M}w``zOOD{yDe;>x{2$z5e3t)BVs znu_?lh@PjUEJ&_jtS^1zV;x1}yWCU4;;0NLLu~EzN~s`Iphat$pjfB6Ai32N;ChaM z-Q{gW7;BamOhO0;uJmZjhn1MEPG*_g(4Pe*{h7+>Qr=TzDvV~y@%`Ts?UXn z2UY$1js!h*`}e&dZ4IeAr{j_;T}z)-TkvYf4;E+%MF!l_%5%z50R9UEHXt*QO~q3T zALvp7v?}jDXR8&(gOcdV9)>iemJoiWJE#gaL)Y+rDIc9ZAIDQ5&T zdsxS^_5$PkkD`pvwX>Gr6XeoKpgqXv!1=rbxAdwV^)8ic#MeD8?-Al=J#$FyCzqGJ zQfFLCRArl{8Dm%LP-R0cHN{Sh1g{RcAX{^}WPnr|NMNyX`^B~W{_S5lU;VJ!mGwYL z?QmuH8}qT}();FbHotSWa}7QlNmiJuwS($O9yzWOtAu(_n9v3dfeZ!`;wSH=B_<4C zRR__L&IAjaG}X(|S-6+fizO+1I;8xbl$OGG=b(qE$j=498If>1byeM|@73hAzyYbD zUfie08BuCb-+olJps%Ec^fW^Defd~~ETDdUlidSgYX!rZY(aafXi!U4mEta&1s4tU z1i+^}7qX|)^ic5lpB}>UQ_n2e zBG6(2zuv9ve?Y~?Ueu@hjfe9yj5Y2|eRw!jGtw=2M;?O=Immp>doh|CVEBiRXNo1aQA<^ZUj; zTA!dY-TZkr09pqZCD5CO__5mfUC58;T@0Fwiu+Ydq^z;$>+csdY&ek~@#2M9_uH8y z039B7`(DcG1ifls6hEnV*gG5&8SM*QEG{O=&E@Y6xJ`sPMQRMOge}cilEP|E>Bj87)C18EK(iG%eDCO6}MSEz4SkyOSC5NFT__*e6uQI6DV}s=kyclz>ODTwYvZMS%CYt2lVR=kWWI3^{3o z2b`6UnFZN?W85LYn(4#r@{b~KbveX0sr(!0R1H|9Ey{l_{hs3|v@<-;P*P03{(&DR zIGBdpK>|73PW5z>uOFOx9K#eedp&X0j7gQhuM|zi5J>%)sj+N|M9bSO!^=A#YVZHC zIs*@}Z>hvR?EU-^Bj(0zVXFZe(U!-*;9)-e&%dH3<6}nfTmL-WsP|@%D|tD>!ss$0 zZD<}uRHhR0;=U0fI`Fh(W<4atIy``6%(vExbzlFKn3u786It~nYB02_!5?%Y*}>2D zMZ5}nfT0!PJKr@nEVS&3r~^Pn^9jCqkQmHkb==u|ry62@A#l*IGmu>pab9!94g+tE za_phXq~{Ut>ousm>6lbAX=w}8IA3zV6x#hqZqFH79D(R6Y)S?cBaqH#i+DtjC5eha2!RJXeZY8&@lxMhYvuENoNwgG|O ztKp_SNCBv;wZ|AF5V6xPEZqqx^n?7r&(A!l&J7tlT|wSn+r86!aB+v|g7sOy8jCHt z&-2@3@~J02bV~i_h(Y}Me9!`@0y>v1bo3va^JtQ;=b53799gDGr@#_U|J2PAqm)`99j9Y6Vu*;P)3P}P`Sc>Mee~u`f+!QA^mX%~fGw4Wv zcXKFZdKbZT6%-ebep2vMwW%C=8>M1ZF`l=`wPL;uBGK7RXk$QZ#Eh^i5~!qczB!n{G6{P#fVHqai_aMUYKG>WO8|$Q zxEmXI#-4~aVCDtK+)EB>ZKqMkZ_|kmX)BroJ?|25rY87Ha#a*?oFiteOOH#M_etZ+cYadNdqJz|nNm(iyG4=m**Mcm zvL%boJ&Ib45uB?hl*@1xs>gxHF?mmeu>>n$2}|?5G6DgqP@zo}_`*U7YQbtKRZSGD zwuD!gpY86wbqh9;fK~uF;gEQepJ|yUF{M`X1yKV#HCeWHG2nFD8>C*{G}LzRknIE4 zB_Gubp~AXp`$DOz{cUIRIx^zm0X_ssYt_UP?YRqLX^ncbX}GUd8a1?;vANH|*j>gB z`0Jw1wJ=}rTCzW-1+bD7n`zFiMtCqWyZU8seK5FuPetGbZsj{OQt*)#e%4+$cu_bJ{z z5Q;gpVR7tBXI)0~HDV-jsQ!SBr@`_g6#&hpP!C?m@0(lIAx1e?Di zZ&rfK3QWJKv$EVrxz2M^RsQfveP*}*d3lv7}??MhJ6wpTZ0oC=Gn(EE$)+Kn1b7dfofGU(&=alnQStmZt4tZH7Y!eMF*o725GASBnNosYS3E_4 z|6OQbDXTF(C11G`d0Mr-oUBvbJo4JX#9el2Ch zioA9iSpmHXMR-6n9ARxeUR1nqs8|mt5T(?CJ|(;ndBeSqF+bBZ>FJkS`Ld|7hkhnr zmQx6tlazn8?=obwxG1wfk27thVc7Mk=9bdE>3Kb+uZWTlekG3ts?; zwQ^6^osUGb9wq6P`r;(y@7-{{U`nIkTJXlz7X~H~YmU*ZjGIu7A9L?bl`c7Tz2{B#M za#?hmtD$-wMbk)F{GQ-jqp+NWZA+tZ(?<7O28||-{$>jt?$#`n&A`u19e|z>e{jO+ zeaUpC*o%{KDaxt%`af|(jZQ*;v94qiH(62?Pu=mPbw7C`A7`*1#8}-wx!$_mMU&*Q29x_q8 zQ6E=t0b9xz+M#a{ALnV6Q&{iW0=okG%EQK$)1Mt}E{ey?`YUYb5X5q&_L$!S4Haf|>w`hiTwfC5JYQ9&=&v6VQnz+HOI1&U-uqHfkGH~BK1g%x z_WDs;)>*$|`w(tTCA<&(Z15m7y4!eQ=Q&lI4o$<&*2ud`1)YWA+-4KCX+fS60L^L!)%@uI1pFHxy2m7=EAj z_E-1uucsMUDcMjkq$vfwnRl=ntqt@>kcHd!w$@z%|68@MR&vO#6;_B7^Zv*!ZbLR> zSyyY#P0J)f><6BvW_Fw(L{;6nI1RGxs`rd^)yc18@`A_`n-A z0=tIPpsvR{EB=H!SjCdFI%Z zuqc!2Z)uMr8oV__vo75p6pK+v^{E*PLZtO{s|(e-IMGN2a02vareu#(PLA>W#IJGZ z{|ZZfElt?>CI>&}rN_OwJDGKO+{ZbghtV}g{-~ICuF@&FHn2mLYlk2!#rs8>n#~@T zQOQ>^U+{dA?LX`PImIpS+QVBggK;_o*dOVMf6SckKpifzJJbp!+%Hl#{j-N09I?JA zA9F?SsSVw_GwGIrd7!(G2Ev}kI;ratJtQnn%{+fHE)nB?G6o%RKjRMBP?3A^6wtY> zY8%s3`z{*?n(;jQcJ$%{#qTrBQe;V-0+hq1`FP>)9O_%pG6JV!PlG(Mb zS>NkHlTcCBHgpGT$GdEcrouCCcN{i|#Lb0!hOp5eF+R`tl)SL(Z)R!W*ltIWUoeO|s*&no0td1I)xNA&kK z-|Y0NbX+o@@R6Apj|0cbZAYy7m(4iJiwDw1>}-p&v~Ov@SbWOq?V;TQyK1xBi>4VkGADNm!XRoxrp%|e9hh<8t$?MfhTgyw1_t@?&h>r{ zj!>YflCN$~Dr>N5V!zjoZcYdK=N9uxsdLYWM^1EH&YCyY>59Z?lm2 z=?6M{{Gv%ZuSw+xXhpP0wFZeGRfAf7Ju_OTYe)v^??bY^W#6{i*8He*Og|c@Iqf<0 z;kbZffl6pZYJqMmP8C<-?SI1=A2$V7#@X*~4it3QMVAdsnN7_Rl0z1$N*t?(lrSxrpvG+{obFonoenNpC!r_y{IkT zaX@3TO=iZu0_}ZC&x>L#ul`_Ux2`Sp65o#kfAa>G2-@FHL%)hD=((Jqcwy_wUI zgo!5Yoid1~bJM9%>HlVGYUP(xjqn2}RPwE&K_n2Kx_+cz4PVVY(Q9TAOqjbbip0D= z-*x@p=Nen^)xNwJEabnesAGIWMb;GWyX6pj?l)&eYu5eLoC`HYar}DzoO2&-it7;B zOjbKuu_$^20O-G5IfOH**`ZjUJ?Be*pqAFR)mfveI#6`QTyTy3u;#>dV;3eNf`~JwyikFx1tM5-NPb!(n63`}{8xt4VgMqJ9;G+*`lZ`)}F=bfG zTh;eeqh-1OW#10&cHaN$-m~YsIy3pm_*eZ$F4B2&N?%swwtdlm?%SfNZ!n6sb77Y78me-!fKR0LT5SrWKG~gE*0EtutUFh zv1YXj8Q*D&ot*2N3Fw9NfAMC1rJNFoo8TSFEB-D%{x*tSQDYtQ$a&*&?DQuTt=Me?GV9!lAyZgHzlF%sb7BKFQu5 zZ!+3#T{E949lGe!)+km-DgAXobGOW}OQMSqWFyPH-ZBf5anFwFl}8H(Y9+@HEiV^z zCMz2$uMSban;5(uf>$)(GzPjya@}K=dy+hS5M12P$>P-wXcnK7*@cMf14}_auGxzc zNRfuI>(l&y%AQ0A51$!<^lEZ27EOSoo9nCr2q7(+zB9JvHD@$BWDofXZ^Ykl2ac_7 z)dy^`lv}Co|9rkB^~6CPL&~>)B}iz8f(vnx+c*qcMJ3luYT;%0a zkiGQ-H72*b{_3@Y>4zQa4UJSh-{P!t8`q5BzJK7;2DTQ{0VD1cYVS4oKCgE#yqZ_eE%00`LQy|pp0qfe;77e4mh}&GDNyw{gkrty zNFl}3ztv8y7fI3{E*^(Bbieu!W90B&@i#tA7b16bRm~mH0a0F}oWqp-5YONrHwk-$ z)mGwuOWyyJ2EBoML0%;(3D^t|JWMTbHJzV2{jW1V1#~6-VV6Ql0oA^8AI>b2 ze9s|JNPZxAJ73)VSqFL0E=NO>gq}U7m)7&D_}zXw(v-Z@aVVy$oh0A$Jc-7J`IcKi3nde{r={ATA+Cz z`QM&I`qqQsGJ0O@cE!?QocRqQ!N=6OAr9k_TkG-AAGg~)CqV|{D?)x3;B z%wg?T6^EH0S1z1jkb~DuN~}9a%7&KQI?6Egbi_bM!_Ss%&-uaeBz*ZTmeTeAdg_R! zpuF!;vsADo4=~H7AN#eAjv*P-UV0K@JS+doYhb$=;aR!xzW{#?(v$S>^#mT?jKQ_n zae8l3RWC<4YILa6(yv(Bthv4}kA9av;oLb-Z+ATj6e`Hy{>OQ|Q(DX3xFA*2@uIWDlMDO*(~zD-xlPvHpU4d?`+tt!${j1+g-Hnh9uexjzPtFODawP1J$d?QE4| z4ZA+UW7vn-zbbnqHevT?P+$*bJ#NP0Op?z5cTH@}`>U+qJC3(}kB=Fib(>VqM3yL= zTsU|NRlHw5ZDLS?`>K1@D4Tr>^x~cQ+pucp>uOV`ZAsKMz|dd9!qqnfUw%z1+$x>q z|2P4&_4_F|onH_J^fI?)OQza+ZRd;Ao9$B*+e4O>{*$hBBU1G3vm z?w~OrV94trK!?WhkU#as*4nRc8#Qph8Z)9)Qr@eF=>UFJwFQ8q4m>KhvL4Wv3!ABMA`>Gk60hKR3O zf0*?|=1Tnb$h`8j%Ry*;58B(4v)a>k1#!DvGtLp-`D3dXQ@wWT1OlaYJ@z!TUP07@ zs)DH22{d=?FW<-omZu0jm4_FDgcLgI5XfUC=JagxOK5gh+q!F2+6p_}xp;OTw>G`w zZg)Um`@|`f`nU##Sxf!e>vjMy*qu@iV)2o!)rfm~Qi9el8n<}3Oii&&4gShrv(c&| zPv|Zt>N%_RsaIFr3+h#?4b?3tJCm02J@s+rL>?C_-f!laaDnr8c&~PM$hAxFu7r8& z?Qgxl4O}gIFDN{h^$HZ`+;jb&zBL+FLMRy-VAagxS6D#^@;SJ;wr)pH`q=X~B)CM} zN<3&@{4awqV~e-PEiYH!gF4I?MdKq_m)8t*HaEo$F@R;etDc}*53HJj)=7QYoG7ne zsDDbL!5Vf9CGRShxGrs4eSn&4kB0d%(bf_L*{;#=)Xftvf)a>E=@u|QwN*N16s|a_ z-tT|zZTHpvR>gr_4tr6STcg?C`^+$kbZRGwUe$IWZDuiKn3OhL4yd35NRkmKkFauPFYDq(zj#4I$q?pBDtZ^+ z!PC~g8~6_HT!)T!jb`6flzR9x28*C~kCcaY-H?3RqfSWNz{im6MS}clP$e3~l^zd* zWVmBNrDi$tPRA}klMJEzzJu?K+`=a-_0Mlvv*>H-dD^cELf1kGT@2CDk4IU46e|RHtwss$rTnGuqO7ek{P&K>wF0TB_Yrpv{`Hzm2wYJ@+ zPUjd|p&y*t1`xit?5g5Td^Z(;jow?QElGLr2vynW3IUNU7QG>e7u7IQUkXrfOWexG zfE3d}>h+Uf;eTGJ`2Ub}{{Mwh>$f?qnU&L4ocE1_VY>q92^%;Ynt64ben%iTX)r-W zQ5`Mrr)z>zf!-hGHZe9unSsxDZd`Xjx1u86?s*bo&#Tb!bKY23b%FgZo-ygN}kIlEm&etCVRR|2ut&ID1cGDbm zeHCsCYs`%617E`rlL|;KA_l3R`qpbeCyprD1}!PV zH2xJV>I5m5BPh4p6|y5UStbK$k_XE{hc1oCl>}8t^5Q*fbdcJ7B?ZzTDi38jo&yQa zo$<8$Iyj1-E#_`x;^epQ6h9=!q>1H&uckFR4%w$fx%F=S;d<7KD6t+(OcQO*9`7E*I;c2o(TnYYy=6y-4 zU*!}^0z}!jgO=a1ii*4r)9M6trgX{{_luORX%wx=UUT z=LP0n0ZE=fQ56&gQA><*b7B9EA9t28XWQq3&U!4DT>12&qDaQzH3>?lcpc^im&nV- zz_=lwKY8;?;Pulx#WbR*2fl{sNqRRI}4m^TaGs+)~ z5D#KgpNj20<>9gLf>fv4_4Q5V`vSRl$HU3*Nq$`~#DXso8q@?uL62`xJ>WTy>dq}X z$0p;t3R=xrEKsg~sFRniJl>kVe=|0!oK_2OqDM{vcaW7W(;fR)(S!N;lsYAW6M}=~ zwZ5P?!ebKC&K_UF7K0f`8%kWzw8941VCKR^ zb2#4b0||=G7w*tRApM6ybBhxw&XlXi5}<5@YIx-r{{7`>aoK$Z8}-*6J^b9H^mFUiM*KbI}caqL!#In{Co=u_WC1} za39iga<@i+3SMZ7*xo2nFQ5CA?c3FZ=UU^$-~>&zo6omG9>3i$xK2lYQ+3H5cPT^A zl=(%Q=x~mz|G_32L>va>j=>SL%|wKAeCI4lN84_;({)%nZoIv=RnFvoAg>NO0d>m5 zp7s(X`*oWd#_ud0(^+|R9Ns0YIRJ6{ahW?zFbbw8h)9@-v{z${&E=iD8zSVBd``>d z!CR}DtRFlb#+UyakUi}7Emu=u+B?b0w(3Kl8n1TAGr{dR1Z4~)mHG7uMwUZ{)F~;& zMw+ox&Ejh66$yHONlOFa8A62$YRT^c{dto(hdhEIQ&+pdv4fSmU$d{V3hkRx@LiH# zht7QhovUBou=w%O5OAU^niw7qu)f8$LuY4ywzT+71jp?(cF6Fl;mlsmPE&Dl!64Q^ zN?sC&;vTohsnszWexe+-yDeE)sc*0UitHqJiFrZ}wqCccy7X?Nh1yWpXW?spC)B1H zXFF=bpY{o=E;Kh}C3&iI&01P;W+o3+Mbh^L*)V&Xf` zz;kjsKP!JxcXqv-Q`44MPg8C0l)g2#V2ssG)iAul@Ic?wWb$rWAwXbeQ-3q2r z&;>ryR774jx4dKzvM>Nk17)9jvX}hBK=Eh?i&$FgcBu0Gw}~TIYZ#n}TZq(%L;<4* zor)Q}z*^knv3ATYT|eV_6&#|$HlT$%~O z1~c<-eb+)7ZIXQC4`-6-MaQ3|nC>|t0+M~ytkxF2JfuXaeckOzSzkG(Gl0z_#&rA` ze=k|}tO4hAwHx*8B7%gaJICW!+PTS8PiSIpoCO!k@=6WlS_P-Z-kd0&37|ghM#DyL z&y1Dv8jYF$j+;Efx&&&tdAvMduAPW^1dZVT6XYtt>yR3xEc0knOGV`&O}wOq`Z&Mo zpYMv5a5&B0Dr9?lwxOX7HQJ72;FUpF#E-S5WPjz{r__|5NmCnm7V2rRS|7CHHAjiJ zHXh=nTygTCd8qvl_TDn8%5H5N1`I?26-1VSKPv$G z{+3l)wXw)u>F20vn*k;GT=PWkEkqNx_gq})?bjy=HSG{QWJRe@8&g%OlU4Nl_I5Z& zN%V7%MVKM8?@7P~xodP7;M&}tnA+nVYDVK7P@Y4qztbEL7cW8msRW*^V=%rX5j>|w z{&y2p_n{2^BgV*e5y6#+a6vaw>9g^yq+vQ8yk%fCTA}&A+0}vwa_YF_5zkZUziPg^ zKcz4x`U*6!nVGYP-*Dp&+rtmGfIn}{d{m16gp?pRJnSk`NN_T$uPkeRKezj7*cRxj zKz7sf9>?4DS4I_l8sSU z@z)&n`PUrFA#7eQ6t`R@7IawDL=AJ*D65AlnVa=hy9fF zAnV5%Upt|*lZ?tj6E6nj+&=+|d~0rIu26t{-3dBotPWsH1d?Ef^B zPmVoNl2%`Ca;?}ZPk5F~D=+{t46)`+WMhz#toGqz@7Z~z$HHay;E*3-OH?#luei8Q5q&SaWFPB{axQQxpaHYewa zRalH%y}Fq(+@M}81Tz2h)m#&F{vd#~wNelnDSF;NuhsO%`3$+0#@w6Xs#K#%!|*`~ z3%B$j#!?ayW!ukXSq9FY3fK31!_M!ilZ6k9#@)v)EJqJ0nN_Do@@Fbjw_Ntzm5kl6 z5Z%BaHL)$nil2%AF-s-vr+e5>auN#)a^pT@(`UQjhL-JAb>caF5O_f5OWjAza%H=9 zOO^j_9EkW1vcU8tJ^-lOgqb`*-JY`)TO=#`2ps`eknCEd zx~65M7(KLG;Qq17wwanG4)Z~1TMjS`@OMpyGz81Ry6PL8hS zn%$@GGN+pL}yE zPM8H3Jc!gM$Cv0YfD%PUdVNbvgd0>=#OcRUGRvgQ3RzXJ&G)_g1l z_ob91N)^9%5&@C*$^V}bSR(Joo)*{pLNYmxl>dXU zxY6*adbW5&oRd!P*1e``fEI1~(!?yx6BRp+TC@%fR+eRaWla=+tM1;nSWwB4LoX}i zE7%A%n#JSUq*~BsyQfxo;8$`fP_i_dZSz^~n!JddJn=1|k3boqNL^l{Z(B8l?92GC zIA(>y5It%hPZTWSTRS&aZaQs3utG#j5EjO?4O;3H){`Tu( zuIz0bRnzc0s$9=nPmWL0#Ql;Qt&`ex`{`WzurisE{pbGWCw5eSfapC5XjMmV$)*>+ ziD@u(l#hsYgV#22Au?aWp-B&QCcyQ{yj@reDVVv-HP0+N6+2eT?=l;;)!B1o$Wz{G zOAuZYTrZZ0dpv)f4Lr%$(*U5)4SbJdnbVoA?B)%+9igz0L3$9yv{kzuvVgPstpX16 zCUJ+!g4)q4Kb<=H0QE0=K`mhn&P?Sk{7QSPr&Rp)k8BG~QN#VvekMb$>AU`YBKhG* zNe6}AUv7t0J1sjG5IBi*GDgwn(H7u>Gy!uYRN^6`dl72iGBI&=NZW07HC2BUDe>_F z?QoM<4&KLvJyV-Vo%7I@pARikWSCJ=OdyNl$&^R-DL&tIxP79TXSZH@pLOGVqegkw zk&lMALgald`IS4MjV$KCiOe^*!yFWPrY! z5p|C_1teoeW(NtI6p*qo*UiYA1tZfrTR;fsBQ@x)Wge#hwl+OJScv(!9_O&v=rL&T z3@&d-0?j%JPRrC>-Ka3D*p;+jpw-u1gpa~ zU9rkJCDv-sRcTq{J*EqdhBor$JUph}ND*%vk&PQ8JApbMt{!V?vSdfb(mYC@tt(y7 zo^Cfq-rCBH|8T^^!iiQ=%iYPrcK3%&MHwElETi(|;BfN@6ZeS!iR%!DpEfxU72qqL zt~+E~?EPb)&?%K7*Eqtlq9nA@0iAKXJ!{J<0M;dp8Zpz5J5)?;|f62m!m z3Yn`d{s?by+*Segz9u^pE(wmUl(F$HvN{vZdvy<>m~#6{QdwB9%NW+`;_D5a00Yx(!cu zQkz#mjH9p6Bi4Mqcnp-qNbo#KAQ^Y-+$xC>Q^Sx*s2(c&LC33+AvLNqyI4?R{PE+X z(XCJ0Ilk(jhnA4p6Tj64&%}CUA*$i>&h_(ikq#Q5eI8)ubZU|7UPw62Pj7=#dj!7K zC>|r4>6AZyAz^uFUgP#%LRlhr)sb~=hB{q7o9dQ#`COlmx4N>D*9?Fv{cbb6vyD{j zM=T~rz-Kz8!kl{WNFNWGxxF^rsVDR>`QYNw`NjxDez7fa094T>!hft+q7TwPt#6>+ zoSgp7qZTCnbw5q-vDze&F;*~u@hCjJexB?GldU_C(kBW(9fKX5f=Fnm1sQ?%T1J-s z<10Xe!p{Tl&WSZ61JsXil+5W(p0HL}n_Qay_|)_wf<&j)?_k@i^@-pfEOp5kbgL-d z95!4^@bCq~Yz}KzgT`27chF32zw5<;VdQJJ?YeNNm`_!3II)E)?MpL0u=ceynVqf z;IlG12<`=~#xD}_i(o$RQg~@8;^%mJEKkyF?j@EjV@CE7l*e=8snaEPNR7jio=Su* zjR-HJ^+gQar+z)JN(hwDG;f%7@kxo_)PHi0M zuXn?(XcGw@CYa17-ZdC6qsfl&f!7A)n1D1|D9jji{ChclVd4n9`zwJrb9h%?j=fW{ z`RH6kt4ucO$Z=7^RFf9H-F=hD^>K$@0Z{_CqM46&haC(qlSs$8NO6XNp+B?p((MK9 zJ8G2QgYplqp| z6(&hcA`(wnc1jxoWGNM%6LXt2ZRmu#$GseACz`R#T|ssnux>(5CV}Ozr#AeL$p#&Q zwie3_E2?;z>{d#DCfcP_+t45zds$W`jmbYgp#7d`&1pD39brztS`13G{yB1vTUfZ= z(ln8p?s0^DYDnq)(TnMv^4JS2PfE}|fb;@%QXNFL#NBK06J9`K;h0I6fOOz*OMXM( z=<9pLH{g$e=%TkGQe!}vFDaM?;p8P;eTVyqi?vDat30N_I!MZ5S^|0PKJ5*Q30Qa~ z0x33+tmP9tKjD69lKqqwVP4Sa;ln=`vJ~JusWrAcL*Q;QrUmUT(v?ZuZP#2`#$}_O zFOd#Xdt>EPYX#r4WsW(Af~6_k^~9b>gCrz2b3K>|$ZkMd*%f>8BfQfEL36+dG+9;1 zPTpN2e?i9Cm&`&3lw4ZmdomzqUOM>+e=np1h;!x}+BpuemzOA1ypLqMoGR zN)aUdYbvxDo8d3(2wK)kX}tvfPWf{`6`pJ^RP3)9(r(XB_H!KU&jgl+)3R6 zcKD0&0ipKMJqx0#kHG!Y<&wjZPED+6qkWeZz@wo(5`XxjSa31^%uv^SUB})_vI2QvGNING z=wh@ov}rLmQWIxb`$MMEnpmiwIoX{Elsxq?(l49!27gNmeq_$4@3|@=n;K?smd z49ZLDe!sL)vb6pufRQ<$+Ea5;>Xma`;F;=giFT{bNk@9Ys=C0qQ z4OYr=7ChLft9u=dtn(DmD@6F>;qLOd02!AJ@?gJYTOBDJbRj1-X(ab}e8glCi4%8L zwT=B5heUga1=|T2;&5f{SFIn((y?yRzUX_jv`HVhlj`T?s;(@`EYO3;vDy~pB=uYf zytgT-{yMl>J%%sS$t@)k=qF6iUXsp=eV8?P4Xp97I=5}dS!njT2vqR%9|zi028ewG z&Bq(Cu+>8f_xF{P@qHkBon8L#NzHjMd_MLUxf{)`xhOf3Iqr&i%^;~mW!bU`M#DJa zwF;wUL_y3+>P6^ryB0lfN}wA^13kZU*?=~s+ghv)sd=sMJIR)6)WnNloh) z3ln?VjjD!D!;M;6Ocoz4aY=PAaMKN4e8fQc22UDej_K9|j7#1MqUdv~1l%F|&0As4-2RZY zFe)vlRh;eVnrVa85i+96XOy{WP28~Ns_{rwa@awBR_o_Zx%uTnmwa=JSZ-6@Ao>_C zx6#03*BCyx`3$=phIgJ~(oqG*z2v&TF( zCH$x@7c?-xwnZCL#iJ*`S1EjV%F5d{(|t8f6495=n9r>K#aQkeizJ=ixZg{;kecT3 zNIALo>q_QjG?by^FKcxlD?AG>z|fOyEVbb|-6LZ8F;LhAnfvi&5_!J*f<5cx%GMEB z=%{;U9DV=OKY15_ZORPfzKeKV!*06!3_cMmG`@G>?TJdzNnv)Q?!9@hTU8u4oRe=G z90tEt3Zk5{3SV<^6RklSEHqr>t~@822cdalgI6$cd6udM=`W)0IhyiiR5r;%d)O2l zQ1l zI_xrO+tkMUKi(isY{mArj^y{$@p?i2_DIxs^gkvC$~E=!vJcOH9#q!f9{G-qyZFZp zrJ!SS@>V4N$3eZs`SX!0238OL_&^#Q-l*@>IR9}_7ft{62;18We|#X7aSin4Wzd9d zJFBcL&${2>9~%ICqcq!F-I)d>{ps`VO5^T~N=0?qxUve%aYF0l^S`%S>>E95^f;l*$v6`=8FMTJHOvoCm%S4mTv9;-hw0kvU->{E%I31C6eSTb_~Z7NtOM;&&|kv* zNkY}DBC}z`+bn8i0v_-IxA~P}Qzi4FExRE9nMkV6$%^`NsHbjcye@R+B02I)<&fiF zNy0ckA^Nk+{pHa2?z2s-ud0PDPp)qN!tWFhcH@6lVdp*sDi>m(Cez1?2p)^hR^%C; z?C@~v{FHsJh{(2c=ihR}Av5ZmpKWd(Kwiq>+4|>Beky5O!)`mI!s*<0D>I)kA?TA) z90jlKV&Hy4+R3Z9@Idbyjq)$lW>TK{nx376blN{QQF7p-=S=>jkUj+Q=B2$4U9J-i z|N8h|S!`#cTtM95!D{fpCcVe0#z^jmTg${8j1mLmR~FH}xcS6GX9!tgb4ZBs$a-}| zh;i)341F6Hz~|XH4OoI1e|U7pR&S*xEaj^2z5CgXI<_soxV#u!SDU^qU2Cgyqkjc| z(iB7ZEVDDxj(@q|l9;bpcR_gm=v}PRYBZ;^9Nd9l!X%d4rE#qKG+9x7#q^?z9`bd0 z5R;yktGxc^a~bUeZi&38^BBw##xS)wP+47Svp|x`4aLGYkmy()wX|Zw?zTh6BDVFV zycV@w_DY-jb0_r__!YDhk=}y62aHw>MLe;^1#8#p&yMAXn`Bntj`;v%9t3P^fjUI^ zrpVr~NVQo;#)(D0F^`3yFVo9|NqON|E`@syklHg_H2UU3T3aR}MlDf{{ianP8R~o@ zr#AW2^RAK{2dww;FOA_G#X*|w`V>B>4I!(lY5y%avCi3EevuXbvA`(zp z^bGqL6PvU3qh;ROrTVk8_yMYc5lpCUazkW2VlYOf(R91K@$`;JwfkG1?3tuHgICU` z#FOFtt$HL@O;ib>I+}WOo8NXtzrQclDZpW7;dB?;m_1Wp@?P@H89YT<7Ac};?x|2^ ziP{B()2VJ|Dz{RU0>ZpIH&GRF<{AXgEXW7wv#Y#2EcD>{R5%vOi2r(mGHwji!e9#bx1R*fW5G_#kw$sDx|(l^3Ivt6hCuG`ZSTAy7evX zP@9EzZJmA^PWRftrc(IedY*~D-T928`SzUcXK5C6Dd4B)9YRjo-PaOMxBSy{P9`#X z^)|a26CCN><13u4*C#}>%3f(wXW2w920}A3s?{OL?Kg#gKG$GuzJA(mexD|bC#ODK zbD99VeQBW5WA+mfC!xAseU;?Psn0i|+Z}P$#{I}AJ>~z}@uoF*Ihl|rhbURBQ48zs z8=Hlk*rL@k2@?`-3srcV|0@mZjrtU$D2}7v*ZDQ#K+OmqXZ_>xCvjzFKl(&W$IHjFUs85eiOCnZ9iqc4WN#f1Z$0*}$e`ln-WfXEMXqOixkjVHanx)W)(J|0 z=|IPOw|QiAp~-U9El9nXyrJQfh==|PzYlI4JJ?XY8K}7C{C&vTL*o_w?N4iN{&tOM z!M|e*G%N4lVS*?1Z;y{g`rCPv)Ub4;ps z!~5+MCZ_zh%jTD_lj#oRj2c^vI~xUI8l6QZPQB-jjt<>NDfb~~fl)W{He&D;)^G{q zAAbQ{;b+V0L~l}Qe^g-3V0j)KJi28i8zaaAV@Qb-uzW|vXAPy!n; z^r%qGb1U^ctT(%W+nu&P)#SAPZS_^Zcbt$*yV+35Xj@F>4{RcSI)j$JeS_Xqq51jt z9S1!qLYU^IYQA+ik;v{D9}GoLsYU_RHXF#yFes2Z1Yi~!=+HG*Bb|sue%_(kmHsOH-ha-!PxHRx!195D{b2kl%ZdUMz1kg=;DznsZs4N@{B$aitDB~(C{JsTGpY=eBnWRTT4W2wkZ~w6*d_+_w@Q; zQoSkFLY#<4FPD3rmXCx>^02@_?oCvdKPPd%H%c#(_H6icn)a1|f*4m9?NdZC6+|wk z%3PR8xC5xBhp@>x`0azMPD(a=vrU(XZv3p=6>5*lf3BNb(F7+lAGIqm8OWW~4~ppA zOqJ6HRWYa8xwJ8r{R71CkwO=x@!&WgDhTXSZcenIemvx3=sWFl#GRMR5F-OJeAB_z zZw)=@QXB!dk4dehYm(l^J=p%Z9!)MJ!X_76m>+!Ue6J?`Yp(_)1H;J3{C?&OP zgj*eqn3Gbw~>-h{<7MfKIuxhV)m=JTg=MmU9R=$_K)D0K2YtI?Tq}?aA z1Q|8xpXPiWmP4Cs?QMzy9~ga8*Jpf<8sa=JE>VBUlvMSa#K8B^ski(_}TZ{3PJO$+25?OrPZ`bAAHI)$8B^&>OD8tofHh@Q#pAx9DY-&1sMF;_<{VS*fM4B1tMgKdHAwx8wLsF#N@BFcI0Pb$3g8vA{)%fEriQ-lGur&x81_!lS?z)F zA3kg{d$XZ-v*!xj29XuW2I^On;-~Wg{1?>pIy&)l;|;uz-VT>;IuD3eHIi(6&udbd z9>z^_NC^4aSR3H=_}7hi2-SCKUM6TgU)}fbaT%7>gEwI_{#6TXP6P}ZlUr$UpAa}W z0I)^&+Sx*Cx9g)t6yKI>&+^qj4WZs+`@88`S+Ir<@x~4}D%}>Poy=GNqQb}YNvMm?Xf4G#)lD-JD}ouSeu_UP=JRl(kD(=!~`Bv>D0 zG}~uS+x&=Nglx|6PleXYAnxd>7p)aHl)D|0WU>VQ-4r)NrWSc#el3l8nJ+7+6&b2Z z1Z(&a)tOeW)fsB@<@;@zu(+cJnbpde(@ctOHa3n4B8Lm6Z~BWL)@Assgvl#oT_Rjru6E&y>PrZ3 zym3vUL%cDO7=SpE2%vVL1#N*z5CUiFv1pxggg#PISUCChfDSqUG}kG>RBD~O4!PfaoqK`-wiU=$xCzl&&*Pd~(O(NhO_yiHx; zIBgcPefwH*@0UsT4$@D7I1Q~O;Cwl*5&)(k*;!-wjl|$34jkTEz0@Cxb%wgR@_io1 z*-gB#ClaaGd<;0_v&8UnNDlY8ICbYc1)>&*Z^LdsvXT|O91X!27KvKDNtfH=ZL0Ro z#IoOrBY@5|_}6l#|F2Ei3&HxWJm63d_~mr}!)J?LBHiMba+Dp$gFI!s(L_6SC0z5- z&h{r>Rpb6IjNzLjRii>$)T0yji$ek@lV$0H1p<=6F}F%3lOQ5UC%PtK;J#Rvw<>_E zx}b55`D!e3)4h4LK#qFPk?s5nF#J>K6t1tF5#)N#yTmG?9xai60g+jdh)A2!;hW9p ziD`-gI%tYN3Jz!tNf{mGcb_)ND}z24f;aIE#DnFIUKK$khe+Bd{QB0%>}ae7Cuc5I zMG4YBBfO1E@Z(fHfqFBOt@-xa2W1VtH-lEIDa|(7Wo(sIzGfjL!r&m>{oV?|BFT+!QH8DieE3A`zWb zMG{zf#U@v64K!xCV?@Pl#)0D)Cta={rY zU&<3boCyEXqYux{pBt`&fQ=x!zWWRWb~ej91es4nKW(sZprbr{aWj16z_8|(T8UAi zoqSW!@69n*x*ddQudGO=GUe4MeTEP2Z6wiqD(~jT?$+@0mkNv_JzioHL?HQgj9!;y zCTZDpVJOisYAfH7$zdPd* zh>3j+el+<#GPL0`8M|LZX1*~ZM+G1{QFluKT}HCegqgCQP7bq7GrzusG+>_Pc-h~T z2n{;aUj2(Npu8L1{d#SzeTW!`<3eH?U;yYeVGUAw6Jk>U$<7}Xwl(M964GLCUbvrN z_-jJ`)7LD7Vx%jyP()8Ncxq&8-C7=$xT2x0QU8s9BB%OK|HS2Y{~3lb)d4IM2=x2P z{$ks}@1UXim<^Y8a+!^B+$L`lDPHF_>i2zy1^5)G_HPu3cNQVZOoi^{OUHv<~v-(jlQ=Eml94{i$-&ocE#Do1iP4u1kZ;!N1d7fp6 z$e{)QI}i5ngSs;Cw@3ark#ol70Q0w5JCd^jd6>=a3dCl6eo#qH_(zV-S{Wab1hSg` zn4Z4>Jp+k_6{n|$2_j!fUt^b%p#Omvz1vHJ?^r^u6$E+l=`umzgU zM&C@3V?z=t3kE-TmKf)^U-yP-r76O34JM8VE?ran(exBw&gV(x%s}?24hp9I!t{To z+Ujl+G_pps>!vke_)y+*Jn}QlDw747WT)V6d0JN9U8wfa)=fYFt*F!_H9nG9u8!hr zJQ~cUC}@zK?euV}2jWI{(@z@NlX(s(gruXxh9>?2caHxA>c9@w(QTz@|u}@DuN6yV} zYT1EHf%`FTZ=t%#cBZz731m(On2#-!_vG;7s<-Wc-l4Wr&YghZS4ZK;R^H5s6V%Uv z7*OGLEW(?ZJ^++nYI(No0%nkJUvmKkzik6CCkX}aQD52hhe$W+X&ufqRpMGYl0k5| zn~-M`@I`0l<3Q(0Q{0)CGDuk(2y%RY5hO)%=r&u8*e`@aSZZ~BRSP23>~u)D*Mj>_ z_rf~|%Gkb=dTi}=)^|cf_4eYEl{ANdtEL)+c1aBCnGCK`L)q(4k%NLo*d~a7^KxNNs?EI@GF-fcUS5G08hpu|u<|i#;@_8#{ z>g(x&`sViBBw|xfFLua^mlFMb4pz9iN*$uGvInn=Qx-PfVmDbe1AYCGMcuG62PGx| z%Lv%!ynw6cR4gwY01=AJa9A})5_MTK>7uU@T1eEsfhN(Ugmi zL<>HTX;#>dUgZIdIw5Md>e%f->}#JtZABR;5y(Ny$r|rIU;hgND3+Mb_~9*oc}Mk8 zE8p`y=y1k*;?s3-0LGK0WdE8{bb;X?bSLR^LUbuR#NPaM`RW_h7L)F!mXjGmjvMlv zR$ac*X!%a9TA3^aPL~#d%lWy`THRXm{WZ$JmwetN$XKAYE5U z{a3SZud4wf_RMdPK40Kew$TvnK zx$(GIe={)>a+#voeh6w8T7Cb6?yTHb5`b4JkfJ=AkFGzF)h8hrX8WKiXZe#8KAYnM zw@em%Ka3#Hip$h@y@k`bw}>D28kql_X~MnlSM-H;3M_;tqx~Ac88Nqo@ulna9Oeh2 z@c7?9NMQ8>oP=c_quW>)VZ$&*83L<|om{{;4mlGajOiJ4s@^8j1zQU#R6+ih4DxJ* z({(~9+ypsxM;_-+yuEtT>3-pT%v>vv+Md@r7ft#+&~pZ!d#dlebHIjo*_FfflVW7h zTc0Pf7ck}Pi{dn^bs_;C^2VvaNu6=g=-6KBx#BVCMoy<*BfPbUzqx(+I+1z*Mbs8V z`yg<>f9kLB0vr_|3qx-_aKnP;9c7|VR`boOwa`RekO2&f76F60c>vlqG>?@bx-zbv z;VBFb=d*W}3<;Ie<6(R=8NZtyeQTc*?s9~flZ3)se%H? zP2urb#M5|-Y6>KEy3ldC_=A~i`OL5EH1h=yhSq2HsMNKWW<)XWkSWZb!NCvG&ypF^ z@O97Rq@S;76hb{BwR`QNL+eHA3Lff_UDpf`6fV}!+&y1Nv?=QIN!`ch1>`4DZ1&AS z`T|}(Zl9dih5`?FKH)Wrc=x+Sh^(APvp?%cpN&dp!8 z1}aBeo?FrPte1MoGFi;lC$1u$8!_KH3b8Kw$6hGCOzNl(uJ4K1Q%HqqYC| zP$cF6Cq^P?d!f4G6;Pe%_qUXhz=T$iLW6V)zO8GS+=Qq@hSqZC%z#0=5bU(AEFN>D zp{VF#s7Y;gB>u%|emFAAW|_ya*LJZ_U~Qiet_lHN3L~vo%>J>ZtZ{f#(g$@!Sxm0o zWzo*zHXpGo?2!3lTI@dG5QI6PQi@7w&=l6rm-K^r&0Rgr2)Wp54j?0dfDSSArr4Vz z^2hbqq+GRTlkRN0E&k-x6o32J3$%0J-+II(OLfLVOp6<}B2}y1)6&0|sN^Z2*inr$ zhk@KX|7A_V9Q>DF{x1)YJPZFN$^ZXAlHVEv1qJO#mok4o`SkUh30PN8*RwdQWvtHU zlpCa9oIckRAS67i?7)#gklb3i0|k3TghSSWErH3{GeynqNH<*e&<)DD9yLT4|ce8H-W- z8vZ?$cj6e#887IV{AL`Y7?};i)MzNs8y@6V>ub_?B@g-_g){@D56aF$Y9>@XB1JS( zeVSt24Xf<;P3x&_M6*f%7)|)@PVoyA%*CZEl3)-N*ODhM9MZnirHfv8cM5#_gZy(! z&|q&Zc|KxrA}?m$_M7ow{R_q8apHo|nUAk(Uhl14H>km^%X;10oo_<{QWKtms0a7Y za-7>|pB5;sdn{Stkd^AvxA@4Q^<(9H+b}#eb>3&lln`bh3HUVCLQp5dJW`T$>q2m+ zq`OYgaFXKTP(d^2V>IBQ%?tG5?!D!mQcBqs@pZDedR{0lr2a3?O;Ot-KV}sHcTlx^ zqh4IaJ?@O1*U^nGme@e><+hdCsCyT2?xbhp{FDA-CG(fNpS}$6$wX!sFMI0!eU69( z^=wlfIhV_&4O!5av8*%%<;qoFZl_vk|5TX5Fyjw2Z+Z{=xL3<08=TY337-RUOfeHd zal`G)7l};VLYBO%XF;UGUz5HxQt6TMh?v7RP%*p-kbROJB)__SlL8qZ-eokw1>^fneEKST7@ZCPxKFgq9ox`S0hsT$tVp6m!F;yXcD-&)s zJyY3QmDy)=mx6UYq<0E2KaUh0mx=4Ond%~UHISslsNHgm&wvxqv< z^6rEhin#vDGM>zjglK&>F5u38uijA&;30TvomS>#8P z1v*W_FEWGf(2;SM;24_)i!Qs>*nE6Jnz`k5DGF>zXxk_C@PGy{m7#w1ENf$|Ztwu7SswB@-S@PESh>W-N z?cb8qe-^u}+J@+Nmdk$q&A_q{vd}rng(REEWc2p8aA@t!^KAxiZf|AEWgY01?H#cd z-N_-B!X$+WStU1QXKfdPgG+FYeh0wU4Gos!Zv({fn5Se=(1_??Qd`&2ToPJiv@Z`` zH>MJl+{&&(au^~2%bVFX(-vRQmeH!1lqbz)(!*cGmZ?=tlV?Bv#FQyf?0r*|2xLjf z*)7USnM5weE}ET6pr&c%qML?6!Qwk5_|^y>Q@jcn!*;k5u(E3fc*AtH|TCW(~U6PIy>cUve7XmZ!7>U z2&`D@&~EBd*6L?q62;LQQ`@!cwd|xD0n@&+U2uh0Z-G$gNtHqR#ryYJR0bD&9jsO& zf?huC0f>8G_Cg||Kt#hSGNg_26MbKG{9e2PJBRtcPacQkOw@eNpLx6X)bbv-jehk8PVMgWO?-bb2~6$APfCv>g1c zL*{A45+$v1h6q!cyc@z*&Owz`0ik48J6U&BN$50^F9ZYSvP@Y`x`vd9&qa!9VyuG+ zw_K?dNrMHNtD-*|5>6_X*-`2d1%@+&9vv3PYpWaSYi8*@Rr3gbq_-txk$#cXuyZ1> z0qW9gHyozSwDYU*62n%8L`juCJXk3Rmq>5nh9*9*^-hJ|b=aYA&b2^tPTFUTpj5-;2Q(*GOYci{*g`CDKP1xASq|U{k#C3*?Rxz{l&x!EAOm99AhBj(3 zKjONi75;!qFz^? z0I`X6YsWEN^!*ZN5~s9YdGE7Q`>2Wz>H-eERb17b=l0c0JTHyRVwDq5&6d%q!#%}n z`Hx8t_oNK(Gpki_TWe?)ch8*h&J1Thu8tk%`z7n)1}H&NN~TL0mMKztaDO;BmSIY| z|Ch=Bhy?A^nGC|Bws#d(H_6qBtu(`ZvoLR#rWFcMHNrXczP6fP+ZQ5%IEO(j%xyiP z>z=v;E40v=r8ZDs^oJ+L4IgLL(~%y}>o3xJV9r5Q`~q-l+B>|!Wf=GCn;!j8h2~?r z0|4ofIBQY*V93|j&_tG8<^msnd-qA==S@%O0iyZBkdxOos(;})B>OcN3Z=SrMi@`? zs>+M;D8oiUTK=MJ=Hug{o16JNrrPYeJpdvmNU4w$X+j$6lnzw>OWsbZ@6 z4*7YYi>737B`9;LMQCEwB{=Z15ocRfxss4;Z+{Vd~$OZxCg=bY6eX z-T4zJ=NfN^VJGZq9mYeqO-$U`f+l^r^8qGS*l;zxkfat7SH4?lvV0%8gL1VhnXP39 z#<~_TPbSxm52Y({*|x~6#?lW4D%5g~Qw)%ikII{vnDs2?NTe}&kPZlI;oaq;6QZwo zQae@j#;>2_B_FViL6KzlhV~VXQBiyD?m`{B%Zt_0dIOS)jW{2k)!Z$z7&i=}=X^>o z_$y73G3Cubz+-=L^|s}*NNsbxSinqsdrLdF0R%za&W?biZ?15zGoGBWV&c(*la*kk z#;+e;vg!gZyR8bqqnvSKqMxVbs@QEUEcD*Q&q7(c2kCbNSPqCC@@bdvhLZdhNQS4K zirzpLMF66o6F}v`?M*iX?8zUO)TgfSCThQB=qpL;!@x}(#Jx$zzsn8GlfOt>=;_)B z^9X4`$mNj7yl}BKM3BL{xXE1X2?!khFd1OdsldZFet=H`lpkVnw$uU+Rrv;jO{Vu@ zyY;|;NRz-4?x}pl2s|)#R%4I>`=Gca$&uzxUnGR1pE_%JQ`KonOfoI2WJ#GXCk z-tDhhC}ZKaJ`wWBP{g}=fd|EUH)q9esJy$%J4+CajLiE@L2VG*Zw6c8s$@{S+40IV z!ufV><9|`cAMQCxh}K@%FDe^WH_xu7!LT;_?!_vn*gu)gj@P_b@`c#yB28eZGFe!= z7WA_yai5;4F%2O5>QpGh%($gMXw(MOZl*Z0%V)+B>&EP!npQ*@LU!jD?9RuFczy$l z>DbvVnqNJsOQf8FGM|PoVibtFheWahQ9<}5e1rXLia3sIa~1x^X7fIX$>KE3kr)U8 zp3pU`S>~IPI0&gM?uFS=co}{`5U^-f5FA1@Bkx7~QQm$0i&OA*Qcr1TZr7}hpu?KM z%651s=XiEtfW&|bRD@?*M9jJq$!>rCaKozP(eHwU>o@6ww5W_neMF{VFw!W|{7#D@j|{5sK>f(J=!8=g+mp$p1z%$1m`#e*IBWA@%Rv z^XttXbMWh+_|oSO()oWAgN*zZ(*IA(J0CnnrpL(YN{in4+$>~uC0gmDKbUGv|DQk) zIxljv&GY*B;Chh>TBJs~d*_Q68eD{|6WrG+PDc6HIO4}U4KdL^y#G@{@R{KX?~Tx5 z!JZ>B0s9G3k*CIhA;~wnx(YI?_FXa`*;90}c7UXR=a0uRHYm0fxk0k+5q}^v+j(e7 z;WYNmXg@xh?R6@$9>~sueRIWKxcrDr(EI?ScWrzv^>w(?Jb<60rA|A;L1POtC3BXm zn?x7TIKrEWNuQ^76fZB=wkXDCyNKzBv#Z--Eg3$_;j2K@yFY(10`Fl zZmmkI;qUpWr2yOzVJTRi(8*GDa-f}`x4~0=Tsj3$BdKCQ+%ER_j>*Y_Y zznBK3+eB6kxZUMJ#p0O$UY^Oe&29c0>vD<+2PL`GS)s?{E53Updu#;;tPs-y3m#-0 z>gwqA7y?G_`qYlSMMR?0K{R2u4U$6*(vDqTUT;4@2*?gv9KV|U1ZS_aHm?P`wp&EG zTF0pdlPCC_pQWqvMVz**new`U-Uf)Uv~nEnMG}N$*Y0*_1tC=iy@|T=oIvEVJ-3`~ zu#iJNe}Fg~*iXN;jr;^DFKjX@U%lK*>ysWm8O$FCNeX={pCzwjm7XP;3b!tjeql^N z_xUthq*>hL2xEEEh7GMJv~#1{I;qN1zd=4z0L9NPdok-=HhfjO7qO^Y9dcAGETV~t z8}A>;Jh_yU#-_h=Ye4f{0qO>+ zsoC__RDC$^0N=a5DzV%Td*0`QFVvz&SbZ!8yX5tY|W8S>FRS7YV+uD z$Z1zSid^+upE&*wl3osXrbs$jo-jDi3e1E{b(Y<=%}T+Dk;L6Pf!Ww$7)s!N6`s`^BayO!sgT7NG%++PvJc)ww)6(V>bZdT-%(<;F(tc&)*fzw1%O@rp z2OxYYaOr$nV6+)?XP-{4XsXRFzsWUN6A(G;cI%+#E=#3!xGk=jYL_{sB16G6*Qh$7vR19Y;pVfy&pr(7`V~#1E+6w?kOKcA_!^Bx^)d?CS^93-*RCdM2nEI zPw_{r10rEUr#`~69f%wD=y z{msPx?%8<%5`R54m>u1m6y9>2#Z<+jnRPQV?$IyX5il?R;f1Mbv;1ONvM^K^t}y+j znme#<1S#<__?0&Eit!kr)Zum%qD8m*XAHz91DI;latWl1^1g7*`*pbNRjwh`QLh#X z-OH2hG%(_9weQ{QgXk&wXO-XVLVpYje5o6s%SlDfv+&9n?e{c7usCP;R68Z1E^9-j zA$*|N)b7axtwyY6;EG<7b&3ne)kvVYBWNpog=67z@{hNy$r5fZd^LEO9B#!#ExRS}*3Th3;QVwa44pT8q{vvGh+6>cdL-n~aP zdOvlvuT`jZAmDo`2ld^!y+!@9lA}C|PkX=1_+dD_UaM5~K>d|9gT7x;2QO>lX+Ln9 zop?I~)y41bw>_qpt8S2cK)IZLdH(xZI3c>eSue zPqwlQ3_Ub=bRFiC7^LAq7N0x8-eu-Af3Rb{@LmPdyl8$$zg!7`9faZY;vEr7GiAtn z_g3yHqdkkgUwp8LOkwgX9^p*z(#09kj_W4Kk|lof&}{Fw{KJwe6!Oa8I6X77?fqU* zzPAEg$(1ibQe16Qh~fqX+z;mm5%jS zqXa0BTuW9(yZmex`J(ZG9seDv`l3Q&5kvsPWP1Wexpx*samz${01w4vhlj8&& zsI%d>XNYw`-4IMtT7mUi;_?i7Wq}yXKp`gYv!oVbPvZsH4GV?HM;pm=$yki_l00OB zHx`N2ysMPh#h-^GZC-%Xwf+41nSBoMq zqg0Dr-`cSO>0Ec6w=_%1*umBcaeg&ZU3WpqynP~4?7Kz#X^~M&xa=hLM5KQ z-PUr-_Oq+tu68*J+1!Q$g#|y0KWMcuKAVDXw143EplBFp`C0o2xTTDO# zJkJ}R=u6r|mbw`aa6F>SNcau^4}0$w*VMN44P#}a0tzZhRgoqF7HX)9fPe%kf`EVp zq=sHYQ*?`<^j<=T&_fM1AR>e!y#x|^ZvlaX7RtLqIOpv1-8{eVy?QU6J6J1gtvTly zbBrMT7mcv?*Kbx zlF0COe(K|&tEJUjtYtyez}CBhh`(o#be6h1Ql$+HhL$a=u8~`P`VA!3>4;(Td@i%= zy8NIB(>o3YH8xpR4?=@Gf#M?5|AGU0PPe`NR-A9KO|69o!qa{)OSJXq|1Rk|9@ZtJ zzqH5^qyJUx!QwRQx(7#}dQzfWc@$6|vgSoAzvy#ld^+G zI<`Ao2R~6Ce)r;+A!jEwPXClm|I*@85L;jvx>{61d*v1VzpG620;xp?Ey>=E0f7Vd zKosN`H*#4KJ#@p*-UE#7peY-DGwO_UnxZ-~2+q%;7Gp$Jo;sQOBK-G{N1V6jjDQ1H z4&P-mAu)(76NZBpebos^E&SJrATs9xs-F_KB|jbiBz923-YmxSzF9BM_pe69{$v^!Al}8~1pKp^NXX$;T&dEN?8932TKN zhNHol*7ELMw;OvNx)>|q+^!FpP(U;)Pz3}AI^3&S@SffIN#4Ft`!}(Csa9d#=ObG6 zpH*=)9w|II8_GdTspT1!1yzG=MJx2eLak<)is-+1>Zg?oxx~p)-Hg9hwKo8boOC1{_X}~ z0b9qC3+Q+P@#F)A1DKDWmo+bWkG{f4HDB&rnJw{SI=E6yEG_`BcTecVPl4S3ree?o zO@w#vHhoaf_z1ZSP8v|w_3nDZQbhJfUfkngfnwS#Dgxsn+2cp@%F*=10B|bI2dNn? zg>r0u+AwK)Tx_TS$gjdbyG*G$i>o?;+#eO5CoONG4yhX^MLzij6$MeJcb_*l=Adt$ zV_06%!o{(dwdgVq0M$sEQSe^v)}-=362-Xh1$?*3MhM0SA!5_h>bXy>%d5Ia!<6K< zuD<3-7Md@@vps>68r2PtcFB6e0nw)a<0iNF zB}j9|kTQ|B;IqO=)mCtV7S3a(u|iR9bvdMCAab2_v5%hpK`TfQfSE5NLPHcem>lx| zlqnQ{P#9SI>nLqH$n2J}+F**j*{!XEy>CR#jt?|-Z#jWz(f9qgZ@o(dIadyR5dm~a zb*JE?x7(nWpGrV>pFBBe_NiBnKwNJmf-LrqYqIfj0-=&hqZ3!xbL3L<&zkNY0F{bv zl@*Vh6kF^A>dgcg_glb~NAvTc(dRs|P~L0et}9hQ481`*5>Sz49eKP>A}5WX1$^Nv z7O{gobTiR~B^zA@_o4qDt#X)1?GK&msb~>vnqV$6{f5F9?&;gT8er~1KaA|;en$PI z-Jr$_yhqsiY&E^{s?<%*S~uPfzlo>LTNB>dr*RPs)03$5-smi;CM{zSW5IVd?*hqh z*GQ5=uXwijZmL#*4{Af}TnRC;t#g1m_~Wp1)a$TK1Ln?t$iM05)xJBU*9ny_NrVyI zq>)S>QsO7hJ_~8S;eSJJ`ohVZp`ZV{<$w3$qm#F9-}Jrs*QGO$PttH*zSz337*>BH z6+NZz^)0)$zjNXFh*y=ZF07M&m1#av3!YP*o4f12cv_g!{x0<4B3I~v#+|X975daq zbk|?S$;&%(n8zqrb;#}^IMDBYKs;cU)kEoz#kj?v)bAYP@M0Y#=U<`ns;m7IO007c zhr42=U#cMN=ADIKGEc&tv7+7^I9bI{UoLzLH|mdq^xwIt?8PF-6=AMiPQs0?G6``= z&gR%>)ZwegQcN4P3AS8Hr6}L3?lfCoEBTfy)k%sw7k-ZFmk4UP*q>?Axw?5B6~@1mPC9pM$4FjQ7)gYeV;oxokJO$`Ruj(Z1#O?9rqXF z3a$iL8?^t~VF$GLET#3H!@PfNC))4;AKYizSDmUKVp*1pe;Kt;uDHZ>X>zMR%r#J9(_S6o^bSdw(%iVw$IN1+EQz%d&F*Ta3Ht22LI}7y zP=toXWvfC3@S}cJJ-MniY?-(F8CdmGxU$pW14yZq+vr3Ow)xUrcZD8lS;CVV{lcsn z8C740GW(9DSS!Y09U zvJavyi4$Z#b0d!b@oKo#&h+{2fGaF8XukQDjPP1AHsRhIhZ+uNSHz|se`N-|PWfJ1 ziXajk_vQYG<7z{9o}SRag`84ju1=>5D&{+$Ua;g3x+u+ADbivA<{lUHPrcF<&mzblAz zN>F6vQ49W(X!j-j*HfIw*r&8!FbBI@%snpsDr;CTIqv$y^6_A>Hf>S#Y0<_;tSDhu z4eNtF({2MRqy&-t!O|wm?8tx1Jv#n6`5)fDD62*Oo9Yau=K0az$v2K)OaAZjKa1u2 zQVKpF{p$I}<25D!caGBOf;@-+{fPX(`aS&ba#7lv{4aOW&>ZDS{Qui0AH-0oBn3&R zt0K2M5LVhD{o6e;g;();UUJN%qEB!C zV$n?&q3lp$H6~8O7^l#lGi^q{$vZTey^$e+@3H|w=c{DbHHs8?z?nkcy~!h&t*l3` zI1&h9f6Tuem5V;*%vY3RV-k<_nR(@T^tj>WPrO%)?w`w{R7g(F8Fh7OLWwLZoF(4| zsTKLp;tTE1w^Hg2k9R4&Q>8~8RZDW>U|=hwTz<~5H8=+VyIX@&C;5_i`?I{VY`g-wB`MYV| z8bLFEqqyh_P2kbXIOXC(%otIk*u{MGIObDTDlIy|UA~({r?PcW}l0UyAKtj8f=u&R1FCi1PLd@lJh5x6}ps6=he%*l-csf1PUM+TOxw;ugE)Dh=;Pnf(~RQef%txX2*6oNDt zjgG>)oA7yYN1x3nVf`!Dn<Ct`AF{{eC>;i?ct1L@ zVV$C$LLZ{4t@HkzIeKI}B__8V6Np}?G#Czjs2@M%y+a-ll{epJ@!CuFW3%&p?W5IHktloHDartX2(=A86l(GX)LXwAz#q?`INxuAkBWI?;7ez!UZ-GirnHPt z^qKv2W4tl?4VmMUaeQY>?Dfhi`)B&E1}!S#w?ET|x_wBahk*xeV|(xFNVa1nWlyQi zYbOZ7Jac!y6;#Y7hQ+VMtN<3xv|~&FWuiQ#(188o6LKQ-YCc2C51c;vad`Dh3>>U) zW(uXklZ-E^#jQUUUg=Our3p{;XZP3*G;hQui92^!5e@2suA+9pLmu9pr#hcJO!Sn7 zLRwtl-kjJWmvTMSN{RXGL)A174yY(tWmwwYMHpYS)6I{tbyyroh4hZKkF7o&%r3Fq zhj+7W{r(P?*$6QIJ?P)9dR|oAnJRgHy&~>kV}wFwU2CnWp10TSO$LJQefI<6fiY5)sNYw1!_1T!aTudF6^IzskvU|E_vi|bauuIZ} z=C%%Gq=~X!mYGsjPyxRR_Yjooxl=%+wdX+lG0BR`;Jd*Os0yved)1bUTmnv(SfQma z@8jvcS6H<~&`A!;rPlq_V1wpa{~^^><7Js2?#5Qv-L|u1p@!Qw)dq~LR-)dQ4DUH4 z^tuSZ6GT8O3vX~LZDHfr9ynF>ZvHeyfl)SMwiB}zuIi5uk-!37ZG0;#v-F;_dlLpr zVLaSa#qLw>t_jKM@il9+)gAZCyO3b6Z(}RYCZ%pO9^m*awFddx4OEi&s@YX& zr*7VUc<*~j+)C4F^deC*EiJgN%R=m%7d0yfs&e)ny!}bkX|#x#^h+JHEou5-KbIls z$V%S%0s#-U-SYfXRAti;_G38)9u&GxrJZ)#m)51KW%3G4-R_n1{*yWJ1B~pUD9B^m zxm#e0Baqz(YACPgU25 z*4YkYj&k=Vcgz!>1gM3uXP-cKV7c12PtG_nC!G{wx_C=Xp4A$rVy(GQ5v~Ms#`e32 zafu6~ze4zz7J2m-2W@g4(F4FXu;CyKOZN+PTXdW#)R=vDx0rjof%MVUK-s!GksKa@L^eVO<1l1ND_`39)5+-obKW@ojONDldIKHkcn0tS<)3Mds_TS3J1zp+oE0 z`>9eJip9`;q8)2h_nPXt+Q4b_PgBX%TwAvr(6^g!;lFvr>bom%-VwdV4qfMkg9YMn z^=IW>OwYxSZ#NvEK{)MHE>#ib^bs>`Owr18R=+v#;|!i@(XQUGH0I2A<>j@94L%Uw zAL`Z9tFwr%Yo!x1zLm^ zH}|R>+bOKTE=a!QLKl>@zjOd*JF_r$I3c9!43=m!eDRZs>tzqRB>j_W0k&Usx#m1k z>abOx=UUuG&tfr1v_7;eflXg$W1Lg{+W}g3?*gB4M*Lb6&#!|C5j#Hqt`CN@}w{2 zSm@$L!p6HU(v$SeD|HMIFJu^5N8Ac>n7%{3zp524jw#2Q2VM2JOZ7T*yqTJTRie7jh~)>aq6<9dNQup&~V@%~DP8~bGeTdW#HSH({1 z9rtyt^a919j_w1Fm&|&1b=;~pJSx5;)(6#nBPqnBgfX)DVFjVwQo+z zap^(ro@PkgVrKgps^CK$e_rlL+O?K@p`NjGVR@KVv_9pwVwv)J5sg&HYL$IB3<_n2 z6>Mx6vpp|UJ40Bga!I_%BD}cZT*fots-A#nP4ZPX5ITP*KJH~dG8&0np;k;opoE~# z-B-;>`q*xljMGZFaez+6e1-5VolXn<6FJ`8P^sd3>H~d1i*>?4{;_6#UH6LWd0Xnt zkdB7Ny=1{@(Wlp>2q)n-{MK84!1<|~7H6*DNU4b`C^?&onF%tpXxLu+ZaAxLxZOJw z7u`@W>VO*wmc&OaB1pflpG;=Ipj=7IY(@L6`*YAj74UeF;;_S9S_eaZWEQ6Fw^ves}e ze4Ec4F)&iCAzI&^{X%<}zutbQpE1Fu=Q1I4iGN(xwJu4-EViW6QoV>Vu29&}I9Kns zsi=8h>jM|kui_UR;-muMN2Y045uQTqI;kx;Afza^QLSJEQrS*8alEaqGlbJFu91N2#am5;?Uz(l=ksn#^ zb!JwxtGU++s}M#7e8NK!G%CIPZ?)e>&uVvmNk=LAHmPjLO5OMH*FxyU4eO}RC%SaJ z=%}H!s9v>y*;uJ;X;Fq(p$R&O`II*4jvMdFx%;2>`SuUt8uRIt9H+H!8WtFv7XN88 zY7X}*EyQ*5!bpf;{)5Gs%ynk*w6$If1WoGTQcJ4Y|I@FnxLA5T%afF_77Ip9XVf4 z>X!;t!j9wPhnT^ZJgSe{truDd6`6=v-bJmAOJ4TW% zikAvp98c}0seog8pt%Vh9c^G%1W>ILX#pO2Ur9sf>LypcXFpD3N|JHv(gVZvZBR@1 z=TOS@JfVt=tor>8$XL4c{y`K&WKi;7bo4Mr)jD)kL#`-NU87boOdVq5e$(;M&0}_QCw)+1^(-BOIjqg!qHL2NY z8!4Dh6ti{99xl^^L+tQs^dM)0H-O^PS5PQT_4o2xeDr4Nh2x)4cqF76%@ORfC>%Hb z{NnpyKI!{Y+oZ%h{8}el>EPy1s(qU*1#9;NXk=lzlh3x}8SY;Sk-6eFD?Wq2IJgp=H0N)=4qyeg#z$FBGWM^{$Gp!Cs z^`>uL5(Zsg9xk6Oo=CGPu>9@Jn5NLy<{_qyRfo@xUsOxBG=7INeZ?qLTh%dy?0NnX zSi^JJ9wOxVHsL%!Y~PYW6$jPAG-fYeu8IE;^>X--c)kJUlCfJZF7|J3FqLi%9@xaX1R_KJ%FhBrQ-gn0RLg z(9ls3_!d%&Y$3?cB}uFI#hZ^rVdei@eExG-!775zoO574gZ0p9^w{1Ohi<}#T47X%iQA!ez`wFvbN*woKjUL!)7vediVC z;Q9P2-mhHxPn*T7%tdcMwR_6m(SKg3G9zy^c}mc3kxEV)K(JPR{YPg>qmm@aGvZdI zr|a&uqZR1Z3`X8n^Z!t{pCs$(>#uTv-|~~dZMo9Z70I(q`|LFcrK%Rx@PifSQ5OZ! z*_GF=M}R|)u}EPl4c*SlmJc)H-dfKdam^(cbg(rHM z3gg$#tUbRW@QE~?VA}1@Y4iPH$<;?YCv6II5QfBF5gth0>O*qMf1wMuVVC8US(%nj z+8o@QPdJZoT|C&A#k2F!g8E&`xx}9^reH-QuT|KtJ7!>bceg(JB~158ul1?&Z;oCx zrU{Zt$aQ(3tz72^lBuSpdI=zS|2R0vtx9@{`A}u?0Op4xUzb+l1N_>~;m+8T^;O%$ z>Pd*$^FnEHkOZ~T<42=^G-lN8OL`d6B4@8EYpd9qT-qXJ-ADX_5eAWIduQ#LmaGNMR z)s6Nh^O4^aFoyB&mGd`pfi0@5VQzBfiwpVtl>q_HBNZ+7owO|D+Kz-ZCY=QS8|~cU zUtr$u373l?dQe|$T(R(>|Llb#oK7mwRGeJDOp&c_S4`vZ&JrvGy0o*_xfR6j?UdLX zHB*hZd1m)D?6O&+PatqUj(c}&bUM}E|0Y;u)sl;xWOiTye!`OE{O}mmx<^m_ zLGhW_a{v68w@+5M$vizM=oYuwQG4OW$nqVrUlgw4H1L>zOp|PnsHtty!>5NI_8;Ky zUpWH0161$F1h!RCz+6rxs0YdQtqj$NqbBE#{iF^skKmHaG4L@|iaO+(KS@O(_bZmW z|KG?PDM*Nnyd@uoj02!q%w>-ux4ZPmcBM(38_=rvp?&N5ZlahvpZnWQ1~>q+H*@?0 z1&pyKcQK;E@&t!}<34^ay+u*X#b`=yd2G6+F&#Bn*$&?tWqC_+1m8EkDrQZ>?r0t%p3KBDM#q^@ z3OCP{ik6TXDS+qWqR7DVV<=REDjwPU?Fg%k%ZO=h(sMtCkEys>$(ZVgS-#9-dmW== zu=XuKV-We}at)VNhqmu@QYLk#*qx-?5q*U`^yjf}d0BL4D2tya2OS%_4l#LgbSq1> zDEyx{UmpQ;738NrI0V3~{{tq!U3f{pnpME7`csE8Io_;%>DvY}z=IP*{9~6!VG}uW4SQ4F05?`jHppCQfHuLhLSu-)<28MjAVi-@sdS zOPyDr@&?WuIM>3@cY&)P?0C->+iP?mzoNI~omr^`3Dd#EL4GFS@%`Yp94z#IQ$XBH z$)iTx9OPwt{w%=x^2VSz?_~#1|9}#9c@NGOq`b~Se#_`we$WE5{^4|C( z7~dO$z0%8zELsB}gZ5vE1aEf8aMSQnAD(r2N62UKP;-H!H`7I!CtwE>g<#)~Tn|nx zje<8j%QPsyhf_fSXcRV29%+}es0~T9sNODOkwUX96((9kDW^+COjpVG=hG|DO_H}o z7b)=n4aWS6RDX|SmkL(l{@1scSdx+{jtFYzbqIovOEM;e%-$b-0z@MEUSCsjq`cTX zj+@Z^y%9jzZ%-Tn`+Nahm$i72uY0-%D62RgD5%(4y!bQyd#<2ne7VmR$(9Kq`ExR#n{1X zcxoeRd>+3q40S%}nV-m3R}>p{(sio;!=K8pICgQw8~w|CWms&|p;}EOA6aHMk)!#C zF!}8~Y~9jnRRtL@vu^=s{bMnZ7p*e3wdN{4AHk&8jF7ekf}gJ$N^TC!Cwj04iQ4Y` z;Ijn^-3oy^j}@qDR36_*1z7T3g;ruFM}hK4L(ny5LuX=p_Xs1mlIyTUclLQIg(%Ev zbb`c2DknAD>g}A~AZDk>guY%ONu0h6R@32Dw&cpJN5Z-#0SG!@`Sr$3a^{2jP3oPS zb(=L3hrX(+N&TnjWfmjKRekVGu;X~8&^(%;@&Rl9e%$H@&eXCcXaa~T#1#{S5&$hF zgcjj(vM#NR?$7Mf!)g4zwj_l?JAE5z@^q3-eAP1pqy$mVas}U0?iU?GIM%HYJWKnj zT7uPkRXt`v(wSqz`sdZDjw)kgPY&7QW9#QBfM+h7%|a z4O%=Z1X4gJyRQpNbwy?D$gJd%h>crooX7soAQJ!(@O0Kxm(_yDF35$sf6-$k zXlk^0W?%f0Ym**ls@JCUZO~rx)KurY0WC+Xg6VP6E1;BSgE^J}pM(#S!vyEJu0ems zt}QKTZ?*rLY_tLnjEt#oc#;_Fc&IrZm|*6d)(Sdp^a-0d9Bem|FlQ$HuIV9Az-yZC zA#A;rv=XnAlWTMeSrf&N9)5|{Nz!%5@AZh>^JXz- z+0Mv3SI%91lNw8Mez^6m)WvXarrwX8pY78ZhRim7=@orTyjb_5JFa!D9BQb@acnyG zsn}T$6Kt~cm<>&=BbwFK@|7(h@sxsp$Kb7#T$UhPk~oqL{F2P5)fhUz zXg`u$^w~Uh7q%>tr-|q;c&AY3xk#0vCyU6DER=|&wCe9wYB{5Jg!g7uyE+i ziSi^6*Lr2}oUy;aE3AhfdKD)VJvaobUoQCf4ldaQmozRy!UV0HcXG-{vHDRG14~_+ zmHL7jV%~U3K1sr#cT=}RA@X7I`-wi+o#1?kW z9v-axsF^F;h(*ZIvvHm!^^rXIZX}x|L3qwDU>n3l?7JnMlA8EoA=8J%#yIt^N2@4( z`Ad8gK)dvJ;LS3$5w#*5CL>j~6Xh|rlN9lFB=KwS(D&mF5gLHVC zGHj!xu8$9)gpv=l(%(hHYkOP9#H`)m*6~ihoR!?dj-yX==j^URed9{g*v|o>=GcB6 zvD@NR3na}2rJB(xd$BP#*?pP0VGUE$-MfU-uMQF8Po13(_~f1%2NRrnS8`=H=a$$P zm#PG+*fWf$l&enyHtg;mp_P9olA-!&Aw;a+7@f}S{dLS zKwKnm_07fX!u;?^@84Yb`CAs%kM2x)uDE;2{*|lN95=kIpw4{96b1*!zsT9}^E#`@ zuM2Tm+_vO7pR`(rm;!TzduQoF*X=PQ^pT5Mxs?K2&VrdfygF4H1+OZzowTA=5NK-W zooAaVa;C&Z0n-_fS?{WUhb~T0%xhq4RIE(fWo}!!1DVRk`enj~TUx4Fv!^pl z;aObRQ2$6GD7}|dZz=vWq~pUQUWF%xfyJ}hHrHpCV4!dwS&f|VEJEQUX@RpBmY0UK z7pgG}`#V*BySoR{L?>f5B13KjknO{TLcBjx1i4!uKO?rfF#8~~mc;Db^*`GJ9o91) zLLfGDidpMAmmcgMpE1)}7+AN|^JLEZfEx4{zQojq@_n*xV`L7G?W?x?6$xYxGxKMQ zI!%>`4LsSkC~k7bIw+4Vi>%zH1(q_UdNMf=wJc7?$Dr9thXGGDf5O^xmvFb!Rbymg2vC9&Dg0( zZPT$edro2|tabC?^=_|i^jPLHFSY($TcGP5P zZ#GSqx3&^wxJ?(iZE+CoC=PJgL6OdqUzTrudSX)$yv-BV5ZHCvm27in3#iKeDv@bi z?*QF+9XkRcZ-MRye+6F)&8;kLUJk93SQm9qV3^6PT5xQ z5kbiNJMy+kzqZAh6sF9>9ol~y;hToR!7`$7rwifiF%uDH-GNEYAoJoW2O=oEn8%EG zCb2zdtATG~s%FiZPE0=6H_OT;!+taMek=2;O?hs5ByzWeT1m{?xR{%@0832dCR!R= z^`LdLaUSrkXoV<`tl(ASUCE3q^2wby}ZNM`%<$yKl0#yE*BTXol}@yYwCcQXyL%y{xhKzrh}iw zHn$)6o);48H$>)ne$PX=EUxVvk;GU0!!x4~3hn~|g(|)DG3f=cn&0S3-ni%+(i$=I z3!&T^z2bm-(BHEsP-@6EUof`JY0500qq60*ol8tW6t;Jac)Os79;Vn&nuz#gKe`R_ zGl;y+Tl(`+F@3kVo5ydWFjmK>qrN+EEc!hIU0EVwKvmoc>f^7ono?Wmqd(MO6FWh}v7LwR(^p*#Hs)E?Zx8uQSQ;phl z^Gx_gGh!~n_a1t^{qspF+7$CmWsR!~jvI|kOrRM(V3q<4$`fJthnFy0Q3si^gAkAQ ztbY@llxn{N^>zDMSfWDenKR?@ZM$Vts4`Pf$}^UjH$@rX}h_YahvyhCR&;_`SkA zdQ9`f2my4b=$J2?eJQs+tjG&8QrD!+(hIs=B7^t`D+`+^p2G8d1JdO00LE3Nxdr&_ z{=MEFGv>qW44!aEMl8=my>wm1ZdzOvnVrkh&2-hjWTz)p{f_M&UMgGMw^P{`w*~fb z?ZQGv)XQf<`8sk2>L}#y!y__+d00UxS>vte9AmO<#+o`7kNbo<9(gw-MlfDKFdi`j zt^1(1{nT)ZdT;~@EjmtF!E=50&eix)`C z9#3mfRr0kvnbir2CY6<<4kfZXeYHii`WmTh|B`46Hc1cP3)cx}1v?fc2F8yDe##~= zuL{*{13ujsj6Bksmd4??ur4AD}Uvi1)EzaecAXeKk z0qqOFwF9(q!C2Z<*n2JvI_=vk8T2I41ljD>I)Ns-TK0Ep{C2kw7WUO!odgFVz52B4 z^4|E#DVgyN>AZ~4BVxh}Hp2dgEvg@SgRk1*w>Ut~kw&j>mR#66bQV>WSBmmp9$J4A z6>l{Vj}jbiVIBc&+*ZD=ez0`ym=y;)KhLwLY5u;L1n&LJ)T_P=OD)z*O9Mm@j=SeX zKdo4xYpVgVNAdE8SGa=PIxSbT3zd(#TA0@icNdilf=CL#A~ z?bR?^{d8RRn@u2QF5>|?MeeUXa8T4 z8k44cI{e-9En5SlmNN|qUdY3x>`I7*>c4oLn>9V0wBb%qT-)z8D<3;C)=`(74DHR_ zO29KNu+z7n1}sXKHGA@o-mN(j(~BUX|6xbptQz8;=}&x|wf{}=m0pgSkCSO+?a%_+ zE`#HA9O3yxdmiGQkyl(^B?#n`c&vKoy0ph8KbXxJZ!)og+H@Xv9T^eRLPiDl(bE_x z5k4s`jV^Ip+kTPhXml#f_>h9Vu)JUs&b(^XR(6<9sylhcAW;EyvC?HZA6#iYy63%s z>OXC@7#1(M+SI8p{AgyPy4FKkT4Fxrrig60q6If89paS)asP>S=ad092Em=<-gtA5 zcVAlSzUowkS$l+8mZoO!)NNG@I8890zZsOP{6NZl-b!0L8Jtw&~;z zUX;DBEL7sw0~}Lx>9?(qO>G_0f}^r*P$n35MZmC1u%HftLwA2yO7h>7{e$Cqv3viW z&t<@@B$o2=VKnVJ>;C9xqXY~_gVAo8Xo8^rw9BVHkA#S&{jwRo`GwBpn++=X@0FIX zfJLQ$A~2EdD8`2nmMH_wq+fVfg4zW>vA}9vc5eWIzN`o{VzleM^za#GgJNrTmEGB| zU2xQ}J-1(h@g}4ht7a^^^@cC2CGI^jz%8yGS(!)saJ3U7-G|vyKjGOE{z#Z6eb%7M z)p}>0xMo#|?z8@nQrWFARvjQI0CEUmL8MXsRL7k*Z!cK6i%);h*qrlquVZIX*w$%3 zbEz4PPo(05{`uMLvQGSFVAnI8a`dbv;hjWw8jDGWP3J(p7g0H5Eu{~Q*V z6rGp5dK2(>og2y?7JoxHlF^#jQI_uTo7E`5P5yN>oDhhL({K4`vzKQ&wC-$*GtbM< z?>%?McC+G%qj&n!4#+mW-%*_3untHB%j~rg0Z<%x@0V5Nu4Mhq5rWr()6bM%(uOlV zac95x)m;z#KHgKNKf!skG2_rylq`ctRY&|ZOy;M@Ap0XDK`}`38(<{3kG_}wuQS{w z2G&%;hQ+tB&%lwHJeT7xRqIFpP+T|}mpEhK#Q388DPBqazR)#qz3jZ6^~i;IRMT0@ z5xk03Q7&5`ed#~oiLF<%HOsv$UV`U-7K{?7JOPBZ!)0>gmA3C>JvB#Qbut#Sj$f)w zeQ%e%C7Lbi(AN)k=Oo;gSD)@tPkAD{C!7+M=rRb&1D1vBx{pU+GGoF6j!daxjEKbA z?$1b5XU{~jo>qzBzu0nTyPpb;SS}bPvtM&DXj3v62^kNu**Q{03;X`T9$BlaNr_## z7`fe;Cm(}5x+AMkW=z`x2V90lt1WkqKWpqNxm!z501G2^gsgzSJmEwessp=C#RoPi`R3+zlqzE7YA*3!y*c=qO+G}IBV+p_R zA{$tP!GmndGI(~e-fNR0v_66|3&eTW?q4x+`zWkCJe(11zFBTH~%y< z*w3%46S`?J!;Tf)?EubuUd+o{=7^CkFFDUzzxH87FEh&6X%S?so`xQQFiUuQ)Y==` z1RX&ur?S#|+H0@ZVi!tl*j=kL=Azy3WmmxN>^lc}y{cCi{Za&|shpU`woXv(HyokX zC;BFq-mm7uz->$R<>84gJR>?HvqMpHk*l4%364sQkZePPvsCjkwX3J7b}4xyr?MI_ z?W4Mquqe!w4Uh8z=E7oXY(K=^XlFOCEMKSeDYj?O!ho8p%gb|wnu;KF1g23x_d~>^ z5H27A1bW0KZms%h3#|pQq}Flo)LOs;K;`H3bxbH-2;{LUaXvvc0`DhLeORGn?@%rN zaV`Pu0r(8DqPs#z)+(Pn+*+ssECXM;Oa4{&q8F8%>v1Ndvy>FE#r&tV*4zByWv{Yc z3wLQ7;e!57eOxZJUsQ?*bhAyZ>;%=kZ2l;)64aEj{XgUjlY1X5yY|Y7C{q3_O2A+) zg6zPYH>P+dFYDW`!n<=fq7})h!c}XT)v4#d7+*5Hzx!o=Q<7WJajy1KG!BwuQI`Mr zd0hp@l~@LkwZ^}}?jnHWLrK2xs+%@H=&CQ(J+Vr2ZT=|w2#eoLmGIw%C*}# znE0|aye1roi|(i!@6m)&vwQaOk=^NCGRI@r1jU97y4K03g{w=;f~E`KB@_b((@u*9 zSA&$>;$(k=CQOMVek#J1Jf5pC=Z@yVO+1Grc|3AP6ins0__wS1LEd$9C+t7uA6lBD zfrRGPFClrxV=QVg5I@#x^<&2Cy;uoEX<7br238!>>$3FbcFBvj>d;ZlwDZC?;5z^+ zX)qlRsUu6ZfbUE$U@cEZz)^oDmoln8`6XP&53a$HWmi;uIfI`b^*ZCFC=cF*Q)gMb zpBLu5p;7iyyM--40wAgo5K|4fy3bJ%W4hllYtJmaKeTAQ2hCV)jfmxI>q?)qc7Kbn zN}T^E-k*Acnl^xp_z$bTAtU}?O8_<*xOIQ;Cx1e5smF>}g_Bfd)RlgRv^!+5Xss?< zz?cc~?7^S$`tCKJ#4D(sS*TgOexKDX8tpB~@xS0T4DGR@)@dnM@aC#jeDy_cYjK9? zdpDU~)+M@SNbC%3p3NbKNr#Qq9sU;GI9prSMIL}y?4I*QJ!S)t(h{s> zmLPIVCaNJ=N`@J5IhY^03Z8{0NTwlb?jMxPAkeO;xwvU<|LnB0N!OyKw}wxe8B{v_ z4$PS9OSsdr)I$n6!uva1$b|b>yv&cK^SV*KLiy8g+8EEBjm&zwSYT)%p^-wR{n13T z6Ki|ekaj&-X39F+W$=>xRMoi)5IyWn8bYY7`gMIgcn9$6eQnzu-5M9a`7T%$F=C^o zUWNHP4Dd8ulEE#0IjyAL$qX6W#6Q!z^3P8i?5RXa1QP zsw3=TK*T#>9Vthu3Zg`-raJuX=@b8jOP2;TDE746Cl+=eayT`IY$s@`GouDfd|y@q zlGGHJD;B{W80i#dx@Slqbx`}JL9)Y}90y?Yo)XaF@39&mcdn0HVkUL`Uba>?brXQ* zs?GqeuLsbbNG>pJF3I@$fMK0JeSpht@yp-A?rxb{a1Go1A)Rw>3ddmTpArg~D(uN= zq0|xw)M|)`wEBuRbd}Z4aa?gv100H6;yrVzP)+T{j8K`Yw6LO?1xKaQut2t+b;5GA z>I`TO!a_4UPF`q@W4QFO+D|^wR6^ zc&E;EOL_2rZGQ=erdXy(-$JpgbuV;~mi@Duv9m0NxI2HTw~DyK1=O`(XVWl;@5Y7n z4Ol4oHVEco@2DBMPpP>^V#_a^=q{za-7)8fjhpL~&;b4BFwxj+-reSKDK-C03dG32 z5jx(r6A_W*)LIF4kAw1aQIN{01WA?cevqpm%F{ZVmdIK(LrF(hprnvCUm{+8>U&Qz z=|?*C`-s-Wgcs})Do{7y*{g*!0|Mov205};1FC=tz`#nAe=c?B3E-c0voN-Z^O?>s zM}lxKdQ=Sdhdxbpqh}+qU6pU!O4cdku(}o?pdKH)s3z=;%_}a>o9ifhN8)~w?MPmfJ`$F=5Mm5+mfmvXW$-+0VmH=f~~3yX#vtj~QRqxF#yHo?qTpudiY zB*E5exWyUbzH6dRfv>sfSR4Z0xSWT|rdRcFi=9A1hKe%Q?MP4R00GhEWA;ATHJ8dq zjJ(<3OS>Miz>V8S8Y3t{8F4Q3f|l|YGUnmj3o{mtk@SwEP=tKKJzo`h{q@B0r`AL3 zZ=B{Q&{0A49UEO=p%9{(FDL3}P?#=KihqnIs7Mr^y)h8DN(ySM(R*Yz=@%+g9}myYUZa=PT=OwG;s+v~csz!}k?!*Uch{!$%<-A3~0|94}j; zz^jToi5rg&5p}pK|DE%rcOi~5G4|lfNcM9j^MQaB|6uj=>|UX%1q=+N4+5acX7O*4 zTXFLb{sEexRfPoZmZi{`K-}YIq3$!0T=(M#0YW~fPfhm(oVf|>dBus6KwLSHe$8;K zC)?x8OD})VnDffITGIlkc_lKihr!JS`zeya9UvTA)1_1P!q+9sW`&ILHNr!|yLi`z zFRlsePoQO?U_f)l-mmT(1r)e_D}Uwd?JF6O_tGNe0uW^%ZgC(q;|5p}*ekU|RYZ9> z_?A~fr*wI8-ftyed2|@zv8Dq!ybKGnP^lQKQyy^SQT2T{sC+cO=NBl1X6>1d^gEop z82amx--Yb!(=FT8?05SSqSv#r73RMpGoV`|s|Cro7H%N1AxyO0PdVQ4FtEmp)p4)^ zh=FGOqJ~DUp;|?3-;0y40mKB`6Gbrdl`p88jnb3^qB8pVm{7BTK>xnPdT;!z`BbKB zTdUV?@#%tUk`A%^L4^u*5LE1dvEp$1GhU$<@74@m0aTfJV^n$&H@PUcL9Fr3xD^Wx(wy9e9L z95|+{gM3U)NxTSz3hR z-PcVK!smyuscglM)eyk8+=q={gH5kZNAC?F7mATWx62!x&Bf@~uJV%S#$ z38-u#ECCW;=i;05&iQ|OAKsUD{K5&<)pfh8tE+$Ax2x{cRG$iUvpctb>*HhRAfs5L zkBVp8%bxH5Wo=dCg=up8b7t)D@o}}+a-W5ApIn-LVwiLN(#7e|UOw?DN>{&lD_o@z zl!Qbcv;0OajN*Iu7b_JSiSqAWV!z#wvG%BnXPEygmjA~e%9LN;3c3);Bi zYL0gw$PH+Em~E>rq7wIQd`^2n7eD6sbz|?lmhe6RHXh6x<4Rg>^ZZ?%*Y`wI08^Vb!>_waz49etKfg43c1t?{ zH|&3LSMOY>5I$ry$OgLn31gY77K4rTUTiF#yP_Xr{R1TKe^B3wlKuXZntQ(i`=8Y0 z`{dyNq*4tc>6v1X+=(PtCt&YKrv#fjD7>%#P3>Y5xwYb3bf)g+r+?}D0iKWFYTXx= z&9?|SNJ>j?33;t>i$5-6ew$?zbVrtDRa%r7Vk90B`+K}8@EtH%*#0%a+`SR8^mdg4 z`4CTwRuf5cWRKN62nN}#rx22%Ys}HeU(b8dhs2V``X-@1Y_*m(WoW*D;rA6C_O>|yk!zA%uN>~ZeNWKL0=d7rR+o?r4NtUBPT!+y zt+u4GpY_+-l#Y0)xrSO7zIxL8I|23Kw(vQisSvDf!q=e%@sCc5>>+x1J zk%zbibQuUe=+y<`XIHx4r@D&>iBR;pRIQ`Xw~b+!J+u>C%?{h-XdKlZ7|SRr?{3qo zwRTuBhKB2pbE-M6CQbJ=@y1`w{mQ#4tlBIVGA`J}cc%XzDhT+EiQbeha$a#^cNhAaiGB!G zJ`}!wscVNl5>C)@b;WKVLd?vvZaJ#^O<8s6{|?2Azz$_!u~2>Fs@QZTp<-X)$>oc} zBp>d&KM49)2dR+Y&QrOfAEdgm~>JJh^ zn)WewLw48_w`gV)pM}Gju&0R){-5-*B0_jvCw0+d$niRC@g^kk+KKm1*i`h&=;o0_A-!-$ z51%PI`ULnK_ez=nd3U<;D)1DE4Qrnaay)F55=3-xnSnV_i{50X`3?MI;(yPbZn|m| zn``BQsynGOUKgGz4y8>JJKl81a&(CC?*9Dmf^ldRZb7E2Xholy*#b4B1+$_r6UpJA zGDG(k0gux~!VrxM64NF!>!9+d1XWgydwb7)Le<_6^1vh2_4b$uTwR9ZVE#&SZK+-y z4gO@Q9w!*L>ymW%FyaE_JzIWJ%}Z44(%uVKu34$~FE{ zrDYS^gE$FQalb8{J=iDSpETwk+jF{s(Q~z<6&NDfT0tgCLMrloDDwti!Mv#OkT*9j2c7BNZfy?9lDA@{w8h8Ki$g!hVVkH6D)RPdeQog+WA?GtK4sxKm|PJb~j zr#K7?TM2MWiOx&5S0k54B9->%jee1a73c8;Q0^a|PG(wIja3PgH{Ra!Oahu{T$=y# zM6D3fbi24g{CkihT zg72{R1$>>oll>K$=nU(zsT;k;^3z{J^qiIXhqF_btgkhJ%yG|R%$bKFnZ1oM@#;Qb;9}>lO3rkUE4(9LG?ij3Hxl&WH`O@CKFUpNRBr45aa3hQf}OQZE=I$33uPS6+EvuaJew<|u;pD21XiVdl5I z#-Do{z+`Vv&S8qTxYEu9hCy6eg7~jg%=!Qxf%}AA>xj&K&b1h=K^q_9y~&s^GAX3C zX*hP@wh1PUbe!=TX;Z)P4n-~E#$9fH=t8L2Xm@mfMclZ_N+oh{uKv?gZLqOgR?b7| zb|;AHdo-oSWu;vq6zFnvL2&>Ro87-@EMe|&) zKyxQ^^o67#%=jaAMWcEy& zs`&n=s14k$fsN@b5;0`Nny8;)dY_0Q6slia)AbnT$xn`hm-ZQ?@Yx?=T91;hGcO1F zCadfCA$cF!o@Zf(#(I0;{jZIh2k_y(OAJq<5~`x~24{^FsY03ryZ6vQlc22KZH)_* z%Nf+xOXvYy4=osc8k*f_!W)s~a_OwUd@7C1@U`gz(HW*${_WM3=MG6}@8q!_LDKET zwcB>#r4hle1{B(T-KIU;FSxFEaEr3LXqrnEZnWxGXZ)}utZLHil)LlE?j}o=gX&Wx zYPs!RNV~J+U~6)Lqx~c7l2oP7N~b@}MM1Ia9LB>;sbba7I=HqXN6`{MK=O$bVDKgWbM(u{kCevpzX!v2!CLVkx}#M|ild zNCBEcqz|s(Hv-5+-snf{YD+wc8(>>KAFk43?>aF`3u_+-8Hzhb{l89_&~TiT6xRAS zL-l`KvN|h}Tet&Qsk7Bsi|DXYCF@$2mzKBJdIY86?JzH#J&vk>U`_BL({8+eP(j1F zjcMQddSh+;x{Cd}8x>VTzAhp|SZTEn!j9nKdP%dqg}%>D{iu;O^k75nGW^BzwrF=2 zIpdpVeQL|Nn;S4gTcBB&$ED@S@|lDC4OSOq3I~l(FUfZQIfwg5ifW)e9V!rpbJ7Bc zyIF6|+Lg(2lW&-#hv%JiLW;ST4Vo+5&&d7k@OjSX;73FrNiPjdb35?Tq+hw|uMu;dkug*0HBl4@56ulV zHN$Z|!|)dyj7dZ9&)=%W5W&plI~vSro!(-1or-~q?=?i=vQv7Q`;y6{k|ctLuiH}i zHrc%~xp!qWO+r>g1Ps-IHYDrHNJ#bJfvCPzB6;!t5{4N0$}J=aUp#^K#EyXJS~s&e zA`JIcc5uc;Gz~WSByEfS0r@*$$e)#e!~Dvs(i=<1QMv>8c2TjJ4GwEXt0J;tJefd4 z)CA0TmXheK-}Q8(Mlxcqca0jHHfZ>SX=N?Z=5|Dz*O}x2DNO?Roi|3DV0Ur~V(7Xn ziO;1;)nB<*m~|zm0bXP0#;raU(i!2;!VdZ;^Xkf>)&y=YUmHYoJ}0qK9$HRE=)>-~ zkEx)ZZF#Ad&G~k|VJ)fqO-%jjqhiH%9MmtNp!%1?_&Uq#*1KQV7kqvsE8}M}h6wr= zl~tcJQ+G9j2Xq*TEV}yF4NBW0tnq^qrD}3$@Mxk4T)d#( zQTYehohb`}=E~WFNt&3E%hKJqaxJRoR(2wLYmVeBlCVv;J;@y`j1r-eP%CQ3m$$lH zFJCxU<-eFmlwd6uzWeN7~eU5L-Sl^UvYUxP36=fMYTA(nSMQrAK&m_y8#| zN^#%Ab@XJ0t^OvmqWJ5HmG+w-BFVr=tQ1GGA1vJ*Yhft6T$=5!3CctE?y%8UQlLZMqAuA%iJ_ob2VX7W=DCq0u*S5?}dlzDG)G(x(W#%Dpr_ zjtbiJejX9tx*$GdZ=R{U5~e8Ybms_HI-;T7zJn3nNh|CR*Yz9X%bwPiCwUdp$Amr z19i9=!ADXUYnL-kVHuSN~DY9(BXvFpFhqL7^s{#aF=D&@+$ z4CiQ6RgP-Z>4?INAD{;VMlk8`cj1}MWM^ezfD|mYHx~>p=aDF#o<(+Iq(ml0H9u7edier!R&}~AG3;VKpnePn>X6YURWd0hT7}}@s#?dolA8@|?u$HjP(BR`s-$=B$r?zvY7cu9yuI12uZ-!wHYbBGmOKaw zoh-v7Kd5;i3NDIkpQf%C>Ra(gOp{+tk|kUdu!N>XSo8|w6@T`c-9_V{ibQ+KQL-nU zELH$f-HpNW?BZ+Rx2+6~xF6uZ-ApvJjE|Fh6SVT#_Zqv5Z1A`09sU3mKMmH4s~toq z=@|N{4gc;OPgSr_HncgP&hya-3E&9g3)R8xC0Y&`;b_H$o>I=)t zVMLunHeZTrSc+3QHc|r}Fe!+4dFAuA13l{W4ztVD^S!KL7O*6U_nJul z5Kgs;J6|NJ2I_rKcb|V)&KX^Q&Pf`P^K-g>ce6otNoJ~_zt^x@;>NuX{c9>n*3W5| znFzsJ+{O8`l_DtF^8nqL3ZlN!h1wBGBjAx{M2v1)7VesLO%d2JjDyGe1y*s3$EW*K z83j_hBKCoDz4%6dfe91+wY(igCMe!nAVxOdcS!FD7ig;-y;ABaGBF^o?UM~0NS@aI zh_s!19$)0X=Cj>4+iBxbZ>2^Fog8Xj0!sU7uu{f4D!o)mZ@z4SCL;-$)>43NovdH$ zl_Je)G*6yZKcI@|q}r+tzEA)ynctL6?VgP&~tKDl)Zw zkTLSn@^O@>i5bh~E{Xs`y<*2PN6hbwWTgW{_Dc=3`8qXZ*F9_gyjzMB1A}q5z05Z2 z8O!?-`UTQ!^06YtC2Z&5OaBnBFGh5D@_t73tCugeYCQB29WTLL{K{5;}x{fP#wj4$`FvQbP?T1U4cy z0@5Ks0O^Dfr3#^Z3-&(e{h#;pyLvCqmHyV6S!=E_#~kAs&v+(b`nu|Lmsl=QP*Bim zYCJZiprDkYprEn5cmcQqV+kFhpmNwTDve+u{5!=vGQ8!~nUh5k$1tKviA zc71x@StQ)`Deq~M+G58tv;JbcfI#1tM7!yvdG8VSk-x@vcJI@shTA`bdU*bK(Enp55Gw0`p-%0&5$Ki@2G;xC^GQKF zRhFmTsqZ{`dL=Mm$BQ@1k(ipdJbl`;lgZif$8pe3HV3Q-Bm(pJ-((kbi=Fi}L&;b( z$6a%j?6W_=j9N=4H^MT(X?L*$3j39vDOB)&f5H0MufjN?SWcIz|6I6*~i;5O%~3KxM-WY9%jDGKBA{lJo!oPYG#4|rbIqZJ^iZQ$W%{m@_h8f9>OMmMYuwa zD3A{KwHbW%Yt9Z`aI{%sae+!-~RSY<9%x@)vsPuRVvg^mgOcU)z^m2)xrDz1_ z_5WQ;LK6?OxT4mn%lg;lNDRBU!a8Y-k}eNL^5JsrTlJQ_3y3YJ8zX(bz5_$GM|NYN z=pKb%KjtgRjalc;Q&SU0F~nZ+UUg1ahCUYYzI3MByfQvQ9_PcidJf>hc?a3Ey)8zo zOGxD()9Ph`l`f&)_RrSXS9gpGE8 zJC4@6FtXVorQ^K~gXbFwh3W^a2Af}#D{-q+r7wf?x)iB#Ce>MQcJT1YeFc@YN={?{ zxqL1j3_{xJL8EKQ?voOyDLM`h$6s>={g|EZpVNDF7dkWD!lnCpi}x#SCdcrvs`Seq zj}%vKQEIrYTe~VZUPXf>${V&gE@i#)P%SeveSV|3PRdy*v30!&m*eOqSE?dsFxjD} zM0Oc_P;ydd6Mq-dJSw+r_q}man91(zx9+&rn|GhBC&h`yfU}$wbe<fv!%id|t zS&l}RnPy88JzSpNZ#D4BK2H?v7q5uhoAwFn?`q^+!dF*}K3`h&cBM|Qd$m}Wl4kU! zBP=s0Ytfz^T>7dZInsbghmKqZBN^xwnp&huVv#HXE(`Txj&>{Zw}SR1TR$=C((IB( z3P-6slNiexlJA->j%@0G<<<()bF_WQc&C^>52u(C+0rN#bKZ~r=C<5Hy_p4DU4L_( zPv69mXIml!gUG9nn;q}QzjjGeoD^nMm-aDtn~Sj0khX)|v==CW`bv8A6=!}Hu_}7v zIMpUyt`siAAnMC4mdO!~(w+#166`H_Wez=v;gr-rFyV^lBbrF4Eq}FvBe#ult&lyX zKN4bP2T>J^;iBr@%MQ}hP^U`^x_dZQQVL!=^cp=1Nq0o9FBCbGM%JLaJrI zL7X{KUfj_==ReGGEFzaGOt60^J6S&fLe(4}-LSxWkuhy4_fNR%Yn*M#5qX}L*im~r zrjfwP#Yay9#|!Qt(opi1zN%V#bj9x|J9SlEl|@asJePC&e4Lp-nP(tIsp7UwOzy#$ z2^`C^20nOVy*|cba#PgA!K>tcbG3UlxZp;bds!YPcJ>#xR`?p5@}6Ud_&oyIMXtq8 zqLH&kWMg|x`dhMt*8@lTmrm7RP;W)XE{8;O-ZYICoUq1zZdi#Ai(9QD{kdQ15G8xj z8@s0Hgw0=7n*G+b?YQ<5`^ghn-l8~G{Vo*Q|EQOtNvvw-TqxyoB*vP_#-VM-%X5_O zIYzI<9KSNu={E!^?kjMvN=8bB*Y$lgDv6i&dUmwynwuVjRzwsd?uc*bmZVpTG`fu$u~Xy3G~dU_3yZ-9 z!ERvjIvw(`dEn^YHB3nTP`i1{t}JX6({Jb<1b?urRbPH56Wa(UWaZ_6Kuv#ohMk`D z!>H+;J1Bj#6*aeqa86&^*~kVvgFNR&bqO<@CK5IL%@ny-~ZdZJNHe z@Of+6TsPU;m@WNq@L*Cb*RBkrTdVGz>NlL?ng!&^#eI|6%mwLjaDOqPG*Lt;3q(5BG z4u^YiMf*pc4%t4Rl&UYc`&ML!*ow_vF4$PzHY=?0)ZUYl%P+omYYp;s7kg!J%W{8{$*J2C&5=BJ^e%*O`w+yTp1{K|= z>hBZCXHuzaBCGO5O%B9EU4Ay_PNdsnm(dYkVhwDYLZ&HUs05>@nr>j7+4ok6Gg zWZB%!^k+oG&YuJ<2659yeD~mq3-;}>RxRWys1~QbF;fHcY5d_?GOF5BKnDUZ_}Yv_ zIw@$T5=8tS`Yc=Y5A`?clf&(od3NRRdT_?S>7*}br9f|>Pp-OhB>#0cbJ+(c!x>c7 z=AYA(1{l9_G5{CpBqwquJmI?YvVydC01`@Wls=I#h3aqd%k=ni3=fqCa0n4h4P*Y| zNw3EacIOe#&$XxEH+$ap;80KbWy0~~wMrWLX(i+Ht)e_(*F@7|{&JwhI0VJy@t(=c#Sko$k`0Qrx`PAIb0Fh_6wXhLEGKB2HT@;ju4B)O0Q&B%V< zG)R~*-~P%37XLdd)P31sa1|F#Fm}eGTpdm9P0(6|n%~pC_`|PhbecC64-=)M%0qA{ zpI&fSdj0dQnpIdVinC_{J5a;oBUBl5GPX(jnf*J%zc zuOaxW<&htTvB3T4QXH`oRu4RYIznwJ&R95Ckgt7eUmADWw(Wfk_f~`xM#t4Z1)tX-`%8y@?|KRd)2U zrKx~Q5;2-n8o>5M_IOPMG9Ng(=~!5TXtZGs`17`=%!MM^Yl=wwzPamdOT+vKVey-; zaIqAjyd_v2(vh_6yLh&{ObKOyl2gd>ODo3dZK$I$+7M`?bJUyqPvWcc-#s|5WzNf5 zOgWH9eyga-($&Hlze1+B`~mGIWDm5iqdL2^S4O!KnVZjH@2@*f(+Rr{;z-zZ#MI_4 zn@0TdR88jcoiI1UMQ_ul(ecUEHtYnjNHdemjjVy zEn(t8*1$^OvqoocYd?0*)97~DtU@& z@@xxHcVnr6VvhxLZuKF|q9(z`$DLt}X|(Ak`Pz#Kkg%iKwY|S-9Wd+IiHwHd7H->r z%_SS{z#tuq%^zKH+wb=L1ql(gs2MumZB-uFq_Ouv;2Ry50%3xzMk@K)&*+wB-_KN3 z2l1;LteCs`7`CMxo6xNhvF(?3*l{6jo*IdR(Oe-kG-zz>bG>7f3-f?VZ?gO111Lh$ zudMKn69!!7$0s&JD9_$VaxWTs5WsaATXIlgo>IScj}V|?jKya9vI9Uw zpi^+(_vMFB)jh;Se|)Jk_ahw+=hRqPN^fj&@@o+uU_DA0*$}|iY3Gw!Q*f1t()kkZ z_-mr7JhggBwWlPA8^UkBXMpjp+H4}d$Ng3SpzNpSimCbhWtgFQQ`Ftg&wJ}`90wm> z1i8Lt?}OuX>ilgsD<(_nRbi>Ij*^WwsyffN@#3pE*7QL0T=7_-6o5t|T$FosCwG4~ zPVix_<3dZCS-wrLi%iSsJ;bJ@;!4=v7b@c@lqDs9HowQ=3)^xzu25t@$Q@xAc^>20z%l9F3GSRNrZIvJQ`NS%k$W;0jX@bd9h@Sm!} zhdw@shRka%yO|}e#6p}Njis97yM{U*k7|y9hk}n{Va*B2vw}|3?Hfa4ON9pA&dezX*EQGPLY8+L%bnCU3daP=9JjHC^Ay)r^|bpGM&!>G~uiq zQi(h5I9t-Z>{PV`JxcC!I`oq>b9W=X4ausq)4~JV zB8RmLH_c2VAGljAPBmZNRvkZfu~C4kjyowJ%O;z5mY9XCFvJM;DGgP3=N}GoeAUY@ zM#-_-EqrDQrYb@>F?WgYC32bXHN1kd;iR^AOX+skld49|*A+$PaiZ6pwV0P}HCm(O zT&e8;!^w9M!dZN#6I)_sso`ln?-q^u6kQ;YN?4h;+d{+M;tNJLO&#I8>0h*Hv&^4J zyc-&)e1qM{6Ptmn5dUPo*b9ko*f`?J=hs@JRb6&@KJ)lMBR<)=0;@SWC47DRbyIogo>=5 zK?*Kn{%$l8k<3pgqnj_QCdS^T*jx-fj%DHEJ}4#f~e}A zLzWX-qe8?cBb`ewH@MFf!k;MFYOu6*8_7*>y3rpmKSloV&HJk(X+)Ez@u@RJi;<0n z@Z(D^4Lx}W65u>8<~|ku#H8fwF-H~o%T?35BK8?^fHxVoc>KIY*#UbeWA>{{LQycTp zr|a{%oimE}fZC^B*eDSlG;Eqmmi$Vjd;$`5XYe$kV!*C^Y#52&q3{@!)0*t7nfE?m zURDj%%Dvl?i5zz_=Ya^m?tYRNKaQ|9CFM@V32ndYIffbocAU!UA9_z+v#wQ2XEwE8 zoLQTxsQG`HF)AzFu_G@IWbCOrR*^1m#Hb3#_iDIlnD&P>g|BZtmDk$*q3Bu1Rc=~T z9EY}vzXmHCN9pRijq|H&vP+n`P?Xx$9w`73_p0d(+?=?ZHP98P53@5jau0a(%;$kB zBO59#T$aN-$aP`5YxH{ASdgZIlqMJ%lPq)aw;y@kA7hvDS+|SWOaXvSfPFGurA@$n z6Ta%UeSe~v@+P8wjeiY=)Mial>}GXsgmndN2QoBBGn#;FTL?KfkITJ__jWq)8H3Q$ z9etxhTNgyi(q~YiyG8b(wQ1;6;yib!#U|xL#KbYna1+;IFFUF?(3@rg-!Gs&rO=1L zpw{RZ1RXj{;zE6=4z34Gd`LjyRaY{+mQ!j^qV9%gg_;%SqpA=SOo8zF4uA#QOwQyz z%~0Mcxnzm{T65mMVZZ(!w@6R0{YgV7SeVt)~iFoBHYjE>R!rZH0;*IgiUJ zB+4)OmY||2J2zHwe60ox0b?UBBxawqQe!!Oz20-^j9e1i#!ktR<(aK~3?Za88wC{O zPk?{k=~>7jr=)!z=hYL`VpQ|G`Ol^`gvc9AT29N8*(C*Qr_JNJ8Nhs3ryRl~-@q&e z<7M9&ra!C8Aco-q(hMK_K7Oy=45aTUKniS#&SR3mTpV}wbFV5@DcN<8n+G9+KQ#>_ zL*z&m<~0F18U&;=S@`as(P!ZzQx9Cx^(8SEDh*_%5YNG*wBT-a=;EJmzPZA#n%Hh z{F!d~<2P_Txyo`*WpCuMnlH%@!b={EbfM$e-|%a-2sudP*U7ci6Dlrdh7_x=NOfK+ za)=O#=~D$*GTW)wRYIF?BJ-cQ9ai{6urT3OTaTo5w-&ths>1_Pgtx}xFr?OR0c_#{ z=Mbf%yEO(CC&|`0axy(Qju*JtgS`+q7x9s}LONwx9aM_1u_V)$96KqYExuQ~I3>@U z7^jZ;RgX<_Fa-d)G+fA!V@-7|v;3-~9cv#L6tUrI1Jo8~d-?+bY0Eg&-bcSyA3>m? z;JPv$XZsj5Ov@xv6o45CI60&R&D@|YGBU1n76$;Rts=u_54s<+bGKVdM|TR*hq0U6 zm}%TiB}1MIG!7QScv|N;B0Lz`dS6{AsO+!a2<-1db0!Y^U<>(PvY6_!P1{W)@+Ff* z9tC*TZ|Skx%FvE%yDyKe^S@hj{YJcEx;cFCxL^JM7-)oUDwCh!W+iHVIJfQh=W{K) zR|!=~huR-_Z657Oxlrj2bep$7!kfiAQi6c;cVy3Kk7DE;v(OO4{vT@zeKm*If<|Vh zbnSN9zv|AjcpX-B9junfAFt?A39CuCobw={tOU?=Bl&xVMEQB#fX&$7zX|ok92#$p$ zcy`^IX?#j_PI|qeK){^qCHt=}1X^FinM?n=65$RFy+h$%WE1&eEpBRaQt?Q1=vNma zg|Sm=zpF9Iv?zvePtlAdlRw}e;h$|VIFamdVPv#gk{o|Q?JVvaiMuG90`cBudY8Dt zs@5Uo%Qfvbwd=nlJBD@~95x4vCRQmU_v$LGWJQt=lK>&Yo8utdT26Ivm(N76@86^u zly&>dhj$E0H&R=AV@p^{GCK?W_LF5pmNVjZkOi61i(^ zKu?Yon^;%6i^&0nCm@ps~PfF1K{!=6wb0E{1W?2 zHQA~`W%fz3qS~h4QPgz6yv9Itlrt>0KCO@?NqcW3_Wg@Go2rW54T*fDNJt;hxcO&$ z9k|t+G)F7B*Ms@P*nd_)ccd^C#qZUgL1CXvFh6>K@teG;t!jS8^!rzCA2kqensrm3E}KN4au~bo z6AZ-PJKn-(s|h>WdxJRdVxQV&0^W6gAbs=Q&?~Qv< z2a{)IrJzy3KHryYiB~6@KRVoXg{W1Ps|fG956ou^Ton3>iZS2r+OXs*@7$2_OTAn; zpdZXKc>fTdMg44a-sCY5jF<^93)x}jk0Olfm?`v-gT&>%z1-y-K|zng5sjNb-H{d} zH&Y6FhPcLNQ-;1iU5F?ra<`(a6{JTN+C)=g4&=>=rkqsHE6##Z9kfRQTByT<5c-ESNyq3oR5u`pGf+70@xN5t7l<52nbl=qCtuC8-iNDE4~7gnz-Ywhre-fv6R5)f-#nDF^AOBDST+%?fTIV!?3%_;5Q- zgT3h!4Qu}?f6TQjsHTx{*pNaWUEOE%x;dU!3g!M4#;cYDgnZpOV$wbS5161-54@L{LB9Zf#EN)&+b_iC!B zsTGWQn$vJW=rhCqY0aogY`S4)nl#o*)Xco)y@htarj2nAS+gH^2d=sor366E%oqUk z#7=S#~$|J0oZ>U!2}@+3fIBy_ri|;Vly-`hDd2<%_o5Yp944?&u^JX z-2F+ha)Z2n;w6se36tY_J)dFdrD-wM{% z!te^OT@>@Ox0tCb1W1)!YChIwY z|G^yO4sT=4-wP9}F*hcc=rutOWABp736;2Q zB=KAafR$Ix4m#~q%D?V7ml+P+&toJ{y`$cmMf6G)&W8@udf_H6tQWptw zcOXyocs6Yc0a4Hi<4xy`uObU42|oMr%g^Ok5fcwAhP-G5hy_-At5*=W22-x3Q;g7l zgm%D`OH+8FzRd-e4bj#^-PT{-cs23%UGqza5Bl)tgYW{+UI4qCdTqqUko*`bjaY9Z z>FkKRD3AkKoBgx0gyH)>$)j@rbex`3Vmw?*O|F^tGu>Fqzm-=mxoO=_lSiuQ$lcmB zmp%&Cz*{yhWe(qvC@yv-oj(XNuk$$uD$QoG>^G)0SbsGh^22i|_Ew&v6KXWu4%apM zN)bo1LI)FqVeQ;{wdVG#9-M$lp2VZ1vYgyzHHpE&8(=87gsR91e8LX&d25f|*FB#N z*_qBbNaL4aCFM4fVPl>hcsuV`wc7q91D)@0Lf-pssV@Uj1E|v$8wM6fR@zJySkWe% zkNn=yP2QbMF*Sg+bE&8!wzTqWCiVr}9I>A(3GurWgG|zBc@sH*pwkM6rMm>~+7<^D zntbl7rZ-$t6!kmYqI{^jdhSJ?rh?O?hr_y7rhU)^@NaV&ylL|^IeB7s24A$Se1P%} z(_(hrry>jtVKG3w)q=g5zIydh@#+<5i94ax$&9^lV*j0Up(7U`b4{7wglBrH;Qlb zsydx8jr8#wd@mEV4dTDCo5|AuN9+K)F`FCPml|Qp9CaB@#&SYh78n5BaY+S3 z+df&E&Sei%`mFW>NrCnkCCPy?S*K3Ddm(X8Ek#|Nquep&1dwVp(JF+g39P_}Z@Vg* zj!Tu9`i;ORm@;aZoKoFJ7RHrD!g>lYmNx-{-|63suJ&sC_imTRw#{&IQ78L`QIB@` zq6q+Mmi!``%O`Dk2O{1S58zm6asVqy9&A_E^565>*Svnk_5obL+%u1mW3B1!J(YXH!%e%j`q#c$EiZ7NV2WP@FqDZhZNv9uLU&!zs@XKXkAfo~0 z#itM4WO?IJz)rH@Y2F;`{hy9W7+9lPHAfI%#(GM?ziwIEc1ErDf}C}N>lFpoJ*o@` z3+3c`jYU)^sWlYBnX2fA2!_k6C^hYy2e;z{QiJ;*0!kJC^F97~*t}E*aP5#*aoU|? zvse2!#{7mB=K@y;#*E1R3J7Sa${I+Sc;AF><|&xrj#ep!s8&B#b(Cv(J>dEFpJlq> za6`$*@COc=c6{#sYE0hGfQGfhg71jYnUO-b-`Q_8g}!uR`cTeP`>qT=1;Au?V{zc#b58wDqy-ITa(STd7$aAupP9e)r4u1Cr0niXSDN8-<{8ef$ zHs2E6)lii4H|!C2K80$p@z*}3k>53B|EY-P@%@RJc?mK?|8ZP^izL}}P!L`ZrsCh- zlkb_5+KI8s))J*sJGfNpX%=R%C;hM8Cgx2^h#Q3idy%&5)YB!?h%Y2ze}*b-Wum>Y zj-YvnpAP|X@8@uJlZ`huA9}<~jdbjTF>gdVoqXPDFo?-oZ0rY_9=vkyEsNc)l!ch+ zJV7JhT%n2Pcm$i{*UotEUv#~884DT8HD6tP%FuFW$ab{3Z{-DYt;`hqBfUs~WMv!! zmET@`)OL66od$@BQ6M15kDdW z@bvxH*p>EZ>w_I31s}xfh_j07qs{hCAI;3Oi>LF*kKmaR$^r&2^+~rHk0qKKH(FDo zvyJP{59Yq7XEjHUIWCAz6LwBi9aD3F&NLwYTe^fO?#d~%R`hbF> z7*L%60z`&jfd*3+Q<%-fB)dwLJ@e;sW zn9ttAp`ju)`R#pE#lgs@z1E|qP2djuKX>ebo-!4vdHZP@l8#SGDqvgnp6BS4Wemm- zVRMdRh35ZpE#tsz#ZY$k?*LdZKO@@C-_E{cWJd|_MOZSCFW8AgwW{Sxi4R zSJu;Y({8cx`86`uQVbjGS%%UFqL$A=nXenQ2go6C-z|v|uA{YnL_%xTqEpCe&(n9d zwKD`_J9XnShexq=iv+LCmC!Sx=o(k+!0W8E*>SrTmEiuCKZ;ebdC{!dB$Ysu>AF39 zonTcTLIlv_$<+79;a|9Z)gjUtidU|QtGQ!N>|@AFJQvwyd!03GvclI9?w?2L1u z2843prD22R$2|+H0xwUX0l}Vq7@7K|#&pL?FHi8jSM5n-RGsa23xO0P9OHwp8zimF z2UmAQmJlr@&!viatHC(g@bK4QlqoQ2K;QVQs|JD!m``%I(R35ME$R{JB|o(qo*}K; z-!i0@$!faG>Kb@!Lf2c0aGb@r!j!3GR!GArKrL=N%|0b-rR%o%mJpKDrsi)GVc&6> zUP;`!#)k3Rqw8z=wQ0FlW7^7IO)4>Gng^lzZ^_tykOl#^-PY!ndHMXo@AsDT{tzC} zP!3Tp@ZwFSTCo++@c}wM8HuzGK*~v@IMLJwQL{gCB2g_zV}{e8)*OOb4i?L+cACS{ z8|f$Z)(D|SCia}#We61q=CvIS*@14l{favP9=Cj2X5 zmRn{A=H0w;_-q9X;G%HGkbmI(r}^Lak6CV{a@p)-serm0``=C z_NqKBef7X_<6A3FlbAdHWOm4WNYHn}e2aA zhIkFQA4!I;zlxXeKb?L(Wha8^`Aui?ww&vMOk>?7;xAwi*m1SaohobbTEBPMl}6ux z8%{w`Ewau`uP4y}?vf$nYh7VO0LQHw+nl@`L5?Q>Uig_*iTx-?;&O!+JN!&e4Ol*c zGCTe0vbU^Xi7Uj20eoe)JglIuIXmEZONmrhZmBo9aN#&-`Ds}R*`zl0^phs)igh;o z)Pl&T;JspD)uc9{V(lH+s->zVtvS=eKP zwe>w6Ct{JnC$l?2ik;n&&b1ID1r7lC6waWP;?l_&M!)g|xJJ$dZAWncK; zL!Roqia$vI=->Yps5gCk*HYT}FI4f%@SFQvS<6c56^&V_q5%q5@g&@z-Jv>gG3D#1F-JL_qA{w}YU zeOF@>UJ-UKpc^jtuEtnPB_O4K=*v=wY)Q=)>a-=XyAS5=%0BtqD$Zdz@d?dMh-kib zhwwLIgB3TZ zm(%4yeh92FDZwMsngd#OiK5t|8^8y`c0V>LRJkNv*+88wYR30i-~Ri+Gqnv zQDy-*r}-+`6A4jcj|3X3iSizWXt${w(A273FvoO*tLoA1`o%=!3Y)u{QJ zianubL2U(4R)uR9@|K942QoNN?Wm_9_7vF==gP;_l?D3+g@#;H&Fz_4az`^a08wZ7 zVR->(vB;I<^4W<#p8TcT8%;mo-=hO2O}gLua_R$@yYrRu7Xq;Vns0<59RnN>Dn;}P z8@<)JY<(kIHgRVv)^lRV%_(8ETH#3G)L5#1ATR#LZD5_ z;VYP?KT^?*x(s-W--T;z=A%u2)E20ofd&B-@>@N$6Fjs6y*_(t!{1qZt9509@U;NnD+ALHO()$ztMz!;+F3%R%~g~+iXl|_1XL~ zZwBff0M0=?%?Lt-yz(w!P9FL4cz4fl%9fYZ+%iJO{4>MrI&R}>cNmdbKa&85RPI*} z&Wn)a&6QQFX%PS#QTj&Ib=6&J@>}aHuE#$w^s+d#9ha{y&5*NG~JNe)0<4(u;KS;bZ^psyo&uHtMte#r*D`uyNwVeM(UNpYX=g|8ow zfdJigU3-}J>y8Qj2&0j-%Ug!CK-755yf;R#U>HzDp~A;K-%Yn1H6K8v7Kmu6f3e`| zNLZl=a0qGUbkeOuERonQ5PE9FL!7!5Gf!E@cH?nZ|mRH$oFH zg7o4gfq7BC;(YZdbx`=UH`jQ{X-9Vu^y zakV);>fmvy55|n8?W3hEb_cM4Yw$ck_=zLIZ~>Y88_O2>+d%}BD?G`Bx@C7y;)zDF zMWow7eY6oat3{ZE0+0&e9j8b+0%)#-{%(7p4Rjn51X?SPN221YOhYrjtF)FmUVV%G z7>HdrlXR~`yi>zh47GP(dkeBS{#ia#8(AZ?il}`Vv^cO9AbbgE`-JGqvfAkug@PG01CEx5*32L zco@@vR}v``a6BjCT(j$O9yC=3;8Q$Frnl~t*x`N5xO1SJ6 z99una0ms*89QJ~*1z^AJA7S3fBouUZ=)ajA=!a0r{M zT0Vt)HUcs=x^v>n%VqJEXK5P;Fgl&yV|p=77elYttdvv-v)17n|MHi<6TkS5{M8-& zSdI1KY6;RYO3?C;^;Qa=WL7@f-v^3rR>rL^f8QZDXe3BpOu1T^$&T*3WLrB^V=kqi z=vS+df8%sRktXZSs1Yl-#t}CGt(fYH3{>pc(G~x6lrr?%6{!Y(mTC2e4Z$$@#T6L` z8u~k1hjLr%w3yZ5VKw#)mzm!xBAV8PS2IH(sDsI}ttSNDUAB^5avmu7j2Ev4^2qgx zT`@+s;>tPxLhAt@J^w{uF@NAS+-{vp%1UgmET4kQViWWm|52umfx?(F$=-@B?Odkg z`jkxx6!Oho9=CdDiiDeQBOF=B9pVM=l5F#y<(4k+QWhs|;tR_XK_12sy&&iUcFA~G2`q1d#) zm;{tipt&`;ip7ECqdtecO_QCvNr#}iVbJ?>O*99Wq_lp^6E--G%DxxW-W=)wd)3NE$fJ^zCbC9kYVe) z1N;w-JBXHF{HqRtQvn4V$8!Y-GuQ_xm347tTrI!09^5UPCj_8A>ZPWN`XT^wrQE!w z7q4WK5#;FN32+ilo!&q)Yz59_B;NUb!|-1DYU1~6Wk&ckRfnF8pu9=E_L{Y^&c>kZ z(^HC#e1->r3IFez=>Ijr{~s^7@vB)0;<@M}`y!Vvnqm@KtUUW^gYPNM; zPK@l7B@=m*Pc-eKUJEMl*KaXqO9}mRPBipT|bXCXz z+4_EW91VBV&pvJ)I3G$Kf)=favwOZ_{`T~@uSfN@3&yqYn~@YdDg8IRKQVRYkO9K? zJTJhV1EsI5T9&)1+u#q+kh}|*Y5h0{v)`(x1LbfOaH<>bW+OP88$7D_)r=qkCNm!A5H0Z-q}E;U(1mHk=OD^kIp+)gT@p%Eo?~+5HXt z<=I?i6JCCUQnRnN$JoN(57?GZL#UvS;&O zSYZ-QSsV(AG0nCU=psK4t~wO zeQvrVvn!fX{o(l-&c)2g)2kE`k2nWmhhfedZr9xw?n`K$Jt9%%eqoe~0Vhp#20aO$ z3*S7u`a?Th0VW^r#Vg|>vrzG-wM$%dPgnlzDQTLO%Uq$Hg!a!GYQa2tM-1ze-ofTe znOu&a3QmaInxyz1<+`uy#=;hM0FOTgdf#n$82QHj2;D^(SEwTkusTq(q}K2)~YOeY0O&p5@@vD(Un0& z!VUj<1pDTAn+^oirk{QI<1UZyal;_IHN~03t-0&5tken*ZK0yzDfO(^Ug> zVQ2PHTr(uSJ^P4H><*7_ME&JBKdB3dG6kaeob^s|A_WC5^`$B6j1SO-kz<$sbC>k^ zpW&Hzl52m%3ISKL=?|d41Z=ldc<$K`e)L_(Zj9U*!pYPz0^I@+-xfwp0wqQ9dQ(K< z1u)c8{oei(+394Y1;z}F-@Y8~0Lz#R1DJ~kFS>4#D9^nXs<-W#njI*F(%_F)IxRcl zK}?5h@Dq_gLrTX%VcY1QqC=jDF{%Xq{@+VseLkyinOirR@U$qG6O~`snPaVAp)LE_ ztz$}uR=;+smG*l6nqKX;gEEXZSJ|ZOGboXg&b`*n`8e9qkojevkq!8p46iM}txD*f z)2CaGPG_5{v$XkjAZJ0tRq=9%+)6q=Xz_nzC+=`;7M*N2mLnI1 z@qJR!|Mnp8SYuhUa$IT0{vnFqs zXq(~Fz^LJ5*Ri6J4T}n)KRcYqAXoOGS35^altu;pdrR-ESrz{@)Ny)qIPd@5YsKwA zg2(XqIUOS^fQf85oIJTPRYf z_x~hT;=|5SOv8pJ7=!t+GnbCnNGHIlBu74~`b$eSiazX+xg7PUaAL>_u?&2(<o)yXeg8hwTiN-R z@~Sm}G;fCo%4oPz^7PkF$=#>;Bv+Kssn>Ft$7Huj6`{RfEq%+4%l^>p4 z-~;1-mN})0q8$sEyiRtM4oR~Zy}+yT$J-^X+moE-lAlxEJ9%oGWdgVSTlC^%P)7^B zOwELXzOCKqru}}u#bUubtz2uL#**uRQ~^5u`p@H|9q7!0JVrJ$huaspArK@QgXW5# zA31+nFDPrF$%0mLeY{T|u>4vJrv&~qLu)!R!*hOKXCMD@ zt$mxD*`XSo7jR0s%;3rFKie^x`M`9j+5IBnkAUe6Xz)wLKB@AXUYcEFO=EnmoAwG` zv6R${7mF_qazabTh&dmx!{Zi@H$lgrrNYBSmebsb&d8Q{Z`W5FNh*m4@QTj;aLqad z@bx0CT&|dtOz9|~v3Q0soAK0~#DCwY&ZaOf#|13J-B*XIpbu5U->vs)flil&SZ{hW z^Rc`kmO3@9TK-R$qw9e!d8sq#!`-a}y&ytTST(HELao4Piv`l*J+L?wqN>+yto7Cz zw@I+n0wbs}*z6$WsCGv(QeDUPCdi-X+1`O&t@lkneRjQj%jXTq=h4v`a%z{MPp7s36-nR|{d`GMj~AivghDIE-D==ZF> zL}~Lcag?Db)2&fO#L2wHa9WCY-5Wo5kd&rvM)ojjBO0rliirHjj`|hGS+dQ(fj@Re(uNP{tNE= z_TxFunb-ANuGjN=KCkO_LgApNDuS{!Tt0axWA0WYyj%R>i>lbbQ#FkQ=+dKTNIk;% z47OQK(XCHvm~HG(=;t5qv7;nCfzDqo1CRYKQ%9G7`sUDyDSNHSXN_B?%Z=8fmerRN zMlIsA{q4LDBk=cbQNN*;T;BRldNJ~oQK3q%!hN8@fht^}hC^Re4*ipCt&IP;oj)jqC6*?pVmdavUfZ+GgHt&^T^N z9LO|y7HwChcqd8zOs|paB&sYU{-`>N%Ee1LX{T!1*|hlG!#wfnST(tp1c#-})^%jx zb$(grq+!_pRy#UGekL>y#eTST2Cc}e_tmB|s)Ev2chP6*iP*~Wb?zjBtnHdU{v6<# z#xt?y?qWR~U_D>w&4Lwnj*Zx1Hkin93JP|S{wkzhCeiOwwUJjq*>p$_Y^rK90)H57 z`E_V9Yjm}3;nmUAS}{86m;3(}g*vBXywNNw%ogh+y>@7HXr zm;}aL^G`_;xYyg08a|xW8aj|B;9P;oCNcPC#ccgF-djhd%*6mWF2HTNL#)Os>TsWU zEb=0;A^DWm7ecq>80lKVE5o&21G^;UHaX99SneY+O(PLVVwckGh(P6tG6i9L=g$W z&zEy|1i2zlp1cLyS&{vVQ1nU=i(6j0E=Y`@)kfq3wPbXad&gBc35uTMA2NaM zS|2E#lSg^_%ZPCn2)K_=N1&|w8iAqyvqg7P(R;Hs(<7bAYVxjafa7RZp7j z5N>;?*Fg*Pb9uS9gXu>51^`Cf7sb$rqdthTh!l@S|H}N25KB!ET5Z^ydA|MOf#M2e zg;~{fdnQ{s&~S!L@yH2^(?Nc!WnBy{HB^5e2Yq%S&QkNU6tLAid7qwi;F zEmTdY5V*;qKl`UR+OMcKVrTPvV_cGghM$s@xDBr~?at~qZgz))T)50h`+6Z6Ea|3cYhFiibiR-RQ&p z?8rOPuP$vPKTCEML|x?CSL1$7!i=dv8gR-=$)|&s3v^~@c0aB+bl-e18>`cC)ldMa z2zif8i2N|Ubqp3uz9^J_Jz$jK<6;e#X8oB_1zP5S?9A~MoQDdJ;6h71|UEydWqSD&AG~qG$ zN85YZ1=+P)>Mr-bAZ^tK_4J}Ymgz49HP(JRl^8V(FNYjq&jWMp>rHtG?%sg1$a z+zV5EY80{m_~sAXyF-gl7V{b4%Uf5CTcmqpoJ}>q_l7rL)Z?S3sA^x+igP2oCx9sK z+F6=TI#1Ev*=%I*g)n8{G?EPUOJFl0U3W$EBEE++V%|P7HCwJSq}`dgNMG(AGNWS$ zhu)6fc~r?Wj1H2EgZUue#~+PelJRIpF(S5pzl)TqPa|}R|FHepUNcKNYOoyI(`M0n^IcKFf)ewTZX88002ATe-J+UABLuS)_Vz zb8LBE?PK)Xs`X9=2c4}13v!hf;Sb`a$1aFwe*%j=3P&e3?^IrONZM<5-~DLWl6Ms| zH&{B2EgR3W7+F7i1f{Tq1KCa_oY0*Asrx#XuT&2vl9V4D0NA2G&{4q${zc4PE1SS1*d@Nvz9x=GU;&Qqg&L z5~p=Xz4!Fc7xPA=rRvj2*K8_lY@##B9fDtZ^4!)bj}f_)9I;>8 zGd7|eF#NW0<;<{<#XqB@#zx|@vIHI%gE()!yY!E&X2%mi$NF|dF4^joQhpytS?QTMV%;}K z?XID7g+h}wO!BlY>Qz5}AC*^`zv`c?>pzJgqC>xoRvj?{A|A(4b5iHBf8#%f2*_#= zx42x+&v-O&x<%N|dpxGS-PQ^4D>+&34Na6N^N-JOr!$e%q%LW@>_dALjI?!q^uhwx z?Bq;b*xzyeb*E2%7N+N{M&06jVU;o@@Q9+D;qoK?nTRB_H6bvHnTld4vbHnNJkYC6 zS0dOUZgeW9>tP>?_vIoXXzVbq>gYwO@OIxgjnj9r-tkp2G)aF-CM?HnHWI5c>>cvw z^|@V?unT6xgV007DE(Vx_3+BO{jyyn1gB zkV@hS2V$A(s>6k0KUc;5VpdJ`ahn(fx&n;{qIseM=@GOx;du9>1nLgL9DT9H>#6#8 zb*51(O#hWb=yU?(HS`g{HNg93#rLufP^lK{ca9gmbF#0?YCjqi$sgAQ&I6M&Ub@5c zYU@|w81zR1e_h8lVE-%Qt|eXdIKLzwS;4^t#ATd9>7*+h%SBfK4LU){iElcF0tSi2 zC7fRn7C2NpIR2PfeX#KPM|n{G-<6cmg4@f}jeRWFQ?^Vp=B8crDBEm(I17~EwEMw| zd~{VkDmQg_uRm>ge(Js}8Kjzw3_q2V1Cr=IXp!;ioOeFf>*BdRktAyu_E9}URvZq^w(U@-V+R17 z_lco&6)6&Y&#!BR(YwkaX;D$^91PeaW6bXIy@xJuX?1j5ee~+)NQDYAOZOf=^PGbq z4eK-1ltxh`Hx(z&Ux$DrQh0;j*+`mq^%C;S90b5!$4Yu$vHjxKaq_|HerA&9lx zzbkB_V*(=3a{z<1^8GTl`ET&-#lSn2bb+FqIVW0^y2aY#`>`&fPg7?Zsbsl8SMvCI z@jGK{tlcRN>bth=^kR#o!VG`8sM5_B4!XWY3yP2ULUHpC9nLYhuVbJl`clTl(+?NM zCbJa}A&A(f4-gADdbrcKEW(Cec;y=l{jp8^?`mEZ$h`m)@1vJRHaUa;gJo%Ap^h1_ zB==cxq@w{Z^3(oWFo@^-jC8qqu$(~IG!PqbIpXgB8yFGl_-X*>k!L%~*%L0QWL577 z3W2C!vj(FVG9&!pyaxJof8O;(i#0Lyd&N* zo2hzGni#F`buLRcY3CZUPG99LFh6HsawCfHnL46yJ&TT?U$+0#vxeZIjfJttrh7$+ zaz(6H7Dq7l2;0IEv(bsQfFDJ+x>jMW5%4yIe*(rwVy;1uf{{&7vaPB!^5@^2D zD8gNE-z#U~8nhaUuPqpQtIXq)5!gNP&d%fA;#1lRlhGfe!ih0acUEfhz7Q_ZcK~VU z9$T<`g(WIL470pi18D!sd}}x>etMtHfKoOmK}5dqw4wjSKgbGif&5xg1-DIZ9nC^ za%baHd$rk!$v>{+>iJ7_soAo}QMveb*KcG1k_EMpFjriFb?SH79q-!J^M#u3%uK&H zX4gNZ74|r7Va0{#PC3M9DC?GkeFPJaJAFpkixEHIv`||1uXV0Vb{EBJh z*B;#{$;H2D7)Wsl9)0Y-7Kw?xL#7aR+yu4g6HAY1DG*tIi8O$|Rbk{>NxDp-`ADY2 zh=B5KiFaA_$CoavAHBJusS|dF8sd`pa39)H)sf4WUQt*}Dje#LczTY7Uvy%>{|C!d zPI+)b7p|yoA6eTe{ALXxSnzjjE7og`H*?MWl==%)xL*%ll~khTkh-1=^&9{B*R?#p z$o2CufLJpRq`xXFmER=j{_Ic}dv^YYL)Pi!q=C#CMvjH;2%p*2;XS&^2qbsUbP}V_ z8sI)GDus1@2tYRbKWXCN}A?^0gY5SpMwG^REsq>DBvJFHk!_W4Z1{-SzN@ zYUJMHxbdcTD!Bb^8VC2d=T-n{ajjhbeYx@Q5>Fy%Mj>9#*;a$iwYD>vsJ-IlxQ8jZ zwyF8@t4GHZgWPOx_;%5xZD`IhkJNneJIYk!8~>8kEy-|VVVTZP!7~)v9gT}CTT$!| zh0iZXk;Na3_M#7X^%Tkt*$1T8Da{3)y05X0A^NQHOB!)d)~N#$gs*k_ahM`seNQG? zJz@q_0n1-yCCtNzi>u6qnLEI7;rBJtPpJ7|AobI0XHiMw5`}zoz@%LPY=Mmdl5@N; zR>}<&)XcfFwBO7sbFdWz3JUuG_0CO@mO^_JBlBmS1iZyJS*f@n%nk(Py(H~(DYSyL zPNWG-i;#Cv&*5C)WRubs6O`Y0dJ9|-s1*VJmY;|h{3~>X^F^@FB;7u_Udq?>L%MJo zppXHX1rEq8&enhBz@bDlENbU2E))U+N_El!K@Y`za-O)ai{n<^xXHcYc|fc=Sn|1{ z)O?~U4aJ)2THEbDv2RReJ^9B}V=Xuz&wtB9PybsUI^#hWg09Og1y7=w&ygGByV4Kn zOD2aQKo3SvWW1U65G3c@4-v*=s0G%&!1(K-B2J ziT;!t&jKHEV*xsbrLOfR`C;Fmx6Pi3UzerjaQkJsdi})yRHhKAzha>zA%`;CO_1;8 zXC84mY_*w;d|Y~BFPXEdB`97+K5w2P^>))2uYI1`ro>i2O=AYOt2#i=iE|eeI(f>9 zMU}^MjzX+c*&8?~_3iPg0~#d_?%AY*le>*t=W}26HpkrvBnzgMuB)%RpIW#Hik#dO zZ3+*$3N`vT0TkL3x@%jg8&o2Q>aWT7?pwSpaGPV=LTUk7!2E+m-v+Ef&GA*hW=3A9xg!Ob9l}a zozeS(?#E!2esvG{RdO3B@~n1q*6X!S0jDny&0hJdS39T6?<`#68gkXN|Mgk?L|GLj z=Q~o|hrhg)-Kiv%kY#p{lb8kr^ooxtqWtwact7Fw+K*y9^-04m#RM5ZNY)0S*phYb zDxfSty0it4^2d9H1I2-|HL+`{E+-S)nYZa}NC!(gcYn5zhqx_CM zxJ@{9=l=Hu0b@4Y=W({v4eF>Hm&uCcHS#nd`RuG5+J!819+Oh+$B54bqT|0dUdCEV ziUtSUQ27P>`UU%4yFx{K4fH#F=^$$fbmPj|*4nm}T7K(K30?vvo^j|jTl};(e8I_M zbs;pr+C=dlZ)Cm#tg5QW_Sfuab|>ZM6c3?o?FB?XI2Ze(D-*9Ok3$P|#Z3TvMK|4;ufcftGa4^K<{s6%xFvz{l;a%=Qn zQmhoXd_1xBDH)Z#VI6|`j1Aj=I~IZBS)2vFfdLeX9-fumu=KLael^*bVI^FY#d`j- z>@D2pOwa4%_tEvKKeC6XkwOzrsFK?`1(?&5D^k=2(BT z)@mN}R>FRbu6UEQXX?Fzx#GTaRN>ZUT}1xk#{Ef^y2zINBHIut1qln09cvDdR9kkJ z=Vy0@*-js>!>!+osH(v8v^Glmc9bpqVIZ?EyWt%fRDzAk*q-iEP0HbtToFxM$*Kw! z**&C6GucnsV=yu_7F}K}5YO-wPr=>sh{7#v&Jv&f*%TU!PVcYo45zs;7N;24*S2mK zbz0B)PG%)0p5~NU{_W;6cezM_e(506m+VDy)J}8VJh)N}$!fe0y+&w#)6(g0 z5`8ltYqM>=_&|w0BbveL^w`tpV5_RYLYNP209W*c$d zOnUQ!>1Zi{Nz8q=f<|G}(+28)Am_4aeJwis&qqw&;7=*N!>u9vAbKeikPG)&Y`><& z@xt$p2gj63{yuvSq)}<0S|NtrXMO{QcM#&gk+bDtqr^_l6|uF%S)gAnFY7(=&~kZy z`N5dClAq6Ews4L3wM-+V<>*I;$!zLj(_yw6ul*xJ_qarT0<0(iU6SD<(#B@LH0pZG zh^;A^FO!CAS|M)kD0OqB1>`*Ue8%hhSdleI5ht-jvKg%Mmq`X?jd-fQT&+LKw}_oiltwds;*b#X>@3H_rgdZ*3yB|V{ePt>dd*AqEarEu zNAW|Qhh2BNnMg4t<7a=gmvDsyQr7ys`PUS^IIF%%4#_reL1#R&NCW1a3AK!u{n1Rrs^y&;#$*cfC`CZxFv|iL-;h z>a~kF*Hd>c9haq~XYWE9_Dt2>S<(cFybOz~)V@3K*l2^mx!)nKUeyD1!9=^c&Dk1O9CmzmqS@%i_ zwdLm=^^kFm@O~sCj~Qw)vICLda|j5f;)1KZI?KP zhy!geSKVia7E5MvzTjUU*o!BDacY-~e%sjku~-g8@>t%gEybp?U-9U4ImtJh<|Ewh zuY05xY<^Q&ZCk9cQfQ}R>Cd2QjgztUh0(yQ!BHrRL(0lF3{+-{6wiqa3C|T8kUYql z$4KtRe3>h!4xselmZYomy4NNxk=hMwPmkCR4NI?k z`aY)i5xUxa`1LN`BslDcNzt>AB@yJ~ zew)-ZkH5tN59hR>lV9QK`;u!P{`MB63@ACg;2HhA_Dt!$LHXcG;Wi*6qRDbvMOg4BP+GFJhv z=;~Mz*qjtD3`f~*jSUX0cOy(!4z3Q181JAmJr3jycfQ>qbZ@#~@jYYoj4odNAX7Q{ zZh7fIbI>41K!$Bc)H?`@1F)0=7;k$^V+tgtd+H`%@uW+FS6cH^dUx$=_x2T>c*mT5 z%TLHf%Z`ugN$|Ia8v^La82UsP^JdLc=BFs0UL!o&02Ztjo0oH?gmoi+NOP_VzU6tx zrPiDZ$D!qx8h=J>v~+$Gm0&haD_e+OFJBu-nwwP#PYw;Z8~`kV6xCwN7LB4B1zqCX zvHE!M3RKtjHF4upKzxF*x1-vv8*`geu5><+OE2VrYR#Q+kYL=lB#U2V%Q9SbF$E`n z3m#4t?y?M2SoC(!jwN#zBNK(*{*>w+Ck5R}Ni(7=C&xuM7%77qptq&M@Y1u^Tav?9 z@`^(*8B|SQ%fraD4UJ!wo52?qfv0Wd7dvl8+JKy|GugA`e_br5e^(1NJEI7?sXJWV zRfk)Dh?RF=7{TpTg*6N)n+z8#zRWfTEv=JHQ$`L}w2YKpr={k4su*W>ilOIxdXDYD zQf7QgHBw(FC)n?NhvY}=r6ro`x-1tqhX@&~q2KVsCq$LxU<_;3==CwUF!nC(Jc~l5 zVtW}l1Qf_QVW}Hx8`M^=OGd1|3s(rcyh91SP)kPtQ`gjg0NoyM$wZ;`LCaAtp zLeIFg_RdJ~LsltR73#su4UFu}usok(>gTt0k&VDYykp92jb=wm7}FXf%bQ?bV?SXU zHu)NQ;z%qDpJ`nhwu}A_i)~pg@}*mWW?keK+09%A4x)*#N~*3!OI@#eCt%>(VC*y1 zSzSwav((LYtHcHwQ&Hl*W%9Gd*x(xmH8bc`%V?PKg{WKTbPM_t;`+Spv7y4S(<4Kn z#jk$Jo`yUpNZ~wX%Q5gt4wC{Qc7=&1oCtg5NAvY=w#QS+>SDHiRd44L)+`d*#tZoY zf?~2W=e;*L*j$9BH!HzFPtw zj(@pRp^B`oz!r43$ea8o569qCb=dFB;a4ND7q>)u^YjHza|1(he*-`vS|tu!IQJrU zp+F8BP_k;rbM1UPOqpqUUi z-%HR8n;*F8<`}_NWy?v6i)W~OJIqk_Du9Y1{^bC8+&Ry)2TTdfg*8}q6he%Ws$w`S-9P_oFE$< zt}VJ>U`Zd2FeFZW8_k%t@j(O4r?{z9w;n;72+On{E-aBTSFV0gQ6eSh;vxI3jp@i8 zv#?sbSH9$z<)RYzL>yuQtcC0Df4kiJ!87E5DE<`yFreJig|HVPW>gFvzTMl8r3^f` z>gti;*+ClF`PmoG>aMOl|5QAg9XS4U%YvwjxRImfmOXe=E6f~m*d8%C+!8Ws{J5HZ zFd?|y5C$>*w&u9xCbWtOX6=S`F^x*6k6Mg$75<7d3SFG}e*YyT({d)H`f-q@^j8FV zEodrGh5LLe%D=ilgYl+Y86xcy>12PCwK>GPj=TUI8`o|>2wfI?7LI$wM1Sch#4f^r{jkm5_|K@biHUNd+K@QsZ zKnM&jHgMj5D*XUoUv7Ot$nz#CR}YTZw#c-FG?JTWZM)gzQK z6d%`fO909Qjc7+fd4oIVy2m8SPayo>3ts!VVKY}yE9yYQO)54kl~>VS+^KUtdi8^1 z35>~g_Pi?_s}u;pn+8QD{a-7?bjt5P7-L{_QvG*Bc_zOTQB*OM-}gPH3ZJ81!nJhX z_aSz<^U8&=?8Q=8WLj55hex}nPzb$jV^RnB#3(bidKl8Bqgk|(Q)_KvAh#YV^}Xrw z@>jDI?9le0t6=Y{_iF8Ayqs6;NYcl~TIBC@vZZP^&d*mLh~zEs=(U=)*em@p3a$FR zgWY+z;Ievmg3Q)YXx8?h;ad3~yb%?@ksLZY^pnV3x!R={ZIzuJT02@^2AFd$erMwl z_v?f8&WxBRhEu|@`#-?IIX`^38)DP($pOMDVlo}3GgsAwig{QX+q5l%XU*?HC_BxF z&_%4`+;6W!F9v+MXg{}emiq0^_61J+CsAEZ_=NFJqgMW5s)P>1QsTnM>zfysS);?e zOcJOkc(4aRZkbLoN40+lj;NbS8FT~JBP!nGaO7I5^t`dN5Wpd-55hUKhNw@ny|o3l zDT9o0;-(S{z1Kol+#v&~8BE0%qSR1K9xgwPd1Q-1Rq7SZI5z)j8i!s<=y)BWS{{Gt z>1nQ~CK1pZd`7< z@w0QX%5=_E+mSW^K!EGC6E}{1I zHXk`+z5UH0CB<9CK%-HC9P{~ZWXchKyj;PQ;u4IUA-?6M&YZC}9iGae;Hrqs`&WjS zXyQ=EV=wwF?aoyeDe2jLJ8@ZphDuh6hV7!F2ESpUwGMg>HZ2{GL1Va0RW0kft2?l0 z8_FO6q%G~VG9gsKkmacm#in& zMsbCvVYxg?Aj2txxiVIuGg&mPSOc1?=4S-(>wy`wOva&>@ORa9HelB#jl#;ULCd&G zl4m^`vHSl1zk$JWh(GF!@Mb;S&BmTq+}qo(kI@@rIhb_x;o*ijomR~4JPXHNgkl#)wDNE_C_>{``DB-is=2UwT3r} zC-pqF)^K>qIY<$VgdLqtjRHCRf+t5iX5?pBX95A zGumP~$=y32pYTws=omZ9(|hqDRsFz9ti?4&;Am8#`>X#sG{pPHI@xM9Eb*?*cBP7MRVgCe*`+m<2 zI&AAIW3}V22%%IpVS#l&x;X)GWxH{_ zrk9N1{>Ohcl+>$Mt}#9&Yzo{5px+KklK9rY^ilIyKkU%>y`uCzimChqn{<1}1xNpO2 zvLFTYSTUG2D8jd4-QQ>6*LM;pc|!w^7yF>kr9j2dqN8{G8{S90MA3a&Jd`iochbjG z2JR1ibJ9&^QUXg;#btk#T==HcTk^1-P2sh{)3$4M|};_Vb}j&iaXp5 zfz-&HC_WTr_vI1GPJO|?lTpB#nvhrI|Gf{Lkd9fsU~lBOyp7($Um;(k==XyZp)re2 zeK)o#TNr(uGl?@N*HdG2kYz`QJ(Z8Sceho`9Npc57x@4ot5?d(2-Dm&+TCAj5q{~UctoVKUxg0 z2R=-<$&;?qRciv3ze2DaVZCL*emGrpEOO;p&`&}Wbc(WG0eDAu z{S~9j;w3Ichn@qQ*^LgQ4iIrm>@J#}v&*3U=HOM!;rZ|~*{l(>1xGtD@=eMKVmhN_f zcF%!AQT6gwHD)S?D{soJLOc)KuqM!48U~MgPML>wTI{2`1O@fYSfabsc3#x1NjowJ z*JYiX_8~vY7raoqSL`%RG(Cp@fDI?s)1?apro1=r7(U~*&p>Pb#~=z8+Y-d_S3qbAjWMssNIpz0;Z6(4Zj8ii0z`jLc>m6^&$ovqn>as5n|KwM8s|YRjZSmL zJcUGyS$VDOlo;6Dh*Y~v*`kIVxn$%?lqufCd#!HTUwvbk2mm!pFJ9u|x>)TJhLXb9 zx%ltQJZFd;-+tBLuyfcFe_Z&sSWD{pO2yFA`Xit`hRI(08bYl$W4qFH#a9W0sF=M` zw=|L&rx(|?p(owgygSurR|9MypGE)eP-((fc?WUnWw9IyFOS6a! z;bh{z8>+D%ZX4Xx{V+z0gpM`k3&*&)%aZZB|yfp*)0>7uAWV#RMYNOi5+-y&g(S1j&wL^ zN78g;mIYQM?(49rkMKxL(~-UqGRKlgM=fINxgLkREQ&aFduz`DUm0-Yl^eJ#l8|V3 z+`uXEJxPXv_b!|C{EnxvUR}?8y^7zdAa(f5En|=iPitjB7IcA5XlGleV#DNpG0aG< zMjrV&!({k+%0YmuLMUbd^$zk=i`jc)ndql@JnaLIVC%WXPc5@El3}#s+kkf*D1PZ$ zlyw<`Z8`4L_nJ4bp$DcBWn#3Y(2wqrk3 zmAbu2qZuiCGpTO($*8$jcKL<>ktzOiWlm+1tb4djxUgYenurvdlvN=jRdzd{`(>2P zMy7E~VLd?nddyC5&eTrgWh<}mk-NS9oUDm{*&zIrXQ@k=3sdo=_JSh~7p>cf2XxyS z5|YV&cjXmr`2XI(VM%$s#p}yAl?|?3J|L}Y~WCzA7E_# z8mId~7|MEM)C7Dge9W7ajVlP#P&ksqZ8xXA9^Ua9FJOk#e=lQLssOoi(_)i@Ee+L) zTvFdw)_LTe#_se~L1*m~)ekCGeRiu~uhue;L*Pq|O>1T4QdNlNa0~t;vel~evgRGe zD=3R~O;tyovBhXp zNeN}TuS0Uc(qi~`X_Z@fSl4y0&02SVPswHP;h^6cv0=Ssa*5M!VQX)^OU7pC(t&%L zuaa6fX!S_iCA|3ueJ%%|eAe*oj{^ojz*S2gRMu4`UWE=%VxRu?`lz@O%d1P&g3 zdE5L@yU3&{-;WxpOBs$Rxv6jYQbK&h>5}wR)uYDF87+G)OXF~BRC(mHWVjGz&;Z81 zL5})PLdP3k4Wzvlr#476`|Ir-7Qp}9_|lr)4`>G(mD|zTotxIr-dIe}If2QGNA5q1 zC+q2=#oVlQ^Jq$bamlRt=DMJ%MW+DGg^+#cjy4Z9^DkX zfsd^GFbhV{wH`fp^aIv|VIY#jrrfa0n018qXI2tn4B6ulOE!H`p{f?yJ1 z?#W`{Su!GE+BKS_wXqlH!(cIrlZ!LgtcWOkJ7`eU%#AiEf@X}&ie{eXvTYUYvk={| zHqzMk5tVj&1Zke)L~H+-Nuw3pJ!8z%KZ_9NM>w+6`>&DVkoNT4b&|?l`JTML`Y<$% zfn82OI@a7sxn)bF7JdsLIoYYkJP(eL;~q=Z3CQh*TdvJP9389(kcX66kyBsns7Y9+ zZqDT zR+4#aFe)V+bE#VWLvj(^BzF-z1y;;|dXvR|E|wpuFgA<4e8BiEBuvJ>o6dyn1J3;G z1BNBTcqI6pmM}4f6D`gA$X693hP=-0!2=t?;Z_JgGtLY^jBd6rL*yXZ9)l1pPAH|o z@G#7@0j>{Isak~F`OdxKgUe?Ee90_}VRXj~0&X^I6{>4EnU~Qf7Gv&K5doW+sy0!} zNB}w-*iCKf-mn3me3vK};N+wcG5Fb>FBErFAdstB_r`QnK?9&4zWl-q=-lWBLWu45 ze-OqWX*DtRUGMj*qc;hK(6r@y%X>^x^(zQQ7w&ThVbEG%rHIJ^>rfq_0TTX`!+i_V zY=(RZS10h#QU|a3r*KbWVj5_;nhJ!j8Wh#b+x^NIGzn{${+21ZmswS!pNIn|-6clq zG3U-eICG~e*#N2L?qewrQ;6DS!|1Su6P)I_MU;@0OrIM}1JnJMg130{F>fGwBL8Z!4F*liKXiROj?l)7hR)H}eIKjI4>4B1_Z ze)@98LrQemKDKwtBHhrpztno5y=JedF~PaoL<#7MyzQaKH{DkN<;L`gbO3u$I{8W7 zgkdyrT){=uprk2Tc&8)}JD9ZhB19fODUk=r20N@V4?}lZ%}#Y?DBY%@;21h(>_H>e zWyHc&v1K2acKq3U>;OQeu_aks%a+5IhUmIGAm zcg?!17&jA#4vMD1m{uM(X~6*8=XK1Dt@ zKMkp7Rp{FwYUvK3NE5X(t4NjQ*6&tZKBV^JaN~$6$O;F%t_N`MxBmopzPwWAythv% z7Z9l#3O-5#*wt4tHRX|xDb*~@_LhNBhUp@n(2nWXiunN#KYBi+mrdr8yr*jloPo}X zXqX7svAJ-L;yyU-c&zk60Bj4l2kh3U@#7)zz{uV@d%qPJ2pF#tC@z{OW&s4*)DYEx zZO6h2$M{cj6P32YY_*91Vk2Weps5Ci->9Fu?LRa6m&`UJ}z&5c86de zvp@9sx7W&x=YXW}5J~$1s4l7hPiNhraB^+wvCyXL8>%wH4PNnJB<~0u`D~BX*Qi2T z$N4P$O(GcAYGr#<%JBU?la&qOX$``LV|lUvGu}dab>h2~J;haJi>8cNeN76cqvywn zltHH^>C8Q#FP&@s8ky>@9iJDT$e~`sbyW@|zyDzi5h}IzvGfP3m4*QH;GeGuG_vKNT>o5Tb z>uT&DmfMUnOQH@;R=MKB^E;D;4Wfb5vKXzC{;nf&YnxKM|3xjRgskA-K%i$!F=CC#8xMFhwi7i~$W{=}(4!Nt}n&ptHvh zi=}(ZFTjxB?-cW!K3uH)!fby}!tL$SH!^UGI=(7xy)}iq3_vju5KQ|vKO3*57s&X^ zUR=1%>FNe<%@A^`8It@PiDziHoT&;LZ%R<@_?3)OX&4n>GCjMOYlfRSJBxNCo_iyc=ZZuVRd^S9Z|Rp0 z98@kwch$CiIto%G>DeD7iJ&;zrOhj|Ff!V8X;& zWZP(OmW6#e7|A5(T)eJ?@p^9Q*l!|S;jq}FPdI9K;Wz&=Iv7;)2#<4W%x`-%9sysB zIM1no&p!naO1)KDMlmge}>kr5895U7G%H>@3vt9oAwm(ERh#VuRhc zv?U!K1!z15qoV>mHsZNV4-Mc?g?NB0@Uq`n4} zUt9))v_Dh{Rm=6Z7MwljDP5P$YTqI2>!xxyYdEZOe8Ix=HCu0BNqi6`k8eY01v z&_~vDWz$85VnY*s1CR6e{++B>%j2=Sx#i87h9VCltrhU%sithSwH4=_bMzz!ckeDO?fOl?uoB7Ub!lnsS{3LQ$rA0i_jreOU zY-s?ra<2JPB1a93@P+um?yPmf)@~I89J&o4i9ITYVu-AA;Cb#zOcmf=Bsm*xh4Z8o z9-HoS4+b9A+oFCY-5)_{NS&I>rBp&WWEv9j#njA?Iw0j`3Z8kiIc=yy(D6zgTf1 z3#-PPzI{&!EJ?V_jVKkRTSfKvRwiu_mr0p;=x0Y$UIWR?03y(9x=(`bS}Ww zXE)yHT(ocfq_1j*jEs4R7N&mV0TulMsQ-D_vy+ z0K(A;!w%@IIEhISE_8TQ?ylI?w6r}|L)$JEmwbu>_Npe&6~|mj;AYnTVY?!{=mC&7 zShxkS%&EnRci|tgVz*4Hn)8JNY~zq%^_1f7{QuZt-zTEx-}Z8rhE3Fa!7G)M4@xcd zrnewZ@>bY;XhH}eh^8xR7uk){jrxd9({MSuhVHykiWQq9lP|xTZkI6x$t&_AB5%Vx zf36Lj68U1?a;f8$W}m?yTW)%G`?-O$qlJ;sSk+nq#XBBL{cBE^U6-T^tJL@nt~)Q5 zqlza(<7P}-b)vkX#?uN!N2>6-bzM^rM)SmutF+Rk$sb)fif09yymi~p@m~W}$KC?> z0|F2(_(dp?P{f3(5_bqG$r0e*ZDvH=niiR7I!(thG1rE_ZqA@5Fc{EDq@fblH*pV6 z zC&q@*+vv^EA0Nm95)02^m4v1f$|$D#tu`ArFPT_1Kkj{R0szNnDezp$gLi9A>HcKs zqa;LqYDg#(oV{WK9h&pn0_dG_$WI`Br5>O+e{nkkNhISL54$8qGiZPuQvHTt>X-ng z{p05#^USoTB0o>avHl#>qy0krfxsgQy$N!XWT){Ne;BY`X9uC~IceP{WyUoeW2DoD ztY5U~SacyiBnO$N;bzZLw5mS{Olsm!5XyK2g~|gkO0C>Cz4tcIEq@44*r>ue`YYSh z#~Ju{8Vp1HgVfK2vKBEQUs}WL1XsmF(l(uIoA0{qmJ%;#x;c#%6G)wZW+;4L*x)XY zQ401}s)`k{l9znF|MIz;N%fH;gd9o9+(&?@Mi48b zm-$-on!^&9O||6iQU!(Yi1YC8RWyls8`sTov&y(_0Kfw{ZN5*f(gG5)y#c=IfpaF_ z2k%9c={!UYYZd0Y=ik`X0AB$SF)hC8=?Pa0n2Ws(;-R>LEM%1Du`L0S*)4Gj3Q=S> z%{?|UOJ~2)UyVl}arSrGI;skpk1(Q*mmPd=%B?{%IA0FJL3cZl5sz0V(9`Q z4D)$wcZlj47F;BrlI1$K7)DlMQe6)BcV_Bi5%3zHMHw1$GO0-lYR2RBU+2a i-w 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 ! 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

M{!m1)n)xJ*0(5#qfV(YJX; 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 diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/WifiProvisionScreenshotTestsKt/ScreenshotDeviceFound_Dark_d19fbf1f_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/WifiProvisionScreenshotTestsKt/ScreenshotDeviceFound_Dark_d19fbf1f_0.png index 77b2ba9810a4e30471145a69f7a333a76d2518a9..a9ea459b7d615e581c7bead478c1681ccff4f014 100644 GIT binary patch literal 49648 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 IK6v(j0VEwXYXATM literal 48706 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 LtA$tYKlwiZo8KY4 diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/WifiProvisionScreenshotTestsKt/ScreenshotDeviceFound_Light_b29dc7a7_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/WifiProvisionScreenshotTestsKt/ScreenshotDeviceFound_Light_b29dc7a7_0.png index 6f499bd453d09dab2f19bb4cd76b66f5451a1bae..64256dbc3835feed654402635a7af5c8fcbfe7d7 100644 GIT binary patch literal 49384 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 z zfHwW*vFobMew27DnY+mWJn`^vW(kJ`01lh~eKQWg;w!qG?Mj+3W53CCGcrE(%iYS% zQ~ueVn>F{_>7c}X74DG$`HrF2Dtkl4Q$(H+&xpoQLuTSf_dnbkI@Y>Qd%xyeN(o&j zdvyo(BHJyF`?a2UF0;eqEPd}=j^bJK^6dx5xUCx>1XPEPlzIUM4BM=sXB*!qurC1U zWtdpay*!YpVmccZyCyM^qmr06b|=${_^ULlBUDYLuKmvI$H2tKraiJA;Ow;CYUu30 z621*k_jXdQor^(RHe5!)nO~U_!$=qMWIuL$Qxf9wnRpdw52*GfpF%4(v@Y~>6ia4j z+w9EnbGvbmvSmi_JFI%pJ}fR&Y37U!`Z#$V1{xM(Ad|Je_z~M8XK6x7yKC&)<$*?& z9o>4M?gbeSt=e)LU0yDYCU_kb-BUb24>|qnSo8_QcP&zw+Bq$&s+kc=`^`;T*+;G) zlO3-l`AMw{2#nj(XsEJ1!uqmxT?O{j;{Lz+wjKv>Y`NviG l<0<`d6#w|i|NjdUWZ&`AUKmE%Pwm-ygIgv#r8k`(|35pLCIbKf literal 48421 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 diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/WifiProvisionScreenshotTestsKt/ScreenshotNetworkRow_Dark_d19fbf1f_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/WifiProvisionScreenshotTestsKt/ScreenshotNetworkRow_Dark_d19fbf1f_0.png index 0a723868ae2351cf12f20e9ff3378508bed28e85..2ac94f3bf9440c5b665aaa7c25cf9f7cb469cd8e 100644 GIT binary patch literal 19426 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ⅇtInR0s;bxXUYn%2na5T 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 diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/WifiProvisionScreenshotTestsKt/ScreenshotNetworkRow_Light_b29dc7a7_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/WifiProvisionScreenshotTestsKt/ScreenshotNetworkRow_Light_b29dc7a7_0.png index 5fd15432009696665eec511fb298ad1dc6c845c6..47db7a6f5707684c6c473a5236563d3656d71aba 100644 GIT binary patch literal 19462 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 G<^Kg(ADuw} literal 19089 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 literal 10178 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 diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/WifiProvisionScreenshotTestsKt/ScreenshotScanningBle_Dark_d19fbf1f_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/WifiProvisionScreenshotTestsKt/ScreenshotScanningBle_Dark_d19fbf1f_0.png index 454bd623f943baec5686ec5b6831560fe34f0625..ac98eb3198bb4ac20dfa13b187684af2fe9cf346 100644 GIT binary patch delta 2445 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 TJK`n){2f2$`g7S&e%JpGt-7TJ diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/WifiProvisionScreenshotTestsKt/ScreenshotScanningBle_Light_b29dc7a7_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/WifiProvisionScreenshotTestsKt/ScreenshotScanningBle_Light_b29dc7a7_0.png index 9e45f1cdb17aac39e268c4b71438cb1733cf1cdd..67df31f38b60ec666ccbe8aa38ee0614a40b8fd9 100644 GIT binary patch delta 2438 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 16.sp` (hard requirement from design standards) | +| Dynamic Type scaling | All sizes must scale with system `fontScale` up to 200% without clipping | +| Pre-Android 12 | Graceful degradation: standard weight variants (400/500/700) instead of variable font intermediate weights | +| Android 12+ | System Roboto Flex provides full variable weight expression | +| Desktop/iOS | System default font family; same `sp` sizes; weight expression depends on platform font | + +## Migration Checklist (for each screen) + +1. Replace hardcoded `TextStyle` with `MaterialTheme.typography.*` reference +2. Identify heading elements → use emphasized variant +3. Verify no `fontSize` below 16.sp for body text +4. Run screenshot test to capture new visual +5. Verify TalkBack still reads correct content (no regression) diff --git a/specs/20260513-160000-m3-expressive-adoption/contracts/swipe-to-reveal-api.md b/specs/20260513-160000-m3-expressive-adoption/contracts/swipe-to-reveal-api.md new file mode 100644 index 000000000..f7766c3b7 --- /dev/null +++ b/specs/20260513-160000-m3-expressive-adoption/contracts/swipe-to-reveal-api.md @@ -0,0 +1,128 @@ +# Contract: SwipeToRevealBox Component API + +**Module**: `core/ui` | **Source Set**: `commonMain` + +## Public API + +```kotlin +/** + * A composable container that reveals action content behind the foreground + * when the user swipes horizontally. Supports bi-directional swipe with + * spring-physics animations. + * + * @param state The [SwipeToRevealState] controlling the drag position + * @param startContent Content revealed on right-swipe (e.g., "request position") + * @param endContent Content revealed on left-swipe (e.g., "mute") + * @param modifier Modifier applied to the container + * @param enableStartSwipe Whether right-swipe is enabled (default: true) + * @param enableEndSwipe Whether left-swipe is enabled (default: true) + * @param onActionTriggered Callback when a full-swipe threshold is crossed + * @param content The foreground content (the list item) + */ +@ExperimentalMaterial3ExpressiveApi +@Composable +fun SwipeToRevealBox( + state: SwipeToRevealState, + startContent: @Composable BoxScope.() -> Unit, + endContent: @Composable BoxScope.() -> Unit, + modifier: Modifier = Modifier, + enableStartSwipe: Boolean = true, + enableEndSwipe: Boolean = true, + onActionTriggered: (SwipeDirection) -> Unit = {}, + content: @Composable BoxScope.() -> Unit, +) + +/** + * Creates and remembers a [SwipeToRevealState]. + * + * @param initialAnchor Starting anchor position (default: [SwipeAnchor.Start]) + * @param confirmValueChange Optional callback to confirm anchor changes + */ +@Composable +fun rememberSwipeToRevealState( + initialAnchor: SwipeAnchor = SwipeAnchor.Start, + confirmValueChange: (SwipeAnchor) -> Boolean = { true }, +): SwipeToRevealState + +enum class SwipeAnchor { + Start, // Resting (centered) + RevealEnd, // Left-swipe: end actions visible + RevealStart, // Right-swipe: start actions visible +} + +enum class SwipeDirection { + StartToEnd, // Right-swipe + EndToStart, // Left-swipe +} +``` + +## Usage Contract + +### Node List +```kotlin +SwipeToRevealBox( + state = rememberSwipeToRevealState(), + startContent = { RequestPositionAction(node) }, // Right-swipe + endContent = { MuteNodeAction(node) }, // Left-swipe + onActionTriggered = { direction -> + when (direction) { + SwipeDirection.StartToEnd -> viewModel.requestPosition(node) + SwipeDirection.EndToStart -> viewModel.muteNode(node) + } + } +) { + NodeListItem(node) +} +``` + +### Message List +```kotlin +SwipeToRevealBox( + state = rememberSwipeToRevealState(), + startContent = {}, + endContent = { DeleteMessageAction(message) }, // Left-swipe only + enableStartSwipe = false, + onActionTriggered = { viewModel.deleteMessage(message) } +) { + MessageListItem(message) +} +``` + +## Behavioral Contracts + +| Behavior | Specification | +|----------|--------------| +| Reveal threshold | 56.dp horizontal drag reveals actions | +| Full-swipe threshold | 160.dp or 50% item width (whichever is smaller) triggers `onActionTriggered` | +| Fling velocity | ≥400.dp/s snaps to nearest anchor | +| Return animation | Spring: stiffness=300f, dampingRatio=0.7f | +| Reveal animation | Spring: stiffness=400f, dampingRatio=0.8f | +| Disabled direction | Drag in disabled direction produces rubber-band resistance (max 16.dp) | +| Accessibility | Swipe actions announced via semantics `customActions` for TalkBack | +| Reduced motion | Instant snap (no spring animation) when `LocalReduceMotion.current` is true | + +## Discoverability Hint Contract + +```kotlin +/** + * Modifier that applies a one-shot edge-peek animation to hint at + * swipe availability. + * + * @param enabled Whether the hint should animate (false = no-op) + * @param peekDistance The distance to peek (default: 24.dp) + * @param onHintShown Callback after hint animation completes + */ +fun Modifier.swipeHint( + enabled: Boolean, + peekDistance: Dp = 24.dp, + onHintShown: () -> Unit = {}, +): Modifier +``` + +| Behavior | Specification | +|----------|--------------| +| Trigger | First composition when `enabled = true` | +| Animation | Offset item by `peekDistance` over 400ms spring, hold 1000ms, return over 400ms spring | +| Frequency | Once per list screen visit per session (until permanent dismissal) | +| Permanent dismissal | After first successful swipe-to-action, `hasCompletedSwipeAction` = true | +| Reduced motion | Skip animation entirely; rely on a subtle visual indicator (trailing arrow icon) | diff --git a/specs/20260513-160000-m3-expressive-adoption/data-model.md b/specs/20260513-160000-m3-expressive-adoption/data-model.md new file mode 100644 index 000000000..2d0283694 --- /dev/null +++ b/specs/20260513-160000-m3-expressive-adoption/data-model.md @@ -0,0 +1,120 @@ +# Data Model: M3 Expressive Design System Adoption + +**Date**: 2025-07-18 | **Branch**: `20260513-160000-m3-expressive-adoption` + +## Overview + +This feature is primarily a UI/styling upgrade with minimal data model impact. The only new persistent state is the swipe-action discoverability hint preference. + +## New Entities + +### SwipeHintPreference + +**Location**: `core/datastore` (user preferences) + +| Field | Type | Default | Description | +|-------|------|---------|-------------| +| `hasCompletedSwipeAction` | `Boolean` | `false` | Permanently dismisses swipe hint after first successful swipe action | + +**Storage**: DataStore `UserPreferences` proto or preferences file (existing infrastructure). + +**State Transitions**: +``` +false → true (on first successful swipe-to-action completion) +``` +One-way flag. Never resets to false (permanent dismissal). + +--- + +### SwipeHintSessionState (transient) + +**Location**: In-memory, ViewModel-scoped + +| Field | Type | Default | Description | +|-------|------|---------|-------------| +| `hasShownHintThisSession` | `Boolean` | `false` | Prevents repeated hint animation within same process lifecycle | + +**Lifecycle**: Resets on process death. Within a session, hint shows once per list screen visit until `hasCompletedSwipeAction` becomes `true`. + +--- + +## Modified Entities + +### AppTypography (Type.kt) + +**Current State**: `val AppTypography = Typography()` — empty default + +**Target State**: Full expressive typescale definition: + +| Property | Value Source | +|----------|-------------| +| `displayLarge` | Standard M3 default (auto-emphasized by expressive theme) | +| `displayMedium` | Standard M3 default | +| `displaySmall` | Standard M3 default | +| `headlineLarge` | Standard M3 default | +| `headlineMedium` | Standard M3 default | +| `headlineSmall` | Standard M3 default | +| `titleLarge` | Standard M3 default | +| `titleMedium` | Standard M3 default | +| `titleSmall` | Standard M3 default | +| `bodyLarge` | `fontSize = 16.sp` minimum (design standards §5) | +| `bodyMedium` | `fontSize = 16.sp` minimum (design standards §5) | +| `bodySmall` | Standard M3 default | +| `labelLarge` | Standard M3 default | +| `labelMedium` | Standard M3 default | +| `labelSmall` | Standard M3 default | + +**Note**: Emphasized variants (`displayLargeEmphasized`, `titleMediumEmphasized`, etc.) are auto-generated by `MaterialExpressiveTheme` based on the standard scale. No manual definition needed. + +--- + +## Component State Models + +### SwipeToRevealState + +**Location**: `core/ui/component/SwipeToRevealBox.kt` + +| Field | Type | Description | +|-------|------|-------------| +| `anchoredDraggableState` | `AnchoredDraggableState` | Manages drag position and anchoring | +| `currentAnchor` | `SwipeAnchor` | Current snapped position | + +**SwipeAnchor Enum**: +```kotlin +enum class SwipeAnchor { + Start, // Resting position (0 offset) + RevealEnd, // Left-swipe reveals end actions + RevealStart, // Right-swipe reveals start actions +} +``` + +--- + +## Relationships + +``` +UserPreferences (DataStore) + └── hasCompletedSwipeAction: Boolean + +NodeListScreen + ├── uses SwipeToRevealBox (per item) + │ └── owns AnchoredDraggableState + └── reads hasCompletedSwipeAction (via ViewModel) + +MessageListScreen + ├── uses SwipeToRevealBox (per item) + │ └── owns AnchoredDraggableState + └── reads hasCompletedSwipeAction (via ViewModel) +``` + +--- + +## Validation Rules + +| Rule | Constraint | +|------|-----------| +| `bodyLarge.fontSize` | `>= 16.sp` (design standards §5 minimum) | +| `bodyMedium.fontSize` | `>= 16.sp` (design standards §5 minimum) | +| Touch target minimum | `44.dp × 44.dp` on all interactive elements (design standards accessibility) | +| Swipe threshold | Action reveals at ≥ 56.dp horizontal drag (comfortable thumb distance) | +| Swipe velocity threshold | Fling detected at ≥ 400.dp/s (standard Material swipe velocity) | diff --git a/specs/20260513-160000-m3-expressive-adoption/plan.md b/specs/20260513-160000-m3-expressive-adoption/plan.md new file mode 100644 index 000000000..5ed36c38a --- /dev/null +++ b/specs/20260513-160000-m3-expressive-adoption/plan.md @@ -0,0 +1,118 @@ +# Implementation Plan: M3 Expressive Design System Adoption + +**Branch**: `20260513-160000-m3-expressive-adoption` | **Date**: 2026-05-13 | **Spec**: `specs/20260513-160000-m3-expressive-adoption/spec.md` +**Input**: Feature specification from `specs/20260513-160000-m3-expressive-adoption/spec.md` + +## Summary + +Adopt Material 3 Expressive design system fully across the Meshtastic Android app by extending the existing partial `MaterialExpressiveTheme` + `MotionScheme.expressive()` to all screens and components. Key deliverables: complete expressive typography with emphasized variants, spring-physics navigation indicators, upgraded core/ui component library (67+ composables), swipe-to-action on node/message lists (right=request position, left=mute), and accessibility focus ring support. Implementation uses only APIs available in CMP material3 1.11.0-alpha07 — no manual reimplementations, no feature flags, no font bundling. + +## Technical Context + +**Language/Version**: Kotlin 2.3+ / JDK 21 / KMP +**Primary Dependencies**: CMP material3 `1.11.0-alpha07`, Compose Foundation (gestures), Compose Animation (spring) +**Storage**: DataStore (single boolean preference for swipe hint dismissal) +**Testing**: `./gradlew allTests` (KMP), `compose-screenshot 0.0.1-alpha14` (visual regression) +**Target Platform**: Android API 24+, Compose Desktop, iOS (via commonMain) +**Project Type**: KMP mobile/desktop app +**Performance Goals**: 60fps animations on mid-range devices (Pixel 6a), cold-start ≤ 50ms regression +**Constraints**: No APK size increase (no font bundling), no runtime feature flags, commonMain-only UI code +**Scale/Scope**: 67+ core/ui components, 9 feature modules, ~50 screens + +## Constitution Check + +*GATE: ✅ PASSED (pre-design) — Re-checked post-design below.* + +- **I. Kotlin Multiplatform Core**: ✅ All changes are in `commonMain` source sets. Modules touched: `core/ui`, `core/datastore` (1 boolean pref), all 9 `feature/*` modules. No new `androidMain` code. The only existing `androidMain` code (DynamicColorScheme.kt) is unchanged. + +- **II. Zero Lint Tolerance**: ✅ Verification commands: + ```bash + ./gradlew spotlessApply spotlessCheck detekt + # Per-module: :core:ui:detekt :feature:node:detekt etc. + ``` + All touched modules will pass `spotlessCheck` + `detekt` before push. + +- **III. Compose Multiplatform UI**: ✅ All UI uses Compose Multiplatform patterns. Navigation remains `MeshtasticNavDisplay` + `NavigationBackHandler`. No floats displayed (typography/animation values are internal). New `SwipeToRevealBox` composable uses only Compose Foundation APIs available in CMP. + +- **IV. Privacy First**: ✅ No PII, location data, or keys logged. No new network calls. `core/proto` untouched. The only new preference (`hasCompletedSwipeAction`) stores no sensitive data. + +- **V. Design Standards Compliance**: ✅ Verified against design standards v1.4: + - Typography: `bodyMedium/bodyLarge >= 16sp` (§5 minimum) + - Color: No palette changes; M3 role mapping (§8) unchanged + - Accessibility: 4.5:1 contrast maintained, 44dp touch targets, 200% Dynamic Type + - Cross-platform spec: N/A — M3 Expressive is platform-specific styling layer. The `meshtastic/design/features/` directory does not exist. Justification: this is an implementation-layer styling upgrade, not a UX behavior change. + +- **VI. Verify Before Push**: ✅ Commands: + ```bash + ./gradlew spotlessApply detekt assembleDebug test allTests + # Post-push: + gh pr checks || gh run list --branch 20260513-160000-m3-expressive-adoption --limit 5 + ``` + +### Post-Design Re-Check + +✅ All six principles remain satisfied after Phase 1 design: +- New `SwipeToRevealBox` is in `commonMain` (Principle I ✅) +- No lint exceptions introduced (Principle II ✅) +- Uses CMP Foundation gestures, not Android-specific (Principle III ✅) +- DataStore pref `hasCompletedSwipeAction` is non-sensitive (Principle IV ✅) +- Typography/component changes maintain design standards compliance (Principle V ✅) +- Build commands documented above (Principle VI ✅) + +## Project Structure + +### Documentation (this feature) + +```text +specs/20260513-160000-m3-expressive-adoption/ +├── plan.md # This file +├── research.md # Phase 0: technology decisions +├── data-model.md # Phase 1: entities and state models +├── quickstart.md # Phase 1: developer onboarding +├── contracts/ +│ ├── swipe-to-reveal-api.md # SwipeToRevealBox public API contract +│ └── expressive-typography-api.md # Typography usage guidelines +└── tasks.md # Phase 2: implementation tasks (pending) +``` + +### Source Code (repository root) + +```text +core/ +├── ui/src/commonMain/.../theme/ +│ ├── Theme.kt # MaterialExpressiveTheme (exists, extend) +│ ├── Type.kt # AppTypography (exists, upgrade) +│ └── Color.kt # Color tokens (unchanged) +├── ui/src/commonMain/.../component/ +│ ├── SwipeToRevealBox.kt # NEW: swipe-to-action container +│ ├── MeshtasticNavigationSuite.kt # MODIFY: expressive indicators +│ ├── MainAppBar.kt # MODIFY: expressive styling +│ ├── MenuFAB.kt # MODIFY: tooltip + shape +│ ├── SliderPreference.kt # MODIFY: spring animation +│ ├── AlertDialogs.kt # MODIFY: expressive shape/motion +│ └── [63 other components] # MODIFY: typography references +├── datastore/src/commonMain/... +│ └── UserPreferences # MODIFY: add hasCompletedSwipeAction + +feature/ +├── node/src/commonMain/.../list/ +│ └── NodeListScreen.kt # MODIFY: integrate SwipeToRevealBox +├── messaging/src/commonMain/... +│ └── [message list screen] # MODIFY: integrate SwipeToRevealBox +├── firmware/src/commonMain/... # MODIFY: wavy progress consistency +├── connections/src/commonMain/... # MODIFY: FAB tooltip labels +└── [5 other modules] # MODIFY: typography + component updates + +screenshot-tests/ +└── src/screenshotTest/... # MODIFY: update reference images +``` + +**Structure Decision**: Existing KMP multi-module architecture. No new modules created. One new file (`SwipeToRevealBox.kt`) in `core/ui/component/`. One new DataStore field. All other work is modifications to existing files. + +## Complexity Tracking + +> No Constitution violations. No complexity exceptions needed. + +| Violation | Why Needed | Simpler Alternative Rejected Because | +|-----------|------------|-------------------------------------| +| — | — | — | diff --git a/specs/20260513-160000-m3-expressive-adoption/quickstart.md b/specs/20260513-160000-m3-expressive-adoption/quickstart.md new file mode 100644 index 000000000..79006b40a --- /dev/null +++ b/specs/20260513-160000-m3-expressive-adoption/quickstart.md @@ -0,0 +1,109 @@ +# Quickstart: M3 Expressive Adoption + +**Branch**: `20260513-160000-m3-expressive-adoption` + +## Prerequisites + +```bash +# Standard bootstrap (if not already done) +git submodule update --init +[ -f local.properties ] || cp secrets.defaults.properties local.properties + +# Checkout the feature branch +git checkout 20260513-160000-m3-expressive-adoption +``` + +## Key Files to Know + +| File | Purpose | +|------|---------| +| `core/ui/src/commonMain/.../theme/Theme.kt` | Root `AppTheme` — already uses `MaterialExpressiveTheme` | +| `core/ui/src/commonMain/.../theme/Type.kt` | Typography definition — upgrade target | +| `core/ui/src/commonMain/.../component/` | 67+ shared components — upgrade targets | +| `feature/node/src/commonMain/.../list/NodeListScreen.kt` | Node list — swipe-to-action target | +| `feature/messaging/src/commonMain/...` | Message list — swipe-to-action target | +| `screenshot-tests/` | Visual regression tests | + +## Build & Verify + +```bash +# Full verification (run after every change) +./gradlew spotlessApply detekt assembleDebug test allTests + +# Update screenshot references after visual changes +./gradlew :screenshot-tests:updateScreenshotTests + +# Single module test (e.g., after changing core/ui) +./gradlew :core:ui:allTests +``` + +## Implementation Order + +1. **Typography** (Type.kt) — Foundation for all screens +2. **Navigation** (MeshtasticNavigationSuite.kt) — Highest-traffic interaction +3. **Core components** (MainAppBar, buttons, dialogs) — Shared across all features +4. **FABs & progress** (MenuFAB, progress indicators) — Already partially expressive +5. **Swipe-to-action** (new SwipeToRevealBox) — New component + integration +6. **Feature module rollout** — Apply typography + component updates per module +7. **Accessibility** — Focus rings, reduced-motion verification + +## Working with Expressive APIs + +```kotlin +// Always annotate at function level in feature modules +@OptIn(ExperimentalMaterial3ExpressiveApi::class) +@Composable +fun MyScreen() { + // Access emphasized typography + Text( + text = "Heading", + style = MaterialTheme.typography.titleMediumEmphasized, + ) +} +``` + +## Swipe-to-Action Pattern + +```kotlin +// In node list item +@OptIn(ExperimentalMaterial3ExpressiveApi::class) +@Composable +fun NodeListItemWithSwipe(node: NodeEntity, viewModel: NodeListViewModel) { + val state = rememberSwipeToRevealState() + + SwipeToRevealBox( + state = state, + startContent = { RequestPositionAction() }, + endContent = { MuteNodeAction() }, + onActionTriggered = { direction -> + when (direction) { + SwipeDirection.StartToEnd -> viewModel.requestPosition(node) + SwipeDirection.EndToStart -> viewModel.muteNode(node) + } + }, + ) { + NodeListItem(node) + } +} +``` + +## Key Constraints (from clarification) + +| Constraint | Implication | +|-----------|-------------| +| No feature flags | Direct replacement — each PR is atomic and revertible via git | +| No font bundling | Pre-Android 12 gets standard weight fallback; no APK size increase | +| No manual reimplementations | If CMP material3 doesn't provide it, skip it entirely | +| Swipe actions | Right = request position, Left = mute (node list) | +| Discoverability hint | Per-session edge-peek until first successful swipe | + +## Commit Strategy + +One commit per user story on a single branch: +1. Commit: Setup + Foundational (theme, typography, SwipeToRevealBox) +2. Commit: Navigation expressive indicators (US1) +3. Commit: Typography rollout across feature modules (US2) +4. Commit: Core component upgrades (US3) +5. Commit: SwipeToRevealBox + node/message list integration (US4) +6. Commit: Accessibility + focus rings (US5) +7. Commit: Screenshot test updates + polish (cross-cutting) diff --git a/specs/20260513-160000-m3-expressive-adoption/research.md b/specs/20260513-160000-m3-expressive-adoption/research.md new file mode 100644 index 000000000..7808558ff --- /dev/null +++ b/specs/20260513-160000-m3-expressive-adoption/research.md @@ -0,0 +1,132 @@ +# Research: M3 Expressive Design System Adoption + +**Date**: 2025-07-18 | **Branch**: `20260513-160000-m3-expressive-adoption` + +## Research Questions & Findings + +### RQ-1: What expressive typography APIs does CMP material3 1.11.0-alpha07 provide? + +**Decision**: Use `MaterialTheme.typography` emphasized extension properties available in `ExperimentalMaterial3ExpressiveApi`. + +**Rationale**: CMP material3 1.11.0-alpha07 (backed by Jetpack Compose Material3 ~1.5.0-alpha) exposes `Typography` with emphasized variants accessible via `MaterialTheme.typography.displayLargeEmphasized`, `headlineMediumEmphasized`, `titleMediumEmphasized`, `bodyLargeEmphasized`, and `labelLargeEmphasized`. These are extension properties gated behind `@ExperimentalMaterial3ExpressiveApi`. The Typography constructor itself does not accept emphasized parameters directly — instead, the expressive theme auto-generates them based on the standard typescale using bolder font weights and slightly adjusted letter spacing. + +**Alternatives Considered**: +- Manually constructing emphasized `TextStyle` variants → Rejected per constraint: no manual reimplementations of CMP APIs +- Bundling Roboto Flex variable font → Rejected per constraint: accept degradation pre-Android 12 + +**Pre-Android 12 Behavior**: Without Roboto Flex, the system falls back to standard Roboto weight variants (400/500/700). Emphasized styles degrade to the nearest available weight. No visual breakage, just less granular weight expression. + +--- + +### RQ-2: What expressive component variants are available in CMP material3 1.11.0-alpha07? + +**Decision**: Use only officially provided expressive APIs; defer unavailable ones. + +**Available (confirmed in 1.11.0-alpha07)**: +| Component | API | Notes | +|-----------|-----|-------| +| Theme | `MaterialExpressiveTheme` | ✅ Already in use | +| Motion | `MotionScheme.expressive()` | ✅ Already in use | +| FAB | `FloatingActionButtonDefaults.shape` / morphing | ✅ Expressive shapes available | +| Progress | `CircularWavyProgressIndicator`, `LinearWavyProgressIndicator` | ✅ Wavy variants available | +| Navigation Bar | `NavigationBarItemDefaults` expressive pill indicator | ✅ Available | +| Navigation Rail | `NavigationRailItemDefaults` expressive pill indicator | ✅ Available | +| Button | `ButtonDefaults` with expressive shapes | ✅ Round shapes available | +| Slider | No explicit expressive variant | ⚠️ Use standard Slider with spring animation manually | +| SwipeToDismissBox | `SwipeToDismissBoxState`, `SwipeToDismissBox` | ✅ Foundation API available | +| Tooltip | `PlainTooltip`, `RichTooltip`, `TooltipBox` | ✅ Available | +| Top App Bar | `TopAppBarDefaults` with expressive styling | ✅ Available | + +**Not Available (deferred per NFR-007)**: +| Component | Status | +|-----------|--------| +| Expressive focus rings (animated) | Not in CMP material3 yet — use `Modifier.focusable()` with custom indication | +| Shape morphing on press for FABs | Partial — `InteractionSource`-based shape is experimental | +| Expressive Slider | No distinct expressive variant; use spring animateFloatAsState for thumb | + +**Rationale**: Per spec NFR-007 and clarification, we only use what's officially available. Animated focus rings and shape-morph-on-press are deferred until CMP ships them. Standard focus indication + spring-animated state changes provide acceptable intermediate UX. + +--- + +### RQ-3: How to implement swipe-to-action on Compose Multiplatform lists? + +**Decision**: Use Compose Foundation `AnchoredDraggableState` + custom `SwipeToRevealBox` composable in `core/ui`. + +**Rationale**: `SwipeToDismissBox` from Material3 is designed for dismiss (delete) semantics. For reveal-actions (swipe to show action buttons without dismissing), the recommended pattern is: +1. Use `AnchoredDraggableState` from `androidx.compose.foundation.gestures` +2. Create anchors at rest (0), partial reveal (action width), and optionally full-swipe (action + execute) +3. Render action content behind the foreground item using `Box` with offset + +This approach: +- Works in `commonMain` (no platform-specific code needed) +- Allows bi-directional swipe (left = mute, right = request position) +- Supports spring animations via `AnchoredDraggableState.animateTo()` with spring spec +- Is composable and reusable across node list and message list + +**Alternatives Considered**: +- `SwipeToDismissBox` → Only supports dismiss semantics, not reveal-and-hold +- Third-party swipe library → Violates principle of minimal dependencies; foundation API is sufficient +- Custom `Modifier.pointerInput` → Lower-level; `AnchoredDraggable` handles fling velocity, snapping, and state persistence + +--- + +### RQ-4: How should the swipe discoverability hint work? + +**Decision**: Animate a 24dp edge-peek on the first visible list item using `LaunchedEffect` with a spring, controlled by a DataStore boolean `hasCompletedSwipeAction`. + +**Rationale**: The spec requires "hint repeats each session until user completes a successful swipe action." This means: +- Store `hasCompletedSwipeAction: Boolean` in user preferences (DataStore) +- On first composition of node/message list screen, if `!hasCompletedSwipeAction`, run a one-shot animation that offsets the first item 24dp to reveal a sliver of the action background +- After 1.0 seconds hold, spring back to rest position (400ms return) +- Once the user successfully completes any swipe action, set `hasCompletedSwipeAction = true` and never show hint again + +**Session vs. Permanent**: Per clarification, hint "repeats each session." Interpretation: a "session" = app process lifecycle. Use an in-memory flag (ViewModel-scoped `MutableStateFlow`) that resets on process death. DataStore persists the "has ever swiped" permanent dismissal. The per-session hint shows if the permanent flag is false. + +--- + +### RQ-5: How to apply spring-physics navigation indicator animations? + +**Decision**: The expressive `MotionScheme` already applies spring physics to navigation indicator movement when using `NavigationBar`/`NavigationRail` with `MaterialExpressiveTheme`. No additional configuration needed beyond ensuring the theme wraps all navigation composables. + +**Rationale**: `MotionScheme.expressive()` overrides the default animation specs for all Material3 component internal animations. The navigation indicator (pill shape) animation between items uses the motion scheme's `defaultSpatialSpec` which is a spring with `stiffness = 300f` and `dampingRatio = 0.7f`. This is automatic when the composable is inside `MaterialExpressiveTheme`. + +**Verification**: Can be confirmed by running the app in Layout Inspector and observing the indicator transition duration/curve. Should complete in ~250-350ms with slight overshoot. + +--- + +### RQ-6: How to handle `@OptIn(ExperimentalMaterial3ExpressiveApi::class)` at scale? + +**Decision**: Apply file-level `@file:OptIn(ExperimentalMaterial3ExpressiveApi::class)` in `core/ui/theme/Theme.kt` and `core/ui/theme/Type.kt`. For feature modules, use function-level `@OptIn` only on composables that directly call expressive APIs. + +**Rationale**: +- File-level in theme files is acceptable because the entire theme is fundamentally expressive +- Function-level in feature modules maintains visibility of which specific composables depend on experimental APIs +- This enables easy grep/search for expressive API usage when evaluating migration path as APIs stabilize +- Detekt/lint won't flag OptIn propagation issues with this approach + +--- + +### RQ-7: Screenshot test strategy for visual regression during migration? + +**Decision**: Update existing screenshot tests incrementally per user story. Each PR that changes component appearance must update corresponding reference images. + +**Rationale**: The project uses `compose-screenshot 0.0.1-alpha14` with multi-variant test setup. Strategy: +1. Before each component change, confirm current screenshot tests pass (baseline) +2. After applying expressive styling, run `./gradlew updateScreenshotTests` to capture new references +3. Include updated reference PNGs in the same PR as the styling change +4. Review visual diff in PR to confirm intentional changes only + +This is straightforward incremental migration — no special infrastructure needed. + +--- + +### RQ-8: Cross-platform spec requirement from Constitution §V? + +**Decision**: Mark as N/A — M3 Expressive is platform-specific (Android/Compose). + +**Rationale**: Per the spec's `Cross-Platform Spec` field: "N/A — platform-specific only. M3 Expressive APIs are Android/Compose-specific; desktop and iOS targets will receive equivalent improvements via CMP material3 as those APIs stabilize." Additionally, the `meshtastic/design` repo has no `features/` directory (404) and no mention of "expressive" anywhere. The design standards v1.4 do not prescribe animation/motion guidance, leaving this to platform implementations. + +Constitution §V is satisfied because: +1. The feature does not change cross-platform behavior semantics +2. It's an implementation-layer styling upgrade, not a UX flow change +3. Desktop/iOS get the styling automatically through `commonMain` when CMP stabilizes the APIs diff --git a/specs/20260513-160000-m3-expressive-adoption/spec.md b/specs/20260513-160000-m3-expressive-adoption/spec.md new file mode 100644 index 000000000..ef73f1eff --- /dev/null +++ b/specs/20260513-160000-m3-expressive-adoption/spec.md @@ -0,0 +1,136 @@ +# Feature Specification: M3 Expressive Design System Adoption + +**Feature Branch**: `20260513-160000-m3-expressive-adoption` +**Created**: 2026-05-13 +**Status**: Implementation Complete +**Input**: User description: "Adopt Material 3 Expressive design system across the Meshtastic Android app UI, leveraging new typography, animations, component styles, and interaction patterns to create a more dynamic and accessible user experience." +**Cross-Platform Spec**: N/A — platform-specific only. M3 Expressive APIs are Android/Compose-specific; desktop and iOS targets will receive equivalent improvements via CMP material3 as those APIs stabilize. + +## Summary + +Adopt the Material 3 Expressive design system throughout the Meshtastic Android app by replacing custom UI implementations with native M3 library components from `compose-multiplatform-material3:1.11.0-alpha07`. The guiding principle is **zero self-rolled components** — only native M3 APIs are used. Custom wrappers that existed in `core/ui` have been migrated to thin delegating layers over native M3 components, or deleted entirely when they were dead code. + +## Goals + +1. **Unified expressive typography**: Replace hardcoded `TextStyle` references with M3 Expressive typescale including emphasized variants (`titleMediumEmphasized`, `headlineSmallEmphasized`, etc.) auto-generated by `MaterialExpressiveTheme` +2. **Native M3 component adoption**: Migrate all custom component wrappers to delegate to native M3 interactive ListItem, ModalBottomSheet, OutlinedIconToggleButton, DropdownMenuGroup, CircularWavyProgressIndicator, etc. +3. **Dead code elimination**: Remove unused custom components (ClickableTextField, TimeTickWithLifecycle, BottomSheetDialog) that were superseded or never called +4. **Proper M3 disabled/color delegation**: Let M3 handle disabled content colors natively through its token system instead of manual alpha overrides +5. **Process-death state preservation**: Maintain CurrentTabSaver for active tab persistence across process death + +## Non-Goals + +- Self-rolling components not available in CMP material3 (e.g., SwipeToRevealBox, animated focus rings, reduce-motion locals) — **deferred until native APIs ship** +- Migrating all ~176 `HorizontalDivider` usages (separate follow-up PR) +- Migrating remaining legacy `CircularProgressIndicator` sites (IndoorAirQuality, LoadingOverlay, TAKConfigItemList) — low-priority follow-up +- Changing the app's color palette or brand identity +- Introducing new features or screens — this is a design-system upgrade of existing UI +- Supporting M3 Expressive on desktop/iOS targets immediately + +## What Was Implemented + +### Native M3 Components Adopted + +| Custom/Old | Native M3 Replacement | Location | +|-----------|----------------------|----------| +| Custom `ListItem` wrapper (clickable Column) | M3 interactive `ListItem(onClick=...)` | `core/ui/component/ListItem.kt` | +| Custom `RegularPreference` (Column + clickable) | M3 interactive `ListItem` with slots | `core/ui/component/RegularPreference.kt` | +| Custom `SwitchPreference` (toggleable ListItem) | M3 toggleable `ListItem(checked=..., onCheckedChange=...)` | `core/ui/component/SwitchPreference.kt` | +| `IconToggleButton` | `OutlinedIconToggleButton` | `feature/node/component/DeviceActions.kt` | +| `BottomSheetDialog` (custom) | `ModalBottomSheet` | `core/ui/emoji/EmojiPickerDialog.kt`, `feature/messaging/component/Reaction.kt` | +| `CircularProgressIndicator` (in SwitchPref) | `CircularWavyProgressIndicator` | `core/ui/component/SwitchPreference.kt` | +| Manual disabled color logic | M3 native disabled token delegation (`Color.Unspecified`) | All ListItem wrappers | +| Hardcoded `TextStyle(...)` | `MaterialTheme.typography.*Emphasized` | All feature modules | + +### Dead Code Removed + +| Component | Reason | +|-----------|--------| +| `ClickableTextField` | Zero callers — superseded by ExposedDropdownMenuBox | +| `TimeTickWithLifecycle` (expect + 3 actuals) | Zero callers — lifecycle tick no longer needed | +| `BottomSheetDialog` | Zero callers after ModalBottomSheet migration | + +### Key Design Decisions + +1. **RectangleShape for resting ListItem**: M3 interactive ListItem defaults to `CornerExtraSmall` (4dp rounded) which clashed with `HorizontalDivider` between items. Override `ListItemDefaults.shapes(shape = RectangleShape)` preserves press/hover/focus shape animations while keeping divider compatibility. + +2. **Color.Unspecified over LocalContentColor.current**: Passing `Color.Unspecified` to Text/Icon in M3 slots lets M3 apply its own content colors including disabled states. Explicit colors override M3's provision. + +3. **icon() helper**: Resolves `Color.Unspecified` → `LocalContentColor.current` at render time so M3 disabled content color flows through while explicit colors (like error red) still work. + +4. **CurrentTabSaver**: `rememberSaveable` with ordinal-based saver persists the active navigation tab across process death. Was accidentally dropped during Route graph refactoring and restored. + +5. **ModalBottomSheet with skipPartiallyExpanded**: Both EmojiPickerDialog and ReactionDialog use `skipPartiallyExpanded = true` to show full content immediately rather than partial peek. + +## Architecture + +### Key Components + +| Component | Module / File | Purpose | +|-----------|---------------|---------| +| `AppTheme` | `core/ui/theme/Theme.kt` | Root theme using `MaterialExpressiveTheme` with full expressive typography | +| `AppTypography` | `core/ui/theme/Type.kt` | Custom typescale with 16sp body minimum; emphasized variants auto-generated | +| `BasicListItem` | `core/ui/component/ListItem.kt` | Thin wrapper over M3 interactive ListItem with RectangleShape and Color.Unspecified defaults | +| `SwitchPreference` | `core/ui/component/SwitchPreference.kt` | Thin wrapper over M3 toggleable ListItem | +| `RegularPreference` | `core/ui/component/RegularPreference.kt` | Thin wrapper over M3 interactive ListItem | +| `MeshtasticDialog` | `core/ui/component/AlertDialogs.kt` | Uses expressive shape (28dp) and emphasized typography | +| `MainAppBar` | `core/ui/component/MainAppBar.kt` | Uses `titleLargeEmphasized` typography | +| `MultiBackstack` | `core/navigation/MultiBackstack.kt` | Tab state persisted via CurrentTabSaver | + +## Requirements *(final)* + +### Functional Requirements + +- **FR-001**: ✅ The app theme uses `MaterialExpressiveTheme` with expressive `MotionScheme` on all screens +- **FR-002**: ✅ The typography system uses emphasized variants auto-generated by MaterialExpressiveTheme with 16sp body minimum +- **FR-005**: ✅ SwitchPreference and FirmwareUpdateScreen use `CircularWavyProgressIndicator` for indeterminate states +- **FR-008**: ✅ Primary action buttons use expressive button styling +- **FR-011**: ✅ The top app bar uses expressive styling with emphasized typography +- **FR-012**: ✅ Expressive APIs wrapped with `@OptIn(ExperimentalMaterial3ExpressiveApi::class)` at file level + +### Deferred Requirements (awaiting native CMP APIs) + +- **FR-003**: Navigation spring-physics indicators — already provided by MotionScheme.expressive(), no additional work needed +- **FR-004**: FAB tooltip labels — available via PlainTooltip (already in MenuFAB) +- **FR-006**: Expressive slider styling — deferred (no native API beyond current) +- **FR-007**: Swipe-to-action gestures — **REVERTED** (no native SwipeToRevealBox in M3; self-rolled version violated zero-custom-component constraint) +- **FR-009**: Animated focus rings — **REVERTED** (no native M3 focus indication API; custom implementation violated constraint) +- **FR-010**: Reduce-motion local — **REVERTED** (M3's MotionScheme already respects system animator duration scale natively) + +### Non-Functional Requirements + +- **NFR-004**: ✅ All expressive API usage confined to `commonMain` source set +- **NFR-005**: ✅ Screenshot tests updated for new component appearances +- **NFR-006**: ✅ Direct permanent replacement with no feature flag +- **NFR-007**: ✅ No manual reimplementations of APIs not yet available in CMP material3 + +## Source-Set Impact + +| Source Set | Impact | Justification | +|-----------|--------|---------------| +| `commonMain` | Modified: theme, ListItem, SwitchPreference, RegularPreference, AlertDialogs, MainAppBar, EmojiPickerDialog, ChannelItem; Deleted: ClickableTextField, TimeTickWithLifecycle, BottomSheetDialog | All UI logic lives in commonMain | +| `androidMain` | Deleted: TimeTickWithLifecycle actual | Dead code removal | +| `jvmMain` | Deleted: TimeTickWithLifecycle actual | Dead code removal | +| `iosMain` | Modified: NoopStubs.kt (removed TimeTickWithLifecycle actual) | Dead code removal | + +## Success Criteria *(final)* + +- **SC-001**: ✅ All screens render using `MaterialExpressiveTheme` +- **SC-004**: ✅ Typography hierarchy renders with emphasized variants and distinct weight/size levels +- **SC-008**: ✅ Zero accessibility regressions — existing TalkBack flows unaffected + +## Clarifications + +### Session 2026-05-18 + +- Q: Should we use self-rolled M3 components (SwipeToRevealBox, focus indication, reduce motion) or only native library APIs? → A: **Only native library APIs.** All self-rolled implementations were reverted. Zero custom components policy. +- Q: Should dividers between ListItems be removed now that M3 uses rounded shapes? → A: Keep dividers + use RectangleShape for resting state. Divider removal is a separate focused PR (~176 usages across 40 files). +- Q: Should we use `OutlinedIconToggleButton` or regular `IconToggleButton` for favorite? → A: `OutlinedIconToggleButton` for clearer affordance. +- Q: Should RegularPreference manually compute disabled colors? → A: No — delegate to M3's native disabled token system via `Color.Unspecified`. + +## Assumptions + +- CMP material3 library version 1.11.0-alpha07 provides sufficient expressive API surface +- `ExperimentalMaterial3ExpressiveApi` annotation will remain available in near-term CMP updates +- No custom font bundling; system fonts with graceful degradation on pre-Android 12 +- Existing screenshot test infrastructure validates visual changes diff --git a/specs/20260513-160000-m3-expressive-adoption/tasks.md b/specs/20260513-160000-m3-expressive-adoption/tasks.md new file mode 100644 index 000000000..e9bbebd64 --- /dev/null +++ b/specs/20260513-160000-m3-expressive-adoption/tasks.md @@ -0,0 +1,86 @@ +# Tasks: M3 Expressive Design System Adoption + +**Input**: Design documents from `/specs/20260513-160000-m3-expressive-adoption/` +**Status**: Implementation Complete +**Constraint**: Only native M3 library APIs — zero self-rolled components + +--- + +## Completed Work + +### Phase 1: Theme & Typography Foundation + +- [X] T001 `MaterialExpressiveTheme` with `MotionScheme.expressive()` at root level +- [X] T002 Expressive typescale with 16sp body minimum; emphasized variants auto-generated +- [X] T003 `@file:OptIn(ExperimentalMaterial3ExpressiveApi::class)` across all consuming files +- [X] T004 Replace hardcoded `TextStyle` with `MaterialTheme.typography.*` references (audit pass) + +### Phase 2: Native Component Migration + +- [X] T010 Migrate `ListItem` wrapper to M3 interactive `ListItem(onClick=...)` overload +- [X] T011 Migrate `RegularPreference` to M3 interactive `ListItem` with slots +- [X] T012 Migrate `SwitchPreference` to M3 toggleable `ListItem(checked=..., onCheckedChange=...)` +- [X] T013 Replace `BottomSheetDialog` with native `ModalBottomSheet` (EmojiPicker + Reaction) +- [X] T014 Replace `IconToggleButton` with `OutlinedIconToggleButton` (favorite toggle) +- [X] T015 Adopt `DropdownMenuGroup` for grouped menu items +- [X] T016 Replace `CircularProgressIndicator` with `CircularWavyProgressIndicator` (SwitchPreference) +- [X] T017 Apply `headlineSmallEmphasized` to dialog titles (AlertDialogs) +- [X] T018 Apply `titleLargeEmphasized` to app bar title (MainAppBar) +- [X] T019 Apply `titleMediumEmphasized` to channel names (ChannelItem) +- [X] T020 Apply expressive shape (28dp rounded) to dialogs + +### Phase 3: M3 Disabled/Color Delegation + +- [X] T021 Use `Color.Unspecified` defaults in ListItem so M3 disabled tokens flow through +- [X] T022 Remove manual disabled color in RegularPreference — delegate to M3 +- [X] T023 Resolve deprecated `ListItemColors.copy()` — use `ListItemDefaults.colors()` directly +- [X] T024 `icon()` helper resolves Unspecified → LocalContentColor.current at render time + +### Phase 4: Shape & Divider Compatibility + +- [X] T025 Override resting shape to `RectangleShape` via `ListItemDefaults.shapes()` in BasicListItem +- [X] T026 Apply RectangleShape to SwitchPreference and RegularPreference +- [X] T027 Preserve press/hover/focus shape morphing animations (only idle state rectangular) + +### Phase 5: Dead Code Elimination + +- [X] T028 Delete `ClickableTextField` (zero callers) +- [X] T029 Delete `TimeTickWithLifecycle` expect + 3 actuals (zero callers) +- [X] T030 Delete `BottomSheetDialog` (zero callers after ModalBottomSheet migration) + +### Phase 6: Navigation State Preservation + +- [X] T031 Restore `CurrentTabSaver` with `rememberSaveable` for process-death tab persistence +- [X] T032 Route graph refactoring (Graph + concrete route pairs) + +### Phase 7: Dependency Fixes + +- [X] T033 Restore markdownRenderer to 0.41.0 (rebase conflict resolution error) + +### Phase 8: Validation + +- [X] T034 Screenshot test reference images updated +- [X] T035 Full verification: `spotlessApply detekt assembleDebug test allTests` — BUILD SUCCESSFUL +- [X] T036 Self-review in fix-first mode — 3 issues auto-fixed, 0 unresolved + +--- + +## Reverted Work (violated zero-custom-component constraint) + +| Task | What | Why Reverted | +|------|------|-------------| +| SwipeToRevealBox | Custom swipe-to-action component | No native M3 API exists | +| expressiveFocusIndication | Custom animated focus rings | No native M3 focus indication API | +| LocalReduceMotion | Custom reduce-motion CompositionLocal | M3 MotionScheme already handles natively | + +--- + +## Future Follow-ups (not in this PR) + +| Item | Scope | Notes | +|------|-------|-------| +| Remove HorizontalDividers | ~176 usages across 40 files | M3 list items don't need dividers with shape; large scope | +| Migrate remaining CircularProgressIndicator | 3 sites (IndoorAirQuality, LoadingOverlay, TAKConfigItemList) | Low priority | +| CircularWavyProgressIndicator in FirmwareUpdateScreen | Already done in earlier commit | ✅ | +| SwipeToRevealBox | Waiting for native M3 API | Adopt when CMP ships it | +| Animated focus rings | Waiting for native M3 API | Adopt when CMP ships it | From fc0df1a79ad1d8ce355803f5ac6eb4a1f2ec78c3 Mon Sep 17 00:00:00 2001 From: James Rich <2199651+jamesarich@users.noreply.github.com> Date: Mon, 18 May 2026 23:00:22 -0500 Subject: [PATCH 30/78] feat(docs): In-app documentation browser with Jekyll site and Docusaurus sync (#5445) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .agent_memory/session_context.md | 15 + .github/workflows/docs-deploy.yml | 63 ++ .github/workflows/docs-governance.yml | 403 +++++++++++++ .github/workflows/docs-release.yml | 82 +++ .github/workflows/scheduled-updates.yml | 1 + .github/workflows/sync-android-docs.yml | 53 ++ .gitignore | 15 +- .skills/compose-ui/strings-index.txt | 42 ++ .specify/memory/constitution.md | 58 +- androidApp/build.gradle.kts | 4 + .../org/meshtastic/app/di/FdroidAiModule.kt | 32 ++ .../org/meshtastic/app/di/FlavorModule.kt | 2 +- .../app/ai/GeminiNanoDocAssistant.kt | 470 +++++++++++++++ .../org/meshtastic/app/di/FlavorModule.kt | 2 +- .../org/meshtastic/app/di/GoogleAiModule.kt | 43 ++ .../app/translation/MlKitDocTranslator.kt | 136 +++++ .../org/meshtastic/app/di/AppKoinModule.kt | 2 + .../main/kotlin/org/meshtastic/app/ui/Main.kt | 2 + .../meshtastic/app/di/KoinVerificationTest.kt | 2 + build-logic/convention/build.gradle.kts | 5 + .../src/main/kotlin/RootConventionPlugin.kt | 7 + .../buildlogic/AndroidInstrumentedTests.kt | 11 +- .../org/meshtastic/buildlogic/DocsTasks.kt | 404 +++++++++++++ build.gradle.kts | 1 + .../core/common/util/LocaleUtils.android.kt | 8 + .../core/common/util/MeasurementSystem.kt | 9 + .../meshtastic/core/common/util/NoopStubs.kt | 4 + .../core/common/util/JvmPlatformUtils.kt | 8 + .../DatabaseManagerLegacyCleanupTest.kt | 16 +- .../core/database/MeshtasticDatabaseTest.kt | 19 +- .../core/navigation/DeepLinkRouter.kt | 14 + .../org/meshtastic/core/navigation/Routes.kt | 8 + .../composeResources/values/strings.xml | 42 ++ .../org/meshtastic/core/ui/icon/Settings.kt | 3 + crowdin.yml | 8 + desktopApp/build.gradle.kts | 1 + .../desktop/di/DesktopKoinModule.kt | 10 + .../desktop/navigation/DesktopNavigation.kt | 2 + docs/Gemfile | 8 + docs/_config.yml | 289 ++++++++++ docs/_data/locales.yml | 119 ++++ docs/_data/versions.yml | 12 + docs/_includes/footer_custom.html | 4 + docs/_includes/head_custom.html | 166 ++++++ docs/_includes/header_custom.html | 45 ++ docs/_includes/language_switcher.html | 71 +++ docs/_layouts/locale_page.html | 36 ++ docs/_sass/color_schemes/meshtastic-dark.scss | 40 ++ docs/_sass/color_schemes/meshtastic.scss | 39 ++ .../css/just-the-docs-meshtastic-dark.scss | 3 + docs/assets/css/just-the-docs-meshtastic.scss | 3 + docs/assets/screenshots/README.md | 41 ++ .../connections_bluetooth_scan.png | Bin 0 -> 15353 bytes .../screenshots/connections_connecting.png | Bin 0 -> 24915 bytes .../screenshots/connections_disconnect.png | Bin 0 -> 6772 bytes .../screenshots/connections_empty_state.png | Bin 0 -> 23525 bytes .../connections_transport_filters.png | Bin 0 -> 10384 bytes .../connections_wifi_device_found.png | Bin 0 -> 48421 bytes .../screenshots/connections_wifi_scanning.png | Bin 0 -> 23604 bytes .../screenshots/connections_wifi_success.png | Bin 0 -> 113841 bytes .../screenshots/docs-browser_chirpy.png | Bin 0 -> 92355 bytes docs/assets/screenshots/docs-browser_page.png | Bin 0 -> 150719 bytes .../screenshots/docs-browser_search.png | Bin 0 -> 9197 bytes docs/assets/screenshots/docs-browser_toc.png | Bin 0 -> 90875 bytes docs/assets/screenshots/firmware_checking.png | Bin 0 -> 23484 bytes .../screenshots/firmware_disclaimer.png | Bin 0 -> 82576 bytes docs/assets/screenshots/firmware_error.png | Bin 0 -> 29427 bytes docs/assets/screenshots/firmware_success.png | Bin 0 -> 43171 bytes .../screenshots/map_controls_overlay.png | Bin 0 -> 13933 bytes .../messages-and-channels_channel_list.png | Bin 0 -> 77302 bytes .../screenshots/messages_channel_info.png | Bin 0 -> 1656 bytes .../screenshots/messages_quick_chat.png | Bin 0 -> 7323 bytes docs/assets/screenshots/messages_reaction.png | Bin 0 -> 6030 bytes .../node-metrics_telemetric_actions.png | Bin 0 -> 147389 bytes .../assets/screenshots/nodes_battery_info.png | Bin 0 -> 3459 bytes .../assets/screenshots/nodes_detail_local.png | Bin 0 -> 145345 bytes .../screenshots/nodes_detail_section.png | Bin 0 -> 59151 bytes .../screenshots/nodes_distance_info.png | Bin 0 -> 3714 bytes .../screenshots/nodes_environment_metrics.png | Bin 0 -> 68 bytes docs/assets/screenshots/nodes_hops_info.png | Bin 0 -> 3546 bytes docs/assets/screenshots/nodes_last_heard.png | Bin 0 -> 4268 bytes docs/assets/screenshots/nodes_node_list.png | Bin 0 -> 135280 bytes docs/assets/screenshots/nodes_position.png | Bin 0 -> 17321 bytes docs/assets/screenshots/nodes_signal_info.png | Bin 0 -> 3089 bytes .../assets/screenshots/onboarding_welcome.png | Bin 0 -> 98946 bytes .../settings-radio-user_lora_config.png | Bin 0 -> 12667 bytes docs/assets/screenshots/settings_app_info.png | Bin 0 -> 40965 bytes .../screenshots/settings_appearance.png | Bin 0 -> 12667 bytes docs/assets/screenshots/settings_dropdown.png | Bin 0 -> 11369 bytes .../screenshots/settings_ipv4_field.png | Bin 0 -> 8782 bytes .../screenshots/settings_password_field.png | Bin 0 -> 6974 bytes .../screenshots/settings_persistence.png | Bin 0 -> 31773 bytes docs/assets/screenshots/settings_slider.png | Bin 0 -> 11345 bytes docs/assets/screenshots/settings_switch.png | Bin 0 -> 6705 bytes .../screenshots/settings_text_field.png | Bin 0 -> 21256 bytes .../screenshots/settings_titled_card.png | Bin 0 -> 4866 bytes docs/developer.md | 49 ++ docs/developer/adding-a-feature-module.md | 147 +++++ docs/developer/architecture.md | 132 +++++ docs/developer/codebase.md | 137 +++++ docs/developer/contributing.md | 97 ++++ docs/developer/measurement.md | 166 ++++++ docs/developer/navigation-and-deep-links.md | 121 ++++ docs/developer/persistence.md | 84 +++ docs/developer/testing.md | 121 ++++ docs/developer/transport.md | 98 ++++ docs/index.md | 30 + docs/translations.md | 56 ++ docs/user.md | 38 ++ docs/user/connections.md | 113 ++++ docs/user/desktop.md | 128 +++++ docs/user/discovery.md | 114 ++++ docs/user/firmware.md | 106 ++++ docs/user/map-and-waypoints.md | 111 ++++ docs/user/messages-and-channels.md | 152 +++++ docs/user/mqtt.md | 135 +++++ docs/user/node-metrics.md | 129 +++++ docs/user/nodes.md | 148 +++++ docs/user/onboarding.md | 92 +++ docs/user/settings-module-admin.md | 241 ++++++++ docs/user/settings-radio-user.md | 163 ++++++ docs/user/signal-meter.md | 80 +++ docs/user/tak.md | 124 ++++ docs/user/telemetry-and-sensors.md | 118 ++++ docs/user/translate.md | 97 ++++ docs/user/units-and-locale.md | 118 ++++ feature/docs/build.gradle.kts | 149 +++++ .../feature/docs/ai/AIDocAssistant.kt | 38 ++ .../feature/docs/ai/ChirpySessionHolder.kt | 35 ++ .../docs/ai/KeywordFallbackAssistant.kt | 44 ++ .../feature/docs/data/DocBundleLoader.kt | 544 ++++++++++++++++++ .../feature/docs/data/KeywordSearchEngine.kt | 160 ++++++ .../feature/docs/di/FeatureDocsModule.kt | 24 + .../feature/docs/model/DocModels.kt | 162 ++++++ .../feature/docs/navigation/DocsNavigation.kt | 329 +++++++++++ .../docs/translation/DocTranslationCache.kt | 178 ++++++ .../docs/translation/DocTranslationService.kt | 53 ++ .../MarkdownTranslationSegmenter.kt | 375 ++++++++++++ .../docs/translation/NoOpDocTranslator.kt | 32 ++ .../feature/docs/ui/ChirpyAssistantSheet.kt | 316 ++++++++++ .../ui/ComposeResourceImageTransformer.kt | 86 +++ .../feature/docs/ui/DocPageIconResolver.kt | 102 ++++ .../feature/docs/ui/DocsBrowserScreen.kt | 205 +++++++ .../feature/docs/ui/DocsPageRouteScreen.kt | 244 ++++++++ .../feature/docs/ui/DocsPreviews.kt | 509 ++++++++++++++++ .../feature/docs/ui/DocsSearchBar.kt | 58 ++ .../feature/docs/DocBundleLoaderTest.kt | 89 +++ .../feature/docs/DocsNavigationTest.kt | 43 ++ .../feature/docs/KeywordSearchEngineTest.kt | 101 ++++ .../translation/DocTranslationCacheTest.kt | 119 ++++ .../MarkdownTranslationSegmenterTest.kt | 156 +++++ .../translation/TranslationCascadeTest.kt | 122 ++++ .../feature/docs/ui/DocsBrowserScreenTest.kt | 153 +++++ .../feature/docs/ui/DocsLinkUriHandlerTest.kt | 107 ++++ .../docs/ui/DocsPageRouteScreenTest.kt | 116 ++++ .../feature/docs/ui/DocsSearchBarTest.kt | 60 ++ .../map/component/MapControlsPreviews.kt | 52 ++ .../feature/node/detail/NodeDetailPreviews.kt | 3 +- .../feature/settings/SettingsScreen.kt | 11 + .../component/SettingsSectionPreviews.kt | 40 ++ .../feature/settings/DesktopSettingsScreen.kt | 11 + gradle/libs.versions.toml | 4 + screenshot-tests/build.gradle.kts | 55 +- .../docs-screenshot-aliases.properties | 65 +++ .../docs-screenshots-manifest.txt | 13 + .../feature/DocsScreenshotTests.kt | 85 +++ .../screenshots/feature/MapScreenshotTests.kt | 29 + .../feature/NodeScreenshotTests.kt | 8 + .../feature/SettingsScreenshotTests.kt | 8 + ...ChirpyAssistantLoading_Dark_d19fbf1f_0.png | Bin 0 -> 117831 bytes ...hirpyAssistantLoading_Light_b29dc7a7_0.png | Bin 0 -> 118888 bytes ...eenshotChirpyAssistant_Dark_d19fbf1f_0.png | Bin 0 -> 109806 bytes ...enshotChirpyAssistant_Light_b29dc7a7_0.png | Bin 0 -> 110507 bytes ...enshotDocsBrowserEmpty_Dark_d19fbf1f_0.png | Bin 0 -> 33462 bytes ...nshotDocsBrowserEmpty_Light_b29dc7a7_0.png | Bin 0 -> 33471 bytes .../ScreenshotDocsBrowser_Dark_d19fbf1f_0.png | Bin 0 -> 112080 bytes ...ScreenshotDocsBrowser_Light_b29dc7a7_0.png | Bin 0 -> 112254 bytes ...eenshotDocsPageContent_Dark_d19fbf1f_0.png | Bin 0 -> 150574 bytes ...enshotDocsPageContent_Light_b29dc7a7_0.png | Bin 0 -> 150661 bytes ...enshotDocsPageNotFound_Dark_d19fbf1f_0.png | Bin 0 -> 35729 bytes ...nshotDocsPageNotFound_Light_b29dc7a7_0.png | Bin 0 -> 35753 bytes ...shotDocsSearchBarEmpty_Dark_d19fbf1f_0.png | Bin 0 -> 9341 bytes ...hotDocsSearchBarEmpty_Light_b29dc7a7_0.png | Bin 0 -> 9373 bytes ...DocsSearchBarWithQuery_Dark_d19fbf1f_0.png | Bin 0 -> 9216 bytes ...ocsSearchBarWithQuery_Light_b29dc7a7_0.png | Bin 0 -> 9197 bytes ...shotMapControlsOverlay_Dark_d19fbf1f_0.png | Bin 0 -> 14263 bytes ...hotMapControlsOverlay_Light_b29dc7a7_0.png | Bin 0 -> 13933 bytes ...deDetailContentMinimal_Dark_d19fbf1f_0.png | Bin 0 -> 132307 bytes ...eDetailContentMinimal_Light_b29dc7a7_0.png | Bin 0 -> 135195 bytes ...hotNotificationSection_Dark_d19fbf1f_0.png | Bin 0 -> 38637 bytes ...otNotificationSection_Light_b29dc7a7_0.png | Bin 0 -> 38215 bytes scripts/check-doc-coverage.js | 84 +++ scripts/check-doc-freshness.js | 55 ++ scripts/lib/frontmatter.js | 51 ++ scripts/sync-android-docs.js | 331 +++++++++++ scripts/validate-doc-links.js | 83 +++ settings.gradle.kts | 1 + .../checklists/requirements.md | 1 + .../20260507-161858-app-docs-markdown/plan.md | 56 ++ .../20260507-161858-app-docs-markdown/spec.md | 92 +++ .../tasks.md | 432 +++++++++++--- 201 files changed, 12471 insertions(+), 136 deletions(-) create mode 100644 .github/workflows/docs-deploy.yml create mode 100644 .github/workflows/docs-governance.yml create mode 100644 .github/workflows/docs-release.yml create mode 100644 .github/workflows/sync-android-docs.yml create mode 100644 androidApp/src/fdroid/kotlin/org/meshtastic/app/di/FdroidAiModule.kt create mode 100644 androidApp/src/google/kotlin/org/meshtastic/app/ai/GeminiNanoDocAssistant.kt create mode 100644 androidApp/src/google/kotlin/org/meshtastic/app/di/GoogleAiModule.kt create mode 100644 androidApp/src/google/kotlin/org/meshtastic/app/translation/MlKitDocTranslator.kt create mode 100644 build-logic/convention/src/main/kotlin/org/meshtastic/buildlogic/DocsTasks.kt create mode 100644 docs/Gemfile create mode 100644 docs/_config.yml create mode 100644 docs/_data/locales.yml create mode 100644 docs/_data/versions.yml create mode 100644 docs/_includes/footer_custom.html create mode 100644 docs/_includes/head_custom.html create mode 100644 docs/_includes/header_custom.html create mode 100644 docs/_includes/language_switcher.html create mode 100644 docs/_layouts/locale_page.html create mode 100644 docs/_sass/color_schemes/meshtastic-dark.scss create mode 100644 docs/_sass/color_schemes/meshtastic.scss create mode 100644 docs/assets/css/just-the-docs-meshtastic-dark.scss create mode 100644 docs/assets/css/just-the-docs-meshtastic.scss create mode 100644 docs/assets/screenshots/README.md create mode 100644 docs/assets/screenshots/connections_bluetooth_scan.png create mode 100644 docs/assets/screenshots/connections_connecting.png create mode 100644 docs/assets/screenshots/connections_disconnect.png create mode 100644 docs/assets/screenshots/connections_empty_state.png create mode 100644 docs/assets/screenshots/connections_transport_filters.png create mode 100644 docs/assets/screenshots/connections_wifi_device_found.png create mode 100644 docs/assets/screenshots/connections_wifi_scanning.png create mode 100644 docs/assets/screenshots/connections_wifi_success.png create mode 100644 docs/assets/screenshots/docs-browser_chirpy.png create mode 100644 docs/assets/screenshots/docs-browser_page.png create mode 100644 docs/assets/screenshots/docs-browser_search.png create mode 100644 docs/assets/screenshots/docs-browser_toc.png create mode 100644 docs/assets/screenshots/firmware_checking.png create mode 100644 docs/assets/screenshots/firmware_disclaimer.png create mode 100644 docs/assets/screenshots/firmware_error.png create mode 100644 docs/assets/screenshots/firmware_success.png create mode 100644 docs/assets/screenshots/map_controls_overlay.png create mode 100644 docs/assets/screenshots/messages-and-channels_channel_list.png create mode 100644 docs/assets/screenshots/messages_channel_info.png create mode 100644 docs/assets/screenshots/messages_quick_chat.png create mode 100644 docs/assets/screenshots/messages_reaction.png create mode 100644 docs/assets/screenshots/node-metrics_telemetric_actions.png create mode 100644 docs/assets/screenshots/nodes_battery_info.png create mode 100644 docs/assets/screenshots/nodes_detail_local.png create mode 100644 docs/assets/screenshots/nodes_detail_section.png create mode 100644 docs/assets/screenshots/nodes_distance_info.png create mode 100644 docs/assets/screenshots/nodes_environment_metrics.png create mode 100644 docs/assets/screenshots/nodes_hops_info.png create mode 100644 docs/assets/screenshots/nodes_last_heard.png create mode 100644 docs/assets/screenshots/nodes_node_list.png create mode 100644 docs/assets/screenshots/nodes_position.png create mode 100644 docs/assets/screenshots/nodes_signal_info.png create mode 100644 docs/assets/screenshots/onboarding_welcome.png create mode 100644 docs/assets/screenshots/settings-radio-user_lora_config.png create mode 100644 docs/assets/screenshots/settings_app_info.png create mode 100644 docs/assets/screenshots/settings_appearance.png create mode 100644 docs/assets/screenshots/settings_dropdown.png create mode 100644 docs/assets/screenshots/settings_ipv4_field.png create mode 100644 docs/assets/screenshots/settings_password_field.png create mode 100644 docs/assets/screenshots/settings_persistence.png create mode 100644 docs/assets/screenshots/settings_slider.png create mode 100644 docs/assets/screenshots/settings_switch.png create mode 100644 docs/assets/screenshots/settings_text_field.png create mode 100644 docs/assets/screenshots/settings_titled_card.png create mode 100644 docs/developer.md create mode 100644 docs/developer/adding-a-feature-module.md create mode 100644 docs/developer/architecture.md create mode 100644 docs/developer/codebase.md create mode 100644 docs/developer/contributing.md create mode 100644 docs/developer/measurement.md create mode 100644 docs/developer/navigation-and-deep-links.md create mode 100644 docs/developer/persistence.md create mode 100644 docs/developer/testing.md create mode 100644 docs/developer/transport.md create mode 100644 docs/index.md create mode 100644 docs/translations.md create mode 100644 docs/user.md create mode 100644 docs/user/connections.md create mode 100644 docs/user/desktop.md create mode 100644 docs/user/discovery.md create mode 100644 docs/user/firmware.md create mode 100644 docs/user/map-and-waypoints.md create mode 100644 docs/user/messages-and-channels.md create mode 100644 docs/user/mqtt.md create mode 100644 docs/user/node-metrics.md create mode 100644 docs/user/nodes.md create mode 100644 docs/user/onboarding.md create mode 100644 docs/user/settings-module-admin.md create mode 100644 docs/user/settings-radio-user.md create mode 100644 docs/user/signal-meter.md create mode 100644 docs/user/tak.md create mode 100644 docs/user/telemetry-and-sensors.md create mode 100644 docs/user/translate.md create mode 100644 docs/user/units-and-locale.md create mode 100644 feature/docs/build.gradle.kts create mode 100644 feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/ai/AIDocAssistant.kt create mode 100644 feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/ai/ChirpySessionHolder.kt create mode 100644 feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/ai/KeywordFallbackAssistant.kt create mode 100644 feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/data/DocBundleLoader.kt create mode 100644 feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/data/KeywordSearchEngine.kt create mode 100644 feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/di/FeatureDocsModule.kt create mode 100644 feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/model/DocModels.kt create mode 100644 feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/navigation/DocsNavigation.kt create mode 100644 feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/translation/DocTranslationCache.kt create mode 100644 feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/translation/DocTranslationService.kt create mode 100644 feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/translation/MarkdownTranslationSegmenter.kt create mode 100644 feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/translation/NoOpDocTranslator.kt create mode 100644 feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/ui/ChirpyAssistantSheet.kt create mode 100644 feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/ui/ComposeResourceImageTransformer.kt create mode 100644 feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/ui/DocPageIconResolver.kt create mode 100644 feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/ui/DocsBrowserScreen.kt create mode 100644 feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/ui/DocsPageRouteScreen.kt create mode 100644 feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/ui/DocsPreviews.kt create mode 100644 feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/ui/DocsSearchBar.kt create mode 100644 feature/docs/src/commonTest/kotlin/org/meshtastic/feature/docs/DocBundleLoaderTest.kt create mode 100644 feature/docs/src/commonTest/kotlin/org/meshtastic/feature/docs/DocsNavigationTest.kt create mode 100644 feature/docs/src/commonTest/kotlin/org/meshtastic/feature/docs/KeywordSearchEngineTest.kt create mode 100644 feature/docs/src/commonTest/kotlin/org/meshtastic/feature/docs/translation/DocTranslationCacheTest.kt create mode 100644 feature/docs/src/commonTest/kotlin/org/meshtastic/feature/docs/translation/MarkdownTranslationSegmenterTest.kt create mode 100644 feature/docs/src/commonTest/kotlin/org/meshtastic/feature/docs/translation/TranslationCascadeTest.kt create mode 100644 feature/docs/src/commonTest/kotlin/org/meshtastic/feature/docs/ui/DocsBrowserScreenTest.kt create mode 100644 feature/docs/src/commonTest/kotlin/org/meshtastic/feature/docs/ui/DocsLinkUriHandlerTest.kt create mode 100644 feature/docs/src/commonTest/kotlin/org/meshtastic/feature/docs/ui/DocsPageRouteScreenTest.kt create mode 100644 feature/docs/src/commonTest/kotlin/org/meshtastic/feature/docs/ui/DocsSearchBarTest.kt create mode 100644 feature/map/src/commonMain/kotlin/org/meshtastic/feature/map/component/MapControlsPreviews.kt create mode 100644 feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/component/SettingsSectionPreviews.kt create mode 100644 screenshot-tests/docs-screenshot-aliases.properties create mode 100644 screenshot-tests/src/screenshotTest/kotlin/org/meshtastic/screenshots/feature/DocsScreenshotTests.kt create mode 100644 screenshot-tests/src/screenshotTest/kotlin/org/meshtastic/screenshots/feature/MapScreenshotTests.kt create mode 100644 screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/DocsScreenshotTestsKt/ScreenshotChirpyAssistantLoading_Dark_d19fbf1f_0.png create mode 100644 screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/DocsScreenshotTestsKt/ScreenshotChirpyAssistantLoading_Light_b29dc7a7_0.png create mode 100644 screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/DocsScreenshotTestsKt/ScreenshotChirpyAssistant_Dark_d19fbf1f_0.png create mode 100644 screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/DocsScreenshotTestsKt/ScreenshotChirpyAssistant_Light_b29dc7a7_0.png create mode 100644 screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/DocsScreenshotTestsKt/ScreenshotDocsBrowserEmpty_Dark_d19fbf1f_0.png create mode 100644 screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/DocsScreenshotTestsKt/ScreenshotDocsBrowserEmpty_Light_b29dc7a7_0.png create mode 100644 screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/DocsScreenshotTestsKt/ScreenshotDocsBrowser_Dark_d19fbf1f_0.png create mode 100644 screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/DocsScreenshotTestsKt/ScreenshotDocsBrowser_Light_b29dc7a7_0.png create mode 100644 screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/DocsScreenshotTestsKt/ScreenshotDocsPageContent_Dark_d19fbf1f_0.png create mode 100644 screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/DocsScreenshotTestsKt/ScreenshotDocsPageContent_Light_b29dc7a7_0.png create mode 100644 screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/DocsScreenshotTestsKt/ScreenshotDocsPageNotFound_Dark_d19fbf1f_0.png create mode 100644 screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/DocsScreenshotTestsKt/ScreenshotDocsPageNotFound_Light_b29dc7a7_0.png create mode 100644 screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/DocsScreenshotTestsKt/ScreenshotDocsSearchBarEmpty_Dark_d19fbf1f_0.png create mode 100644 screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/DocsScreenshotTestsKt/ScreenshotDocsSearchBarEmpty_Light_b29dc7a7_0.png create mode 100644 screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/DocsScreenshotTestsKt/ScreenshotDocsSearchBarWithQuery_Dark_d19fbf1f_0.png create mode 100644 screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/DocsScreenshotTestsKt/ScreenshotDocsSearchBarWithQuery_Light_b29dc7a7_0.png create mode 100644 screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/MapScreenshotTestsKt/ScreenshotMapControlsOverlay_Dark_d19fbf1f_0.png create mode 100644 screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/MapScreenshotTestsKt/ScreenshotMapControlsOverlay_Light_b29dc7a7_0.png create mode 100644 screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/NodeScreenshotTestsKt/ScreenshotNodeDetailContentMinimal_Dark_d19fbf1f_0.png create mode 100644 screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/NodeScreenshotTestsKt/ScreenshotNodeDetailContentMinimal_Light_b29dc7a7_0.png create mode 100644 screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotNotificationSection_Dark_d19fbf1f_0.png create mode 100644 screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotNotificationSection_Light_b29dc7a7_0.png create mode 100644 scripts/check-doc-coverage.js create mode 100644 scripts/check-doc-freshness.js create mode 100644 scripts/lib/frontmatter.js create mode 100755 scripts/sync-android-docs.js create mode 100644 scripts/validate-doc-links.js diff --git a/.agent_memory/session_context.md b/.agent_memory/session_context.md index f1a5b4ebc..3d98a8c99 100644 --- a/.agent_memory/session_context.md +++ b/.agent_memory/session_context.md @@ -3,6 +3,21 @@ # Do NOT edit or remove previous entries — stale state claims cause agent confusion. # Format: ## YYYY-MM-DD —

+## 2026-05-12 — Implemented Apple alignment for docs feature (FR-038) +- Branch: `feat/20260507-161858-app-docs-markdown` +- Gap analysis against `meshtastic-apple` completed. Implemented 4 alignment items: + 1. Per-page TOC icons via `DocPageIconResolver.kt` mapping `iconId` to `MeshtasticIcons` + 2. New `docs/user/signal-meter.md` (RSSI vs SNR, bar-level criteria, LoRa signal concepts) + 3. New `docs/user/units-and-locale.md` (automatic metric/imperial via `MetricFormatter`) + 4. New `.github/workflows/docs-staleness.yml` (advisory PR comments for UI changes without doc updates) +- Added `iconId: String?` field to `DocPage` and `KeywordIndexEntry` models +- Updated `DocBundleLoader` with iconId for all 24 pages plus 2 new entries (signal-meter, units-and-locale) +- Updated `DocsBrowserScreen` to show leading icons in TOC list items +- Marked T061-T085 as completed in tasks.md (were implemented in prior session) +- Added Phase 9 (T200-T206) for Apple alignment tasks — all marked complete +- Skipped Apple-only features: watch, carplay, translate, TipKit, SwiftData docs +- Verified: `spotlessApply`, `detekt`, `assembleDebug`, `compileKotlinJvm` — all green + ## 2026-05-11 — Migrated feature/intro UI to commonMain - Moved intro onboarding UI composables and nav graph from `feature/intro/src/androidMain/` into `feature/intro/src/commonMain/`, adding shared `IntroPermissions` and `IntroSettingsNavigator` interfaces plus a common `introGraph` Navigation 3 extension. - Refactored `AppIntroductionScreen` into a thin Android host that provides Android permission/settings adapters via composition locals, and added `AndroidIntroPermissions`, `AndroidIntroSettingsNavigator`, and JVM desktop no-op stubs. diff --git a/.github/workflows/docs-deploy.yml b/.github/workflows/docs-deploy.yml new file mode 100644 index 000000000..350fd04a1 --- /dev/null +++ b/.github/workflows/docs-deploy.yml @@ -0,0 +1,63 @@ +name: Docs Deploy (Beta) + +on: + push: + branches: [main] + paths: + - 'docs/**' + - 'feature/docs/**' + - 'build-logic/convention/src/main/kotlin/org/meshtastic/buildlogic/DocsTasks.kt' + - '.github/workflows/docs-deploy.yml' + +permissions: + contents: read + pages: write + id-token: write + +concurrency: + group: docs-deploy + cancel-in-progress: true + +jobs: + build-and-deploy: + runs-on: ubuntu-24.04 + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + + steps: + - name: Checkout + uses: actions/checkout@v6 + with: + submodules: true + fetch-depth: 0 + + - name: Set up JDK 21 + uses: actions/setup-java@v4 + with: + java-version: '21' + distribution: 'temurin' + + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v4 + with: + cache-read-only: false + + - name: Generate Docs Bundle + run: ./gradlew generateDocsBundle -Pdocs.channel=beta -Pci=true + + - name: Validate Docs Bundle + run: ./gradlew validateDocsBundle -Pdocs.channel=beta -Pci=true + + - name: Generate Site Artifact + run: ./gradlew publishDocsSite -Pdocs.channel=beta -Pci=true + + - name: Upload Pages Artifact + uses: actions/upload-pages-artifact@v3 + with: + path: build/_site/ + + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 + diff --git a/.github/workflows/docs-governance.yml b/.github/workflows/docs-governance.yml new file mode 100644 index 000000000..71489a8e7 --- /dev/null +++ b/.github/workflows/docs-governance.yml @@ -0,0 +1,403 @@ +name: UI & Docs Governance + +on: + pull_request: + branches: [main] + types: [opened, synchronize, reopened, labeled, unlabeled] + schedule: + - cron: "0 6 * * 1" # Every Monday at 6 AM UTC + workflow_dispatch: + +permissions: + contents: read + pull-requests: write + +jobs: + # ── Job 1: Staleness — flag PRs that change UI without updating docs ──────── + staleness: + name: Docs staleness check + runs-on: ubuntu-24.04-arm + if: >- + github.event_name == 'pull_request' + && !contains(github.event.pull_request.labels.*.name, 'skip-docs-check') + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Detect changed files + id: changed + run: | + BASE="${{ github.event.pull_request.base.sha }}" + HEAD="${{ github.event.pull_request.head.sha }}" + + changed=$(git diff --name-only "$BASE" "$HEAD") + + views_changed=$(echo "$changed" | grep -E \ + '^feature/.*/src/commonMain/.*/(ui|component|screen)/|^feature/.*/src/androidMain/.*/ui/|^core/ui/src/commonMain/' \ + | grep -v 'Test\|Preview\|__Snapshots__' || true) + + docs_changed=$(echo "$changed" | grep -E '^docs/(user|developer)/' || true) + + echo "views_changed<> "$GITHUB_OUTPUT" + echo "$views_changed" >> "$GITHUB_OUTPUT" + echo "EOF" >> "$GITHUB_OUTPUT" + + echo "docs_changed<> "$GITHUB_OUTPUT" + echo "$docs_changed" >> "$GITHUB_OUTPUT" + echo "EOF" >> "$GITHUB_OUTPUT" + + if [[ -n "$views_changed" && -z "$docs_changed" ]]; then + echo "stale=true" >> "$GITHUB_OUTPUT" + else + echo "stale=false" >> "$GITHUB_OUTPUT" + fi + + - name: Post warning comment + if: steps.changed.outputs.stale == 'true' + uses: actions/github-script@v7 + with: + script: | + const viewsChanged = `${{ steps.changed.outputs.views_changed }}`.trim(); + const body = [ + '## 📄 Docs staleness check — advisory', + '', + 'This PR modifies user-facing UI source files but does not update any page under `docs/user/` or `docs/developer/`.', + '', + '> ⚠️ Doc changes propagate to **3 consumers**: in-app docs browser, Jekyll site (GitHub Pages), and meshtastic.org (Docusaurus sync). Updating a page in `docs/` automatically flows to all three.', + '', + '**Changed source files:**', + '```', + viewsChanged, + '```', + '', + '**What to check:**', + '| Changed area | Likely doc page |', + '|---|---|', + '| `feature/messaging/` | `docs/user/messages-and-channels.md` |', + '| `feature/node/` | `docs/user/nodes.md` or `docs/user/node-metrics.md` |', + '| `feature/map/` | `docs/user/map-and-waypoints.md` |', + '| `feature/connections/` | `docs/user/connections.md` |', + '| `feature/settings/` | `docs/user/settings-radio-user.md` or `docs/user/settings-module-admin.md` |', + '| `feature/firmware/` | `docs/user/firmware.md` |', + '| `feature/intro/` | `docs/user/onboarding.md` |', + '| `feature/discovery/` | `docs/user/discovery.md` |', + '| `feature/docs/` | Internal docs infrastructure |', + '| `core/ui/` | `docs/developer/codebase.md` or component-specific user pages |', + '', + '**New page checklist** (if adding a new doc page):', + '1. Create the `.md` file in `docs/user/` or `docs/developer/` with `last_updated` frontmatter', + '2. Register in `DocBundleLoader.kt` with string resources (in-app browser)', + '3. Jekyll and Docusaurus sync pick up new pages automatically — no config change needed', + '', + 'If this PR does **not** require a doc update (e.g., internal refactor, bug fix, test change), add the **`skip-docs-check`** label to dismiss this check.', + '', + '> **Cross-platform note:** This check is advisory while doc coverage matures. Both Android and Apple repos use the same `skip-docs-check` label and advisory severity. See `meshtastic/design` standards for shared conventions.', + ].join('\n'); + + const { data: comments } = await github.rest.issues.listComments({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.issue.number, + }); + const existing = comments.find(c => + c.user.login === 'github-actions[bot]' && + c.body.includes('Docs staleness check') + ); + if (existing) { + await github.rest.issues.updateComment({ + owner: context.repo.owner, + repo: context.repo.repo, + comment_id: existing.id, + body, + }); + } else { + await github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.issue.number, + body, + }); + } + + - name: Dismiss stale comment when docs are updated + if: steps.changed.outputs.stale == 'false' + uses: actions/github-script@v7 + with: + script: | + const { data: comments } = await github.rest.issues.listComments({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.issue.number, + }); + const existing = comments.find(c => + c.user.login === 'github-actions[bot]' && + c.body.includes('Docs staleness check') + ); + if (existing) { + await github.rest.issues.updateComment({ + owner: context.repo.owner, + repo: context.repo.repo, + comment_id: existing.id, + body: '## ✅ Docs staleness check passed\n\nThis PR includes updates to `docs/` alongside the source changes. Thank you!', + }); + } + + - name: Advisory status + if: steps.changed.outputs.stale == 'true' + run: | + echo "::warning::UI source files changed without corresponding docs/ updates." + echo "Add the 'skip-docs-check' label if this PR does not require a doc update." + echo "NOTE: This check is advisory while docs coverage matures across platforms." + echo "To upgrade to blocking, change this step to 'exit 1'." + + # ── Job 2: Quality gates — link validation, coverage, registry, freshness ─── + validate: + name: Docs quality gates + runs-on: ubuntu-24.04-arm + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 1 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: "20" + + - name: Validate internal links + run: node scripts/validate-doc-links.js docs + + - name: Check doc coverage + run: node scripts/check-doc-coverage.js . + + - name: Validate DocBundleLoader registry + run: | + loader="feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/data/DocBundleLoader.kt" + missing=0 + for f in docs/user/*.md docs/developer/*.md; do + slug=$(basename "$f" .md) + if ! grep -q "\"$slug\"" "$loader"; then + echo "ERROR: $slug not registered in DocBundleLoader.kt" + missing=$((missing + 1)) + fi + done + if [ "$missing" -gt 0 ]; then + echo "" + echo "FAILED: $missing page(s) missing from DocBundleLoader.kt in-app index." + exit 1 + fi + echo "All doc pages registered in DocBundleLoader." + + - name: Check doc freshness + # Advisory — warns on stale pages but does not block PRs + continue-on-error: true + run: node scripts/check-doc-freshness.js docs --max-age-days=180 + + # ── Job 3: Preview staleness — flag UI changes without preview updates ────── + preview-staleness: + name: Preview staleness check + runs-on: ubuntu-24.04-arm + if: >- + github.event_name == 'pull_request' + && !contains(github.event.pull_request.labels.*.name, 'skip-preview-check') + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Detect changed files + id: changed + run: | + BASE="${{ github.event.pull_request.base.sha }}" + HEAD="${{ github.event.pull_request.head.sha }}" + + changed=$(git diff --name-only "$BASE" "$HEAD") + + # UI composables changed (screens, components — excluding tests and previews) + ui_changed=$(echo "$changed" | grep -E \ + '^(feature|core/ui)/.*/src/commonMain/.*/.*\.(kt)$' \ + | grep -E '/(ui|component|screen)/' \ + | grep -v 'Test\|Preview\|__Snapshots__' || true) + + # Preview files changed + preview_changed=$(echo "$changed" | grep -E 'Preview.*\.kt$' || true) + + # Screenshot test files changed + screenshot_tests_changed=$(echo "$changed" | grep -E '^screenshot-tests/src/screenshotTest/.*\.kt$' || true) + + # Reference images changed + refs_changed=$(echo "$changed" | grep -E '^screenshot-tests/src/screenshotTestDebug/reference/.*\.png$' || true) + + echo "ui_changed<> "$GITHUB_OUTPUT" + echo "$ui_changed" >> "$GITHUB_OUTPUT" + echo "EOF" >> "$GITHUB_OUTPUT" + + echo "preview_changed<> "$GITHUB_OUTPUT" + echo "$preview_changed" >> "$GITHUB_OUTPUT" + echo "EOF" >> "$GITHUB_OUTPUT" + + echo "screenshot_tests_changed<> "$GITHUB_OUTPUT" + echo "$screenshot_tests_changed" >> "$GITHUB_OUTPUT" + echo "EOF" >> "$GITHUB_OUTPUT" + + echo "refs_changed<> "$GITHUB_OUTPUT" + echo "$refs_changed" >> "$GITHUB_OUTPUT" + echo "EOF" >> "$GITHUB_OUTPUT" + + # Preview staleness: UI changed but no preview updates + if [[ -n "$ui_changed" && -z "$preview_changed" ]]; then + echo "preview_stale=true" >> "$GITHUB_OUTPUT" + else + echo "preview_stale=false" >> "$GITHUB_OUTPUT" + fi + + # Screenshot staleness: previews changed but no reference image updates + if [[ -n "$preview_changed" && -z "$refs_changed" ]]; then + echo "screenshot_stale=true" >> "$GITHUB_OUTPUT" + else + echo "screenshot_stale=false" >> "$GITHUB_OUTPUT" + fi + + - name: Post preview advisory + if: steps.changed.outputs.preview_stale == 'true' + uses: actions/github-script@v7 + with: + script: | + const uiChanged = `${{ steps.changed.outputs.ui_changed }}`.trim(); + const body = [ + '## 🖼️ Preview staleness check — advisory', + '', + 'This PR modifies UI composables but does not update any `*Previews.kt` files.', + '', + '> Previews power screenshot tests and in-app docs screenshots. Keeping them current ensures visual regression coverage stays accurate.', + '', + '**Changed UI files:**', + '```', + uiChanged, + '```', + '', + '**What to check:**', + '| Pattern | Preview file convention |', + '|---|---|', + '| `feature/{name}/…/ui/` or `component/` | `feature/{name}/…/*Previews.kt` |', + '| `core/ui/…/` | `core/ui/…/` (previews colocated) |', + '', + '**Adding previews checklist:**', + '1. Create or update a `*Previews.kt` file in the same module with `@PreviewLightDark`', + '2. Add `@Suppress("PreviewPublic")` if the preview is consumed by screenshot-tests', + '3. Add corresponding `@PreviewTest` function in `screenshot-tests/src/screenshotTest/`', + '4. Run `./gradlew :screenshot-tests:updateDebugScreenshotTest` to generate reference images', + '', + 'If this PR does **not** require preview updates (e.g., logic-only change, non-visual refactor), add the **`skip-preview-check`** label to dismiss.', + ].join('\n'); + + const { data: comments } = await github.rest.issues.listComments({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.issue.number, + }); + const existing = comments.find(c => + c.user.login === 'github-actions[bot]' && + c.body.includes('Preview staleness check') + ); + if (existing) { + await github.rest.issues.updateComment({ + owner: context.repo.owner, + repo: context.repo.repo, + comment_id: existing.id, + body, + }); + } else { + await github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.issue.number, + body, + }); + } + + - name: Post screenshot advisory + if: steps.changed.outputs.screenshot_stale == 'true' + uses: actions/github-script@v7 + with: + script: | + const previewChanged = `${{ steps.changed.outputs.preview_changed }}`.trim(); + const body = [ + '## 📸 Screenshot reference staleness — advisory', + '', + 'This PR modifies preview composables but does not update screenshot reference images.', + '', + '> Reference images in `screenshot-tests/src/screenshotTestDebug/reference/` must be regenerated when previews change, or `validateDebugScreenshotTest` will fail.', + '', + '**Changed preview files:**', + '```', + previewChanged, + '```', + '', + '**How to update:**', + '```bash', + './gradlew :screenshot-tests:updateDebugScreenshotTest', + '```', + 'Then commit the updated reference PNGs.', + '', + 'If this change is intentionally preview-only (e.g., adding a preview that doesn\'t need a test yet), add the **`skip-preview-check`** label.', + ].join('\n'); + + const { data: comments } = await github.rest.issues.listComments({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.issue.number, + }); + const existing = comments.find(c => + c.user.login === 'github-actions[bot]' && + c.body.includes('Screenshot reference staleness') + ); + if (existing) { + await github.rest.issues.updateComment({ + owner: context.repo.owner, + repo: context.repo.repo, + comment_id: existing.id, + body, + }); + } else { + await github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.issue.number, + body, + }); + } + + - name: Dismiss comments when resolved + if: >- + steps.changed.outputs.preview_stale == 'false' + && steps.changed.outputs.screenshot_stale == 'false' + uses: actions/github-script@v7 + with: + script: | + const { data: comments } = await github.rest.issues.listComments({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.issue.number, + }); + for (const marker of ['Preview staleness check', 'Screenshot reference staleness']) { + const existing = comments.find(c => + c.user.login === 'github-actions[bot]' && + c.body.includes(marker) + ); + if (existing) { + await github.rest.issues.updateComment({ + owner: context.repo.owner, + repo: context.repo.repo, + comment_id: existing.id, + body: `## ✅ ${marker} passed\n\nPreview and screenshot references are up to date.`, + }); + } + } diff --git a/.github/workflows/docs-release.yml b/.github/workflows/docs-release.yml new file mode 100644 index 000000000..7331d9e53 --- /dev/null +++ b/.github/workflows/docs-release.yml @@ -0,0 +1,82 @@ +name: Docs Release + +on: + push: + tags: + - 'v*.*.*' + +permissions: + contents: write + pages: write + id-token: write + +concurrency: + group: docs-release + cancel-in-progress: false + +jobs: + release-docs: + runs-on: ubuntu-24.04 + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + + steps: + - name: Checkout + uses: actions/checkout@v6 + with: + submodules: true + fetch-depth: 0 + + - name: Extract Version + id: version + run: | + TAG=${GITHUB_REF#refs/tags/v} + echo "version=$TAG" >> $GITHUB_OUTPUT + echo "Deploying docs for version: $TAG" + + - name: Set up JDK 21 + uses: actions/setup-java@v4 + with: + java-version: '21' + distribution: 'temurin' + + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v4 + with: + cache-read-only: true + + - name: Generate Docs Bundle + run: ./gradlew generateDocsBundle -Pdocs.channel=release -Pdocs.version=${{ steps.version.outputs.version }} -Pci=true + + - name: Validate Docs Bundle + run: ./gradlew validateDocsBundle -Pdocs.version=${{ steps.version.outputs.version }} -Pci=true + + - name: Generate Site Artifact + run: ./gradlew publishDocsSite -Pdocs.channel=release -Pdocs.version=${{ steps.version.outputs.version }} -Pci=true + + - name: Update Versions Manifest + run: | + VERSION=${{ steps.version.outputs.version }} + # Prepend new version entry to versions.yml + cat < /tmp/new_version.yml + - name: "$VERSION" + url: /v$VERSION/ + prerelease: false + current: true + EOF + # Mark existing entries as not current + sed -i 's/current: true/current: false/' docs/_data/versions.yml + # Prepend new entry + cat /tmp/new_version.yml docs/_data/versions.yml > /tmp/versions_merged.yml + mv /tmp/versions_merged.yml docs/_data/versions.yml + + - name: Upload Pages Artifact + uses: actions/upload-pages-artifact@v3 + with: + path: build/_site/ + + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 + diff --git a/.github/workflows/scheduled-updates.yml b/.github/workflows/scheduled-updates.yml index 216d05c4e..63e1b9f5b 100644 --- a/.github/workflows/scheduled-updates.yml +++ b/.github/workflows/scheduled-updates.yml @@ -177,6 +177,7 @@ jobs: fastlane/metadata/android/** **/strings.xml **/README.md + docs/**/*.md labels: | automation l10n diff --git a/.github/workflows/sync-android-docs.yml b/.github/workflows/sync-android-docs.yml new file mode 100644 index 000000000..4d56c12fc --- /dev/null +++ b/.github/workflows/sync-android-docs.yml @@ -0,0 +1,53 @@ +name: Sync Android App Documentation + +on: + schedule: + - cron: "0 0 * * 0" # Every Sunday at midnight UTC + workflow_dispatch: + +jobs: + sync: + runs-on: ubuntu-24.04 + permissions: + contents: write + pull-requests: write + + steps: + - name: Checkout meshtastic/meshtastic + uses: actions/checkout@v4 + with: + fetch-depth: 1 + + - name: Clone meshtastic/Meshtastic-Android + run: | + git clone --depth=1 --branch main https://github.com/meshtastic/Meshtastic-Android.git /tmp/Meshtastic-Android + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version-file: ".nvmrc" + + - name: Install cwebp + run: sudo apt-get update && sudo apt-get install -y webp + + - name: Run sync script + run: node /tmp/Meshtastic-Android/scripts/sync-android-docs.js /tmp/Meshtastic-Android --convert-webp + + - name: Create Pull Request + uses: peter-evans/create-pull-request@v7 + with: + token: ${{ secrets.GITHUB_TOKEN }} + commit-message: "docs: sync latest Android app documentation" + branch: sync/android-docs + delete-branch: true + title: "docs: sync latest Android app documentation" + body: | + This PR was automatically created by the [sync-android-docs](../.github/workflows/sync-android-docs.yml) workflow. + + It synchronizes Markdown documentation and images from [meshtastic/Meshtastic-Android](https://github.com/meshtastic/Meshtastic-Android) into this repository: + + - Markdown files → `docs/software/android/` + - Image files → `static/img/android/docs/` + + Image paths in Markdown are rewritten to use the Docusaurus `/img/android/docs/` static path. + Screenshots are converted to WebP for optimal site performance. diff --git a/.gitignore b/.gitignore index ce8a34ea7..77738d14b 100644 --- a/.gitignore +++ b/.gitignore @@ -51,6 +51,12 @@ docs/screenshots/ build-and-install-android.sh wireless-install.sh +# Generated docs artifacts +docs/_site/ +docs/.jekyll-cache/ +docs/.jekyll-metadata +docs/Gemfile.lock + # Git worktrees .worktrees/ /firebase-debug.log.jdk/ @@ -63,6 +69,13 @@ firebase-debug.log /coil/ /kable/ .opencode/ +# Synced docs in composeResources (generated from docs/ source by syncDocsToComposeResources task) +feature/docs/src/commonMain/composeResources/files/docs/user/ +feature/docs/src/commonMain/composeResources/files/docs/developer/ +feature/docs/src/commonMain/composeResources/files/docs/assets/ + /desktop/bin/ /build-logic/convention/bin/ -/.specify/extensions/.cache/ \ No newline at end of file +/.specify/extensions/.cache/ +# Jekyll local config (comments out remote_theme for local builds) +docs/_config_local.yml diff --git a/.skills/compose-ui/strings-index.txt b/.skills/compose-ui/strings-index.txt index 71c89ac96..c900b3eef 100644 --- a/.skills/compose-ui/strings-index.txt +++ b/.skills/compose-ui/strings-index.txt @@ -302,6 +302,47 @@ distance_filters_description distance_measurements distance_measurements_description dns +### DOC ### +doc_clear_search +doc_keywords_connections +doc_keywords_desktop +doc_keywords_discovery +doc_keywords_firmware +doc_keywords_map +doc_keywords_measurement +doc_keywords_messages +doc_keywords_mqtt +doc_keywords_node_metrics +doc_keywords_nodes +doc_keywords_onboarding +doc_keywords_settings_module +doc_keywords_settings_radio +doc_keywords_signal_meter +doc_keywords_tak +doc_keywords_telemetry +doc_keywords_translate +doc_keywords_units +doc_search_placeholder +doc_section_developer +doc_section_user +doc_title_connections +doc_title_desktop +doc_title_discovery +doc_title_firmware +doc_title_map +doc_title_measurement +doc_title_messages +doc_title_mqtt +doc_title_node_metrics +doc_title_nodes +doc_title_onboarding +doc_title_settings_module +doc_title_settings_radio +doc_title_signal_meter +doc_title_tak +doc_title_telemetry +doc_title_translate +doc_title_units done dont_show_again_for_device double_tap_as_button_press @@ -483,6 +524,7 @@ hardware hardware_model heading heartbeat +help_and_documentation hide_layer hide_password history_return_max diff --git a/.specify/memory/constitution.md b/.specify/memory/constitution.md index fdf770bd5..e7b45102c 100644 --- a/.specify/memory/constitution.md +++ b/.specify/memory/constitution.md @@ -1,19 +1,17 @@ # Meshtastic Android (KMP) Constitution @@ -90,7 +88,41 @@ All user-facing UI MUST conform to the Meshtastic Client Design Standards: users have a predictable experience regardless of platform. The design standards are maintained collaboratively across all Meshtastic client teams. -### VI. Verify Before Push +### VI. Documentation Freshness + +In-app documentation MUST remain accurate and current as the codebase evolves. +Documentation changes propagate to **three consumers** — all three MUST be considered: + +1. **In-app docs browser** — `syncDocsToComposeResources` copies `docs/` into Compose + Resources at build time. Changes are bundled into the app automatically. +2. **Jekyll site** (GitHub Pages) — `docs/` is served directly. The `docs-deploy.yml` + workflow rebuilds on push to `main`. +3. **Docusaurus site** (meshtastic.org) — `scripts/sync-android-docs.js` transforms + `docs/` for the external site. Runs weekly via the `meshtastic/meshtastic` repo. + +Governance rules: + +- Every doc page MUST include a `last_updated` frontmatter field (YYYY-MM-DD). + Update this field whenever page content changes. +- PRs that modify user-facing UI source files MUST update the corresponding doc page(s) + or apply the `skip-docs-check` label with justification. The docs staleness check is a + **blocking** CI gate. +- Internal cross-references between doc pages and image paths MUST be validated; broken + links fail the `docs-governance` workflow. +- Every user-facing feature module MUST have corresponding documentation in `docs/user/` + or `docs/developer/`. Coverage is checked by `scripts/check-doc-coverage.js`. +- Pages older than 180 days without updates trigger an advisory freshness warning. +- New doc pages MUST be registered in `DocBundleLoader.kt` (in-app index), and added to + the `KNOWN_*_SLUGS` sets in `sync-android-docs.js` (Docusaurus link resolution). + Jekyll picks up new pages automatically via `_config.yml` scope-based defaults. +- Image references MUST use root-relative paths (`/assets/screenshots/filename.png`) so + they resolve correctly in both Jekyll and the in-app renderer. The sync script rewrites + these to Docusaurus paths automatically. +- Rationale: Documentation that drifts from the implementation misleads users, increases + support burden, and undermines the in-app help experience. Three distinct consumers + means a single source change must be verified across all delivery channels. + +### VII. Verify Before Push Local verification MUST complete successfully before any `git push`: @@ -162,7 +194,7 @@ This constitution supersedes all other practices, coding guidelines, and agent i - PATCH: Clarifications, wording fixes, or non-semantic refinements. **Compliance Review**: Every implementation plan and PR description MUST include a -Constitution Check confirming all six principles were evaluated. Complexity violations +Constitution Check confirming all seven principles were evaluated. Complexity violations require explicit justification in the Complexity Tracking table of the plan document. -**Version**: 1.2.0 | **Ratified**: 2026-05-07 | **Last Amended**: 2026-05-12 +**Version**: 1.3.0 | **Ratified**: 2026-05-07 | **Last Amended**: 2026-05-13 diff --git a/androidApp/build.gradle.kts b/androidApp/build.gradle.kts index 8581f519f..480989d8a 100644 --- a/androidApp/build.gradle.kts +++ b/androidApp/build.gradle.kts @@ -221,6 +221,7 @@ dependencies { implementation(projects.feature.map) implementation(projects.feature.node) implementation(projects.feature.settings) + implementation(projects.feature.docs) implementation(projects.feature.firmware) implementation(projects.feature.wifiProvision) implementation(projects.feature.widget) @@ -277,6 +278,9 @@ dependencies { googleImplementation(platform(libs.firebase.bom)) googleImplementation(libs.firebase.analytics) googleImplementation(libs.firebase.crashlytics) + googleImplementation(libs.firebase.ai) + googleImplementation(libs.firebase.ai.ondevice) + googleImplementation(libs.mlkit.translate) fdroidImplementation(libs.osmdroid.android) fdroidImplementation(libs.osmdroid.geopackage) { exclude(group = "com.j256.ormlite") } diff --git a/androidApp/src/fdroid/kotlin/org/meshtastic/app/di/FdroidAiModule.kt b/androidApp/src/fdroid/kotlin/org/meshtastic/app/di/FdroidAiModule.kt new file mode 100644 index 000000000..53edf9aca --- /dev/null +++ b/androidApp/src/fdroid/kotlin/org/meshtastic/app/di/FdroidAiModule.kt @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.meshtastic.app.di + +import org.koin.core.annotation.Module +import org.koin.core.annotation.Single +import org.meshtastic.feature.docs.ai.AIDocAssistant +import org.meshtastic.feature.docs.ai.KeywordFallbackAssistant +import org.meshtastic.feature.docs.translation.DocTranslationService +import org.meshtastic.feature.docs.translation.NoOpDocTranslator + +/** Provides keyword-only fallback AI assistant for the F-Droid flavor (no on-device model). */ +@Module +class FdroidAiModule { + @Single fun aiDocAssistant(fallback: KeywordFallbackAssistant): AIDocAssistant = fallback + + @Single fun docTranslationService(): DocTranslationService = NoOpDocTranslator() +} diff --git a/androidApp/src/fdroid/kotlin/org/meshtastic/app/di/FlavorModule.kt b/androidApp/src/fdroid/kotlin/org/meshtastic/app/di/FlavorModule.kt index 5a192d437..6e797e952 100644 --- a/androidApp/src/fdroid/kotlin/org/meshtastic/app/di/FlavorModule.kt +++ b/androidApp/src/fdroid/kotlin/org/meshtastic/app/di/FlavorModule.kt @@ -18,5 +18,5 @@ package org.meshtastic.app.di import org.koin.core.annotation.Module -@Module(includes = [FDroidNetworkModule::class]) +@Module(includes = [FDroidNetworkModule::class, FdroidAiModule::class]) class FlavorModule diff --git a/androidApp/src/google/kotlin/org/meshtastic/app/ai/GeminiNanoDocAssistant.kt b/androidApp/src/google/kotlin/org/meshtastic/app/ai/GeminiNanoDocAssistant.kt new file mode 100644 index 000000000..c6848b5e0 --- /dev/null +++ b/androidApp/src/google/kotlin/org/meshtastic/app/ai/GeminiNanoDocAssistant.kt @@ -0,0 +1,470 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.meshtastic.app.ai + +import co.touchlab.kermit.Logger +import com.google.firebase.Firebase +import com.google.firebase.ai.Chat +import com.google.firebase.ai.DownloadStatus +import com.google.firebase.ai.InferenceMode +import com.google.firebase.ai.OnDeviceConfig +import com.google.firebase.ai.OnDeviceModelStatus +import com.google.firebase.ai.ai +import com.google.firebase.ai.type.GenerativeBackend +import com.google.firebase.ai.type.PublicPreviewAPI +import com.google.firebase.ai.type.Tool +import com.google.firebase.ai.type.content +import org.meshtastic.feature.docs.ai.AIDocAssistant +import org.meshtastic.feature.docs.data.DocBundleLoader +import org.meshtastic.feature.docs.data.KeywordSearchEngine +import org.meshtastic.feature.docs.model.AIDocAssistantResult +import org.meshtastic.feature.docs.model.DocPage +import org.meshtastic.feature.docs.model.DocsAiError + +/** + * Gemini on-device AI assistant for the Google flavor. + * + * Uses Firebase AI Logic hybrid SDK with [InferenceMode.ONLY_ON_DEVICE] for fast first-message answers, and a cloud + * model with URL context grounding for follow-up conversation. Supported on Pixel 9+, Samsung Galaxy S25/S26, OnePlus + * 13/15, and other devices with AICore. + * + * Context strategy: extracts only the **most relevant paragraphs** from each page (those containing query terms), + * strips markdown formatting to maximize information density, and fits within the on-device token budget (~4K tokens). + * This ensures fast, offline-capable answers even without cloud fallback. + * + * @see Firebase AI Logic Hybrid + */ +@OptIn(PublicPreviewAPI::class) +class GeminiNanoDocAssistant(private val searchEngine: KeywordSearchEngine, private val bundleLoader: DocBundleLoader) : + AIDocAssistant { + + /** On-device model for fast first-message answers grounded in bundled docs. */ + private val onDeviceModel by lazy { + Firebase.ai(backend = GenerativeBackend.googleAI()) + .generativeModel( + modelName = MODEL_NAME, + systemInstruction = content { text(SYSTEM_INSTRUCTION) }, + onDeviceConfig = OnDeviceConfig(mode = InferenceMode.ONLY_ON_DEVICE), + ) + } + + /** Cloud model with URL context — fetches only from meshtastic.org and github.com/meshtastic. */ + private val groundedModel by lazy { + Firebase.ai(backend = GenerativeBackend.googleAI()) + .generativeModel( + modelName = MODEL_NAME, + systemInstruction = content { text(SYSTEM_INSTRUCTION) }, + tools = listOf(Tool.urlContext()), + ) + } + + /** Active multi-turn chat session. Maintains conversation history across messages. */ + private var chatSession: Chat? = null + private var messageCount = 0 + + override suspend fun isSupported(): Boolean = try { + // Always supported on Google flavor — cloud model with Google Search grounding is always available. + // On-device model provides faster/offline answers when available; check status to trigger download. + val ext = onDeviceModel.onDeviceExtension + val status = ext?.checkStatus() + Logger.d(tag = TAG) { "On-device model status: $status" } + when (status) { + OnDeviceModelStatus.AVAILABLE -> true + + OnDeviceModelStatus.DOWNLOADING -> true + + OnDeviceModelStatus.DOWNLOADABLE -> { + Logger.i(tag = TAG) { "Model downloadable — requesting download" } + ext.download().collect { downloadStatus -> + when (downloadStatus) { + is DownloadStatus.DownloadStarted -> + Logger.d(tag = TAG) { "Download started: ${downloadStatus.bytesToDownload} bytes" } + + is DownloadStatus.DownloadInProgress -> + Logger.d(tag = TAG) { + "Download progress: ${downloadStatus.totalBytesDownloaded} bytes" + } + + is DownloadStatus.DownloadCompleted -> Logger.i(tag = TAG) { "Model download completed" } + + is DownloadStatus.DownloadFailed -> + Logger.w(tag = TAG) { "Model download failed: $downloadStatus" } + } + } + true + } + + else -> true // Cloud grounded model is always available even without on-device support. + } + } catch (e: Exception) { + Logger.w(tag = TAG) { "isSupported() check failed, using cloud only: ${e.message}" } + true // Cloud grounded model is always available. + } + + @Suppress("TooGenericExceptionCaught") + override suspend fun answer(question: String, currentPageId: String?): AIDocAssistantResult = try { + val bundle = bundleLoader.load() + val queryTerms = extractQueryTerms(question) + + // Load all page content for full-text search ranking. + val allContent = bundle.pages.associateWith { page -> bundleLoader.readPage(page.id)?.markdown.orEmpty() } + + // Rank pages by relevance: full-text content search + keyword/title matching. + val rankedPages = rankPagesByRelevance(queryTerms, bundle.pages, allContent) + Logger.d(tag = TAG) { "Ranked pages: ${rankedPages.take(5).map { "${it.first.id}(${it.second})" }}" } + + // Build compact context by extracting only relevant paragraphs. + val contextResult = buildContext(currentPageId, queryTerms, rankedPages, allContent, MAX_CONTEXT_CHARS) + Logger.d(tag = TAG) { + "Context: ${contextResult.parts.size} pages, ${contextResult.totalChars} chars (budget $MAX_CONTEXT_CHARS)" + } + + val prompt = buildPrompt(question, contextResult.parts) + Logger.d(tag = TAG) { "Prompt: ${prompt.length} chars, message #$messageCount" } + + val chatResult = generateWithChat(prompt) + messageCount++ + Logger.d(tag = TAG) { "Response (${chatResult.answer.length} chars): ${chatResult.answer.take(200)}" } + + // Merge context pages with any pages mentioned by title in the response (à la Meshtastic-Apple). + val mentionedPages = + bundle.pages.filter { page -> + page.id !in contextResult.usedPageIds && chatResult.answer.contains(page.title, ignoreCase = true) + } + val allSourcePages = + contextResult.usedPageIds.mapNotNull { id -> bundle.pages.find { it.id == id } } + mentionedPages + + AIDocAssistantResult.Success( + answer = chatResult.answer, + sourcePages = allSourcePages, + usedOnDeviceModel = chatResult.usedOnDevice, + ) + } catch (e: Exception) { + Logger.w(tag = TAG) { "Inference failed: ${e.message}" } + val errorType = + when { + e.message?.contains("BUSY", ignoreCase = true) == true -> DocsAiError.Busy + e.message?.contains("BATTERY", ignoreCase = true) == true -> DocsAiError.Busy + e.message?.contains("BACKGROUND", ignoreCase = true) == true -> DocsAiError.Busy + e.message?.contains("UNAVAILABLE", ignoreCase = true) == true -> DocsAiError.ModelUnavailable + else -> DocsAiError.Unknown + } + val fallbackPages = searchEngine.selectForTokenBudget(question, maxChars = MAX_CONTEXT_CHARS) + AIDocAssistantResult.Error(reason = errorType, suggestedPages = fallbackPages) + } + + override fun resetSession() { + chatSession = null + messageCount = 0 + Logger.d(tag = TAG) { "Chat session reset" } + } + + /** Result from [generateWithChat] indicating which model produced the answer. */ + private data class ChatResult(val answer: String, val usedOnDevice: Boolean) + + /** + * Uses the Chat API for multi-turn conversation. First message tries on-device for speed; all messages also go + * through the cloud chat session to maintain conversation history for follow-ups. + */ + private suspend fun generateWithChat(prompt: String): ChatResult { + val chat = chatSession ?: groundedModel.startChat().also { chatSession = it } + + // First message: try on-device in parallel for speed, use cloud chat as primary. + if (messageCount == 0) { + val onDeviceAnswer = + try { + val response = onDeviceModel.generateContent(prompt) + response.text?.trimEnd() + } catch (e: Exception) { + Logger.d(tag = TAG) { "On-device inference failed: ${e.message}" } + null + } + + // If on-device gave a good answer, send it to chat as history context and return it. + if (onDeviceAnswer != null && !looksLikeNoAnswer(onDeviceAnswer)) { + // Still send to cloud chat so it has context for follow-ups (fire and forget). + try { + val groundedPrompt = prompt + MESHTASTIC_URL_HINT + chat.sendMessage(groundedPrompt) + } catch (e: Exception) { + Logger.d(tag = TAG) { "Cloud chat seeding failed (non-fatal): ${e.message}" } + } + return ChatResult(answer = onDeviceAnswer, usedOnDevice = true) + } + } + + // Use cloud chat (maintains full conversation history for follow-ups). + val groundedPrompt = prompt + MESHTASTIC_URL_HINT + val response = chat.sendMessage(groundedPrompt) + return ChatResult( + answer = response.text?.trimEnd() ?: "I wasn't able to generate a response.", + usedOnDevice = false, + ) + } + + /** Heuristic: detect when the model says it can't find the answer in the provided docs. */ + private fun looksLikeNoAnswer(answer: String): Boolean { + val lower = answer.lowercase() + return lower.contains("not in the docs") || + lower.contains("not found in") || + lower.contains("i don't have information") || + lower.contains("i couldn't find") || + lower.contains("not covered in the documentation") + } + + private data class ContextResult(val parts: List, val usedPageIds: Set, val totalChars: Int) + + /** Builds context parts from ranked pages within the given char budget. */ + private fun buildContext( + currentPageId: String?, + queryTerms: List, + rankedPages: List>, + allContent: Map, + budget: Int, + ): ContextResult { + val usedPageIds = mutableSetOf() + val contextParts = mutableListOf() + var totalChars = 0 + + // Current page gets priority. + if (currentPageId != null) { + val content = allContent.entries.find { it.key.id == currentPageId } + if (content != null && content.value.isNotBlank()) { + val pageBudget = MAX_PAGE_CHARS.coerceAtMost(budget) + val extracted = extractRelevantContent(content.key.title, content.value, queryTerms, pageBudget) + if (extracted.isNotBlank()) { + contextParts.add(extracted) + totalChars += extracted.length + usedPageIds.add(currentPageId) + } + } + } + + // Add relevant paragraphs from top-ranked pages within budget. + for ((page, _) in rankedPages) { + if (page.id in usedPageIds) continue + if (totalChars >= budget) break + val pageContent = allContent[page] ?: continue + if (pageContent.isBlank()) continue + + val snippetBudget = (budget - totalChars).coerceAtMost(MAX_SNIPPET_CHARS) + if (snippetBudget < MIN_USEFUL_SNIPPET) break + + val extracted = extractRelevantContent(page.title, pageContent, queryTerms, snippetBudget) + if (extracted.isNotBlank()) { + contextParts.add(extracted) + totalChars += extracted.length + usedPageIds.add(page.id) + } + } + + return ContextResult(parts = contextParts, usedPageIds = usedPageIds, totalChars = totalChars) + } + + /** Extracts query terms from a question, filtering short/stop words. */ + private fun extractQueryTerms(question: String): List = question + .lowercase() + .replace(Regex("[^\\p{L}\\p{N}\\s-]"), " ") + .split(Regex("\\s+")) + .filter { it.length >= 2 && it !in STOP_WORDS } + .distinct() + + /** + * Extracts the most relevant content from a page: the paragraphs that contain query terms, with markdown formatting + * stripped for maximum information density. + */ + private fun extractRelevantContent( + title: String, + markdown: String, + queryTerms: List, + maxChars: Int, + ): String { + val plainText = stripMarkdown(markdown) + + // Split into paragraphs (double newline or section breaks). + val paragraphs = plainText.split(Regex("\n{2,}")).map { it.trim() }.filter { it.length >= MIN_PARAGRAPH_LEN } + + // Score each paragraph by how many query terms it contains. + val scored = + paragraphs.map { paragraph -> + val lower = paragraph.lowercase() + val hits = queryTerms.count { term -> lower.contains(term) } + paragraph to hits + } + + // Take paragraphs with hits first (sorted by hits desc), then fill with top paragraphs for context. + val withHits = scored.filter { it.second > 0 }.sortedByDescending { it.second } + val withoutHits = scored.filter { it.second == 0 } + + val result = StringBuilder("$title: ") + for ((paragraph, _) in withHits + withoutHits) { + if (result.length + paragraph.length + 1 > maxChars) { + // Try to fit a truncated version if we have room. + val remaining = maxChars - result.length - 1 + if (remaining > MIN_USEFUL_SNIPPET) { + result.append(paragraph.take(remaining)) + } + break + } + result.append(paragraph).append('\n') + } + return result.toString().trim() + } + + /** Strips markdown formatting to produce dense plain text. */ + private fun stripMarkdown(markdown: String): String = markdown + .replace(Regex("^#{1,6}\\s+", RegexOption.MULTILINE), "") // headers + .replace(Regex("\\[([^]]+)]\\([^)]+\\)"), "$1") // links → text + .replace(Regex("!\\[([^]]*)]\\([^)]+\\)"), "$1") // images → alt + .replace(Regex("[*_]{1,3}([^*_]+)[*_]{1,3}"), "$1") // bold/italic + .replace(Regex("`{1,3}[^`]*`{1,3}"), "") // inline code + .replace(Regex("^[>|\\-*+]\\s?", RegexOption.MULTILINE), "") // block quotes, lists + .replace(Regex("\\|"), " ") // table pipes + .replace(Regex("-{3,}"), "") // horizontal rules + .replace(Regex(" {2,}"), " ") // collapse whitespace + .trim() + + /** + * Ranks pages by relevance using full-text content search + keyword/title matching. Returns pages sorted by score + * descending, filtering out zero-score pages. + */ + private fun rankPagesByRelevance( + queryTerms: List, + pages: List, + allContent: Map, + ): List> = pages + .map { page -> + var score = 0 + val content = allContent[page]?.lowercase().orEmpty() + + for (term in queryTerms) { + if (content.contains(term)) score += CONTENT_MATCH_SCORE + if (page.title.lowercase().contains(term)) score += TITLE_MATCH_SCORE + if (page.keywords.any { it.lowercase().contains(term) }) score += KEYWORD_MATCH_SCORE + if (page.aliases.any { it.lowercase().contains(term) }) score += ALIAS_MATCH_SCORE + } + + page to score + } + .filter { it.second > 0 } + .sortedByDescending { it.second } + + private fun buildPrompt(question: String, contextParts: List): String { + val context = + if (contextParts.isNotEmpty()) { + contextParts.joinToString("\n\n") + } else { + FALLBACK_CONTEXT + } + return """ + |Bundled app documentation: + |$context + | + |User question: $question + """ + .trimMargin() + } + + companion object { + private const val TAG = "ChirpyAI" + + /** Gemini 3.1 Flash-Lite — latest stable model (2026-05-07), free tier, supports grounding. */ + private const val MODEL_NAME = "gemini-3.1-flash-lite" + + private const val SYSTEM_INSTRUCTION = + """You are Chirpy, the friendly AI assistant built into the Meshtastic Android app. You help users understand mesh networking, configure their Meshtastic nodes, troubleshoot connectivity issues, and get the most out of the Meshtastic ecosystem. + +Personality: Helpful, concise, enthusiastic about mesh networking. Use short paragraphs. Include relevant emoji sparingly (📡 🔋 📍). + +Knowledge sources (in priority order): +1. Bundled app documentation provided as context below +2. Official Meshtastic documentation at meshtastic.org/docs +3. Official Meshtastic GitHub repositories (github.com/meshtastic) +4. General LoRa/mesh networking knowledge + +Guidelines: +- Answer the user's question directly and helpfully +- When the bundled docs cover the topic, cite them +- When the bundled docs don't cover it, use your knowledge of official Meshtastic sources — don't refuse to help +- Only reference official Meshtastic sources (meshtastic.org, github.com/meshtastic) — never cite random forums, blogs, or third-party sites +- For firmware-specific or hardware-specific questions beyond app scope, point users to meshtastic.org/docs +- Keep answers concise (2-4 short paragraphs max) unless the user asks for detail +- If you're truly unsure about something Meshtastic-specific, say so honestly rather than guessing""" + + /** Total context char budget — sized for on-device Nano (~4K tokens ≈ 10K chars for context + prompt). */ + private const val MAX_CONTEXT_CHARS = 8_000 + + /** Max chars for the current page (gets priority). */ + private const val MAX_PAGE_CHARS = 4_000 + + /** Max chars per additional page snippet. */ + private const val MAX_SNIPPET_CHARS = 2_000 + + /** Minimum useful snippet size — don't bother with tiny fragments. */ + private const val MIN_USEFUL_SNIPPET = 100 + + /** Minimum paragraph length to consider. */ + private const val MIN_PARAGRAPH_LEN = 20 + + // Scoring weights for page ranking + private const val CONTENT_MATCH_SCORE = 3 + private const val TITLE_MATCH_SCORE = 10 + private const val KEYWORD_MATCH_SCORE = 7 + private const val ALIAS_MATCH_SCORE = 5 + + private val STOP_WORDS = + setOf( + "the", + "is", + "at", + "in", + "on", + "to", + "of", + "an", + "it", + "do", + "me", + "my", + "or", + "if", + "be", + "as", + "by", + "so", + "we", + "he", + "up", + "no", + "am", + "us", + ) + + private const val FALLBACK_CONTEXT = + "Meshtastic is an open-source mesh networking platform for LoRa radios. " + + "The app connects to Meshtastic devices via Bluetooth or WiFi to send messages, " + + "share location, and manage mesh network settings like channels, nodes, and modules." + + /** URLs appended to prompts for the cloud model to leverage URL context tool. Only official sources. */ + private const val MESHTASTIC_URL_HINT = + "\n\nFor additional context, you may reference these official sources:" + + "\n- https://meshtastic.org/docs/" + + "\n- https://github.com/meshtastic/Meshtastic-Android" + + "\n- https://github.com/meshtastic/firmware" + + "\n- https://github.com/meshtastic/protobufs" + } +} diff --git a/androidApp/src/google/kotlin/org/meshtastic/app/di/FlavorModule.kt b/androidApp/src/google/kotlin/org/meshtastic/app/di/FlavorModule.kt index 802f3b150..20fe0bff6 100644 --- a/androidApp/src/google/kotlin/org/meshtastic/app/di/FlavorModule.kt +++ b/androidApp/src/google/kotlin/org/meshtastic/app/di/FlavorModule.kt @@ -19,5 +19,5 @@ package org.meshtastic.app.di import org.koin.core.annotation.Module import org.meshtastic.app.map.prefs.di.GoogleMapsKoinModule -@Module(includes = [GoogleNetworkModule::class, GoogleMapsKoinModule::class]) +@Module(includes = [GoogleNetworkModule::class, GoogleMapsKoinModule::class, GoogleAiModule::class]) class FlavorModule diff --git a/androidApp/src/google/kotlin/org/meshtastic/app/di/GoogleAiModule.kt b/androidApp/src/google/kotlin/org/meshtastic/app/di/GoogleAiModule.kt new file mode 100644 index 000000000..12e623599 --- /dev/null +++ b/androidApp/src/google/kotlin/org/meshtastic/app/di/GoogleAiModule.kt @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.meshtastic.app.di + +import android.content.Context +import okio.Path.Companion.toOkioPath +import org.koin.core.annotation.Module +import org.koin.core.annotation.Single +import org.meshtastic.app.ai.GeminiNanoDocAssistant +import org.meshtastic.app.translation.MlKitDocTranslator +import org.meshtastic.feature.docs.ai.AIDocAssistant +import org.meshtastic.feature.docs.data.DocBundleLoader +import org.meshtastic.feature.docs.data.KeywordSearchEngine +import org.meshtastic.feature.docs.translation.DocTranslationCache +import org.meshtastic.feature.docs.translation.DocTranslationService + +/** Provides the on-device Gemini Nano AI assistant for the Google flavor. */ +@Module +class GoogleAiModule { + @Single + fun aiDocAssistant(searchEngine: KeywordSearchEngine, bundleLoader: DocBundleLoader): AIDocAssistant = + GeminiNanoDocAssistant(searchEngine, bundleLoader) + + @Single + fun docTranslationCache(context: Context): DocTranslationCache = + DocTranslationCache(cacheDir = context.cacheDir.toOkioPath()) + + @Single fun docTranslationService(cache: DocTranslationCache): DocTranslationService = MlKitDocTranslator(cache) +} diff --git a/androidApp/src/google/kotlin/org/meshtastic/app/translation/MlKitDocTranslator.kt b/androidApp/src/google/kotlin/org/meshtastic/app/translation/MlKitDocTranslator.kt new file mode 100644 index 000000000..5ac72334e --- /dev/null +++ b/androidApp/src/google/kotlin/org/meshtastic/app/translation/MlKitDocTranslator.kt @@ -0,0 +1,136 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.meshtastic.app.translation + +import co.touchlab.kermit.Logger +import com.google.mlkit.common.model.DownloadConditions +import com.google.mlkit.common.model.RemoteModelManager +import com.google.mlkit.nl.translate.TranslateLanguage +import com.google.mlkit.nl.translate.TranslateRemoteModel +import com.google.mlkit.nl.translate.Translation +import com.google.mlkit.nl.translate.TranslatorOptions +import kotlinx.coroutines.suspendCancellableCoroutine +import org.meshtastic.feature.docs.translation.DocTranslationCache +import org.meshtastic.feature.docs.translation.DocTranslationService +import org.meshtastic.feature.docs.translation.DownloadResult +import org.meshtastic.feature.docs.translation.MarkdownTranslationSegmenter +import org.meshtastic.feature.docs.translation.TranslationResult +import org.meshtastic.feature.docs.translation.md5Hash +import kotlin.coroutines.resume + +/** + * ML Kit-powered document translation service for the Google flavor. + * + * Downloads language models on-demand (~30MB each) and translates markdown content while preserving structure via + * [MarkdownTranslationSegmenter]. + */ +class MlKitDocTranslator(private val cache: DocTranslationCache) : DocTranslationService { + + private val modelManager = RemoteModelManager.getInstance() + + override suspend fun translatePage(pageId: String, markdown: String, targetLocale: String): TranslationResult { + val sourceHash = md5Hash(markdown) + + // Check cache first + cache.get(pageId, targetLocale, sourceHash)?.let { cached -> + return TranslationResult.Success(cached) + } + + // Check if language is supported by ML Kit + val targetLang = TranslateLanguage.fromLanguageTag(targetLocale) ?: return TranslationResult.Unavailable + + // Auto-download model if not present + if (!isModelDownloaded(targetLang)) { + Logger.i(tag = "MlKitDocTranslator") { + "Downloading model for $targetLocale (~${ESTIMATED_MODEL_SIZE_MB}MB)" + } + val downloadResult = downloadLanguageModel(targetLocale) + if (downloadResult is DownloadResult.Failed) { + Logger.w(tag = "MlKitDocTranslator") { "Model download failed: ${downloadResult.reason}" } + return TranslationResult.ModelDownloadRequired(targetLocale, ESTIMATED_MODEL_SIZE_MB) + } + } + + // Perform translation + return try { + val options = + TranslatorOptions.Builder() + .setSourceLanguage(TranslateLanguage.ENGLISH) + .setTargetLanguage(targetLang) + .build() + + val translator = Translation.getClient(options) + try { + val translated = + MarkdownTranslationSegmenter.translateMarkdown(markdown) { text -> + suspendCancellableCoroutine { cont -> + translator + .translate(text) + .addOnSuccessListener { cont.resume(it) } + .addOnFailureListener { e -> + Logger.w(tag = "MlKitDocTranslator") { + "Segment translation failed, using source: ${e.message}" + } + cont.resume(text) + } + } + } + + // Cache the result + cache.put(pageId, targetLocale, sourceHash, translated) + TranslationResult.Success(translated) + } finally { + translator.close() + } + } catch (e: Exception) { + Logger.w(tag = "MlKitDocTranslator") { "Translation failed for $pageId to $targetLocale: ${e.message}" } + TranslationResult.Unavailable + } + } + + override suspend fun isLanguageAvailable(locale: String): Boolean { + val lang = TranslateLanguage.fromLanguageTag(locale) ?: return false + return isModelDownloaded(lang) + } + + override suspend fun downloadLanguageModel(locale: String): DownloadResult { + val lang = + TranslateLanguage.fromLanguageTag(locale) ?: return DownloadResult.Failed("Unsupported language: $locale") + + val model = TranslateRemoteModel.Builder(lang).build() + val conditions = DownloadConditions.Builder().build() + + return suspendCancellableCoroutine { cont -> + modelManager + .download(model, conditions) + .addOnSuccessListener { cont.resume(DownloadResult.Success) } + .addOnFailureListener { e -> cont.resume(DownloadResult.Failed(e.message ?: "Download failed")) } + } + } + + private suspend fun isModelDownloaded(lang: String): Boolean = suspendCancellableCoroutine { cont -> + val model = TranslateRemoteModel.Builder(lang).build() + modelManager + .isModelDownloaded(model) + .addOnSuccessListener { cont.resume(it) } + .addOnFailureListener { cont.resume(false) } + } + + companion object { + private const val ESTIMATED_MODEL_SIZE_MB = 30 + } +} diff --git a/androidApp/src/main/kotlin/org/meshtastic/app/di/AppKoinModule.kt b/androidApp/src/main/kotlin/org/meshtastic/app/di/AppKoinModule.kt index 09f38eaef..36b7a242a 100644 --- a/androidApp/src/main/kotlin/org/meshtastic/app/di/AppKoinModule.kt +++ b/androidApp/src/main/kotlin/org/meshtastic/app/di/AppKoinModule.kt @@ -47,6 +47,7 @@ import org.meshtastic.core.service.di.CoreServiceModule import org.meshtastic.core.takserver.di.CoreTakServerModule import org.meshtastic.core.ui.di.CoreUiModule import org.meshtastic.feature.connections.di.FeatureConnectionsModule +import org.meshtastic.feature.docs.di.FeatureDocsModule import org.meshtastic.feature.firmware.di.FeatureFirmwareModule import org.meshtastic.feature.intro.di.FeatureIntroModule import org.meshtastic.feature.map.di.FeatureMapModule @@ -85,6 +86,7 @@ import org.meshtastic.feature.wifiprovision.di.FeatureWifiProvisionModule FeatureConnectionsModule::class, FeatureMapModule::class, FeatureSettingsModule::class, + FeatureDocsModule::class, FeatureFirmwareModule::class, FeatureIntroModule::class, FeatureWidgetModule::class, diff --git a/androidApp/src/main/kotlin/org/meshtastic/app/ui/Main.kt b/androidApp/src/main/kotlin/org/meshtastic/app/ui/Main.kt index 9177c7edb..ec8dab03e 100644 --- a/androidApp/src/main/kotlin/org/meshtastic/app/ui/Main.kt +++ b/androidApp/src/main/kotlin/org/meshtastic/app/ui/Main.kt @@ -43,6 +43,7 @@ import org.meshtastic.core.ui.component.MeshtasticNavDisplay import org.meshtastic.core.ui.component.MeshtasticNavigationSuite import org.meshtastic.core.ui.viewmodel.UIViewModel import org.meshtastic.feature.connections.navigation.connectionsGraph +import org.meshtastic.feature.docs.navigation.docsEntries import org.meshtastic.feature.firmware.navigation.firmwareGraph import org.meshtastic.feature.map.navigation.mapGraph import org.meshtastic.feature.messaging.navigation.contactsGraph @@ -88,6 +89,7 @@ fun MainScreen() { channelsGraph(backStack) connectionsGraph(backStack) settingsGraph(backStack) + docsEntries(backStack) firmwareGraph(backStack) wifiProvisionGraph(backStack) } diff --git a/androidApp/src/test/kotlin/org/meshtastic/app/di/KoinVerificationTest.kt b/androidApp/src/test/kotlin/org/meshtastic/app/di/KoinVerificationTest.kt index fd4b7aba8..0aa9d2f41 100644 --- a/androidApp/src/test/kotlin/org/meshtastic/app/di/KoinVerificationTest.kt +++ b/androidApp/src/test/kotlin/org/meshtastic/app/di/KoinVerificationTest.kt @@ -60,6 +60,8 @@ class KoinVerificationTest { // declared as known types even though they're never resolved from the graph. BleLogLevel::class, BleLogFormat::class, + okio.Path::class, + okio.FileSystem::class, ), injections = injectedParameters( diff --git a/build-logic/convention/build.gradle.kts b/build-logic/convention/build.gradle.kts index 09c00abb7..87fa2f3d0 100644 --- a/build-logic/convention/build.gradle.kts +++ b/build-logic/convention/build.gradle.kts @@ -194,6 +194,11 @@ gradlePlugin { implementationClass = "RootConventionPlugin" } + register("docs") { + id = "meshtastic.docs" + implementationClass = "org.meshtastic.buildlogic.DocsTasks" + } + register("publishing") { id = "meshtastic.publishing" implementationClass = "PublishingConventionPlugin" diff --git a/build-logic/convention/src/main/kotlin/RootConventionPlugin.kt b/build-logic/convention/src/main/kotlin/RootConventionPlugin.kt index 135306af6..140f3eaef 100644 --- a/build-logic/convention/src/main/kotlin/RootConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/RootConventionPlugin.kt @@ -67,9 +67,16 @@ private fun Project.registerKmpSmokeCompileTask() { dependsOn("$path:compileKotlinJvm") dependsOn("$path:compileKotlinIosSimulatorArm64") } + + // Compile androidDeviceTest sources so instrumented test breakages are caught early. + // These tests require a device/emulator to *run*, but compilation alone is cheap. + DEVICE_TEST_MODULES.forEach { path -> dependsOn("$path:compileAndroidDeviceTest") } } } +/** KMP modules that declare `withDeviceTest {}` and therefore have `compileAndroidDeviceTest` tasks. */ +private val DEVICE_TEST_MODULES = listOf(":core:database", ":core:model") + /** All modules included in `settings.gradle.kts`. Update this list when adding or removing modules. */ private val ALL_MODULES_FULL = listOf( diff --git a/build-logic/convention/src/main/kotlin/org/meshtastic/buildlogic/AndroidInstrumentedTests.kt b/build-logic/convention/src/main/kotlin/org/meshtastic/buildlogic/AndroidInstrumentedTests.kt index 5b37c9765..168aeed1e 100644 --- a/build-logic/convention/src/main/kotlin/org/meshtastic/buildlogic/AndroidInstrumentedTests.kt +++ b/build-logic/convention/src/main/kotlin/org/meshtastic/buildlogic/AndroidInstrumentedTests.kt @@ -20,12 +20,17 @@ import com.android.build.api.variant.LibraryAndroidComponentsExtension import org.gradle.api.Project /** - * Disable unnecessary Android instrumented tests for the [project] if there is no `androidTest` folder. Otherwise, - * these projects would be compiled, packaged, installed and ran only to end-up with the following message: + * Disable unnecessary Android instrumented tests for the [project] if there is no `androidTest` or `androidDeviceTest` + * folder. Otherwise, these projects would be compiled, packaged, installed and ran only to end-up with the following + * message: * > Starting 0 tests on AVD * * Note: this could be improved by checking other potential sourceSets based on buildTypes and flavors. */ internal fun LibraryAndroidComponentsExtension.disableUnnecessaryAndroidTests(project: Project) = beforeVariants { - it.androidTest.enable = it.androidTest.enable && project.projectDir.resolve("src/androidTest").exists() + it.androidTest.enable = it.androidTest.enable && + ( + project.projectDir.resolve("src/androidTest").exists() || + project.projectDir.resolve("src/androidDeviceTest").exists() + ) } diff --git a/build-logic/convention/src/main/kotlin/org/meshtastic/buildlogic/DocsTasks.kt b/build-logic/convention/src/main/kotlin/org/meshtastic/buildlogic/DocsTasks.kt new file mode 100644 index 000000000..450b05e3b --- /dev/null +++ b/build-logic/convention/src/main/kotlin/org/meshtastic/buildlogic/DocsTasks.kt @@ -0,0 +1,404 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.meshtastic.buildlogic + +import org.gradle.api.DefaultTask +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.api.file.DirectoryProperty +import org.gradle.api.file.RegularFileProperty +import org.gradle.api.provider.Property +import org.gradle.api.tasks.Input +import org.gradle.api.tasks.InputDirectory +import org.gradle.api.tasks.InputFile +import org.gradle.api.tasks.Optional +import org.gradle.api.tasks.OutputDirectory +import org.gradle.api.tasks.PathSensitivity +import org.gradle.api.tasks.TaskAction +import org.gradle.kotlin.dsl.register +import java.io.File + +/** + * Registers docs generation, validation, and publishing tasks. + * + * Tasks: + * - generateDocsBundle: Converts markdown to HTML + index.json + * - validateDocsBundle: Schema, size, and asset validation + * - publishDocsSite: Generates _site/ artifact for Pages + */ +class DocsTasks : Plugin { + override fun apply(project: Project) { + val docsDir = project.rootProject.layout.projectDirectory.dir("docs") + val outputDir = project.layout.buildDirectory.dir("generated/docs") + + project.tasks.register("generateDocsBundle") { + group = "documentation" + description = "Generate packaged docs artifacts and keyword index from markdown source." + sourceDir.set(docsDir) + generatedOutputDir.set(outputDir.map { it.dir("common") }) + channel.set(project.providers.gradleProperty("docs.channel").orElse("beta")) + version.set(project.providers.gradleProperty("docs.version").orElse("beta")) + } + + project.tasks.register("validateDocsBundle") { + group = "documentation" + description = "Validate keyword index schema, bundle size, and asset references." + dependsOn("generateDocsBundle") + bundleDir.set(outputDir.map { it.dir("common") }) + schemaFile.set( + project.rootProject.layout.projectDirectory + .file("specs/003-app-docs-markdown/contracts/keyword-index-schema.json") + ) + } + + project.tasks.register("publishDocsSite") { + group = "documentation" + description = "Assemble the final Pages artifact from generated docs." + dependsOn("generateDocsBundle") + sourceDir.set(docsDir) + bundleDir.set(outputDir.map { it.dir("common") }) + siteOutputDir.set(project.layout.buildDirectory.dir("_site")) + channel.set(project.providers.gradleProperty("docs.channel").orElse("beta")) + version.set(project.providers.gradleProperty("docs.version").orElse("beta")) + } + } +} + +abstract class GenerateDocsBundleTask : DefaultTask() { + @get:InputDirectory + abstract val sourceDir: DirectoryProperty + + @get:OutputDirectory + abstract val generatedOutputDir: DirectoryProperty + + @get:Input + abstract val channel: Property + + @get:Input + abstract val version: Property + + @TaskAction + fun generate() { + val src = sourceDir.get().asFile + val out = generatedOutputDir.get().asFile + out.mkdirs() + + val indexEntries = mutableListOf() + var pageCount = 0 + + // Process English user and developer directories + listOf("user", "developer").forEach { section -> + val sectionDir = File(src, section) + if (!sectionDir.exists()) return@forEach + + sectionDir.listFiles { f -> f.extension == "md" }?.sortedBy { it.name }?.forEach { mdFile -> + val frontmatter = parseFrontmatter(mdFile) + val id = mdFile.nameWithoutExtension + val title = frontmatter["title"] ?: id.replace("-", " ").replaceFirstChar { it.uppercase() } + val navOrder = frontmatter["nav_order"]?.toIntOrNull() ?: 999 + val aliases = parseListField(frontmatter["aliases_raw"] ?: "") + val keywords = extractKeywords(mdFile, title) + val charCount = mdFile.readText().length + + // Generate simple HTML wrapper + val htmlDir = File(out, "docs/$section") + htmlDir.mkdirs() + val htmlFile = File(htmlDir, "$id.html") + htmlFile.writeText(generateHtml(mdFile, title, "en")) + + // Build index entry + val keywordsJson = keywords.joinToString(", ") { "\"$it\"" } + val aliasesJson = aliases.joinToString(", ") { "\"$it\"" } + indexEntries.add(""" + | { + | "id": "$id", + | "title": "$title", + | "section": "$section", + | "locale": "en", + | "resourcePath": "docs/$section/$id.html", + | "navOrder": $navOrder, + | "keywords": [$keywordsJson], + | "aliases": [$aliasesJson], + | "charCount": $charCount + | } + """.trimMargin()) + + pageCount++ + } + } + + // Process Crowdin locale directories: docs/{qualifier}/user/*.md + // Crowdin %android_code% produces: fr, pt-rBR, zh-rCN, zh-rTW + val localePattern = Regex("^[a-z]{2,3}(-r[A-Z]{2})?$") + src.listFiles { f -> f.isDirectory && localePattern.matches(f.name) } + ?.sortedBy { it.name } + ?.forEach { localeDir -> + val locale = localeDir.name + listOf("user").forEach { section -> + val localeSectionDir = File(localeDir, section) + if (!localeSectionDir.exists()) return@forEach + + localeSectionDir.listFiles { f -> f.extension == "md" }?.sortedBy { it.name }?.forEach { mdFile -> + val frontmatter = parseFrontmatter(mdFile) + val id = mdFile.nameWithoutExtension + val title = frontmatter["title"] + ?: id.replace("-", " ").replaceFirstChar { it.uppercase() } + val navOrder = frontmatter["nav_order"]?.toIntOrNull() ?: 999 + val keywords = extractKeywords(mdFile, title) + val charCount = mdFile.readText().length + + // Generate locale-qualified HTML + val htmlDir = File(out, "docs/$locale/$section") + htmlDir.mkdirs() + val htmlFile = File(htmlDir, "$id.html") + htmlFile.writeText(generateHtml(mdFile, title, locale)) + + // Build locale index entry + val keywordsJson = keywords.joinToString(", ") { "\"$it\"" } + indexEntries.add(""" + | { + | "id": "$id", + | "title": "$title", + | "section": "$section", + | "locale": "$locale", + | "resourcePath": "docs/$locale/$section/$id.html", + | "navOrder": $navOrder, + | "keywords": [$keywordsJson], + | "aliases": [], + | "charCount": $charCount + | } + """.trimMargin()) + + pageCount++ + } + } + } + + // Write index.json + val indexFile = File(out, "index.json") + indexFile.writeText("[\n${indexEntries.joinToString(",\n")}\n]") + + // Write shared CSS + val cssDir = File(out, "docs/styles") + cssDir.mkdirs() + File(cssDir, "docs.css").writeText(generateCss()) + + // Write locales manifest (for consumers that need to know available translations) + val localesManifest = src.listFiles { f -> f.isDirectory && localePattern.matches(f.name) } + ?.map { it.name }?.sorted() ?: emptyList() + val manifestFile = File(out, "locales.json") + manifestFile.writeText(localesManifest.joinToString(", ", "[", "]") { "\"$it\"" }) + + logger.lifecycle("Generated docs bundle: $pageCount pages (${localesManifest.size} locales), channel=${channel.get()}, version=${version.get()}") + } + + private fun parseFrontmatter(file: File): Map { + val lines = file.readLines() + if (lines.firstOrNull()?.trim() != "---") return emptyMap() + val endIndex = lines.drop(1).indexOfFirst { it.trim() == "---" } + if (endIndex < 0) return emptyMap() + val fmLines = lines.subList(1, endIndex + 1) + val result = mutableMapOf() + var inAliases = false + val aliasesBuilder = StringBuilder() + for (line in fmLines) { + if (line.startsWith("aliases:")) { + inAliases = true + continue + } + if (inAliases) { + if (line.startsWith(" - ")) { + aliasesBuilder.append(line.removePrefix(" - ").trim()).append(",") + } else { + inAliases = false + result["aliases_raw"] = aliasesBuilder.toString().trimEnd(',') + } + } + if (!inAliases && line.contains(":")) { + val (key, value) = line.split(":", limit = 2) + result[key.trim()] = value.trim() + } + } + if (inAliases) result["aliases_raw"] = aliasesBuilder.toString().trimEnd(',') + return result + } + + private fun parseListField(raw: String): List = + raw.split(",").map { it.trim() }.filter { it.isNotEmpty() } + + private fun extractKeywords(file: File, title: String): List { + val text = file.readText().lowercase() + val keywords = mutableSetOf() + // Add title words + title.lowercase().split(Regex("[^a-z0-9]+")).filter { it.length >= 3 }.forEach { keywords.add(it) } + // Extract headings + Regex("^#{1,3}\\s+(.+)$", RegexOption.MULTILINE).findAll(text).forEach { match -> + match.groupValues[1].split(Regex("[^a-z0-9]+")).filter { it.length >= 3 }.forEach { keywords.add(it) } + } + return keywords.toList().take(30) + } + + private fun generateHtml(mdFile: File, title: String, locale: String = "en"): String { + val content = mdFile.readText() + // Strip frontmatter + .replace(Regex("^---[\\s\\S]*?---\\s*", RegexOption.MULTILINE), "") + .replace("&", "&").replace("<", "<").replace(">", ">") + val dir = if (locale == "ar") "rtl" else "ltr" + // Locale pages are one level deeper: docs/{locale}/user/foo.html vs docs/user/foo.html + val cssPath = if (locale != "en") "../../styles/docs.css" else "../styles/docs.css" + return """ + | + | + | + | + | + | $title + | + | + | + |
$content
+ | + | + """.trimMargin() + } + + private fun generateCss(): String = """ + |:root { + | --primary: #2C2D3C; + | --accent: #67EA94; + | --accent-text: #3FB86D; + | --info: #5C6BC0; + | --warning: #E8A33E; + | --error: #E05252; + |} + |body { + | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; + | line-height: 1.6; + | padding: 16px; + | color: var(--primary); + | max-width: 800px; + | margin: 0 auto; + |} + |@media (prefers-color-scheme: dark) { + | body { background: #1A1B26; color: #ECEDF3; } + | pre { background: #2C2D3C; } + |} + |pre.markdown-content { + | white-space: pre-wrap; + | word-wrap: break-word; + | font-family: inherit; + | background: transparent; + | padding: 0; + | margin: 0; + |} + |.callout-info { border-left: 4px solid var(--info); padding: 12px; background: #E8EAF6; margin: 12px 0; } + |.callout-warning { border-left: 4px solid var(--warning); padding: 12px; background: #FFF3E0; margin: 12px 0; } + |.callout-error { border-left: 4px solid var(--error); padding: 12px; background: #FDEAEA; margin: 12px 0; } + """.trimMargin() +} + +abstract class ValidateDocsBundleTask : DefaultTask() { + @get:InputDirectory + @get:Optional + abstract val bundleDir: DirectoryProperty + + @get:InputFile + @get:Optional + abstract val schemaFile: RegularFileProperty + + @TaskAction + fun validate() { + val dir = bundleDir.get().asFile + val indexFile = File(dir, "index.json") + + // Check index exists + if (!indexFile.exists()) { + throw org.gradle.api.GradleException("index.json not found in ${dir.absolutePath}") + } + + // Check index is valid JSON array + val indexContent = indexFile.readText() + if (!indexContent.trimStart().startsWith("[")) { + throw org.gradle.api.GradleException("index.json must be a JSON array") + } + + // Check bundle size + val totalSize = dir.walkTopDown().filter { it.isFile }.sumOf { it.length() } + val sizeMb = totalSize / (1024.0 * 1024.0) + + if (sizeMb > 10.0) { + throw org.gradle.api.GradleException("Bundle size ${String.format("%.2f", sizeMb)} MB exceeds 10 MB hard limit") + } + if (sizeMb > 8.0) { + logger.warn("WARNING: Bundle size ${String.format("%.2f", sizeMb)} MB exceeds 8 MB warning threshold") + } + + // Check all referenced pages exist + val pagePattern = Regex("\"resourcePath\"\\s*:\\s*\"([^\"]+)\"") + val referencedPaths = pagePattern.findAll(indexContent).map { it.groupValues[1] }.toList() + val missingPages = referencedPaths.filter { !File(dir, it).exists() } + if (missingPages.isNotEmpty()) { + throw org.gradle.api.GradleException("Missing page files: ${missingPages.joinToString()}") + } + + logger.lifecycle("Docs bundle validation PASSED: ${referencedPaths.size} pages, ${String.format("%.2f", sizeMb)} MB") + } +} + +abstract class PublishDocsSiteTask : DefaultTask() { + @get:InputDirectory + abstract val sourceDir: DirectoryProperty + + @get:InputDirectory + abstract val bundleDir: DirectoryProperty + + @get:OutputDirectory + abstract val siteOutputDir: DirectoryProperty + + @get:Input + abstract val channel: Property + + @get:Input + abstract val version: Property + + @TaskAction + fun publish() { + val siteDir = siteOutputDir.get().asFile + val channelPath = if (channel.get() == "release") "v${version.get()}" else channel.get() + val outDir = File(siteDir, channelPath) + outDir.mkdirs() + + // Copy generated bundle to site output + val bundle = bundleDir.get().asFile + bundle.copyRecursively(outDir, overwrite = true) + + // Copy source markdown for Jekyll processing + val src = sourceDir.get().asFile + src.listFiles()?.filter { it.name != "_site" && it.name != ".jekyll-cache" }?.forEach { f -> + if (f.isDirectory) f.copyRecursively(File(outDir, f.name), overwrite = true) + else f.copyTo(File(outDir, f.name), overwrite = true) + } + + logger.lifecycle("Published docs site to: ${outDir.absolutePath} (channel=$channelPath)") + } +} + + + + + + diff --git a/build.gradle.kts b/build.gradle.kts index 79f18eeec..8a6dfdaf6 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -40,6 +40,7 @@ plugins { alias(libs.plugins.test.retry) apply false alias(libs.plugins.flatpak.gradle.generator) alias(libs.plugins.meshtastic.root) + id("meshtastic.docs") } dependencies { diff --git a/core/common/src/androidMain/kotlin/org/meshtastic/core/common/util/LocaleUtils.android.kt b/core/common/src/androidMain/kotlin/org/meshtastic/core/common/util/LocaleUtils.android.kt index 77b83e42c..d610af483 100644 --- a/core/common/src/androidMain/kotlin/org/meshtastic/core/common/util/LocaleUtils.android.kt +++ b/core/common/src/androidMain/kotlin/org/meshtastic/core/common/util/LocaleUtils.android.kt @@ -21,6 +21,14 @@ import android.icu.util.ULocale import android.os.Build import java.util.Locale +actual fun currentLocaleCode(): String = Locale.getDefault().language + +actual fun currentLocaleQualifier(): String { + val locale = Locale.getDefault() + val country = locale.country + return if (country.isNotEmpty()) "${locale.language}-r$country" else locale.language +} + @Suppress("MagicNumber") actual fun getSystemMeasurementSystem(): MeasurementSystem { val locale = Locale.getDefault() diff --git a/core/common/src/commonMain/kotlin/org/meshtastic/core/common/util/MeasurementSystem.kt b/core/common/src/commonMain/kotlin/org/meshtastic/core/common/util/MeasurementSystem.kt index 531df0459..194478f18 100644 --- a/core/common/src/commonMain/kotlin/org/meshtastic/core/common/util/MeasurementSystem.kt +++ b/core/common/src/commonMain/kotlin/org/meshtastic/core/common/util/MeasurementSystem.kt @@ -24,3 +24,12 @@ enum class MeasurementSystem { /** returns the system's preferred measurement system. */ expect fun getSystemMeasurementSystem(): MeasurementSystem + +/** Returns the device's current locale as a 2-letter ISO 639-1 language code (e.g. "en", "es", "fr"). */ +expect fun currentLocaleCode(): String + +/** + * Returns the device locale as a CMP resource qualifier string. Examples: "pt-rBR", "zh-rCN", "fr" (no region when not + * specified). Use this to construct locale-qualified file resource paths like "files-$qualifier/docs/...". + */ +expect fun currentLocaleQualifier(): String diff --git a/core/common/src/iosMain/kotlin/org/meshtastic/core/common/util/NoopStubs.kt b/core/common/src/iosMain/kotlin/org/meshtastic/core/common/util/NoopStubs.kt index 7556105b3..621d52093 100644 --- a/core/common/src/iosMain/kotlin/org/meshtastic/core/common/util/NoopStubs.kt +++ b/core/common/src/iosMain/kotlin/org/meshtastic/core/common/util/NoopStubs.kt @@ -40,6 +40,10 @@ actual object DateFormatter { actual fun getSystemMeasurementSystem(): MeasurementSystem = MeasurementSystem.METRIC +actual fun currentLocaleCode(): String = "en" + +actual fun currentLocaleQualifier(): String = "en" + actual fun String?.isValidAddress(): Boolean = false actual interface CommonParcelable diff --git a/core/common/src/jvmMain/kotlin/org/meshtastic/core/common/util/JvmPlatformUtils.kt b/core/common/src/jvmMain/kotlin/org/meshtastic/core/common/util/JvmPlatformUtils.kt index d6092de3f..66f7dd07e 100644 --- a/core/common/src/jvmMain/kotlin/org/meshtastic/core/common/util/JvmPlatformUtils.kt +++ b/core/common/src/jvmMain/kotlin/org/meshtastic/core/common/util/JvmPlatformUtils.kt @@ -88,6 +88,14 @@ actual fun getSystemMeasurementSystem(): MeasurementSystem = else -> MeasurementSystem.METRIC } +actual fun currentLocaleCode(): String = Locale.getDefault().language + +actual fun currentLocaleQualifier(): String { + val locale = Locale.getDefault() + val country = locale.country + return if (country.isNotEmpty()) "${locale.language}-r$country" else locale.language +} + actual fun String?.isValidAddress(): Boolean { val value = this?.trim() return when { diff --git a/core/database/src/androidDeviceTest/kotlin/org/meshtastic/core/database/DatabaseManagerLegacyCleanupTest.kt b/core/database/src/androidDeviceTest/kotlin/org/meshtastic/core/database/DatabaseManagerLegacyCleanupTest.kt index 4aa88fc76..68dbb176c 100644 --- a/core/database/src/androidDeviceTest/kotlin/org/meshtastic/core/database/DatabaseManagerLegacyCleanupTest.kt +++ b/core/database/src/androidDeviceTest/kotlin/org/meshtastic/core/database/DatabaseManagerLegacyCleanupTest.kt @@ -18,6 +18,9 @@ package org.meshtastic.core.database import android.app.Application import android.content.Context +import androidx.datastore.preferences.core.booleanPreferencesKey +import androidx.datastore.preferences.core.edit +import androidx.datastore.preferences.preferencesDataStoreFile import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 import kotlinx.coroutines.Dispatchers @@ -27,6 +30,7 @@ import org.junit.Assert.assertFalse import org.junit.Assert.assertTrue import org.junit.Test import org.junit.runner.RunWith +import org.meshtastic.core.common.ContextServices import org.meshtastic.core.di.CoroutineDispatchers @RunWith(AndroidJUnit4::class) @@ -34,10 +38,13 @@ class DatabaseManagerLegacyCleanupTest { @Test fun deletes_legacy_db_on_switch_when_flag_not_set() = runBlocking { val app = ApplicationProvider.getApplicationContext() - val prefs = app.getSharedPreferences("db-manager-prefs", Context.MODE_PRIVATE) + ContextServices.app = app + val datastoreName = "db-manager-prefs-test-${System.nanoTime()}" + val datastore = createDatabaseDataStore(datastoreName) // Reset the one-time flag - prefs.edit().remove(DatabaseConstants.LEGACY_DB_CLEANED_KEY).apply() + val legacyCleanedKey = booleanPreferencesKey(DatabaseConstants.LEGACY_DB_CLEANED_KEY) + datastore.edit { it.remove(legacyCleanedKey) } // Ensure legacy DB file exists val legacyName = DatabaseConstants.LEGACY_DB_NAME @@ -48,7 +55,7 @@ class DatabaseManagerLegacyCleanupTest { val testDispatchers = CoroutineDispatchers(io = Dispatchers.IO, main = Dispatchers.Main, default = Dispatchers.Default) - val manager = DatabaseManager(app, testDispatchers) + val manager = DatabaseManager(datastore, testDispatchers) // Switch to a non-null address so active DB != legacy manager.switchActiveDatabase("01:23:45:67:89:AB") @@ -61,5 +68,8 @@ class DatabaseManagerLegacyCleanupTest { } assertFalse("Legacy DB should be deleted after switch", legacyFile.exists()) + + // Clean up + app.preferencesDataStoreFile(datastoreName).delete() } } diff --git a/core/database/src/androidDeviceTest/kotlin/org/meshtastic/core/database/MeshtasticDatabaseTest.kt b/core/database/src/androidDeviceTest/kotlin/org/meshtastic/core/database/MeshtasticDatabaseTest.kt index 1a918732e..4f4edeefe 100644 --- a/core/database/src/androidDeviceTest/kotlin/org/meshtastic/core/database/MeshtasticDatabaseTest.kt +++ b/core/database/src/androidDeviceTest/kotlin/org/meshtastic/core/database/MeshtasticDatabaseTest.kt @@ -18,12 +18,15 @@ package org.meshtastic.core.database import androidx.room3.Room import androidx.room3.testing.MigrationTestHelper +import androidx.sqlite.driver.bundled.BundledSQLiteDriver import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry +import kotlinx.coroutines.runBlocking import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith import org.meshtastic.core.database.MeshtasticDatabase.Companion.configureCommon +import java.io.File import java.io.IOException @RunWith(AndroidJUnit4::class) @@ -35,16 +38,21 @@ class MeshtasticDatabaseTest { @get:Rule val helper: MigrationTestHelper = - MigrationTestHelper(InstrumentationRegistry.getInstrumentation(), MeshtasticDatabase::class.java) + MigrationTestHelper( + instrumentation = InstrumentationRegistry.getInstrumentation(), + file = File("schemas"), + driver = BundledSQLiteDriver(), + databaseClass = MeshtasticDatabase::class, + ) @org.junit.Ignore("KMP Android Library does not package Room schemas into test assets currently") @Test @Throws(IOException::class) - fun migrateAll() { + fun migrateAll(): Unit = runBlocking { val context = InstrumentationRegistry.getInstrumentation().targetContext // Create earliest version of the database. - helper.createDatabase(TEST_DB, 3).apply { close() } + helper.createDatabase(version = 3).close() // Open latest version of the database. Room validates the schema // once all migrations execute. @@ -55,9 +63,6 @@ class MeshtasticDatabaseTest { ) .configureCommon() .build() - .apply { - openHelper.writableDatabase - close() - } + .close() } } diff --git a/core/navigation/src/commonMain/kotlin/org/meshtastic/core/navigation/DeepLinkRouter.kt b/core/navigation/src/commonMain/kotlin/org/meshtastic/core/navigation/DeepLinkRouter.kt index f88dabc60..9335b6a54 100644 --- a/core/navigation/src/commonMain/kotlin/org/meshtastic/core/navigation/DeepLinkRouter.kt +++ b/core/navigation/src/commonMain/kotlin/org/meshtastic/core/navigation/DeepLinkRouter.kt @@ -132,6 +132,7 @@ object DeepLinkRouter { } } + @Suppress("ReturnCount", "MagicNumber") private fun routeSettings(segments: List): List { var destNum: Int? = null var subRouteStr: String? = null @@ -153,6 +154,17 @@ object DeepLinkRouter { return listOf(SettingsRoute.Settings(destNum)) } + // Handle helpDocs/{pageId} pattern + if (subRouteStr == "helpdocs" || subRouteStr == "help-docs") { + val pageIdSegmentIndex = if (destNum != null) 3 else 2 + return if (segments.size > pageIdSegmentIndex) { + val pageId = segments[pageIdSegmentIndex] + listOf(SettingsRoute.Settings(destNum), SettingsRoute.HelpDocs, SettingsRoute.HelpDocPage(pageId)) + } else { + listOf(SettingsRoute.Settings(destNum), SettingsRoute.HelpDocs) + } + } + val subRoute = settingsSubRoutes[subRouteStr] return if (subRoute != null) { listOf(SettingsRoute.Settings(destNum), subRoute) @@ -210,6 +222,8 @@ object DeepLinkRouter { "debug-panel" to SettingsRoute.DebugPanel, "about" to SettingsRoute.About, "filter-settings" to SettingsRoute.FilterSettings, + "helpdocs" to SettingsRoute.HelpDocs, + "help-docs" to SettingsRoute.HelpDocs, ) private val nodeDetailSubRoutes: Map Route> = diff --git a/core/navigation/src/commonMain/kotlin/org/meshtastic/core/navigation/Routes.kt b/core/navigation/src/commonMain/kotlin/org/meshtastic/core/navigation/Routes.kt index a0df53eb3..9c140181a 100644 --- a/core/navigation/src/commonMain/kotlin/org/meshtastic/core/navigation/Routes.kt +++ b/core/navigation/src/commonMain/kotlin/org/meshtastic/core/navigation/Routes.kt @@ -167,6 +167,14 @@ sealed interface SettingsRoute : Route { @Serializable data object FilterSettings : SettingsRoute // endregion + + // region help & documentation routes + + @Serializable data object HelpDocs : SettingsRoute + + @Serializable data class HelpDocPage(val pageId: String) : SettingsRoute + + // endregion } @Serializable diff --git a/core/resources/src/commonMain/composeResources/values/strings.xml b/core/resources/src/commonMain/composeResources/values/strings.xml index ff6c6333b..26d831fe6 100644 --- a/core/resources/src/commonMain/composeResources/values/strings.xml +++ b/core/resources/src/commonMain/composeResources/values/strings.xml @@ -326,6 +326,47 @@ Distance Measurements Display the distance between your phone and other Meshtastic nodes with positions. DNS + + Clear search + bluetooth,usb,tcp,pairing,serial,wifi + desktop,linux,macos,windows,serial + discovery,topology,network,scan,neighbor + firmware,update,ota,flash,version,recovery + map,waypoint,gps,position,location,marker + formatter,metric,number,locale,temperature,conversion,api + message,channel,encryption,direct,broadcast,quick-chat + mqtt,broker,internet,bridge,uplink,downlink + metrics,telemetry,signal,snr,rssi,battery,traceroute + node,mesh,list,role,status,favorite,filter + setup,welcome,permissions,first-launch + module,serial,telemetry,canned,store-forward,administration + settings,radio,lora,region,modem,device,power,security + signal,rssi,snr,bars,quality,lora,noise,meter + tak,atak,cursor-on-target,team-awareness + telemetry,sensor,temperature,humidity,pressure,power + translate,crowdin,localization,language,i18n,contribute + units,locale,metric,imperial,temperature,distance + Search documentation… + Developer Guide + User Guide + Connections + Desktop App + Discovery + Firmware Updates + Map & Waypoints + Measurement & Formatting + Messages & Channels + MQTT + Node Metrics + Nodes + Getting Started + Settings — Modules & Admin + Settings — Radio & User + Signal Meter + TAK Integration + Telemetry & Sensors + Translate the App + Units & Locale Done Don't show again for this device Double Tap as Button @@ -507,6 +548,7 @@ Hardware model Heading Heartbeat + Help & Documentation Hide Layer Hide password History return max diff --git a/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/icon/Settings.kt b/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/icon/Settings.kt index 5c905aab6..124ad5db8 100644 --- a/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/icon/Settings.kt +++ b/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/icon/Settings.kt @@ -27,6 +27,7 @@ import org.meshtastic.core.resources.ic_bug_report import org.meshtastic.core.resources.ic_cleaning_services import org.meshtastic.core.resources.ic_data_usage import org.meshtastic.core.resources.ic_format_paint +import org.meshtastic.core.resources.ic_info import org.meshtastic.core.resources.ic_language import org.meshtastic.core.resources.ic_list import org.meshtastic.core.resources.ic_notifications @@ -70,3 +71,5 @@ val MeshtasticIcons.SettingsRemote: ImageVector @Composable get() = vectorResource(Res.drawable.ic_settings_remote) val MeshtasticIcons.Storage: ImageVector @Composable get() = vectorResource(Res.drawable.ic_storage) +val MeshtasticIcons.HelpOutline: ImageVector + @Composable get() = vectorResource(Res.drawable.ic_info) diff --git a/crowdin.yml b/crowdin.yml index f37d09a27..64a130ca7 100644 --- a/crowdin.yml +++ b/crowdin.yml @@ -10,3 +10,11 @@ files: translation: /fastlane/metadata/android/%locale%/%original_file_name% - source: /fastlane/metadata/android/en-US/changelogs/default.txt translation: /fastlane/metadata/android/%locale%/changelogs/%original_file_name% + # In-app docs — user guide only (developer guide is English-only) + # Uses %android_code% to output Android/CMP qualifier format directly (pt-rBR, zh-rCN, fr) + - source: /docs/user/*.md + translation: /docs/%android_code%/user/%original_file_name% + type: md + - source: /docs/index.md + translation: /docs/%android_code%/%original_file_name% + type: md diff --git a/desktopApp/build.gradle.kts b/desktopApp/build.gradle.kts index 42b8c241e..1f099dc97 100644 --- a/desktopApp/build.gradle.kts +++ b/desktopApp/build.gradle.kts @@ -265,6 +265,7 @@ dependencies { // Feature modules (JVM variants for real composable wiring) implementation(projects.feature.settings) + implementation(projects.feature.docs) implementation(projects.feature.node) implementation(projects.feature.messaging) implementation(projects.feature.connections) diff --git a/desktopApp/src/main/kotlin/org/meshtastic/desktop/di/DesktopKoinModule.kt b/desktopApp/src/main/kotlin/org/meshtastic/desktop/di/DesktopKoinModule.kt index 59f468f82..261abeeae 100644 --- a/desktopApp/src/main/kotlin/org/meshtastic/desktop/di/DesktopKoinModule.kt +++ b/desktopApp/src/main/kotlin/org/meshtastic/desktop/di/DesktopKoinModule.kt @@ -78,6 +78,10 @@ import org.meshtastic.desktop.stub.NoopMeshWorkerManager import org.meshtastic.desktop.stub.NoopPhoneLocationProvider import org.meshtastic.desktop.stub.NoopPlatformAnalytics import org.meshtastic.desktop.stub.NoopServiceBroadcasts +import org.meshtastic.feature.docs.ai.AIDocAssistant +import org.meshtastic.feature.docs.ai.KeywordFallbackAssistant +import org.meshtastic.feature.docs.translation.DocTranslationService +import org.meshtastic.feature.docs.translation.NoOpDocTranslator import org.meshtastic.feature.node.compass.CompassHeadingProvider import org.meshtastic.feature.node.compass.MagneticFieldProvider import org.meshtastic.feature.node.compass.PhoneLocationProvider @@ -96,6 +100,7 @@ import org.meshtastic.core.takserver.di.module as coreTakServerModule import org.meshtastic.core.ui.di.module as coreUiModule import org.meshtastic.desktop.di.module as desktopDiModule import org.meshtastic.feature.connections.di.module as featureConnectionsModule +import org.meshtastic.feature.docs.di.module as featureDocsModule import org.meshtastic.feature.firmware.di.module as featureFirmwareModule import org.meshtastic.feature.intro.di.module as featureIntroModule import org.meshtastic.feature.map.di.module as featureMapModule @@ -137,6 +142,7 @@ fun desktopModule() = module { org.meshtastic.feature.connections.di.FeatureConnectionsModule().featureConnectionsModule(), org.meshtastic.feature.map.di.FeatureMapModule().featureMapModule(), org.meshtastic.feature.firmware.di.FeatureFirmwareModule().featureFirmwareModule(), + org.meshtastic.feature.docs.di.FeatureDocsModule().featureDocsModule(), org.meshtastic.feature.intro.di.FeatureIntroModule().featureIntroModule(), org.meshtastic.feature.wifiprovision.di.FeatureWifiProvisionModule().featureWifiProvisionModule(), org.meshtastic.desktop.di.DesktopDiModule().desktopDiModule(), @@ -192,6 +198,10 @@ private fun desktopPlatformStubsModule() = module { single { NoopPhoneLocationProvider() } single { NoopMagneticFieldProvider() } + // AI assistant: keyword-only fallback on desktop (no on-device model) + single { get() } + single { NoOpDocTranslator() } + // Desktop uses the real ApiService implementation (no flavor stub needed) single { ApiServiceImpl(client = get()) } diff --git a/desktopApp/src/main/kotlin/org/meshtastic/desktop/navigation/DesktopNavigation.kt b/desktopApp/src/main/kotlin/org/meshtastic/desktop/navigation/DesktopNavigation.kt index d7581cc9c..83494ce00 100644 --- a/desktopApp/src/main/kotlin/org/meshtastic/desktop/navigation/DesktopNavigation.kt +++ b/desktopApp/src/main/kotlin/org/meshtastic/desktop/navigation/DesktopNavigation.kt @@ -23,6 +23,7 @@ import org.meshtastic.core.navigation.MultiBackstack import org.meshtastic.core.navigation.TopLevelDestination import org.meshtastic.core.ui.viewmodel.UIViewModel import org.meshtastic.feature.connections.navigation.connectionsGraph +import org.meshtastic.feature.docs.navigation.docsEntries import org.meshtastic.feature.firmware.navigation.firmwareGraph import org.meshtastic.feature.map.navigation.mapGraph import org.meshtastic.feature.messaging.navigation.contactsGraph @@ -52,6 +53,7 @@ fun EntryProviderScope.desktopNavGraph( mapGraph(backStack) firmwareGraph(backStack) settingsGraph(backStack) + docsEntries(backStack) channelsGraph(backStack) connectionsGraph(backStack) wifiProvisionGraph(backStack) diff --git a/docs/Gemfile b/docs/Gemfile new file mode 100644 index 000000000..9248b3181 --- /dev/null +++ b/docs/Gemfile @@ -0,0 +1,8 @@ +source "https://rubygems.org" + +gem "jekyll", "~> 4.3" +gem "just-the-docs" +gem "jekyll-redirect-from" +gem "jekyll-remote-theme" +gem "csv" +gem "webrick" diff --git a/docs/_config.yml b/docs/_config.yml new file mode 100644 index 000000000..4b76bae58 --- /dev/null +++ b/docs/_config.yml @@ -0,0 +1,289 @@ +title: Meshtastic Android +description: "User and developer documentation for the Meshtastic Android, Desktop, and iOS applications." +baseurl: "" +url: "" + +# just-the-docs theme +# Local builds use `gem "just-the-docs"` from Gemfile. +# GitHub Pages uses remote_theme for hosted builds. +theme: just-the-docs +remote_theme: just-the-docs/just-the-docs@v0.11.0 + +# Plugins +plugins: + - jekyll-remote-theme + - jekyll-redirect-from + +# Navigation +nav_enabled: true +search_enabled: true +search_tokenizer_separator: /[\s\-/]+/ + +# Heading anchors (clickable § links) +heading_anchors: true + +# Color scheme — loads _sass/color_schemes/meshtastic.scss +color_scheme: meshtastic + +# Default front-matter for pages in subdirectories +defaults: + - scope: + path: "user" + values: + parent: User Guide + layout: default + - scope: + path: "developer" + values: + parent: Developer Guide + layout: default + # Locale-translated pages are excluded from main nav but still rendered. + # They use a dedicated locale layout with a back-link to the English version. + # Auto-generated from Android app locales (values-* resource dirs). + - scope: + path: "ar" + values: + layout: locale_page + locale: ar + nav_exclude: true + - scope: + path: "be" + values: + layout: locale_page + locale: be + nav_exclude: true + - scope: + path: "bg" + values: + layout: locale_page + locale: bg + nav_exclude: true + - scope: + path: "ca" + values: + layout: locale_page + locale: ca + nav_exclude: true + - scope: + path: "cs" + values: + layout: locale_page + locale: cs + nav_exclude: true + - scope: + path: "de" + values: + layout: locale_page + locale: de + nav_exclude: true + - scope: + path: "el" + values: + layout: locale_page + locale: el + nav_exclude: true + - scope: + path: "es" + values: + layout: locale_page + locale: es + nav_exclude: true + - scope: + path: "et" + values: + layout: locale_page + locale: et + nav_exclude: true + - scope: + path: "fi" + values: + layout: locale_page + locale: fi + nav_exclude: true + - scope: + path: "fr" + values: + layout: locale_page + locale: fr + nav_exclude: true + - scope: + path: "ga" + values: + layout: locale_page + locale: ga + nav_exclude: true + - scope: + path: "gl" + values: + layout: locale_page + locale: gl + nav_exclude: true + - scope: + path: "he" + values: + layout: locale_page + locale: he + nav_exclude: true + - scope: + path: "hr" + values: + layout: locale_page + locale: hr + nav_exclude: true + - scope: + path: "ht" + values: + layout: locale_page + locale: ht + nav_exclude: true + - scope: + path: "hu" + values: + layout: locale_page + locale: hu + nav_exclude: true + - scope: + path: "is" + values: + layout: locale_page + locale: is + nav_exclude: true + - scope: + path: "it" + values: + layout: locale_page + locale: it + nav_exclude: true + - scope: + path: "ja" + values: + layout: locale_page + locale: ja + nav_exclude: true + - scope: + path: "ko" + values: + layout: locale_page + locale: ko + nav_exclude: true + - scope: + path: "lt" + values: + layout: locale_page + locale: lt + nav_exclude: true + - scope: + path: "nl" + values: + layout: locale_page + locale: nl + nav_exclude: true + - scope: + path: "no" + values: + layout: locale_page + locale: no + nav_exclude: true + - scope: + path: "pl" + values: + layout: locale_page + locale: pl + nav_exclude: true + - scope: + path: "pt" + values: + layout: locale_page + locale: pt + nav_exclude: true + - scope: + path: "pt-rBR" + values: + layout: locale_page + locale: pt-rBR + nav_exclude: true + - scope: + path: "ro" + values: + layout: locale_page + locale: ro + nav_exclude: true + - scope: + path: "ru" + values: + layout: locale_page + locale: ru + nav_exclude: true + - scope: + path: "sk" + values: + layout: locale_page + locale: sk + nav_exclude: true + - scope: + path: "sl" + values: + layout: locale_page + locale: sl + nav_exclude: true + - scope: + path: "sq" + values: + layout: locale_page + locale: sq + nav_exclude: true + - scope: + path: "sr" + values: + layout: locale_page + locale: sr + nav_exclude: true + - scope: + path: "sv" + values: + layout: locale_page + locale: sv + nav_exclude: true + - scope: + path: "tr" + values: + layout: locale_page + locale: tr + nav_exclude: true + - scope: + path: "uk" + values: + layout: locale_page + locale: uk + nav_exclude: true + - scope: + path: "zh-rCN" + values: + layout: locale_page + locale: zh-rCN + nav_exclude: true + - scope: + path: "zh-rTW" + values: + layout: locale_page + locale: zh-rTW + nav_exclude: true + +# Callouts (just-the-docs v0.11+) +callouts: + tip: + title: Tip + color: green + note: + title: Note + color: blue + warning: + title: Warning + color: yellow + +exclude: + - Gemfile + - Gemfile.lock + - assets/screenshots/.gitkeep + - "*.sh" + diff --git a/docs/_data/locales.yml b/docs/_data/locales.yml new file mode 100644 index 000000000..a40998a1c --- /dev/null +++ b/docs/_data/locales.yml @@ -0,0 +1,119 @@ +# Supported documentation locales. +# Each entry maps a Crowdin 2-letter code to its native name. +# Pages land at docs/{code}/user/*.md via Crowdin sync. +# Synced with Android app locales (values-* resource dirs). + +ar: + name: "العربية" + dir: rtl +be: + name: "Беларуская" + dir: ltr +bg: + name: "Български" + dir: ltr +ca: + name: "Català" + dir: ltr +cs: + name: "Čeština" + dir: ltr +de: + name: "Deutsch" + dir: ltr +el: + name: "Ελληνικά" + dir: ltr +es: + name: "Español" + dir: ltr +et: + name: "Eesti" + dir: ltr +fi: + name: "Suomi" + dir: ltr +fr: + name: "Français" + dir: ltr +ga: + name: "Gaeilge" + dir: ltr +gl: + name: "Galego" + dir: ltr +he: + name: "עברית" + dir: rtl +hr: + name: "Hrvatski" + dir: ltr +ht: + name: "Kreyòl Ayisyen" + dir: ltr +hu: + name: "Magyar" + dir: ltr +is: + name: "Íslenska" + dir: ltr +it: + name: "Italiano" + dir: ltr +ja: + name: "日本語" + dir: ltr +ko: + name: "한국어" + dir: ltr +lt: + name: "Lietuvių" + dir: ltr +nl: + name: "Nederlands" + dir: ltr +"no": + name: "Norsk" + dir: ltr +pl: + name: "Polski" + dir: ltr +pt: + name: "Português" + dir: ltr +pt-rBR: + name: "Português (Brasil)" + dir: ltr +ro: + name: "Română" + dir: ltr +ru: + name: "Русский" + dir: ltr +sk: + name: "Slovenčina" + dir: ltr +sl: + name: "Slovenščina" + dir: ltr +sq: + name: "Shqip" + dir: ltr +sr: + name: "Српски" + dir: ltr +sv: + name: "Svenska" + dir: ltr +tr: + name: "Türkçe" + dir: ltr +uk: + name: "Українська" + dir: ltr +zh-rCN: + name: "中文 (简体)" + dir: ltr +zh-rTW: + name: "中文 (繁體)" + dir: ltr diff --git a/docs/_data/versions.yml b/docs/_data/versions.yml new file mode 100644 index 000000000..a5324ae93 --- /dev/null +++ b/docs/_data/versions.yml @@ -0,0 +1,12 @@ +versions: + - tag: beta + label: "Beta" + url: /beta/ + current: true + +# Release entries are added by the docs-release.yml workflow: +# - tag: "v2.8.0" +# label: "2.8.0" +# url: /v2.8.0/ +# current: false + diff --git a/docs/_includes/footer_custom.html b/docs/_includes/footer_custom.html new file mode 100644 index 000000000..80918c95e --- /dev/null +++ b/docs/_includes/footer_custom.html @@ -0,0 +1,4 @@ +
+ Copyright © {{ "now" | date: "%Y" }} Meshtastic LLC. Distributed under the GPL v3 License. +
+ diff --git a/docs/_includes/head_custom.html b/docs/_includes/head_custom.html new file mode 100644 index 000000000..fe012543d --- /dev/null +++ b/docs/_includes/head_custom.html @@ -0,0 +1,166 @@ + + + + + + + + diff --git a/docs/_includes/header_custom.html b/docs/_includes/header_custom.html new file mode 100644 index 000000000..b19cdf3bc --- /dev/null +++ b/docs/_includes/header_custom.html @@ -0,0 +1,45 @@ +
+ + {% include language_switcher.html %} +
+ + diff --git a/docs/_includes/language_switcher.html b/docs/_includes/language_switcher.html new file mode 100644 index 000000000..1b0cf4238 --- /dev/null +++ b/docs/_includes/language_switcher.html @@ -0,0 +1,71 @@ +{% comment %} + Language switcher for translated docs pages. + Renders a dropdown-style link list showing available translations of the current page. + Include this in any page or layout that should offer locale switching. + + Usage: {% include language_switcher.html %} + + Logic: + - Derives the current page's relative path within its section + - Checks if translated versions exist in locale subdirectories + - Shows a globe icon with available locale links +{% endcomment %} + +{% assign current_path = page.path %} +{% assign locales = site.data.locales %} + +{% if locales and current_path %} +
+ + 🌐 English + +
    + {% comment %} Always show English link back to source {% endcomment %} + {% assign path_parts = current_path | split: "/" %} + {% assign first_segment = path_parts[0] %} + + {% comment %} Detect if we're currently IN a locale subdir {% endcomment %} + {% if locales[first_segment] %} + {% comment %} We're on a translated page — link back to English {% endcomment %} + {% assign remaining_parts = path_parts | slice: 1, path_parts.size %} + {% assign en_path = remaining_parts | join: "/" | replace: ".md", "" %} +
  • English
  • + {% endif %} + + {% comment %} Show all available locale versions {% endcomment %} + {% for locale in locales %} + {% assign locale_code = locale[0] %} + {% assign locale_info = locale[1] %} + + {% if locales[first_segment] %} + {% comment %} We're already on a translated page {% endcomment %} + {% if locale_code == first_segment %} + {% continue %} + {% endif %} + {% assign locale_path = locale_code | append: "/" | append: en_path %} + {% else %} + {% comment %} We're on an English page {% endcomment %} + {% assign en_relative = current_path | replace: ".md", "" %} + {% assign locale_path = locale_code | append: "/" | append: en_relative %} + {% endif %} + + {% comment %} + Check if the translated file actually exists. + Jekyll doesn't have a file_exists filter, so we check site.pages. + {% endcomment %} + {% assign locale_file = locale_path | append: ".md" %} + {% assign page_exists = false %} + {% for p in site.pages %} + {% if p.path == locale_file %} + {% assign page_exists = true %} + {% break %} + {% endif %} + {% endfor %} + + {% if page_exists %} +
  • {{ locale_info.name }}
  • + {% endif %} + {% endfor %} +
+
+{% endif %} diff --git a/docs/_layouts/locale_page.html b/docs/_layouts/locale_page.html new file mode 100644 index 000000000..167e80b09 --- /dev/null +++ b/docs/_layouts/locale_page.html @@ -0,0 +1,36 @@ +--- +layout: default +--- + +{% assign locale_code = page.locale | default: "en" %} +{% assign locale_info = site.data.locales[locale_code] %} +{% assign page_path = page.path %} +{% assign path_parts = page_path | split: "/" %} +{% assign remaining_parts = path_parts | slice: 1, path_parts.size %} +{% assign en_path = remaining_parts | join: "/" | replace: ".md", "" %} + +
+

+ 🌐 {{ locale_info.name }} — Community translation + View in English +

+
+ +
+{{ content }} +
+ + diff --git a/docs/_sass/color_schemes/meshtastic-dark.scss b/docs/_sass/color_schemes/meshtastic-dark.scss new file mode 100644 index 000000000..f2e52b473 --- /dev/null +++ b/docs/_sass/color_schemes/meshtastic-dark.scss @@ -0,0 +1,40 @@ +// Meshtastic Material 3 — Dark color scheme for just-the-docs +// Source: core/ui/.../Color.kt §8.3 (Dark Scheme) +// +// Brand colors: +// Primary (Dark): #67EA94 (Green 500) +// Surface (Dark): #1A1B26 (Neutral 900) + +$color-scheme: dark; + +// Body / page background +$body-background-color: #1A1B26; // Neutral 900 — surfaceDark +$sidebar-color: #1A1B26; // Neutral 900 +$body-text-color: #ECEDF3; // Neutral 100 — onSurfaceDark +$body-heading-color: #ECEDF3; // Neutral 100 + +// Links +$link-color: #67EA94; // Green 500 — primaryDark +$nav-link-color: #67EA94; // Green 500 + +// Navigation +$nav-child-link-color: #B8BAC8; // Neutral 300 — secondaryDark +$search-result-preview-color: #B8BAC8; + +// Code +$code-background-color: #0F1017; // Neutral 950 — surfaceContainerLowestDark +$code-linenumber-color: #9496A6; // Neutral 400 + +// Borders +$border-color: #3D3E50; // Neutral 700 — outlineVariantDark +$table-background-color: #242533; // Interpolated — surfaceContainerDark + +// Buttons +$btn-primary-color: #67EA94; // Green 500 +$base-button-color: #2C2D3C; // Neutral 800 + +// Feedback / callouts +$feedback-color: #242533; // surfaceContainerDark + +// Search +$search-background-color: #242533; // surfaceContainerDark diff --git a/docs/_sass/color_schemes/meshtastic.scss b/docs/_sass/color_schemes/meshtastic.scss new file mode 100644 index 000000000..63c27599e --- /dev/null +++ b/docs/_sass/color_schemes/meshtastic.scss @@ -0,0 +1,39 @@ +// Meshtastic Material 3 — Light color scheme for just-the-docs +// Source: core/ui/.../Color.kt §8.2 (Light Scheme) +// +// Brand colors: +// Primary (Light): #2D8F52 (Green 700) +// Surface (Light): #F5F6FA (Neutral 50) + +$color-scheme: light; + +// Body / page background +$body-background-color: #F5F6FA; // Neutral 50 — surfaceLight +$sidebar-color: #ECEDF3; // Neutral 100 — surfaceContainerLight +$body-text-color: #2C2D3C; // Neutral 800 — onSurfaceLight +$body-heading-color: #2C2D3C; // Neutral 800 + +// Links +$link-color: #2D8F52; // Green 700 — primaryLight +$nav-link-color: #2D8F52; // Green 700 + +// Navigation +$nav-child-link-color: #555668; // Neutral 600 — secondaryLight +$search-result-preview-color: #555668; + +// Code +$code-background-color: #ECEDF3; // Neutral 100 +$code-linenumber-color: #9496A6; // Neutral 400 + +// Borders +$border-color: #D5D6E0; // Neutral 200 — outlineVariantLight +$table-background-color: #F5F6FA; // Neutral 50 + +// Buttons +$btn-primary-color: #2D8F52; // Green 700 + +// Feedback / callouts +$feedback-color: #E0E1EB; // surfaceContainerHighLight + +// Search +$search-background-color: #FFFFFF; // surfaceContainerLowestLight diff --git a/docs/assets/css/just-the-docs-meshtastic-dark.scss b/docs/assets/css/just-the-docs-meshtastic-dark.scss new file mode 100644 index 000000000..da3ad08f0 --- /dev/null +++ b/docs/assets/css/just-the-docs-meshtastic-dark.scss @@ -0,0 +1,3 @@ +--- +--- +{% include css/just-the-docs.scss.liquid color_scheme="meshtastic-dark" %} diff --git a/docs/assets/css/just-the-docs-meshtastic.scss b/docs/assets/css/just-the-docs-meshtastic.scss new file mode 100644 index 000000000..86cb9b2e7 --- /dev/null +++ b/docs/assets/css/just-the-docs-meshtastic.scss @@ -0,0 +1,3 @@ +--- +--- +{% include css/just-the-docs.scss.liquid color_scheme="meshtastic" %} diff --git a/docs/assets/screenshots/README.md b/docs/assets/screenshots/README.md new file mode 100644 index 000000000..5fb2efe28 --- /dev/null +++ b/docs/assets/screenshots/README.md @@ -0,0 +1,41 @@ +# Screenshots + +This directory contains screenshot assets referenced by the documentation pages. + +Screenshots are sourced from the Compose Preview Screenshot Testing reference images +in `screenshot-tests/src/screenshotTestDebug/reference/`. Light-mode variants are +copied here for use by the Jekyll docs site and in-app documentation browser. + +## Updating Screenshots + +After changing a UI component, regenerate reference images and copy them here: + +```bash +./gradlew :screenshot-tests:updateDebugScreenshotTest +``` + +Then copy the relevant light-mode PNGs from the reference directory. The +`copyDocsScreenshots` task automates bulk copying based on the manifest: + +```bash +./gradlew :screenshot-tests:copyDocsScreenshots +``` + +## Naming Convention + +``` +{page-id}_{description}.png +``` + +Examples: +- `onboarding_welcome.png` +- `connections_bluetooth_scan.png` +- `messages-and-channels_channel_list.png` +- `firmware_disclaimer.png` + +## Guidelines + +- PNG format, light-mode only (dark variants live in reference directory) +- Name screenshots to match the docs page they appear in +- Keep filenames lowercase with underscores + diff --git a/docs/assets/screenshots/connections_bluetooth_scan.png b/docs/assets/screenshots/connections_bluetooth_scan.png new file mode 100644 index 0000000000000000000000000000000000000000..63775955804a1948881fca699e8549abeab701f7 GIT binary patch literal 15353 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 literal 0 HcmV?d00001 diff --git a/docs/assets/screenshots/connections_connecting.png b/docs/assets/screenshots/connections_connecting.png new file mode 100644 index 0000000000000000000000000000000000000000..1fc10a657fc5b883afd4372e071045a0e1b19d51 GIT binary patch literal 24915 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 literal 0 HcmV?d00001 diff --git a/docs/assets/screenshots/connections_disconnect.png b/docs/assets/screenshots/connections_disconnect.png new file mode 100644 index 0000000000000000000000000000000000000000..1ba2c24381ddb87d8835d2c447f8cca83a0e69d9 GIT binary patch literal 6772 zcmbVRXH-+$vk$1K2&gCsA<9MCrT5;H5(EXLcMu4K4gqPQMMV%KND&a}O*#ljXhJB` zyM*4QN|h3Nd53WS_rrVd%X|C7S$nNLduGm@X}>wa&s7!4Nx`Hb5QtpqiM$2~bXgSG z`&}aep7kcFYakFMEl(tJ;AEo{XrZPXL zw7&LKnc+Dlm{>4%hT-Ga0AHoy*o^1=aa?y;1mZ$rUa|HL7;2spm|+a3K4$gUWqBiU zGS9mw!a+aA{;A*DA7ql=p7)2M3`sQ?Y3W68WRlkc?G-=`5U95expR-O1BsIpT_x<6 zJTF5Co0Qqx&V&srOtFrLuoHjqeAb4T-a1gk_1_C5aIX{gIZYwmLFc|gifnlj8|9iU5%}*kd~3jrm(M5 z&&k)Lx8_X35R;v}CnyD4V|8_ji-)`37&J0Y#?s%t%0Au7Lp>mGZa_{(X-%MUzC}(3 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 J3uRxt{x9XoWv~DM literal 0 HcmV?d00001 diff --git a/docs/assets/screenshots/connections_empty_state.png b/docs/assets/screenshots/connections_empty_state.png new file mode 100644 index 0000000000000000000000000000000000000000..322ac116206728f8809498dba9dc96279d1d6150 GIT binary patch literal 23525 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 literal 0 HcmV?d00001 diff --git a/docs/assets/screenshots/connections_transport_filters.png b/docs/assets/screenshots/connections_transport_filters.png new file mode 100644 index 0000000000000000000000000000000000000000..239d970acd3093ada079c98fbf796a5f9d097c9f GIT binary patch literal 10384 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 literal 0 HcmV?d00001 diff --git a/docs/assets/screenshots/connections_wifi_scanning.png b/docs/assets/screenshots/connections_wifi_scanning.png new file mode 100644 index 0000000000000000000000000000000000000000..9e45f1cdb17aac39e268c4b71438cb1733cf1cdd GIT binary patch literal 23604 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 literal 0 HcmV?d00001 diff --git a/docs/assets/screenshots/connections_wifi_success.png b/docs/assets/screenshots/connections_wifi_success.png new file mode 100644 index 0000000000000000000000000000000000000000..fe4b685507d879553d0556dfc9bb5bd4f60aa41f GIT binary patch literal 113841 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%0D%gM@7V~ln znrC*>`(v<0!-IeTcAPK}gmX6*x9ajw%V$xUz`&4fU?9tEW$@ehH@|J$8~8N|ZzaX{ zfDHhHxSzx6K|@tQ=MV0bS~w^IF30!)0X{`7;$j{6>j$?8g*GRZrlui=t$;L#&(~uY zyZ&h~4CU`8Ndf_{pCw`zyFz1b9rgYkV{jYTxXPeuR5kvJ>K36nZ$UUoQU~ZmpXNtY z;V;u|f#R6HH2h?{w+Uj*TwZxyXm81=1AU(|D%G4ti4c_e6xN9r| zslz~lu5v*W-So0f`o+4GjFQareS_S^0RbE<3dI&Bkzxu|9ZlRE*Cz@%VPUoI8N0=P`Ii-IW1R?Y9Jo zl?gsO8O&^oqrPN&GF}0IDW1pegX$>b4vOe3O=v)4)V=U{%!vG>jlipKq8lkw4|RV1 z_=SUCbnxpe{Ne|{c;YX)@Jk&2QVD*kMZZ+TU+VEM6XBO-^vg2(Wf}dljDA^0zbvC) zmeDWE=>J#Ch>yi+3zFWSW^P+2bS!_!R*9{;s(yN>V!ldE_rsk>6~ASb?|yZ}MCEkK zoWa5E2ekD}O%8Asfgr=IaYJfvimnf>DYCu3cBBrrxV{i7=au>_>LajJKj6E- zRpZZqlYi6ulcT`jP2WW~N_lRY+4Yl`FK+`J@SFY&-m>8uKcc&NBab&B{ow|M|9b5g zN`6rZKm)%H&M&6$i%$YH@Jn<6Ncg`~EZVI-9DkF?AF!^T2QFd~vmMf2oH!p$S?gp2 zs>4Ia)CWs%Fwy;X{nps|&XEdZY;Qqz#WhLqdUmIMushLig!2$U&BGSkB@$%WonFW9 zJnHy)@mqghFkXsV(HXI!e;6vc(erC*S~}qmHsh;2jp5*j(MkE<{T{WU#J4QT#6VTT9`VLX$KcaKfXClxulZi%DA5M8s16+z4@ zBT1mk-C*VWIYk)gF+H+V<#kbS59D3a_q||&I+iZKp$j>|=igQuu-J)0OvByJPmI=# zwMr%iEI>)=f45ir)69VO+ZN>s8G^wY=!~_td^xY7QX(eZn?BrhVTBVlO@Ke*8F+|;OOE1iI@;?(}tl2 z(9>B4Nk#T3=e&;jQF=Al1w#<79`1A9I@m|87?;}g@D5JG=JOXzyP%ok5y5JTu{?+0 z4Vn2gD80V;glNrR3gP)hJv+(^3C?)VEOUy+SV<3Bi%$besTIB2*ng;4Fee_i(!eA$ zlxmlvXxg6U(RD}mdw+aUf(}5?Y<5vIP}lOvpGL_1dyJ2baWm_2z>~_J0Jup8A&%KM z*?IT^s*gVpq4)Zw3tR#7%^CHv9C$C0iMojw#ACiwn?d&XC+7; z^j@FH!%lw!S?DNMrZX~+jV5}q& z#H@WtxkJ)jO=!F$0EvS8XmbD&1exMF|4ug^&gQe@#t@fI)(otFt{T}*zzl_OJJ?*N zaWiTh_q{`%-0vD9K#0Jr(CB^M?ePG0ui~%_`K$(?1vnQHUFI^`ydWzA8MK1kTy$I< zu25pn*M|6EEv^oDx7qSM@!~agJURahDn_68xzfY68|tq!u-qggv{myqJrP(?J%vuM z#_}#P)@WWcsC`Ce%Zg&&_54|Fj5cGS7d;k5TN|S+Rs?JJJo9-96h^HtUDR(TJ4Vaev-BkPB{6!^Pgn z&5rs20Vd*uLY-3PNkgc*cHsV`K?=pE2(M`iEBrJKg{D)3J^K;b1U7#)n@}}mq_sm+ z@kF%;@)I^=Onki&ToPe;VE0|< z`}FSC0q4AohTLkZonUCtOIGHO&`wRU7~Z7JuE1Kp5^}N7DCNTJyCZBe*Cg+TZH{jJ>1@I0Rm$e$}x34(xn8cffL@R%WUeM&*p;?b6^^ zXayvR`VpIC*JkOPKI`;hlyMk4G zaV)l?j2U+oN>B`fb0ZAevc$YR;5`Ttb~SqP3w})?7LwX=+B99{K>`6$kl1;KN_;R+yBRf2bGFSf5I9Tt2))LM2h}k@b3}&)yBqn377UV(vY~f zBT6VvA)kz{vy4}3^KUNQowZh}KDKuOEC~Lykp7&a?NzjU*{7b@FN9H&S&i*qY20kD zRRdpN%$t*wBCf<~&FXIrxpdir8yr%pHTq1ux&sTv>KVrl#5*-;glwA--KPv0KORvl#SR+)V`WliDRxpSBV!iYix z($=R)Ki`BuH!zMvHTf<-J_R8SP#2lI6<2NDQ?jGFa7+T``|OSVD+7KRBhU5uA5l72 z63PW)*pWLjWAHxG2Zh>)trBTbu zru`5j+<Mu z_3tTZp0AHeMdp3!rKvffn*0m?+B27N9QTe`lE3u3M$tD4JQvUfbQ*{%6XUB7cD{4xZ-?ihwlzyqvh2?-avcd}mLkEnXn^VgNm zjppl>nU|b*^LpgkS9*ru)l3-I@IbCW1S>Cjni8}ALK`ZPHOZPSxKyC(uIR=Kt$ip9 z4i9hWZ}0<=@}qI9g4MJ|32O%Q&4@;{RvwL63lz=evIPl5Iuwgjwy28Tl;>rUGC5$m zT-%V3ASF*?jQ4vt>Dfv*U4g}|vGqjigeB+am%krAxo68m*XD%Ly8QTebN*;o-L-E$ zX><`$KQrMqYtZaN*{SlV+J;%rUI)33kAF<;OW5=FZlzj&>_ceqmbinr4nZ?kC!BX2 z;#1Q}iXXE^OGtb6&)f~lTYR`xL?*~o>fU7pG3b_$rPyWv&-+dWtap}oJhJDr`H{9T z_dAO+ZRqw8Q~>s!y7=tkB!O+N*+%J^YxO3umXIVu7yKqvMEXEp;c3l>Fk(plW@INL@9(ld?t;q_UH?} znnHSmmu(WJ25Z0Dt8u+7%~C1YmDqOi@gJ;}F^n+DN$1oFJ4&qj@Q_vi@7{*SpUW<0 zdCM_I_DVL&*k-gv_c1%s?|YmQlH1k-meKEOX$B$AGs5D*t+r=iyS-;ILQp zqb3EVkPPyodfkZKo|grsWGFX0OnfsQ@MN7iCevqOXA&3u;^Ls_(YhEBbd5suef7ze zi0yJYa=xwl`{I5(HXD||OCw9{I`6@AaVJr79nEv@Hy>hksHeV^k4N5(g1s7Jk^B8q z?#=Sfx}+lW7OezRLWlS{^KR}@KTX1e5}mBt zZ<{Cr3T%^TLTlBcWp`c25oK4pMk)L!#l?rDW*`D?iz_j0)&Lz`;$`YjYO@;Q)@;_- z<#_3M=6apKD!rpwwt%L#>8z6JI-b&5_e@Doq{-7dV-~}k8cl&$POEm`5#*9~ti*}z z%X;Mr{pLi@-K*hM=d-#pw&N0Sjg~N#Xg%Z?c6s$?#F5wwx~AKtdPKd85)hDTzlJBt zU9f@8GDrcp&{`~Gyj?;HZr`?x2`yEf>iG!j7FVd*WwGKM5S#~Ik zNTu8*R&!IPf67g1@0j!b4W>e3jdf8dMhL{M(z?XtbRXO!0@Fa&9hF0i;Y=Qt!*A(y zR@h

3M4|zf0F2(}!r*vO)lLVlkw(O8JWypo9j#a;_cu_`@(-2Vh}A13tH+ITEd` zF^5bqvpbQ{Y~_~PhHpQaSG=V6D^Y2@kFJ|t`pr*2tj%#-`3akeGIq7Zr?ZB4YhkABir?6N+H+0&WE46OT{ zO?rwtEPs8^?q~Pa<{#t5E(ZPJr%=|bSQ7dNb?+rU9G^$4Rrg~?!@l_4zg(J{dqZb1 z)2<;^T&<@_@I)!JvO;HWezSi2D_g~Q{O{^*S8k|DU>sZNz2j$TT@JTCn}QYOrj+xO zL`0dIudvWw=Zbv4I&cPFx0CjJX}Vmk8e>D3UdvkXgeJ1VUY{2UA@o$S`+}_vBUXDi z72eRfqx!U{_fg}KeGgQa?_b*?ICLY@|l>XT@pfat__AlL-I#)=i=;n(tdeQh3iP*veVjVu!fdgHUrn6yk zztshE7jGp5+YDwkg~V?9A zIqFNUq}_>sCH)>5SlJZ@Ps z{pR@Svt7}x{?L+$x*KHelfhqmJrm8ujKb3u%g{nnM7xTHN}V|FQnI)T{6-8= zN27?w&nl4i?A91NCFO{=>TSI57Ok;y0EWjybGF9mrPJ>1<5nrRg@8_u=3@=a$IxP% z4*kLJ#4L|V8tAIH?*qSTpI@g{vpTQqmiW_Qd=~ytn=)rj`P3TyYg?g_Vry_ zI#89ir_>Z$MNd_zDdw80TBYi?H7ly>n1>h=(>ZO4DbYg>MO8wniVlXPBDfW_Vz|bX zNT}2lMGX;xxI6Cp-tW41-M`?j`}1CVul;%VXTR_BJnyqUugIyW=ksY(em0{!&?XhH zMO5^kmuDEG8KJl7q5!$fj4VtlwP zWuNzP@`r^m%U)H1j+)-aF=x&O^RChavLkpXFmfxA$$|kOZ8JBJbyy-{WxzxAqO?wW zSv;gw5JmNfD<29vl?*nHz0}peS1IH;P>(N(-hDH0zZd^pn0Y-P^#Lm7XQk@*!*7Y$ z6Y|;NjuudRNb%rVm*RjOMvSlw+rgXV-*39d?j7HS9Va*qSu+*S%%zv>%50LD@PySU zL`1!;kU7crwHi`tStw#2$El4!<;IcFkg$r)&(5k#%FEPN604*wy83RX9Bfqu(rgSc zQ{e4fZHif0z$z{n9dGm~cJ4y5Dh~XF`|_~ANveR=m>VQHBU{LW6!3M%xjENUz-orT zoqk%Rlcqz_b1Uv`UAGD>6GT0OQmyiR_G+DHVIr2Nmj8ety|3zuhGLo821OZf#GBQ` z`7D#O;8#1tSk^W(r$Y>Rvo$y$=9tXu@wa;zN~khz%Bcv>(kmL*$e6XfY2yB~d1h0R zr-g2iKQd)_D0HUA^^{#IpP>{jbYaA9Wc7LO2~cp%@$O*LrDdD4}Byr1#S z9VILN&R(&{RGcs7sRx8n&|WQ|_{dMMagp6;@6B7)h#@@Kh|{M+9*2FPCeS!7JuA<& z=J*R@%FSH(C8Ub{(YV^06X-q4k!wE;HPh=0JYdES+xPXE+~|tqn}=XuwbUyIq^26A zb$&EXBPW|(BU{p4N>wD0ngDaqYz#~r9V$ueQlZx#sX6t~h)K7`?KOn?}i>tS1G5QC)wIZizY zNWZTP;NeH5s)hFvuNmFFVmJ!>OK?~JqXK;0@WoaDEx4+QJW7(Y^8(g9cJECt6zpt03HFJl8 z^#i4Vf3e~n%8XQaQ`;3blu;Bpkh(ZIRqrhdr@vb7p@Hj%ovLSF??;&~g=cOwQaYNG zxXTV1Dm|1)d#&NXB)zR4BF^(-BKEA_3vvm3j3svbgOE%~VfLkI8$v<{LWP>akYVd* za7pP$pl1xv)2<{s;q%+h0L$NS3>4_V^s+4%Y3;R3M(NTagGO0FgrG(P$7K~_7|9b| zE1c*gdgKfy%A6jQIs4we`fiUmNVgJ0z4Fme?z~Gdc7447EQ;%xJ{_{BnYI>&ZB~5S z0&&S%_d3@FQ9ytF)OUU{RFk(eT&}e(2qm9Q?_3}|$gy-3K`t+=x*v)*lZYzj;JmL|2coz4Kn(wmp6tlYE{2>JFz;^7h(e{fUjOgt71{NFHBf ztz+8q%A{DK9oto#069m2j7|0~)?xHqNUNJh1Rl8;-BmC!Jyc@+rmm(05xKOIM?oizy}c!_daX%CY~j0M||7{l$xWB!Wr+T0m&n> zUYA9xDh<$%77tOqD%z_8k@v3OZRjSjFg1mi1W?ooiVkz^>6Zgj^(zAA&D7hC7tI{ezS3v!BR5VcIUs^^}-l zBFhhEOT3eC{YkVffIh|IO-B~HG<&6?kjsTXGz1=u=uC4ZvmfXHdlukIv`v=j_-}P! ze4^C3rnSz%r064Gat?y$A!ta!)o|wFgC2%IrHksnQ9O)lYv}!ez+jOW3J8j8Gc6B| zDYGz;$7L8{c@q-rbN{d67zwKw2|codIA#M!YnK>PNUonjeBDj+0FNTD_F!F&?$NOj%jCf#Idv`yt!@;~hjd0QJRZ2kmHcB=>t3<4%< zH*=#3&6o3IC$oy3ev@8RBHJ+7k*)lc0A$4NLam9s^*!N$kG3@O5xYDlCC^;H1j5?D?#8hx@`N3B|_Ef{?1E}Vr_kYnpyhXGmp&pObm zzD1&gab)cnkAPmyFvxk2gG<|wX%$ncm1fH18E}FMYhehpQ7uv|Zs(3vKWFwQI&Ryc zXsRq!5XGlHPLQN0WW_>ziz|2{ya+gf7Z4W8xY})FGBDz3DX_2gj5{yafJjm&dd92D6fBB_RjFVUD|`>=So%udvsV<4#GTo*$KC zZZzyg?85XwDxke6m|QcAyMMEneQWJ+$ZueFLu&xy`|ICfgJ%R$;-1&&^`~?vbZ)o) zWsl3LUXE~pK)z0E9JDkt^mP38(X*9aWYCEvTP{_IEC6Z&pn5!(q`Fm~c=D-A+22*1 ziY}E^Ix;#N3KF`$xth28k`aUzgJNE$r5F|%q+@^VjO=im-!i6EG?I9)A4_-0Bf&mX%*;(u;J~Th zsX$aXwk~S1c@ag{wEdYb+w>G=Y@2#^K~N*kVOH16X)Q$77gZ&0gvBos#E_Ru8FvWF z+@qw61z=e{zfB;ih*PuJr4`?RCW+JY2=-H)U42fsvu5}8S5l1%6L~c%5uIsuc_skT z&rtb5S>VkoD@ToLc|}_ks)JHRFLW^%AGl7SG(Y-Oh+u&IARcvy!p4ZFKuQ|urTliy zlJvm@{A!cgfunse(&jD0`KncC3O4x$iF8FaM9c0R5;Ef13dJZ}to6ri;g0Fkr0?3a zM9h|0Mby)gi<{EA460MGOkWn0-%Jar0ntBEt4UQJ0ae5pZ~qa1{zoLBtEXZ3UG++! zu?B=PHuA<6Vcxh$5j`L*qtH_(*{S~P&D3w#HBL{zEV+v9+S;o{!ZI~LEz+k-uQK*R z3*5N6<#mYpk|Cq;M@BT6Lof{}H1E#L*?1v6Y#E&cQwluRvUpZ7`GIk2)7^T`jE~eW zEs%1?0~UOfal9-3qjg(bT*P?VCsm8*GS*S_ASv27 z*TIB@3XxC!L_o+2Z5wj#K0c2hj||>jMRGuHi;=nBfyXsU?jN`nT1aj}^@jG}^vCbihCz?I#6``7oibbkJy z+u*;&WC1jIYz^nq%Zj$fG$BzreD7`zVtp<*hqZJ9!2dO|d}B+M8)CCxtZB99pgx6f z=^3HFU*?r@wIg`VYuR>x_|VAKCFX^Z#iW*w?a#88)8#u9?eP0){@85A1nl z40&I}aT=HL^vK|H{v0E9(uZ)-)S4%`42Z2Bkwf3zFr6{yPrHds9o@_=e=$Jxvbsp}8#p^RO_NlN+jCmWPXO2d f=a%~qCi1O>>(|im!7-D)>DbnmwieZ9_x|`hO^e=J literal 0 HcmV?d00001 diff --git a/docs/assets/screenshots/docs-browser_page.png b/docs/assets/screenshots/docs-browser_page.png new file mode 100644 index 0000000000000000000000000000000000000000..e9d99045d477cb564ad7d53bdc602fd5b3235b17 GIT binary patch literal 150719 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⋘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 tas7Tza!wIgcj2F()8usb_9*$J4Hy;A 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 a@SK0!d0+5cvj`{1xukvdVy@QBd;bNb2a&1( literal 0 HcmV?d00001 diff --git a/docs/assets/screenshots/docs-browser_search.png b/docs/assets/screenshots/docs-browser_search.png new file mode 100644 index 0000000000000000000000000000000000000000..77b7323357db08c7d469d3e5417b2b86b9164146 GIT binary patch literal 9197 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 literal 0 HcmV?d00001 diff --git a/docs/assets/screenshots/firmware_disclaimer.png b/docs/assets/screenshots/firmware_disclaimer.png new file mode 100644 index 0000000000000000000000000000000000000000..322df1f5d531c93c902156bed0779579ceb6c4f9 GIT binary patch literal 82576 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

1zKb;R0Kvg{5sFxhi0o4 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%0AkRxVeV0_Zo$j*J+^QSTth(~res$>a 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 literal 0 HcmV?d00001 diff --git a/docs/assets/screenshots/firmware_success.png b/docs/assets/screenshots/firmware_success.png new file mode 100644 index 0000000000000000000000000000000000000000..d6ac649ffa92cd64801b582afafcd2d328f10514 GIT binary patch literal 43171 zcmeFZcRZE<8$W)esH`Ssm!i;7WUr)>>~Tm|cJ|7Vtt3SuvqMJ1IyhFwajYowpm1!C zGEP|s$2`{eb$hSRjxAvCP1)FcI(Wh^mC`>uvjQglv zAIB>uy8kI}I^#ZFUJB!rV8+82L=T_2#;abI>*?YhKVm1F?hz)rwy|&`-p!Lt&a1A? zE1w_SR3_KRLpxm?2%Fm72Y!=&YYhB^E$wFpKY6wO{Naxb{@B4EU-%Ob{=~#TdErkw z`~wO8z@k6U@DDr&UhoGJ{E@*QNbm;|{DB02Ai*C<@FyMqfdpg!q{FcQzwJ`*Cgoax z7n6YPkny)n<&kwelst>Hm;YAX@uo;W zF4>*QSfc4V8DqS=m6IQ&xVc+WkQ}fr*=JI@K(-^2;yf`tB(sMz6;sr(#)c@l@&(G2 z9SpYa3Ec4h&y2)T&Nan#oco6OT2yRDrHlXM5J%%YeOlEK!Gyv2G zhFi-!i*+HLFJEz#tJ~7S3?v`Z!VIvIW(JaJ!rX52WkwryKgv{Bt+2VP=<-b4))Maj+wTE2DP(O_u0QAV_CKgWF{z&gsR z@tw+B$&O(vcD{<#66z+lJ3tfcoLEN#8>;9t3$PnT_8lMpOrr^C!bswa1G|qV|78Np69BE-rvf!Tmbk*36YWMB-sFwviD-EHqcDAO1#FMr& zTYnI-kG5tLRM>j$0^4E165wEEN6A$yO`-H5+GqCrXS$Wcx;-qeer3##aZNn>UfM0c|}_ncJPQ4?EZn|>cM6D#L+8A z`THZ*l=iNT^~VB{3_<>VkAQIr^c{rVJq?b0_pwCv(yG*Ez44xwoXU(8WXZM2w|?K9 z#|av)TA0(Y!Yb%FrP0x)ro|7r^Bl5se)ZO#?X5-KfdayE3^uC{qZ^I~VZwVld>+Q* z3@u~JAz33HDZPO%8gWt4lK7VA&ojFH%YDnf z@1;g$KCG_z7&to$A1R5Cl*XsdT&}gxv;$`IN~mBv)Jh0es17Yc7bUk^U%&WlLqjwm zjI$YCdV0 z4OU05HUofMwu2DeIv&;H}@yhprNFI9s#m#X?W69|f((||8 zi*w^yihd7<{dQfOK19`C4%}Q88V8Q~Hm|{4Y?DeB$ljf;%kVr<)*g8pjFS+ z-Jd81Meo1_^a!(pkKD4FiUI8Y6<}_K2jLaV9W7I36LlhK;+irumG0yDQLoJ97rW{k zbV!Qhx`WHD#^Z*yJKObg#37l!$L7=>>#3LsxTp02n8E`f68~UZl_Rz)N2eq|2@S0J z<(&=-9ItYx`bb6&k$o+zD)Cpww|%|3Wyj0%DXC>U&)l1j&akC=UD+KlC>{vVHFAVq z046y`yEIHGh^l6h4JdwX`T{vTQ{g^)(J%@(AK*~6(a6J}mhtOVJNcFDypKm7WFZY^ zO_~anJD)m9T0EVu)vi;D46uc@mIha-a*JAdZSyHlAa)WUw z#%Q);KGQt1q1JOTe78MvAVAEIxn&DPxg7;?pRHK#z=@5b?ivAg35?L!+4aV#Ko251 zAf%}=vHYbPrpnuYeqklH)aW8|AZYHLu(2P%l#Ie@!p(2p-2-c z_hV`Ci=K#7KpbR-N#`teB45BVy#cQV4N6rpWHTq@@lL+KxOxauc% z3zy}|jt?&4OA0inCbev5N{}-$+cT+6>b-8#?ekg5EL!7V$mWri8dj90@ z$xp!NUWx^|b@x}?iF&v7!7R|et-i9o*ELWhu?>j}@HX+>R*p5I39i)yc3RtwWgC$g zh=V6;1x|f*|8C|DF|{icN99N8&_ z)E6ji;x{fLK%s%@fg4w`l#i^;09S9@oO)%-VnP~VRC8i21yUWExF?)3z+nyr^cE*r z-L3%e3*y39LuX`^@c59ft;J-&9)>$vqFNsH>Z_#jnz(>@Y2IVU)w0Aeo`6764%mVK zB+`>wavMwQzZ9CZB;KmokhXgx{m8p>*6@T;t~EJn^`1pB4}bD;x0*{s0WP(1M+_ zzfW5~C0b8_1D{bi;zH!I+ZoGTTus3m?T#fz>(i19|Pb4-gd7oX#cI15|KV zih5a*MTj_C$>mc&8S7Yi0#mj6xJ3?Dcn>n6T3c830gFy6f#l||$VMMYP1|>qDdmk) z&f83}j<|l?wV8r6e|u3DSl%s2aq@oijW{cEgJzl&FWbYcQajS!?I;VbH7@= z%+xpica|3$r`GsOz+w2nVGLA)$O5si#x1GM+>VV*<#IBpkeV46Uu&n@6>5h$0N2QEcvO1zA)Z>o->WX3rUr>rT6Bl{igqhv??H^*b8VfV$4O2O_D zQUiUv``ru1`IEnXEpFR!Y_h8Lbr+={N`*4bkJ4JoTAk$vFn}n#)NR+*`Aw~G%el>U zp7mc>QbM>_VEgtRKKvv+JNx;m=(nC7_ASyRMzv?>?Go_C3~#0f94km~%P=YPhX`V( z@@YJy1)B;|Co{9`%4UWLh$wwU7%ZE0KPN00z51C=ujkqoxT_bpJ>0A^iyFLK>9&Zm zC%9M0u>I^>X|qSOz+n0e`&b4~cRydjI= z0gKY@E&6bBnwD~B=(B^{DS9KfCG9yI0=<3|ZJ0=+^N;U_Lrg7iiAeDDZCPkl1oi!{ zocQIJ4Q=`KN%^v!*{eDM)>no+oX-qxHu<0fV6d*pU|N{AmorRU1jq{O1g za(@ZgiL#aB!qe=#vn)cfr}$W=$zobII(omrf*q8g1=&Zacx~EieWTNI^}{)?`p&dv zRH{HGqUpypr-#Oq6F6sZk>}7wP8#GZqUi!L)jd>0&%)Jk2aaZ&wH?Z|TzJEvMiXKP z2K&fFLl5I!Nn+o<>Kbramx*eUEN7SO!0}wvVv5xZj^$^FY+b8!0SCQ$1|0O`=+Ah1 zLU5Gn z-<}+W7`j&Day3oSgL{CKphouMaZMGC054eXy=lXaDch7PyG#fB$O_%2)WG$*Hz_Wt zMiD=Z8~QkSAlz$nH5TtwLrk`VL=+_fB5 z;h};K@x;;Hhn7>D7Uc}EVDdpQ4wCaJuLznRK-IX$DnliDl(20u>mZILkA4-wKaTv^e?^rgy??)VXN#Vm9L2kP_ z4#%IjrO3XTBCOHndVY_W7WdOn2E|J_u$XAUIfc^&bncj!sg*jV^k1C6d|a6}d3cj` zymW{bR%Zz5sYeRARLNe4UGhkNj1oUOEAhC(6t~k{)#IBkBVa1+PR)ci=GoiWYW<6s z!@^W+dQmRI?>3K7gG~!sIdiwr29>YB3mo64xyQE5_Dkf9dp9lhWg1j(yzdGSdyO zo;w5p+!Y}2eWZnaTuAQ-U!IjUEM_YN^3pD)4}S3xAbx{0=ABa)~yW zmldvj!;a}2e$Y~QXht9B9!=?T8H%@YWXXk8asa5L&QX!k6isIjU*2&~bzlgLL2QaF^BvI>aTNh%9FB2cz1C zljP9>Y!gShahHGw_Kwm!Q0Xgv&2w^jz!)vRetsT2+#rxZI(pK5Yl4YTBSh*T>Oi(d z3v4U6oHbu6oz4!vMcKBP0xgUf`a6{Gr^KZ^Ek?Tn(3jTV zy>)ciAFxf?M@Xz_H>)xR)pIXT6yo2<6S?L6F?6<=w^9LmrC}37eJ&R-N$YtVuL!u5 zHeqrCE4mhbNkUpxRe_}5)zU3VNXLhQbSKf7HoY3{6o1!~&vCmq7OgnBkoUV2zu~af z6sl);*P0DB#sghAQQ|6#;G7bQ!F;z$yEN2VR_MpAP+J##{y;8OPt$xkEsHu)pE;MM zZw!N-s!&ZP6(O<6syR(YlEKu(_v2$diCAi?AS_jb^p zs-NE`A&hTl-kD1{8*{|vIhWtGKG9^|=Zgn{_1}}zo2%=9MIksaczsFVqx}_DE#|1p zb59aEdk6as!URC0F;G?>%P=HH*tvfNNg$^zS{OgPo+iLlo2yXCOB8|B{?|h(j(t2i zG$;n=%2#^MXN=GR?XME5hP*ya=Q2pTN@N3Dx-AL`zbdiU|6XU2Q8%c2?MO+2lZW}VTBs!KD!5a>?0 zu(9Xe(gUz-F;LK}5_9i05I^NNrC1SC@^#@EU6 z@#hc4oQBgQD#Hznx49fEOh|#Kes1;(x#HQ!{w>^9I;bvk{tYnX$+q>Ow zHhbcH35hdhRIx)3Yz{ZA$r`*9P94(113PL*RSr#!j_|J#yKmUKRIMo4aI2vtT*Icd zx>7)3t!81PZWU|)ch~OiWE8YnzA+Oz|IR&ZP4DvQ!f#u-<8Fk$az##?K+ZC}(*O$N zrQDI4J8X5a29EZb8&qB~Gg+VAl>VR7Xr^iDg41v-JjxtIKOG$J!*8Z(>TkE*qXwWXP(n>*h zvZ2H!9|>n%c%`+YO>PNYmFNE-L%8Q_{XxH=l;i#2#c~8kBs%bCbB1zIBMn- zj%7yQv}ai4J;OlW2a9HbEZi{l>KCz)56)}u=zI?&-0zC%C?VCidzNl*ALKyZbk# z1+6t%Xxr^hNV7x$*|m70MTUO+sl_U8U~SSWyi2!}VX)G9@2lHkKvASL2cHBL#<7`mo{7(-9MOm6atiM(oOb7<&IpsVCs_qpO)`JbzPRa@%;SKUj4h;R`xX*2wAHa>~tDTheah)tY~1l%O& zTUiSXb|L}_UR(nPE0YqmgkXGVqd-vhs^CpqkE*57`-G;7NgO}Dn4}V@Ig`uMbeoz(149z`;>llcGS&K{;3& zzh4!#x3;J|sHWbUyt(R^3kB-G5~ckl^`7_z&mWXPPkm$6GiSm^h#s#|ocQ6}socbN z-KN%1@#M%o>-%fvNX}|BSh>05JknTIwzGsxr{BmYWv3pNLdQJd&sAahm`vn#juCe?wma&-6azn;>I_a zsEAnG0Kx7Rq@hbFdkdBhlXcQ&1HL4)R^LxGt`Ws)m37?Z#%qdRZ$wd43IjtT*>LV( zjHLOtCWp=r1J(O;=MhQ0khceFHa?n9%faPC2$>#=g|6~J4tNf(XK0!vh7vZi!Q6Qx zc3Y1lE)%YeTPf4)*l%c%dcaX@_Kunl>I(7Oo`0nZRT3qM^C?HDeV^46nP>22o-%ci z$bv=oM3rmgqs`Q1g7uhu>>%>n|1G4p(AP~_vsS-ai%Y{0exO2n0$r?>!bV0bB?&=z zXl|n}OB|SjPK9bo8G8Iz>!i@ye@|9><01`c#o1(*-)0Xkg|diAACwI5o*FNjzFWDV znWzJKoc~`aUWCsu8=!copqSe@+u{f=bb_?r!U3KXeSmlP55c>xG+H?nPPML|PDc1C zsQy%E?j61``YVTnu=vnsB;ok~R0dFqx9216p-|Dh>L2@Y@2piIw}`rWpU#NPVc2~j z+bmbHs}Gf?T6=}=!dyW_PkMX&$Yy6Qc;zVyNGxNZCQFk`&#;Ea5n%3WF)_6>^Z$LD9M=&D74HCct7F zQp|5*w43_kHPbY7Av+WTE`JRTWe=vGCa?3ax{mti4K5pjHSc;hq!^d8TMq3rf-v&n z{=aKs{nxOc8NI%|q}Gbx$%y0{Pb?IChS|k!LS!1@s==1!K(GaSg6*CO!$LLqei}(# zi3sJ2H!VsPKY9s{EGY-HE^SO_9YAXUbAYnz?UYNhnz^6fsu5Z4bVdp)ZL*k(7L@Y5 zA9YpW?;OaSR<^H+bSIrCf?^Usa7qaEeT)%KeZca|WUzX-%0Y~&qh~|{03rlg5+CkW zisp{9-JF;4dTVOwt^>G_z0%x%JK?y4Hc1!9J&s7W|K7iVL)AV^v*#)1Yp<1ImIMTg zB~#cbIeUejd_}mhwP4S)d;tUwcmV{)qwkReM9r9HO_GZ4Cpw5ZTUQ@ND3ZDyDiAS>z1c@V)O+VTQ*oi@7o|osq<{!DiQ|W>|c{15_0q*^uw&MU1 zceB^EsPmnau({ujQYP57LCEUS^^~k26udeM{W#4LsN526?vp-9@5BZlZFdrPN>j#o z&4}@N?hMU=LrOq)jdovJ)(~HhP$rqhYVbwT@;-gb17$fgKw|5Dk=fqFFY@5A_Lu_W7fdWdKblarYRr=i^kV-qGY($P< z+G&Str`YI{j!ZK4`UXlGm$HD{LMDjrf_RZhiIASU%gnnETdRsdekC8pQZ}_YtZ0 zKS~FzmQB-lk<>?=DYm4gP>zD~zjQ&Rfn6(wGK+q-2Yd$v-pf4zlrF{xz$1+*yyU3~~Zt zFl}c@SPy!EffZw#&X_sKf6D_*5OrVBB~V%hbhyua^R%4WD&5=%_J^pPvE8>gH-VC& z7xKX`hd%kp>YIkKHEJUCIGz>3~V=88_+secKw6i zus=v>OHNUF69DL~z;|27IoY%gx!KNalY3sAE^xD&Eb0M(k04F*KFNErcxOn-q0UIN zHqy*~z8LWKJ$;H-6r-~7@QX$TWgJcrG@;Ug)@K;BiQMe4AG}23nf!uqRuEXu!GKG& zGigVEJH)TJxAFZXy`W5pO4YD!`hefqlWAZG>wC9Z`UJVldfwBH>dZGEWf4G{59R16CIgwr&dj!ovAW%pT z*B;x7jONq5k6!}huQu;#KT9IeajVh5((gm&b3(O@Nu#Uo zF1SzhX(`)y?4uWRHyWB3U#sX?(`ap;GKiT?C=NStlLmI-Fz_VU`RK0~jJ?<~bm;h1 z-5K+C7UhH_F+0~>1w%1uZXye&g_CFV4I*ha#uLD8f*lMN4G~hXJLgJhpjwLQZtQ#G zw9~eqi?^p%=cY}v#v9w4Y)8AQr^XAia;;)dfS!vppezcg;H4#q{tBiQeLnxq^9g$e z{|o%R^(rD~iPPLs&)reI74EKy`4RpS>y5GN$hp}uk+*~kYPJFH9iGZ5Ppl_8|XXn)32KFeTpKNMFbwu^j{Xuo%j(# znyv;$R}TfUv2U@@i0x3dc1@yX=Q}d`H!x3#1u6kWjw{{pu?N6nI@I4_zxpq=x({8XbgqTvDCLV(21>WTOfCNIG~(6RlTvHNEeEPz zD{1+P-JYHloK@MpoYgJO(fgIlsc7mfgOR#^WbQUMFbR7|&(B*Xg;?-m=IgRY%2n@E zlnO4QRE(c#+_eJ?vQ4kEf(tV@)=4w1I^L(&d;ThVJURl8eBEbW!ocyvoxvixiYBiB@E*5USaVZg@0N|Ur88)asucWq!}enl#of*wxP|t zJ8NMddK_~__zR(uBca<$FdM3z%wK+bjLF z_dh1)ojhxNa0oP+VQx{7tBLv!E@z?iN}8%h1GCu~`Q)L93&?Rviq8-Utni#3Qs7Cq z@kTz%N+$!M?$pkVr1cA|SFTdP6!2{`$b|L3bySnohvvt7cu()xQx@-*kjHMWoCeD; z@j_>-XXn_t9Bbz)R`7`{kFNc8jo~PVQzm}Eg*|QSodT#HwH2Uc&V2zzDjwpcX|Beo zDHI49@?>`&gTdl>pfemQv6xY%AQN>QF29<1l(j*DP!M$%NNf_y?9tbvc(xM;LdWM= z4#~t!q`*J4Z)I%af!z@7KwuGss@mZFj*qr*MxTBL`+z2*c>k@9=0)?WCEm~AfkS(N zm)@GD?R+i^3c~ZBC4Y984M~+awOgayu%Ko#|I{#hTP2lLLf- zTLwYOz5VW4Q!UENSo4htwNnfrl5Dzl!mr7x@o$?=8@2%y_t)cAJYv9uBq0ybod?Wg ziT&n9G3%`)wDDVgRt7GaKvRxJxSdsM`b$JHzUxVG^N2U27GA) z@+IikD1`Z;Uw?k{M+kd{@W&GV|8@s$B;X(3$ zQc<@A3h;R-oOiOm5$pjd9D~tr%U`@GyE_y|O^&iueH#!sjOn9HB*rscCAbt*vUgZX z9u=!-bdw#3KnCP1&4Kd4TL5rmAKnXt9iZW@zH6aIAQJuGO8XfTNC0f}Lb(dPkA~i# zPp>$N6K9K@m$#FUNJ|q9_4~23ZQEU@H}z|AW@@@L49y5T_x**Qq{h&^6@fVFZ>l;# z2ED!`0Fdd2da}*$tf4v*^6r}Fwto4YSSOZQRukgTGou5@$n|TfH`6X#Mf?WHz$(nJha_cIA~Vm|B=h!F=fPF?u;q?6?|Xz=sEi^^15F8S7v3^;%T}-DT_Gc;HFmhI#7oM zqoHrj|MA@wg>zWN{_1*)G8Uy}1YTq`E|=IeEvfNw;kD@5C-n%e`y}tIkS-SV0BY zwYS`gRE=%!QtRdl@hQNwQUGg@P`QU?mYO(v5-c_f`U(H{V%cTEQDLUQ~O71 z6EO!yV%}$7|8c7qs?O73yvzagaD!SUr3L|vo((z_+>X_vbmrhR7;r$)-3HW`erWdR zOEfCfJp}}*)cr^m-m>Q*ne1%;xGm;8eXC?`>?@vme_w&3D9gNJTaPEjHbgpb>DfTl z_$O4kwfU5f7ta4pKo~ryh9=l?)m7^oKn4aY#M6B=P1{qoEJ!XTB9lp8D>N4M7=1*% z;{4d{+HB9@;Bhi~qh5@8$sZf=(zt7}`vpq70nT$%p+I9u6U7Xgbu!MbNcIk7G0gI$ z_=mB+??MQa!%vy9N6QOXG~X}K?nE;}j70Wfoe<-Fk;@S>^arJOB7+;a2EI;gYYCvO zoRYC_iGs!#22eK3aZG3zy=VPkTCKo3bPvV${sOL}A+K(6+T) zVsiRWd0O^g_nVb@^7C-l<8%LyySX?yDHP0Far6Y;t?GUz>BqgV1d>*DfBEs{eY_t*UFw&!sO`91u$@zW>Gn0;e13UySthNhYZoa=+2baz!z) zk!=jd%ghtc0hgB$&>~(XiHx?(H3^cd_vh7Wy zff~{`n5trrxHY@WcughrvDGU#6(E`{aIpqk|zVcAu z-!9i#?=?5CAuSDEVz6p0lK1}MG8Hsbpc;N|IX;-rgp;OehRY*t0CJrI`hP;pjAPy6 z!e#OV$K*h%v_ld{;@1I19ZS`nMcXSwy} zkXV^DJZ^63>@??dp|NOQWn}ZZu;n||fm_STGz=Q;Xk`>lxT)5=39*vS7wHzqdvg@_ z&&fa1i9b~7*EDyaZo)fW`&sx zR$0!vb99p>%whZ8SEY|E_b*->#3(j@UHfpJDJn=(b}hAyaX*N8uQ!-JMa8chHd#!C zh-AJ=yCvK?d%~hm4_>okxV|Kxc>jS4r6}dHr`m*!L>Cdl@|48+2ru~*6Ttz)4gXoP zok0(h;4wdFizzQ1N=~U6@CZ_+TE1?fnN$!dst~P3AoHTWS|z$W zFSdrDN774^BXdQ|vP+@A8C50q=U|1hWF(O5UE1` z8>wpRiUB*3?|0^{RfBnrFSm_bAh+S?-xVxLwqm+7PBS2LBtramOvCxc9+glIBD8v; zZp_T%f5J!Rm9c19YGi9f67$3>eOT!ij)(K4fCxFkZdk9e%z%d{ABKKD7h<%jo`a&nHI zjY+H(AMI-s(B{Lm_WN_+o;X`;B`Su;)ZQ)bZOL@b(wD^m`~K0rW>O{|Ut5dBeVtz3 zn7}hC;JDagx(xS4?p|DmR5qT%SyJ&7KT%@-uY*gxq6t$sOz3M?KWNDI#z>S&6qD0Y z+*Lkec5!0fz?5=R6P!2$=*Im*6smuv@))Dz((8#}W!tI#6)f*ec)v4Z5K2IbAyg)# z_pRq%chVjj0{uWyvBUMO=9faB9s#*TZ;rLCe8+YJ7+TY*@RWf!EYjxZx5|bt-Rh#= zsasSG-GPJ9u|@hYEct9=3M9#Y0|zjsrn94o>PqunerT$<;cU~jI|RVrpqbdL2Q$^( z%XZ~&mr*`##)=&Bvz9!J)9kZ0h}ds{+`Ob}S$9V4g>}kN96WL2EL;`$WLD8%b>+K3 zaufTh_$kV@dWrkXcMw^QOSsKn?~+No0W$?!L{Fdng?%iZh;2;E2VM=Wa6iU#Edl4p z*3+&BCH_1pHHhTNnr=zD>X_>*|5rw`XOen9YS?tj?u0e=P0JbYmo;34w+W`2UpvO4 z*LJ}KCAy}f`KLdU=U&XGVCBrdpovHPI&jtGa3O}V!2rgX(A^~_jNn(&;~U?$Y!;cD zpIE=cXErJ#cn<$C4hq;zZSyOed8L*!^pL-(U_a-s-Y>E)Cyfdw)Gy*U&lrG%AgS~6 z=F_OaLAjfR6}r%!DoK`#9k^++w!?t>N=NFQy>#Ie;H{(a2Kh+h;VUk_>pawSkaVq) zNF&^0#X#wg9uU{yUbI0l~T2drFie)pOd3qHKBOUc^HPD#S2$68z?oYGRZ zO{^F1ON-cy#6{JnVp>1l;Kr70z7~NTmYUjmw@{DJckB@BgzNY~C3SZvKQ_O`hW?!N zl#a0yeGAbL$Fp(U!F-ba%g#{rN%07~>ESu_%S#Sn0%?0%tjCO4E8W{%`5W^cpdlP{ zYxX@cQ$A5{S!r_jhO={$`2C(c2nF-v{9IFWHS5RHsCm~!*BAR?I^ONhp}-rm#L}9A ztQ&6z1O!GDx0b9H2blMa!@Qy}MIlj!_{vETZr zDK3(CW6QKAOt*RdW!I1tR))DU_hQJz5aBc``zN=JK!mxr z#4nN1&RRA1{hY;j^Gvl2iinPNDtjPG>6-X{PSKES^S=hXZoIzu9%*{%B9iMd-27J9 z{;&QD9^Z|dBWb}c0X1Ua)gNx!r;IEuoGIqQRHIu@zBi!>!=EdfDQn>}#+k%zw$s*S z2irra%OnFdz&=tFBZSXB0?iWihZqp5o@c9+o!g2xazbJ+EXlv9)Z5mbsi*g>S?Mb$ zZ)ou)@CVyT zB}CbgwmxnhufYlC7*lw-9Jf`UmC#C5v0SBP-$2ZD5KnJf^c~foh9MNha2@G9cZLH# zaDuaY_+&ZGJI_3obFfZqOB^<3OpXyUF}ZcInYmQ@D9&>Q4NC!VqT7H6Rsd8sGM{e22O!pGcIz`A2UBB!ueDd2Ga}@XyJF zShE%TvprnNDUjF~=>~LQF+;?=S8X1Nw*FfMNwmy{outvH#%Yy`Oub zMJ3<)EUhO_{oQ+8(}~RsNm>D=e@Xqbq|p7Gpo-I;40+FbtIe>d-lN>*WYFVN-gRfZ zUl7SCKiGM1e+t*Nn}=}OvDZEa2AprHEAAONVr|NXEll)cpQVofoVoV%CurUJYuDh8 zO)7JrE}CJ9X&Rgrl^{}Q#@GD4z9jqrND*Ok*lYUX`k<~*Zy#Fp(&E2@malE&ie#lc zKLvIB|A~$YIOh|VV6p=JiWjBpn%Hs^PB*)xl%bGhIpnwS-hnSWI+)MlioB1@FkFuj z>uKA^6-TxVxb#AHtiN(54=t7*J2Yp!p|f2JUc=sA$n3g^(DE+ZKg>%GADI;hsr z)ck7{>)_KGgqFdXD0i9~zJCg*2@wZBtiSCmh?0$Gh*9hU=e^05dybA%hfP02PLIP5 zB;gYia%D4kc6qN4f_mt}CWS!vLjF5%t!Hcp&i2lG7g;-M7_ohJ$vUCHeD0$ba)5W> zOeoG22-xML)k+TQ@n*ZBz`89MSw%>KLVu5(cI? zvnJ<|61$rAQpA^Zr0-v4hRxdA^~IK2rfkj#^5*4HX{c-tFYs}mMpmg6bIRR>`Ux-))alq!zNv}LmRAb_T$4kJtT7c2gg=gEoY+&5% z-QZyvFb^ph`>=StHL{u{YJ9cLmu}ThFm9_uTz*5jG?s;j{+I>BgI0sQ)fpkk*0faw6KdxL4LJ@enjbu73b~xj1Mx39>;qK<3WvAIgNI zmdGqBwzlGTp1XmDAmN#i!V2QZU#U3Rl%sEjH~PlEJWPGFB?4)zWY;ljU{m~lUcYh0 z=muBrb&;1L6ZI-o=f2bBP#iFZ8Mby2eiP3E*Z#$^#8{RetyJPl`yzWpAf{|A)pc6~ zlr41BVsWggVbR2u8%E^xZ$`Qs3poJp{s53WkgHmk5L@cgbozhz1a~I1=c4>re-+=> z`|D*apW3VmL>K)6mT*TwWKWTx#8`Bbdp)b^E4^d1%-FUEeewIng;>xvnenr4Vmebs zC1sv47Q!@e@E2P@ImjeimYCcaa}I9OGmC-6dCF;cuEirGMUd z2$_QTk0em5(|MB}aoFhhC_MJOG5ufxOOirRmLQ}GLH@DmlbZ~tv`VQj=E2uUPyjQ-E>UD(RWc(q za47?fmQUZ^@AX?A5%2f{sB8v&df}nuK@XB7aHVqg8qzDKAZuG?(CWr~Oo=GA6@D&I z#ilwd^p`t9WxH?jVWVKS1;9F^>x-U$c8=K>**7GhIQG2K?Zx2D$yd=h4R`0TQ(k$8 znWXA7pU@H8;&Z=>OiWqTongyInksoZuA)Vscc#*^_1N9V18(#AXwL zx&tx;VO_q~d(EEz#v81gp)H5WraVd6c5+~)@ywxsSCyK)V{SZdpwX^Gh&>;~F#C5f zbSuM{ZTHi++$X?~CxZUrhRTo|a7fdmv#TL= zU{t5IAAClb+j^kI${2|P<6pPclS&cs?J-`#vwen1kj7JozD17+-yj0=T0P?np$`Ce zg&nvJ;5lHA9)sS6@_gP<(6uMlcd(}X%sR$Fti^9kdeY?quSRE!lvM&WmoDJiB5GR4 zh5#DMwu*PHbH98xUB+wBRBGI@?o6li(8_`QkvDmlM8*p*{jA4DlYMd~1{`tQ>He&% z@pBjEJe0y5N1QHQG+{dT-WJpB`ouIdW>4S4)?9){mxmSjji4q}tNtC6fJ>kqFizG5 zpV#hnhhFK#dKSPhWp<2US}XV&UfyyZx)4-2=YhS!G&p`xippY&9y}!DD@Q$RlKPv; zSeyKzATwtV&}`6gawMDEB{GE%DrFu4^i3k>X@O5{r6+8!-d@iWxdIp9^Px_eqEQLvGq623t@vA<=4-_`<>Eu+Iq@Mbx&B}yK;O-}? z9ye0qcPM}2(as*rb!oONWXY#-$I{arNO$RWq-o||IQ=nlkc>`zXH4NhU_cJ&#$^q* z_=5S472o8&^Y8T1^Xc=H)KKkfd;=~z7;x)5?^nHMop@*|r{K~>Aom$^446vzsSHy4 zQ7=i8i4s%Gi|<+c@OInb>Dj@2X(LAuA1yn8injBa6UE-pXqs1aLJ8`HXUpmXVMC$4 zSSb`=_o53>--saX7}`jzxE~@#DQzYBLufk_hwr**!E z#M@8R=JcoxVwj zCTw=~$Ir9ZZ)n)ChR!mcp)Dws)&DuXA&WM-QZ~n&R?WA>B(=(21#F;Y!~>^(+1u&bBbprHmrX8ChKCO z{WIox2?pAr-E{KdJO20kn9mrquzI>5JJ&QG>uQIt46&9enKiIVWIFDpbAITEg73OX zywFoQgKoi}IyA3c>&`@__uGU_Snl@bcfp6j=+?VwXVr@{jW;f_`jx?{n7|Xi(?GFr za=FqZj^Ls-KZ>oWxb!uu!IOBVGe%r=)&o94@so5m+c{&@!-&x(hN;seg3mvEokN+= zy?-*d(~y7`{ko2T)~UD~bu?eVOe8{J`pVJop!MWqK714O10PP5tp5a`FQA>`{K1{0 zWSZ~%MsD~sahBX6*b7a$pE|Vf{rpaV`2?%i_0&%1wU$Q+J2jx)b6;Md^^mg{r|R{d zWCOMwP4#%qAd8FiznQN<{)utio@@LzhYI!I`Km6?62q`;V$6m7EiZoDW5A~M=6rJ) z6L;}5Efd2fDQYP;$%Pa1j(Bc00%^W4DjQM zXZP8nuGj#sXN&)a{65Ky;LBZmw9RheMk#V5{pj%z-Y3H?!!DQkBjLvsRtN@|;D$b8 zh7>LHp)G5*P4G=PD!6fn3{5DfPlNxD0k7Uxw)^JOjb7uzHj>&-_KlGjZGuSS9)DWq zGeUzTKbkk^LrSu}cyC zoGo#l^{sDC@5cz3iz+u@L~h&8_S=LPS(+{v9TQ`{L7w=2%tykcg9TT^%N7!>d*hN@ z^7$wyFgPq#67s}Ur3SRgS{XGP$^!67|EIn03~O?U)(wavf}r9Cl%}Ghn=T-s21P-o zi6TfxDG`xgLks8@-GVeJ(ovcM0qGrrEkJ}&q?dpYAap_vCAss#KKtDJ^W5{?ANM@+ zgNJX*`o3AS)|xf%S~Gz2M}G>cizlRi?gv{_LK5DyPtw&-W#i$i9FaJ{k29&n_=nRm z4gS3fT)*bT(+>$)1Bpnjo7CI)u)P{fTsTEF?_2G&91=#4RiuK+ZgNXiysg#jgAF_%*S)Zb=U5GJ!Q_waN+_!x(^^0D$=KOd#i=s z1LveMO@sD9{rP^^qoN_Wrjr7m{9=8j^(C0zalPZ!I*D3tu_0q0N>7hJm7I+qG(E%u zAAkDiG|KcePPfcc39Uyw7l&~@XB`owCAIU%&H)Vx#*h^l#f3jjs+(X zWD4R9j4rW$e0wT0GX$BqV&N$f;o%98p`teDpJ}D%fD#p1+oqVsX}4ZEkw>hjYsGLx zHAFFW>Pfc&{LnIv@B)~4vadKpiJ6AxxZL76IWeb3JFI?tj%8rKux4GhCsk5qRrUke z%mO0q*0KAfKjJ<{qz=xu-|O8mSNWp3|{IoG*BcUPgY@~ z8FDVjj2zsg;HVQIDlQ!^-}t;>+a)&IqAa!8f>+(vyLac$pY3DMYdOf(eCtgu{;{wt z-SQjYR)T4d=NHb79HE#Nm}&4-Rz!t3R}OHM=3cL}-Ygm_05It>{ z>ipN{Q?(I&7mu+uJ;Ypkc8lv}jG~?E6&0_h;UC96;=>%{?3xtKG_D7uNXJVjw8SrM z=N~ZLu<~v7u*5ofPIK-Kw2^85yha@Wqd*{r#gSEB{8uNqJqImK z+J1w*V;kDIe#cg_zo6y%aIw;w<+^Yvz!m;PLXJxm$aZLb^Fd?a73%m&=t_tj!S>=AubbiLR+DLKdv4~^Q;wb znpHq)eWtDF0sXoXSD!_^VzH&J$I3>OrCUQ*V)EM zj~uDn5eHc#luA2c>HD*;(4n2QX?{f)wj~V-A(Jk6cA;6Dk+)pMi+a<3 zs1(io(0Iq75j$8|I^(J>ew9@Hpgj5bF)c2|t@p=Wdy0NKt2Ls8yp-lP%_21F$0HLz zUHk=R>WRyX1D8zfts?7%#h|!D+(PA#sEZzJ7AoTl0Ux~x{?oY^ys)DK5buQ^_wb*V zHlN!a1&m-mYks=Z+9ndQ#qm^=aw8CrmX(B|MM@cIWcRgZc$WsPrir+ zbC_wXlIMdS@>3<12?g&EwaNguzkV=95uaWyf5$FF{PxNivgRB7s2JjI|^<8vb`wPe23)W)sI;Etuc* zJl7Q4KgWG_{#G+%N>Qn0+3+XU)Q9`RMB@ee%f60@gl{*_OEmbb16RkK8{~v^bdMe> zg1yTVv+Chj7cZLgIdrbm=8FLDpMNnKnRq4Nb2vLRHo@xJ7gZk7wYhwb^(;ONk*RWs zTYdgu{~Xt?tS44g0s6E^@)aNTc~}4J zf%V~#3IUeIcLgyA;YEHMX09NQB~WbUP2Z|@lLsbO<5duJcGWdvQkTSGAoVVgiJ@qb z6q}5E$ZvWL(-3(WUSwSsq*QinP2_%Gc^SV4Iel|^>S8V8A zZMtd?QYLPJ_Gcp^x@MPa)8axd#24!M&L-q&HX^x7twKWjpyNga(M$F{$@mh~H^Rul zD8fzgyf3yr<57L1kG{vgFPG9f8P6r2dgbDkK5*K@x{P56y%Cjz5HC_u?e!AjMp7r|mMZhE5w$^YU7M+)+Qz$L3&0?biX64hrK zCr=aaQp1{2XK`u)zGvHB`eKh>>+8h<75M_v^9rzbTd zf;?3OD-b=nMOe_J`CPnfc~ot23%5C>(WgFN&7jOoIDg%-v zN2H*`}fAwz1(-^)!DZn8ZUgYInopE5n7Yy zAwD>o`v24 zMwmQh7QWC!S3qIHl|{?EgM9AK(}2;me#)GFeI(6llbugfqNe0y>4`_f(I5P*K)c4` zs{v2(IdMd%mLnunhA-!wB_Gbn`6XoyE$eR*S)DM$HDEFhL?K_=6~|_m6R8ym(v}~X z*n@3m>en)uxof8Egu&@2jq$!S1Rg>E6_hL*Yk825tv^56-)?EFAXAerQ|%)Sj(SZ+ zTUaOxE3f_JwOdH}(q+oH?Kx&M7s04K!KhjO024b+$cfJfZ-!U;^#}M6JCtpu&BPnbiL501N8&-xR)(|Y$iXIY z8BQtkg+61T`_w&DFm-0h=sZD&l%%$NkneDr6|O;sx`xY`K z$fL9`{vTHxGwGEhvD4as-KTN{&1A%siz&&E54=CY6c&s^FC)nvh?e|eaHtdZJwzlw zIkC)f$gD*z)QM3;ZFa!-EF`omErJ8!j&B$by>91C6PZSp$k?}4_hCZlyKqoCgF$V{ z#bngdTo)_263ntjai-&hT}zc%SJKxFA?Hx5fwDPmbdAfERd6XO>`}su6IEk#rE{li z@ax8D=TJ3&=CI64j{4|2uhy2X5O4}C?PDw4>6XuUVNb`qI*DBQR~t-WF1BE1Fq5ir z64u~5>!OfZN{TVd#|v5b#u|Z~+Yeb7)Omve!i`drDQx#z?|nVz9LlK~i_s)1&ty$s zX9beriwZWTjL&rWUDsmNaIW@T%ghxP%Q61|2(sykw~mWn;v8~j?(cUuHBXC5~( zpoHFQHT!znnaRCEB9j_oag&$;6i5%qjHD9k`{owH+^)rx#HYT%34hvG=a1eTT3ycJ zJ_9HwMn%szDS~e zZ6oN$!;d_U1+{iBIyJsX<&+AXm)jaKR73b z?QJeLmalK;1s!A-BI9zokAlXvrwLC;e7IgtxKHC~okVBoR_aG{B~Y;vt5h8$&2ObS zGIhEWDOO+(iTg^H(w7)Fek+ZUsiSUO`T6FMfUlJ8*X-6`=C@KCnPR{j)|l1a0Hss@ zMELUemGR=4T)-1y=g`7?5)QYB+e=@kuLE|fvZ1m}iXAm&7o@6~!lX(9zLc#bLnDAZ zrLUA7H%G@7Z_*%c>L~m>G~t@`olcV+ZZHm*6zPQ1O!rXNHg4(&{5w`SbygEm^~iYj zA*ef5RxF;}o>DC*WfkT$C zP$v|Z=%iYe+6d471-hHY=6s*rJ#Gc4xk<|Y<-0O?`N&pIc-0f)un>70k2K(x2X!qG zf-;fFFRtbp#Y|!1#S6eP!`8;8RD#k&W~;%RV_CqHcu>0L?vpBd?}>HqNfA5=1f}mi zVO3{w?O=jm^mze24eTrw)R<)9<1cX-7+wL~%NK`4VM>A!h6)y)ycMiFGL<%yC7v&C z42mBK6Cy~aO^cvC1&CGGH|T%SW*1GAa^z5>MvuZ3MzD41JjPRV_YhuS5oA+_A z$ciUxurjaeAmC6MC*_Ax>${{Btkktszak0$^}NI!)+69`3a1H4s5Q|^Jss^4p7-&^ zsk!1Rpm-`n$v1ZSLiTxQwuX5#f5{l|Gp=_%hm;`wA|Z=Z z)7-=qcDJ{B(s{G{ubcl_fl?QnG^ji8ob9FvDl{qb+X=YoRdyJoim0ZA@OsBtUC z5AX`x&EaLp4KBigg=WqTtQ#(iSR92PkVKA7PhSNS7g$(g*_7}&fF#0*g9WS&75^_k}&4x^2moL|C*?AlVZ&H@A4KW{}}&)1=HAw-##)J0BlR0R&VF@WuA> zgv-fTy~UN|pn*?v_Q#)0VF8{C)4Aec`G8HyLZ+s~ZL;BUzQd)U^wd8j>P*Zad({>~ zVKZqh)jsdMVnsg;3f_O>zyY2G%+^C+dwgva9*C^zyq3p9LqJ)6Y* z9b(t1pafI9k_N6Z;#@ezE7Pk~VU`)R)usHOA4^AT!#n(!4GrqSty_c=5@__AgU@%J zPlu@F_7J=jd&A?BbJBg^b$+d7t^ysfo@8$N!&Ie7@t%ZvwXT{08PJ}WxKmOE2ijD1 z6t0t}?8}icFkkrMIBYRSX&`plu~SCH+571s*ic6cHnJzqBCESxzM04hlL;68c#zMo z^{OBn!&F!hBktqn@)YN$IWh%-c$=TNdBb>d3coKUoo-C+Q0zj%0&Sa$9po1-Yme>2 zeI;w=vhIT^JV=APHtjR);xk7A;XDTU%^rf@v@O*im2~m zlf&oj+(*3KYB_>n?z(dOa0HMM&9C5|q2yt2=GOUs+8buMjhA+mU%z}4klS4hjsVLx z#KzaB?3OB`J7nxsKTsKn#{UrR;N>mL3P%jRS({hvRiH--S!6(L4p-?*HuoP(B|CM- z>LcX%P~nj`%Mm_Nx#wxM3gTPK+94e|hQr!|{B&f^`tmb!h(uWCGk=W^;equMS`BM# zT~huAesFqHf!x|h$S5DCep*%J;8PmhL>AMr?@Ih}lXlD9b9Q8khvNxGOMTLb@+9BH zjP{@}LJt|HvK*PiL^(R=x&>*M>lHjNOsG&E_7~b)p!yjM1t`cC6TM{Q1t61mQZCoh z8?uG@-w38Ewjp{v?K_uJ1<8nzj$bzRCQ>$^MCd1I-d0<;_ra2Xu4sI_tl<13X~)## z3QRSdP3EQ7C1<6jSzZ#^#D0mhzyQbo-NI>0L&Sj1%VFn{#>~JUBouSH*+`@A>n8dT zM{BLTa`E)s3Mr0sG}}U6-BcR&V09~a`n#QG#~QyczLUd8xs-yLPJ*@FTyODxm#{k? ztIa%8*M0_A@}-kOW4dp+qO+YauM^Ae;Zk(!GT(EGXuOo?D9C9=D-_hOUP0v;+};@O zlgnJ?rQf3&su@$eBU5P;^V44J-Cx2BZsLOP8or953)IU#xZ@E3oBC^8VhLYae)A+h ze0SkF1xvfDF68Vtnb(9-mTLA`nc~JcDM#ZttVx=@_`CWd8c(-hzp4?$Svt0R&&K!U z65alst7|CqT?i^!Yf#Wo;3eKi-9xl5K4OJg$qzG`#8PpABD3vAqDdJV_i9u@Q!t9>Xl>R$3 zQ`**j+V&O@q}?YgFRapw{fs$Ru%TupR-Ep@cJ{8DR;w~u}5Yu`!C4X5OZM1eO* zQB1(XM^V$wTc}s`y!FfID93snHjwHM~g83<;3S-Hh+B>G>hx?DT3|I|@(Vwp^8-OA>b; zchX>+_*+a`z`JU$+?diV^+74%6iTf#sJrG{Ht~bfi#V^#4kGB1QqTEe3w{omkO#Eb z4Gx@r&CZuh3uJ-qyfzqVBt|_dr_>!K6=wRGT(6E%!`^mup*Be@+z{mWByUIiejVkf zn0<(k$`#S@HI|c7F5i#YhWAOgCf?yE>eTUP4>jxRT@2@Mq?>!&&)k%p>)yv|{vnJx zFtU+;tbR{Z#-ehS5(NV1PhhYv1T{iT{rl2bgww;YdId#?x?)d7y=5Dy{KlS@RDv{`gVqb=O;?=hq>-&A%j_rs*_q3<6)2I9ir5k z!y1O4vBJJcfdO^Qg+l`}H!81GSo>?griD0%6J~3oATNwRClfz_cKhY-tHX92PEp|k zW0ShQAwMK=QhKt4L+DvwiN`5u4>mWaC{aUk1csW;kQTS`&p?Q@rt#^gus|I$3A;2A z%z^)6Vh{IqiVpDFQ6t%z%;=+2@;Za8(wwwKedk-Iduav*L;AEE_B#|^p@C`<^u7#J z>g9J7IE*KMZz>M*Ifx$uTG)Pwue{}PJu@!nuAgGski%JOK@9G&VKuH~B0DM?w<>2G zG}iP-HankSfIdPwbD=GAy5gPB9EPL0Gs}N#D`yO5Spgg)bm7I>1_o6*Ah~aA7oSrM zOS(U%ymy^iY^N+5SY8O{&2KR&i_6yaT@&~aHdA28h?^fnx4QDHxR$K0%N$Exm=Vz( zICO=yz#KU08geVKzV|q4Un~V0F_6xsaN!<^uUtx-t{zWf*V7)CrjN{m**VZ0^Q&OEudUkhHld!Rwbfs_3o*bnYw8y2Atji?EI5v!t187ehw`Qg46rYe$U)aV zX%TUHYhebhrRjgbDZ^ZI-Ks>kM%{gOL`wE`74a_%GFU z0JBp#_pe+V>Kg0s(KrgH`E|ahtYAv#I)}Ong~v4-%1o$bQIy`%{>5Pp61fxjG}9F{ zpVQ7s9^_EUVs~>xmJ%1tr^Vwgx8a@v9;YwiS%I@)Bg2U6l*p6NB^m=atxln=K3!u5 zS5dc4(9IbOp6Mj4#b)bnvGe5sUUM^Q#Hwjk0@u!fpBYwb`)eih9}{+W-qhefzU@Gj zvJKD)1KisB(wZ_UJY!d6f`t&7nPz8uYdm~`s@EQaQxGp)=lYAm<%lpJ?G%@P79`u& zfcz?GL8{`13;0f~Qhs7et$ONKFf4C!#2{)NUxl^mA>-PmlHvj8C=9^^)nDWCyuK^!7o?BNJ zEZIMOqHwDAJKxdw5OO?DHMONm_w46(wk|95SAL2FX|rY1?|}*7xjEA4 zYrXBzA5}6PO<*q)1 zAkx<-by0XNb81-(W&LnQ52MB!_UR;E5Mf7xmuyp4F$4ZOeq-klkJqQ0SWUJ(*xV0~ zuTJyQ^8y5+F+1Q<<#s0p;pcTMjLmppZ7kU*9W|=L__tiY@|v%CZSCNh{bpyKyCLVi z$%}1{ZsjZGY)xHDs|m6fHmp-7L4eziI9MJodWq*w?2cyf!+ls4*gy!qcx~A2pc7{% zUA^fqBOP=~s2v zbKt$UHDL>Zi6U2W%Vk*5$U)QV?stZ_gqWj8{j5&o;<^gz)MBB$ z-v%zSFyOKyrpAGQN%H*5=G_mofd>g8E}nBbS+&-}Vf<`^e_cWsNq?;FG4ELYtEv*? zbaHmsEp1!KzYat0GM!6s14(c6fsVY%S|K7tChA!rS zqOk3~=rManTz%gQ2 zO>s~NN7(w5u#q^aV8Oq0Fr4H781FXT`Z<4l?&%U#Vs};Jp+JMnR7@B)0Figd=Z(`m4 zlnt_q;6fDUSG9riv_z$oo{IpR>tClvuB3-#-Q$MP8h5pnEB?M#pyKq~VrLJJ258#k zAQmO;qI^tHV1TZGe(cc>)d(lM4FBv-W+It3V?mcHr(xEv=a7ITMLWbw90u0vryou(NybE*w$;irXww`0=Qy$fNM8Q|OitHBg}D zR3hBpPFCZRE29SY>~L2c*i~qF90j`8_5@`xSiXK^uP!c+_({y)_jAVdLx7E^#n*ZG zssAW`D39nk0Xm97f}IAaJ<3uNiggo87IJp)lYOHMwl}aea(+t1rvz@YXiz$S76%#u z%IAL+KaiK`Fk-}A_#_C0Vx;@LtX2;4rGE{80u3!z#MkW*)-OV%-1aC0Un8jk8o0CY zr9YYsdq#dr95gdq0S!YX5XvfBq!XW#SjhrGR?+^HraJfTOzE5uAOe9)qj?ssk6Hpq zN;kY%_^d2Jbb?%u_R-vpI-DwlLU0Z{&R(+29sZ0so~G)l0D4klE;o4HZZM;BEA`&8 zU^<8-sM&Wr+$2)Lrsg{MepOLanaS2>_v3l!ldWc{T??5`Nk;X%re-t|k@6M<;yxy< z^O!MeaCmPNmUgiMLlDRlTi{)tu*~BRqCb$tubu(4(#lCj`AG{ryr5~kial!eAyg>W z0#F;-9w|={6LPIsz{`x$kU88CP+EJA&N{91AHkk0%L1rMA1Er?#>*vYbhpJNR5>VJ zL(HP^T`8v%6+($EpZIMFzv+}F)ZcA!S~(Du{(^*K^Iw=v%;5%sPFVU(H4a%^THu74 zxa{)++dkIq)Ei4%_-vBP4gQxIEPV_uQ6XEq(~9e=QFl5DXY4KVFa%)eK<=)}4|xDy zcXVT_bLC$T3pq0tf+&Z3!yoJVyAXWUSayA-qW@Z7&|{T!ITpSkNWKEx<_4#)??&Ht zHVJNF1j`pWm7&AuoSEF5>D+ex%DVR?pzwggSXp)I;}&z0lDZQJ>iMia_u5repVN?5 zfS_M;O*e;#fFVsfy^1YCk z=lj0$^avKdjAX^lj=V~d&J&X?{NRiEP{Eax8=`NJ39ha0P$1rIwVtm=4yrG>MR#iu z>*9rGq@Yn6zq4#uYWvnT|6L^$`=6-`%25-_6xYqs>maax7JM5NHRn*?cD1*?ILUJa z&eKNo*XVqoY2O)+cJW>P4$X}*MXPA4-Oxn(mV7yug^@YiV-Z`pGWDh)yBIB>?voC_ zaVl2nnW#}&zU-T5w?olP><8xB8YDW4kloqK5~)UeVg6ew@+sb%m~OT^t>+|<1U-8| zok}NwJDx3Wahtm6uG#{XlGI0)y{(?g?9S6`6_n&*WELtT?+`kEFsEvAiWeG!AxV0p zg5Sz-Rd#FXwVsgFXJqDg0|8`1^Q}|b3AFoAZbyzBxOX>@u7ZA?aB1xCmHrvQGTWD~ z`GKRy;8U+^s+Xh*PFg)$#?f`k5ALjH0ox~|k;0O%qQa}Rysbzcp-JRW85FLJq|L0& zDR*qz;sF0L!JavlHnaV)ixsGl{@Ty$^oFt;&lxr*ZV`5SxX{s2O`%_rTT zmZ?o{8gr@&iOtt8=B{}=UqkP6Uk(-Su*g!13h)}Lac>e_(1n)9%~675?r;qQ%u)&e zpII}lsgcW=vs7s}+H4X+ZIaMImG+=LNk&-3rB=3mIVTLEp?s2@84a1bL_Xk z{MMJ>=3)f0hQF;PV8ZXk0x%))_gV?K@IT5`*w2(39pF1q^9T$KcJsQc-A^!&KK)mW8ZsUd*4_6UBCVQiKfaW3PuVD1ae7D^`Q;~ za#jjFADur3{>F0C$U-0zchnv#=)E-Cm<~bcjqGo3VNUTz|4C9e;)$daz2y%eYzU;{|EhFJ%YetJNw)D zRWr$N8$ESlV>YYylaDntN{Wh{MW7>n`PJ1E*3}wI7D}8DNEPP*ueW}e*rN>7?Tc}? zDffpKCb$QryhkSnV6ax7YXIpt}axPFR`!fl9oi**B z;$pgl=OmE8%`P#+jK2LHM#x+cDS6jJI-6&7{Bo8Tnzb&bx^3 zhn{hL)h%EhHTD5VZ_lX#cgQ;mu&~LzCMg1MgDqX=WytP+K?BB=7022MK!Q|Wosoaa$TX>;q|9>{0%7;N z$rFwK+)oerEDX--Y)~y&M_wqFbKLt33ZJl89PWtgOaY*nS_$Kdy7T7(_NFfbCe|~U!J_6Ec$C|YDYe7CM0}<=16KH@Z zk>BO7>EqWT3G4?G{nmkc)Tj#q3A1&eBiY-ukl*rPs3uWsisXNl$KSt09%&{vg*Umg zR-Y~*AjvFA31hiale8|rlXU8wSRrFS>MUzlhn02NXKk|Y&uGo*2g{z^xEq>Y4+Q>9 zA`kQl)^)ZK=3g+ne%H0V*Q~lD{5ooMmrY{e{^`=ool`TG5doKr85VE->(P%tG*2Hj zF2=)nt190AiT=YT=hx#n={?$OSU2D+XVJ{C-FFp-Q)rE{NliNU*!u{t;Gb}sgh`T1 znqPS7o!)fPmLiJt-50+s*Cvzx4sl<#+;UkM0=5+RHInaO!s}0QO4Y37&M#OP^wo{? zvFxXJp5;hhU9d4sXk>e{{Jl@TW}}|cjAXSr%e_z6??qE6$8y|G_d&f}Bh^+U`CNu( zn@q;IA(^}oIQ08j#jzfejhvV|jf|S1CQ;W^b)9efi-jXI!*m4JU#%bIW_K4>WOMog z2bK^4c+YjhYifB84(!T9bey6aopcmQv@>xUeb`ifEcu<(?J04aFU4n;`Z#K!HyFu< zo9=!IPpzByARAyjEgh=sQ}WYTaxteOsn9wYqOJ|Zq zn}I1`GOk6aGyc?!olc>|CkHf%sd0UP?;UhPmws%mtu}wW9bnRc^FtW--s883Cd3h% zOt$5l$!Q{y1=rwOE&1ot#~`XaKpF3+lxkl8sZO`cEa#Bs-GY%yc*-5@J6})0_ka^Z zh*H?JAw6a;!%nUR$$uV(~$u;!j!3C1<5cjTlc>%}BUqKSB2}HUro_CF*%7Q0O zP2x|O($Y~LV%2X>jZ0G0W_Va5YoHdNhHiZfi^W^DsyrutI#gP6F{wOI?jHL`#f?vRtFJ#9Y^{mxm|zx!ZWxsg_#3QjT(!c7ty#;& zl6+e(IZ=JBkSTb3S!f387kjQP9a*4}Ixo}^k&c6?QUf{E^Smvz4Ndwr&kd=LGB>?>W7bIefxvzfbr5GrnYR83CJ)R!E;9zA5dZSezJpUa7r0gAg|iAGp1%R$h< zi>s!5Dr?r(H*=af85rOnRCKOR$es>Sdx7(BKEVAkA0fQvW}{gAmIZ!$h~7~_4|U}s zmtWUP1@2~nWgi3g4-sNIYQK>%o8?d)u^w|xQcsS%Z`k{yuJD`Pq`z-bDuTBXkjsj0 ztkTq^vmiprhYpYBIqZJlWP=sAQOO{-Hr_9-2TK>r#aV8xDz3_8+5U9#H0Qnm$FTtY zP>VuvtgbP%ljL3?qhePQH9Vg68ljFGEqOzAfbjmT=bpEawK|40Zr%9gT^!{v_d8{G zs=`>aNLGV%ZUzAqJC+&$;F+ifKO5<+5b+CjN?zYr#6Ta7v1)fQQ{ZQQG!(ncumA2! zTLK1Eh<|mYcFJ;ByZBI|{~clroHdsSwt3{qSo!u1h%<=fxex2A)nqnJU(7vDQJ?#P zxMu4D^J7-Ydj`!PAczeg=eSn*-JV|4LPgELLlQ!e1-h|wX5k?7=njJ*-;#Dxc*{%1eS z&`1T+sP>FjV!{neu1eBq(Xll9G(Xt$GO6r*dV8+rJO`Zm99*ja*)dJ+$UvEU2Amd| zs3E?fz!BrF&E>cmQ;rb30Ap6Ji)nPL-)E#|% zqaiw-jl`9jjOsHyf-fawdzC#u|LjKn8JJ$Hic_cLqhY_Va*E2gwEbAg+hh#dnx!xr z1`exCso|d*50%9%(e@sXncKy&{;?lA`{N+UU{dl~Wa_H^UZ7XsIu`<(eeQJc*foEZ zz*{!qt251c#B=P3_ltjrka~x}dC*ASOQpHHZZ*g6496QgX_R#TJB1YC7dG_~jIHqO zr7tNc$IMU#nsQ8UYCwy$+BDk{zQT(qt$N#@_BHQi{N`o+%*xKmC!SCymW>ew-H|Fd zO#zZT>&8&w_DzU0P+h6gsw`6(wCT>b+&z8;MOU+z?oE8n(4x7^b=pG`B?v`V?%v6K z%gbbQtU_~U$QHJ~PYz6GaaUaTtKhUrNOC1NPHA(}St<(Vz;7m*8QUER1bz|4O&h_< z63Z+3?)13S0&}J^Y!8=<|NS1TQ-8hO)*Q3I+n3-`Oklcl3T78yDMc1082lX~`le*{ z4i^LqT$j|XI5+|yKR6V(Qk2=cQXr>E`*Lp;xcQXdmrcR#24U9R;+AC{KJvU>xj^h*1?vPQ9 zWtup+3h@FihuKDM*wk&&C|JGoa)x)$eo68hg}Djsx3Osk(wsbAOkV4u$m!wAeB*zKA$rEO4iH-Ytkzt{`tt@f3Z;D`D zPHpQL_J1pG{xLM}J)%YQy_qoXwUsNsjk}a?m9Yl<6SAK~t|>A^zkXZp@gels@W(rX zxqoWoO#F1$xLm$ct#Q3TQ`xf(2PMH`WXLNIDTo(HVVSv%vnHrtz|bwm4jBRNP3qq- zmya-M6^@@R`c&H8^k@H}2b<7D74F0FM28~=q0d53o037Zf1^h29f8s%Lef0yq`h?V zWt&NZ{}`1;zvukunHtMuj-9UhN5cn>uUn0tGcu*IweH&-DDL3vxeMom9-viH6f*lH z15BEy`GQXBYv^54UwvCHa!}z4MTX>+Cj!Y}M9C7$UU(fxXh_fRyb|ssdVkAnx#DSB z#RyjoG$r$cxu+f6s_;nEI{zo%X%1;?GD*XFi@p4unS*tQ^C{g=B^j<*veD<>>F}Eg zZO(6Qo~BY@*C-c5bUAxaYhRGYTEsAS^`}9QAPt}8C0Jl%2UN;+)C}}8a7lzSYDOkP z-XG_##b;pzVPn)mz7D>d9pZ!g(?5fltvXjr%XR zhUw!Li4=-05DlU#Qc6Boz1+jC&IB#AA1nLJooom4Ev-gi3z$rsbe!M%V^B&DLQaur zlNQeo*~M!cI$bO{+4Zrve7%|Y$|@@IS#IDLUaziA4!=gz3XHNqFBs7Hn;oVVb&kGN zd#-3z)1dEzVU~f;3DWRjhGmW?ll5q%XAb|^(&n(=GV@b4l|H}i$_6wMY=QidR z3H+M=Oxqd*lp=?DMMdpYWw^4IEHzUYjqdF4)ej2MFULhF9wftYUBB&^HiTdrmh2As zodYe$hg22Rpak)2?RA{-m=uWg99!@`BbR2|-a+!Q&y%z42cW2;DlT=@r*?xKfpjs!H&`P-yHoRm&X3L! zYr%Vlyyc(Pvm}R2@~b;NV+QtE=5Y|fo*{1Nx=i@`a?9UO9g zFVi2RZ5DLxyxYnUM*thhRGjGRj7-S<8j0|dJ;v#vdNQ9=^B4E+l1WpZYa(@sJ8Mx_TVIXXFQ%!Dk4q}aRYh0sV_ zU+F2QOL?3PQvX7O1H03#s~&wHkLT0h&uE^j?thhOBRI2|KGk9tV&dQ$A3vkJti2rm zR9fSG7>j_M(iObP;iVM2Vh5)6%KOeci8yG*N`!emOTE^#Q<&x15ZAld%qSB(ubufi z`)?K=zL!TGv5lWacTqEC_+KF(=UIavCk88%&=Vb(wOpGi2c^-Z8cc6tYCCPwG+=EK ziaM>F{6Lsb#BY?`(!>LwU*gWw$HdnEq-uL;*c&x0Zkph5Rs~)6e&e>opc$=zTssH0 z+R0%eJ)GrgMb~ajh4N{(nQl0ar+f`QsjfnapiiJG|8A;mgKmJ?dDV{vQChrM~9s;gele$)}7+`$OOxrY=+8pZI-f4 zml70o*<1vYAHvjGi(eirHfxS+Ptt}p7+LAoFzinFdNi?Fdqwyf z>2XS#M4-aobdQu{E(XMCHDrXNyGQc-Fj&XWkRPX@rSsItYr>L%hjb+Z)f_2@yg&F_Ig?I){ zpKdo>leA8}S0}*cTlKlusA*~)?bUD6>_2u#y#D2yc-QG84#M%kj&Nu*VTGBX-^7jj zGv4u*qZ6r8l$B9tNis&v33Op=OLSHB-8pKjjbgvGtBs(hF3XwC&Jh}d`NjD&%=i4; z34xr;NiN$N-hwBn%3CHLPuhE_Z3i&gV{R#r@iApe(nfXFqsGIdvO+>ZlL|aka7^XA zbwOr->*R;L)*`Fdn;@3#=Vd;xJ_$Wetwhp!85&5z;>c7stlVS76Y5Spzxy}X>o8A! z+KHFk>ylLwVyas{k^ZxHJ)l5&QJ@g1qUOde9Yq@L2yCTecof;7v_2Ro39Y6TXK1f_ zu|YC4nTU`~n5m1LHWV@u5(5!vw=SMp%Gb;q2w)I2RTX)SLV^l!NPay|5( z#6^X68TDAP32&M}Yf!aG<>%)s$$U1g^q;azaBTllXvai4tpn<@=|^uX5@zr%cd>t# zgx2r=k~#P@l?UWVuD{ht4VQ@#lod`wdo!1W!JG;D3#y^*CDcVgMOKkL1BT^G9ogBU zd!M6X%(XSNuL!jtgZ#HSz;>g~XGq(lR3o2;Zs_f4rAhiwopacXsR~vylrQanm#etD zkF*1%>U!0*f>K!ryx?^ok^_Omr?qa@M=h}_h|E5 z+oe?_ILFlMNsWBEiH?R_g)!3F9ezF7A*i(;`~x&~yTrq#I`w19M7*#tpKrq|nua)ygm*r>fh=Nj7mv%AU8Hhu zpwh-QWUo(kG(4WO>gc7`?r5$y5|%nxtD6VHMVsC|dM-w{p|?yG_6Tm?y76YZcBb$y zLCUy1^K|CZ2BHzewNfOT^Eh9JUdK9wjWGU^j26$^mGt1hre9S0qUQ6~^qW2YiO?`F zx#I}|iHC#MB@?TuJ}!D4K?#H=C4O_3I~vng*PStCP`JS8#{v4{wYK(1W;WNk#yp27 zH)TD0k1jt$Kl2MWaWY^Xy09&BIyhigRR$vK?(y^ddtL@6p@f4+&ph$_2KWDrA>uZY zXhu$^1F9R9ZP)5n?f44@l8Wbp==9JzH}A%!tB|OIiaXE>prU&auP^kRVVMNhcv+m5 zSejS*e%;yd>X8x26yrtODC}aqq;G>2YNFtQ(T80hJN@=DgJ8$O-}M}rTl-7nh!z5- zB7Gs%p56F(a(QKa{z`iPgkj{)GGW;*bKm3ZjjbxHr4ZhEA>C_kwe&Nq{`?9Y#M*-@ z6KUUX(qz{!tJ7Igje0a}tj2Q}D_XW0cPiv}w8Pnc1JzY1Mes=XlNQ343p6{K<16dJ zj{K_9ZUs$lu`V2U5~|IY>p#x1<~cr#>&}7PWCDe$NJ^=HAZj+w1z`r4Rj=k&HZgL4 zR04Cn`|>EX{)t&DhgfqA%f1Xj@SWh<90S#g)5?aZSTh+Vj?7W$t8db_1smqa&ee2* zx6JI!C7)kqlLl6P1Iyy(#4tHNTpIbPCilB31BB+Y6ux@3 zQ6VmvZUY#1DAFrg)CDzNo4>B9%#vjDSLE}e*y=^M76-28(*xhV!+s$%zIt;VJ!yQ0 zphraixq#Xq{%ZZ)(mn@we|FLh4@Dj4fFXo=D*?z;;jGdE$9jrLdtM%OY zk;%y=4UbCPv@p*=ViA&7adfw`;>w*AO7q7(;z9Em*?}=!c~^)O;ZT8M?zJ-w9CvGs zkzrXlsc8OZf246$P$YreT&VKf6dh<@#!2Y8~N08zbnBkJx z{bzEBM@57gM9Ry*TxnlD42~uZx!Eq+!!~(f<7i}MRWpH{w~m^+x<48W$uB&65aA39 zWpKK(ay}CED{A)q>KQGtd^AWW>?RaFOi}?*BYG%LapB+&gNQ|IOHGL+c0!o1*tFRn zW|~tI)zaTA6h7T_g_-1-AQTjeh)>QYMTUT?=(^$U9-=n&XqSLEB3WJXrD!KFzqYKe zU)pLA;2OQz=KE>3W^6gwY3ea&Ydv%*?e2#o69Abxx+rwad@5^Qxx&n{98Y%RwS9qb z{QjRZ_sc=4acoLxX(s8lOg=$L?wJEj&RA>e(XtW! zcW16Vyw9y(8e)KZucSRf#H0$IG;FD$!6*&9Deh=jw0W!99yI+}QT>mTBX+ zJ)yt5$<1&5Kqb96Je^t3o=dL@+u7Scea##@6Zg>*`c4#k%23rtRWg>bniHi_lG|~- zMWq(y@4tXiMnz=SDmCZV*zI_YgG16tuQvsU)a713A-tvR@Zt!uIVkz-@vn>gSZ&KR z10wna>Cl7L7Lp?=zxV!@{S{6*ac)B#XaSU?!c&jriJU(UFD@PJlK?jeI0!-cq#uKLscDm$)!oW@*+!>7^14W40m`tkA< zTB&lTjzflq*P6)PL=LAN`=P7N~lm#7rWKu#ugFi>f6c*}tcyQ4bBo`e!Y6dSf|O}*{(KVw-@9pSrMVJP8!dO-%MM}un@*8L7*@6pUIQ5 zt4BmxrVq3hZSQ0jmDZZiIQ8g{F4l6#9+}3qx_e6d&K3V3@;oBe_}O$z=VD7kZ_>?X zFC1*r+pZ$b*NR7j?zW8UdZ^?jn;*72BOW=`egjIh!g3(dHZ>J^uU{&+`|y5Jxy;8% zwe0x<7m(#C^gEafIJP=VpFHfnH+kqZEiAv1bf!aSDrtYREwjGZ>KifgA9^R%hPu^y z_v|ofZ%27?r%sa#jSCM9Q!>O11sL9Wog$>wwN zT|kJ4mbrvQNQl?IG>+|NKKf!VxEpI_cz&?OCcfOP;>p&wq8;ev>HoZsarwZaQ}J}~ zF)N0uV`9ipIn8)c{Ga^!^Z=Xt!T6mz<>8t9a7fRH^}`NImvgA6u39GH1b4rVltX4t zEMr<~pTO(<;(65eDq*M>VEifKX;I!oG>aeTg_67}gStNzz|JiN2;J2$cacoVk00o~ z+DgWN=T+;sUe<=hMgU*VP9VXC9tilu)L$QYKDbp+KYMQ1}Q4gXgmHCqjFQ3;Q}n=8eiIf6L|<2Pe~zueYk zo)hBCYdrkOhv^RxKcwGFwd~aYWLlfRL{&1MGi#5|D|B5p!`cOl9=FNLsuH41s$IS~ zxCL0y8{a$2g6CB&w_etQ!~#CX?8ok6n>}_frC86RXwr_kk=AAA!w)XfZrjBNctqSt z!@TvzQXBwpCW+;c&5xN=%U5`fqBdbR(L8y&q}l;a>s;mXI_Dm^N5)JvA>2}i?!Op< zby7q~3Zt~InS+B1-m{_7T$eY+(`{Gpz29NS#$g{}X(F0Va^rmuJgGLK(Oz@|hm}b-~ zoEG_V&3k+~A}%ZmS0Z(=0y@S!dTf5vACGRYz@%xs#Sil3U@?ly_HPEQBU}A8*t>i# zc$OZ~c%o69WWo#@BT&@K#r=6Z>)_}czX6`Cp;Wh4P#HVSc7cg(4RBlPE)o0$;=o8%M%XmJ~ZM3uEwZ*rZ58#ph!C!H( zjVJe=C7oq%S5T$qo58|~xMzBO2{-=QqC0yjGNh~}sRH~^Fz03y#T=D9j{6& zp`p}LJ6(k{Ss$}AsGJK7)xK;aNMUOsGm({_%#AsjT)yaVHsn)ltGI%x-1)22(f}J3 zz#cFj9*gSgPCfNPBncWrZPj~NlXsGOC}t!M(Rs#X8;w`qerhvSwlo!Jb_rR4$7y?4 z^R7_3&`LI9+v|Cfxg4loNJngK*Gk`2c^k|JWQ+h3N)nNyXL6mU+Y{6RP*OVEZKq7% z&wROEu75;^B#YeJ`x0V9_+=H4t}88#o=-G0P!=JaxWu(ILZz~6CnFU&MK_LFJ2jTC z;fR)-8TH))>sWkkS6w!Iioz(D4_m$8J;H=v|8ak?*nzQ$R4L10wllsU&w+Z^;8xsP z>u^A*kKg#$P{jCp(}h4LB3{$2FHscIARyr=mvgmJir{tHWz#X^E<>e)LxbXFRYR+4 zfR?A4H54G4UU|Tlq*kM zmURK;(a~N&fd5gihf7vZCEaX-)Oghe9Rs*<8`0@yvh8_$VVdyy>G#a--zp)at-XF; z$1f8iBttY`$e8B2_kg&TpI*?^N?-kZGk~X5{9Awtwk$$yYgupx*OS=;Klmg!M&NaR z^NtOGlLj|cs&}{{&cseqarx+UuyPM>*at;5{@%c(>jM_x{+$S?kh(h0ou2Q1D#Wku zV)^RCqsnbDidSFMYLtebt&Gwj{fqFo-^HH#dSx3noK)J`celQ@lVm94BC96(mSgO7 zgUv1iRqDqfUHE2V0dvYbhW>qP9T}qJc2nAgboLx5HginOLKFe5#FWbtzK<<%Z_;Mi z*x2wCDoO1!pq*vS1bz2P7?-evHis~%1X+mI|PbMn+AJaq8hT_$JsQ}yxNeBlu(mC}4O zRcSfDe<}~lg*EdFNM*69Xuij5Mya}_c!-HqyBoc7UM4mPiK&Gs7a}PS#MZr zpP6#Uw&cKmS9s=-QY}mdemW#p5g{T*zp=VEiZK%pmCrwfy~k^^UF zAyn~=Ls@g?3J8ZTlG zuKs%AEp@)u?|vi`CV!iuSMqOupC)T-Mu?`n_U=Z^^h*M$!SimTqUYn7ptsDDK9kBW z)=7TlQt$6!6)cZ0eRcvhLx}h&N=8G;SH>qoy?0K1bojc6b3~W^l9`fu%b;-!_M?v} z+C;doSn7=$g)y9|d*j{;uCTR_3;T-`8|-e;moC*NqZ)DP-oMS(d4AEuU)b21WnAIH zEl}Y${D?;*liaHYd$_!MK`C@wtK%hn5Y#j!*B^3VF{_Q-LYSqic-JfVuO84@)t}{R z@b`$zH+iae{_O+z@7eKN9_CO_dj`?L2AX8Q_ZnA?_4_pwTV6|fBwN$kzeW^>6ft-6 z1Vlp@%yF9f`17Y~a!Cm=u)-^3NC*<&U-H^bnE$Bzv-Pc8OrXvDYK1S5Ky)k)_O1b` z>IWN)xNr68h3zBns!IC$wnMaTwvLEjTH1*bXeI?%wu$4kpV^*Yy#A5TW6%t*2g&LP zUi$|27dy5Y7USo}ICmThI_f6vf>{5!|8~@)NmELvP(|;EOpk|x{nnq9JMJWW&$n^^ z(*||%3H38ExyVrUaL;=fEBE~NnUIe90h8OaH3!9*9A)%t6?7Qq6v^0#q|a$fPlb7; zQC{Tx9I5ZqTCtQ92Uj4(;#22id7XyLZ`0ikqzAu6SWQ`Lx=4XA`VIj9ELt+JV-NvE z)<$=2NO9}@Z0CC&kJinQQZn~l>!Q^iDR%4^4(!Q$_rXcJWh6n#jYC?Fbe0uxFDP;? zQbVJQ_>X1P`yV(zsJrg#=h_4t!_=O}uC7U?5Zl7GG+Kuv*fl8*>=$l?}u4Joe$C_TdnAUg`$+ z1W?A}bCL8pEgAoL`Qd&*J=I>1WN#u{kVd`@YSY_BgOOrjQuQ8O{JjeB? zPu{OiNpWI{46*n&Bwm?&s&JbFf+Z41RE_AEHZ~7BtxHYVB&!R5Pf&X41#m0G*2RW% zuE?RZ;sTNMM81g5ycsXU7yD&J2paGlRa5Rn%w1;luQlNE_&td^j1*VVL_axBzPXdQ z0mD(s#QE0{MAZOw;xhh)x(|AX>uyv!ISJA1*`NKC2+b*NnrzzXVopGF)FW}pvBI84 zyx{`UfF+-)>n}5)deq!;K4OIPa|R zpm4F_$Ymg4oC6&9KK&Hp3NknLU}8ymb+!@s?4_YoA>A%kis)h;u@z#+P7?`8_Gpw2Y^r$sU-nXb`uW`Udfy)W8$d8rTMx=UFhXtz`e3d< z(|5U_b=b|-CL;-mK;<1W^wKzzXevO2iH~)WShr>uq$_17p?lqGU`?z4QvPa~y0b)VPVW(2tu`pl({iMP7UvDPKr3W&%|E$YVwM z-J&JL=#KJZ73sS)MU%>BU^ux5eP=1>j5TS^y_m2CzjBj+$9oElSMV{1V*mILo&^IK3AO-~-d@rp>o-3qcASN881w!^ zu3JAkCw~akKYEo+#i?4#G!t)I*d|i+eE@CmjDEa)d(qcv!tX@8cRIC1*c~^7tbEEr z{!aZ*%Ed zON9@`r~rQ_h(X**Ecg;z7kLO=tj>q+=K2YM3NXwr+gBe>2>D;cjp41W>?!^- zabG@wLc`QqH4Gt3TPBwtig{vtQ+| z0SzAano{*?>L8Dm)iYvV6S6yiXTUFEab3#yl_AK-z1a4fIY6WX{MjS5|KZR2FbBuk z-9k{AhyeDl2ag5Gcd?#rOuD?I)(!24m9g>P|hs zghly6e2SwYEkqW4-OTQu)~SqH@O*d)JnBRA{Cf{c$O2F&dCk&}U(|e$nWcRC07q<) z$(!R_IDPrO=Kxr9SQ0*+zGaRWE}i!MIo0@t;-)CscUkf|EeaE!{&;U=@&145!IHhE z6sE_rsVjndQ`(!c=8LC`_{D)msk>%oJQZ^OhlyUY1jcu4e|6EP6h-n;0AvL(iW*b* zz@-j(UsY$zWdX6f707QQN!~k7aALjf449MG zk(}}`ahoQ$s>PIx4ZQ8|09d2m=OHfu2pkwBJ}PEP2JV_Dx?NOu2JCY%rH|6psK@#| zTwrW7R|8r5B}nsM;<>1yCk#-o+k0##1j*##K)HES*EL*t0E--Q5NqS*4;S#VaDDGt7K$BkS7Tz1!_`vits682j_h&RP``A{x72;{SjM{OBDH6)Oo zIQX8Scsk(sLy&42TkFxJ>=a<=!?%BbdA-65$tH@lU|pX;Jb!g?s3!{yX6BgujDK$) zSSq&cb=mN}fIyfvXQhu{;@be`u>^oq+^O#R{4;G4VP=-T|sG#Igij@hIk} z<0ONyQ!S+28n7XFUxL6Dz#=y~FB^oiKp=0{2C~oPh(m4yHY4OcCuIuMhR+k+k~o{f z-JP8UiG2sY+`~8)gW?inJvYF|-{u+6@y?$dFodXH1uJ~u*a=z#mq*^F8-NQ1iT4E- zQ@TfpK$j)MCkut6#9RESE}ihx}a}QgyV;46)-)Bnv&+j@&`|Y{ugj+cX$8* literal 0 HcmV?d00001 diff --git a/docs/assets/screenshots/messages-and-channels_channel_list.png b/docs/assets/screenshots/messages-and-channels_channel_list.png new file mode 100644 index 0000000000000000000000000000000000000000..4054990a14befb64349f07d48b60b726ce2620b8 GIT binary patch literal 77302 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�!lu5A==3!;JwBGOfwf`AZuRgn^^ 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 literal 0 HcmV?d00001 diff --git a/docs/assets/screenshots/messages_channel_info.png b/docs/assets/screenshots/messages_channel_info.png new file mode 100644 index 0000000000000000000000000000000000000000..6f022378f80c00b3072e2cf319e6a6a708aef466 GIT binary patch literal 1656 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 literal 0 HcmV?d00001 diff --git a/docs/assets/screenshots/messages_reaction.png b/docs/assets/screenshots/messages_reaction.png new file mode 100644 index 0000000000000000000000000000000000000000..8e795c97af51092d90b397199b80622ff7f496c2 GIT binary patch literal 6030 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

ekf> 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

Spw>GFhRX$H$@V|Lne78;!N`_owSi&(kp^H5f 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 Fe*w{1JGcM< literal 0 HcmV?d00001 diff --git a/docs/assets/screenshots/nodes_battery_info.png b/docs/assets/screenshots/nodes_battery_info.png new file mode 100644 index 0000000000000000000000000000000000000000..b936f8b183e8a2f05755d2ca2cff38c31ecfda0e GIT binary patch literal 3459 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 literal 0 HcmV?d00001 diff --git a/docs/assets/screenshots/nodes_detail_local.png b/docs/assets/screenshots/nodes_detail_local.png new file mode 100644 index 0000000000000000000000000000000000000000..c556cd9f98c4cb8800cab89283435ceecde43cb4 GIT binary patch literal 145345 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

#=Fa-@ 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 TwR8t?DwlIR=n1Pha3cP1t#R^9tr z51E)wC^9h}Up>tNyn)``yvD>7&7`Y!*DSpYY5nf>@cO$AxJq}!WsKc@Zwe(+yQj_KCbVm_vO;?Hw;-$q}3b*JiqwxQZi z$eKd7CE-kiV(?~w>4>Dcz{qxcjn>HcL3Y4qdFS*}KyU^LO)tJtSbemwK}SE2qGFC3 zW}^;wkBas%M>|nmM>HY2C5b@)sgV%1H<$N9Bb=`BLQ4GrGq-JY6h;~sIV#^H&qv)* z-(P0$1PO&Zg#Vl_>O2t6ySV9n)HtS2ek@%}p*c;a?Y@xA0=~`U21R7 zyEqxEAz2SOS`*LX5*D6Km_zN-0dz3EzMg9^&m)&>4$89)R&DR9@lqY`s##C#b5tjG z$v{*Ox@3G+&tPQyRQWJ6{;J{_nE+K4j7*@a9!4fe)iE|?6ydrNvg4y3tB{8sUZNDc z=ui`i-}8HQ@MW>^Eg0wXxP>3ia^?To)%_FH`Lmv#S7>d~V3JRWT<1b&jW*C#2vpNNL&axqzwKa)v)Mh}Wwi zUv9`)`25Gk({Pu!Rqpe?RnDe~{d=F1-98A(0}JYl{AUIJf!@Bhe5Eh>s?GU4&<>dp zUa0=UTX4?_{+z$yi*9i4d#1Utp|f&Mrwt1p9%BWjE?4k`bkqc@nkuv-w#?E(SRe`| zU@;bf*Mh!*XXM}H%Q-Fg#%@N*^Llu}ZJbZngO+o7+h|AE^JJ zE%`a$`d@Hv-V2b$bY!lVRK54Xjj(NIfO9`j)>HDO@;ZZ6Ut?-Q10D~RyakIr*YwK&O_rI2({Q}ZvzQ8La}v3jd!S)LSF=)5lyCW|pVqd4T7ujG;665V1^clONk_eT>5v zB0``^u6rSANv>32V#sJ-S)I~#iJ2R*e0>5Bdpy0hzFe5>=dNRHL%BGxl_k%rkh?z5 zgI0Qz-z1OeKdW^8>dePCuZE^Be`p!)O3#X?5c0g6VhgK z$w!v!ytkq5zW?_w^L6-g6{+M0t0)bGNFOP1yS+7llMiGe{j3CC08_<$X&Yz zy+2OgFqT$5bl-6S1~XAE4Ny7!J8Gh&Of81&9;>pP_cfEeJ~4IegVMDREiaeDg!i); zs;|6;19Z-O?4&`Sy*2b`as6cG~T!F`owv9i}e>7ZrDW#-GelVEdKr z_7CoWwn5RUI3;<%`KnLdi}3c&opq=#gLo@$2Rj2gTtYeBFTwiEpax%I&hze1`Kq*g zySc^_ejz_8c|DISOTkBoRq2WfcVM^lVze-;!cfk`dM{oMAI3RYlQ}x>#BH&Ouirz+ z#x83Um_g=^CW1{I3eDccQ{!hCbSZ3DWD~!@;ZMHgE87lVwD@E`+qGyQJkDT$Cbt)B zZ^eGxZ+K}C5N`-$Q=E9l*N1<|JKLq>`D=q5xx!MfL;vOn%|Dl|G!ePS5VBKyu~PKn zs$g%KsW|O>^47)|fpwNmo}A8-XKPriIB%`_gbnsy> z7mQ(rCyxEj&>+kBo%Ot==lsdiTBG02DqV?*lW=;(3~K(k%#}x*cWabxS&!+0cjVTu z7#stJ2VThhQV7?CCtj|8KK4PbIyRC^V4d4HrKm8aA%^yoHt-^OHt9uQa`oAWS9pG4 z!kx-1wsDNn-TYU=+&0RFh-Rtv%pfx_Lj(5;q{+0jGq!NOb5v5uMd2hc{99$Yt-9M2 z)`cAN9-^OYzzbRQvgnMPp@A;fCAhgE*y90A1{lT!9<&RrZK-+igac)0UVK(@s902b z_uBJVSsZ?>(XYFi4;a&SM|<=W3BO8FY&J0edJGZh@t`-<-Ozx?J{UZS88=|8lZdM? z7eZ8E2D3}fk83p)i={GyLUAcu-&4u~bI_NiQ~iqv&OUg;o_v=qWB%dV%(A?k^DuJq z1;7=qTnzKbozg9MC1%;RFz*5}19?^nL3c-w09++=X#EjMZNYfy7hBlGyOE4LFC z%~E@!^F7F2B0{vsfw&a-=7b#M++(5gtunIBr4OE5%+c|yJ;A^7<-Jhr(Reztu;bIq zcSbe8ct}5GcGie5vt#ESJ0Fks$Y1%A%%GxY+F-@*w7yMeE(V)rxFzdq$q#ye9vqC$ zSA_|4Zn`0+KYhBv0L8lJ3_{0(BU5|i27+f@2h!3&o7cH_J^@xBa*6?ib-mC2+hh|h zi$R}@AmJG|1sHf<#Wo>1S*rR1LlV{`k`1(U2Hh`W5)Jbe>b>ZHsE7iu+xj_qw2Msm zWfG@>C#J$?pL|7LX3$l^s&p@6zo-s`@zxX+a1j&$O6|UVW!UWmzjVsHQ0rb%mqT@a zzJk-z#e4-|Otff$^ox1?yFnBFWM{2Hj`6NU?jDYK41lY5$=-|9(#_unuws%rd&u#r?QK5s+QOq1N)^9cz)1iG~a2Qc|LGK2iRV!#I`eYxbvDMiJ-ZaKMIp%x4RJt~Pm zo3Co%tW&1w0b_88vBCo0%%#H^;cYwZ*=w(Rh5@y{`9G`e)bG3H@eCmAimm(=) z;4sb$+y$^fIhyh6yJ3I;qFdg@DvCj-kEQU#^d?- z8w5b;Ph-uY1sNO(erH)DUR?slF=ebif8IK!>Z~KtC4JlJPZP%6NT+v$27IxtfP}>` z#so2lVz9~P%wQO%)hpF-o~j8q7~|pXO?k+KLoZ;tXlsn;JN91VhYr$UA}2Fru(4yZ zckfs;rTsr2wd$q8lcP!142b_;_T4+9e?83tO#k;cz^+(Jg8?=DpJxUL44(X-ndJ0e ziwMs!et8(R{lZCZbd0+zjZe7q)rZOk%G?XMwE*z7P@efz-Ak4@js?uDYPD&|Q}xV0gyF3I6Y+=G(bqk$a_j)zNb)+neI@-gHHA z!qpkz`xs?yiy8Ap1n0v32{lHXQR<{)94z^RddfR_(pASoZaC~xeW8)pK@BhG%JhVK zR>?M&4DgIKjv>_7qt+;$YV4?N``8@f)0&MQ^{nd6%>WZ=*~3r^snZOj2URAbf%Ix{w10S(?=!ITE$`EcEHmG%6}TX+v`FZBv4`bp#WV@~Jbdu@6kqz2 zpf~?rHTrPtXQ{^p|Fz$lL2>qGk)Jj@$7z_GVz%|+uTmlBeSyu_U?=!h>_UfMceWtY z;LWo;A3C)y)h)7pNAcFAx}1whC&Ku4#zQUzv`zd_plrqnGJr(`Hv@Lav4N zIUi#KB$mqI+q)(;bDFC+R8|GFIx=Eg4MW8xU#ZgUp2|wQh{^GDtvd37qN3s4a)LX^X6x-l%3!JQaP2R@d+Kvi!V(#Z_h^QfY@6Wk+&%_gg6?Tqb z09BXufdd~!3kw=Y9TKtC+bKB#`|Z{!!{^U6q{GL+oP*HM*7&+N507s0%$`&t>}V~ zoQW&Gv=aJ|v>s_ARkxQ(iAb7o6Df>2%N~_$55967aoVrHIWU}^>Z~z+wAB@uL{={T zdR9@s<=}DEQ5DXW(zTkhy|l~!oFQ!nZPEc=%$UMHA=f2cyzjwKnZx)6wWn8U&2v=k z@u2IsXW}?cyElh)M zmbOjNN?!v(Xg37`O}h!nS(G+m#w1jF_4d>b+qucmB2;kr9sQl$R0E4P4pYCOtz!Hx zx410##$|APnrV6FuLnr*i5P$so!`q{D^>t+riJ z7A^)gis#@tlWT~&<>R5ZZWjlrH{g~;G+k#f@=Yf>Czw52_8Fx4}a8s~sOzvtwr8HkTR@~4nbtC|afV9u!jFc!!nKWp z*>nxjjWlw`-4pzJY0y^s<(ft3poe}*?x<>&%_!;8VObt#%<&}D8$c628C)$hESZ$e zF?@FpIM4cT0AH!iG_Le7RR?^Khqwzo8^q2P_zkSol?1}95INQ*P_y4+PAgiJP1yA! zJ*{m48zEWxx|!D6Pqem!^?fNb9DV{gFWNUGZFiREY$z{>4<_et1Gnzy}>28)CM922n}rmd)%`6n{Aq|;qF|bo?vf<5Q~6s$7ms52b|bxc2@BV%Dw_`Ai)&&IUAHYNUEXg!A6;(>Qv#v^#}T~x|KpKJicWPDrRdD%TsIoF}KW*BhCp+LkUM) zWj^Se83$IRo#*V;+kjpACd7>Ctvbo?Im+t1q}%z|dv}x&ef3q@lvd_)G#F28?*yc( zf0ez*j7{;Lgfi^wND>!vJ=h(Jh+GRM*L6}As7HJ!n3!ff8R$8q*sOLn_LrPweH>&n zzpgy9x1Jg79At`CJuK<+knxJnCMk=UJ za^MN22bvn4@70bJl83^ZHtLHKF7!8-0tAN9p%o?EB;c%fASd``4gl#R4wLzdYox+% zlyVs=mTt@EE8r=17Ovk|IDE4;mXgaHtdTg!dT|#1;_^v#Nx={=XTNU{NN>gK7Zhu! z&!c39M-m9A%5ldw>Dybeb8)XBU;C3^tZNN7Umjh!k4+N@qY7B(+~w118}u&e)2sC9 zSuH5kY#Y27rBHRt9ae6ZqDurk;BPsAf!SmRsTMc{E`Y6RX8Ml0M0v@us({9G6VHTm zya;sdDrcg|_-5(ZD>L_r1w&irs~3G$DN}s#L51~}y`HWz!&IvjS(L;0`gXeOKeEa2 z3UI!{fxq9l61TViE~g?A+_uVSQ7xM->Ahshg=9BJ*}05`_+DsXJI8LPuyYHs0&r%DPp z`&WxLT8=u)9K=Sw?gtALpPwAb4cWmFVcC(SL?^J2~#71zTSIpO1L z4XqPHmg||8%zjsN(i^L_vkrHd1Sz98XPYN;zpkdK{d8N}1-Lxg;}}AqqGjc))3iNS z2k(oi>2$`an`DQsXm&yj8%4zl{eG@fnfB-&z*B+>baFr^H;1|mudevqkbd){iA(+> z;QG`8mNyi2W>J0g#%qTL_u<8)8s*}c;FgW8`zclu0h;d2z1+^PMnxxyGvl2J;#=-~ zfbaKkDw1#peo}5&xwze^^;#*Rw&pm(m+ao)?2Mh;yisn-nKy65)^erPa;K-H&zfP{ znlJdC?UrIgR#yt#ax%LQLm2L;xg z{~50!_vL+K-s^$9Jb}%t4xTWA!D|j*a|drB*JPq%+{wD z0uqcxQP&x=!r^?=ALEs+XEUf&;0)Fv z`!Cq=f;ou(fwoU-S6Y;ko={YD0W_}2f!W=h-sm-~$V;PyQ7#!}(ZXKSTe`wp4~X!Q z)a~4!3c#Vc6Lo?=A_GvIoeMb0)kfAet8xdG@23rhJa<-$PW9asv>79?@k?)Atxq!; z7%?<&<8T`MR_mp}uDauqzww)EP%C|nSc*HJ*&CfNI%+b0@UqF8<{+T#=|K8X6Z6|w z0E2}p%pkt1wgu6p0f@xQ&;d;;g?g~TfEtHjl!v|F=m&OA4dU!)CFqa1uyEhmp02;r zR+?ZO`D#9>-Tew=SjYVY5Le~bRfWzCAyk=>-yu(Mz1Lm7yC9qEC?8n)txLxc=S(d) zRjZmkjZHZdI&~C>ym=YHHEMF6lUXK%5Zl0SOZ6(wa)x2OU< z??2W5U}ue}pSK~})?-;YaB9Dt|ji3^O7 zhpA3vhVkov;>`ay@&9+^WL(|VpnCZAx;Jpe<^~4%EtiEl(kICy0}Ka?v^crx8pIrJ z0T4A>_f~cLV-ft+xyL%ls3c`d{T$vv$eHrb*H7NdH3(saH%HU789i%zrawex?gJr* zgG2$0c=y=F# z!pTdFsD0#vMyVy_hP==1KG$=j6_ZxkK|3GvT?U#&#gE^zKEZztNIpEwhR)Jb2?g2E zL0V^toNbNr>y@S@3r?IvaG2k$c0j^wBelwmpdsr{?Q}c)sYpyrXHP1`Wg+W*KOrKZ z!6cxvMM=D-bn?^Vg2ve{q)p5IVttw2IQUGSwL@7> z$=oZ}muhXS{~**fP|4QU!=%s2jIp#p)z>K=1~-`XM|jiuFqVdYzMO|E)N^9^!yf3( zKU|2*caeLzQ`;In&(46`brZ+q3PdmB2ecKg`V=(vjcxU9rf;S1W(UL%_{@*G(r>xb z;vbIaSnMzK#=PKzG>1J%O3a8N%uDVb?h>dbRnAz9byIN}Za_GEds5@3VRn#(^AW`O z1b>^^^_h@Oth=a4o(9@k(G3ZC==2nnVl+@yQ)W~5ZY&}x(>i9fpFMaI84|Q$E4lPB ztj%xwWPr`a5kf_%rzdc@qUM{s+4Jb*(RV%cO++aQxlt=Qa~~|_EqHmp5{*)z-cM9C z@BxIfN@??skI%PIbf?8Xtuu=&2mma*2O5%s5#-D@yO=*_m$ zwpNs&&o7BP4DeQ{Y}&j`4_lygo$K{)iWPLY4YO-A!CSjEFO04>^#el0B5EHad@QN9 z_sK^OVeGK6JcRzq>eI|ur%F^5{^4SD3_|SrbM?M{%wFJu>OFmA{EDKqf4-g1=w^R^ z|NrdXzOE+@@~J)8?NZ6>>#vegrH&1yu`IZ1X#62Q97qN7a4D$0SEZn&x-*LJ+qZg$ zF2PTBY#@(FPUG99HQUf?zxlAvYUk1y``cXd{Uq|R6c-T(>F-JH{E|yrzc*|PVU>#% zqP%~X8@zousB`!s9Vge*F*USBbA;{(- z@R`rrostdxQXA-____Us(rQCpYigwIrf~nIJkV36U_9z=$YN%C4URYArKI)NJ>j?U zo~`7EkkSpzlHl&8&0q;*zFj*Cm6^M&OTOv@U0dH;7pwogM83LY-3GaXp9>=pYChOC zNC{Bg1Ln?T`Dbx^zWm_)<&0EIT5ZmxZH1*eC;O5+ty%$E+dkOUg~CS+2*Zm@fkLL> z1bLeZ8zC-n_#kP2ruid}p14>PdPzhyRGr|zKx$<&?|hKBq+C))G4uG*_BT*Qb-r0JKRs7}*r%MbFQkG~z_k_Ljy&vz%<} zmdy$%@4;3#ximEPzRl?@zsjBeBy8w*;@)I^#KY`h`r2AZ9Byz!EuP>QNHVw1DKs@y zt0avVQkb|C2RZm1DN==77gM3^-*NU)AiXB5Bw@)5T|a`X>M$JG$34-LS~{(msz zw6K^4F@BQ+hiX(>jVO)h-l#?e`4&AxdIa(gtKBCL(d-w$8dQ}ZF4q;Q5R{@#I zJ{bJ;A?V?tQXJ&;5Y@e{>gZ39OVB)D_6?OmW)O^Sl~HC_go_q#&AdNgzwojhF`$l= zo!MJZM}J*S?VOsNM`%bML|E&u=x$0+7eNJ@s<|UuT>4b3BbcZSE_h?VjZ0@<0P!BG zI%@E6zj1g|;%2MIW70;~^hE95QV-!tHDgS}PxtY_&x2LJ|KFTC9F?`T} z1CwVp`tbUC4f(vUR^wo~)W!En4=-^hQYe&?yaC}+Ze48Q=6J|~4~m8V0_|@soI9G= za0SH*^EH`}wnJ-#zVg1vS@}NPKfwEZ^T@ZdtATegu4tjOfEhSD^^`!k{=$6(R8v_v z)Ck)Z%BD_koKqo8<}d7q(Y?@RcMXpt#KbLI$8Utu5vM32Z@NYZI~+q~aK6e_*dUgaLVUuZRS~xPR!=W402m#-co*|ImOrb!{GogRfgs!J zryC_S9a==0OxBY^%8Os9RH#VqC%{iG4B>ve69sf-yjR?B37g!JDv4|*zroaOubri- z8pmebw!O(Wd=-nqOe|_eiF)i$&ArLOEHmpHJg&+XYS%I;gxl~nt>l>k*dWe7^F9@vleiT+ z7un-HWc*faCe9N>$%RorbiFyh@~!i(#BG~PzFrgLyQAEg37$S>)CvA7!TU}6C-@fT zSEj}YxxO$gNp>dg)5_PPR)_EMg#`tK+nqg>%2ulL>5Fr=F9Qw9uZ>!7!NMtTMsb2U znOh37(ndSq+7S@Z3xxNnn-`+#5-?cAXyx((!Sed!?`|6G-!FU1IN@F`R*~wJYL=$H z!#1+eKI!e#x{c>O-BOZ*&nR+A!dfYN2=#82&2ZFnP#Fd=PQx)+&qwfG3gvw|z*)bA zF2C#SY(P))8W+$S?vnAa-xQ%;2gi)H+f1sRu_B$U!Kw$&nD=CZ2Z!PF2m)lBs%znT zTPwt`zsa&z_V?oZQ{X;CtPmf(xdyb^@&6ee!vfl9}yU~Y*Q}5g#EdAB> zbI2d_2dm;->+l_6xj3NW?|QjIO+L!f!M8R&TDX7G=UvUYoVYEeA;Y`8zS$8Q3*&M_ zI1Ppiqu+eaQ(|>Q723Hrs??yeimxnG;uvkKD&&#jK+dSqal~+B)LkqI zBp52Df+>4#Gx>dsS7;vKrjJxrnBUkex{vd!kQSjlJsRxV@{5-)0hyfwtDU*$bAMti zqU)ng)R_N*$biY4{&@R3@qa|tJYis)KC*|U9aRTHA@3JRI5FjEp2(@%oyneJdJ@-MxE?|FSa60+>YK z;q~nZyC8ghN8=C2TXJ997cQ@C?LnU!?Lu5SS+;^ug$-s(13-L>gT+gM8@6b+l+D~is~Yt>hY z35md)MF{3-MSWTgB5%V~DF5Pf(sVlWXT3@{-_@2Ye58^sWMN2E%6N?4IDpF14H(hToEJy`85y|9f z;E=-W*p7QM?lhmFuuX01FOt1qhahe!t&>OTy5WN6`3gfgmC;sPDF6yIYI!$;`Qz>K z-!Y24}rm%C68ubj4RZp{BrzHCaK!D?2ou! zO87G^$q1-bAU9Hy1pI!K4cfa+#M{G$Jej`XfvnfyGNb?<<*6C;$e42Anj2Nx=;6>R z-=Veg0q*tUR=(ZMdw*@+TZ-`r=rO(S^muTr2NgaIjrh|LXwz{l#K%2{vQVhXD?6bb z2Lflh(v#A0cil^1DDVoBa^80>arflgp4zjDf>Hk7B;@vnx5}ydygVcIs7O+Wsbi(O zTJn(h7^jqVZmRnO%|xrfYJ3&oh&@KrY-0;n@v}vfx0;;RjCdu#?n6wR3m&ho|V~5M95$rB4OQwv@1D#-$;kh@qxq|Ca zWe$_{1o+)m;8e<6A79(_J5IemY!uevh#cIExFLC!J6%MIQJs5gDVyzG*R z!=08xhqJ4cpdsuMhsttl5@tEAWcMnHQ1we)4-xe{0EO*rbCO@W?y8PMtw6CfA}@db z_CvqEyUN>ZdN#ZX-0EXK&HB`6z`EyUVOTEt+DRXDrQPPT_YbnTzW6l_+mXAqFb_!Y zTwMxL->i)TI3#xH(dFmZLgyjKUrtqnTO=SYHn)9KC;?(VL^U9>T2ob+U;#iSvX0C( zhfTdCZp%e?sDXZL+^BcuJxYrbGIatAApB{1mE%e(CFBX6LSX^T=8PY2C$hvfiHB0FD%W`qx8%e0Hk~!(hYP*ehvFVAquExxm z=AbNIO%v>b4|@J{*A)xD!*PM#tjOcW(-pFb*Jd)*mI~99bNi1ZP?-MFL_)Bd(Pek`S z@p?`exg8?g*LP9IWl`WTzmXOZTZCiKwke!IfNgHIOj{mR*wx4(N8g&)CF`ZNd|Qs~ zaC*&%&;2j2Tk#32;r^J+4y@HSC5H`F8{m&2EFB{97xsPyyNj7pns4^zuB;cW)$P(H z9UabYQR+-7p=Lndo-5Nob2-1$&}ZRx%<{jO{&&Tj=#BVM4(`6FtRcc~XgH%*{4OH7pdd@D|AAO@1%Lc`nUpBKmY>3j|_IPEpNZ5a+>UU99CwUClXwAF@jR zde(SUYj@(Rbc1Y867Ty9CKYHIV5(4kpEqN^^gSP670r8yx3{44DVi2bX@?+#z zteZ$X3^o1bmls!P-sVT`WS3PwwW4sP&rp+k5Sf%0>V9N;jd}^LuW=azBt6Qk8aA+( zCbEXuzJwe@H0A|THpHsV=mxy&s|MtGFnNDAsiZ+DD=u2tjJ3V|ch0%#xyhVbui;#c zNhv=28u#H-`IKObwn5?&=dQBrhJp1GOZ1LIxHH(17E9j6BZ`KtS;|Y`ULq6op$Y>7 z{U-7s<%?F&#DWoOa^jYZg3Yjs)9>1_jcRU+FM&2<`t(1?ngA#yt79WS-Qb_;u-RZw zD8~Uc3}PbXmmWTb00OC~C5TSfe!z(vD{>+a%4`I~Qi|BI1{%}z>78=8>CrKH`Er$R z0A=43xmz=C{>AH5T8+Jlu2{I->Lmf>ubUcyX6jnNrS}w|E1EEafX*`W&-daUXI6FF zz~~u<7n!>UF}YJ)2V3NKIhTB&F5mB1N;AxIS0;a&Prx}~E$OG;)|^>VpQu9Ln$D|i zq!Y^tBKH8wU0kQqPYI4&aY@v(Np5BgeFfw<@J)}}uIigqQR20k(}RvLB29rbOL~&P z_xH5O*=ImawfZiqRm?mOgjCl{oZI`Fdr+SOFKz*<^MJx)1qj*-xKaQ?Ic)39BQD(j z7$wr&ZgP$HN4lc}p}IM^*F8J&qAD+Tth6;$2%GDO55TyVIjtuHsSSvol(NukQuAc| zz`K2iG6xzZd${<gaO!p}tpe}@R!_70sj>BRzZfAMm{db4UDr2Ld)WWL=4Sggo%OAE0%uK@=AUEGb zJ%y*TgOvo&yeh=8M6dV&dUkfj8N$ic8$tFA5agk4azC`8H|5O_+>BB|ax&eDNK8C@ zr%0`x)B)MZw#UWq?eEEK^j5Gl4dZLi0BPv!_s%vX&0OY-muA+;3*1l}r!YSP$}3Dv zXS;!ttX-2!*W05AAZtEe_s{!pe~DN`HObK|^Cfja4h2Vu*$^+?qmE%>wdXOWUwQ6F zTtK$!|I(B;^e&%5t7VxD#iGhxvab> zGt{U+&mz{c4QdRPWyA@x=9_1jmK__QYC&s$B3!Q7p(fH{{j8n&N$U1q6NitX{Z+8l z;`A4cIDlk%G`soYXg%skLni8|9RFgwKM#LeZKyeCDwyzPE$C^;y8AeEqdDxZg@)JI zC)5YK!|XJk0^ua(;sqEjG7>-KPdo%va~M4SkdJvRb$y5#6mFX=zve7L+bAnDtOPP@ zlJqSCeF*@MaJZ9Ht!!XQX$87vf;@4^eXb}neC|_wlx>++mAXoB<(%N$XGOJO5s&~4 z>9jrpA8#t@Mfp2eXmkV(SFhVa_v@@_KfCyBZF@QgfZ`QZA!=Vi634f>l>UNAG-7=o z)%6Emhp8~eUBEYd-iYqh8@~r6ll%HDM@8>vlORfd`Q3a$y-{Xt2kZ@>GRSC|F&JVsI;QKU^0o7}F zAz%KGZ-dq-AE!X=2FL^DlfV6qi#ksnxaa%D(Eqq$ib5ZEF&)u&G}wp4pGpF zC=6;>ppWEniRAhF_+fI`x%AQ`q=rTCBRD+w|lw+X)C&TL>0FFE5KHn(dm#>_4CV{xl>4*L@C$YuCTBp&}0W(PAFJE{*wdLFE$PHyit1LN{8ai+x%+f$4AH6 zAYpwWlJ5JrIG90|bn*aQOvUo4qI;817j>TkF2ivT5KgxR%B}n@QOSB z)1%L(*86|VaOaWiz-3XwOv8hKl6fzESfg>oE{RTokym(cA z>S~zUA=EnYgBsqCCIHI|u2G8{U)Uo|QwlkK;tJ+5@m-0d<0eusPlnj?C}W8x(L zCglaq56d8^^X`Wy|W~+OCoM{yiw7`pnJj*CX-1?>u&2{hOs6gd8Amf{iQ`I!-6ldc_T9 zxR2+p(}-nuQbSS}Uk0N5?pOd#Nb2(_9W;ZYBS7rp5Vnq=gDW&RqmyWJ!vV6LH(q4y znA}89Chhp}X9aJg#+&{vLSdmH_)m|+7T9>CuYlc_hs(n6b6sNxiaGuk6#TC`upy*(4Mkc#8O4C|hyH%Pa5aLNiROu`2o4K@%gMAJwWF$Gvugo2zxKq2yfwf+e{G~BB0iarpQNOu zVtL|*d(#THFPZoyVbNu20}7Ad1CZ7aAZ^g@sVDvL*?85#rej8qNJs0|g8$K6QtROT z@AG4qYAOf%hyO)$L2sXMcN6DbwaCm=2zBy^8q@Xu)k@G8mCeK_3z}>j zNg&ngkk$YdA1$9uvCr3SBh}dhT$vgzfkkPu_zo;PL*sF_8g*Sd!KEnwF2Ifnq}ef&U`G?y4i5 zlvht?Zr;a5Q6V(}XZ@20(KMvclZ8Ss(5DlT7+H(dsr)aa`VF9x5NYv{dvq)zvT|Y1 zXlKfm93tB+4SOGc2$0aTslN)dK#2VJ9+q&Xy^+XRmxX&8lPz7;Gw!sKa{Dk6e)C9H z1(zE}6B8E!WDSbT`1nhV0dzM^Lml;+#shr1djRtdogZUWm`W801AIhD3cK3cUYY*C z@C`$r`jL0E)mG+p!$@ZRM_Y^y$oIL%Q3ATZC+Gsv>rg0)EHd6?s7OjID~kq)Q&C+Z zM}Q?Mb?5N~vW^0h3k(q{>-~^!KdD%MASh!Sc@%?>OtW`II|`+Z{F@Yz-JjI8no1Yv zc7`UXZ*)xsa+kfU&zBVd)e*YCKp9v1!qAF6{mA|4GP@Achal^5XunDn6fpebTYeVx zTuA>m>FIxtiL(o{wU8HJ+Y>rk%t~cF0#2DZlGC*L*}Cc9QV(UXoc+{p)ZG({+;DiA zYM@r-W^EzWvD{zlB@(b?k<{bnW9zunEo|hx@MW$OTT{KB4K%4&EgVsUkCeo5rS?iQ zr{@{mQ30g1n+|e8)&Az~$4j4^?C||Zr8C%!{FB-vUg^5f?s!xLxn$b_6&(EJJt@)& z#4u>=YS#pR)w6J$)(2}H9JmJqq;kknV-=f~je6ndLg)5WOMG^!_Y#^;W3Qox(SX8$ zT_uzf4OV3^eQNZ)c$PxccdK{GlD1GrZglloWX#iIm?P7jqlr3V4q!|C&}x#U7l!PI zOYDLulGZ5SRre)V=hAF4vZlKEa^d>|XU(T#M;n!NJqtRLaG=Y$7+|4JAuUOwarh2G~#H>h$SKCs>g zl4S)RT3T^G^F1!=#1RH^!b~khIuK$xIxKeKUxBdX++}Sf@fj;$Js06<*1;O}3A)}@ z7G4STu1V)IXnDWQ}ZGq4YpS03Ty4sIsz21!ZF0Fy`5RY5e7Zb6I;{YdR3h89rE(l ze+^T5EbjENl6nt#>~1hY;A>A&Nqve?0yiZ&7uj>Tf2O7x=u3LmLK!uN(j)Z)+oUZR z&e8yGjE6zU_-J8{$xnp~?LgtRy4rxo@;{yzU^ZBnvcp0x6tbf}XP0@ULXq#tCAb5x zW`-#aAkQ;=E51!@*mR@;khV|U1<2HV&X;T~vcqqLO{MT%HM0kcO)*@U5_x4Z^(U_| zPb*0TXe>|C?ka`qmiiyjlDMKMn@2!RPQ--%=P54drPb>?Y14p*-D7XnthDzMoIoKe zxGwQ0tX%XxJICOIbG~MK`%-LfqEYKX4X(~T)PGTC7uaJ0{#})pcm@!d4$dmSKA}x| z!kVfxlIFIl)8x>Q;w{42l!#Z|nIc+_%k{L9D(NkxZ%5xvrJR?zlYmX0-aUjft*t^= zfU69Tlws?2!3h{aTbn6Aj3!*lc#g2A6q%PM@H8YkX&ZB|kWthGBgeVTw|=~qN>sVe z9PRM`dW(MbPoeAqw_zS$4uqk1_*MeQ6?cAJ;~Cbc@}tDZt{q1JlE)b6T`(|+{0kTi z{LNIz^?zHt)_v9OL)*?vI4QAQ*am#fYWPi^W+&rD$~ITo4WR0&s$y8DoscJmP}=xz zf+P640v$(%$7%5Re6(~Er=-p37JVQq7-GTl=>2KM^Nj8%;L?f$S8V?q%d@PO!Pglb zqg|vMyN7z4PcR}q&sl{#Srw*7=K28VaG^)gcF#+1|AU_6*PbJ6JkZJJmjKB!TTQLk*ZmDs8`=1Ii0G<$YipDyNugWhMw?ccZ{R zuOrbWyStDUpbh8=p#CL7oG8l**GT2MFx4_^1z9Q_3zTtl1oG~iv$`y&Y#DuE38+@# zfBX`-PGqz@)xc;78V_Z9`=AERF{@of@4`7YFGI-S>I1%@sG}~uHfH_n%pl#~XWr23 zg0@>WP*qj(Udf>0SM%)>m1`G1*vBXZ5MmN$X9udc9*fCkyvEO-2D2(6lox+=sSX{F z3ebm29R37pNC8b?898T|9#Z)(c>b@&F_tw$eU6AIu+^G+yG5aW?HS-qQj;}=# zfhAzRYxjjS)mgd>VNQI%Ts7vtAF}OG@3r4(wR5=I6&8xa zpLyY$8>%$fB*JNAU;X2m&ixCUyLwXPz(oWgI3z;DTdR!2zDI2pbMYw zE#V84;Q)C7-*1DRFD_NOQXVF$Q}szSp^elL4WK{+mA$%Ke^_B33*JskdXaFmRZImm zELxO{v&^@W2hy>2!8E|}bW%gqo@E+NqIZ$kA^P7BxX?t4Lfgg*%sTrahlhY0&-Ymm zmKQ7FcTf1@SpE9zxt48LSBz#$T8I!92UO072UeG&-k1??KQh=%uunWEIA`h^)(E%}`2&ase}u72R5m*c?O>&Csa zKk{z8$#ih9vq93GR@kYR<{G4|%ZES5I?e&=>**>G?&$Nm@=7-5kqqVNJoLQ{36K3UXrR3mil$|*q6;uM29{>=1 zbUdkdwIbw0SO&{?ECAn^*8{C4Q$X7#<4&Y1b@MSA8A|4RWxElot|EAp>;E|-pOD>g z?C}Z-=qwg}{(Pe7+x(^Wv%^Qy7+=)Zz{)WTlx#+FWYH2HXbO4}!>(4b*T1{twod~x z^p#tWqbBQ(f@N}+``k!b9I=oOhL~#O`8y2VXq-VZ1D6x z?4mZWgzP${#*r&lF!J7lTXMQXe-RQmw@0v$GoU^*M~<(012InVm~HER-~BbEJV6K* zxDEnO%j#~bTsM=;$dZqEDaX_>r5sgj*uWyQXq%P<$~X0S^8WJ+L(QUqr?njWgB$1@ z7L|0^v}^ALgZ5{&gZ8LG3Pszs=#bU07p)2;=WTl=99xx<>4rmLfUqS`4+HIiF3wDE zH|bq$RKD_Ei&%P>R!h`lfN;F>e?@H*$Zm!MwEv+dWS5|?!hQ?MP~$=o@^ zs_JnAH&993m#%(`w$Ft!MhqiwXmC6 ztTq7H&(EYKrK3-ZP9AWbs!!3wWyS@f7gRmBwgWu_!6A?L_l7=HK3TFt`hfK^FBk#o zLD2#p~yP0KFNM_YLl!jDz4m=hY&|A6BT^KRK6Y z0ux%w4c3OT{kkiAx%IMpWPbGqWqq7Z^~Uq|?xp32OK>_VQ);(uBZK?u8W3qo%?n^@)mtbR)8<=a zf1NZ!2qu_U3?Doo#`?g0U zEmId2ZeCWSe-D5>!DXEWfP8uLQL0a$xlh5|5f+Bvj|rOH1%SSKi> zoc7P`6XV!AH^O?oL>nS$i)pvf*`dZ*5|>#2aQUFYrZdp7?XtvO2`DI#V9-OoCV;_{ zQ<)!8zY+F^0yiK)NuSFJUg_i9jM^za@7v)@Ysc^Sh&BMWHXn0}#6$5HYO8PsuC}99 zHm3)b$}f;M%XcHyK!NYcLyw*ZGM84@CO13nz$GzK%|BMx!V@?pJw-1Zye)DzR9~1% zyX`k!t3Pq82);2T4)IYEbdP``3O@|AzM)lc#Q^^)0OELW28e4Nw$qe4-XOYA-u6Zi=H>_eKkU6}Jk;&`H?9(wgrX8dDq9H2PL`5vArZ0` zWuLJxVN5Ax&mM*$TgcAXNyaF$hhZ=nJ7eF6ng3^8-|KgM|Ih9R_oMs1Jz{wIoS$Y;qO8-c_BXIX*}qTMR>8PjoEb|i#S2T<;o_Hg}EdRAN+4aYb|eA@wJ)vt)W z0eeuRSC&};7_lv#!Y#Qiy#&(=~Bb~2k&fiVJPw#GN5r;H*gXd+wAp5Bhh zJM*4OMww#x-i)13*<@%5tCV24@Jlt7PapsQ%WEky*nCZSpf{+lN;_RSU~05h%v|W- zOesYO7;r3Uj3emcOqwN&fEf>1&NXsEdl$F z6G1FHq#y{>@nSd6q9Y>WEw{NeujkrPd-+z#M!=&*s6nIQi(zp zdHkFMr#m>XvUN-wO(2&WTlu1qYID(@{Nedha_jJA9eqT?e(=N?TRp zpk3DLOF^t%!T>7AY!WN`z+p6ktCW(3*L%#rwGT+v>UOSl^Rr$(O z#VCwEP>v7xwZ;vogpiYcHrinYzgD94Y*O=xx6!o`}kG`mL)n+)qD}Vf=;>8Mda-CtFCBMNK{$_ zV-HPrb0LU}cVu(H-^*5V7_xBjW|Adx3fI_4{+0S}K>70P_ES`HeK??%mF*}E2T<1{ zTHJJyKRsQ@dZnbu5wVXWFBC>5bRq&)yH>7JDf1tKs7kjUV}XnZ&;i5qq*2BHEyYpW zFI$5NZCauwqK3u(6<660CFB(?SfHdkeZ!v@wnEZeBkM*15zz_HOesxxRyY9xh~85# zhVS0pRNVj=*YMd+qqTh)*|aT@jA$gTmS@#%Dw5=Ex>6*?cQ-e!jFDVd#ie%l*;=p0 z#r>33f1%7qcO&yHbL^ATuX*C#6Q6XS(kL41kX1{4VXfqxkxsh&=h>j*vufvp!r~^J zl49YaDG^==)$>jp_3Tz;ZT7SR%G%C$$+cvLLp!BMWpf{=t)civ$~{Ylt4uA|q{-0e zJzeq<9u7MgM)>Yc?9~h}Hd;(<&Vr6xg21L9D~Tm&+5Xk$*!impHep+9nP!@|Fk1!# z=?ZF%nXTwUgvx#e-Pl2Ded9F++BYESRgclrR0V3oU$s-ciLf}BD>iN7SDX?2^8@q7 z!!&94IjgmzYTOQ_b|Z>*| zaMu-#>U^N+d&O(BD3f_ne*(0(v3Wr1SDbG1ijrj6F^@()*#XW?APvZ<&F?9CjK&v2 z=3ma=8_ejj`TqUlMDy{&m3akT`|&vir43tvz096p=%Wt^JdWN|xN?wc<`Ae-ah1zw zL15n5AMUpb{evyd>|W#!wE}asnN)bC4*WZm%y;h_uXmJA;nR$53Y%8Bk{D?< zHGt~=%1*@bOJavw=z4-swG6Z^SsE5J&}1CR%T?gYNTm#R7@}hw*Y@#rBL6=3O4G2${;MNPJJ#hDI@bMvMH}R8vz>XgoT3`{H&apZH{R8ve@8#~1 zDck&&cVK(>6xF$Ew?V_TJ#U4{qoS@n40Sum8O=|U_gGoQtuME91AOsb@Oe)B@jkzj z_jLS`5rGlwY>W#~8TZm{Sorh(XI|Oi)j=6rsthT~W$F+N{ny8EiS|(XhFxDr{-!n- z(F5rSDMNXmdz+XFog<-=COpcp@bCRo=ow{Yml$lL@PRlSk4x3-`SQ9D+1*p{;EU!V z#<;Io+?zc0GOr6Zu>o`LSYe^Ei;9;(!fZkMj{{ZYLq>M{^VTl#8yc33%%M7d1Qo(D zr9zIvJt~?ruAo#J#LsD2k$QLbwd67=IZk9V#Uq571hcN#ZTz9fe zvSQ|FRdOX72}k*3-+8ZX#0<=}C6Q-PL5nW~!C5(CQpFtqnHVCq+L*~RaH^(bj=|gkzjnm_tn-wI8&fH7{Gf}PPj_C7Bs%#PXH+1?s$sC4 z&(tA@l>|TNei;iZ(sNlcFLEXoYFCmo8r4|#TDYwMEen*_=8y2ptR4}#;Pig|+rLT2 zA@XG=YYzC^MQ5uBG>q(vsGM<_WOocONI5kzgU;4nqE9$0yoSfN+iZ`vX>`18mnGL+ zPh#Mv<;^?;_TQshp}BXklo4GKw!mwrA;06kOk5L^ZpqB~>}nb)orp5BQh@LkPDDpu z7B;OcYbGN6(rVlc@EkzJ@8Ajxhc~&z)bGV2>vEb*sF2}Eea{R2?x$5A*j0kJoUE(; zo@Jza_BgDnTQ8!9U>q0wDv<`UtMSa*K%S>~NL^OSc?1tvTUyqYD+3IGAn@4PL}Za2 zO-5vu0UV12DZR{P;osTGgJb3`?PgK`*(b%oKJl4s;ZLK_7fi#-yqOyrhGQ;r0~`J} zA^RmZpS>nh>))O7Ab&N4ur=&GF>Bs*WW+y|a@VtI0Qp4lyWy{7j&Z;9F5MgL#B1); zR8$E@kU(zxH&!>acrBer(Dr%ehEDKXFRiSr8tbC$hnWd3xsF&=sC$EGB6xjiiSbGU zsyv0VaVZ1pWhid^#5c%UGe4o0hCzo(cP#Yj!@ZU|(f_p~nbS6L3-_eDbLjjh`AF|7*Dr(@;O4fcv9E@{<>=tj5@sG}v5KC|kMq7%&Z#4HjVcIl#Q5q{&f>U?0;D@LETD>lU8 zGLG9<_s}M$VWTzwcrBCpTOYz&M@RujaR^q4>jZKizYZ30JZ)6=UR)tLoS00pE2y~& zuxVrSB~`;BQa}0LDl8*tpu~fiVX12Sk%}rdA$9UX{j*wsIjcYx+csXA3Bn~9w6B#K zWO~b-E6%~sfcVc=DX@JZ`bopo+M!+&WV#etwIqW1?~yzlhCtIuvFX0gUA3|{2QT(T zFoGxICN#;tbW3`V?qj)?g|jEgau%t_GLUAfn|6f4hZ}Az60!?S&vr*iOAS zm!}op|6rCh<`nk!u+sGuA>FEnw?N9-I!+>SviEk3q+_)#fr@Ie;9;Oj=Q*(7fzSFa ze#6T5n(f~8@*7|39!pt_BA1s?VP4t#fvQ!-a*e~C#A9JgC3wx@@Sb3Hzn;(GH zVsuektW8mkiXA`oSQ@wH$+6+j?lyUvdLOa$-qpl5Q@kcf%D-W6Q^=XvdB3u4<>;)C zbsU|L5k$jZ>A>OrzlYbv)JH+Tf`3@d&4mWoKeS_3GZz z;93K>S~t-XsC=@(Lls>U$>}+rL@0bqLyV45A>Z-fkvzho=V&_-3n!gc@MCZrJww&6 z2dvg(ilOFS7bPF+!%VkoOgM)=m+7Z92@|d)N?4pj5hVCDv|fC3fCEcq3M>`=xER72 zl%0yk!Vcv5k$*srU|t9OKj^_Bjhl<%$VmzCHB*>8t)R~UIvOs2W=hsbAXJNKkPYcG z_X;26uX!#KwuR#Ie!BymTm?&>(lH*JNBgZ9*gX*}Op{X#<{oZrI3D*GwjU%We{W3_6zW8GvqTMhD^o8zsB~qn z&T%4>TGM0-b#XUz>Jy7bW&X>yUsThFN#a{~^?ueC)u2+&b4m@#Ll09}5EA=Ez%*F+ zHC7EYCzfDjsFYvx9!HAuw_JPzZ&=xcZRTQas=OPk8qjXe;pmi<%?B>oF-B{OKP-@-&er~ zf|}$5C#UQ7>!!b`)rKJu1@>oU)vkbx(FC$Cq10;3yadyG2j%YF2}08HWp0y`_O^ao z50H;^1y8eATbrNYJ1~#T1GMhvMYDUbE!^IWut>hO_fbdD$Q^6+O@66=Ey(oO!v=5( zJG)e|nBy?m`!J>^8T2l@r9|5WHOMAV`KjPs+9=YwdEi&*8DJfN2wsAPW0ZL;UANOH zwm66TQNSt+=f0Mu1JB`Xagvwy+pS|UrEE$E5M9)#x;mBaHhn4Z1OY_@$fc%GofI2} z`S+Zb{;38FX&PdH%{Y7s8$DyX^(|~y%EBqodKWGVziRKq>DK>^85w@|?e;VImdrzr zf~uE2(iFeqqAp7amfZXR8GxTIsK z`^5w)!o(ge=i8oC9q6DRo7YasR5}Ac7^lsF+ ze2aC~)WKlhMkbv=jbCZa$M37R!*^nMK81CAE{(N@CXgHOA% zaHb%f61vjoOs64r`{G{`R=yOyjAOq1(zR{aKym^dw78{*Bkwp?^Jy42<#z!4UW2>k zVzsy-N7u)D9t+Vh$fsOA7kv-)(urq?UCBfc;6#ia!lLV>`F00dT1*>&eq za_y~KJ@gM?5OU-|u~^*;M?i*sg1~i=ZA+tV}D66h;pf5v?38E@{cvW13XO z<4#P_M$i(uuN1ZT9T-L3b2>&sdP2!}Pk1EA`%U#xJ3+@X$OqrWSf-^>bm9V1Q#=E+ z;@JRWCHE2gj62lk{G|%>=K$QML{0#hT)+hqRCFT+#dbWqMuB6|e3UlOoHK42A5p(! z>n+oMxXn4e4fH_ zB~?_$rR!!f;0`EPE0&5U|E?51CDe)rDXG@mxwYg)KJhO*V)& z9p%Nw37kYHNWfo&*!gvv*GDHF8CaY-d%5CInlhs=_c|TsC}0Mnoc}nB1zJ#!U@{FH$KFWWR>{ z?Q-lSnOM~Cde8gt+H>UOB#qLTS5SFEM{4Yo5E-RqIVXWgmnC2%C@K>w<*i47lw21T z)vIfCl*T|*RG;4b^Sim2$&*j0lGXm-AN?;)!SHPsj`nCvpvxQZMYjU=a993&=H9Yf zuVtmaw@IFqfgZA-{966Re?B?+iK;4yn)c+opZAz4t>&nxu5YQIbY-G?``#SQy$`gU#mGMTSvC)an?yKI!`n85+4yu;UX(C?hLYn|t`U2Jh& z&jL&mvVd~&jWnX0_*Oz*4{i!|n(8e`-9@6tpd2obwGWev;A5(T>O>A zWs5DWuK+{TaJbo$`2mG`ZrTvTGW>?fXcobNtt5Qdv%ty5@bg4Mq0MA7=Y!Gr6IIJ( zm+qi#VUq^*GA7@)8^HT%pG_*g#&>_tZyumVbk0*{$Vr@$xGHT27lV>^fBIPcj%UyT zu}RuPd2|SJd&y};(n9F64$v5Wy)i}I#m?)|IuFm)Cw2_qY+j)hp7*iDrgMpI(?l50 zd2-3%9I;T7ZH*2lOCs!0^;uF0ToF2+Dr2vMn(YiKng#1nP}A{Lbo5-rHSxjFd{z1@ z-@^PwxOT6tps1({tmh}(Yd2JzbrTOuz$31A??xFn&l+cU1sAp7Y_A?l+q7JhchXqh z87KD0&lglaMT3Nlz>z5DiSqW){MW=?M1;ShR#LG$khz^L45e;Q(N=TQRSb@{B&5j_ ztA-tae)*Y#*;TOJZ)?~_wIPkn8M}^*OPxx{mw1m}&Avai)rjXOuT*NZl8*CkN|(B= z9$CU`=Ax+8D2Jxk<7<@Br}!rdk&~X6*%{Cm(|mh62JyXT;?^HW+HWCeM;9`+)(
E3p{_mmaMA^>V*7%q){dmRJL?3gdlvJWc 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 literal 0 HcmV?d00001 diff --git a/docs/assets/screenshots/nodes_last_heard.png b/docs/assets/screenshots/nodes_last_heard.png new file mode 100644 index 0000000000000000000000000000000000000000..824627b2af4495adbccf06ed15f5ac114c638c9b GIT binary patch literal 4268 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 A-~a#s literal 0 HcmV?d00001 diff --git a/docs/assets/screenshots/nodes_node_list.png b/docs/assets/screenshots/nodes_node_list.png new file mode 100644 index 0000000000000000000000000000000000000000..cc571c3b1da7cb63d52c2a70b7233012db2574fc GIT binary patch literal 135280 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

M|xc4y|UO@oAabL+^P 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 nuN=AF06 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 SQ3rZ({H}NXa{k4;kN*!m*bcJ* literal 0 HcmV?d00001 diff --git a/docs/assets/screenshots/settings_app_info.png b/docs/assets/screenshots/settings_app_info.png new file mode 100644 index 0000000000000000000000000000000000000000..ff78aa035339c982de5ac9bd4d562f3ae04d36ad GIT binary patch literal 40965 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

\n\nAfter" + val result = MarkdownTranslationSegmenter.translateMarkdown(input, uppercaseTranslator) + assertContains(result, "
Don't translate
") + assertContains(result, "BEFORE") + assertContains(result, "AFTER") + } + + @Test + fun `nested list indentation is preserved`() = runTest { + val input = "- Parent\n - Child item" + val result = MarkdownTranslationSegmenter.translateMarkdown(input, uppercaseTranslator) + assertContains(result, "- PARENT") + assertContains(result, " - CHILD ITEM") + } +} diff --git a/feature/docs/src/commonTest/kotlin/org/meshtastic/feature/docs/translation/TranslationCascadeTest.kt b/feature/docs/src/commonTest/kotlin/org/meshtastic/feature/docs/translation/TranslationCascadeTest.kt new file mode 100644 index 000000000..980545baa --- /dev/null +++ b/feature/docs/src/commonTest/kotlin/org/meshtastic/feature/docs/translation/TranslationCascadeTest.kt @@ -0,0 +1,122 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.meshtastic.feature.docs.translation + +import kotlinx.coroutines.test.runTest +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertIs + +/** + * Tests for the translation cascade decision logic: Crowdin bundled → ML Kit runtime → English fallback. + * + * These tests exercise the service interface contracts without ML Kit (which requires Android). + */ +class TranslationCascadeTest { + + @Test + fun `NoOp translator returns Unavailable for any locale`() = runTest { + val service: DocTranslationService = NoOpDocTranslator() + val result = service.translatePage("onboarding", "# Hello", "es") + assertIs(result) + } + + @Test + fun `NoOp translator reports language unavailable`() = runTest { + val service: DocTranslationService = NoOpDocTranslator() + assertEquals(false, service.isLanguageAvailable("es")) + assertEquals(false, service.isLanguageAvailable("fr")) + assertEquals(false, service.isLanguageAvailable("zh")) + } + + @Test + fun `NoOp translator download returns Failed`() = runTest { + val service: DocTranslationService = NoOpDocTranslator() + val result = service.downloadLanguageModel("es") + assertIs(result) + } + + @Test + fun `fake translator returns success with translated content`() = runTest { + val service = FakeDocTranslator(translatedPrefix = "[ES] ") + val result = service.translatePage("onboarding", "# Hello", "es") + assertIs(result) + assertEquals("[ES] # Hello", result.translatedMarkdown) + } + + @Test + fun `fake translator returns ModelDownloadRequired when not downloaded`() = runTest { + val service = FakeDocTranslator(isDownloaded = false) + val result = service.translatePage("onboarding", "# Hello", "es") + assertIs(result) + } + + @Test + fun `fake translator returns Unavailable for unsupported locales`() = runTest { + val service = FakeDocTranslator(supportedLocales = setOf("es", "fr")) + val result = service.translatePage("onboarding", "# Hello", "xx") + assertIs(result) + } + + @Test + fun `cache hit avoids translation call`() = runTest { + var translateCallCount = 0 + val service = FakeDocTranslator(translatedPrefix = "[ES] ", onTranslate = { translateCallCount++ }) + + // First call — translator is invoked + service.translatePage("page1", "# Hello", "es") + assertEquals(1, translateCallCount) + + // Second call with same inputs — fake has no cache, so it calls again + // (real MlKitDocTranslator has DocTranslationCache that would prevent this) + service.translatePage("page1", "# Hello", "es") + assertEquals(2, translateCallCount) + } + + @Test + fun `TranslationResult sealed hierarchy covers all cases`() { + val success: TranslationResult = TranslationResult.Success("translated") + val download: TranslationResult = TranslationResult.ModelDownloadRequired("es", 30) + val unavailable: TranslationResult = TranslationResult.Unavailable + + assertIs(success) + assertIs(download) + assertIs(unavailable) + assertEquals("es", (download as TranslationResult.ModelDownloadRequired).locale) + } +} + +/** Configurable fake for testing cascade behavior. */ +private class FakeDocTranslator( + private val translatedPrefix: String = "[TRANSLATED] ", + private val isDownloaded: Boolean = true, + private val supportedLocales: Set = setOf("es", "fr", "de", "zh", "ja", "ko"), + private val onTranslate: () -> Unit = {}, +) : DocTranslationService { + + override suspend fun translatePage(pageId: String, markdown: String, targetLocale: String): TranslationResult { + if (targetLocale !in supportedLocales) return TranslationResult.Unavailable + if (!isDownloaded) return TranslationResult.ModelDownloadRequired(targetLocale, 30) + onTranslate() + return TranslationResult.Success("$translatedPrefix$markdown") + } + + override suspend fun isLanguageAvailable(locale: String): Boolean = locale in supportedLocales && isDownloaded + + override suspend fun downloadLanguageModel(locale: String): DownloadResult = + if (locale in supportedLocales) DownloadResult.Success else DownloadResult.Failed("Unsupported: $locale") +} diff --git a/feature/docs/src/commonTest/kotlin/org/meshtastic/feature/docs/ui/DocsBrowserScreenTest.kt b/feature/docs/src/commonTest/kotlin/org/meshtastic/feature/docs/ui/DocsBrowserScreenTest.kt new file mode 100644 index 000000000..716f568e6 --- /dev/null +++ b/feature/docs/src/commonTest/kotlin/org/meshtastic/feature/docs/ui/DocsBrowserScreenTest.kt @@ -0,0 +1,153 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.meshtastic.feature.docs.ui + +import androidx.compose.ui.test.ExperimentalTestApi +import androidx.compose.ui.test.assertIsDisplayed +import androidx.compose.ui.test.onNodeWithContentDescription +import androidx.compose.ui.test.onNodeWithText +import androidx.compose.ui.test.performClick +import androidx.compose.ui.test.v2.runComposeUiTest +import org.meshtastic.feature.docs.model.DocPage +import org.meshtastic.feature.docs.model.DocSection +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertTrue + +@OptIn(ExperimentalTestApi::class) +class DocsBrowserScreenTest { + + private fun samplePage(id: String = "connections", title: String = "Connections") = DocPage( + id = id, + title = title, + section = DocSection.UserGuide, + navOrder = 1, + resourcePath = "user/$id.md", + keywords = listOf("connect"), + charCount = 1000, + ) + + @Test + fun loadingState_showsSpinner() = runComposeUiTest { + setContent { + DocsBrowserScreen( + pages = emptyList(), + isLoading = true, + searchQuery = "", + onSearchQueryChange = {}, + onSelectPage = {}, + onBack = {}, + ) + } + onNodeWithText("Loading documentation...").assertIsDisplayed() + } + + @Test + fun emptyPages_noSearchQuery_showsNoDocsMessage() = runComposeUiTest { + setContent { + DocsBrowserScreen( + pages = emptyList(), + isLoading = false, + searchQuery = "", + onSearchQueryChange = {}, + onSelectPage = {}, + onBack = {}, + ) + } + onNodeWithText("No documentation available").assertIsDisplayed() + } + + @Test + fun emptyPages_withSearchQuery_showsNoResultsMessage() = runComposeUiTest { + setContent { + DocsBrowserScreen( + pages = emptyList(), + isLoading = false, + searchQuery = "xyzzy", + onSearchQueryChange = {}, + onSelectPage = {}, + onBack = {}, + ) + } + onNodeWithText("No results found").assertIsDisplayed() + } + + @Test + fun pagesLoaded_showsTitles() = runComposeUiTest { + setContent { + DocsBrowserScreen( + pages = listOf(samplePage(), samplePage(id = "mqtt", title = "MQTT")), + isLoading = false, + searchQuery = "", + onSearchQueryChange = {}, + onSelectPage = {}, + onBack = {}, + ) + } + onNodeWithText("Connections").assertIsDisplayed() + onNodeWithText("MQTT").assertIsDisplayed() + } + + @Test + fun pageItemClick_callsOnSelectPage() = runComposeUiTest { + var selectedId: String? = null + setContent { + DocsBrowserScreen( + pages = listOf(samplePage()), + isLoading = false, + searchQuery = "", + onSearchQueryChange = {}, + onSelectPage = { selectedId = it }, + onBack = {}, + ) + } + onNodeWithContentDescription("Open Connections").performClick() + runOnIdle { assertEquals("connections", selectedId) } + } + + @Test + fun backButton_callsOnBack() = runComposeUiTest { + var backCalled = false + setContent { + DocsBrowserScreen( + pages = listOf(samplePage()), + isLoading = false, + searchQuery = "", + onSearchQueryChange = {}, + onSelectPage = {}, + onBack = { backCalled = true }, + ) + } + onNodeWithContentDescription("Navigate back").performClick() + runOnIdle { assertTrue(backCalled) } + } + + @Test + fun userGuideSection_showsSectionHeader() = runComposeUiTest { + setContent { + DocsBrowserScreen( + pages = listOf(samplePage()), + isLoading = false, + searchQuery = "", + onSearchQueryChange = {}, + onSelectPage = {}, + onBack = {}, + ) + } + onNodeWithText("User Guide").assertIsDisplayed() + } +} diff --git a/feature/docs/src/commonTest/kotlin/org/meshtastic/feature/docs/ui/DocsLinkUriHandlerTest.kt b/feature/docs/src/commonTest/kotlin/org/meshtastic/feature/docs/ui/DocsLinkUriHandlerTest.kt new file mode 100644 index 000000000..c743122f8 --- /dev/null +++ b/feature/docs/src/commonTest/kotlin/org/meshtastic/feature/docs/ui/DocsLinkUriHandlerTest.kt @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.meshtastic.feature.docs.ui + +import androidx.compose.ui.platform.UriHandler +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertTrue + +class DocsLinkUriHandlerTest { + + private val navigatedPages = mutableListOf() + private val externalUris = mutableListOf() + + private val fallback = + object : UriHandler { + override fun openUri(uri: String) { + externalUris += uri + } + } + + private val handler = DocsLinkUriHandler(onNavigateToPage = { navigatedPages += it }, fallback = fallback) + + @Test + fun httpLink_delegatesToFallback() { + handler.openUri("https://meshtastic.org/docs/faq") + assertTrue(externalUris.contains("https://meshtastic.org/docs/faq")) + assertTrue(navigatedPages.isEmpty()) + } + + @Test + fun httpLink_delegatesToFallbackForHttp() { + handler.openUri("http://example.com") + assertTrue(externalUris.contains("http://example.com")) + assertTrue(navigatedPages.isEmpty()) + } + + @Test + fun anchorOnlyLink_isIgnored() { + handler.openUri("#permissions") + assertTrue(navigatedPages.isEmpty()) + assertTrue(externalUris.isEmpty()) + } + + @Test + fun simpleName_navigatesToPage() { + handler.openUri("connections") + assertEquals(listOf("connections"), navigatedPages) + } + + @Test + fun relativePathWithParent_extractsFilename() { + handler.openUri("../developer/architecture") + assertEquals(listOf("architecture"), navigatedPages) + } + + @Test + fun htmlExtension_isStripped() { + handler.openUri("mqtt.html") + assertEquals(listOf("mqtt"), navigatedPages) + } + + @Test + fun mdExtension_isStripped() { + handler.openUri("settings-radio-user.md") + assertEquals(listOf("settings-radio-user"), navigatedPages) + } + + @Test + fun linkWithAnchor_stripsAnchorAndNavigates() { + handler.openUri("nodes#signal-quality") + assertEquals(listOf("nodes"), navigatedPages) + } + + @Test + fun relativePathWithHtmlAndAnchor_extractsCleanPageId() { + handler.openUri("../user/mqtt.html#encryption") + assertEquals(listOf("mqtt"), navigatedPages) + } + + @Test + fun blankUri_isIgnored() { + handler.openUri("") + assertTrue(navigatedPages.isEmpty()) + assertTrue(externalUris.isEmpty()) + } + + @Test + fun anchorOnly_emptyAnchor_isIgnored() { + handler.openUri("#") + assertTrue(navigatedPages.isEmpty()) + } +} diff --git a/feature/docs/src/commonTest/kotlin/org/meshtastic/feature/docs/ui/DocsPageRouteScreenTest.kt b/feature/docs/src/commonTest/kotlin/org/meshtastic/feature/docs/ui/DocsPageRouteScreenTest.kt new file mode 100644 index 000000000..c3cae964a --- /dev/null +++ b/feature/docs/src/commonTest/kotlin/org/meshtastic/feature/docs/ui/DocsPageRouteScreenTest.kt @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.meshtastic.feature.docs.ui + +import androidx.compose.ui.test.ExperimentalTestApi +import androidx.compose.ui.test.assertIsDisplayed +import androidx.compose.ui.test.onNodeWithContentDescription +import androidx.compose.ui.test.onNodeWithText +import androidx.compose.ui.test.performClick +import androidx.compose.ui.test.v2.runComposeUiTest +import org.meshtastic.feature.docs.model.DocPage +import org.meshtastic.feature.docs.model.DocPageContent +import org.meshtastic.feature.docs.model.DocSection +import kotlin.test.Test +import kotlin.test.assertTrue + +@OptIn(ExperimentalTestApi::class) +class DocsPageRouteScreenTest { + + private fun samplePage(id: String = "connections", title: String = "Connections") = DocPage( + id = id, + title = title, + section = DocSection.UserGuide, + navOrder = 1, + resourcePath = "user/$id.md", + keywords = listOf("connect"), + charCount = 1000, + ) + + private fun sampleContent(page: DocPage = samplePage(), markdown: String? = "# Hello\n\nSome content here.") = + DocPageContent(page = page, markdown = markdown) + + @Test + fun loadingState_showsSpinner() = runComposeUiTest { + setContent { DocsPageRouteScreen(pageId = "connections", content = null, isLoading = true, onBack = {}) } + // Loading state shows spinner, not "Page not found" + onNodeWithText("Page not found: connections").assertDoesNotExist() + } + + @Test + fun contentNull_notLoading_showsPageNotFound() = runComposeUiTest { + setContent { DocsPageRouteScreen(pageId = "nonexistent", content = null, isLoading = false, onBack = {}) } + onNodeWithText("Page not found: nonexistent").assertIsDisplayed() + onNodeWithText("This page may have been moved or removed.").assertIsDisplayed() + } + + @Test + fun contentLoaded_showsPageTitleInAppBar() = runComposeUiTest { + setContent { + DocsPageRouteScreen( + pageId = "connections", + content = sampleContent(page = samplePage(title = "Connections")), + isLoading = false, + onBack = {}, + ) + } + onNodeWithText("Connections").assertIsDisplayed() + } + + @Test + fun contentLoaded_doesNotShowPageNotFound() = runComposeUiTest { + setContent { + DocsPageRouteScreen( + pageId = "connections", + content = sampleContent(markdown = "# Getting Started\n\nWelcome."), + isLoading = false, + onBack = {}, + ) + } + // Verify content branch — page not found message should NOT be visible + onNodeWithText("Page not found: connections").assertDoesNotExist() + } + + @Test + fun backButton_callsOnBack() = runComposeUiTest { + var backCalled = false + setContent { + DocsPageRouteScreen( + pageId = "connections", + content = sampleContent(), + isLoading = false, + onBack = { backCalled = true }, + ) + } + onNodeWithContentDescription("Navigate back").performClick() + runOnIdle { assertTrue(backCalled) } + } + + @Test + fun nullMarkdown_showsFallbackWithoutCrash() = runComposeUiTest { + setContent { + DocsPageRouteScreen( + pageId = "connections", + content = sampleContent(markdown = null), + isLoading = false, + onBack = {}, + ) + } + // Content renders without crash; page not found should NOT appear since content object exists + onNodeWithText("Page not found: connections").assertDoesNotExist() + } +} diff --git a/feature/docs/src/commonTest/kotlin/org/meshtastic/feature/docs/ui/DocsSearchBarTest.kt b/feature/docs/src/commonTest/kotlin/org/meshtastic/feature/docs/ui/DocsSearchBarTest.kt new file mode 100644 index 000000000..dcf4ee705 --- /dev/null +++ b/feature/docs/src/commonTest/kotlin/org/meshtastic/feature/docs/ui/DocsSearchBarTest.kt @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.meshtastic.feature.docs.ui + +import androidx.compose.ui.test.ExperimentalTestApi +import androidx.compose.ui.test.assertIsDisplayed +import androidx.compose.ui.test.hasSetTextAction +import androidx.compose.ui.test.onNodeWithContentDescription +import androidx.compose.ui.test.performClick +import androidx.compose.ui.test.performTextInput +import androidx.compose.ui.test.v2.runComposeUiTest +import kotlin.test.Test +import kotlin.test.assertEquals + +@OptIn(ExperimentalTestApi::class) +class DocsSearchBarTest { + + @Test + fun emptyQuery_clearButtonNotShown() = runComposeUiTest { + setContent { DocsSearchBar(query = "", onQueryChange = {}) } + onNodeWithContentDescription("Clear search").assertDoesNotExist() + } + + @Test + fun nonEmptyQuery_clearButtonShown() = runComposeUiTest { + setContent { DocsSearchBar(query = "bluetooth", onQueryChange = {}) } + onNodeWithContentDescription("Clear search").assertIsDisplayed() + } + + @Test + fun clearButtonClick_callsOnQueryChangeWithEmpty() = runComposeUiTest { + var received: String? = null + setContent { DocsSearchBar(query = "bluetooth", onQueryChange = { received = it }) } + onNodeWithContentDescription("Clear search").performClick() + runOnIdle { assertEquals("", received) } + } + + @Test + fun textInput_callsOnQueryChange() = runComposeUiTest { + val queries = mutableListOf() + setContent { DocsSearchBar(query = "", onQueryChange = { queries += it }) } + // OutlinedTextField placeholder is not findable by text; use semantics matcher + onNode(hasSetTextAction()).performTextInput("mesh") + runOnIdle { assertEquals("mesh", queries.last()) } + } +} diff --git a/feature/map/src/commonMain/kotlin/org/meshtastic/feature/map/component/MapControlsPreviews.kt b/feature/map/src/commonMain/kotlin/org/meshtastic/feature/map/component/MapControlsPreviews.kt new file mode 100644 index 000000000..386f8c2e7 --- /dev/null +++ b/feature/map/src/commonMain/kotlin/org/meshtastic/feature/map/component/MapControlsPreviews.kt @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.meshtastic.feature.map.component + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.PreviewLightDark +import androidx.compose.ui.unit.dp +import org.meshtastic.core.ui.theme.AppTheme + +@PreviewLightDark +@Composable +@Suppress("PreviewPublic") +fun MapControlsOverlayPreview() { + AppTheme { + Box( + modifier = Modifier.fillMaxWidth().background(MaterialTheme.colorScheme.surface).padding(16.dp), + contentAlignment = Alignment.Center, + ) { + MapControlsOverlay( + onToggleFilterMenu = {}, + bearing = 45f, + onCompassClick = {}, + isLocationTrackingEnabled = false, + onToggleLocationTracking = {}, + showRefresh = true, + isRefreshing = false, + onRefresh = {}, + ) + } + } +} diff --git a/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/detail/NodeDetailPreviews.kt b/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/detail/NodeDetailPreviews.kt index 432bbe1c3..34823ca57 100644 --- a/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/detail/NodeDetailPreviews.kt +++ b/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/detail/NodeDetailPreviews.kt @@ -104,7 +104,8 @@ fun NodeDetailContentLoadingPreview() { @PreviewLightDark @Composable -private fun NodeDetailContentMinimalPreview() { +@Suppress("PreviewPublic") +fun NodeDetailContentMinimalPreview() { val node = previewData.minnieMouse AppTheme { Surface { diff --git a/feature/settings/src/androidMain/kotlin/org/meshtastic/feature/settings/SettingsScreen.kt b/feature/settings/src/androidMain/kotlin/org/meshtastic/feature/settings/SettingsScreen.kt index 99e86e905..05a4c05a4 100644 --- a/feature/settings/src/androidMain/kotlin/org/meshtastic/feature/settings/SettingsScreen.kt +++ b/feature/settings/src/androidMain/kotlin/org/meshtastic/feature/settings/SettingsScreen.kt @@ -47,6 +47,7 @@ import org.meshtastic.core.resources.Res import org.meshtastic.core.resources.bottom_nav_settings import org.meshtastic.core.resources.export_configuration import org.meshtastic.core.resources.filter_settings +import org.meshtastic.core.resources.help_and_documentation import org.meshtastic.core.resources.import_configuration import org.meshtastic.core.resources.preferences_language import org.meshtastic.core.resources.remotely_administrating @@ -55,6 +56,7 @@ import org.meshtastic.core.ui.component.ListItem import org.meshtastic.core.ui.component.MainAppBar import org.meshtastic.core.ui.component.MeshtasticDialog import org.meshtastic.core.ui.icon.FilterList +import org.meshtastic.core.ui.icon.HelpOutline import org.meshtastic.core.ui.icon.MeshtasticIcons import org.meshtastic.core.ui.icon.Wifi import org.meshtastic.feature.settings.component.AppInfoSection @@ -268,6 +270,15 @@ fun SettingsScreen( onNavigateToAbout = { onNavigate(SettingsRoute.About) }, ) } + + ExpressiveSection(title = stringResource(Res.string.help_and_documentation)) { + ListItem( + text = stringResource(Res.string.help_and_documentation), + leadingIcon = MeshtasticIcons.HelpOutline, + ) { + onNavigate(SettingsRoute.HelpDocs) + } + } } } } diff --git a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/component/SettingsSectionPreviews.kt b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/component/SettingsSectionPreviews.kt new file mode 100644 index 000000000..af9b7b57b --- /dev/null +++ b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/component/SettingsSectionPreviews.kt @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.meshtastic.feature.settings.component + +import androidx.compose.material3.Surface +import androidx.compose.runtime.Composable +import androidx.compose.ui.tooling.preview.PreviewLightDark +import org.meshtastic.core.ui.theme.AppTheme + +@PreviewLightDark +@Composable +@Suppress("PreviewPublic") +fun NotificationSectionPreview() { + AppTheme { + Surface { + NotificationSection( + messagesEnabled = true, + onToggleMessages = {}, + nodeEventsEnabled = true, + onToggleNodeEvents = {}, + lowBatteryEnabled = false, + onToggleLowBattery = {}, + ) + } + } +} diff --git a/feature/settings/src/jvmMain/kotlin/org/meshtastic/feature/settings/DesktopSettingsScreen.kt b/feature/settings/src/jvmMain/kotlin/org/meshtastic/feature/settings/DesktopSettingsScreen.kt index 06ad3df7a..31ab16a16 100644 --- a/feature/settings/src/jvmMain/kotlin/org/meshtastic/feature/settings/DesktopSettingsScreen.kt +++ b/feature/settings/src/jvmMain/kotlin/org/meshtastic/feature/settings/DesktopSettingsScreen.kt @@ -48,6 +48,7 @@ import org.meshtastic.core.resources.app_version import org.meshtastic.core.resources.bottom_nav_settings import org.meshtastic.core.resources.device_db_cache_limit import org.meshtastic.core.resources.device_db_cache_limit_summary +import org.meshtastic.core.resources.help_and_documentation import org.meshtastic.core.resources.info import org.meshtastic.core.resources.modules_already_unlocked import org.meshtastic.core.resources.modules_unlocked @@ -61,6 +62,7 @@ import org.meshtastic.core.ui.component.MainAppBar import org.meshtastic.core.ui.component.MeshtasticDialog import org.meshtastic.core.ui.icon.ChevronRight import org.meshtastic.core.ui.icon.FormatPaint +import org.meshtastic.core.ui.icon.HelpOutline import org.meshtastic.core.ui.icon.Info import org.meshtastic.core.ui.icon.Language import org.meshtastic.core.ui.icon.Memory @@ -215,6 +217,15 @@ fun DesktopSettingsScreen( onToggleLowBattery = { settingsViewModel.setLowBatteryEnabled(it) }, ) + ExpressiveSection(title = stringResource(Res.string.help_and_documentation)) { + ListItem( + text = stringResource(Res.string.help_and_documentation), + leadingIcon = MeshtasticIcons.HelpOutline, + ) { + onNavigate(SettingsRoute.HelpDocs) + } + } + DesktopAppInfoSection( appVersionName = settingsViewModel.appVersionName, excludedModulesUnlocked = excludedModulesUnlocked, diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 5241cce5c..8c9772ab9 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -58,6 +58,7 @@ maps-compose = "8.3.0" # ML Kit mlkit-barcode-scanning = "17.3.0" +mlkit-translate = "17.0.3" # CameraX camerax = "1.6.1" @@ -155,6 +156,8 @@ jetbrains-compose-material3-adaptive-navigation3 = { module = "org.jetbrains.com jetbrains-compose-material3-adaptive-navigation-suite = { module = "org.jetbrains.compose.material3:material3-adaptive-navigation-suite", version.ref = "compose-multiplatform-material3" } # Google +firebase-ai = { module = "com.google.firebase:firebase-ai" } +firebase-ai-ondevice = { module = "com.google.firebase:firebase-ai-ondevice", version = "16.0.0-beta02" } firebase-analytics = { module = "com.google.firebase:firebase-analytics" } firebase-bom = { module = "com.google.firebase:firebase-bom", version = "34.13.0" } firebase-crashlytics = { module = "com.google.firebase:firebase-crashlytics" } @@ -169,6 +172,7 @@ maps-compose = { module = "com.google.maps.android:maps-compose", version.ref = maps-compose-utils = { module = "com.google.maps.android:maps-compose-utils", version.ref = "maps-compose" } maps-compose-widgets = { module = "com.google.maps.android:maps-compose-widgets", version.ref = "maps-compose" } mlkit-barcode-scanning = { module = "com.google.mlkit:barcode-scanning", version.ref = "mlkit-barcode-scanning" } +mlkit-translate = { module = "com.google.mlkit:translate", version.ref = "mlkit-translate" } play-services-maps = { module = "com.google.android.gms:play-services-maps", version = "20.0.0" } wire-runtime = { module = "com.squareup.wire:wire-runtime", version.ref = "wire" } zxing-core = { module = "com.google.zxing:core", version = "3.5.4" } diff --git a/screenshot-tests/build.gradle.kts b/screenshot-tests/build.gradle.kts index c6198a8ea..964b3891c 100644 --- a/screenshot-tests/build.gradle.kts +++ b/screenshot-tests/build.gradle.kts @@ -50,6 +50,8 @@ dependencies { implementation(project(":feature:settings")) implementation(project(":feature:firmware")) implementation(project(":feature:intro")) + implementation(project(":feature:map")) + implementation(project(":feature:docs")) implementation(libs.compose.multiplatform.foundation) implementation(libs.compose.multiplatform.material3) @@ -65,14 +67,42 @@ tasks.register("copyDocsScreenshots") { val referenceDir = layout.projectDirectory.dir("src/screenshotTestDebug/reference") val manifestFile = layout.projectDirectory.file("docs-screenshots-manifest.txt") + val aliasFile = layout.projectDirectory.file("docs-screenshot-aliases.properties") val outputDir = rootProject.layout.projectDirectory.dir("docs/screenshots") - from(referenceDir) + // Read manifest patterns at configuration time so Copy task can resolve includes + val manifestPatterns = + manifestFile.asFile.let { file -> + if (file.exists()) { + file.readLines().map { it.trim() }.filter { it.isNotEmpty() && !it.startsWith("#") } + } else { + emptyList() + } + } + + from(referenceDir) { include(manifestPatterns) } into(outputDir) - // Flatten directory structure: just the filename - eachFile { path = name } - duplicatesStrategy = DuplicatesStrategy.FAIL + // Build reverse alias map (CST name → semantic name) for renaming during copy. + val reverseAliases: Map by lazy { + val file = aliasFile.asFile + if (!file.exists()) return@lazy emptyMap() + file + .readLines() + .map { it.trim() } + .filter { it.isNotEmpty() && !it.startsWith("#") && it.contains('=') } + .associate { line -> + val (semantic, cst) = line.split('=', limit = 2) + cst.trim() to semantic.trim() + } + } + + // Flatten directory structure and apply alias renaming + eachFile { + val alias = reverseAliases[name] + path = alias ?: name + } + duplicatesStrategy = DuplicatesStrategy.WARN includeEmptyDirs = false doFirst { @@ -81,25 +111,20 @@ tasks.register("copyDocsScreenshots") { "Reference screenshot directory not found: ${refDir.absolutePath}. " + "Run :screenshot-tests:updateDebugScreenshotTest first." } - val file = manifestFile.asFile - require(file.exists()) { - "Screenshot manifest not found: ${file.absolutePath}. " + - "This file lists which reference screenshots to copy for the docs pipeline." + if (manifestPatterns.isEmpty()) { + logger.warn("Screenshot manifest is empty — no files will be copied.") } - val patterns = file.readLines().map { it.trim() }.filter { it.isNotEmpty() && !it.startsWith("#") } - if (patterns.isEmpty()) { - logger.warn("Screenshot manifest is empty — no files will be copied: ${file.absolutePath}") - } - include(patterns) } doLast { - val copied = outputs.files.files.filter { it.isFile } - if (copied.isEmpty()) { + val copiedFiles = outputDir.asFile.listFiles()?.filter { it.isFile && it.extension == "png" } ?: emptyList() + if (copiedFiles.isEmpty()) { logger.warn( "copyDocsScreenshots: manifest patterns matched no files in ${referenceDir.asFile.absolutePath}. " + "Check pattern spelling in ${manifestFile.asFile.name}.", ) + } else { + logger.lifecycle("copyDocsScreenshots: copied ${copiedFiles.size} screenshots to ${outputDir.asFile.path}") } } } diff --git a/screenshot-tests/docs-screenshot-aliases.properties b/screenshot-tests/docs-screenshot-aliases.properties new file mode 100644 index 000000000..bf1353a9a --- /dev/null +++ b/screenshot-tests/docs-screenshot-aliases.properties @@ -0,0 +1,65 @@ +# Screenshot alias mapping: semantic_name=CST_reference_filename +# Used by copyDocsScreenshots to rename CST-generated screenshots to the +# human-readable names referenced in docs/user/**/*.md and docs/developer/**/*.md. +# +# Format: docs_name=cst_reference_filename (both without directory prefix) +# Lines starting with # are comments. Blank lines are ignored. + +# Onboarding +onboarding_welcome.png=ScreenshotWelcomeScreen_Light_b29dc7a7_0.png + +# Connections +connections_bluetooth_scan.png=ScreenshotScanningBle_Light_b29dc7a7_0.png +connections_transport_filters.png=ScreenshotTransportFilterChips_Light_b29dc7a7_0.png +connections_connecting.png=ScreenshotConnectingDeviceInfo_Light_b29dc7a7_0.png +connections_empty_state.png=ScreenshotEmptyStateContent_Light_b29dc7a7_0.png + +# Firmware +firmware_checking.png=ScreenshotFirmwareChecking_Light_b29dc7a7_0.png +firmware_disclaimer.png=ScreenshotFirmwareDisclaimer_Light_b29dc7a7_0.png +firmware_success.png=ScreenshotFirmwareSuccess_Light_b29dc7a7_0.png + +# Messages +messages_quick_chat.png=ScreenshotChannelInfo_Light_b29dc7a7_0.png +messages-and-channels_channel_list.png=ScreenshotChannelItem_Light_b29dc7a7_0.png + +# Nodes +nodes_node_list.png=ScreenshotNodeChip_Light_b29dc7a7_0.png +nodes_detail_section.png=ScreenshotAppInfoSection_Light_b29dc7a7_0.png +nodes_detail_local.png=ScreenshotDeviceListItem_Light_b29dc7a7_0.png +nodes_position.png=ScreenshotSatelliteCountInfo_Light_b29dc7a7_0.png +nodes_signal_info.png=ScreenshotSignalInfoSimple_Light_b29dc7a7_0.png +nodes_battery_info.png=ScreenshotMaterialBatteryInfo_Light_b29dc7a7_0.png +nodes_hops_info.png=ScreenshotHopsInfo_Light_b29dc7a7_0.png +nodes_last_heard.png=ScreenshotLastHeardInfo_Light_b29dc7a7_0.png +nodes_distance_info.png=ScreenshotDistanceInfo_Light_b29dc7a7_0.png + +# Node metrics +node-metrics_telemetric_actions.png=ScreenshotElevationInfo_Light_b29dc7a7_0.png + +# Settings +settings-radio-user_lora_config.png=ScreenshotDropDownPreference_Light_b29dc7a7_0.png +settings_dropdown.png=ScreenshotDropDownPreference_Light_b29dc7a7_0.png +settings_slider.png=ScreenshotSliderPreference_Light_b29dc7a7_0.png +settings_switch.png=ScreenshotSwitchPreference_Light_b29dc7a7_0.png +settings_notifications.png=ScreenshotNotificationSection_Light_b29dc7a7_0.png + +# Map +map_controls_overlay.png=ScreenshotMapControlsOverlay_Light_b29dc7a7_0.png + +# Module config UI elements +settings_titled_card.png=ScreenshotTitledCard_Light_b29dc7a7_0.png +settings_password_field.png=ScreenshotEditPasswordPreference_Light_b29dc7a7_0.png +settings_text_field.png=ScreenshotEditTextPreference_Light_b29dc7a7_0.png +settings_ipv4_field.png=ScreenshotEditIPv4Preference_Light_b29dc7a7_0.png +settings_appearance.png=ScreenshotAppearanceSection_Light_b29dc7a7_0.png + +# Messaging (conversation) +messages_message_items.png=ScreenshotMessageItem_Light_b29dc7a7_0.png +messages_reactions.png=ScreenshotReactionRow_Light_b29dc7a7_0.png + +# Node detail (minimal / managed) +nodes_detail_minimal.png=ScreenshotNodeDetailContentMinimal_Light_b29dc7a7_0.png +nodes_device_metrics_card.png=ScreenshotDeviceMetricsCard_Light_b29dc7a7_0.png +nodes_environment_metrics.png=ScreenshotEnvironmentMetricsContent_Light_b29dc7a7_0.png + diff --git a/screenshot-tests/docs-screenshots-manifest.txt b/screenshot-tests/docs-screenshots-manifest.txt index 1e9df32bf..f97fdf661 100644 --- a/screenshot-tests/docs-screenshots-manifest.txt +++ b/screenshot-tests/docs-screenshots-manifest.txt @@ -25,3 +25,16 @@ # Feature: WiFi Provision **/WifiProvisionScreenshotTestsKt/Screenshot*_Light_*.png + +# Feature: Docs +**/DocsScreenshotTestsKt/Screenshot*_Light_*.png + +# Feature: Map +**/MapScreenshotTestsKt/Screenshot*_Light_*.png + +# Feature: Messaging +**/MessagingScreenshotTestsKt/Screenshot*_Light_*.png + +# Feature: Nodes +**/NodeScreenshotTestsKt/Screenshot*_Light_*.png + diff --git a/screenshot-tests/src/screenshotTest/kotlin/org/meshtastic/screenshots/feature/DocsScreenshotTests.kt b/screenshot-tests/src/screenshotTest/kotlin/org/meshtastic/screenshots/feature/DocsScreenshotTests.kt new file mode 100644 index 000000000..8b44743a9 --- /dev/null +++ b/screenshot-tests/src/screenshotTest/kotlin/org/meshtastic/screenshots/feature/DocsScreenshotTests.kt @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.meshtastic.screenshots.feature + +import androidx.compose.runtime.Composable +import androidx.compose.ui.tooling.preview.PreviewLightDark +import com.android.tools.screenshot.PreviewTest +import org.meshtastic.feature.docs.ui.ChirpyAssistantContentPreview +import org.meshtastic.feature.docs.ui.ChirpyAssistantLoadingPreview +import org.meshtastic.feature.docs.ui.DocsBrowserScreenEmptyPreview +import org.meshtastic.feature.docs.ui.DocsBrowserScreenPreview +import org.meshtastic.feature.docs.ui.DocsPageContentPreview +import org.meshtastic.feature.docs.ui.DocsPageNotFoundPreview +import org.meshtastic.feature.docs.ui.DocsSearchBarEmptyPreview +import org.meshtastic.feature.docs.ui.DocsSearchBarWithQueryPreview + +@PreviewTest +@PreviewLightDark +@Composable +fun ScreenshotDocsBrowser() { + DocsBrowserScreenPreview() +} + +@PreviewTest +@PreviewLightDark +@Composable +fun ScreenshotDocsBrowserEmpty() { + DocsBrowserScreenEmptyPreview() +} + +@PreviewTest +@PreviewLightDark +@Composable +fun ScreenshotDocsPageContent() { + DocsPageContentPreview() +} + +@PreviewTest +@PreviewLightDark +@Composable +fun ScreenshotDocsPageNotFound() { + DocsPageNotFoundPreview() +} + +@PreviewTest +@PreviewLightDark +@Composable +fun ScreenshotChirpyAssistant() { + ChirpyAssistantContentPreview() +} + +@PreviewTest +@PreviewLightDark +@Composable +fun ScreenshotChirpyAssistantLoading() { + ChirpyAssistantLoadingPreview() +} + +@PreviewTest +@PreviewLightDark +@Composable +fun ScreenshotDocsSearchBarEmpty() { + DocsSearchBarEmptyPreview() +} + +@PreviewTest +@PreviewLightDark +@Composable +fun ScreenshotDocsSearchBarWithQuery() { + DocsSearchBarWithQueryPreview() +} diff --git a/screenshot-tests/src/screenshotTest/kotlin/org/meshtastic/screenshots/feature/MapScreenshotTests.kt b/screenshot-tests/src/screenshotTest/kotlin/org/meshtastic/screenshots/feature/MapScreenshotTests.kt new file mode 100644 index 000000000..aa084f4b5 --- /dev/null +++ b/screenshot-tests/src/screenshotTest/kotlin/org/meshtastic/screenshots/feature/MapScreenshotTests.kt @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.meshtastic.screenshots.feature + +import androidx.compose.runtime.Composable +import androidx.compose.ui.tooling.preview.PreviewLightDark +import com.android.tools.screenshot.PreviewTest +import org.meshtastic.feature.map.component.MapControlsOverlayPreview + +@PreviewTest +@PreviewLightDark +@Composable +fun ScreenshotMapControlsOverlay() { + MapControlsOverlayPreview() +} diff --git a/screenshot-tests/src/screenshotTest/kotlin/org/meshtastic/screenshots/feature/NodeScreenshotTests.kt b/screenshot-tests/src/screenshotTest/kotlin/org/meshtastic/screenshots/feature/NodeScreenshotTests.kt index 0074f9192..e2c763f89 100644 --- a/screenshot-tests/src/screenshotTest/kotlin/org/meshtastic/screenshots/feature/NodeScreenshotTests.kt +++ b/screenshot-tests/src/screenshotTest/kotlin/org/meshtastic/screenshots/feature/NodeScreenshotTests.kt @@ -27,6 +27,7 @@ import org.meshtastic.feature.node.component.TelemetricActionsSectionEmptyPrevie import org.meshtastic.feature.node.component.TelemetricActionsSectionPreview import org.meshtastic.feature.node.detail.NodeDetailContentLoadingPreview import org.meshtastic.feature.node.detail.NodeDetailContentLocalPreview +import org.meshtastic.feature.node.detail.NodeDetailContentMinimalPreview import org.meshtastic.feature.node.detail.NodeDetailContentRemotePreview import org.meshtastic.feature.node.metrics.DeviceMetricsCardPreview import org.meshtastic.feature.node.metrics.LegendPreview @@ -115,3 +116,10 @@ fun ScreenshotDeviceMetricsCard() { fun ScreenshotEnvironmentMetricsContent() { PreviewEnvironmentMetricsContent() } + +@PreviewTest +@PreviewLightDark +@Composable +fun ScreenshotNodeDetailContentMinimal() { + NodeDetailContentMinimalPreview() +} diff --git a/screenshot-tests/src/screenshotTest/kotlin/org/meshtastic/screenshots/feature/SettingsScreenshotTests.kt b/screenshot-tests/src/screenshotTest/kotlin/org/meshtastic/screenshots/feature/SettingsScreenshotTests.kt index b1e30c3e9..def6bc7c7 100644 --- a/screenshot-tests/src/screenshotTest/kotlin/org/meshtastic/screenshots/feature/SettingsScreenshotTests.kt +++ b/screenshot-tests/src/screenshotTest/kotlin/org/meshtastic/screenshots/feature/SettingsScreenshotTests.kt @@ -21,6 +21,7 @@ import androidx.compose.ui.tooling.preview.PreviewLightDark import com.android.tools.screenshot.PreviewTest import org.meshtastic.feature.settings.component.AppInfoSectionPreview import org.meshtastic.feature.settings.component.AppearanceSectionPreview +import org.meshtastic.feature.settings.component.NotificationSectionPreview import org.meshtastic.feature.settings.component.PersistenceSectionPreview import org.meshtastic.feature.settings.radio.component.TakConfigCardPreview import org.meshtastic.feature.settings.radio.component.TakServerSectionDisabledPreview @@ -50,6 +51,13 @@ fun ScreenshotAppInfoSection() { AppInfoSectionPreview() } +@PreviewTest +@PreviewLightDark +@Composable +fun ScreenshotNotificationSection() { + NotificationSectionPreview() +} + @PreviewTest @PreviewLightDark @Composable diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/DocsScreenshotTestsKt/ScreenshotChirpyAssistantLoading_Dark_d19fbf1f_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/DocsScreenshotTestsKt/ScreenshotChirpyAssistantLoading_Dark_d19fbf1f_0.png new file mode 100644 index 0000000000000000000000000000000000000000..bc10660c0b2e1446b15657b26c15c23e01f8a1e5 GIT binary patch literal 117831 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�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 literal 0 HcmV?d00001 diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/DocsScreenshotTestsKt/ScreenshotChirpyAssistant_Light_b29dc7a7_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/DocsScreenshotTestsKt/ScreenshotChirpyAssistant_Light_b29dc7a7_0.png new file mode 100644 index 0000000000000000000000000000000000000000..2f2f78fa44993877e00dbda7b58caa83ffc1a7b6 GIT binary patch literal 110507 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 O{0=Z@yRs91-uw@K)EjUB literal 0 HcmV?d00001 diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/DocsScreenshotTestsKt/ScreenshotDocsBrowserEmpty_Dark_d19fbf1f_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/DocsScreenshotTestsKt/ScreenshotDocsBrowserEmpty_Dark_d19fbf1f_0.png new file mode 100644 index 0000000000000000000000000000000000000000..a073c81f958512f022eddc797043268324b7ffeb GIT binary patch literal 33462 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�>X5~qqysWj6Q$KNHNkwk#>b)~mpF9Bwwx8{daH|J zHib1mZg31-eBILD*jmB=^>x|*vTWda-2vy155^XhL|b0-Lv6%%z+JG{{u8@1-kSkb zV2H%04iDQCD+HX%N7-<{S=@=+YZL-RYpSb8ZoC@B^P$xn#)m3FRzf+ZE^rLik<0wZ zH!a?|7~>KrD4^MxJ{cU4ueg9DZh6iw%+?SjbgY+zo&yX)6E^WZI=zM+8Tf zOuxn>NFga~W%$^m9S;G@w*@=p`3<)igRl8o*(Mu+r4=)I2v+fhzG`kJSqtuxyrfDf zXfK-1h=tX420wZ^}yl@j=yGR_7-AZjur<()$PJrt?A@ zNzOq9k`x_Q;y&JLJ1ZX_Eyr)1SQ)rY;uB202FnVf-{2wbSxVIks?iNS+RQC8XaC3V zeMTD=K4*9P$ym*}a{v1hr#9TOFksDwR<2OJ?xcO4-KjCFB30-`u_CO16_xnV>QT3&QR=D|kJJ0~E9fHyovMI>? z%%mw!D)#Kk=4*a66CKp&3P1!}J3+Bpp-^1sXlVMhrr(5Z@xOflSmUk=e)R#>O*U}h zfAu}!n|@rIvPwMh_Qd-seJ%mnfAxe5!0Z9|CRV*Ay)t#GcPTtuNuO4qcQ5KM`>x8` z=%^6%)}aV>d+13^UBPt(;HU2VMEMcl9__)7RMTcM1w-&c8yM(VA7}U_ITn>fl+Bj4 z5;9~}R)9vyg$+M)rB530@xdP2_B9d2PR zt;48g#us)Qb{6QcSb=@@sv_k=3>}-^iRrcYm17Oy#wR~C?v49c=Hg~$td;H|C51o7MK%uqJU;8=`CcUW-iMLsJEsZ5%*j!$#6kY@YJD**I= zMHwluS-YK(n7T}Wtc`LX=6IaoLgs4(tw)qDR-^`B)LMM1U5_l4@iy>Z{%k3yZQDEv ztC<_mSQuDpiG<;le_sVnOni)FKH#jbV%skWzLs}yyg%Y3WIknOD}S|emV)MP)W!4H z!!mEG;6~BiD_CYgCGF$qe`W*xGV1quT#hqzI}O8h5Y7fLtkC=$Lh}Q0lJP+rR$9$u z8}Gro0p!9tEa(rxi$pt`q{xVn2fzaW7La&sbf3}4oryE^q4Rry9}x@lE@iQT^-C8* z_XlsXKYnD!8?Ig<%s6w!RtdTQuB^yLHuXfA1mzcMFe>_YE&!(pWNMue^d%P^k5bZ0 zV!7)F7@Np^8Ar}vrCN*whgWGtG5H7IT+yf_o=M@BV&KKG-p546HdcXdu?Y|Y?En_P zM_y|k#8`bE#x|9u#mfctyQYrPx)x5zlN$r{+4)3_d2{`kRrIZzLc z_gKHqCyTRLz%YyK{hSOu)D>7juK{MkpsTq%qRu7v@83{zI{5!*L~@A+Hn^E(-`9Uw zxv>_Q7u@>(zws2-Z`3!xTjT%z> zmNQajhv(l1bq2l9M@76_H8W^`)co3WM}ybeTnazW{qtado!yQ59=01c&3hTJUG-|p zrvJAn~W;LKt{0t1m?V4BL`kZE6_p3Z) ze*W+4@3)wIdsi(t`)4iV1m6b?30JS4;y5nz{V2Et{RB8fQM>)N^|I)RPoA!*(_Pp3 z9JIyW`fpG1bi4C9fyt9*9jSlN++L<$`?6|oTbrDz7DrHZocuZH2L zr)jPI9v$v-CD-F^u}hfuU8lk?hVd`<{o49@`oCD2FAtT|e)V))`PJ)n+u6tE-T!a% zYVS2*OjJEOxxBpnPrtv;U+awHj2rd=3uB_!q5Y{ZdozOts6HX!|FzSGA2zfwyx|0` zSxfK-FJP-~0DJEk?Bf17S48fPug;nqYu| zFq&V0fiPNJfbzp=X$cI3(aHiC2o0lkB`_35n+m`{7;P#517WnOFxs>pZ7Gd*tVSD( z4?v~iXhRVg2%`-}U?7Y(6i3IDM%&4wgODS-o8TiGR>Q!+ROspA7y>L4M|(`bK%je% s=}MpMWRSf)ukKe_vdK*o82-%^)HMt+PBU~a3UV6`77}pt zp+8?4{XV@cm!tH{CAzRTBzj~e=KOp(&z%#WYH!pj=*gbhQd9e5Z^V+_$`==VX z+pbw2R_S*hjLG<#f#DbiO?B965|pxJeq~`OS(ToItWaFnG0`|!cMj%5zLeCcwPVksltUN|3AZRtL6*Uvmy@mXGXi13!|Ri8QyeR+w5UfQTbd@$E%aU| zwe54Z&5RsG7a1vqo()%!xOQOZPRU#P^50giG5p!^Gd}up$xaVW>Ki@tQu3l19~^o> zs5HkpFzZ;KN%@9?<(V*(>gIh`rO2~Wty7&8##dg-NmFi+&U~YleU%xTjrMb5Vrhe= zk|S;V5Gc0vY3s5^Ui%b0a^XGFlTw(Um55mzWvn_h@!2nV&_W@gHGrg0%}8&!5@Ndk zebmLK9c7<*c~eS;oYa}K_bVUFUm;nV*S}FqsZnkl>SiiD@#-rAj{aevi+ zP9CT_j~^_nmeyI>DDfBBSq&q--YVJ-=bpSB3|^3 zdJ|oEV7LE?nW)inqb#qL$7drrLC3Aqq1a&duiNBrPCoX20@DfvzH}0yNOs1tSj9nv zPrCX_rxg>x90yL2tWzYDS;9OlPvYCGkm4&14Ht(Kto=m8;7Y8->96ZR(y)Qan0|FW zmeKIrgPav6mWP{*6i9#OqdjM^1x91_YzF65!1awT@S=Q{cuPca`@i%1|- zjF^ul2B~H^Dfl9&DL6T zVlL2L951yH2ty*jAm8_YT7d*(l;XvZoMRh34-Kgq(XYlihR`*A ztjDFmeX9B}?R^sK8!iU?JbIDJeKDe68s@a&a* zbNuJH+5^7g$CMboYGjQf^^X7#!h;P@>%)4vH+4p9P^i$U58j^=5PwZ;Vj(6p$s7&m zM-P{O8%o@{wGPCh1`z}m;BC~#s_a+tEwV=EZH$^MkbaQmh8Z|2Y)a3z?yNl`yl$p1 zMJEd@pBz9ZBs;@Q$(}W{X&-Fu?>tyIBAc?hKKIX3AbPX34|J=a!+IBQhc)=o1Vj7G z0BR_yx_a=vT@|mk)SPK zo_M0;9I5J~pBSSQ_Sdv3;z|z;5`c7~GJ^2}5+PC;JC&XunQs@2LElmm;LWX-_)EV_ zPwL@B0(xaI>9&_&xDBReOu31SV-zr0wRe$ZZI};$n!@g+*Pp7z<$t_pq1sI52 zr@I$xKS_*!7`!=p34Th{ZuF1=ta5^%h=u&Tck)f~+9e$9|aUU@m2 zZrG%o{qkx;YGbAO%K80~^&cQ9~5st4z;~?CmBvq&Z?L2-qRtwlu|%mHB)R zX1iAgcL9xHPnR&ZUk;?gR02BWe9Ds9B-7npIS-T|xKG1m?{2x+%7rt}T@5zBtU{@j zf4@jIlKqKj{QYgZ0#Wa!xxyy3g9CtH?vDF0%(T(Rar;m6QCbjp?!n zwPu>@MiIixbyW!)@6gbAcKiq!Lj36r#@#&LYf2!J3E_pi@cD4<=SMw(5ORavh+Dov zHc#BRGQzuDp2g9j>oV{Ur9fGj1cr=Pom0oyf+v=BL_&q}NLqJfSKHz~d)l#L#N`@| zL!&1)=F8u1n(v~C9L2H07ToZ{Trd3OsVjT@BLdpEo69fC7@Q3+-8XMcF2E_#&&@v& zyqtozK_ZSNV-wo+Jo)4I0ih@jt|X9^#=IEwgG4NSWyaIU1HL#~kYm=to52^Wsy~- zu^v<@SV?7uZ;JX_ePAszwK-nLiEjzp`gp%s9n>U|vM|M#cA_B{81NgSVsYHc|D<==O_?MD#&Jz3Z_#YOd+R0#q#fXgeHC*@L%_n63l-%KRh?C*sRg zj7pWW8l|dV&=*0Pp~8M^zTElV!+Gddt|2qB)_99acazbpq6TXXLH?;eudwLFBKy^IkVP&L@0o)|fHm z)z3ZpZfBX17JU$Zc9)l^&|(9qP+DijW6woej(=U~WF|>HGW4=f3bZ!*a+pb2V}NZK zk=eg|aVy%d`uXw?C8yb4w&~kZNqO+D=l}*`JTt_Y91@Y%_x*>c7Gp|vRd~A#2`NUAq(Zp4b9Ktpvz3hQqK!3Ga>21 zUDK~}$K}VVdxk%@Aiwf9S=_8d4Eg9l!z_IhL)CJsoupkQSFA?r`f2q(=`G6ot$oQ!^v&!lC4;kD=4 zyW^kIpbh#yV7jg(GG1rdisBQ0SM1_#lQCGjM26LVKhsfSzziqcjiMPio)y#eMfo)Z6;^8@ z1rkJ1dvE=Sm?EP58c6|VdZgn>GnUqc^}8pOz!MYA&T8r-YGvPd zpK&}$I+Ny>cOmptRwVsJk1SKu(qdpQ;ql_q_PXR;h-J>^4cGy1T1kQ|g!sLnc)QO| zlIe$u;B_qpgZOuA@DAWem0>5zI~6CMMU5_vnsp+)Fq?GRiwh6LnNJdjD_e9cT<)8x zuQA$cX_~+vk6dv54N7`XL>dweW2A0AVTZq)Fh?M0d8F{jCzsm7M?cPk@$u*5csL$$2O?k^2p zIey$-G~+zM%7hX4D>d49t1j8rvnA`o!^sibM9wa&rRE~|o%M15=5-=0_{zLt^M7A$2R|xjHlZ3T;=VGk z=i?b95{7c3w5$&1#lb-)aWZ_~f@Z`a4b+)EPb%H>qLeqksU0pKM{$cwm?l$_u~1Yq z38Qpo=vio|7cI3_)y)g+k`8G^VHEOH2q=U!v8`xD5Un%Xb03@lc-3H3v^MkfE~5U_ z=I`h8<=U`yUe5EAfz__RIJDWX$W4!Z{p2YcOw}$Fc8lqHfx`xnrh(s7uYpwa0s8~^ z-jpiTDk`LCTN7}3*=NYbS7}|jvmp`cTNbqU^a|FkZgDPPMuc&{3xD|v@%dE?pP^z=;bjOxTEF}18HwD)i zN-nc@c5*K*!PUA#xzVPX#riRrtouo!Wzd5 zCYzfiT%~;gpnlv1;?<-H$F+z!Ox882s-m*8#uJ^J2fn9ZjhXN0d6^{s)d&%y~^ z8;t?_GS{mP`zcJQwdcd*b9h(%A62Md$<7CTlI3onKE2tLl0&qSGfrb&CD#2D7LZadeF zzMajVg&+3O_g*+M^z5BJ)AL7m5%gK)j8zhLOVIL)Pi=@)D3T7lZWx&BWke0u zDbpH7+-|?7?nN!a*n;XAxI%+NUGF<_GE!(Kr%u#UCfAyF1jP}BNWHP#5_&-|+#8f#5PPsW_~G>wui?g8aGa6B zHE-?Nac<{S?@TT1zN?i!m2sMDMNYsv?)Y9^7krjHU% zaLq~mo{mZIhJ|k5-A`OzMvXp{QY26lT0+OktZRQAU4wTDXC|}v`2^)Mue^uGM}7Rf zA>9me^Z}uQH|aiqbP!0C(%Jp6E1dty`r@49E@XPIN}T^;2nDV7 zr3Z0wx0e^KcKsDM>6j|I?nd3f;HQC>O&ZAroUz(9qdi-5UGJKlQ$?N|St4hn8%$b! zdcLz|N&E?&p_C`%<|$9afbK8!TBQGshN>s-BlRtRLbdq#DVz%J*WCdTe{4GPTVvO< z_rQ7=+JQAjaT~AF5-t*Xn-X{Wx0*?LMQVII1kou`>me>YIf-j<#A3!?AE9_Mo4sSn zg_%U9DalT?kser!EEjOxCB4koLG(I8Vio<`adaw1{?a*lV&n9c9}eNBjfmEQ#^_XF z{(^NNKxxvSWLHgkmNM?VW12^VS7!;lfL5XI z`-z0LrQN93b+=?ZmIJ0-HQ__&>O|M&GhGjxP@&tM?Y!6}tRvUU2vm~kmKVXYJ+RRO z|2L&MxYwpMT)4IPf0*d`b)exd%I04X0hr5QcF+<(;7`|!p$}lR!EODzy@H2IDu4;G zwR?nET4SS{+$}mR=^#x18V%cagOv&6S-?!LqKUM~C4%qgRssUrRzh%z=Od7r?mdkn zjzGz4&kZk{Ec`82f%G;ycuQvcz4$8n>W1tsE!XwY*(Ql}00Uv#P^9u+P2u+G?S#To z?4aRv{>dv^AjDF6saIin`;EAWXIjm(HG;vTra4|=pA-SNBG@2yE1MGi#ZG0fNz;zn zr=a=g4_~@1{wwEJA1}VmxC>7yD`&35Qr&%g8=xV*rWVgJe*xS7%$(B`wD^~_N?uv7 zg8ZSa_o|C&duwUrM`9^ER1Zy$+50A9wv=BDpu(Q2m!x6jTb+d@hC3V|Cht{OiymG$ zUXp>4ms(>~hKh1Kg^EnPk%T-Z`%D4ZV|c+gB#dPsokDOt`OCYa zKfwymi}SPZk2dRGsDA0z_J+JYFs`p=OEVUTW3`hK<-gpiPzONfeWBwKNtYrZUUla$ zUwy?t^jP)RD;lG<`faa&(8S97dn?ALwj#4IT zJp()SxV=45=-lDk3rPDaf3xXvvP`zuG*MMC@{|wFl#Wy|bq#M{T(Xd*2v(-P`&pq@ zddDje`_u;ue9CWCyS2PN(n7}tPe=Jyb?>#U!`7}}6B*P}YFlR!yZwlP-!sqi0B^8G zLyWE&hj)L-*|-6*n1i~D7me&=E0@*o9}9~E&J ziR+*WAy02V0V$s@dvsdsYSWHJZbN2;o9pa-Dij0+$0ep|$X)o;^M>nLc~BZIPme^u zH2;!gsS0~`H9_GiK!eT0&G}oco#AdkwgKnpoz~Aw#+cSV*8=w#%IN)^C~>r>U-&2m z^0xu73SKch&}VvRath0bZ0^b)x=!o5dvF8Dr7UYzvk%Gk0mKuK2ZwV0(UIl@t2*-E z6ndL(b5{6lvfzTxuE2i?wjTgaA!gf1y@$HgTckgUa$~?{zVTj|{{rmKPE6@8WIPzz zZ(HXy)5uS#Y|OI<$lI7KslmG-?!u>WhYa?<5&jRz;*|n<(oUD2cWZ9P6&drl=%_bn z`p{s5pOz^~_L6w&aW9%vMCcn#h0yiMb?T`yQ+nDFdLvmS*)c4bOt`R7oK*j-H|k|I zYWjw-YsR$BpPxLPfF!ZOA;F?P;q=ueapW|v0kXjpTMUObUO>+82Y5!$9{@7Wmw_*h z_6N{>7X&2`wCnKq)Gqle`~4jre0CS($ZUugcvwuQQnwXD0~n;erHPp7%PZ&YxnI3# zaIWEN1&F^r<4vieJE>eQT@Z!H#QZU zX-scUF7Nc9mO;9wrahQao4Q;#Mo|CTN)i*mD208lkmps9L_go!+pvi0?hV1NvC}L> z2)+dM0|=*pIsAjWQdh(2p`j(ERiZey^yCGkO~1ZDbZR`n%Kmk)X~#D3O5aS)cKx7S zi04jLv4O&9&8XQVFQ#8@EpkbDW;iCRgQ~MUY9CpqaC?WV#g8h%$F#jqe5nU>)74H* zV=bkXM6I}6I>IsROp3++UxI=AjHe3({%s(YrRUGNe0?n(Yeof+J+)OD9*ISFQ1e{v zhZk#P)Va?a^I}^KmVvrP7JHYaRSyrIgXZMI#}w^0`#Pihc070@oei z+wX(sSzHgFDfc78Zei)L@tKI>MPgScRr`6HxoEl4`5Q0gRHKxs{pM{xeSAIGy%*r0 zV1SebW~NDBTe!3q41-?fZz^xUMs4iclkA+RAg|qbhgbs1>`dA9nOi_K#v( znJx_f97U*t(~cyc0P?2!pmeP1<*V~8N@MH2X%_$&I3iYMuLwsm=YAL8o>UH~fH?Rg zWf%i1`kDx}ooiaHDaA6Ww2{z6#bi0L9&7*w0X*5idT_NvHn3yPXiH}F$&KM!K-h%V zX^C3$PLeM?Gk-M&^L*Ac{QG-Zp@N;ftM`>K6B@v(VkfE#n-V^C1k;+a4RZs<{Tewt zQDgXxv5Ofl^kCc|RRvR)0w2YIF?(l=?K>)rO?+hUD?ZRM9h@RjgBN z@Wt%DSPSXNa-sr!@p->q_ztkSmoo&s{FPwW(noZ=;Jc@G8rn&y$1B0L_4ABZ;&SmZ zDbQV%ce7b>3;2yM@_rm^ez%x1c}Ui)Hs7_pqlS@>UcVCz){yqV3AUAHT4~Y&AvFUu zh{^{w`u)n%N;kLZ$p?e2L8{bCQ9l+JcKHZ;OZV?`RY+4t>Xz*}i^s%rL4>A0mkFS- zkuPS`zax#?gCkGioC-Hn z6E4IxT_vQyaMj5pv<4$5T_&d+UVwST1({-?%4M~icKz+5POko*ryf++{Q!e}mdQ;W zg}b#*vBi@kyF^u}$wP6^O8s;Of7-`?zGS}=kt?8h+2M1UXa<){ik3%I?y<>52Uot7 zM4nCufcMdBgmZ$GnZC1h@)mI%_T2h?!yaenu*S0ho!zod?B~IWfdG`!6IaWqg`rL} zm4x~XOum!ld0l|CTl%Grp5PgUqqi9>PEgd%ka;y)T5NV<(Hqz~U!vBsv<=?wSe9PeMaup!+BuAsCp`4T4 zr@epsqii2^!+D?au)pmf8hs%0V6Q;Q3Afhk;#qNp4Q7T9kXpupU9 zAcJSYYq#moq>wN8PWp62TC8i!uh-bRoV`UIEv^d{UOqgU(0^X|QtlQ&YS_>81x$B- zw+qT4=rZfAUVgm$l?|5`WkTkS!?p$?M>Jv9&mI3dlp8kjc}38jo+8{y`O8s4s}(*k zPAc$mcI#eV_p5CPR?mWyFPENHCPzH~n2##G8@?k4Jc4-ss7_!wnqlGJR=E;_u1{6C zSZN$4jJF@ipRd}wN^snT~^fE&4-47_X<>jk2eB+FcMRnbl)A2 z6t^~n{XZG@du*C@OI%Xz5H|>5)=Nm(TwMnOp8NOwpO^oCir|Heu43e3|5Q;iw8YGS zSwGeE7~#a66DUanYN5H*f8OYJekKAD%)YI2+x#5I!OAZ=uPhKB9JNs755jSNJvU_jItK zhb_=aMDxZJj1({`(BdK^aG`>H=1o->lBy2@Prlf!JNSTUPDmF@=d!v+gn; z;{Khe!OIW@EzaUAkY9rZ`Tm=1N#tbVO@}3M7mg2LI>3b5#+{2{bO;LBztbz-*vh17 zp2`yb&~O;*(q|EkTJ=R#sAg9W=P450bnfym+;p z2yn9!9@n31)kL|yZQy-NCw;)x7Eyz%8;ajpJLcOB$Hsb}v~z3lX2G|Wl+{k@kkZkj zqtoL3Z2utMPmSwNVe^=&p~neDRx7{lY*RE6NmkAdf{}fmx6n8ajI0g}jk8<*fxV!R zfkF~MRc5Z=C$NKevWpi8xHHpAz=$h_s}H;4*D!B}Spc-=eA`D3Lo_#)SuN7n7mtX$ zu=)%Wr_jlG?^r)b`qN!G6{BWg@AYbvp@1sivH3t60$_xSedIXbR!xHr^hJ^FtVgS_ zvkDZ$7gMcl=K0o)B1Oc+*Qw}fzcQpDFV}nFWMi^|4qXw*{4@6fKN5Z0PFist$n7I{ zP|CyQ5^aRtXmPS(k~5Q{vQPB;n|C}$`wP!2_T^y%pj9)<%-T8F4MUUR6aw+OZ>m4v zxywl@MwjqDM$r=Jbu%PsSu>Iv48LA0`b=8~Qr=6e%{zFB#?fDS7v>g~c_S-wmek%2 za$f40A_=$#X$pW*H-(>ST>6GQ>&@087thvlUzO0+E{kFZ4FGKE1e+w;)*0WvCT*A* z<{`aG@iQWXL37u(u{r&e2D?D7S?mEt;Dm(nqvZqKW5(!<=KE zTh6(3)`@e2jF8;{Evda104w{*c&QXY$lK{XmlWmpgv|RE-7j4~I}%^4<1Dfy!)_1^ z0LX{@*clS?jS9Hf8@FW!L^f6zF{N1Eh?UwaMa^gKAqF<34l@CS%Ikv(oCO=)6sdor7cg{pN4)f+a%g^#>Vk;KlZa`)U+tPV?pOce-fm=#HD((Yg z$LNTZeRLdm|0X7cG8hpBVRH{v^PF(MszZY78&_)uz0Y5|EdR1jIXkN^nqn0Jai}z> zQ_P(s8>PyDhRps?_->Xi8qnentgP*hgO}{ApUS?{u>2A*eKJHxQAwnT&c`R+?eUpA zD~a6k;MWIArTp2rpr->qXxp?*KepnQu4QPfAG|teJ6K#F(}q|?psR%{3d{sUUMo^N zk~bQ88zmTcp#V_~T`DX=_d2o+x92NW0=cONq41Ir=n-Q!3 zVoFIkr)rzt7e5B1h6A_KQ_cneExUJ_%>pi%-0iGR)U_Q@4LU zIAUh>d$nX{l_M^U8FI4>ka}E?iH}#6QDAGDoayituun+RoquI*%Resfp|hmN+S~6{ zXQB7=WlrS+URHz~vGnYVdG`>*AKhb7Yqw25Fu?Lm`KeIM<>~uXEbaA^ z-9}ln_v+}Jy1Nh_yHA;LONlp!*XJp;omB_=X({40w+{owa<8p=u6Ns?t7fGN!hz1M zQktC!m|1x@(djV-5WyD?jrErPvu>s~gbclU-CYnibY zeq2oGqOyHnBF29Mz@#)_lF(r*7?k%`t-qJ(xT=@oJ>aZlf2?MXPi< z;MW_9J7iz2rkOrErwQsuubWq4r17eumX>+p!=J46c~ja3ZoG+C;-cpin=;r%T~yBN zGXZlq$otyWSzX0#m<%~3R{J zm&MTpu&}qpv{v&whBANs$*!{36toLJlQ}Jp5huyFOs2~wyZET?;f33qv>se* z(zu|S;U5Mg#`yU)Tx9cDq7)3v+Bdj%a6`JgAO_&ZRD1}cvy-`+`Y)K+`@`L-t=kT0 zkh0+s^u;)4NMG<2d*hD5upF+0du=US1CUcqi6ibxH_La`vLRRelPp$a#qRY3BW&%j z(3Ous`zu-uLS|B&3^)^-0DlB|#g^ZuJNK-_Ak)?HxtM@3vJj0bDWzbh+syO@1v#im zqUNDP1J**7Nv#u1{!OOVuA+cY*pQWH`J_D_?+cEXKT0y5CHqV((lJ}!UwGSbLooMYgMR(gGNWS zmhMX;HEQOXzgMOsY60%9vUa*FHBtgvKacfJXU!%lfa!M5{U3qMUbWI~*;(W4DxGQJ zUo8-~H8MSS=A0J}yP;C2+&;XaWQ0Kg1ee0&n!|Yumb4y@GPYX510JW6GaE7>wqFk- zur|8ZfbL{&WksYMN-*cijbEpHN~{f*nnwF6P2pyS%O%KcVas=T_9%`86hUWFQfKN| z=M~_s8(*o7fQ8Q^Q+d^Zt2?0&Rnh1?D(xmdK>+M|JBd{zc55AZ_I{u0?7V(qD(#N9 z;_%Zfj6J#URP(C`2F$u!|AIbNy?{X)mZp6|woLhyIUB6Jd<81JFZD)TGf6M&VVNB} z*wa7x6mCMeDuTRRrz5>}gQJqNRvCiGJy*1<${#5HZa+95j+JhZ0pwoy^YxK_Q*d10 zEB8_i?yVr)27s$Y;1nr)D>xU>s?fi`Q~s+~f$Q|eBGSQlH5aNJ z0-S9bj2fCS)6T*tTiI1&q#;{H3Bt6zkFBn`G6P&2j@F4wlf6kmPkYc523)_a)L(W? z0No$H*sTf!iOLhy!E8~^7js(3u4%Uu+-`H&qD}`-c62tR)?(F$PU0NHjNGp7s4M8G z^1m0?dyfinH;ntanv`{9GaBt}5I)7sigaAM7KQqbw``$mWe#3;HFB0Qn7f4WXt|2K z>{Fui1A217_^j3uGX25i(=JGu8#8|LX(-O}w(GSYi=+9|p5Pg={fawD#Cz%Iee0hU z_k0Ms1%RZ|lDC_Wqt6D_bdw>JHyicd4&FC{nH*h}LC{cYzEerp*@fmQ1`Zd_j_<^l zk!?eA$TEM=ys!Tpon8$ydw#<$53@xvZ0@<0#B1S!r=-0nojwBIFVHwYFC)CG&9?62 zcovv>kHWh3=FHz4R~ro+b-;qjg9>=R#x`x`RI)}HVmfX_94vf+PJh$k_T+HcPp`t% ze-~AF30kP!x=JW2J8&vh46W69q2&bBH+S(ON})e z;9$$!T>wj6@)6AGORR*MW<{(l&n%sH@E3ll?D0!d85*eCJyNbNJbKiw87CKrVC`VPr?cMl*7*ODSa-Q*wFVPU18LZvm#PV=B-&(_C zdZdVrWc0qcq!fHp9NX#VDLaWG0Jt}YiNkhu&_AOj3`P!}f+Kq(XjeEg5 z{6gzwW6el*VY4vFva5@FVx8Ei6MYj5IN!ZaZdC|cI@KGI9^P+!5 zvP)Udb>EvssiPgqf)v%Skm>=t#>hdeyD9Czo`KKge3{DWOBoiorc#j?;x;}P5`$*z zzh~LfjBmS2pBhSu5hqbVv%7OAB87U;$SVk^(hnSL(7)Y_Ka;%3e%cJg%{#9hBj(>I z1Y5*?tl?%ERlss~3-XoqPBknRmC$pKiOGr%OV(2mTUpPpcxkg=PEkm*6ZN;*Q{ z$GjmQ6;WOb9FMWDd$D>N;P-d*kMgnB3%0k2Vi@prm1!xLXl>RrJ!nLI8#Z|;jR*%& zUQzX+jcm?d2LL16$gb|ymP@|3lcGTk8Z5a)fejVA{C6@8{-7CY8r_hIL81Tq*e@+I z2DT7f3zT%MxQuA$Fy8O!;pvjOJOqTh0&yEFS#Fob5A@vA+r^b#^&i8=nW8Rgm#28Y zPiz&dotSKRcTv0`;4O)X8{!=T{*XAEWb=57nEH*{_Gj4tX@LMNpp7Z+yO#L5hTiqj6g*DXOAw`j5`~?Gs{>_@LoqibNGoxfqqScA+F{S{Q+(9+100`5M zzWo;!THG(32n(F<46zo6F|s1?oi7IL)-9xyI_kv$99${sYUIzxRB{r_YNC_}LRdK@ z8E&6CU%ViIK(*8No~_!Ze*V=OqXz=6pLKpl7?jf~{)`tgyJLT`pf^L<0`x zSOBzB18F^wS}O$hm6MSAtWZE2ea@#M#C#-Z?4_J{FV|+>JFrP|vt;0o8_+}c>pLv|KDFlXv#4i>4tzX+>d>PB zi@?_=T_Hst*5=#}JIw~}iRBVDZ}|3y@T^$_VkPZ&sCfujLSlZMIJ6zeS}pjs?pg(R z4f>q*T)}Yg`GA3s)L=hv@W8NF{wpcF@A2i_7ZEG@~(IrBcX?GJ;F0-e)qy zruOO6KI#Hrp&s^^C<#RI2li)vC3A5h;hqC08kgD@@SLE}$?CIlE)cu#4|6U!^FjJU zQI9u_XTU!XwaY^lBE}hwIyKCgkYKD^z`AWw7~>%cn_nvHk(7F9@@JyCA!C0X=;33p zF=-HErTvW?;p&6gR1sx=Vs@EFpi}+FjUWl1#HKYLznN|Z{i;M6U^HQRl2XJDd0nc- z&{tJN|Ng|GLREwoM-NLAVjepi@|7|JN=`gndk3;pSHkL(*TWpeXkC{30`R30Qqz25 zxRN3tgj)J(k*QGv5PAP=*vv{EeY{rd@1Z+s7&%>p|8%AsDu?jK!Z++c%fG%J8Tjp} z^MtQveADMMK3e|0Ys1q~qfd4Lt7!QKP{?Ez;E8Yamw#&Fg$Y7D81b_&GO{~XM_zoF zSSC}YfA_=DWoIE}2p=-2Q}g@9^oH@s$>z_%)h+jGHn-73=zuf|flC>1GSJ4!82N!} zVZOXm_*mh%l#WB>_c=lDMfLGd@O(o8pc)1aTBF&qr}oc|?@KVG@7GCiHsGQjv$^Na zELBfKVp=DFXi_$ksbrKx-z*heh@)6otdLYX4Q&RwN{bd4^Rq99g^j%?7 z=;t`RlFx3I3i+YE%YTKToNc-4Zm3b9%~O^S`ZbTwnw)VfO%&Gdh*Pns=Z%#X4d1=Ld6LIMjUY!!iA)u{VYCNj}`k;%xM7PH)W}E5j>h#j6HB<+ikOy(Xw9M@ksUqfm zJ^7}?!!e5Te7<3D?|cgweY$-4xRV}-3Kov$>(g{d^JiHZ=&i!Lb(v>TZaWH9NV7HfTi4?n<~EDPjgqE#zk!tSq1mR+ffdUKAnbXt)J_CPCvjK@>4? z`UZykDd~klu#aQ7^RFZ7^oXUcNt>_zM|Tn>jRZw?ElB+Y!E&l+7Ns9s>NiyLYfMQR zyV3&D-}Tzd`w%xriB9Y%w0oPkdq0Zk&`^a5g*Ow?9F8*3*fwz|!GJsKt7&Swm&Q-| zN%d*e@0)SAzmG-bl{FSR^Jsi8yTx@OcaN;aA3_q(X$KG4{9G=dVBz3qnRETbXjDk- zNoP_hBM}t(QzH{@cGDW$+sEM~_FmIw@W@(jkt)FMNU!crR>7^I0xY8N zie4vt|Cwy>2iE2!2$#&Il$M%4KL#$IbDR5Wj_{rvbL7m-_$_|toC%(Z96zG2M9Wi| zXZ3O6EgKiiMT@DQ^*Q~1y0(4^pB9jl8h5&P4ZQjVh_GSLhAY%vyb#=YR5`^b_%+Ay zTQ;y-r2gzrY1RT-=*=j{dB%Vlp))~AA6#3r3IA+eQM2_ zTWOtx>)@?Gz6n0w=v$Uk+I7YR?ZVM2;C9pCcJ+}usiCJp^sxCw-Sx&}s33f~nmR>t zLsNo|Q2DZ{I{v-CraI@Plp>b=e=`(yZYE+lt<{Q4{fZPy?$^FGQlK*d*=N4mdcs3} zY37lQxI+RTefPA^6?$I zdqXpL)Rd<3o#XgyoXB|mmLvRkA3+tIRMmT1x06*~wq$dxw^x|PcZMDvltTQzI^KUm zY(NLZv4{Emnx=nJ*gfY3cGwL@6>aUeX^4&j&A4wl`U*Y4LCEwh>tJylr`ZU3C(Jz0bF%)9{4zBFpSpH}wP3Yu^$5G#u{HtE2;ZkHKYr0&-B z?x7$i+)O8Eqk!y`R)+BH?OmGX4w2l)TT(NsRNWS4s^7{(p!VPIVDTnB2*ls?u^vTB z>zFf2jZ0GYz6LeyxB6#Cc{cx(jQClWo+vHF2UFK7I4Kn(VWhrxnXr+QV*H<=52&2+ z!yJd-oyYO*q;K1_jPD^+RsDM}ZZH~kTBvnAi&h{1l`iUzW`-a}p_vr^g#P~H!Cou( z>cIWb{H|$Y?=M~_E{M9W(yHSgk{{1lp%0^n_c=ZI+G`)}Q9iM0_RF<($clo|UTa2E z`OQ@oYaGAD-~4tJHszfm)Y+952zY1y;k|I)_3o%L-r^cgCk*?W)Z z$ysx0)%X+R;@H^2VHd;sz%5f|?NbY9k{btPV-$JMyM)&b2&0dc{&B7dlTq*s5n@%!p%D6bknX+G`c4==%dY*{}TkW3Qp|N^{(iNc!Uf8EHrSd%cf#YVc?3B0W3)H-QH} z%;_yX+6lRm_}g}^k?FbgQEGK<)vpA+f|V4MFj24IFi-|3aBB|8O@Iv(bnv3BqGF18MFa=vCtPAhirShzv> zu$US5X6&LuNEkC+AB|4pu|>c=L?AvWxFnAry{d3q4*H+z4A0h zScBCW1Wpw?gJ@W*se1{NJ|YpgzjRZi-tRANXVK6Si$`_ytn~LU9gR==0S3m81?x zPmGaU;K+8;5fSharn9V0$nF#7oBA683CNz~X``r!l}}wM*vpFfjl2!WH)q8$mTQpj zAq@&1)WVZ4CU}18EP(6NOITZ?e8pg?TH|3(mFi|wac(g3JU<~GyfoC3Z@9I*_X!&~ zswPJp19ClP+%#aszPV*`_n^4%&NH88?)nG}WTeG@FM4zu_S_hSD?4^?mb*wm5%&{e zOT$KSkcCn|N8*0Xn=+Rn$V~0j6KwIVm#yXV?ou?G#Q+WBJEVr$c`^Kv1%Q-(b?MJ4_%^UPnGh~@nl7J} zKZga5i!bmvksRJ*6;`d=aDZ!1P1@Nu1Z|?r)nc{;$bZJ-B$V`rhxxbKfpsImHQV z>A9raOM|M0x7+0Jncm3zeZB17cN5dZ_&lcYbvqv2o~!LLEht>Yhnq3?>%8omYWc|_ zDH-b*8Rs@x8|6RHXqWl*eeVA1C%fPV0%}!$1*Ldket3Gx`~Ozq zb!wGgzpa;!W4-)m&*pvl44Xjt_RcacnbO|}&gI{#&4~vVcoR?S?XLRqx~kgA=+nFJ zG6p+-t$J;JJ6Ee#J$dpKX2sWH9ZS`E^KVpMKgc=XHusS(`{gUS+@O(=50TuH*Ui%W zI^iT}gk#xM_gSwh6~W!}zr9zOwa?pp-t#cm({yIeJ~N=hF9F*N`&aG?U0QqFGg7Ny z3NV{i=5!q}EV`N6ZEG*~5#(@SKP70p=GC`8lbOQ*TCY0){YUb7p5yQK{f;Z%4{`mP z9Z`}GPie1{{^u35Zr7(>2mgNmyT(}0m9=M9#k$=O9vz&1?)R+^pU()JE?epOhd*y` zalu8`={&#|t@6S=?-iUG)o*O({W!Y0`TgCR+XX8xRqZczb-CMirLOOU*UD&(S2N~T zf7|tNe|L1=zl$;R3j>e8yqfR?dsPzSGRvpon>@P-q#+AYB!Y*}>^Xi3`* zVbJ=v1M?mL$x$t%AvT&|M)M0p!)S29QEhSKX z7;Reu17Wmj4Ge_Qrow2)YP6*^+N~aKD2@)QjJA_Uhtx*92_tVnHP*tij)8%x%G1R$ zWOQs9*eD)E!v$CRWI+eJFz~#(UuDTAH%(wT4(Kpyg`Enomw&RaDj{)C6MH0r@*kai3+`RrU)M1T4#fXjP$}s3clon+d z7njjT9gkx9tdIQp`K*A+Y0agV$`=yp9oZ;q8g zFy4hp+z}Y^sa=}kaDxF4H8$>G@Bd8a1v~819T|@Kl8m2ED}aNGNjk3a=q$hgcM8tW zH=xgRNhsSv4b#Zzeu}-A?O^#bvacy^M8We4TWsz4%Yu}Xig}iH!Mpp;OZJo@1`iwT z+}xvgJQ_bgS0wR9ti$g?@abu4IN69)|4&KouJsEyI>?f4e)TTZq2w{FUldIdM;lqm z#_R=F`_IQ>%aL$Je9yaw;==`9t9x5xvu8+cOl$Jju_`r@#5DK8UJCbzikHE_S{#{_ z=&2$5O}|Dds zM_UZw+_HTfi|@g7sKi*_=ot^$(H=J8ddcYhuwcaArXwSy`qN$S$MtMVLr25}azY0G zLP!4^)+PO}i1)JKejTIV5zuWdzWuab-% zz1l$Y#FIL}Hl-@F8*)s}`WsTxfqmX1VfFUM8ft9%EL7tTA(qAc*XlMMGWFhdE@2qn zP_ncjgsq=sdRL1)qCW zQU={6w4H?_2FfbxsYR^~o3Q&K#ED6V5L-$*eC)SeMb@}^W%>Ej{>G%3g*5z}R5QRrT2?W($79V5))V;b+M% z7vRQ^ejO9!lJ|}c7uWm7{6%cQ&`3rN>3DPEnNM{*Y~2Mh#a$MbvoGmZ9^t_GTI-IN zi`-!E+2YnvBShlYU*N+ z|A4V|yyDcb8E9#S-xz@?9#;>)`Yzu8!Xd<7Bb`F4oum)cR=LAmorCn7*DuNZ6x$-V zPJ%gvFpR<3S~}KF5A;|E#c|A~{K(<|xL3RL_ilf#=JOR7=H8{}q+fs&8fKy#A(n3B z;$b&D&z{xFW8t1nNMNu+fxl`N)Y$vak2$g*J06CKvngFVgiy49f`j4GV@tCg&iHP* z2y;7~WjBPkR(~&EgAHTm5fzmKtA3F=P*G}H8Laba#lr5(O@(2~SyS+j>54NyXCEFv zR@%497IQt9!fsgR-}yO>!Hqm`%q=(fEuc(SRBokpZ;AseQ$#NfDADcuUEJAv ze+?xhtIsm-keA&t-mMhADq54!jQmD(L_omKGZ{C0iSxzRwL?vH0dkWGlJqCbb}9k; zJs~>2gywYwEtwwWZ-s{H#lsjWC5B^EQl7Wp;EMANqLE_$tcC$`C(Qy(6#Jr+jy-Y9 zy(q%^z+~Xj$$^jeLa8%UD+>H18C+WLy7VpS=CAPiTbm-J`+>cydi33BRWP%gM*R`( z-5yQeEyZV_U0l^z+!?Fg3-$FRJWeIYrM0;hr-f6U)Z$Rb08>%3 z3N9%=THcjDvFc~{El1}n!7|g~5W?e+Q7Cxl*OC!aLhsT-kFAaQkLn&r`3c+T+O>fA z%OW4Q!uA&%n9s*ch#Vfxgewh%{BiCvrSzpu#m1|6KaIJ$;+mrT2;$FU6y@2NCno$is=)^D)G`i<8l^31f z{cFrDI)D6O7`4qT<%*kMk*;ZCN&MKJsdL;zi~xy;wl4%*249GQGIVEVJs4woviw=M z-sOW$#~wQv<$ePb+%p@0tj!x1US{kyFf-Q6?jDIEGj7!uZd8pcIrbdp1wR|_!SH(8 zs~dzd&Tdy9>Db9fv-g~Jw|_zJoY>kw>32f?*y9{-C*<{`V$7X-K@lm*QF@S^NV6~G z@bTCa8hL5o2vnUsI!ZL)qMUS#v81;Z8t;_8rWt2C2(`;JT6K9c}q9$C(9?f(bge$OFE36~#!=qo~~Qez=6GDc$mmW@6GXw*t@p>Apuz>gsCkk%%^+ zSUKfzc3=|4rNwaDi2vM_qmf# ze`{=s&vIx~Za5H)EBS3mugNKL{?-#{9oYJPP!h0q#1+z}VtXcZHU*nf|*@5 z_6oY-E9V>80Qs9S&o(gQjYq}im)#xu8TiLHuYFjwQ5Kb|z7T561fLy|FB@*jxL?S; zz;(OfUK>IVo;zp1`y83D>Q92 z6Xz3(%EjWvHjUrX%($=4-M$qlppP#O&|djzo}8l4R0=XyFX+5LkcPK9X)ZR7)%Ng$ zTHCD!sQTF`g;T`4p3TGeg(>97UBO9r8UmR_;G!$$3 z3v59}_f+l`Sm9 zut0VxUR724GQFnPq(M#~@T{0lL%3;-2KAOymakB=y;tbhB}{o~oy8HhfnObMRuKtvnv&vd33ed=66IL9P zp34dS9`ElW98cg=+ZOP@S^Gfk!8r){r`xUgdUqeY@T$mx=S34}k)RGxF4Dw;+hn>* ztV#wY86P^^U-{57Y53i&HJzrqw$M}_u<=#C`)xevr4~V2q)gc2*+e$Zw}+G+btXV3 zsFur5g>xBwzH+p*9(eP=EC+d&E7=Y0s?AoBU5TkdGzjQM@k;R1hvOcI9iOo&NI!9Z z^8MvBIg)@X*2F^SibCtoN`;#0yGO5laI3=5vB7spzQ9wNgu5f_oblJ&5DteCu5iZL z1eP1QdgTy8SmY(6c>M8D+I+be=YlL;D-tbvk`%5Hk^04?gTM3P*t)Z6G6_|CA7Xp4 z@Besxf6!9Uj`qiqlk19s(^EsnGIfcBU91azxX<0GGoFriQa|cTaE(4 zhLQ@kRF@7i*(}PwqIrs1vuB!T)Lt63i_|kKzmqn?whaDslY6E{g9-DxD}%q6HMk^z z%y|oYfBnc|knA}ESS;Y{9c!ozb(+@cBUv5kX=CZeS0%M2;xE6tIjkXO#FmqjHYvUb++Dt5!^ z$(IwRe^jQH(2iHN??pkhjRW+e_rz?l75fXn3*KuLatQjz)gWJ6$PIM;5$c-eTGb$e zt!Y_qC$2mxnMG!+#X>)iSg+qC!i}i{=|vMy1GqG#wPs&j*5-|K$hwBGbs42k zhtuHJ_G2|#ObgYLjI;F7hiAS7DT7Go{`&JE{(whHx)A&8&>2?iQUo(GD#5r;GjWnX z{J2K<{Jt^|%VfIV};hV&Nv0e|OE>eErph_`*ryqA`LWohk&F6n(~`FXL-B$4kx zW~Yi@1VYr>X5TK0mYRt7$oTMd{SJOh+!*|+LzI~51dxl^HJ#8$TG1~Of~|prOAz;e zXi{Ml%#2PAy|XG^?4z2NGkYH8os3Ty-7CLVD(V_|=f&Xls}_e4HM>R^rj1sc`Ijn# z919i~tsw_SCVSILo+EE#X%e#=0m&A5sHDVcK{6~$^2$H9t@Y2zm~YRd{kA&vsMQ!3 zQ;d(GWtUj3D8gsVO)T^^WD5X&WY`94Uz2~DGZBpRG1#wJlurd#?R=pjC_1ApB&^0c zsdo#cz3lpVUkONrJ9#t~f$R}tx!noQnltg1k;*bNrdp5t_mHjBZo-S`i*EI?YQTbB z5X0HV8};vHMTwF~!4jC0bs@7HL2wvyNf3XQF800|^?v--Uw>ZzxkMNKx|-wDaew=z zVHo4M#c**xRbhM;2&h7HYuI~A^RtH)l}w3@@vSg3)nX4${c*loQ}!NKraPXHlto#6 z>$5y&bwd$#a^aMJmu~km!?&e)ubm#1X|KvN@)gTBU(<0>EbMD9uH6RvIC)uZM5h!+ z7sitJmoWPzAEqn&u&FjFbNp#kw(2yj0bUD_XN8O7-2vGXPkYrY+xYyyOAGkR_ixT> zsFVQmAzkw+87UaC0e|EI{%`;|s58+%&(~^(QFyA$y($-A)fz9OKmDuqqW*DK`nvQU zFR}f7q3BB#yXZg&KAj-}lwAXXjYnP{1ef!Z#y|mHhC@xwkVt#+Qz4NTQ!;A4O6Jz1| z+cxUfAm)wcSw0gR8(X!H9s~10avK{XWjS%l@~BwR|cywmmIqy?Y@n03rmYZ#7`2l+}hP z;%8=d??EI@>})2}og{}Xj4o!Oo(nWImcaCAyOK4{4*T=zOl5osjx*2PR9g=z`ZX{o zF-A%~H^v2!qwd$2#UCntIo&_l6Rqz?lx{qt`l!#coZo(B}w(9(cvCU+P)eUVz zNSvvsJq~)k*amj3<5|9ON45NL^um`HJhH-^ppRa--7-f)t0VwdWN@==ra<@nfnKJ> zNWBdDt%=jKGZ}9CZA8H#II-y&{0;f_uFQ=qnAkl=T=Nw*|LhK`zGy^qAX@wQ!0z5J*?ZXKc_Eqv=$G!u%Qy` z^;e&s)+Cv_)EU@>bX$jI?Dx83dROAF|6f*|$e&x)#<-3yDit30pCqKDgiXqO41i8c zNjek9b2!_U6N^pz&?o<&UMN3CD(Hl!L--H-^F4fAE$4k!F3u%lO14M-Xkh#ji$g80 zz0?gB&Wp> zZ>0G|lcz_U9d6xzwxJia=VOB{=V9S(ILdjEwRe|ApFTN=)>kHhT4Zn%E{($%MiTHvL zoHnu`wedmThO)>kkj77OtLGJr$Kz}_{vPMa`!DKuQ^}uPGWi(K{GOpG(lA+4U%=X2 zA}sD-<3Vo?dGCcuOBp<;<4ufXPsxAmPY%hz1R zM~y3kwUyiK1+|D%K6`0jwyiF{D?gm$tH;@?RXAzyH#U05N^g%`rKM)%DyR0)qNoDuJ!awwiLgO*FCNsHTm?RYcfMp;+cyw{i>-8U?HKCWgT^@H0Qo@!tX zt0%eE6B0{e$LLtj>^cPl^ov33(d8zHCUsw~hHjhy818}t!+leUujh6%+)e|Ccxtd~ z>$UVamfLAXd@v{B7zEoSUot^f{zkU_~ zP3I;eYT!?EDio#3MyuxhF)viD)4`NT2tKXmhl0y;k7+}1g|5rOXwn%M>j6N7SO6Zn z$jVI_h|Df}j_o=8RV#d`Xv1CW2rG4Exl%NqR0tJv_D!lo_u)xV&!MxPb=PyPhL_R%znbp6i;vvpN4Z zqY+-}qdESoWtN#v{I-yw&g?vwzEr-Tz$%MWwBN;9>?q-yPO}1LAIbSoDOE#W=G7Jc z&GwPJ(t$0XPspL}w^AAIxF{_+Z!x>ks+7j+SH6-($LI)jx{~-I#66f;aQG}TD1srH zP+GTgrcA@Kq~4-$aV~MV(x>ZwuJ8}Q*X~|%Fo{^poz2S>0SsB&5iuw0qW^qx8^AZr zMABq#ASAeI&ab^K0??{!%-@#LLuhUmTIq7NJt+U`QbDvUI?r%=!C~A7$o)7S_bDXo z^#rjDsCj7xh$~$WMCP4xxK*49c4!P{psb;pQt4VvPkO(V?r@c7onEs9pnRa5@MY&b z6M$`dDI+R4WD)tW9>n)HkO?9(>)Hpbm+bPOqAaM=8k%brR_s%l$tl|Gsp5QjzUD{r zLT&0X1(aX&+$UrW^hTuL*wn)#t}N^V4IK+Qu91b^^%Kh*4Rwg#UB$TLyRW!-LNjyj zDHFh5q^DLJDnNFRWP|UFDAq!4vAfa)1yxqA1i(w%yY2_!3E=fdE`JX-`V8`OFh_VlK44Una@UYO_P~=SAg<xiXWdD2lOylCw26+ec*BjZoWTi`lQi~%}7CjG*v(ENJd{tSUwDWdbP|Hb>h^pB_ z=Rw9U&T$rlnQ2Dmdq6E|5S{k7^pJYMOi~^vUwOM8XwnS#5_Ep?byMI7(cq^T$-Z?_ zc;vJk7k2m2n+3%#F`;FbtYs=J4uB9o$Peo+JOR8l_=woW$|iK=yT^&hR8Lk(=TpE* zjT_S~MZQJJ_fG}P!sPWuEa&^BHGPtC-xnAwTLF3Tg8nL4-s#5Z-L#96s=l?dwxd-R zD({vTxNYS1^1;5cd4xu|^vseY+#$-fNt9fy2j7nZN>B7;x3bwEg2S4m-#!=sL-4WB zeY+O?Hv}jNIZ%WJlH?f6Q8u@P`7=7Y#bhl$-ZYQY8>MHz&+B=6xxJVSzmhNaDr5Py ze;j~6c9&dkqcr1dp#4F4ia%oxr~j0#_<2hQvqkO$yyljGf1E3faW>uSME6A(ZNxAtfFAo?bzNKMaPTrab_xaA78-G3DG1k zkH}n&#f4;O^KftSVxt!${-ND1#g@Mas89@X$Ban}I;rvL9pHsVUvy(cL8BK4;PK1C zoFl0{w@ZRrd~foJ7i;xNn{H6{0TCbZ>);1e!`+S*fhWWi$L>zfKBKz`S&ENol>

z0$|<_^MK2@dfe2Bk}Af8FwB1c#Nh0_c1+ob3Yew@n|GC-^q64l>v^Uc{p z0Kdb5Wu(9vV;G&%K8Qx{Z52;`wIESn6>KtpTkB$@y*CgQUa|KI)H){SbQ%Z|yzaU@ zASQiE;(R=|{($T^RaQh-z@sySofMKVl1m$YzEWMgqPwI?-RZZReo2&&QCOR21 zw*<5|Elx4_+q(iz7oQrPN?N1Fc8WL!%I}J8=6AIdncce$W9!U5@ASAq_dNE{DF8G^g74b`_>7^m9r5a*)z7UJFB%ranW|Y#DAjxz! zYjY}zM3ig7fs4)w>23jvF1IKVY&YR< zNGg~}Z?QQl=4k8t1N}_Y(!TB0w?_cOK^(aBOWRLWagVQfFWJn|5rhVQCdCj#y5spyjS9h%{wuyOE`#hCJ(De_W%zdS9=BI~(VbfvOP!E_xLb(0|vP zBp&kMt?EL#8hejHE!t-9m}Jz~JGfckwPG0J@U>+l8i`wN<|>WWSZ>l$O>Ga%ZvVJC zF#QKjo3$2<)vXd-G^vUD5jWdo0X>8m8*21l7WLWS2L3CI$h5Tg_GH2VYLR=iq$RKh z8xs3nCToRUrnSs=z-iZF(&P@fWM4`Vx{U`MF%R<|3A+Q*SlxRUUWGZ}YPPAb)f_@B zy=Q~2e2YDKz%x^Wt$jRtKs?LWqRjonL^BbO@c-}Iv1Ic9)7~LmeSkFSQhN*K7*@J= z@w6zk#`Qog+Utp42U3@Mm$kD!iE!_yDQ-M5YN05uCw+OOOBRqXg8d_9df8Cluh z^et=>o?I2}^23M47gUlzI3uZ=-+EQnFGCoDSQeV_^sGRbORpi8EK_JLPaTXNq5vkD zEf&H$cF-Z2q9?vRBO-+G^=;nd!#rA7@vJ*>JvewiAAEgPPEh@d)r+Ho^yZ!C-pNc# zdcS)*i;Wn2@8AZ1$W_#ZvzRWf^Ifmx8-GXy2C`Oi8n*f|Hpb=lMjNSG{)I>VuOW_< z1v8D>oZ9UnY{=xy2Y!e==2JroY=ZFin{R?{@|Y>+Rj5b6Qp|UN5z;FmwBn1kn7A|q z(8Edq#>~%(QXYsk40V~T1*lu$%0w&&dk^10%N_vndxTS()RUoTf-1hWubn17l@kFJ zb;bgEik?CB-2)=b;_l*o8f>ev5N#C(RSym?sX(|&fzu~k_7P8c-Be*8HU_NCiLh$~ z6nak!I1uy@L!0f3bwT(qY4)C&^%{J;HRnhWO`Iw;YZdid?)Cm=1IAXz4wSb5(A*p< zFdr9jYIXPp8cnD{u@w`#@$@1#f)t(AmOlS6p->*7vGUe=*AK3ZFB}1UY3viAGONlc zNF~h`gy=rpk7oWF1dPZf%WR3(%ovxB!Z1pGMF5YG{Sy<2_F3lEwqVKusH;95NGi70 zWjd|H)MO#QgTHrUU2-1?$175p$hoCEew6;L%lwYqi*3+1ZExf*eAyYwdkA zuXWP|j%MS}ityj{KOnLaVOzOAOs6G#YVS%}3&8%n?BMv@iQ)j0s@y3E-g}Azp9QmX zq|VG6zWk=mbFk)X|0b=c3U#k_b3+C?s}E>>P!*4E=-m#`HAT#x@5CiN=BMYx z)mf{H$n|j++b|;a!_N(@^?J~mhTPVjQ9P71f~;z@d>J-@#m>+qMjIt*`TbQk71a|1 z-F9N`FJbq|T^Wk5q}6AJMK9O$=TG@}{3I|t7N9+=4G=qBq;*y}Jj(Yzd(6!EYYwyH z8pj?_xY;()cf6)TFiqA_jH%{!>skPj!%p5Lf5Oyq$Fopr{6^zrAXM9dAcg zS${zjXp;LC-~1PF)>k^E=3+)xRj&zW21G}(DG8=U@H!ZDfXa z77&f4&NOmxE-?1l9?6POC0bKsT&}U;EVQKK{40IL(8{qN6}5`J5~Ko07aOp4>r|!fFXs@q||l4lqK)6mCdNuWRnR!8?~=MEuq6we__4)bc2Yy7C&OlBn+8gm^|$=3P41>+Pi zz9Q?y_}cBz70N^<3={csV!gaw22^G0ZC~;C*FEZv!&?3D$FwEMDygi<8JDWVT2YEb zbRD!|7NxQFOF#rK7W5f}J!8B6g`!Du;amE1DqfW#38BIcxVHkq^wF(UIaw@^Msu|XZz4bKegPz@;G<_T2rW#882 zq3%dU`VlcCs@-&9;@uVm31O8#0&qVzWyIT6xqmC4wDoC%J)_~hUc0%y0v z&e6eL`!~q5G&(pae7LV`DStys^>g6YSB0~@(OZ$W_K{#ulUye_N5Xd4p$?_ge^iW3 zu5!O%E#Y?JF&UKj3-OQ{xro-u*&QW7FNn$Zc-rqDyk7+^t)-BnZ((jeD)YQFh>+tG z6Lh*PS)VpTlkBIA+);mRx~ETz7d>;v(jFd&uHw_H7+cSOGh)1|eZVe4l9!{(3oVZv zZrNyebXCsFi|!Q1fjQ1se(!D{>yg{+Ly}Yt4%aand=DeUgQsdkU3$}N;gBS0ImB*| zUIEvh^2uTz4Wf1sPH?k!$>!o;E#J)S(xNH5zhh*#HzJDE5N%sc56^b9w!khN2RpnA z=90a}*{Na3y|TM~%AadfTccuFfGytXWyCL8zz|!#zc6Rz-u)~7g>OTr1a1LqL9O%E zN;Xijzo3@Iv9_21RRpvzn7k({S*JU*Y6Oy;$+S`BW~rD%&BvY`xqqwXktx51%4e)%-r-qE6nIAZBNdKeZg7dZr7c6GBmr zQ9S&IUciS;2tdJ39vcipP{kRzSWVU*# zzV3DO&-t<`M*GaMe0Lg9CSh%4$!vBKLtL2h9}1~KowEQGl8+lEKbFVf%w&0qIbSs^{KTC(2Jv-Nww+hsaGeU=fhOYF)R9`fbL z`C0C0_rnL3ZhNfUH(QhW2|4ApkPuK7F*7DPWipaz=l?M?4Ver?I0g$%Wt-x0ImPn; zjn=x^z7;Ke_V1aKlC$YK$O~;ZtjDJx>H?b@RrW1nR=;MiaaOP3uuNWGU8N+*On)!3 zvYnDOT9Tknh|DMU$~X?K$ehq{R!CiPuo^|1sQ8X(l+}}kNA~L`x+C~{Tx{@ORz=pr zu#S<_X^(JM4voC)zMWSG?pg(J#3_sR1UD1Fv>|9j`i+5$&nD_c7Q-GroK4V}uxYrH zo+R6;V_3hky<6gRb1%0}1RLW2kY&g|{kw0!f6I{`>sj&SMgXSk5$Z9v_zj?)`t`U^b`&fo1mtjf?|Bg?Ra2amigQ*Fy>8%IECY51aMPlZw2>sm*}$a_<KOfXB%P z#87!ri&OEtxliwNhy|qFurZgu(K4}4oX(wiOWgDj&lIx!GL~2BRK#Jh4ZkhA?RzNB zsi@dy`}h8h2KJsy?Xgb(2*bZ#?a5bASsi`HgYjiKXgIuzc*1(m%88oX?b4j`x(jsZ z931oDzJMjfCFexl zIZ)>-ij;Y)>N>h8edt}CG~A)O<{I#u0{^R7CBQENKHl1#qTtt;baE{oIv*N9_x$`_ z9-OGjW7D9!{35U>Pif%5mNaftXf=6PL3wXrEsKwf1(J?6G?@$xK4Y|bep~wUK3p=K zn@`&N>e4$%8yEwa@cWS*o$tVAY{GE?q>ufa8pr;S*6^m2M@}2vEv={DP0&|IHU93h z%r8aen9p(0Bqzp=nToADkOlC5kmP&e_UUGO`OWN!7k8Ed6Ni;i%NB9UC>nxa*3-m% zPrt?daA7iCts#HFfBBs@wY5K6*4r%t?f}xexf&e1w?UwGq)$;qhZRwmm2+bjHXq&V0QgT_W7>(#tY$5JdWId^Vv2eiB{$+yw<9Wei zfQSA2i;L2?nGP4@r5eDd4QY?exuVl?dke{=>Yk#JiOBBnuTZp&uR2?M`r37siAq0v zp}=b_3x12`(bPgN-&$P~Lpr~WuDY5VBPA{DGl4xJy*w*3s&x~bbdoqaArt0|%GzefyLR5TW1OzXUclffMV5J80bAE-9; zJcfrI%oZiayJkDl@F z38!U~0B<83$&a^fCXq>5`ze|?3&Q}aMT_sh>(pe2y9J`jjy&{t@T(m>!t zq(jkc%?XWB(xb6|w6u9^4s}FK{{!<+!#XIcEOd%&ayx@rb7unMoOe|qS-fF4=Q-xE|BKY?eZDE`X6%f zc(&pE%YRJg*8gHU)epqjqU5VL!JMf;|eXKq4=3!~Zn?>cE%S5T(?A#M_ov0@(Od zdZ9xVRzomhhX{HskgKJA|Mq0a6iPCx(kJ^le0T@db2a*{`}?OdRF$B>i$i(v*-|kZ z07XRgeec00^Mp*3J4V;v>>@=Fgp_|aI>>V#NQBgoEGsA_P4_{ixt0O#D9cZZL#~8t zAdh$M4}7XHY4DAZn4E1?LS8nf#<=`z&5!fN!vVw5zj+c+T|gP*@52k(lsNx^kv>yq zsDGm+FVdT-?LD%FAzil-+v;l!L)^pD`lYrcj&!*V0)x*tQ|*fOdaETQFzV{vC03g3 zwHH8bTW^qojs0EO*e3$T|ErG9kBwK+)u&8s%-v8V)GQhxO8-5<(#&zTuBEBw*@GPY zz?A2>n0X`9CZA6{Y+6g+h2pzka(J2uFS?&$fp<_C=!7il|IJ&lpi?P6ITk>+ftHlX z5H#WknA*8%&(2q4EFB~CkjMSxci&n0#U@p~F>z%D{P>8`!4Jz2QD2=FD6O$-{~%Gv z3bs#_9L;Xs4VY{=0sSztMtm_g)X#`O0ua#{MTdB%v`!kf>^fNw9eaNuM~RwuY#P$W z-5K*m?LfeU(4HSauTy~RyrOh+NwwnGIq=d1-5}-+V2EJv>#8@lw49R$Cv3%?6KMzS zjU~=cx+d10J>YSXp7yNQc6KDS(t1am8|!6Icd%;9eYapIHR9nC!sFEQS;~H>^m7+b zcewuzv;a{xAd7STt2rzn*}!8+t>v-hYw1%NiQPKl$Y^&08jc;GH$88th^#jj1e)Kf zL#b^{pSn*?OO7L)38PaF_g|Sr^YwgT)K#)vLftrcbIn^o4a5JcOZM=6Jpg{m9A14H zsOXIkvAcrGYg7=y=CqX5gM)0gizk6F{{Cz;-D158Sn= zZ3e_vNi-(sMJ;TWth@2GtE_x^cZ<@@G2ZS5tRa5INSh z*H+KhZqP1>N;G&^y}Pzv1GPo9IK+wlXh6z`ZT4WhYten^Tm^*g#@3o{lH{nN1pJ9h zAtES?xx?Q`;^l$b^3Unb^rW-URtb@Km zS4!g!5Y&KkgIbsfZ4z!LLggFT2C!QICUynM?P@fwwhe?smls76n;dPZ{Cbpy-THP) zXjQr%xdM%(&A)Ro8>E~Cyg~+)OYI-OtK3Xb&C@jWK#%==s(M5 zZp1>h4F?B-Mn`X}JYs^09sEv1uEHoX1w~9CESR-62GwUyxD{W{Yw?Y@Ba!KJphoML zESXSE+TpiTo05*NmyGI4!ZBkX$r85m@v5_}H7b<-& zz6V_F*K>uAdvF#kQ~ztgT6^LHDo!C=E2`aSS9|~@$$dh${iG}Vom>x7moB5#Xry-s ze|&(1@DJ)dT6<%-(8U~g=^&B-GPrDsB>;AG%9;ImKeEue){Oi`({Xgu!P}n&Fd*niU)DNYBd$(~XW4{UisKI98-BqhcjcTP20WGID zUUu5(7iu_+!P%6y|2gmTOpuIWSna9vJ!b$aEL2$>%iDCAN9Rp-_;ov71XDav{w<82 z=q4YvQyBUimnKQ!5DR*2IXG}rjo_0{1Q^O{8`X%B%K@r&c)8VLKFdIt??(Hf2+8lD zbp49vk@fLGtt6_hNJ56GW*JBwtI)E64>&aBfRz(=l{wCC124y|Ze8ToxM7F7-13}N0!AIwEK6T)t508O!Jt*YCzeQ#L4kj~ zde16)x+L2~cMi%KK4Fmqv5*_AnHsVO1y5rqQJ=b7uAlkQ(_TG3qQLk6JcQ`{N6&Nh zetkqw)K(;f7x@05&NkK&FFIH$*86PY5Wu83kT;d;`EFY`Da{R=Eq@5BO7_o%pS4zf zA52&O`ja@=09NpATpl9gkyRPMV3B`*$GY;rE3*Fwl%Ic19T5YFinvkrkTg|yw`kVE z>`?(Gg2Fmx7@#Vwkq%1t=MyAawzy}2fcf9jJu9>*p;JEwrVlc}m0kk=J`HpUquDv- z;dYgOOZPxae2^!zZIIIPZ*hL2u=+k;_Zq7<31NxtRwc~;`p(9bsM`TQz))km?qpVb z?`CCNy_M$=)dLd2qu+0O+V}b$T5usnL48fugBnPSj%s4IAH~8_(Q41FhdJ{L8g7N;j{=cRdk_XY>Dy`sYXRURCHT-Q$*Iqr7 zKRi>J6Y(v;x~Pps_TOHp3}!dXX=1oxe^}1sz=7-7u94nMA_}$FJ6B(2u^X~FiZAnM z?{}?rvi>Pe0;nAxTT`A)d!c%6jlA~y(G@HZ_g|*qNMDF`$_nz8Eey(}C+kn|suon^^5QKh#L6@6 zU_j0Wr-pD6&~zfGy;0{Lz^ZGtY@q$B$)&bJautm>5OoFCfSZ7&H&`stNN-`M&75!^ z1Xx0<^qp-##=qlsRNHHPS*G_|h?kJRSm5+B78vaD%?+rMJcbppX2RgWg>c_H5X0z$ z$~-VWRem5aOgl ztE@Md)T`U8S~wC%f-5aCUKv%aj`zhxEGXZZT`-NJ(wO%T8ll>=o(2xJ=tM+0QL?lj z*SDQIxJg#bg4`j*M~%&jloUPYk7#$2UxP%{_gv>Dzsl$9Auon>XwTQeo;ISSQR|s3 zmd>LON5mZY{kKT0F&rds4` zrV7V^DMW?i+xje3QnEUPsN&Svs~wICG}2Ge+b2h#QNPmI!eV4Vw?_tgJkrg;G!wK* z;;<$>^**cpD#ayTuefn>%2u@M3OxdIAcL_$XHIfVaR{=a8A1jc)?QtZ7D^kxJ-P>} zR#`z-wHHBYz+4cycJy?gHT~gvmih|Ivm4f)74qL&du~+KKQrvl>fWh$bsm4N$5@`N zSvS+A|5XuO{?GohwkG4a2E=|n0$Ug%X~pX5$JS30Aa+21Mw(kBKy-zs-oCvmBV}-9 zt)6-v3jm;BzlFqc^oT`Fy_IQ9{lcPq)d6(LiBXJST`vUd>27B=0E~F)UZ`kbxZ%Lf zf}37%NlSofE*ytFA;HsKX`yRmq1t98_k8=BNi-0G10w=}ITgxyX>e7YLRaF8x?ms_ z99k*w0`cLyszpf9$gGyNW;5GCpo)E6Tn>0g^FM)g127`M>ulPYPj|Rf;Qi(@gfHwz zCRH|nNmkUS@fM3Dqn2f4Ld9*7%`lgSFmruA_^YhpLuh)EOaZ~8-KFIDmZ}(R>oTy& zYGC$5ZO?I5^o(5p&T3Gj@C(38VNR@uka~eZ9RHtY%_alPXA=ivLjT!=>05a~cF+Mj zaMHpIN7wVyg*L-)LiN~tUZo2H^s@KYI>?zoWd#_tqPP6ROlUgX3|(}U#s5B-;)I50 zW;=wHfs+3qm?3Lo7Cxmc3RbmKu2W_^fyp5`>&2oV=W~Qf)?ld&hn0GtxLe~_6c&U5 zN7pHVRgBs#^J%#X@+zH-aS`qTCaHBiJU6#Fn7uTza%mCKSwf?nv2Y<$2-Lyu4j4d>4>t0L*s2!gB zv#bRH^P_6$j_|=N)`W9uz;z9!Z|moqmaH28%Jwbmvpv$)c zE$J%vuFFfp^WZtvKMM_k)+68JN%%iU{|9^D71rd|b!!Fp7DP7En~DXgvXLTHMa2f9 zC=jZGgc7QdPy@J8M5>M6M5;o-03i^hC(t5wGnd%S3SvX?(GIi ze{iaH`-G`w29V^TgYGwKkMy%cq)G^Q>eh(@*>2Z5CA-OA|FgV4hDcckkAE$!xxeoy zHkk;Vb?&4F&ie6Le~Eo@svEs*2cciFN*_bUA(d+^AH&qV@80Uhec`o`@x*b%j@h8) z^_wuOB&eSy_Mf>1W}e5A{My@?pVEA?W|jd%uEfVw%afGb(ugP)7P6g#zS0gd!iwd) zc-y>hd8_(R>!kD_Yudkj%QHNA)Z4XaV}%OV`sSv&ln}ck|5>2Tmv`%jPpC--t$%R& zqg_Uc^U}a#0mKLd=5p1mI?@4AclL`xPH+LKYVm<@dkr2X0M6K|)QC{q@A(Hfw&DEO zyK?EEE#5Y(aegj5Fsc0`9DggSH8Eh?GkU@%c=5X+Bv;ou067Pd%XK%u@s$$5^SPq> zG1EfSoq${w)93eiTb;nW>wdKL27922fjS@I<=#Ubog0tFR$p(ty!XcZGd~<1d>YDQM4`rRKA!8L~gh?WC7Pcn2 zw!c;DJ|E#ZqPMu9!2E-4-47QOQ7=|2rB|ifsZL333IwYQiusn{_0=mby-6gT*W`ep z16nR(oU(h3Y=JDrbE>*TH563arCv&D*f$Xt@ij~)wFK3+C#I9`1tP{f!Fxc+xY?XE z5TZyz_dn|X1Lpd1Aig*wc%v`ZqN-6t)QK(?tDVssr;_rp%Z0ZG*vcF&h}@0-3^z|9 zOcG$YFB>Gj(+(ZI+zxfTdslsRXJ|y1urpP2Z+g|ddVb_RqFd}2!}7bES3MeF!K|#F zns;ci9+Tj}~=-OEgk7&B6)l{T&D%+soA=4IyI@6q*8TdBBpB69?ARX=M7Ru zDVY(xo)K?4b^7)|f$!o6qO7wnb6t^`P4{V={R+lyl;^nw#anbJ@q@=iuUa2z_8R4B z1@eRdVr!noZYP)jsea0>)YwGS7OrnDiYV7&4a&k?g+Mkn5S8}p>-)Y4@l%W+Mxs;p zgEzY8O2bTc>*G71t=rn@JD3Y}o;Hr2V{osA!WV>!D8isA80zuc+h(7x58+wyhn&F$J2=Vrj6&rJE(igKyrRjA$!b2;26i3QRhj_WJ~ z6$&oPxDD?9R$LuvP8UcjvpQ`H|0+{Z6t^NA6alOQ{76^i9i*4_TW7D~`{XqjvP(-< z=?wul1ZiR*w7Tg#m3KO8@_x;U#Q~ihzWw*u%z&}klQ83Y0{udkwl=I=YomFm;dm}} zdqTIg#{5MA9ed4*d|R2Xd^mIF(rZk^18q`}W4YV4q1(W02KbhJQnipmZy7ceMylsJ zWwco$SLEd#7Tyxq`0@NX${JxZBL}dQ>jf4M@AeIyt@0iDa=N66^{4tJwSWEo2KfDv z#la=uzt}{cYxWI);<2^*%mg2`d{V&qv*)BZ(ZW4Ab;U*y5!#xLwy7=0U^Ia*UF7L> z%brD(uyq%o4s>>T`ZcoZiZO>65<7lt@I5c$N;V@$?(4fL0l5#o_$sUXq^(umvKi)) zV=;b%hf0^;RwHl>bZ5okStIa2N}=`(V`|AklfKpJjdui_j-zYdgk-r%|DHXae7p5w zgQUX;btQm@7EX4PH*hnET_1t#6MoZs=;|Q(uPQT3&t3yuk_aRPca`nRB;1vFcw;b( z_n<@LJHHGxk6S=X<28Z3YxS|}ndRx%1Jl(N78v>x$j8{BLsj-GdwDZ27q7+3odq*5WOf$#u{0~Nj`UGM44~0tlQrhT$4gbgdlytz?$s@H z=-S}a*I#Bu0QV%NgXiuRe`YonLXet~fi|DVCR43eULt6DK<=C4X*z`V<>#g!P$y9z zbdLeMzvewrD23Xw#zIN(&bwq8NsmI@>Q&-b!Fc=KSCtiOmf=b?QYG;sr)1oUvQdiL zY89|_Wg=H0Vb0k=8F7!o%@&miKOXJ0{lfOAQ@u^F^*^D zZ%cjwgOoyNwZOl$0-ms3XMVu?D~Cv`TZJFkL8CH0SuM=I_9^Mxq=x}B2=LJhYxh-0 z0I4ywG$eEWJ&@SXKEKgAXjXELN9}9Oo3(GVv_?0={e_lbm~sFl4ifs@%prDLt5W)) z&{txDC5SI^Cdz7GyX+bKz}%GsmIB~Lg74xCQFiu__FTn|d`c)4?9CMVCxpP+r+FFZ z59JE_=DJ53-Fr0#54-`~U_|Lg#S7w1#oD;uqSE0;m^^d~9&sSwvhlVT5P6CT!t0r6 z9wE049?-l!po!ocZImtERx048xT&2ifFN9sqSw2d4o2FvTneoOMwPwX&*bssqKRbD zhk2()8$k+S&T)KUeYVzG5wW+fll&k{-Z}D4Us_P(GPuBy;X9Qfb`YEWQm6;W4efEE zE3rwUZ4M8g!j;v^#dJUTPW0kS$ppI3pgcm^+*KWJN!LvE?<}(gYPM}A={pV zssrAal{?&pHQeaVPUH3j09!kFQ|Jt=9CwcB)d(P4{#JQa|) z#5C_08$a!m@r>hPa}f)U`*5AYFt_xnpBwXmvZNf2lF6%cpB5jdcw`MJ$Yv2oyA7o! ze1E+d>%LvN)0EQ|)#J*=KofsaQbQ!YQsW>?#z? z7nYS3`6UC_@6$iu=)nD2lm&FFv|zu56r5T!*%%F0S;&u^$Ge*(0>l&db3W|tC4F~p z2~zWH8pHMJ=JzTDK7>)^Ez~6O1}z@rkYN&P@C=Vkx!G`TZ?fnDAqzcumFt{F@wFSPx*|0xS+VC;3dSW*xm4>dG%r%!{dI6l-}9*a#ymQI(;@+; zzH3*MLfk=h+rzIp4&2sVvNbUkDAkFVL*p~s;!KC$_CC|;8+82JON!~vAO2L_hpdcH zPHuRhCH~H5mgc^VZs48-^7pPV7E>zZ8p2%o8pQ@v0$)gAY!{3M2s=@~U*pAVp%*5o zB}@5yN_vx!GcD5vezXaD!+&B4+K;X#fQMnHmiBW0fo{dme-{)`yq7SD?#^!2hdFVk zhLI zF@dHgd#W9%x{WM-wp@vT+;_*K_E8&7H6OF`*Hkya%gjG-HQg4Otp|p1=__d>)1HM9 z)*FHUeunz}ej67izWCiH{Sz6fP(xTJ76+yEJ_T_AhFvGBm2_sh(UFbkdYUk@P6k$` zNuqpUjX|!@tZkl9h>iSTD)b{tpzLa>i!0&o@wy2vFfYEg{*1yp>8 z4%@SVtAs;&UG$a(xyp|;#7(7JxTEh;u1H~IBL|eATrJaT-*rvZjp~FIrsrH-$LSFe zLabzjJ-o+kOsoogXJ?48X`}LX|LEYdypBE<%AcqLDy~-E{_z_RyU=J=MQgLS&!syQ z&0hDe{v&APU;5C4*R-YE=tG#7(qy#Qm(RlRWD3b$5doSDtkf zOeVEAZ|PA2=2J3y-~R7k_g5XM*oxsSIhrX)`YGMV2BEvn`BEuN2puMBP_*r)4v!pr zcBR-JcMP7Dy>ee|f@;ai~e@lI}dFuDP))w|?t@ufnyL@fPuTPKL)fN*~mOCI9RY8C6 zTJa;hEfH%`&ZTzgw8fxFo0X65;Mq^pvBtgvO>X315laUqM-VUGW+?J-aCVowFwi{C`3O8mlQW{Q z&q$P(@-`zDc1~Z+&(`xtQ~`o!+#sUbl;Ht4>9fJsITTj@rR@5i;T!GE>IJ#82ay$F z_j*;y$kU~TiWo$_CM}OGf~0N~BjE5JSE&ejtpqn4JQec9Y5pULq0!2l$3BMXO|?av@jeBeC; zf^Ze6wDvrOzb_h`?;pSI?z{cdxTA%+J=E}>2zD5IbgxQEC3fM|IKot~n@rG^la$ML z^}k5)wbOVv+e7zhM@&zFJiW!){KX2t?Fewyp{gz4DWAjf#7lTF{nH%Bi=#0*RVdc_x3-9xr*32*G&^zGtGmm*HbRi z=nVJ$y9=A&^HNiAuBWu;*M``>^o0ZbHQTwK@~NDXE~zS{=nl1ewY6}=^YqQJEgsSO z4ublWgx}l-nJN2wNl)#GVa;b`JUj5gE>=?;AsD=#i=3bs+x~j#reZ;InQUydYwF8w z&ch)&B_H1-f~Ob!^aE z?gKQHB|zD5K&$dyyteNTCl=iHrRK^zCvN4(VZh8(SYe`%wb@cDKy&}(WTIxIhZL*t zH^9pPzY8fux8dn02L6L~R`N_ms360z*-;{$vRa5vj*vcg2{`ahdxx0t!hfx z6Q*o(rvj?$jINC};?Y^x77jj-h6|-y2&tmLj+C`~N^9x*2-D8-2%k!whN$o|>b>Px z<&ib%HWg*657OA{U&(|sD^s@O@kVS$CYQSHNQxV;C}pOcmCm%wkFjf&@tvyP9E{wL zw9CDjnt=^9B0O*or@ZLeZtfbFpvdN-dwLywxK^eP>TR)PBfV5zO?9Wxqer zS1hj^A_(?zy`(cx&CXq{JGIJL@?;)LH!S@(xVe=LF17Bv#=1qs%HwA`{P*p3)l3Y@ znjgPiBO9Z=9aX493c2P}_=0-b+%#U{xTvkkg;H0T&yZ{F#MD+3Yzx$yqnig6I;^G2 zU&n;}jS(+=BGKgC*wWQE>|S}2UPzgD%8z~$ScN=qF1~g^(5({b<|@$PPm9H*vCyu) zTAdwzZB#1Q2VbGfO{NCjs@OVJ1`3clgulh@{bKZg!aW8Sb@RJbOWmqZ7trpNikmdb zOUgC&wwIN=y+ho&cb&_!IW(f;%5lt0Jk2d}=oc9j&nF7bR6StwbFYA;;I7FVk!dK@ zbBcO=CT!w=xOr%SoJ$05+7J~hRG5oI7R&kNWwL8xJmnrRSJa|u7r2mhyvc1cFD@>7 z9gIKXkdF4mjwX7-Ql1EX^ArP^SpBW!+d5lC507=jZQ)lokVT)FlZClO1D-Zz(<{5t zlTQL`I@_o=sr3`&n)XW9)AZMAUeKZ(CV>MgO0A6U^60+qII-SF7A0-x8zNX;=LUsz zKe$$4JA$4+awW0pxy06#`FwioU#2d0ngeCI&RrMVLGM1j*ISQkq-Ae%1!wK&tV^;J zvhAL6T1AiZRP6VPgI$IGU{B1tgzeCCa6&+-cr$%!L0c5OAKmAu#=virC25v_POHA~=5Ecf}+JBH!IZ^W46m62Bh^i32Mn&D(4N?mK zQzO%l*4`4}RSBRc>;$utogs*N>at4uhC60wSNmyob1TR1y|{SUT$JSccz@{)rl`j) z?e%YDpC2zOj;E9t2dq|_idd_`d$Lv9ve#CdxZalKx*QFy{ZcM|tM13lI|Tu(96l1G z-kp5-%jL?V?xe%@!oV)ocRBk_$BbjsYj8qA%2);8;>vY%;c3sg;se&r#eAi=yOIe{ zB-Y>@iyMRuR^+pY7L^59cQPCTL9%Xk>=W~h)8PJ-e0~go<~sA$#Y-poWF8P2I1aMf^=CspeAngkb1K%r3*Cb zagd*j=&+uQ0LBuW_))U@0Sr5QOf|+VTm`OR31A=d3uc0mq472jCpg81Hn-wfF;|Si z4?+<=N&!^Ba#pL>0s_nSOP-W-%UD)A=OY!mSXJPKk~tiyxQaGk+c7+qo8mr%N{fM) zYJZ#@6Ye|5CBro5@&I^ag*nxE=-IYEz+7SMe_i;sKh>Kp5*t-N%`9Oy-vXb@MC>>M zpA)#AS1dYwdkEeo_UTkla=;L#KW7lW;(p6iu!py!~F_qjGrYe zU#`P;H5b@lym(sTM!BL@z>pHG?ScUSt>)0HIP}~TPJUZY>pGFBjx9;-poDtgf6`A^lYE&kEX16}qqZW$*g#dbJVQ$>3zdU+~COJxo z0Xa80ksrL4CMJ)BC(e-Ps8~t`6fpn?e(@uSwps z?}bg(mV0GJ`U4|h3|w$}XWJH5#xB`Dv>o=I4h^8n{X^=rwtX=<#nseb!yvqwn}X}A z0ClN@MMC4P*I>&wfdEk=l)(+@nDVUKX7)X%U*lGXrmIC*a|dJ&;+O-@#o2!_0siIU z>9O*+k99pWg3P-=#E&+{Q_4QepZprV6(Bu$Kxut@Rgqn3Ys71ziz=~tq?`ssI<`^8 z3TU+gVVNxu)2>j!NIea+xHrtw0`m_%t*5^3Sd8<=7Lg$CWHodF?5vlisRDe;4{fW+ zC`3^9)C#zkuC?<$wY7`#GU#Ww?SJP(;DR7H2 z@#1xJ3!l0ksS?%dqa3yqPaqaSVz2l6?hvWBoENdOSDBkeGmH^;X>v?2$wxPr;Ykj3_=EnwTUC z64LY4#WluTz@$$O@wx3?x2p^b@jL2V2R5SybATf8w)b2&CPb?Gi`i-?{gmkHKnQt8B~eV#}I;xLfxF#B@Thd+E@Ju zHMsH(yP~Rz8yv{#BMmyj>y^euil)QNI+ZZAo1h5=!w+>E1q^YQmL_MOeffp@fC7d{ z3V!V^ZE|q?f=Tx+JXo(Q<50zYrPgy8$*hjg*}ELd_PAwYtoCv|kwXuHhn?^8*2Pnz zeuiX$A(}22TuVJ4&1Sg$Ye9ldhGv<4@sj4v_!{HFN>Ug%`j(l_1<*44*xMT2S%A;U zp06nIIpJF)6lJSEM=Rx34=ftX&g0fb0*jVFW ze%h0AaWHs+c@u;Kg2z7tr*tQ_9%uzTm+&jkWT2+5D|=eUQ=0tB7EWPwyD!9yZ#IcK zgf|?2?_?k|bj7h^PYl@c-L|*iGZtAh%c)h{jpy}N(*Pv32yKq(7QdVYPL(}g=iS&^ zQEUIKT_EaQUBd5j8gf=3SFca(23-0eo4HcP7nrNEXXI@;X)`x!U)>7u3USMiy>gZ% za)3BeUQ^Vdz1CLjDw#}rs|_^>ivzX@sc&n-?`9*BoQ7#87B1z3 zaOu4%ULFxZOR z;YTwRy_ePmtBm4U^R(0y|6i|&Ji6QHZ#8@X@~8pXIH0O5${9JHtkw{vJ)D9PzHtfNO1G?#G~7_QL^;jM8+tY@fK5X zic=7CfQNX<0QKQaxV*=CwI9@Zj-Rl4cJID_v`7`6TAcW3oH!R;=QhuKTdD ztIt=Vi1L|Tn|X)SZMmO%|5_(eBn1K2$Gm<`3xwUVMOg=ufRub+7|6oELOoAwsXb5D z*_R5tUj=n6h^IqV6`YcR1D&Vf61M=vQphd=!{I%7GkhrS5VQUVZp!YH1VgzzGWx+$ z4EKU~-WG{_xk63(WrrXLaWuwx)8X$<(*GHXpsG?AB z?Q8~K!L9xpjYXJ+om6_T@w1yz^5tsyukmO#_PvG+C%MlxkIe>_UdT=Y=AP%Pk|oDv zJPYLyhYnX*okHtym`*0;kc1G!gwzKv^n z=^2=@V;f~wj>vW*?JYatEcK6FyQFMD);&7s1%LGLqO3z2+LQk0{L;brM;+Wbds${) zQrpvplx4Dpc#69c))&;SE)Tk1fDP+C%3hORng(^GP@1>Mrm{*$X^0CptDrcBqkF_X zf4+cifw0g3I(q2&lLp0a^Tx~?ZarJH8#3QF$W&C?6-yE6+BO&d<{3p% zv{k)qPQ8`72I?7K`L}0uC204vx57YjWCD_-S@0}0y*Ai*&GS>o??qc6ni+PVcJ9EU z17Zv552mDXaOgfWMBUuzm8tzsex|*ub+mxKUnwMznUqjMF}dq`Wwmnu%?Rc8&!6ZI zYSPRsj=3S7)H)+5d}FAjZG|9_?iD+c;8NLMH1{?~7Yao0W2lee7X$nem%=-QzL*RW zUe3S&t4WQH$ZudO0{pL}obFXRum{Qev|&R?d9TL6nQRvT7Al~Qn6H|TD`6s^_zmWk zG&|FJoEhn?YxPTj>Sau_5durj{_M_@>+3te_RX%Nul-5BeDSz)KV#pnkXIN`${#jW zm$JO37dm>RSd!+S&5*~@v(LaNzp7rmDJ5I~MdKFp@At$NU_B*+!Y@t&|Kht=sX;j9=`^rilx*I)9&K7y;{>=Tv9=#Z6Q5~-PlvmO*1M>kA zW|k;oH1V0Bjg`f>H8q5L+1Q46-fNbm?{Qj|1qviVWFK)&WCN3Hfq~7{GgmttdOilw zGHpC3VS>Hn#@089Sf!q+?FZbGOT9=M@JQ;F2r$5;?Gz2G?6)d?@##BbJxfZj338won?@WNh3b>f$Gb^8t z3$(c4akEd1^LkOzXF7(%kwRU-t19Hn^ad!f!K^m_yfB$ja`vIL*5)^5qB(7oVH=TF zF+EmL8uZm}Nw7lu8L#4=h{q3jhy55!W2Aw#BY9~`)#}?%l_No=Yb6I`TAQo^#6Gzi zkU6<3?*N}w?xrYNw+c@~0U55IF+r+yOd`tGRrM;<9Me$#2^*4yA2)n^-{Gwuy)u!iLckqjfBxwk_8JqKR zIN~$7@xav}3Jf96tYkUOeB{^IO?QFYI=FmakKs4OXk~ZBL%L(@w&Mnk4qIg<0|I;q z1fQkfN*l4e<0D7nK55(L_+? z+%GI|^oIelMo8wlk9%X>Dt#MOh)`K~Dar)ejP*6|fG4`E4XAd_3W$0ZexQLLX~Ukx z!yu!x3sXP~>+-$Jr}S`ETtQJ~4xrlimgsrWpbW3!rzy zV*cCmhKBaPZTTG)pbN% zaOKqrFYg>un*|0%*s-ZvGwq!&YmmmC7y%N@eOzuZA5`?uBZId$K0+&V z*GS&65yyvVD~<3kR|irl3`G;>hBHhPyz^ikxKui-g=UF8-gL>i|9gS``pcv2lbfWn z`m9@$is?6K<>)Hy)<2lmI+7nbWU>ti=FLp-;;yi!`~&LXB$wK;Fwvc;L%{=g34y;>XZSlAsIBp#{(`H-RhHsy}izudOjZ{pKDhKS4eU_TC zwC5yMG3BCuzvf|LPiQVbV0gP@Hw5@1<4nr;D-MC+AQ_*ZHakEMA$a4u) zD$YRY?*wZUdSTp#eVZ-@0cL3yfHD{g2nmUvGdS1*US{%l>?*;oMD-XP)v!dr6w{(m zdyM8@MzL*ijRdu0>z-(owckoC5j3$&YToIZz+BVDQry{Dqk|gEL}OqCxa%Dme4S9$ z%u~6L{D6%(e58TJQ!xzOqhWj{`M}>@Q?zzXc1dB!4;i z8dINdMkc8ZRbF~3=wvW!T2KhvoTy?$DuxTOG{AhCJ7>=T--}RrlhrFCrc|0`>GR#b z&p`#55=%Kn^C>$IjtX?fr@iG&fcgl;!2k)2HlChsKniP8Ux{sJ>t=ma1fG8YOjQFGT4(*Hv`crrpC_I|JT6Q9@`@{8RZ>l< z;6vntlW57T>vAH=?Sp2k;2hQlSD$w07F(rnCvQ>_j%&?;(x7oQ;|T{q)h;kZRd(z5 zdoD`A4%|s-|LIuG(Zp^a31>Pcke*g-+4uIc(sigUpiNCWD}-jnW*mVMjRM3e(%d>T zCD`3D_**8hBZ*P~IK!@Yad$xB2s-k2Kd&-5VMlpwe}SrT9D$@2s;LI(^z@B{<22vv zpmpdDWn`$q#ql0$9ua}GI<6PzHQuTz!t|XSNGKJ#DhNe{&gOhzP!9Nn^6}NHK?1j) z5*2Ii96W74^!_hpb=%3SRUT5+L-yyAy;ys>_x=D0I%cNjDaOZfT8d;e{pikjf|}+wO7^Gd76$m zq$y{Sg6A%HFP@nq1wD6ib%y9->xRRDv<~j6%W?wdK{fYBfRin!N)PuV?wCxijGzd+ z>P5xA{AW>3Vm|(!Q2#F#P%UiPdk-l>CZB~8yLNqq-vd_Ww28gX&ZSB}7t@rNJdhpx z{7eg{GW~0`NmWUds(bayoqF)IZ@1fq^8+Awk~v^k`~ha*JeO<1zc#3*Yr)Q%EA0rD zbF1~T24|h6*wZauJTq)T4{Fio$>Z2KI-s7KrR2P>F&x_B(Yho0AQyeef&HQ13bG(= z6F|yGsu*v3Ok-gb!-hJ)g-G|ECT}5?0MIfU(MNf%w5|(TikSA;MBM$N$c}VUSy%Lu zlX@)j>G36rpi@;71#+k)KY$xEwOato`0DFB;D8p_Q}onlN02uYsuQ$HhJ}?6CmVGe z?k_WA_(!*RY5^349N?8OWi%j9@egs_YgNQI2{XMs~!l-__u*{8Jby>9EE;}J@2Jg0%@6%EWx zSVh_>2rE*eWz~e`p|PSWNrm|;_JYehQCp)*nj6c0E2rzC)4qKZvUJ{`t)PKMN2Mli zymX5dg*u;w)X~{mx2Ck!Lf2{wH^EXqYqMo@h&u`~u`NEcwx?j!6&MFPDd@+27$s5r z*XGw8+`FF;PgQ5LyARd|Ix~-y`6L2=eGdzfb)p5dv z$(xcXV+(iXO0yF02gmfeKH3)amv!9ZavV!%?#+|90~}s+2bQW&kkmgQkAUoD*Y(R6 z@0m&SBu)-4JTOu2u}yo6o0Sxr7VbT4$Qw~_hU!f7f$ zM5{KD)ckU}c7l9>w~H`3tJ~lZINqkKQuboyZr5)1|Fr2mFWHpx*;++c3}sqNhE4&h zc2P7h4F*g!mt7h!6{@{jg$dN+AEU|cvQCFz1r6WBcjS$#ld#h6l{$N(;iZpkF)7}v zvHQ`xcjdoNKd26bmoMd>s)J}=Lg;xqu{Xvv;qx1u>uC;)6xSbXtuQHOtv_&gbrT3efw`d*Ns!HDoQmk%#@@}HPCh2GV0uFKr)OME zZylbp^&D!-b+U)NB)>a1DCCVJ?n;~L3N0VSAJ~RflH=~Y3)Iq3lQPBA=puIszCS#_P`^*mtwS|-hbab z6=O4~amQVdUGwFt#Umtg=G{4t@ddJzl?=(@3_kKA@QM=KY8t8B^vh!Jl&v@890D8G zJ`XePN|QeU%B|?IzTDYl(z!Qbe?WXG6XS%i0|3$p8;34G2B+7I1o)B4hXYm3u1s?V zs7J3R1N2OxYAj6dT7JOThbu6&GVkNdzOTv^Bd4088FRCfr5&}eamBRNI(FV;itCyx z*IV0ymNK|Bk(4#j7b&mRoor&;_Tn+ctmho&!%fbdv?BS(O;*u+*Zcob!3f7}D*`%K z7@_~vIgHaOlsUKy*Q?#hFF7o*7$?wTD@5LL6QmU9svzq@G1IisL$^bBO2)Y5(;nUF zS`W7Iqmd2wSb{Zi-Ct%TF`z>V7H$+z!Y@9rk7*;vi+>LM^|IXQq^kvL$_j0BAM+kG zgrJS_m;aVW#r0_vdv{s@D-;r);(vB8M2C*ZfvDjf7%C z?9|)y+$3p-HLKqu?7s9Tp84yEog7CBY45HJy@1?_1-1%3q=VN&pLTvPj2yKN&3Y3s zUm#tbGdhca+pFlEM2$-`mU$6JvQ^N2OBmf^M@iG_?kO5UTbd4MFKEZ%kBLXYA3j{R zDVp)#ir$_@)hSs{8LP!2t>zL-MxHeeNZT)@HModbeBHCFQx-gn1K9350K}bp`Ult| z%}o-RLk;4bWs%JSt2h)1F;tnJ=7q0-M z0Iq_*&e=wDuYj5G{k{}{yu0TMN5Ls?a+{8!jISfYF8LRRX^dRc)yIPokf4|Bpq_$EphU{j12`K}({MPeALKESHrqFsp4=KBQEtuqPF|JaP)>XfFi)ogtx@fI4OQ?@NIo#Z35Fh$2D@ZtZW} zHL=sZ$b2bLAhS=bZRcv>V@nWYo%q@BHh)IYs-B*tJ@)<_I1D-g$GIy+W*VFV3gULD zF%}3xOGn=8+Fs}eXP0DMvBWCyB#)J6f}Rid=4HR#&DyKUJ4{4Fo z!s+(oCM9M@E09vB)1hK^)}jP(fX{YC&xY8gT-U^>R${#e0tW2p!16lfQp{^JORUxd zvTaMdfV}~cet072P--$`-vXeY5XLslrvFCQqzNS^_@p@E*Wq~1oT2&J&+8Kz+nWZf zn-AgymBhb|rKU}zfECJ4jG2#JXPXd+?tx)uma3Tj04;Rs;Si(4-GEvt8nDk$EfPG& zs3E-Sw;Pf?3+s(3Q61KZbIAb=JMO)?73Qg=WqX_osle48#*iusYr6HcOhKSbuGU1X zsw_9o`(O_Wq3<1FM5b>i$OY797InMYYVtGi!#-jKa6Fug1bW5wo;paD84uK)aGz#@ zCM_HQc4uElHv=)$H5Wm*%h#~0i%*Q1mS%`FC7f(J=2DD5Ygt7<#cU3zWfmbjxd^%r~BE|_m zXhKmbL*S*Mp7rnR(7(n7m`k$=H_Jjz`%DM4mpGuh~!0}3x3ErqHd6_WKMH^MmAfO9%*MAl8t3XPX$onQ1 zrwgu&11%Xhy2(}637~3GkFr4L_Tl0@Oz2KRQRYq^n0#1Sb5i4s$wH>bA+G|zV}c#dHTEbKS1 zFhE}kQw1$5sRCKr>bo+qdsige6rrc8J6MAv-c4z1A2A3a1*;9X_2jf4D+vTl;$LqtGP{&UQZ2pCel8RaD8fS6a)3HLSc{oqjEs=LnCMjQB-uL@4 z>AAvhl^8h6sr$Dsl{Tpu|Oy^rx}98#|Z;Eck;P&yA{~;GtLgX{p>n zdaYgI3~3IU(>2~PvsAC)9Pokuf68F23c6Gb^7GZw@u5DK*t3A82de@-=$o#)d)IG0 zzpZ%;!3Vf4PuMnD5OsHmsr0dpHAW5rumSf46*$w{x`0hF4b61XoO#yi9^sklt$G(1ht=;>!8tG@#Kp;H;)MEL?Z+TRus85{`1R z!N^%}UWM?J(xBv-o#~Z8$FnmH^ukPzYfWc^!KY*mjMOFxd3OLMf(yrWS%{@h(jVdl za`WEjPxgsrT1<6&h|{{`bu-%goldvEFgeBxR)x2=q=zLWkX}DLHfs;K$w&QPFT=g0_TTB&~e82L%qKB=4$tK3dF zTjlyrjk^V6#YMgJZAjIkc@!Q@Vb>GhFN#YhSxwQrdeRnvfxQtKd8*?;2y()jgC z3lm+KMOBYYZo4Er3#3;0Aph1PVROGPA1p2$l3A{g4el5Y2&cR}{%F?QR0O10F8~Tt zu>pD-yWS7AMiWeSHxX#Du9{xs5wZ?&^s7kXNjndLi$Ct0Qtv_*062O8MgFJyVXW6T zKs+&m^jRuOZ%&}PuG6konH4H?OeZMl;>Ud(*3P{&%1Tnt^-Q_rk|eTs*(^W`bz|mH zuAU|~{TtXTO)2TBF$WgvGqvYHcbYoKGqw zBuc5ODbv+}y6Sd;U;oo~3_#69MQ8#$o}W=?ooHQupoX2>A0~ zVcCCGcROxF|DP%gX-Oe=fai4tcyOaUX|8KW@YIb5p8D6fYP*BC-*$8mR?^3wzG;_% z&`_2fn9mp3_jE?gfcPYmR#c0DFnk%=VfII0IfjN5Ywwifc+@8cgMtNw?)_*@VYKQ% zYos&j2B#P#pgQ>HN0;Z{10H37XuE6LB4=-mS9|q|gMWOSTUO3<_@7rPaB9l4efL$t zG9Pf*2R_R*0a{#?)OEdoWU3$qMaKc~;xeXdcaykJd&{MNWFqTMZAF3CE>LA8JQBY^ z3;uxm)wdMJ+0ec3jG@#}X(?CJRDFx4qyb40IW@_ZiHHay_bq1rF;Y+ zo|LRFcQZseLPzU$(N^HX>v1Deu4V_QKjPS5FwP5e8W zEHrQk8a_P&Mm4Kzw|<_odb-W069~;z2s&F$PfkJyFj_|{=;Z;W7h3@*qvIuai9)g` zk`&wzp`h~1CBVt3P~dQO?Xw<-47OQH@2he~u6+4mc_Lu1&sCR!12BT+K==3UN^ew1 z)*8?^g>2`011c+5OaLQ54*b%5@UIth+A7L<&*2{D04@!-rq{iP8Ysb=Cuo|$s>uKx ziqi>s7Nl<-8fJ||j)A1N;90~(6KHZQ0b?fBZ%lw2?w^QMWXD(I4KG)H;FL^SN&3rU z8JsS(t5Y)Wkh(_Nmjy^?262f>SL;VXgWwwUcY`77#0!1kv`1 zMV(q;moKm3I%+tJeRbfsi0^7Gy`UXGD2xmp;@l>)F-r@Uog7|rq(emPyM-lW4P0=e z>zPsqYQm8966i5t_6s>t?f=)%{%dZU%vZYyEkFbd9l{xF#x|!!$M8+rtYZKYeRrM4 z8VB^Oc4i@;$60eI+2@|x2FOCW)6v5hFZnfgOHwz^L0FTcqlT9h#|J+A(D?#+3gFrj zU*|AX$^z`aYXVn~|BSM4-H!pTn2*yrSFTb3d*ybJIrT%oz#@dN(n<~MzBqc$&Iq1M zW$kz_e2A34M?>mvudt8Qn%lPl9krZgS>Y)9O2uE1d-9NN4awp*!AlHoI?ws##KI!O zx*sgS9=;F^7S>A&!}lyJ>OK-e#I~i;$eAkHZS>j5==O@Ags`B5n$@8CU`EZ<6PW1q z6{rzaUl|Mle{dw$4kftUg67eXd=xONss3}nUIS;0orZ;@p!orH{|wN{o{j|(BdzGm z9YK6qYG89EXve4ZcD*>AmZq)xa%voDi)dWdE>jLLWDLH4%^?PHW=3m^D_2Q{2B({i z>2{}@di%~D8srf1m@9AE#_hJ{+6OH8cVtWaI~sB(V#22Aj_8OuWaGteI&{yADcl{o z#iRb&3}PWOx2NIMV@0`5mtvtdM8zt>0?~A~CgDk#aoe1hJ!7nFf^ok6dB5;fxYTXA zpwiW=+$x^8#$|%S$KS60c;O~Sbqi*ruh-W^Ism0=kG4kemk7d|uGprAItFq^fP_+R z0MkkOgtT+yRW=+`O(|1Y=JzNBg(3Mo{}c)8nP@(b)g5iM1sxT8^h%S_mMX;H<)1=b zqxKnnW{>(tn}m(|sP%`8=WVC$*;QWv7IQG%Bh?d5D@YmgZU^QKjGQ=Y0%T!n+xb@{ z2Z_zP9lV{pK5(Pp5uJSAW40_zhf(PsJ36HxJvqaT9hFk# z1X6fx^?6yb2>}^cwYB9l`z_1R&9}`VBUq*24+zUPzh+b%xnH|GIrDY8+M7JCxux3e z#^>ByWlSqPIL9Pq0FpdYuH?>bbEfBW2X*UEglDN&ncME5KT2Q73}n|Yh}i3GRf#&* zDcudq+g11Ld!Ov%2xeEBVsGEsMi*Y-p3pXjarB101)iSDm z9~$Do4E-`Icw*#Cd+~-Pmj8Ce!N_;;4~HW=J`XzPFI;u(w4aq_zzG9u|JEMSveFWT zU#@l=a>X~7{y~1R`>uI*VhskpQyv#@&ROLiAdIHD}}j zHwlX-dBiegX7ad|= zo@}qIxPOYHd1m3Dr^Q3S>QoCBongg#Jjkbl6BMpalNd#{U~D#_vB~?r$z9rfm0T`) z2wMFh{8pa}mEu;1igogMhrC(I81{hXnDuIzt1SiX3!eWqNDjas@P4}08A+V#HiUkBpOg6CHk0(m^HSW^F$kHa=?bL^% zyH*SK*#f@kV~iuagml0bX#1n{+zH1C;H;?-qr1>*3s6Ks0BUwWeuG$>ZY=!AZF5ca zO>U31qO}@Y5wpC=6=S9=B@wHe-x6yRJf2$UsysnCV(W~QOBIZ5y5ICT7`!RrJG|;xK8U6U6^>VoGG-&1+sHVNNT5#cC_pV|r@()4!CRGnZTJuhatp<1(OctJ6 z0c~>;a>KoivRt{K+cR5B;ERVeYU~b4!qyvpbVT>25CmUz6denn)636vfC z#K03Dq@IDS2_!tc0U-3JztgK9=SI{4hU^^MB$+ZnoEoFD%w5h^FG`wn&^m~{m5W}$ zi*Y@)M(c1?-~6Mh*2TE*700V~x-~CrI%+t69pl(Dp^71i2({PPt!0#*;@>;@I3;l` zo%ELId8V(aFch^nm$1}c`#IC93J}qo)V5;67Fm*iVh>*RzptgW@bf)cLD&hcmQ9;4 zqx9P6XNRt-PlEn4;Xr!Jj@*jtpXCak756L(BUs%UFxjg*0q;cHT8i%T=PvJz5W9Vq zXrWwho&<0oll|Q$T0ZsBcr_iL!5J8kj8;H$sjl<}Jz; z*J69r#H~*O^gPZ8cEld}BA@ex6koABC$zvXOg#wAFAP7buYnKJCf6Zf-2_<#J^Zp#3?hv@M_h z_w88idro(|{Q~2wCZ?=_=;NMo-_ARru3@EjOn@zi*91ohmL@-$?SPh9Fy7{055q2d z+i-WtsPRllmaeio3Sy{lUD#T*Ar;bFU)MA~SXmT-j-Gs2zXZBWzCfqaZw2k5oO*!7r~yr$=nD^+>rN&lezh)&?hr7&W%o(ViDgx~lZLc4oLe#j z$w;9!5JTBc8u%1>v|zkMhi_J0vagKk?zxSs)k&{AT?pJy;i0?ta&R@?OM&~>^&b(8n5pJF`qHaidm=r69fsbz|NcA4 z{Pk6l*v4UH1`lH|X}c&#yX#wQpMF7EmqFbR+L}+k4SU&)9A0*^Ql`T#4-hxb{j zdv@tT2@BY?#-_iQ(IYfA!|h6@V0Y^Mcw+i*W(ID7veTtPXDhy{ROgbP*N^okFTz91 z)@kXrZeZev*6ET`=9KxGRK_OsV{~JpZc%!wnPe8uU54|q*h58@g08;YX{Yj^nQ5rd z3L~9M%BtHpi}78+m+c6HVf1-BO#``kp1VUlw1W96oA+LJsYWulgq=<5V*@!LpeMXi zIG^Z06jccSwBrBEniSd5XfznCm|-Wa;{y&6Dd?I4^Vt7)mBCvo-&HQ_oG}slbe`+-Qa{HCX zJfb?T1!JU}OSsWX>gXy_qLo}=h_{5~wO|%agP!Z@EX`QMJ?)I4R($OpDSyUF1eHI5 z`bHDQ+JKD>Gns#3%_%E&U)M>vVkN-5Zf6%={@Ru;01Gu2BP+LimqCySwPS_Y0P!hwarY6o#7UZjdk}N3 zz(db3%yGdi)Q!Nr&(|R>AG1?nKGfOMYtdyfx~QsuMtBl&lr{N=KCrLT%?o|vBqpg3tX~14Vrkhkx4nOYq-ix+O+SEEd^UfHCL|j*-nkewDPN%A&1oT7Y$M$thLgQ9Y002 z?V52R!W#ZwwoJy;N#rRFzkU;+Io;!<8l01GGwNUX@53!%QAhxZ%$wmDa8+WSPEUw0 z=7eh>(;;oDn-X6LZ=9}FjvPPrb!g6NI8w@;86HaSCOEha(Lq8%xQU_~8$?`ZM^o6G zlP+qkL%5tx#k2)tr+aYE)2|Y@QF)N%RyAo8Z5L``I=u_cZI?pztnjh;&}|{mjx}~W zMl`f+8~7#qVCm5xp>DkOXBAX+4KwL+n2FyUoAl@@^77Wj!UWM*iqx2hjhFZO;E|;L zjzGX7@>6u87CzSe_LuQQZlf_+4hO$N0a63%DjC=3lPOBV&UA2{78lC4?%C_K(%!4lO)GaqA z-k*D$PuhGTyCmrC-9Wu=fbU3+$hH2RO!Tk9KczpZ>L>c3y>Lv`c>#z5cn+6wZ~DJ) z^Z??XFpP*Jn|k2%{3Kyv7k9pP1#x;W?7H4B6+VwW49crrrJI!!8B8@a%(*?vHffbiv3`A^_)fkRq94AK))QkwHy&w|ZBPpWk!A%OE51x_^8QPPy@kQ%$_UQzY4)Lc7Toa;L2#S;k;>k~?Yr)YF5S=O@$6PM-p zRt)tWQK6?)bGhD30EGc?Cbx%8$Doa{*)E#FH$pqgWbd}yd8p6 zqTRrju%er1B;2#XKv_|XslRKKj+-gCc*WTp`z-3sRYsVf?_ueE1~>~`G_GfeI`2d1%Rmx!SR}{Uh#6YHpb+QkW6YeiNX6mtXEvo za31}lZsBGz?`z`Lt~J<|KR>0-Mj^uN-{iunplWxZdnbSb-4qHWB|oavJ5&w2B{(Ji z>;B0|NY+cN{GnBse+CBy!drmYnw?_5NTnt^7JN#9&y-?IBsU4UT-P=1x39a!2#~)Z zagMga=hx&pSZC23uimG9LxaxBhZ`u%Chcq8*3Gi2L{}!bYI$Y%g!epdDV}e4%c^Gc z8uU=8Jl0TGu-WeUY~KqZe_Os=A+LJBuVLKAP^s40$n5 z12`r`PU5 zOfNUcQF{W=@w4LRUV#nCxz|~oU9Y`CWthQW_a&CMlDi$Hhk_XLV<`Y8#!TNMN!?FS zq(eI_&3#dDd5Fh`HDF;PKS3GPmb)d^RMBNtC+C!EPD`rvU#o*_*rd%Y3kSYa+Q-=G z%5U}z=++YXjkaCIC3!Xd@=h<4F^1wid>Kec%=Cwn_?61fJ)QG6_l$V24)O&fk5&e` z@!ykv>)EopcX5Lv zY1UiFy3DsdGPZEjASm;vl$9NtBj}RO?BKqhk)AtuH&@ojv-5P3PqqM`44DuEY1j-~ z6-_VUqi70l{QJ(vhTRf*6dusi#fC)5Epb-MUouP9Dv`i;_r9MG?#J@Nl@)) zJ2T(zBFbEuyRxpT$mS3snP@O%c&tB_T1iT3oUzT0?Q_r4!!>{K9AAy@3-bsaJzeuw z8{f?p@O$xtYEv(|?q%ZGGoDT{-{Q?Q9DYLS6qg2)jg}p*y)?5y=_9M$gxEQC=ax)M zJX`O)bW>ta%-iYDB4L@FkrTzi^rLgKG$!Bddy#6HyNRJ=A7IOH$gzR#?}G=h5v~>N z>g%kwQ^s_R1GRRe^leh55b0A6)lkIhY>liWyFmUm3j?4p_aVP~{^>+RgkN+qt8Umz zns0q*$u}WKi@EwvnH>Tf@t@$gUK$|{7i>Xs+9#fj9f^7;X0V{Gt}Z3?_{VF`^z%Lo z)AT4v&)g<{Phk}N67_AI`o%Y@=cuuVnwp+a!X64p(^3fYZzcy(`2i|9@CP%pT4pv!LWKweBkj?zRDqXL7%(2 ztl0+R`U6wHB)|XjvNy42Biw9F+#|LeI3CxOZWi{N#+9=rj`nKJRn3W#CSIPH{QF;Q z8U{&ZZp#=meWTp`Bb{057}WhaTS^=C?j&dZ1Q?{B<0ONsOvqb-vT% zP*$z)LgD<^0rkoH%1!|lW@81CA)m05zrE`7XrCF`-o0Z@pSz2shH{KYY)IR(-*H2n zzgv4K=2cgR`C>xn+V6e{aygaYWAmV&9#^gdRH)m{t&vr(jtx5m7_%N$ht9i>BOy*} zGgsOUm9Iu&Fn$(}VvG#r#A;-&H78n95E(^B=sSP&eo)h~s6K|Vb|FDirn+ra$-=D%@fK7hH^sdIW@jVJyFV%+1-CTy ze5dA?O_z)~xqg!ZIponJuCZb_Imp?Sw{#V$L8};IkSJ3k%XYGYZ26E<52dB8dZ$Ch zs(T|GavixZ9R2~({4 z5BJ_&>`BZqzPP*;f+2eHh+1q&RoPWdmozTLS}tF3{D%%6qWkAwzVn}`VN6*(xg3a- zr;T{HIyb%N35n*des9c0&MgJU?AZ`RVNbG6R4u5$GF*pcHafDy#w?m_j~Ho!|yt8kua`pUgmK7p*CA} z8(Z^aOar>Fmp)z4$G)N6;zhkuUjJ4&IN>&AUu)QJdQWz@yzr zP!RzEvs7Jz8+};J$ZGQKRY$iX_GTSj!z|E0VK5ABq7ox%TzJ!ZIh*v!=8)4fMa%Z~ z|GZdYGy~3fbo=B7taNC)fUMu#NcS3~rDlUKU(2ymhc2cIu2fQhY6?}eco{h419C9x>u691^b<{c4ukTWg zxUcTtJ2q-H4u#P7?I8{?6@Nu$cfLN!DWAJiUo`%NJ<;m%Y)&cYTTPRhA1tqK4-+pT zB$Yw$zhzVck#?fryt(~iPbhj&!IqSXl)WWOCn<_P%qgY>q!yNg=eyK634q}&4sB(| zZ0Dd$uQ+abV;qp9RzgW(Yc2y8-ZyRKmkv{roHtiVWoA95h3EBde^msD%5|UquIp-8 zT;#P(x+)5FW6pqYvr^%v+D9x)Gh6LQ)d~W)3DsJ!8DoZe|7H!#hl!6!B#gz=W!+=H z<(K|AV^k;&ZLbgzV7c$c4j!J9z;|Z%_?u4|(=9w~BLRD&*w%J)LnkeHcVP zELg|h%Sr7%Nr8>-z6FodailokE%7xuTuBcZ08yOEQrht@-k1yaaV4^2%60l^pg+(w zCs32k%=LQaY0yf1&c+S?y*&)Vr7Ko?N|~=YfAETXrh`Dd0WlXKb>Y z$`u7gI2=2rVas*#_cua8*du$f`01aK(WI~o`ANos7V`NAPUM76fh9r*Kysky!XM*W z?6D)O_e+YVM6+^?!R{YgZ2q{ln1W4daEZ1R`LWWs7K?RLoV$1?R;inWgN7BIl-;$@0;+J!|km`xV2fB94{#Se;4}t;(yg%$% zyXZNDKZS15vV3jFh$R+)lh*(3)wD9~S_FMiT(U9{CyORL&dQc3hFB%JXI%5lcC1-%sIr|=y%KI|zErS% z?VamjWPm#`K<%Z&Nn;6ST;U5rVmXoEKC;ap1Fw>7zRI;#<+a_Gm!F-TMCT8m%7GJF zAG1TiPuhn1)E4G_{P^eq57l&5sEA3TkIf}rmmxvA#YWg&Xtc+|J0%@5f;NQAdOC`7 z;i|&4#PLn9KU-^^%}>0V-WlQWkzf52&@-+s!7UJ^eD1?k;NZDQcjsAK1L?VeJ185o zIxy$$XLpvZw|xr!Yq@sx?;dEHS${4?M)38fy8-64$SY=_LBZ~;q58f+7uoYF zi}}ol1`t-_HEm<2PmTtfV_J*hyzz!`sR}s_F_&w$X6_oEX_{>Z4lB;3Afw|xoC(mX zn=kD1EBD!l!yQuSMUEJ=i1y8zpGVkI3g;4H`#5_+i*pDDae2C%irf=rQI}_aJ0`kV`#Hxi6c2g{#YwS>0JH6SLm>Tdal=_kA~ zaXdk5J*CndcR>d$dsI8(G`^87bt`0h@Zg;g5OE(t4DtGJIYR&)OZ8irevbM5%Ao3J zycwM9!C;S(tStE$rsUuQmx2MXSs$SJ00MwieNNRNfru)N)ZzAAeJfWOvssltn_NSa zsy|w7qPO=ll#18ftKY)Bmle!72k{Z*Z>81Vui4CfqG=bImnU9E7s#v0Vg2OyAA$z( zpB8q3TG-LY%cpoPpVS8jhhFVzHYj&6AoKjK_6hLFfuW;H#>deU*``#P(ZCN`M)X;i zkb;=al=RGoAW7?X1G3$~&BDjuD=}JU0bGu?&&R0}gRMM#oOhhg7dwSbN};rj;Fzrh z#=h9HG#uO&*?&QH{f+ltnup}G1NDCuY_i4nt!=jNt>i^cVBI^VR`WxRW9kACL>?l9 zIYwQLB#ZnB92LpUX@l~)y`)OZQ*;UTYWUXDGb)f~%eL#KI+7 zeBrMHa-{QFCGUTasS6o;Zx%(>0@}rqFOxc0R|Q`@+w^3GYo?|sf)>@#@`qCgGbNI$ zuACsG;0>o`M)fU;q5Lz4#63l`rc+h-3hF6_ozxP3zLA7TdcYRJ4ZWP5CZVl1=(@OW=%w2R=fHqbk$}K6q>yv2<8DbW@R{#3Eg)0Y z9~Kv*v=3RA=1+l=0I$bOk27&hg^PtAv-RnvSMkaUr9~yU0=}~ zp}e(bxIJWXoe_2~y%0+nxmQ^dH3<7bzYqh6+qQF)G@jS8mibVS1>a$3%S#j7;l{C zjlg0K-md8TDT-$y$WVsklr68*v-cj#12>s%g?YU+yast@{BGpV-6pnHE&zUm8@DyD z3c|@Q7rG~X8%WmaK+oF2OWqmZ%Jl=RW{vYUjo{%r|K$a#cg7rZtuRpuYZ}R@UhN+Q zqx;CjB8qV1o&1IWwJ>(&%V8KRseN+8kJa-x^O&3BOdA!`bWk76BbA;644E7>n}6dG ztS;=GTecZ66vCsUAYIAz=q$feL(nPEyI@p>5p-56B>AH1(JOr1tjr?!+6}HO!9@ea z8YD?zJLr~ARpZwe^InV~IA=}v=piR2VdR+9onsrAwcYY)(xVr%1N{R|uIq=VEJUkj z%N8@tX56Itu^$`uyy|)p+PW5+dVab)5mdTG)5^lmA6s*fOhFXtbJK)140qW2l10E| z&?feoFAyRe#5)ui9|_<0b#|J*F_uIoRs?IIiRen+O^2(jVNQR*qVK;C-udgL7cWmM zGZ!Q=Lwcs(wT{#vyb1G233v^LqwQlXWmj&%5l@B+TM8gWS zRQ<8a8?y{E>V_H~s{(qowXPxtE1zpUf zJXfi1v#9;vxP~|J13V|d3kk>Vo-F@lyX4SPi4p=feRdwc@D(j*JdE?Sy2Z{w=V*7B+1$Vbr|RTt3j-Y0~zY6N(76`tG;Jia!jp$QP_XZx$Y2X z4OMovJ7lo6jY~9q-)~LvWfw^3gFmoMRlP2Mn5H=Q{`sLXsA>Cd@`{$E$Ua~Q(!Q-B zqIk%Bnh@Tsn6~0Kcm_K9lq83*4c{?ZPH!L*Vq3P+_OMz{Q2Q2+9vk*xR+)|OjOL}Q zoRh3P^h;^er=J&jf5_YMb6MYI`Ecy2Xp^AJ_5b`7gqZVFjZkmIL9*AdC;sVHrd8b! z9;ZmV&ttzDBXq>u{&|VrYHuMrwsj5u+_r!Oe-Um}fQiB?LF~sVr1Wjn(JjnBgD+7-8JZ_Qr${OEs%GeKjr?SCd${ht8^>wW|! zZ^nS@BI#i`vTj6fr|jc;ri#`2v|r7#$WEp2QLVK#U;Tsh_OQ33F{kC|&rxoEWskP9 z2)4PZ)k!sUT%f-Z8|Lt6gW?5tn{5y>z;}5f?81rN=o!e)FG6sWZNFdon+LumFg}cj zS_oTwQ7Z#Vc5ATuj|(i#`vx2s#1J^o+W!f4!V_IW{MNqnZ{=fsaM>OvH1x-`L=5t& zLd6C+!rQ%TRt9Hk+X&};?Eiy4eoa9JCi&0plJ~M|FP1w64|Xd2_M)l2L3SlfMnVOY z8oLjbuC&%})+!@o5p`MJ3>}Ki5t)Jo^4Tx2sD~p3W-$BI#rHc=50Fv-CNe48O2;8v zF9htht~J;_2je`CWLZ^G9t^FQ&&muw!!9uG&5s@Sb%f~-h*%^44-AQ!+G=zu8cvh< zr^{HHMv;Sxz_7da!iIFL9O_i+r)e0sTpJwwG#Hom6Ci->;G1M zskHVJd^q{LY|9fNdhhhVZ`3~0qr&{-7YwcN(JaBh*4%e7%ff)RptA($5YfXpqLHa5 zJI$=PAU*jgb%%fwLKZ&!qDH**VjZ0&92UbF0M6=I7V%bCY5th%^apT$6cV01Mu3Q# z`W7fBfxQmE-8tr?VaqlIM53V&eZx<-YA=HJSvfYa3)to?k_m19*rpE~8O^^ShjhIN z6NlrqxUfPS#zH+4>&-y%ebKz`pf8Wb zR+tr!2u$uA{kT~lTJy^M2J>k1FGB}Y1kdkBU;H!5bGGPb>L&tcK)t<(tM6KXzj@z2 zDrR*A!LX=Iy@!QeXE)E~B$0sS$N!mny7zEI@!{*p-^~c%=5>nm`!b2)=t_hkPbbLf z4%M7!@n5x{Wo&s89zVL2|BKLWd8R?CfIVF3j)2Q-W}^bxA<{Un!u8xm>iiUHa~+Xz z&C4x51#9)@PIe)myUrb+(TDKb)v0A`gz4f5EM2(nc8WWVNc}NByek4qq}rSkv1#Cb z?FRJSK7&jc17%Qo8OR+8i*c?kRBzuUr?muaC}`>vCoHvxTt8NoTebZ}-T;9Ng zbfv}eHR|4?F|c8JDM8VJt@%(4W7y{UspUp|rwaxW0b-x*}eahI`Yn-?y?}OIT0*!^^#KlO>4p8=5s5VuW6 zCG$zMZMgctpZ3H}kNV;ZE(vXfTEIFvW#fHxFYn+)G+Bp^rO^#|3m+bf)EN3-0Px95 zdV&1vapB`B_6~8rmb!+Jqb?8kKpF!gUTq(*r%iiU*xzC0lt&ak^L=<`6z5li zpbsK7vN{ZFQC}{C{VU9&r*pe_MCC5_Ti4|yW4c?TaB<6nErK4yiOcyPyXmd~BuZk3 zM^^OPu50|aQziVcY>z`#@>squ%VnF-CdnXBj<5O~?k`U;2wDCJUV2aJqdzrP(^E*OZI@Y|T^3_(S4 zeeJeAismO~$sDYP00EEon26$CrNat}S$PGnTwxsYBLliVx+ClJUlh;i)74u6+FKfHdTvF$xqFWW1}TEc z)^x*X!qgE()w(D|H}*|{FJkb1jha;KF&Z&LQ?+0VY%2*QHFCJXu*7f(?)Hu7TL;j)*h19W&uw10nd(}u^-M4%x<+reolxB3 z6?-)e1@q%JY!y}DHDxm!U`M_=Zrh|dp#i9K#rv2vme`DGZ>O{Hh!y~MDtDEpR zVZnq4>5`p==hq^K+Nu`6*nMV1^z}>R8f`M}?L}QKmA*~5M(XK$u~AIrJAxMunIh5T zDlP0|gBap;IpjsKSDGP9l4D4u(-7HKE-yLzbAaJaYTq^!+jcr)L~KEqL?KeKw!` z+vC>jAX0*$z3Ce3LLt$84N-GBeR&~~9HNkA3 zf%5Crw+nUwkHyWR{x*=_H|_0(bf!Y#ERLRcI#-yRXjJINtrlG4%aFC=cSmp5^h=EL z1>>#YwBcALDCv9x%uag_frepBgtYa(0Xt^o5^hGaVK?`=w?hpDMMz?`*8_bvfwM5Q zuocnNezG@sSF$VKx5xM@Y+o>Pdo9N$d%_WYZVn)Eo--}Q&d2RQ zY(CrfV|pr%aN+{3TDQ#v`N4Q))v%A0(A!eUg?5nPSNiJu%MB z351(GzzoS|!ko*(vByIkTs{0y@jib5Pwqu#ftbcA+fsG4v+3f(>nR((TD7aW z^R_%CgARBEbSgkUpeb=#F4tdE;Bz?S)KDi%tdnBPwln%Y_MnQ9=WdWve#O;0Gv3psH; zzuc}GjovP98ZHvq+S&8(YTVz3TcFAPrm!t!kPN$j^s%PWm` z@AD@%D`X%IUstvsQqX?rlsPYf_|;zFAZw2|)h}EB^PggZ)aO#7ujA0?pLmo*zR$jO zFL$n^+WjkyF=Pw-fC$%f!(yWxQ>Krvsv5`16Wd|{CdDT)J0xot zu(~~o`r3CLg-J$$leAp=hR9WO5nl$kil%2&eQ@CDQHtM@Zu-)=X0Ah-Q0!z>UMV4? z7)q#T`=`_1N+l-`>ty+xXP6}4yD%Dv|6tTJy@?_Q^4v-AOLE5E#SB}v`8ywnq=K_U zpE=~WIxCG+D37+&Fwbpuy0c#bRC@EXLYKw#g0#-{pzCkJ4Z{mwd;AZDZ|q^O3SgT;7+o}syB@G zx~DnG8a5Djj&py-E;)CSIn%7gt@Kc*xG-NsX<4+maFKoavNpyz-ApHJNoYo`+jS1^ z5FiMph}A~IPtrEw zt76PTtn-tpZSl(!I4%$;s4nxT(hJY*1UjaRZ{ebx-!)z7cjH24E`#MRiD#4<>n~>A zvO|*1CQ?!mwtVR}T&g@)mUF+tE;+Nb#^oM|RssyFS?OO3KN{Q)d{=0zb~pJ^Sp znf3K@E!>YmSm>vDkBlpNQ+Z%uq_ru7&tFcl??hyD#+BG5FN6z1)HkZck0+=PAtn;1 z6T4F&|FnhYpoV8%yov2{VfvHH|E~X%uWl*;q~9WK*$TvLuL?Z+T}B9!$uFnEgb|(k z>Sr8P-DoK6&O#uC_F+HwLnog}*}JcqA`%6UPTy0u5iwrIQ%rebKf(pr2gIOb;pz%#~_HejnJ3cTskK; zQwP(amVW~M+MH4aUXV6iN6Re^5~NWe>u3RdEs zpExL3rxb5bBe|Sq@8}BhTsf!x1jkSjFj%3d@EssU04f#^)g7#pgvT8aR|#J#=ma9= z;6&tu2?E&xB~q~>_IIM${sK}v>2YW`1Jk!X%oW=P4vFtJF@p{-l=ulmA2RI1+v`_W z>*F9@Ay>|2);V2vNzs<3ij1jV`U-o4LKmqmbRh32E<1bhMwtBR5BDnNubqhcnqsdO z4EHSDsAm0FD<@Qt9EB9P0WaG3|yejoa_NS+U9>6(#(mS{$K2G4Z zM5(ph@6f4J!rqK!Ii|^Mi8py$o?RYp@9ErlFHPD?Fl@l?Eb3JxFlM|-7|1$Go6s2Q zO?`6t-&4|6_Xo)D-uB5z--X_uY3Y#6PX z-uWq+B~+_!_ts&_&F$p6-@&esnA->lvI!C!4GV*UreWoUpFws16oRwEK7CD>2LX2= zMS~&CvBwhbcp&amF8z%G-2+l@2CRYi`GjI_k(l;X%;(W!2y)Y^JqtpIfUrrlbCorC zY@-}fP*ODbsE+Ne%Sb(6d#S~Q5td77+_#)>^nutp61t>h&+BxB14$q0yJ<=vs9MF~ zFtDyrsx7VXNXjhL(tVQ)W3T}r=$f=RGlmFKY+Cjzj=u{KF*UD!zoICf6Ees<=^NX= zpz&6xWfw?kI&1*q;0?gl!PAjXaj&HHg%cQ~*=b^FbxgBW|CKJ!P7D0k5XtJ1dAX{3 z4BU3$H~2Da=;+t~L){n(;d>QsxQn_9AC3I!fXFDxMILVgcA`= zUZe1}FKq5dC~14g*DGunfqFtMHQjizB;PSmYlbjS-unML^E4Z<#XJcHZhhuwNEhlm za;~I(S}keFKN+8QOHAbqT~Iwm?Nn5MDl*ixT3s2;69H=+lqNxMn|j-Qbiu?%8J`%C zYGilr)BMzZ!i+mXW{7-TySRM0#GBtnL_Vmw$6%`>f~cC(siu#O5NtB|AUvBm(#rnT z+FmtqegOqx^X+S>Am~4!<_>&f&wu0@Kr&80j+)zetEAYQ|IjDhIf5mp;8j+a7-po6 zz3m_bg0!x-H4Z6%6GXc6#NBh()jgM6{pKG2Kr!@Ep0@3i-nT_r2@VH5PAID_s(o^u z)B}GNltv1b=>xGMIht+|`DRk1X5JhhSsZdgE?@7)#VKes-WTsug)xQl1;vA%e3~WW z9#SSRI0U-M8|}2f!+h4UkBM8nSK)y?NB+^PfsfjpCki)Vef0wD>*n$AQCyZRSB&j{ zH92l7yNDFyN7ze^bKiIY_Jo9VTqIkjTxYLm-6en7Yxd!9;JEVTE>*ltiI+cY5es6w zwP_szi`cz$F{?|3RNGcm%hNV(_G*L&>-l1RR_c$kBjBBh2Vd8uBkWvzsj|IQ&v)t< zpw54^;(tRbS{nf$|9F8~um%a8>VX^TF*`lluV_d?g*PY`jqNbrR7fp+NC=`Q-TQ;= zi|55y!?dGP8xl~~mA!M`>u#T4l{jJ%r6o-Sxep)SAG%>@qp$p01WMpuEqT93C3{lE ze1(1e`k!Me9UAU#>R0@*+sDT`tuEx9JMg&2-nMx1lAqkukpVH;sBK`ms{IdRRtOkD z5u8%mOBwiPxwUvP62BE<72$8}4%7eCZ5QvxmCsUsU%CnT->iq+ z&BDX3Mdam(jB9PoZ>L(UZXL;aO1fEfV5(^&7VZIhmmOK z5Zkn2BNtkEbnoSCV9y##$E1#g?>kA8m7iPbiFFt$`)GDj7ieG?V-KLxS05(fN z!6KC8;Gh0B{D)YY<2{NK%IEPGr&$vbYr(ecH8_?9e1GO+GP?L2Tx+M`d)jtW9LkAt zz80AQjOl)|CoPav(d*B%Idz|pouL$|f>j2cA+ZgiVm*?t_jdCbb zD|FhoP)LL^2q=BDGngM(s{en^n(1mlavIm?vUdl6kJb@SBRY9I zH@C6dFhfSN76Rmf z;=uYXbDOF;h^=jzkLt(6-qS4~GzOPZpmNqKa> zrT#z|k6qIE&+|MBmd5+gO!t`q{P(aE8t!dN9f7;$_g-Ad_?IqgxF5VZ;n}_Q#BNE@ zE9YuV=Luxthfl6ZHY_$Qrqba>+xFCeVjf|m8{vetymUpfanZhbS$nV=`Ol}efSxkf zdt^hPK)SH|NWj;g&YHXHJv#m0=8(7KyC`yO6tOyB{+x@{7WC70*MXnbjUJ}4G{aD? z3Yb+z6m#Xf4)T5D%J8L;`xZk!t%AXb+NM)64ZJq@y zvxO?WeyeyUe)K6=3fUiZOHW)|L zIb%u&2e*gqmaHjw2Pze1?uHbQtY-Vv1MfB+`9xgD6RA)_B+G49RZ9H&evtTWb4-m2 ze4GwG{aByv}h|YXG20-ZpB(tcHY=0fN8=MH4JZ35e?& zhUsJ7e-se)Fe1NgnHi6rUYLDXIS-+6Y8_PtI>Ok2PLZ4^k#KZ=;16)ClX}IeW{%M$=txiKD2mz+C9crqDVAjwlrV1; z+YShC=%F*u77YGA==ZMwhoi!MB}Ax>+Ek#_t}7r_8O&W^V|;ZQqD5JtUiLYuxSK`p+5A!;n9escG6`LwF=f=8s zcrU3|&sB5j`gBI>nqj|{k~S zWpRK4{{)`Ub-uB<($kq0fBZm4?72+&nNraMw%O$-;3fOp0~T@qTXHA%sH&d=Q5Yr$ zb$%nzrjlMHcB~!F?e>Q*L;YZ)-)eM?O7pFF3Y$cG3TcJp&8#A1icL0GU_S0=jR()T zgH>WM8K#cj>MwcA*AO*?fBFpZYHW>CV!FWwY$)K~02T#+V&ozdCDD#IY%k9~y_GQO z)GSE1lznPF7UC!~tQYs_O@D8y=m#UGF5zG(r{@?haXTVPPKVt5IPCkip}$bSg^f%< zj^k1wI>{-EPIhWnsaX5xpZBF6dl=L?iVWB3cQh7|LumX)wOG6OV#moo{D>n2Iqc8m zZ~!kqV_&#q>Bd}fyH!ubla^zn!F5L|(kVc3t}(ntx4$jtQtA1e?{G#t-19#!mH5N( zWVI;@e}gA$eXPYAqtf0`8fiVWIqchv!>H8XLqZQ3n~g7rP{L%#YnNt{)D!Hjgh~5! zD(Axjn%7WP&-mVn8?AVu>#WivCV7quT8+qT0zfh;4lN;U*8Byjx$H!AOQ5dfr5`-e8-^!J~|>FsJ+uMu?FIM zNGjyHQ{Ph)kmVZD1?Ok>fM;|y3d{aq)ZsX4bS0p01Wj8CY;GluzHny^MY3-CX(k%% z2b~SRnJ@n0m9|vAsYpy7EbW$RRH8_}-7C}TeWl@uC|kM|M=Tij)9Bo0EnWobeGSO= zpX1R)nFaja=Acna344MeG~ZXGmG$r^EN;OVGl)mh6d||slny0bS~Z;4|L0Xn)>-^= zsX&@ut!VzsG$X@A=O5bZHIYLNk3s;A;9Sr82!`~h$!gvPE4 z_UUhvK>yT>M{tOqB<7V67fM=X20w0@p(1otgMgj|BR;2!c^lhx+ZL~7@BM{*EyeL- zcY@BPnFzCvfxS~A>+mO1<>OjJRvq9jS+k@@;TtbPW7Dr>+{_L2KZWHt`~dI!HWtuV!wZITm-JS?Z*Gf_uHU`&cioPUe9n8`)xYd$iMEO#p}%I5kX-_zB#S?(D#8#Bwje~Eg##eB6)zm%DScPt`L zJ%7NNG;q4B7|$8lLH4wEH72pl*V=1wd(N4lccYxFHuh{7#qXt0g)7(8*~VTK{E`wn zw?i}@O?>Ybt_P89-QD7S?>Eh;ItTG=KjMw(D+X7(`pXIwVkXs2XjCbG*HcL++^yuW zJyF5dn#1}*ail`kaY*(}WqsJ!x7zWBRs4!t^~Q4Jo4dG5HjPBi6!g10+g|B0w$u8k zscD`Uq2yh2tDhLpPbZh{5I12%XrrN8;_H#^>mb%P!9KKWbNZOQNTfUUaEVDP&P_6e_4+=*K^VkY(-bsKa$Bx57udBfuh zvAJcZ08O4>+tF6cjYdTC&pFr{l_Y20SM#X0k5A=3?NDiR=s~+?<@K^V&-bHD2KcE8 z56GzY+=JliEc8~&yfdeaRV=^u?pL?LZU?Q*(>uF=ldmKt7#cdn1gqUID<*tt?AI_f z@-T>Kh<8X@{IS~5Q>8#&lJ21IV$YA?kT;hNrw!o?-Y$(?wae@5wE|1dy zS!3)~PJWb_alDQ6pQtet1e>^SJL9kV31d~n{VQs^K}H1SwCAvw2iZJaspj0q042GK zCgD-xukg#DRm5|4RW>gr>>gNE1LlS+n@JUJ(RvdFg6&oHZ3ou}rbYT33Nc}6Hf4sC zlMpphU~jF&$?u~#Q{48R%*-vTrx&B1no;YZL2E*xGLSNxjaLsCFQiP z-Z6ip5TATokX%wWCzSAZIxZl-scj#gKYp+}1?mBn{ z_v?N$ASHG6VqEjsb9Rj@=O)3>cmb(LaUOfxgfl;-*^ z#ZOtAdX#r~!%`WR%-!faIPEhed$Xmw#sH}QX1BrDQXWL5ku2wXJWjvY%SB9 zDiuh2_;Sw@OLOhU%&65yfVj!%k0{+d&lA3av|?Fll+()^OS2hg5A~OiLPBRG^1TJ* zPH{gMnVaa_A)pQ-@hbFlwKq3n)-|g9EzIVsQZpy?X3F}zyLv5umh|Z+mZTZbLt|qU zN;2wgcwgRC*WT?#pec3KiWS>lsaE$ci#MPg8Oyyl>cEvH%UN*9y7%U0iW)vbap&dA zFJ;tQQv)TP$qD$NL(XpGzLEYLagn*F@w*&D$lAL-PRhP@Px?MCu|KQWWOgE`ghPJT zD)PGGH@Niz)8xu2uJ&g#x>xbk$Q;o7{B0kjJo;)xk2v~#ul;oQ-l8(AuWSMnP3gRD z0*}eH3Mp@7bN(J~yeeBeBGH}BEjZ`Az$P$r-1f|se%H`PXWWczr>%6QEmgw5sH&xf zWohdcyv_XQFU3!)yRigwE6#(ZY92rBwZvz~-_Bi5ci_XSdmNv2&lgcAlGff;9|{qp z4P}t8h*%6)GB7=N(e{H~Yh{-cAKBW-tX1?>2+W;AqBL;Qz@I4Rmk+9}VwdzamtX=!X zn`eAFv`YJm;;SP5PPk| zn-tf}nm-?SWX(dj7?J|<1V;>CaL8Y&RIMtWP?hwzI<7=|t)4hq9Tir`Ccyv3-WJ;y z7yId!C?02Id*XQb+n6RZMWMIb!)owcOKM_PWgFd={Y`o5m3K4h6U7$N8`+73>w^U%fB-h%$-qK-g@e(LkbC>&At*yyR^ z5zWG#0=ufYa-Jp&y1U{knq9232D06-ut+yCFLueNFtwgm?fdvTm+BEh=T`{6$nrvs zr7T{D^Sk7-er8w*<#8mSGKwGX3}4f-=?h9+{S(oZRIAjKrFFpgVgam@VE!A~dmm0I zUaT3u`MA=gPL8xGJL5L?cHVqWBfv(X)N|ICy4XMUBZFt7jd;1FyMk+KxlCqxP4-}; z14&^cY0yM5OFWmSYkqj&Rl}l_;W;LinafiZi;2Y&!C77Sc!jAJMC-(yj4&=O zwItcT-@m@Qzlclayrju)b=%gmX5O9FCCIMbLcYoJ;{tG=jg-y@vZSA(Oz1`W9>7r>9dw1u#lF-TA!Sfa~*}q5f@7!*lb|~}`u+ch)49B(gXoQs zbkG4EoFWvV5<-z-D#e&N&#)YNcTi+fqU0>+X2gauM4A#ahfSNa7-p8k%-Ma-=kxvk zzTf-)@4oLpKl>-Kz4p4U*L8SakH_Qrd<6Ogq zFlptY8$_jFYxI?3<}E6Dbjx1;$01J8gdh5F&?aoCW^a7H^@c2+O45hqrNrKpjOI7wZk%b35kCPw#fffBzlXTF!=_{0q>#pWdSTC7r8PfJ;+{hT$)XdBid%bf@?&!3?AaIC* z{K7*bl%W!-EO%5+bw`g6?r|E@jmrr_P)uOBrT{e~$ZdPJ)iG`pKGdA>UFP!54DUwA zrHhc}Cj11avtsr={DVy;>eFg+PKlGKj_%=f)FBV#@qo?72G%eSq;Oz4Xv-5r3@R(S z7Ed8jJ<7M|J@R4pJ@FsrGN0Zo^Xz%+o=IiUE11r;#i8{Dd5fZ|$H^Zo3^G-_HT*_w zUiB(Y_%6iPtcwqETEi?b#2R)pZm3uw$t@Zk3& zc|#}vv_i!Lc5Ug2uJQXCGUa;DDa?QqIIFdGmUn)<0jqSyUuWqdo+!bMyT{^)1y^7{ z3zsj>iuhbGr4@CTbIq-QW1gwi9lK+CQHJ-xvk&t<%a(E}#(rsl;`A0mR^XoLzg=|4 z2(+FY&$?yeZ{F=~S^CP8;i+2%#SNTA_qN@{Wgi=36G1lbhAh;4xM9mEQ#TmJVZpp( zDI>}{(!|kwjgebr19U8COj%+JXm2CfV}hyHPmC{iIg_rT)b>da;>D6+XdCuzom)49 z#f=_tv9DVt#JD#z%nKmJmXX?dLC;2QGnXo)f~bO)%COn-AG976=CA0E&!}OrqZCgR zUb4C$Y+w&VGu^ci(ec0MKXZ~Tswjk`KN=Edr?9RBN_f3W;K{^m0(wi#&~C#=u}DSf zM|W9c0uR9?6{>&o>BXJ>-O|x;#4P+cpk7=q*G}nUb*oKF16EvAYn5F2OxwZpYjd}i zE)#KXiIqJnGp=5-yPy0Ur6Awy>zs(Q)3 zlsVMNdXV5Gqt8gu?F+;kO8n&!co%Wu)@8hoTTX)!65g5%k+Z?~#0ASK2f8Cp_@M8^ zJ}SG(xa-k@dfnjIXl2i5Qks4_F?vQZM}ymMI3zMN-7JWX=egjF7bjtMtGM0#qeHF2 z&N>42C0&tL_nkBzLyvR9qoqCd%O=M7OeIgmXI&jt2>YE>rD!Hauu?AMsQ)b z#hx3r89GyhBoMG_Qt#{RobzD=k??`Rx3uLgO_}FNDV)v?D%y#;-$?uq_V~ZeXhku$btn*HZ`kd<0cB*e z&*&HTa*jEsqag1IM_AbBVE=~kNbJ$b){R+{1{J_ZC1G^b*Z<--ouD0Riu671@X#(k6Tro$mpbKT~z-FNn*6TKi{4 z6uG_z3=*#AuV#sLyxu_=;>KhuV#g;4-yg4kH+(vLD8qCyurh7JLdv0og^7l%fcLh9 z>vvCXk(nN+mt_i1{)<)Rli+K@kBV!><8Skx{I>COaj+tapQ2Q0>&uNEEEGNMG5J$izg0 zD}&810KgoxHEyq@&Q4f_;N?fj#_PYoQJF2K^^w}SlKIO|(nwSa_fk?BR^ha|G+)hT zaEkE4_-n(44wLq6fCvMxw1qw1>pz6||L2Dd|LFuU7XH%-|8F|sfE27lC-K5?Ec{E| zep+3_$xNfA!)tFBmO=|D7)S4?3}KwGVZ(&{W?5|UP_}Vp-_ohFrElg_SRq{xNNG6{ z%G!azCU4c+#-VHx!z$8YKy5gYZL|A9HWQnaA5*i~z27kTf;&g*IRkFz5a|?QzV@ z6uW9V_{eRN2g<)y!6cXxUmr6ep6s%({`x1_#mx&O-7r`E37<=9 zz!^uU^b5oP4I9QY$2MYphH`=){X>|2uTHBoq6X{ZBepDIKe%3Q3>nG}#zUI3mV%^A zYLE`@22NsPQcXKsKa0n&{W?GYd$L%b6dMnPyP-Ek|V&#CW z{xkZiPY}5X(?4D9GP@SBI(GnHn2DhCz&0H2u70bQ#z(V*E*W65_072$xFi4w_QYWG z?z4#K489C3I$p(opYC#FRW4P1h3xz^A6O}&n3*(c&2nG)96&&f*L-TzVP;oU%IEXp z!#|`l$e6XbMcLnP^h2d|$-fu0=8L%F+@B$RqLb=n9t+y|qcN2x7FQsyKgn;Zq;K+w zmlQJ+G^!=J3%^;Tz<)}=S6xy1xTfdw?D~etM5{H=3AG?M#La;JRq&*d>SZ`pt*yQ~ z!ey$%ni`n=rfM#9fei<6P^O`n?hhT$E8yG|As65wyi+4p=+u=BXxDQ zhU|w3S?HurL4sM;DHB0~2sQ;~CU?%I#SFrxQKSOZl_n?rf{nbY_>a)YxS59D)C_PM z9)T2O!ino$7VMT7K18Yx`?K-MZU;ZESue(ID`B(j3m_{$A-CmD3}h#(SVhWP>F2^! zPT0qBLvE1+3w?2xow~--NtNd=XfO8HtCA~cw5b3o%s?jv7qcIQXRegbzt*EM`j#6i zZKhjCw?r>~rgY1z4YxXanTR~W9nVT6HqWkigM}FYySBZtEvx1}-KNmWQ6X$HZS<%u zc5A|R$WOgEmI{@`*_E9S9%>d0RW14Q-gc!Iy;W18&M# z6PMJyfZ;CD!fP(qw@0>50kV%&F* zhOtO55uyA(UQ(5KN>luRG@jZ|?5uidFSU_XTqxnK_E=P9JUN&;UhDqoihWLHhbPEN z28SGV{ypj@5tF4qU*DKorLre`QX6!{e`zNet6V6#=a`?Yy|9G&XiHEq!Xd#Bc_sO< z*5{8GHZp)b^Fm7c$$d&oOh%t9(?MtRO&RaTVcR(~Gv^!IjL|+wM~tfu9iq^G;QaV% z2PS3ZYdg%$Kryh}uRB-Wb|UCtf7e>6Vq|h++t6}T70Jp*x8_VIk@?h_lNJ9eBc2Fa zctupNAKt-~`A|0TeB?s0mbA9V&4;$Z{kVDo$~)ybEYPRG)?PfM&~w5d3WJekuO*Up`o zvF55CjQ{!H@50 zAbQNv9wRzC9`A3JtkB$bpe=tiDYz3c8)a;HL2c$mpkve?MT*d|FWQ!+q)nZ~q^K?2 z#UCAbc3VDdnji=SBdAD!BNo(-J(Oa6=J%W>?eV#hug2WUfKuWU<8xh$?xWo&Z&-PM zI@cC~ZSKZ+Nh( zCP|ow-3n!t{m5uiFgH6;S!8{9SCJ7G`Fgy#UCMR&3X1`aHKwBFCk~%r?l^TV`Hmon zFrSW#1!b-ZQI9Ua*AD~em+IVw(g(HaVj0=ipgzFbbjwwP%DYv|KV)v<6w?uxlPO@4 z{SDD9p5f|FF*S&|EP_>cK$GpKn6SbPwbiR{Pdfc!O8EdI^=xcTQ4{^mj$fB_g7yN7NFG{=wKu1kzny$l_;B(FPs^_3k+km7kOa~m5tEt^ zTaEf2F4^)HOf6f}b!z6c_!$j`T#n_t0lGuL0wJ&G97r;vyhi77?uKoVEfbfAto#`Y z3u329AaMmW%{i^CuLGV>Pg8Flzx+A*4(ecnUI|?Xo7;|HNu?uNb$f05miMCcrqu9- zDdP)4oqMf1+UU1_FV&^kKTS>ySm2_=KvD3hYQe;r5~c0M?V_eM^!=LEvTv2Aj_5b- z^Hy6FfXX>wG2VzZKb9no>>)OZicK>Y<|wo?l&py6kt}mwBI-kx^9W(MGnqD(Y{AFM zkf58yb|C^-38IQ>(80$s)zhm*oh`B?>+(BaBH=UD)bofZkDocShTeYm|0RtlPa3<6 zI_OeJeEYLbCKg4S-D62q%yIY(-%@BDjWYTU?vjYQ4qu~KWe zRC6*>>TaMt3mk$87h`T`7(g3d~|2#w1zQK2u?7E-;?HWpSG0 zWQ9b9AXsjWQB+*$`NcoZYtZYH-LA#S{htsgV_#0@#usj>H2P$`bdxkvaEnJZRlMCz zQ`G2aCo(37bTN*w1ft4PrQ>8t3ESpU%n~Mdk6VEa`9K)OZF3Ykz$nvm!bcfWPc*Go z+<%~Xy`S z!$*%G8w;OGcgB_wf_2AB%LzNf)R=X2`s3^`T`dLAzId@#J;z-WGctk}h#_QdOt>MN ziMvHVFR>|v6!svjaT#bTp;dCy0QB- zfX?QzVL2gvw%UcTGNe<-{8A2vniUJxb|MlbqZg|jb{^{1Ffu-Ti$!b{80GmbfdU9d zh7k)Qne@|b=qL6CryJ=NYKcGPYC6y#H`04}A(Nf9JGG=2FaVuTG;H523n*i;7+xdm zV7lx|>^yJH=Q;XQhNMa`T_@mtaB?ttPOCWsY%HQ*E71KC21=JdquR2v?8nW2OJTzD z%UhmIrjhVwqP|RN(@bzHZzXkg@szCI|evzJN2N4x-d5SWi zd7GU3YE02D)i*W}5l@I>TBK5cQ^y*Tv*ToUQZVyZ@900itV7gbkI?*p?`@s1Xj7ft z6?|3X!{&n6Pv(EIqfz?pGW>Kt!ICcS@s)lM9DHqPsoVeyuXRxtSC%mrg=Qh z#}S1JCU1x~R}w^o-mBYm&Wby}-&<+IC&CTk7=3{wl@$8ze4g0TRejE+I~h*djL~#Z z(>AHp=vp*(ilzwfi=F@CC%DFCmpau z@w0nECrY!P6w0HLT=kak-%`|(UI?nl7dH8WV98*jqLY2&gj#^x3j4 zp;uxHg8tZXY~hmu6_x&-t=q)~=lv6y^zu^s$M$&KcBGjk*nMnk(`zZXrgIyQq*H$( zb+}(BV%9HqPN=Gc@h|E3+FV*k z@eC}AdHyRh2dR#X=5Dqn!8ljjbGv)gu31JK--buV>l()!hr$Zo4MBi1vQoVpk*1 zBsQIJdSZxB?$zDVf!U3MPW+QQ-r;6?l~qkyNXQC!l}mw(W8|bE-p`FsRS**0($Y`n%1SN2IYbv4@r{0ywZn5Wax5Q$1|jj)adkWB*XhtB=4KSG6?{Ogo7H$A=0&RX$Do`iS#qi~zmvj1+N_NkpA-6&-{hDc&6p1J_LYhs` zEBy=APoy=1-V$Wd^OeS*N|gms@Wg%HaKPy`v|CAx{1PZ+WuH)6{I6C~1x6W6zYm)I z-evvt!Bo&GfW(NNCxZaGIV*1?);++IcF%WhfzuaEIpO}jjZJn=IEP$xMg{fG{n#oy zEcrJf8H&39qvvgN#`$IG=sRou&47LL>DrTQMSyOqrN{mI;c1^r#17J{s>aOl*?U>( z`K6rea^r#U-_aNc{al6d9Kx9ypPKfYr|rOWB4VioF#xJr2nR&{@Y9O=HS4~(+{;~eF{@t!){YB{o#E(Sv zEIsFomylaMtHq0tgaHjk2{HH7+(HglD>;lOCIHw*aV}>^#D6`^Kg1F&Sa)Id~W_ zI?=V>98g2mtAeQ4xm^@JO49zxwEEn={Z&TPOOo}?&)Qa5;2fM~Zj>Sx6&fGR^{VD| z-W)U^ps{Z?L67aw@u=$F?V}U3`oU{WT6iXzKZBMqS04aNDXlYC+5Sz0qxTt}`JQ+p zvqJ?k{&Qu4y=D%vmiXAEaSzYZL_Zwu?8so6|5;7L7H>Q);Jf#Tm1WaX6AGBZV`EUY z>fX*27LYxB%+7r{`&JNm96$#)gnvIifRVXykE&`ZxlgrIgDB0;9q(TB7Dqyhyq}`G zTleqMx_l{?yv}ii|X}Y*AzF3Ssr}VApsdqySqAR zzS&3;c8bz7Sk`vvaqzAH#+EHIa}FaFF4IMbGY^Xe#{d|U)kOaYbIOApiEMo?Te+*a zB}THMlrZ=V$-Mei4;JOF^To(5VlQfZ-*_A|@q$KmQm=xMy*VrKf3Eni+^NXk@cLcv z!0EkMPJBb9R~Ng{xAsv)Lp_&!Cco1|rvONk zk{Cm69m$$2m!NKymy~ag=~=|2Bm}G5(8B9I?Lj%}5OU(F=$%>!JvbUmq-}&2^s@|gsT2^`_!#>CSIqvuaT6=*NlA!kj zmuIZbzLXj>LaF5LElBAb?PLtDOaJiHR(f1!gL%)Kw2`&Dblk?=`~C)b5WQ14!$G;Q zsn-*G9$4tTtv-oEw9{`EFwMO!6K%3B^}f%*r#!0k7CIA23J=X!af zd2`((yR_7HQgHS~f9&u_O=H6|W7h{|&}Mn>S@PX9Danp{zy@akI>y8>B05r~JQsao zIq2KZV}oL4I9x=OO7#znmqLMtP;lC8fBI&on1|!Np2b;52jxTVi2rJ|nn4|o!D%{2 zx)^nX#65vJF&%Kb)cJ+ZEKGC)f^m?-x3m=@1tp!ck|+(Nqx!_gq#$Zp3+`Ddiz)y{ zP3%s3U4Vb7*wtPd^d8=IixKf?G5d{|JqIN5)MOZn>$DUUPe@iu!@Lle85xz%PwDxz z#$)ygMt#o1^j&$xeGbuVo0_EH!VA_-4pI|K)&4Bbx$jJ$oLCT@V)K8Lgx ztgk`o)DB$J62vXWNu?kDTX^1u%Y6amzIB(&=f!np4m|nI*X%`*l%0_gr@bOw^fvjJFHxn`1{x2M(jpp$qE78^la0LXH~QPXrWb3#+3*o^c7(Y z4rA5PkEk*4aOjSC8jBMij)aa1f5zO6Z8>c><&tyU#PueTkb*Gwj{L}0zh6iX!t=bk zL-q(aQxKatJiIE8S4pq@>d8&2Fs+hq+KO72F6<>?xODg68(A$MH$J+bh<(O&bv)S_ z@K1qHXXlDFBkE`9;Mh-)&HA&X=HxI8k*TN3SlorrP8q5*o!&<8Bob0DRq&$RskmJS zuWgad;9V{wwxNITTJhu;KJpbY$qW-BCVtz2eh@R6{QK!vg};NBdU`QC9hJd!KOGS9 zrhndNLv6Pz-lvh~$; zs_WsYIsfVzh@SwPt@Ol_@{*Wi#CIkwY?u8FdLp~t(71~Bu@0mhUE-D1Fm&SypAgYahdznIRIYW!~j-D><3 zh?Q-)ZRgfS5R##tR3y^i?&}^&Yf-q^-x@ze1uc3xwpGB1)Yl~S(Z;QqZm<@1CaNtA zbj-XcY@ZTX#DuwWB@V9W{Z%uR0;i^USs~RTZY_|+NBfA?f=FA`swm$f?T zwD=Rs6CXa*@xGYy)3>iY561dPmQ1^u^PPJ!4B**$VYcHpCB}-L6Yn)c>kTMZNAdw^ z7qUE~8hS!!V>;BXGV}1PHvjMAam5OT$9LYH7GqFNAt#qE>_CNge6blFm?RCh@d~&S zuC(NPEE^t1Fd0@jqZq6r^CYi5!FBcr^09GXvM!Bx)z`x@Y|e+g)sZq6XoWmhE*Y>n z-Zc4vV8+)l;_K>imBY$n-#DT3xdLuq2D_O#kVPjNRjY!9)Cg=%S`Yf7;uf(twT9_$ zMYTTCglo*fhXB!TB!p}W9JsW-g=-m_@ajgVv^QM)1tk4X|I72RLDc zIdbToCDQP$M>L;sOh3Hjb2znQh7;b2zE69*KSn3*c zVKGi1muLiF#nBiy!GZD3Z&`OQLKw+jIcuX9O5Uw%Z|~nF9Wk}dkyG8Da-Vj?ZOaL} zu=@qpr2t|a6;kmC!n+64w?R-7D;A}`nDU}mO(G%tF&z3F$xupg3`MGit@?UtUot@F z67JwPDn7Nls-vvp&iDcU+OloY!vshrdT~b(5-;Hjwm9Tjpo++yxtfEaG#ZM&HwQ>@ z)#?jKb!ux561U5GlBr_U9-<~u<3Mp_UlirIm^u000{yaWrFzs4S{CXzawYOf^(Hms zmCO@!0`>#9C-1XA+>e$xz8{=5gg^*^O$2Q}0T4yNQlx0#M_YccM56w+o|Gq^=)b{k ze72q2X|JRAd_7jxO$!)zh^b&d3gj5{K(Bh}4fHqc?scPj>=`+3#RZ%bWPOgMy z86l$FJJ?y+N*KQI$chROf!&z&b1-GiUFnNmbZkR^EL?h2_Lqh71Oi=eH#M=9ci`>6 zaYJzG5Tikk${f9InrgRC*k#|G2ej6R5UshOiH%-74*)Xc4Hr}#JtCT<# zdaWpBjDe4}-jY#jEFFt6QqD>4fok6A=h8lSh4gpcGUOaApZTJGcz(ccrb@d4)tcOk z*t+51eW+@VHCvL$&Von214$xZBmZ@+NVJw|nYtA@{Z_C^^)TsL1Te z+he^$WWz;DTd9c2o;OGJC!R_g!6)&$M>lMMH2jQMBOJ_=#Hf@hbHLUSjsD_e;su9D z*aKnA4L}g-8G6YN3qK%YgaN82?VVdBJntwlv34wD1cCts*OyD=KBQK#+M7P~-k$}D z1-YVtB`zFq@B1HY@aPo@-#8|b5Z8>KynhlbC^s|#i;_g+JE)c_4VIn@@XpBg36jomSXh8Aw*&)IU)dh*hL>|3yrPWAg#;N>S7n z%1Z&eI|&C{G!0<9nF})sCiT4XW7-qXC!W@T>$qP6iZjm&RJj!Fx22~7=q>PS)!42j z>r64@Z+z)HDWln-1DXI{aLi`eZ%?K8*rOIfhe332R0^N^(PhA{nGviw#0W@#uHlu} z-`J(UZi)tW+CTsK;Xj=q925T;3ICru!QGqA!vGXMI`UhezHTu5Thi$FoOmNYwsN#w z;=*OM$yK*0=Ng@Y9EMP&2P9@vA|{t=c%hfnP>aq&?Mie&jlfPNKlv<|mWwEp>z!JE z+eJ_)+gE$-pOYCmK-T?K%19Ynb$0w0=PYl2{qJePn`QSW1y27>6DsH~8Q~;#$tT7; z7H;wu{`GmE&9V=GTaA|LyWBFJ$tng0w*LDYe~Fmv*eU06Aa)oBkvEP?h3#*C2X1pD zW!pWFXXZ+CCh9e%eL)9NLG~+nO)K^*-38ob)xksQMutMgBOxgup3$N`+~GNO<&|)W z!@ha9^m{K}C?MRhp)n>r^9f*dgD*Y#OWN1g9~{hs_-~gN)9N$77y=c{n*nt9P^VCk zxFLLbyVj2bx-R!PjZr4@ALJpJhf?_LTxYD#`QVAEEmLR8JX!mrrFFjuEn&c`VYhe3 z7hvYF7wGwe{Aa?`Y0Y5=q`fv_9_C2m#WrY@_F3qiOVoAsIcXqlYloitNRu&XuaDOsCc9H7N4o0tzo& zSaY|EnCzdFwtKkLg(bFp1EIlJ5epowXOW2Z5CYkwz_QM(`%-XF`v+Q>taq;MrqXS$ ztCLk7>g4~sE+ug{kZl4;&2qce&hdwJZm_^u+njyod@SQrO7Qsmo5!-D`m3|zysrPF zGub87nQUTiVx@=uKQtu@MXB4?-5JN9hG(V$=f3ZvD%09PBR0sfrZV zt)_~T?CFzB#+khL2f|kO9czB+WWO$3(CrcnvEMAa=+RB(zC2f%Bd5<1kTby4)l6J% zoq&(eQZmx(jZJb=0*L4&cW_Ei4K!s%$iJ5gBX08gJB38#vMqtBTMVaZCHWN^9R{jR zLd&~Cs^I;!=ZJ~g$1%@^f~t8P69)MuQ(z|$o_l)kaKPNsmfncfzL8e^uz^J1Vgxwu zquTwo^;IP7N16zQRXO(&i*K!^AMSYXhe*KRmS1y##PF)uobo6(g%1@v=ju!guj!`v zpV)t|ODvX?qrbv~(=#oyuvzB4gGZ=FeW3zPJggL+uZxTpBjC%wLk zJV%1%u+>ty0=-H{V=A+O6$Aw4XwsGfB>xieKo-C`*cj=m`H{&CcLwP%w2U0vAnr9w z69)>dr`sx7-!%ElqcSl;ugSe(Kh>;pD#tR^zu|f8kQE=KBAej9K}$US5afTPqDPC= z3**~cB8f;01*1AVdVa#^6SO6nlQb!1GjX8OKLvoC4|HY$AAciP-D~wMFT{nmkn*SY zFW$Q>_-q{csHr8zNin`V6=aV|`-F7r08Np4c0+y`0JN&+vX%k7j0IBmJ{_2k<<2JTZ>*b1XUZll2xTi7$FCd)x(khdZ(iDo=dE*PqLR3m^g`C&5Riz~J9W9; zrklOI_@Snh$XXt6>3II~Yl737mG6(pN%KmAH1aOO!SikuNDO}zr zA2O^&Cqh!PI`(>(r+(0G5~?9fy{Gcwo%vGdsLAm0$GV>J0CWyS+J|Y*g;aCs zUdIHLyNMr7l@8@M<`D94(H>{i<}0^wQ)L5H6#b>H;1H{{YVx^ z{qAN`)Ao{R!d9xJ&J5W;u^Z%VT*HXW~OK{Gf5nCzx6f9n59hz%B-2k7slNb%G8Qzar8?w7I*ByhW^UJS}8rWSdjCxpOU4+o}7|TTzCR9zK6TNf1-@!FjeeGOaNmGR@=TY zsuD9ix{7Kxiaqruwq%)qhM0ZiANEM*G(+UG$JI}KrI)KE|0qWr4yx@#tNh%B%oupB(Y>`sGfyQ=OLn zymuUx>X7a%qmw<1soB?Tvb5==7cArU!=P?KykCxvz|$4V%jzhVPrzux6gN!kIUN@! ztBX)fFx6PJO))B7@(qgRwufb!1-Rn%bbVk}K-HoM<2AU;W?59Nv}`q2&Ku6yS(Z%iDpI%WetHe%%Fvti zWn2#gbW88hWU>d+tbniOuc@=}>zNcW7&);h!(42qcU)84(ajDV!ij@yO=XY_=R!iB zRQ{A$#JL9F`48?m2t`I?~=fsvpT(Q#ZQ?Kw7hSD9m2Ys8H1wc52BX*DgTa36?$AUj=*WV+3>CJ;Gb-4?I zIUmO7VGb10xlo+?NOIu19K&R7WBTna(gD{VRqBPO)O4uDUsJoj_PGfko$A&0 z+r+9prkinOSUZi7q=P#QVz%Em)f%DQm3YV_qME!-R{GZv@z!lu#MhOFpgM+g z=QMLKpH%J8xmh;4`kUGj3a(v(DCNYI(>)#J(jnA}27^c$iw(~dyZyM{brbfQD9B%_ z^||rzy5RgokE7r=$bOe!yZ-1|-K*d1MB*UPhtbz+lQDO`i8d+bH=^>r`*>!OFQnC- znoN)Omdg2L)awU}Fc@}c=0AWtamAN+dt+}z6D>a);Ni|M{6D?zvzuOL)}l($Fk=lX(u%0;&Bml|CR zYH1+v@9tBbCq3l$$$&$*hEyJoK05&9gcgu?$FR&cF=-XYcIm94YIfBR)Wrf_v@nsD zYK;?WkRdhOS?OLp0Qxt91apFXX{X1yE_c4M07#Y@^juEUEj1w}q``Rik3{s|4yC_Y zEm=?Rqs&Udxdi=}u(L7%8$T25uorz1+0`oNw(@wA4f{=waJjU8TiunFlg~xV&V7P- zbZaP1O0yQ<5#L@9^|-&(OkmTbfthGDKR>Z+dx1P_1sgtT`lUp<>wu3*T+ zGHAa*<~sm&XLWS%{no;RislzhTGd1-#T4|5fQjWs(Y?%b$n%M=reAjN@h&y1P0zb= zmHe!U(?SX@GRv+(sJIJ1tyPLW%dp&xzv(I(cK28X9h-= z730D)k-+auSJh0H3ZmzRO4VG&+%QhfVi{5ZR&^)~UTLxNGnw>x@YgQbhf`2ieMo3B zTF5cqtq_ANvs<{~YwM99E7GyxlDz;B!T>FNvv}$U*W3E=Wc0ov-WXNtm-DP2Md6Ag{VyWUqZ4-y5}PZZ zx+<1u?jB_L+F0PTUqifd`lz6q*6+^4kx#bMOHP7l@2F@8G|^^&?il*ONyu_C=%ZkO z0@XxH;Ta#a&0g+lX9VcDL_6#CIv%g3WS?9Pd&Lq+Xm7+4MYYtP9(2nb6KCGjTqt`s z!wMb)K?ULBm{2sGVq2-%rD3Obp*JM;f25foXNcg2yLA_CE@A`nVz(m)gcL3;invg! zJ`9(@vV<}NXh5QI?CvipaQ3DsUhgJm)g1^)@l38$w}12R?#n+4hNn6axm1Z`xwzsU zzaAbDF|@|JPQ7MVfg@eG3mssoKFQ`&29ICCS9UL@7?{-30z@KY%%96R#8nP)w}LL6 zf52HQuy#Y3+LeWxj#m&uALEL#tZ%a)iqIltc-pSLa|-$VRwPDk$pP}xgQH}-eG?XSa4kiTB>`zg&*8nupjR0 zSqNYuv@NpC=eI~Xb!ul_He6ND|3a6@qJDKOF@W{Xx)jEqWghAXb&+yvqZIi43O5{~ zI!%H!a=UfnOyg~+7r`&az6Q{<_EMzgHr_W@)s{0&$?d`!1~OpG2<^OTA^VTG4idzN zTHaTFEhzRls22S5vJiGid#?@__=%~vCf=v)t2I_Pt)>}bU$P^;giCCY&(PdxT~sh7 zObOBSi)~vo(K#xL#Bjwr)<(We4UJFCRb+=%Wj?O7d5#cZQZW>>4&TYkJep@-Uc*6@ zo`=Z-$Y5!(4(=|xl1ja0D-dAqcOj?T^m(8{o3^x0Xrd-uUQ)pjta9_qrStwtaPnlUNhAQuh;L>>Ps3 zRxwD{#ry=pg^CZr31B9c{@WZmGNWQOkcxxjfxViZ`RFQW?i;VvW9edfuqXp@G-H24 zp+3v4#p*==6}UirMQm)vb;~B`(9n;9MWC+9pf(bvl5Le==C@SKOpKNUtT~P)X-qHr z@;PAz44WEp=#`s{7=weXqX6lJx+VXOGpm18SXcp}4NjRCOWeS2U$-4A zWKWpz!x6X=^=ZHcTB{3DtAh9ZQEMRK(HbfLQQu)`SW6>{n3R=JEp(lFaaT~V?f{aZ z2jT?nPjC-6AjUdUn+K9$51?DSQxl}st(q$Q903sGp78EkhaE&c_#cohbO5lGKX0VV zqOhpKAC7DlK<@nh_AR0B5B7r*!@L3l{S4=dvA(xtICIcHbfw<5xGCaQP5T6M?{-Az z7V`_igF^EPiWM*apdpl`z6rO9k`Vx2zU(hThW4!(;9H(aML>M2Y~QHIbv-+11gYPS zt=q2k&@)HH>xRz=uf>#Xu51NIOj}VLqpV02(_H5Qx6R+Ws-5|Sw^<2~xv zu0#}O9iW-T)FV3`OU)w!x{4`HhSa=+hYHRWwk(emK4b`y!$K5(rixvNA-hWYR(cR;?1tl0mw)Scj*K}FhyNU2q8hd`|tX!>@i8+ zty?+01rH=uZ)slQYi#+(@xSgz|Ge>Tps-Niw<8eXn=Z0n9$`7cknvmh%*EM1iZdA? z|NcOqCG{LGL-}|)3Dj*6YQq~KLzRZJYPIkH4AD(Wg59gRqF{G1=6fcvi8WnfavH)+I;HnU+Ml~UETtiyQ_ORxY#>+7CvRdD-;yeBfD z58e-a1fBy;!aPXMl;sAq_o-@a|5Ava`-<pPmzcmxzEwL!>kpvmqS1o~fOt=$;>L zs8W@Sp8YvZ5F+eT8=ubIVa+*CaX7y?zC6OFi@E?ge@~k@A7%gF_;R9I`<8#Feh(@1 zgYO2fFN*!^|NiHP|MbRxM#BG|1>tMd-jEv8Tf+;3Ypddd_pBlRm^|b@+@WvAl<@Pd zBgS7&J&(NC@~$K|P3hg~yI(gSJ$7V%bSy* z$PmJv_rL!#RnSR4L0m|1jP%(ie`}(0?FlmsU;T{)+_p4W4_Wu9WUPdqBcUo@lQ@{U_iWJvdCe2Ufta%=|z#z}J**8?M9bwC! zzzcc~=Mel0)j$P_(1bbB)X<9g2q#=hXKNUFr&hLO;H{~;C{vlAq~XF(h4wPo1Gi3v zt~O7o1H%gs8<5cbmnt~kjr)&$>)V7K(0uI7;szXt1rH~m`Uz*3JkXaI5>I}|e+vz1 z=0^cv9)uyw`B>`fPMYxIo)yEB69UL1M)n8fo6dkC;QZ3ED84kIsV6j@eg=5Zm{L*A z6o+{OpKo?jF8cDGA{05yq!X}rb^83p<=8!&Z|aQRB);9;hfc=v>a_uV876oR-|lRc z9RU89Kin&)fIaMkkcjl%-bo>oSq(4Wm#IpLI6?ut=x?rw+ zs6XES{J~K`0yx$m^aG&j{&sw2me%Bxb_B-dE4!#uKHw9#!G}Bh;e(htRcCGb6Ys3) z&0y!EO<3SJe71m#*N@gY%PI3z+ALdqGy9`X0_TQN1iFADK^F;{2m zql*aT&#%Wr-|WyDe~rYetbFVOF14RYpWns$2*@)sOryYJj@;4%!YuvHHravaiZRsj zCFkBv7A_%lp&|X9c`&xp0?uh3>b}h>lTpD#TFz+=UXJs3`|&PW&@v9KSo^YN7m`PE z4Ye`!!U3o5RZzm3pDbNW8~GJ_YTX0*!0Kk%O&|3KjN#gkhvo*(JXX}$t}OmLC2XJ> z)ZwSGCc9hp;z=LXXKnBsL1BQt&Q@NNX|LmIpRiteL&9~hQS^5NPjh)G2Ar-4e|rdb z-BD!`%7#&|@;%RH{=&9XtJ3Zslxi|>ORWC-I^I`aQKR=z!Hy+)t#qx4=ii%9CEH9q zo&}GOwYz^v{B~T{#NxskoqUb0jeN#|N^1G17!r8AMFXM4zPo~F91c$ZGd--ze8S`` z_n(td`?8Z_JNdQ~5B7d(1BG)PSk%Ldx-M;39k*?Lyx;q4Nc>t4)|&QV#wot{>#QyT45WK{BGjQ9v<$( zD@@?(IXg3_dk1Cv0vQBm#1MfYvu&_A#su2_!;bA>1?tr?c5&Aw#E~W=`jr+laQ+q5}t+LQ+++ZK+mK|SX@|mh>SN_grWq!g4@MRJfmgN<5*p++F#ci z_`-#XfOG{uoLa{7GpcJ<%YE`8%g7qTe8X?@?X9k-+#;>*e&};}d*23P4|&)TCn(QC ze+-_}UVc9GnTT>rqa~P6`W&1THkJphahX)b(+eZ4Ft2hAuiha$3^0*!-zma>P$so4u3>#N(Yu*22Zv-wmrIg?#wG${egGP(yP{Cc6pcgc>W6#`OIp zFU5XJ-92E>l>65Lm|%0bd%Kyd_g`;xwFYJ8XPAd#DH&plh$b* zZ>$2Qb8YCyXx|-8uLrSU7N6_4%u7_Kx_F0Dhi$nwCumC!CY1Ex%y|MBJcv;pUBRiZ zb%Z~7e_tqsSd=H3iasplSYrMyrUMgx0^#Dyt` z%b&6Nb2MatKiuWA$1F}iXjN&%cRJ2TaK`q4uDLO9a!@v%dqrs^9JY^o?O8(O?X;7J z<<)I&CljB&&eT$BW7}{Z;F3~$kQUjXBIR{eNg0T|{7YfbeOX>n}nNcX;>iMEzEEay=6M_RY1_1=iI5_wgl zw`-S~0GMPgJCP-izdg1v+Vl-mA0<0z@77}(IPo%G$Vsc8`-x_XZx^)<1LCgScd5Rn z3rQwduMLzaA<94y7*rLkmcMbNVA5JBLa&)~)blb9ET%PojgzBirj zfY>JN{%f%~y;<_fQd8n01&vTl3gnf;W&~2J{h}4_&q|Dh@A@qKsBtzQKd%L|{CpXI z3f|oC@_A8qUUG2eTUwktw!qW?53-Gqf9=+O4tmKvm3;LvnO4ig_)F>9Kli$)Ut{~z z=#e)j@6T4FF{0uGb#t&px#jF8w17(Dk3*;4ohzLMYZlANQfMFaZf0;$$G&$KWn0MA zXAb%V=%o|0z?Mk}82r?lZy8jd8`X!=kaDs%vHHyO5H>eqRI@fxZ>X@+Yg+3*ZP%yJ z)4cc*4D@w>ubV>~1mI{Z{bqXazJu0npb5^qn|p4cYecC1%TDTi7w>>x$c1 zpX`0Smb8VB`ftSs)VzRi^0-}>HOixU5x;|OEUBD=w#%I!6)}ctGT3R8y;>91w!~ZJ zF@m^Y(X3bYNI|Qd{9sWl?0u2uO)!#IIN*C1 z2i4{h*j{}*>zY}E?b{WcakIATdG)s_^IEz2aGa%eQpX5C9OYJYm{Me|%J@CDs-*7B z|KNkoa%V3+L4c4RJPsz_SXuEAwh6Pj>{_+%?JF=2s(~un+=O5tX%Vh(G@iT(3@s%I za?5KIHuc{_#wPkm2t`4>YYQVb01)8p zD9n;<9qh~6Nbo8}!-1%A8+OAppe?6M(L4RL& zb8v*Qa6D+%Q(r3qKL-Y5GQbdG+R1w^(_>yw0GNfr&nIDO=t8Q19K%@fHZm?TS-2(TPP& z6Izey|7i)YK@J2`d{#%+X7R%P+SaFThl@(IhU70D5U>LiWiuW|w4kgX^;rnq+})hy zSox|*-S7rTv@QV^5Xck{oA5S;>@x>^p)D18e7cP_EhEmuq&-XjtS_^^^HWC*I!N@BRF^`X%fE=u2IhlY^vz zNwwHLn2T8gP?{G5<-Qz<&xgPOU3g}C(8i?ASk@;F1i78_W_@Ti7-W9CWfkNaslB+5 zD`_el6;l&vBptU06lKLN`-LS0T|##!gRQ(a;yaS@jDsb|Al@jJTHYMULA8yzHdpnE z_zVPgRm=c3L-A<>n@o54T|sqRTX1G&9XwqBIw7eix0FKpnJvD%8A_f%GJX*j-ZE*1 z8qC}YdG2o6jQn8R9Lpxfl)_~&s?`K#)m;wv9zs*bppm+PY35r2<3FUiFMm+@WHoGB z+9?i>|9e=kTDe1`TCyRTU4i>=or64Sf~j;<{`a= z?#)8*Wx@=q#dPAKY8HjAJ$gyU-6ccaY6*8G$%uiz@MZZF=OzS9$>kq4fOSX3N; zs2@=6-s8v~N+2CtP@*a+9NB|;HGk=j()Jf!7y_E{+QtT3+b{%yJU#k{SW5ge9kNTQ z9(5&Y$pe?*z&&b3ave&!L{nTrGZ}`Dg7&ws%v6`7O`sg#{0s}`3A@r$0pa!!c#f7+ zkIc$fVkUBOWA{Hoa!aoi@6D_M<2YZPLFXQ#efd>Pa|&tpf?X+d0VA&;&JRUDq792I zsuR?WHP4JFgE9k8kFL4|b_Q5eI9k11K=mYC^LjdWH+s9Vb70liszaUDjjJhKV{e=gKizV9+Jl` z6yH&nwLVX0ez#I8b{>c>9^jrx&z%bvjTdStWlmQq@;t2l8WR2aneIe-^ESIfjU8AZ zn`;#V1_oGx8LGO_4ApfMhJq?Xt8!m1qNC%~7Jn_n=;fJWX$ifwrGM|whdmgpP@y_@ z%$g$U5!MERGnPRg^XbwyBzNfLvXN&brH<4TS#FRpeOptVH#+!N_cU|0ZnS=Hqu$+FpN z@YdS;U=$c{R;gYeQhnWxw-de9VQ`7MMM^uxI52rlW*&eipPl2tNO-k{LdjeFI$%Mr za>nn4-R}F;r{Dn37aZr*4@TmwC=ar+D2CYb&)3NvX*|vg^5r;2WgK1P{?9{hE6Ar1 zOcmk^hUZkJl^NNyY8N*gj(H0PO5v(H!spB#=R}x2U#!0YG0}q!@T0YdE;_Sd>i$yt z7Ti8!c4KYCEHSV8_d>E?lU5QHlcDx#ORku3zXh*klOIw9D*E6!S2I@O5CNCH^2(n@ z_q_0Uz&-4@5IOdHz~^XAntHDC!xn+Ym05efozP*izS0VJ1q)&~st3K^mvNDWBk%fL z65O4jcijnpAvgT{@JpBF@RtA)Lstrq;lXDp_QuD1GbJO zNytc+mSdKOkYf<6q|_B@9}fXJNv!>+Nu$SB2uLf`FYN_eNyXMAtr z8cy)RI&C-&`a1TPV610~@+wa9@i~;|baUgXyo(eBKid3`Dz)#c??*TFZjxM?ivz`O z^)l2_^21Vdjp^c^g67mWL!#ghd;wi7YTZ{Fc<{j)bJ;K-UZI!#_pn1YSSo(@Bqmsj zc4?A`!Y6&%h-coZIL^3HGrd{}BFf1MU?SZ0ppm^b*tX38)eE=J8og$=^-ZX8d%rO0 zwn*}mY$Q-Mk1p-Xav6VZ!3PGw7@43Z?#TVO+~b@-0e4v58&hY&a%^34yU}TtHgy6 zE~)P`*XC&4bpI^0{0gFEqogqnb?g-*;9k)*oP2~nuaR+fd%k;?9Z(T#R~IKiSJsK{ zSx^upgx#xM>~z9eT!u1*cZZJqKE7J8nKWyU0Fb()i4f5;CwDF+(WJvLdD5CEmLAvtu=!WuQ7QRr>Uk^m# z+S?a!doZB$;mL!Czlnkzz)&#-?O6vw?5j; zYvO?!R5n0j{%hWhz4V;G>j%POdn|-OZCx^3EY~l5enR%r(5rk9>mTohuv@i z&`}lk1`Pck^ru%!USZoW;^Adtp|tTez^_F@Z&+%ZmQVcd*t)%#PTZVe76fTHk)0E7 z4rKsLai+d4dH%a2)0UI%vDkk_T^7w zSQ5zLU$4r)0+4b#I1Ga`9+`ofiCXBxD;#R!S|Nj#N*?;v-=}PJCfDirra∋aUw5 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%0AuJ2l~w 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 boP7?J(?&#R$a%mp?7C`feyPaF;m`j9uz5X; literal 0 HcmV?d00001 diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/DocsScreenshotTestsKt/ScreenshotDocsPageContent_Dark_d19fbf1f_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/DocsScreenshotTestsKt/ScreenshotDocsPageContent_Dark_d19fbf1f_0.png new file mode 100644 index 0000000000000000000000000000000000000000..ea4267e6f0b4eb497e7eec08e47a7fd3be43a2d5 GIT binary patch literal 150574 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 DQA*MH literal 0 HcmV?d00001 diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/DocsScreenshotTestsKt/ScreenshotDocsPageContent_Light_b29dc7a7_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/DocsScreenshotTestsKt/ScreenshotDocsPageContent_Light_b29dc7a7_0.png new file mode 100644 index 0000000000000000000000000000000000000000..d19940d51417d8959f336bd542b0e9438abf0892 GIT binary patch literal 150661 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 literal 0 HcmV?d00001 diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/DocsScreenshotTestsKt/ScreenshotDocsPageNotFound_Dark_d19fbf1f_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/DocsScreenshotTestsKt/ScreenshotDocsPageNotFound_Dark_d19fbf1f_0.png new file mode 100644 index 0000000000000000000000000000000000000000..39737f474923c2e69af2b4fd0060560a3c4338f5 GIT binary patch literal 35729 zcmeFaXH=8x);5aDvMdoq6cK{xVhJb$A_x%#>_``o-h_w{Ac4?A2Nxz0ZEf_nk4$pEJHO&hU>3ge3Qz_nh;(<~8r!NvF zuSK6!H&UTg|6}sI4k`gdi}n0xUi*tnhot3bsAI*qrbPV3bLTo4ae+B3WGIKYTYLam zz^e&j5@#Rq+ksr`EC|DZRXK4x?gypzSMKX|oA zk7U8nY!{{%7uP~^+edTiY9HNqW}C!0^ZBUUZdLWuzL=~-XM;X?v5#SplE-tVo*-)7 z!)oVe^Kq)~OsJqS>_~#Gh?whO)-P)<4P6Tk5x3SP+4?WZ##?l7VW~rt~~<|pfxO3 z^{=ZgTdN7SS^LkAXqeFT&j00iU63oR{=5f|$M%`ikHl>4LP-NzoL!9>i@5v=@P17{ zMmgturr&DX2x%XwYW{SqHCvU3!l{gZ1d+6`!mfPEZLM5iSrXeVXP|sW%e(h;T~X#n zsq3pzo0d9U2UJHbDuoTIL!Oa(#O%hdQg=t4IB~Mjb!8D#9>UAj zHgy90yY!*XI4k$YR>nF~h3$8;`WQ%!Zi5W(KjXCfe$pTwXY#mdlIMUcKIl4-U@rTy zC#4Ox2*2GcY`8a-`Wn4oa{y&WC}&I^bvI$f)Edquu6W+~g4#N9Z~=$l;(90m-c3+Y z?#`vQ@hjOi>5)Wv=FoBT=5It97kGM80E^y8c)NrM0KEY3W4rd#29za zq2J)laT-Aj^^3%1^%)t=^w@PDW_|h2F1s^dDaB?brayS2l6+%p7?+h|w>3r+70wP` zXVO;K+oLQM9X_=J1{%|fne=^iOnEY|!Bx+X$kMQm%j);Fn=GC*xZH1rqC{b(usJoW zWiC?{jr8gI9}ya~sbD%O>zYB!u-f`@Y%so(Mzi+*Jd#BZ+6Z%L96Bhr?YH>e5sM7* zC%LQeX{_pQ&`*bA&CAxa149Wmsq0NgW$DXnacU(nCkRC@BtP&_fgk(E%D1D_3URl0 zMCtYPsQ&oMh6=CQza7O53P_{5^9;<=uvaM}BjjmJ|B7T8t>yk4Qv|scX_cbB+sT;T zsII#+_*FCW%g=-$=%3nG71V^2<@ht{GMx-_R2&r-tS>3JY#q|uL-RTrn(NoU`(u(r z+hsQn5bZct^sSgy_xj)j#96F5OVlVXo>&g}y55hIMj1Q7)n;w^%` zTu~AaNK-V}sFwI12M;uX6bcY_eEW`$v>c3z@)E%gGMd>bzLH(@q&0yAW@=a>i@fM% zX4YdS{)dm|XLY9EZv93xTZK zp~#XB6UsD{ZNBgFD^L8r~ksp z_$^t^;I$F;`-rbE%uHFJE=~0Y=;F2rymDQ&Y}0fjSB&LdOB~Ak4YjER4iQXfUv=t; zym=x;WbLeYf40zt<9f_Bx-IqcWDsR(BfDQ?hoq7vW*g*F+iKrMZ(J!aLw%vg+8RX9PCKe4-6Hs=g|H>BuPRM`;CmLQRg%KMK=TjTm`X&)m8a&X2 zs5u2**k(Ib*y(U_c|mU-MCC__S_R*v)RPw)HPx9pyWMBNxAEULD;mYhyRSvLhq~`F z)kfA85X=!}Z^_1ai0&dj12(9}Zk!?(%~=f}7MkBJOs{FK?%}AHffMpB zF2^eHJok%-k?N0zXSV{o;C28z8StN&^LR!IyMQa5RA>+HhpkbJNH`V`+WMC3Iw)QzP)+T`&8^^N=2(2^BYIWfp91Ne45 z{G`-|z?{g4h1YWl}%oS_3Xa?|3vdT08naM{|_&Njmak}{tUfG33v zc6j{KS+AX7$k4cVfxdw*?T;Uc95q?Ubw*i?3X2-*j9i&8cbYZBOj*TcEY*<=%0o6n z9D?ILS;s?j%E2Rm`xjI-9= zFOMx>3PM(1n7(#m?sC+v6i%mWNl+7_!iHbAWleG<j`NUM7Wkx%4A2@l=Sg_m{myg)dx zCHli9VycSlGxcrY0s@8L(sv-@x1&~}^($r1>O$0L2MtkjUEFV{lsYjr^W!1g!ADz2 zW4@)`FSU+=R^o!Mx8#7ubEiT|z;|+q^S|eZIC*sv(I8b5kj~VZ{3%)5&edK~sCvy; zNs+PNqZ*$lLIMx!X_GQG$P!&@>_6zM5QF0G!c5PopQ_t{6qz z4?K3JfS(G3N7q>ce>MRd)9rYR8wDO|-Z?%B>5E$tM$T?xG0laONU$Gy)y2&qNYw%r z|GE82jGF$bgji3F^Rj7DSp8FDJ<56>kiS4!V-#I-T_ELlBCCF3(yFA&{=@++Bwl08 z0@=)GN;*WIUaej0rQ3->{}y&SkjOfW*ZVQ2$o9u)TZ zGz)6H@qLZv9?S|HQL-PK-l*u-m(0d`YOHL|*IkKv2H_mwE$!A{jF!%ztMG@$crJU- z4W)W&EM|xLU#pNr<&sy!1WXlMXAVMDP$5p|*D?}Op6faW#&6C%wVzRHZ__7^=T55c zs&%)g%#YuigNx0F%=u{a-p+u5G*h)^Q=f0-X!*(PLRI0OgT&$ffvFFip*ki8Ye8EkVc3{U5zLF|6J%QXkE-S2DCYcjZKWT@D zE+q(ox3j9QJixbquy61&OW&DGw*ugeSO^*uhli z38napfYsNd`bzk06BeptTFu!rjK0a=L4`T~_Sa+;Z8)J@@fF40aqq}*;i{H9*DDsk zYGxOAZydea;cTh%4tnhGtrOt%QMssUzaB)#=GQJWGnTNoWF*DCu31=&C51gE-fy}0 zmt>=qkc1(*VE+^s!2P~&=0marzm~iFv%-)8?3))Zfs-nzG;WlZABVg#)i=L~mevcf z+3y%5&Yw|MX34D^LDlH}*d+zoqHZSZaqGYaZ*e#34|t9_t(y2;Rl-oOuqYH(=xzcb zDB11*$vUV`1qmeu#yjry)D{=(NSs)@Y(%ux$7D#vh_~je0`LgERy9G3d^T{@3ANT( z1}#Ci-xPVu2&(Y`PrZ1o^%@D;~nFvcN0nNMG2*8$H6YS+$aNg z^u23Jx=2_2t+}cmc9+au93tV$MVK^?u2UAWd~B=73`woXso6`h1T^)%6nE`1h*pQpebze%r`OZ{Hc8fu)VCc%VAZdGC4>?a6Pk zk02R>60u+-l!!@L>qDAy=bz;uLQR`<+1H0CkwedNM->fer@<{vq>7PoggIj9%m~Dw zJ+G$x%EM>{$XxIrvdpM^c0@mh+z5onHT8e92ud4&dIdktf-$Udm}88!kt9Q4%kj|nbK`qUCJp54h5iTq>e5Y^ypeeIniEaza}iPjX!k2 za~Z5yE~aoKVF=g`gQ;v)Tg_G*W8zi+f|vg4K#&+7!2a39dH(O5;{(~}1oKs>KW9#P zGp48cCg+uEAXCpEDbwpE>!QA!+H9(0Ce0QV`2A~PDMEoC1Crec{%(&oB_)g2zY|tA zLyG>hEnw*)kSebprZMZe7SziAT<88$y%FY04`j9Ci;~lKf}P{_%m@(-4hGu zt+K@eyXk3vmg-nJ+I}4{SYLg9*@alyy0S>)E&&COe;}1s!Ma`)ywE4P#d%H*bu4ME z3K+CJjN5a(lJ=~#WiJA>5I7sDFizX-yE76JFjw|6Mz+48+H>UkG~rcu8ei29m&>5( z>P6c_ri2&v+3{!;WcX(i+n=xnSQzQU z`uCoyft}r2!0(FFXB;=&saA2WDj8A|lJj+le=KM7fy;zNkfo_AEAWnm7)mqZsgY)C5ZAqjBm)qw&hVLH%>80H1 zqEv#EdH1qFoX4$hP$CYg=Az>2_-f*Y7*J;a9rJx&X6fXgl|j&Y_OK40Dti0js28sM z56ujKcA_-weQJrv1qMCc#%IID06gAP5w7{3T+xHp52S8(-+c#S?eTs{$GZWzNgOPr z%~0fm$690G;@rT9lXVSj&+6yT_Rs~!*%TN+(({Z^qED0tGy$x-e+-oHV^`oQV=C$C z_Rr$^+Zk~Cn@{{so=prJiV5LL1L8MSe2_Q3e@~>Cq>IPzhRi-GCZmqA1xX^KTG9h0 z>;9Yrt|bUHy`%d>+&TFpb?AF{FN!JO^}dMJcRGI%Wj=O6!hL?z+$V%cE{^JcG`Z;O;^hT7%h#rC0;3umVH0uZUp!izFVs{3uq}y(bL@7aZsL=nyskUxWC_W`}baUdp zg>bQ%x`3(Um`Ry`)^~iR8YJebnMj&c0@4$}MxYliM#nee6G;UM8H>4bq{9kF_S^*g zP@#zbS)nd}Z{tU)eyv$LU}>Ox@*Zm9jOHwO<(on&`^BcOBJImVRL&*Z<%jT%p3>0t zK}X@QN3Ez2sdCG;8ylrnYI~Z5u$WVBS>w#1(y9)>)#8*=cGnr%`8sfQKD6)eTdl4d znjjyC+ME~1!RfR~fdMGK{S7P~NMV3_*ox1u^QYqw|MY($?LaE;v5pga0qpdz7jfuK1 z4pV~FAk{1zB(ZVQVCrc#fX$dZ8ElUK=)I9Ta_7Y#^C5z_XCpn<_H>=eg>`~hSvRjV ztxN#ve38R?1cdsu15VC_@WR~c9f&Z{yrE$T)A;TdEpXzfb1on zK~Bv4o2u@|hFbdfTpu}9n+;AN+0ZRoCts2QZA!M`+mefhnq--|O&q7@$YxWjZ3QX?W~O}?;R(8LwVMJ+G7ulwr~SeR+NruPnDYdK51;F1!J!5h#{0o zUNmDJK6>8cc}Qi)t${#|75cedS{1u~(QamgCl83r^~O%Uf)Z$2S5n&V?Y3RehiRUaeNXV~XB%hi=; ztnX)-gn`X4F(e#lsn%x}-?#)NbR>(~!9>mmY?58v66zTD-5pd-I$zpL2-5>O5vs~F z-cGe_T;+}{a=#ghejVsyMwGsOz=hhz$po)Ka%k3p)8!**wWAk2I?sTAR=~#N1CY!2 zE#dfYfb_7m+gtz_a}84LDgZ3%rZcxiLMza5I^8`0rTr^?e*OH69m%(FezSN^_U4}E zQcHcb5@HNDb0LA-b%DMzgp>9U1|J5!0IJ{F*N`Xd{hF6c&L9n>Z2Z0^P3PDk*|6!) zw#MA4OFN9pqO)E?{N_EuOlvk?q_MCnh48%2p?OsDoOFev;y~}Q*Qt2>j1&K}-MUAG-rT#t5gEiG9k3FM@hC{L_VKj4p z!Ax2n+4EI#GRXT0QwSgBzJp`yo|69q9xQ^)`F>g=prURy-G!sKT@D!%h2*fK%p+;hImb22*^oi2X_3Urpe6|z2kT9DMQYc)|+UxOfUKgebU|IWp*tn*if;gUWuc z3UHvv|Gg?m*hrz>!(hJ{_dy(DZS3i6Bz_w?<2bM+|5SRkqmGSQ&^cHjknr_h&UDG- zqLhO};HRPaI3zetUw7yaB_0vwfH@Su!u190+0Y6GGpl9Vue9%l5V&2okvamNID0>H zgdb~6t5(!X7z*C7Qh{Yg;vV);wGnCE>5_IOXwg4u$3OI;?Wk}ur^`ti@u7VDKYFk( zR|zC%agXQqK*Z+(HT@=m8wJfYvaaw1zyz1A84j5_u8d&}s-~O6d|Eh<-jx78F#9x5;3lM=y z_zMt!0pc$}`~`@=0Pz+o>Ccm09IyYb%+ zh({id{1AEguwq8hx&6OMJzOq*ck=Mb4?RZFCnL}4RMETsILCSy7N+8Bu+i)KiEJ0J zDnEB$_O;HF`MyO4b}_R=(tRp6Hd2ItLxf+Mi|d2r>|V+L_3+CDzoOt*BK)cav%g&M z%LS6ZT=2^Uzc|q^PV|ctas7Ypg2#sA_ELib2IlS|4u<(LXVs7jdcVq|pY<|w z476=rUm4|-tE=$=E~~5IWpyL10;$1|9aa8!pYwPsESL0EGla0+`+<6idB=vRy3#x3 zMHO+Y)5`Dtv&%-S3$|J2C0mwg-{46H_Ydt1ShmSi*QfLTvy^kkz_cdT>me=Y!LAhR zX-jqtfgswU(Xt_yPi{9hXdRmTmYY))bZGeXL0&z$j@ZN#Epnr6Ff+b9bn-Dt`+9-& z28wjKk5l#=2=7MJ%gAT)+zj5&YtB6sMp^@oQYVrn^z})myWSq%gpgpn{L91geY{_Q zqYakZ6&diBYNMBATr&x*!;qVG?!R2_#I+>g(e}p`m$pGf`^JEjo|ro4#q_25$FHEi zVJ+x^kNNa%a#E?ZV`|HkDymwMvmdq4I}~v6jrzVrm-mwng1*vf1QDPP3q=Ls}Ff+#66+c!kOot z#kFDyZVs0d;RinYT8DO&iv!nPkp-=4E1KbYlsIM1qvC2(?HJKrW3`Hm)i6nGk)rQG)eZ(G}GgJkgI-dC9Rsi{RO`pd^Err@|y{KeK?#Ngpl! zJ}3y`N$gW1dKRG|&$YW6vF~=x#h~?C&JMfA2{ZAr0v@^!w&~8qgw)EAf~suF1BwQ9 zO{|8~vR5b0hR(g{Y4YhrxD7O~R}Pzv-2f$I%-j!a+N&}TRPW_-gAldF=GfB8X0waN zC$nA!(u3c54h;^-jZK*p7p8mg3tZwOl0#y+3Q=aIm5hOS8Myws=PPOU$(4W zYS0$V)mAMYj6&&eS+#O><^vn+R~B0 zv#D#V-_6DLX&MvspC30=%4*4Qj={yN=C5HwM6q=$8Ka1y&rW7Nak-zjKyOfBBG`H!=hosu?iKL`C*;#EaH*avN%Nd*oNn`ocC0F;Lhuhhy^uST|(OprERx)a| zdcY*qb8^}u+!CAFb#>g1IO~u0 z85wDH1`bxrlw;4zA&YK%r?%EnY?HQcdrygbe}B;N*CDZhhBg1Dtv|~lLT0vX#*2nI z`I0$g^V+IvKK*xgd!$6NCU*NUIDOLBVcWYw-zrvV2p(gzen^z9f|}lsN-)bbzNn0n zSZvKLW`B~}hy8QW@o#G2-;9wy#ZktUp|IS#N`F>XsH@tKS!3$MtCP-^TPnU=(b~<^ zy*T-LGK@Qw?`MJ4AC%gsscT%8OZ;pbaBA^2Hk)$2yX`_sQl)vYs)13vj#!>ANH ze+*mK*HS&Z6qPXQFah4u!R62KX04&;ShUa&6oRKOd&o>$v~;uI+!i|V$lEg-e~hKO zd!_r#lN$1TmHK`ZN(-(^&TzS1i59|h zg@~{Ng3oG<72VqSB?ZYx>?&1~FWZk_1wkVc8&vB_{ujr;Dx|+XVUUo{e0a!JcavW^WOrP)j~(36{(wu z^tzF2GWgfNJdpSJ5YhK20Rxpr#pyQ*#oxIF4cg|kEfCMyw$Wy(4%g!XYp+xDx`T$# zJduaH%j#nYXPYZ+?*(^Z1?IQ|@O|i_M4fwu)pfCR#OaFhQ*o2~gu9CNVHJ}#8$=Dn zf$D&+W@WRIdPZO|^1e3_4O&PLCB1t`xmoOt#H@3GZM)RJ4ZA1o(dl;*(WHmV-#eK< z<>U$JA{v z;t>Epl1&ozb}SZG@$DjSXX(CB7}z!}-nqVL^9TSCYdvXw80TpHt*Fv78hUJp|kL1?S3l>X1 zGj~RsIkk@pQX<5*V2+b2%#9B_o2$}pn)Rhu3n89(!r?1++@SY|^RnJG%%zRgZTrk@ zX+VRYmQtmeysHCZ6HUP^7nPgjb8P*B=*p@Xv;O>?jjO$%AKe(R1|`Bkq?wf=Z^>&R zu85i~q0sX(3ZD`vw$`cY=(IJ)J42P5xxyD_Q%6@*Bf@fpzI9sh4-EvKDTF9%=?!oc z*TsDfprE}vLg-)vNK3l)07ZKC0d_=4vB*gih5ZI~6K@OR|0i!9UR4P}ax>VxoA+5I z{e_q*G~G)4V3ZlPYlO1Kor|)SG=?rJ=+p35n}^lXe%DEsE$zh@9c+H;^{PO%cxCfm z)s!ew{n15*2b0C*Yg{nQhj5jfB%z;c`=mA-Ic6@1^QN>huj*srMg{U5on)m}v0@Rx z(YCi6sC+I&y#X^kWlN`#idXMH=1Hj>H7zJN4wYMJ?t((j{ixBsGzMAyJHHPOl$w7n zdHdK^l_P#@hr>jOq;Z$0UZ(Dg!^mhy zEP~!_@MuZwenQspm%9~!*Bqtsx<|B+5!n@qXY%|S zy~^kzm6t*21Bxia{V1qRy!N3B)nVc%-P!TPOdzhoqK#TE0lS4&|8igZdupICV`MGh z>a{Y`zl|6bIImy6=e(l5THa(;4c^xW{@-ik&n*&%xB^P#L}(I;pB!Ha*#T{;i= zU9Ra)1r<%qH*N?=R#Bvtp~Jy8qRFd>)^1w6-|jYvuEu?1)eK)TN?Jh^1; zIZ>Ox%C2~It(dIu0%oo;bQ~d*HM(+pExaP^1}-c4qHz8J#S%jxAuq=}T7_0TqM?X4 z%mGxGOdfM;){Dfwe!)L{0yx2ieV-iRS^}T20PAaeaC%NDrbG?=ZYglC1)$ z9ILeKPAev}uj3z+oVsv!vtu`1ycx^|>Yz^2@8<#(% zZ`GPmeB6v0liShCWVP0`s>+P@Ew;Y5qD(R5Dt3ZT>LHEpG^xDzJNg4)^<&$gBy=v# z8_Az@Ld-V!Wr}BS=;Kc1BQ-mtye*#^{R2&NN;C{{3-jUwLL}Hy;uOBqRVbzv8hj8m zct3i63Ed@TF@aeY-cF_7q zvATAd5(giOc+ahGW%=6qNo-A0Mq`;J(_g$LYsD)Xl3Eu(wlK~f7%sPA`9agoH=y;y zdu?d?Q*0KpGBGU?*rqFS^ZeoSr*Ioqnk&;Q-Qf;f@6`{WegGGWCH3&S#8m0e1adSY zvMXgc^VL+8_Vxy1Z_lRo_UyR?fW?#l!eaaUeVXQbZBG3=XMAPzZU{8}7M9_ET|&7z zj*D@pZC^~A;sMl}i+-fC;WDyKc`^s9HE`B$qLS^>0KTP#dkM%%*2Ng9?6>*`>X7t~ zR)1Y`C+zc(V|n#}&BWQw%WTvwN#m~qIa4LU%oeZ>kB9FjCcZrL9K5-Ym-?Cs-HXou0X*Cy@0Q_?9k?)`ZKZ3d}f6IOPO3(~rP3r_S1D!kJ5i zZPbDW3IUX$%kks3(fH2U0qX z>Dinw-$I^@hvj|-FcJ-5q^mH+-yG;Bj+53qSFWUid)TDms z>q4}OY_}>-*%9SwPI(KW}Si708DNCy!AT}*d5pfT-Vri%SERTZdFH%UD<0e=tndC4^mPO@AN)$XYbYa1$< zTuseFLK6B>Q;9-_=_!us;*%0cWiy}K*y~Y(PG;D#rIVxA%Jp5aN(7pDeO6uR%1P=Pi%l_r!v!Rx5Oc{h4U^Za zw&v3tC(U~B{Di>fmg*FtC##Yvw)lI_UV+NAfy8^(g=WHbfn&G8yx($8VO?*WYEioC-}pYy1mxqx$ITiX3Mxi_7AOM ziR1oFe;#~PreHTH&zfMm3ijNWEb0%d%>9@Ck;fWaV}wYk$%&GHXk93U2vh1&inEd1 zq}OGKk7WC;B9r`&A|y3q@heq&DW*%M5Zixjp5X@FB((q?cR2~AQOj1T2ij$Pi%O!p zf@(#P+}Vp@O6F0k!c5-~%AQ^opZjI&hQ4RCqy}*1v1>l6VXnv4`{@86Kv4zS0YP4m*#tqgIzrR-L_W@YFk3u zzEa1AyM29nS5Hx`zDQ1+rVBDe7@{ylSMg#k@6MQet7ayX1&6_5m%GX-9a9C3+ov%p`UP_?4nO~3W zuT#tT)K=YGbK{iDgOVqiI(9N@d}rP3Q`e|ZegmOCx0N0D;F^fqARzT)9olNx zd^ef^xevIP0krjYh2I}%2FL~TT#qdmF3x)B9()=VcHonKCeJAY)a_W=P;!YY;ebMS zo7-NaJchBILM+~?IJxh=ZJ%-5*HoU~6Z;Om$_Kv;z1w^F z?!i&XeTRTa#4EM`e>|w|(V_CB(>C?9XJ2*sXEt{( z!r>4l0)43ZmX-AsHz+MFC5*I3$XBhnL9cQoHUwh3qeRQZ{$tIP1Y)&9qd zA-qSxVbK5gzt)qU-2{l4 z-O3WMbjoS`;IlBH0S{&na8@}}4is&*+{ll18^FAx{AarraoT#)wm$;2o;50|UT>1W zEaf}tA3rM3sa+2F(V;`2TpcCw({jS>4VhT7141V^Tv?zgm9H$PnnH_^sf*>)>*JNRD-p`2 ziK5+g6eZr-E@A_zztOB`&B(gYo-D|0Q5abZd6$Ano(8@{yH#!d0yNF`oz3Y&pw8L= zBtGq_h>*9#X;!8AA*U=ad#fGQ>B6{@&&2ESX%YBZ)lh>D=3@bRtX%F)IIsG(+`VG z4k%#Ukjf|n=S;cM4@l$320M|ljoGzb3j_xtq?(U{4(#;=AYt9nI|RzHK-*BzcEqu5 zQXt20yXiY{=Q~)$acI`PJxT*j2TSES8X?}*1GN_u!inJ6Z1to3RCRc2RC-Z?ue>$= z0eQrk6HH|DxvK4U9!>K9?zj1xh+dy^Lc9 zrAAJE8}Xb%A4YoPY2LXNRh69S=Ji2so9WK&*aHKlmAh3&q1fDbHKNMDCK}$WF+~0Y zjBX++@7re|In#x=;vrt%F3~<+A6J1}SeZ)Yo!%F zfYhg9vPAWxGB>O=nmv77@$sQ0SA(%PYA}1_OiKOfnWEv-4$Z)wbF!$!iBhWGP~NDH z;iOVU<8JagG51b-w)^znlm$N~UrbN^7BDK90gbW$n^NqYJo!hpPMdrL(980we2dIh zr4PqxaD4Ln-`O8PxrVCZSYW62ulkrK)! zpV&)k_E8O$buK>hs)11nV7lGcMWcEib+xvP10C!4u0q*zs+*1LWOHqgt8Hf(CAZ zQS1@2ll4PjnG&Ikc@%xj$afyas&d||I93trFr64g8Au8Ui0U_)N=h5Wzjh6bxdI*y zR0&o_G{u%OyIS=cjIWWIL$A?sb+5ep2H+LLr~g>iDXfH?Aj*@OWit9LGB33%3$M5W z@h`C#|G$BNyH4tpe>Yq1HLGkX_vx!`bt`;dh1W-3T^YY`>5jd!58L0kY*DPyj*1Wq zt_Tim`r2(}wbv-jbF24smTy9XJG51KLj72k`SeI$hs?{^RX<>UlhWhcDXs`@E`E^J zsK;4Ts6^9?BDvWWfoG}dbA@IC0a5jC7i_`Hnd{Pnd)L0nCp^`YND zIh=NQe&d1Ly>vBKG1mdkfO|tObJ=TzI9{KwQnB_t-_Nm#p(@up*S)@adAI*v-Lcv_ z6l7Nw-?bVq5b2%1*~f<8g1Jl=NJ4y)A#SBz(7EKD8eJPby5wyEoNUGZq#m}PNxtr- z^$T6ly|KM^+WQv5&4$+K#z_?p3Js#1Ur#f$VaEWsqtq}?i}#p1QfRWIcWp~Gqeyky zl*Ao0L~s$UZirusR1J>yLEc#VR856RR5TT0>Bnyko<>fW8rglSZSF$9(#O00Xih3M1RH2B_Q%-Au|)OCoM4C#FnPtQ?DosG_nzj2L3pnLeNEF& zPa{=cVrX@x%)uKR?FflTPNqCS_OSP(#^q1pxG;B*Rp?it zC?gindsnm4T>_pZ0Kj|5c(~GJD6ScxPUt`RxZd=j$C#u9~TqwTx^s6*=;D&-voKsA>3g ztU#nK=Am!JQ|wLw-ls8FsyqAv&PTBp4oN$O8}--C_q!mW(j;cLnx>uBkUnGZTq4=V zI`~p{Z?|tovX;$SLaB}qR_Giw&BFOW^SW6Ts4=eggxQZFO|!YY9Y}_3c_P($6{%#h zp@<$)dFmr}%Hi_!wZX2vk<&C(3)emEz|ReMVKthWlH6C-+(okN`tWvazx_h(7lB!7_CNw>(S#Cjc=KX03h5r3|@Gc zuun6S8>xDW7OAhf;u2~tO7Rh~nht{iQb4|n_&vHW7di6TtD!Zp{v*6+$M;eD$ODfp zE2Mb8Kt07UQHAsW%$?FVfw_~fTAN^(S4r14!nO0eu?DRJ3ia=9UR zcS~8vk#&q)B>XjCIWRBny#hEEcx~!~4z3GU3r&0H;H132ca3r7DC`YkcL|U@X{s;p za@Ufhpsmt@db|AvOEh$OchVR5K6A|}HS-D6MsMMl@-aYxS)*0dWi=C5l#;vHd}Y#l z)vI%*m*#K7sWRv|hlyKQ+yES-Gw*l3Sl=Xpa>3hG1enOEn{H+aFRG?n4ouDwb>GRn zEEvTDA-sAHs4iq)h|xaHyivA_jOa?;eMEzhnu?47p!AY$4u$)=o%b#2f;xE512zot z-m$(A@2w`25>04|!Lw;y8f!sTy4$Lx^$tLmu8=rc7)2<>Ulp~R2__m%oVE*S9E}Q? z3bDwnFl*z_dOo-B0y;$n^H@;T1X0^eG$E-B2_%0X&v$Hy5-6YZ_Nj2Wn`+v$pI>qx zH0{e;L)^2$Xh+uc(ix=aDI9M@wBiFiD@r0|dW;X;^r(Vy!$%o0Qf97H0WNTSntv>h zRa)0o-ygZrNVjMakxD59!8%I)vNPBu8)07`)y)V?aSZ0wwsd`}i7UQxLJ+qIwlhuod@iSj^kvpFtS3 z7lg+9G-I#kB$FjX1%e%MiA`^2aQ?^fhD@Vrx1cA~nxI1D9iC z@T0+5W}=7-jpj&@H{d3+%**Bqm%_Q5R(lRYELdn4fDG+`(L-w92K5gjeb%Lol9PiBP8mpMf5-IFOS46dUJsBj<=+@uN(>(Z|8YuIV&e62Y=+v9r=GBr=9vR}rwYpz{OoKHr?skR ze%u#i@cbX|R=Mo}M+uYxzxiErud;3mke9*hZM!+P66PpE%;y(oVvRFpv(xl&-o_xm z%V_)>!|+%&{Lc2KAqEAl$#+O=5N!$p5-Zjr)iEXe2D8Bgv#IhOaE?DidGZ9$doeV9mx z5K|SH5&_wQi^B`vF{VHPYO{6RqxUUS6i~rGHP4(iQl34GunMShn_4)XRqe;>@XcX4 z~j=2JE?zTdlF|!9Vmh#PT-L5q{!&+y0;On@>?tx31v#=4Mpp)i~x=7lKfC5pi&j z;&FCGx}pD_0AFq#1g&%@3h`8#w@58T4`T=>6fGeq%{0{chfX}NH=75mzAK&Z)?ll6 zc9}VMn>^pM7C0l*2tl0tgcw%)_}$Uez+5HW9CQAli}Vb6m@1#-mu0!g5E^Xm2VV_W zY|fE#ahW((`LIj;26+(?=&{H+Y}RN499R3fxxq8nMRn^x6DOWb+ouy;G^*?3qaE!) zV&}R=wQxME-x^MzE}$cQR3g?*m(O(*I)6@PsC#E#ewrmk99#p;vNM-bcCq5ot0=U9 z#(cX6aMuNSK;S$O=d=?o%7njzoIaGJ5{@0Y){nXx9J={N{_fl%lg60cMWToRZEZUEt`s_SYc`b2QUa1e2EG#H!3 zXVSyt$vHsL_E`%c43=Rqez^}<7(yu$>|NV#XyCN2YjfeZh~de~Xtky90@C<+hfGn&?e)Jy_F-r2 zREt(!O6$~C(sQP#T7s|4_#uA0)s*GQ77m|2gpEgM!+vmAEk1T;~7{{&ZVk#BGZps@;mx6!@$3%kbtI z6`;p^oXIws3;|AzA<2xNAsPX7EA`34`3bHY>Uoz0H1B$i60Dj&G;D5dFF(@zkC}?~ z+2Lq#2(WkMg%&RV+B>z`2VK%Ehm#B6{g8pm{+PwzBldO<5aywQYVS^H`FKyN%+Ix* zpzFnp23evZsUJ`3#24+XGkX@BhmU}VwjzgtqAgSH*FLn?K#kmvzIC%HxsEZRr%bH> zu`w?A^RQ@v*gXJ=pfZhf;vQYp4dBG2`DWmaQ9PwwfsCve_!*t;d2=;mwwQu7|Af}+ z&kc9*1Q(mV2qn2!(HbgomoJ4F)Zh<~0w_>DGZT&J!qT-h=#H7_vA&v7ToDW+lpCap zr&w5lT4i2JjN!{_?ydd-fOU+_tW>n3is%^?I4=HH?9hh}Ami%i61{Zr1>$#+py1`t z`JO2@>($z6j{+W&$6ibOo*?c`Hjy3_ZqQr5oDtZ4l@+T)$;5}+Yp?q~+$0qY-D#ViSGdf0jCaIgUY$i`N;Y9G2sQ!R{0R83EHva20|CIil(QjFc~?$-zq0eIkN;PDR~po0mPI3NNz)=Nf{4h{NH;25 zKoO9zC<mZSt3|!ts(h3E1`-l z*{yN55QWCwX!e1c?}hzlWTKLWzR}(v4L{SkPHzJCa3Q@-+R7d zWOg3ka#_o_1fhur$ykT$-nOrVv#6qhe}pX(%&(hl7$Y%&E<8a5xUs3fzfwo?Mijdv zCzGl+-iX!pz0)K^tbcS!{i>ek6~dHrM~qT<7=d%G=&TmYApfChQe_qEVP#3nlpazk?$(=4aGsR$qLDwFJ8UnU3{n5kQl9n^Nqro(XQ$@~D z$MVnR29{VpZcOodN?`U+02;=b*3@TRL5~Ma+^+FCMH)c&_}-?`+dHB)dbw@$|F-C7 zcZL0(g7!n@!*H0ufTxWb%|GqU*;!oUQL|X@p%;{TEmqYodMo>kJ#`T>!*`pSgm`#Y zi~zs;^=A%OUkV))?+K`W?07ZPM<0_VH^LJ$mL-TeQT3E|QScswI0v+p?Pm$UJIiVi zY?$oHwIdf=3+*F0P5>-`Y_&5Jlp9(Eg^h3h;aBYENKib%UT~U9*-^q6Jb8Cr^uTde zEIm}%;t!4 zI%0MSMTQlDn}nLtje`>5Wm1^%`xqK^U!EVlur3pmA=Ypyhw!oPs}-Q+jhhBtAubt9 zOFqS=J_=O=pecT>1wYVQ6nH#J1ZUXrHg#=i`z?-D73q|+Xl;nd2-8SiPfM8slCPdd z#RY{u1%S5-zwxY%*v#W@6KJStJ9H7}N5rplr>1k3`ok|>p?6ndxE^rSxM3PGoX*a| z@@p9^-orpa)vWN5zj60R#5^D;=H4C6xe#czRZ(_1dNU5vfN2=zO0xs=Okj!g9M@;X5t^-Xa?^V(?qYiF;B*+&ocCKO{nnU2NwUC*o;&$$%rHso zj?hUFw`mQP9mXR;9xSH+l?RbNdyIy5Z!U;ZBwwuw9o(q=7DJt=?rIvMja&nV%4}k~ z%7VBL$;E|UrEpfV{74eg17!I{M&y8h$SG@=Lc_K~IC+YIIKDznZk~ZsqgW;4V*NLT z$IM!Z5nTEWmA3Z;aw6R$T_J&t?w1wxVm=ViawC$~q-bFvi|~5dEWKu^XSXe*VW-HL zzxP^SuAU7#*LC4ZKv(Ve4gy>%>kObKB0gY{o-)Pj<&uM~i|}<9=Uz;a<4zVeV>-v> zI!ya;?v`VYsuK6|Fo+Vs8Zqh(NJ5BCH2ILpjCl>N5W+$O}jVUpFS#aqaF zmee}a4{^DlC{XLwW1WesB?8PHb6^WWR5<5*H!5RomhH6Ns92Q=x#b@8aJm4JnX@7r zeYEszlPE7A$8RYGO~wjBtLMFH1qiK!m(#Z^6r8cL`!56083?n2eE%kn?^&lJ^%X!K zFK_Y4WZBa#PhO$~R9Uhz*1GU#gnZ`HNUMBRD^~+!RMPr`_udhB#PiS-@`%AHO?hPGzRKgCQJ=*crSleG_LT=&kWrHe1ZjFLr2sRbpCxY^5LOMzw392C$3Pu&h=gfz-MJEq`W%3%IB5mDsQ;uLSYm@9J*6VDK z<3Htjj%l}&)lFQHR_q&n=07+7s=ww(7oj|Lgg7vb$YQj@4zaqr_DmHxCUaZE(_8~+ zFSje0F@2&?3$c$s8tTRHo~)-ew~yE@DV&L12pHVS6OlUHJLgw62y)spDw6+eij5p# z>(VH-6KQy6YtG$|V)_?SI?|cIY%gaDaL+X&5mAE$jc>-#z>@HVn!evqKD$e}@StF{ z{Z4n(ExGCX*LdQ*Ul1Mh?&Z)L4R|>H^NUM$9zH`L(O_H>zChcrWOIjZugc>eIUepF zI1^$vxxH#6&fOLe)kL(g$lbS|c9l8f2}~4SQOubX{IwWPA_tO!fPB14wm_ zC8S03Yz1Yp{QN$XH25SPB?R+Sa9Yv+@6k!IDTfQ1>vx-sS(Ab?C>mWUu{K%XxJ}c* zRk-CjmTRtL6D##_~TQS3PL<{`|Z;<;V^&B=5_2omv#9 z)Tb6xRm-S6{b

$<^7@O=(O-KH0g$1nqydGj1a~nA|iycE>TG1O{tq+yGuyydmPi zUiU=}?V;H-kWyXwHuL;p_}p|!g-#3)DAkigH}{#;ACnJF1oP5rcuC^^En3(6Zkc$% zV8;wrs~>vYxLRG?j_6nUS~Lm>YVwEE_}tsk#;*$EI?-h0H5lxK=C>BVrN)0}Vb`cK z`+}iW98K_m7;hlV9v^*?xml&s!HI*e4;BUNU#Ghk25V3PZv}aEPLJB7j4U9xey+NG zgc3fwb&I+GU@9bO+m1av)f-c;L$qqHee0lA>ijtLiloIBGWk=@w!S8uKM_Dq$U?wi z>6z!C8G=vp|F=KREq4($vcZeOfC)rpHX*e0Y24ioemHSHvzPva#W}&s_D!Ir%qw`|q<0e|`&h=iK|hlyFaO z=w>!#`=WXJBooYY0k_<@%o7M%rOW%u zJ}BA+yH@t0EF*`)2U6V~Z^dmDy2surwRPo7XSH_h(d@6o2&x0Qd(v0#aZWM|OD()u zcur>Pz0%0BtyHTyb5wos()iN}fn(fup?f|%rAUKb=&er6!pl9s#TT{pP|s~O98j)9 zEkeG(moF+866)CZI452u(t|eLJk!`fr==ftS~1j23TEt- z`j)7G&&U1vgIGk^+Q!(R>D#V@_jVg_20UlaNRnaRoKMoI$l}#n&9uf1X4JnP_8dKn zi(2}InK3gnu!<{iKsU{o_)3ptgiQ}&EV_L5gJ&ln^nTcy2E`7&r<4Y+e2Ya9wq5tV z<9zQL@X+BEJ!2@9#hw;_*|m$~u2RV(yAK1U$g0S`qvtz(Z< zg>>$C@pDTV_Geq;`1zeI`o)5nLQZwd2*Ic7oq4|aWe#jZ0f~@CJo{c_`1l48aC42Iz3V7yR3^oRBPn+>#hw?9`pQx`2D&K8KwK9={J;Uor9$JWJlbP zgyGmutMz-Km~Ow3g>+PT(`;w5s;U!mtI#9LAEHw0^kiKB9;bNuN~{LA!noPfrJ91p;mRmfo9V=8IKqiF z@drnxq%Ek`b+7uy(P}|0j}1428Z;0K(oJamjR#BG^?9L;<1>LiUwBNFxdEwwju)Lu zkaahV!}$;2$yQ3f%cK0J@n|Zdio=aE5LMgj3pc_|n{AjGBV?=La z=D>}51VdQ{Hq)nsUAt9DI1wJqzI6!pV>3LU;JdHR%gp^H8;{z+KNUAybJWzrs&I8O zS4LFoX4AR?syGD5NNAU1-L#}GTCf5?5LM0QXg>@*F##J6WR#FsRz})k%_*_mY#c&K zSg0d!yELeQ*O^l!igV~6mWYGxKq{2hU@5*aM*cd%y5*hYcHVX@RCWp|o(`%-L^LaP zK1lbq&^J|4vx(nz1DEYcR~BU&d`^fL;Esbcy-IPV6tgu0W=(0xEB}a_lv+sqi*MoD z)Y{`DA`mnbz11HHWX6*kvY$>v_J~2bA!o(4`wstDo9|rsM_x;TffK7Pd8f8}1`Odo zKkV-Wb+O0AYxYM_jUn+9+HwMBisNX*==IKSU%}lakVCVSar$7xu)7NE%h0Lk5p_0G zcTtx7sk47L=|!p8sBpE(pm@fQW@KTTOkhuS5iB}|_;1N2L3GK5g=pIWx%397VTm_@ z?2UR{TBhhYvwBbQIN=59x>Xn_z% z5{)ZEk>3oWR&sb9(UjEa6qgTJon(>fo? z{2e{DrYM)}h383=y9>nka7I@cb|}Jb#@?+C^K;x4hMAXTC~KO$9KHJEIoxMsWspQ} zn4p7zpdDXbcQ17^77_~ZxV!^7MQ_W_4lSoVOFia3wiBAbaDel@HA_t*`20K-mK_u# z{#?rczI%n8L0jO)kH0K3NsYwyeG1A>FCLk*ql%37NIB0%hN-Z@F(AfSWp0cGpK)k) zVWK(ai$5=%E1o>k;&zdVc!ps;H_&B;o3=diuRD;?Uh^tvZ7%vHF^clJ3)FlmhKRa8 zKl~KYO#{WdVjsI+!wWi=ymkrQQ&y^Jg3Xr8Tgi0PZbS`Buqh#{lJGI>ith`aw0S7~ zWWh$%66*OKYB02F{z&I}`E0Tc;Z%P_%|g3OaQ`!FuC%13YaN}kv7ojZIx8AAef61pY{wIu;M?VDMX1NG7|Xh}P~-nAp8rOABtJKO1D7i8|w zWTehUgAp%yAA9iFvw9(WZF`?D%r9f5l+_z0^8{c8PSF@-tzJ-=QY#1}(qv&me z%)XG-=;*Fzg10ZsHkT%NZy~&l5TrgCI4IOqqnOh4tt0NR>+s{8ffgL?zS9GFb=~!x7Xl4z4fo0lGrb84p-XC9oFUYVA$@! z1bV4;2L`b0h;e&)9#CSKC;0pReg)lR?cN>(88Q8L@6Je^1K|9NgtL>{&BxINX{mWi`DNCNr)R zALYtiKBWvGisgW><^(H#3^h54L3u?7eZIMs@DlMa#dq+VdbN&Ct#%KfdEH++D#i_o zzCNY=-cGV0I8hLZg$SB8Xl0%9fMoAk)E>ubvp6D{BA1kG?;oTYd_X?io=~|G3|Neb zwVNx(?z)J>L-pdB2>Lt`_I}_A;@S?Rbv7V&X0xc1JxjiYw)wqABY(KtNIug%ZssN9 zVV&OChqG39Tnk9SQuwYblbYw_mM*lHlRU!Br0zS9I*Ly_e{RZz4_iQG-1oJ7PG$}w z=sq&QD}o?5PD-`Ho}_L=8io9qKr>BZu~msO4RY7))h#v}IKB4UkSoiT!vY(3N9(vf z&>2um;V84_ax3czas4T$YaOA9ML}Jv0Q`D~v12LA1Y5j35S+GpW(U&IU2&0wE%Q$C z8A;R-R}PX@^YH(tYYNtN4lZ z!-qj#AjX=f{UA#`{Ellph(72!tV&_$i_L)FGHMNKSca&1{2v`BDgA#ww2Qvqunmb_ zGNvnL`468wqGC`;u~NKbi=3gjXGa&!m&XIY(u<#BF=r^sK~tLN*E>g=4Kr(`AL6n% zQQmQ@<98(_o;r3LHa_*NyB;KUahFuWj}6icE}i%@FgvJCuw@(LB2mYL2d6Sx%Rg)( z{6z9IOP>sU3~iCp*Nca4u{m*G#TIdU)LwXkudQ3bN37zcF}#DI(|eQnsZ+T{tV4qC zC$f)rMdj~V{_ifgx+d~t?P8J`a?ZDP zi&RxJYlbHV8aEu=Ba^Hb7XV;6Yfn+TOQk`3{#nkZ)l_$FW@1=sHGor|qs+AU{Fq^Q`YhsED+Atgl~ z=k#ltvk!yV4g3wyS&$;`N5yox{Lhu#dU?^69!Vc;m4_dRbl5~M@oFD0XT<|qv+S|! z!O^JCXX=xLgxcI3MUZ~fgVCmN-yd)w^pFdm$CG-ftXeIj`|%%xSaoK@+3S--E(c1g{16$!}SsHN&0|)O)=mT=_fjz}oB_!A`T2CfN7wNo}aHd}H zsjA^XjyjqV<$;;ALa(iMZ7Y(Jbf0a}yb~b$pKs0B8&84$2xi%=M#vb%y;AY{?YKJt8-A~*1rHd9Wtv?4A0!9rme}ew zlGP#xvYR5QFf(+XW z`2Gf~dkIi|XMk1O)Fz&?KXPYm=lW^FGfAkj|EodJRzh}GMCnrWdSO9^L)xjlHj8J=da|k`Y+mgQz29NglzB$$o3(!1u0OZ*W$?X_BiJ*iST8eL7W`D<3d zE7Zi42+!QJ5$}&nK2ZOXRmAE#r#2t=;;PQ_JRz&F?U~_;un)(*xeT!4@(_3l@=(P1k7-DFfo%r1SLKbqLaWYn=P5UD@=u+^Y^MI$l z74?rtkcMwbp2HunT|FzJhSEV1nx$Ud`l27(WP%5K$u*ZVL+IQzvxsSqN&t6+YsJVyO!KB; zzujB`YNAcdW7*kqLKb<&8vH>@+Y^XV>1z^$K+}t2G1wZ+nyF1c`FBnHZ%z_8wo~Lp z$ipS!665bFc-S`N9+jG6ic^fQAwLr@M(^6f3`UhS^uJOj?GzoR8Q82&bwbc>!AiKY zjdj{4%QKM$h2%x(&JEosdPc#X8S5x#rDHXXSJzANYh&$hWW19KY zO)uWLb#BzJ(vx3f@w<+XZoI+TeN4705JoQmG5=DAQ7^W~W%x)X041m7EdmI>ssfs#S$4c_rQ*uc_6V%m-E?E#u*TxXC^4*^R5Cb*8*|D ze!Aq^;6`pj*CY=P1gQtwIKyRr69YrN{90(GtXDZ&uq2XILq!xOzVyGAzEc5c4G%g3 zts&#I-_2eX|6=~~zI6E$M|GZQQk%r!RWC#rHuDkif1DfFUx}{3CY}N9l)UzcW1Mfm z(p@47+8j(}-HC&W!$&7gy$fCrs{VCVRxT{|2-z#N9u^m*D_-LtF~Ce#DZ%bCJP~TI zi9PhjMX)}z%X8ogP*B!N1*Ik^))l?@atRNdNxA}h&AD<_a&)1BY9;SbpT=BfYFS*9 zuyO6IzDs>-t$49?B)j&=jbh^i$)BXcCgHX!s8rAQ+mL=UN=q%J3jKe)XoONnJm|do zX%V8GiqcMiv-urklJeGQ$`m~32<1EZ+SgUyn%wNvFUoDXf{ucyH2jF~*L1y7{99$n zywOiOV*(fJioBRc-~ZbtmGppl*Aj(2-+KHg(-oV_0-)~>WZ7w2lpJ$28SdX=7<(-| z60_RVkC}R4XT_K*u^LM$N%2;3&>cQMl9%!@iJy6)e@{x7`=40i<^1D;{+f3q7(l2L z#fZUXsM3&HyKdFqpiSO#y?P3RG#XH_3NzuniI1okS8UH-s(ii0Fa~4X4mI{duXlCL zOg77m;zIdhk{IO$%3(MuX6bA@VON6sd429|Y!Q^&l6r%Qb%3wYwMlIisV`~hhmVFrg_o79^*+YEYIl~i(568{wfXoCU-5Z=?hQF}*OjSO7tPS8y;qNRM)RyX& z`8X)9+qw074Xf{&*1S>}ReLb{<-`mDY*X~$CLoD_{a zr+q%54^-(=qTQH7Y51zL_eshtLhA3#;OH1)7`+&Ywd-n2bz-_=jPr@<1;uT>o0M}#f7FCZL8C=`nT!4_GuB4y^!$!_T(^?viO`3^ zpA_VX-UuJlM6I(SAFqa@9ppE&X5?_RBH= z&yk=k|Li=Yw6~jtPeGhG?AY%(hx5v$!A1NW8q1PrALxthY&mAk>}IGZ?+gK!3fTVD zX}>2pppVPlti&I8Ns+9pCYi~o#oFsx!Oc66HQU`4&()GGshV}{<)QJiW~7f#4Z9!{ zv!^{W-d1t=X!0L#8!gg7TThn`sBqOJVODQ9dAf@pFNjy$2^pU0qU=GNSlQ2)aoLw! zuljxYlUR^>zwOv=aMT(p^L1aQUR!RFRP`-@f)4^Z#%0P3Dib5s9+^b%cx3%mT`rx8 zpxmV7YMiL1*<4!pxvO_~tqw`N_7i)_SU~H)SY}qbUCHAF;>Wyax_PX{ zq;JC%wkv3LA{%Zb|Dfe_qFDGdT;l9W`fPkSf^*6J^N4;|NJolatCwJtxrhGdEB2VK zm|U}$@#mZqIRnVLa+X7SlfRDVWzSF4J&Ydw-){KS7YkX_HndN5QW z39gPnE}6JE6=WlPJ-mk&suQBeg$@Q-}J}|of zwX5M*LHtz^e-*@E1@Tuw{8bQt6~tdV8-F39Ux?`c1Vpq3S!S<=1{ZZnuF&ScT3B4n zvp~u+tzZ2i*`A~RPW0S`SEp4^wtrBp5Iw2-vLa^oFXgdoHivJ0JH6ZLlCb&E{Wm7d zBio0}-9uLk%`A9n8H;~9_EnojIYH`+*z3z*rUL&=_+Foo@mgQ_=kDfTAHOsq^h*W5 zQ~+=SzjDDZ75wsoUxBdM4*kjnzf|zc3w{N{|ChOd_*qs|pRB{Ku>fZeu32PaXth2Q z4l_PIL$2}NaLbZftYy-&9>2pl^RPmfoj>{Rz(9LPWoVipQ2{-h5!BB!?(05A(<^Zo zN)z`JD(i6!`=*j9Zl;IlXh-oyGX+bHPIdtuYVrg5@Ab{}mig@qg0%_JqQq2pj)s8h z%}H&q&&|Hr5Ng{kq#-}{$n9k50;`6T6*pT?9L?M+s+SwE*ef5@Wxxk#Qho4soC&Lq z0!#Vtr?C?nU(bOVuPVJrJz2wGB=EE?$mI@F*p7EP!Xk=W3o?T(ODwcsV)_wq_g3vL z@xa%a+4cdyLBmI()sf(d%y9FGaml&KwS|es>EWdrz89(Ye|k>B4ymWmYHA*bT992r z7ByL)d_Hg|%PWeRCjf-VuTdzh-{%zgt=;z60|hRUq1P#>-!4_@LxZLjEbYA%uw}pX zj=o2(XuRmhj3-HvjE(^CbLrr~YS$GmnqSZ!=v-;$O$yz>LC6hT({5~iu2r3PG>ad= ztQ)NxeU=HquhB669hPiq0-*8GJ)j3e4OA_&nPZQ}w@H=l%@rna8^S|NZmPiik5?}g zL|;7NH}(lr(bJ*`z69*13uM;q*IE1sEKTL-(i$J-=yR&FgddtV2@{)Ygbh#mfR)W; zP9P?~*y>0;NRoaBo~uDGILK!PUN6~OnH)}lWsN&E^=AE-b?)^&+T33_p%B#KrA<;- z?Eqd>Ett+~hi67CXnVS);Qt3xkamJfakZ;jFH5kL2FnMpY5ME-)y<);@ugD+%Lmb= z`1zyNL0P=@SWE>YWb(1Ru9eezW!LtJ$m)PEXRQK#R++5KquB!EypBk&!7y$q$qBwb z-eBk%q;Z&3Y8wRQ!tKMR4v*0036Pr;@LWg4JS2Hsr^N`)<4CxlMtH4_2Xu!9;T++t zIE+7Ig_ynJ#I0_t6?9drOxdqw8rS)r4ISGcc)Ia%Go>OIIE~CCswFnZY1q$;$uR<7 z<&JU&g4RZ2qi*p^RS@$EiF3PwqoB7-kcj+pz1{O*B4@rQx|1CfHv5KVnJ-y2Qc?;n zco;j89S*CG9F8DKCt^XSgn4dbWW&6A+8s#_ji|9KOWF-;%S^^nxiuVeOL2byLwO-lAUh&IV8kqHXr$XdqPM-PyR;Fk!>C_7?VGIck*un8H1T<$ZMrR}V+HLn%frMm{{S%Yng_@cK@>z_YFnR?Zu0p~#0F1lGpbM{oBIJkacck*rV6`gS?g&#ijXmbBHoav-ffPdrp$}gYxluyHT=Z z551@_4xDb!Cvgw@R`BNI(Wo`(ErMEUSANjimMRzsX|W^h^{9j{$+iHAPx8AzPzg#9q35cny4Ceq!*1z(yD@?t1S46{e+hj zxFlfFTt3)<_r>%1g{#kTG}q(3u=t+$ub*wt=FR#fb~8HVJ*0C$-=3gV$V9$ zB~VANKWaU>S%+AM;>7)0G?==}G=VWj{b|j#g))B%3ZLe$tsQgEa5yh1f3-PF7>Sym z+SOrhnAsDc_jK|h!iBR+&XSY2K-VuiVN4g!7Zgv9p0HCsYPExLY^pK56JpuEe_BsF zG5GeLnRTK_UHAP0CIdGO@=!{SOK7aJzrgM>@>Ll1NXCaXC{1k8^eC(Y$;38z+rsa} z{0|8hSw3Ig7Yxrb&&@o|1D1?Ao5BwuExcUpV|^DVDeWJ-0F7{zGDHW zg8k!EIXk3aE^o4aETLp~a4$HWMbN?|_em$8)P*x^U4;l$H;49T4`FU224^6Qs|!kA zB^Id<2EW_^O=Rp*AW227d0^DtU~V}3jYnG>>=iB+Ic9#XiN4pfYa*Hpam1+~nQ^`4 z4sK!WVa^TuHb&RVzx2Re`I;R3z_J*Gwp30uC4K)MVGjiUrm%= zR_nUbfIa+fX>!s8?2coZt!vddnPZw`4+9*pPWt->+{>~4pPsQ;qiL;A1rbJ8$ZP)Fvv+_PnGh!~?{Lz92 z4CQ5;|2lZDYZ>XXblGQSveVsEA3(~$Edrj>oc#qEz=*O<+}jPG4-pHeb|D}h@|xp0 zUrxq?*;R&awU@ga3?tRh*M{IFb(bf2?oNe?#@7lehj+y=$uln`7P&SCO{`>A{5ZLYs~#DqzMfNGxDR(m!T|v6R+@8{qAgJAq8d%H4We z3o7eD@S#W(@*k)PpmT=TcY!Eb$*QJ&pYVnUVpIX%h3Z_AYMisG9@V^qu6vjEm1Z_e zY$vrjNPDCjbx_rCEa*0C#h>`kv=>BQ?x|51hlk`YX^T}SwB60G`D0;yZoLd_aQR!u z#qPq0fp-ao3r+EAW>XXEul&^yw_E+?aQ-TA$!Z`Du&B^+;D^4(aLNosFh+2fJwj2-r;=1sY#8$nbg3$|*M0-4%IDgN3{P&>LOuKILt zHus_t!6%K9C9s(_Oap{UNmljbXSGIPa9LJXO>dAWHSb&9SCEA7Hr}#LE@FR&u*>Um z3D=xt5bPyNcfS3v%UhH8iK8jh71?yMscPCJTs<+^fI-giNJXS&-Fzw$WRO_^+ZWzB zt_p?UX3WR><06-NS4uimJqq$^LRI+o{WC%)E*XzpEs3(+N3xEtHp-PF%h{;JDfd5- zBUK$P8}8*Y9>;;Ob-Yr`67`}%yRE1*yoPWY_KAsSym$eqN(-8>%6~DZWG1=wae>=y z+=;)-i|pU!W#94pfye2%fyKjqFq8l|w9|)|{QgqLfrOh%u2y+^K`q7^Hw$=$KMsU5 zBQBB_?_aoDW1$Rw;Q${guoRr5%;rAR(p_91mFh#ymhJC3Gk$h#5~JrY3Zg6RVyfdy zZ~auGEf8jvgYg>sKo8VZPK_)-$NZBS?GwIcvmwv6OXeypcB0z501?qklc&(4>(I0YP_fImc#eJPs@+3Zvj{WohkM!ng4`2{p7 zUr;x&#%KaZU1$B59$D|cAMty#P$Ga4!&gHg34ycug)ClnD$cy`TFqx+d6Ev-802p6kSKYjz|M*y-`eCcgm;S!ijLtX_ zeQ22a-E*Rcj-lI4AlZpnaG^7+y0q>NJ993=iN(46fpda!^AJf?Qpo2kpfms&epXB( zoZcoi<6Aa=J9YAE{y*;bcX|Tc@BP0bezTrPC46o4XC@|kh~TB~i~U_h{^fy`y`T>{ zmK&vn6Fg|iO-~>lEgsIoJ2nmw&&gYSBT-rQ=V^OKX+rJNbbAf;MnRt=hBv+g}22 zyRMVE8@Nj&IB)Hp!hNVG5WdQ|?=OEJO3_jxb^pxyT3Jj};@dcq@bQ5fVS-|kVXY%@ z6fG8`j?aaL2JMjQm1}33>IbbPepB5H;p*x9bzt^_Aft-XNhi z9?;(vu187%;r&~^Zdt^hAGLF#Q4>!mHtZFWUkd9CL~y`K`LP5Ydgxr0{gCpP5i!{5 z%%s#L*jA*CVth?pc${`A=8l$64uAt((n9vR^0Z639?4Q};DE{;vOGjP=GE{&)PbAiK4J~_&UBBMYUbE8~D95L+=c|~BZ~eFr3=5z9B%hpRWH6qR zz~5NTr?7L6(2MMFYY4uyhTo{`quP;RYPGsaF(1GMu};NV-UI+W-XsDYKTwQgJ}tB} zMM`p3*ddI|xCrY^VZ%XKf&K-z=a^P&d2}f2xNNsoz0oP%3sW?C%~+mq07U)wCNWAz zvZ~KNMcOcNhm`Z+ibQWd4a44%=}zuJHzK9?{Py?H`wXE^*NQFL=5cD zOA>mViSYl9Emet+WEX4u^j_9|m$or;8@;08@r|l4Z31ua;g0bA0MOQtT2C@VEL14kIzhVD6EBCb6@QvyHEDk|>esZ?S9!PB45uYd<&+d$+ zy(I2?E`}h|7q&xZtSQ=S>Ch$@gjryuX#m&OsKgIq>31tU^zm2a)k+ab0xeNt!x)%w zT2-rrlp6bw^Mdiq9L?BAvQ?S_H|VS(km;{Ta&D*OMpo-MIUo7iSjT89x90dw)h{08 zzy};ezfRA(zxkQdFKzrI&$$*B0O>NK-w18m7z79&J z-un$!V%Uibfi24j^xUlcj#NEPN5GEY>yWB>LTz;AQrIhJ`^wqeq>@d#3OBQ;eT05w z!YgVamJ(>vq8o2Fm`d)bUf#PuxXS9*9mvaMF(kik!SDB9W2& zNOrGR?7U{j7OpOE191AO#`qhH9?`roMGR(*DCKMDJ%JNE~~DD zccH^YU;E7tDf1}3KM$Y!WN8O=O0PZu_ivf6|3dW$v-#VCueF6mdTK@3QN`5DuLiz2 z1P>Ll$?q3ahm5X8&foZS?P%%jCe4-!T%3~wMqZf@&G`P-41v_0eqt+aa?PPP6~FQ! zaYXzxK(aP}&brzWK#cXb$H|)d=QIo|)4}wYjtSK}i%p@*@e>;> z{u2O(CP$h;y{$HhKeo~&$wvVi%ZuY7u{A)c&9w7rsO&pJ=D`rAr z$o6}-JA@uMTQ`+YN+mqT?gTwjY$d-p_aW)emgOkOTeR+65K{GuJ>mzF+se7pBz*t8 zkNXJXd3TUwnDdHKD_1by+s+xAPm1-RA@>NGDA_iBOWE78M_A-_W=LZs%;nJ5{E;vs z+RJS>d=%m2-W;b@l5wLgpw>f2C?)aQZV>R&(9>f=72@*0F%xpizU12lnnKp?Mjjt? zy@w6x!j(&l!(ksJtl}FM^P0h6 zcD=hh(EG8Z{Qr8B3EXOg3ip~Ns%*GJj|*8lWJQkW`N%i={UrRqx2qkq&fNC%+QsGn zJ3baSu}>hNBHu4}tsI;bwkrBAi*qK1+#M@S?`ifd-!pg^OH6+h-H?S?NbM4=($EeI zyl$C03Kt6@YwV|8oBRbI{Q9}gth_|0c>MaP?ql*LYBcYilCtj>WXEg+ACV~yAFVtb zwbmS)IOkc%@Skr@4%!&^6}-3O8t^0DbCMzJjkd?`HDK`B_X164?=Ah;TV*e9V%fwU zV3Wr1Ra`q9GXx6-1`gBp^Cn(a(}LE0)&1?loRZGesr5us?FO+ z3^Nr0oK?LObP@t(%S*(IgRS+e^ixDB^aZ)GzdDB8qYBg?nyLWjgz3976Mj~nodWrf z6}t-W0zI<%-~YMu!dS>R90dN8+&5OneF$Ld91XH8t*;0e!Dt7=FL*fMhavC)@h%wz_ex0?tOY)@feP2PTANJk3Y}=E&G21og=V@VoFYr+YEFcWz33ua z35o+gh0<81MC$?-13~idslYk!kg00H&w0aMaZ)jmz~LJz_{Ep(wF30ntfUm~LT%Xe z3-=4zgoRhE@w%gecVI}e6XNbfGDJXbVjhd8w_%rZWEyJsBi0x*y1+2O52_RA*%u@U zEm^b6F#%YJ^JtPPdzrF~_>gUsFX@DK(U}%!K~+g;;@&4SY&#upgV&?jduSJ}5=pNJIHfModtX1LFfAxbbIQTe%QR z1uF40rkWlCOq!0uXYjmy@C9OsH8nloXu#NpqIDv4vM{fkz9ygK^i^geVY4bz7EP+= zr4vfsq2=pX2{{Kde20bI{f(WVBe$r+1mA1~HlXRT2z+BBNN|T&KMTwSCZ8Sf$aKqI z`|f^$)N=WhQo>8=e&^@XBQ~7QxsQ?Vr$)ODZY@DpFiyygm^&`4%LEA!o9OT-jL|!U z9q~!-a)9gKLZM%P%141I26MNB$*1w9+UZl-7Tn|yw`P;W8 zU+YS0;rW5XB1Cc1l`!`b49!77W`nIM7#xZcs04{tO-1ZgFA0*A-^KJWSm^Eaasx_z zE^r-^uSc!KEPQys50(Got47jDWq1A8P#`5+UuYbX#}+0|O?9~tKqeQSK0Lz&t(wa zC0!K&F+78=E39mj94Lx3gOrQMzXg}LOHCmc(rNYY0#>JJMUn0*y`irZ9(!c2w>7hFuHAt zS!Gv8(GQ5}TT)l&^j{~C)&zv#UAj)Ic zTQ;V{Y500ecL;Q&%VQwZ2PK~!_&|X=t;(s7ztCdf0+0cAz``f(TOCq8^q<;O?Vfxp zA0IjJezD%tt`0_7gP>Q&xUiImr~RK0kQf*4G(G%Afc$XtInmp`eS<3}<7ax(`9{X+35guDVb~Dt_7EUHEIA$#>{LgXQv)B!gHt zTgTGoEy(9GVHN)HOCeM$jRf43x?anPntX2vH>fp=Ja*X1LLRWr8pm!Fw>Wo$%YbJA zgWOtT6axBuow_7QC=qAgP-G^=l_o zv94zK9c6fz&e8t%Toh|UGQ8lQN6?hf1#zJ;E6}VB+BU9R-(hF+v zInin@*V4DBlQwi6h>7F!W28~b^pt_fJEz!-p^WtYQj^B@{n;}<7hz0&eZ=#fFIPt{ zWP63jLQiFuf*h}p!0Kn=9ipV!JD76E-5%7*CH<%Lu2^%ERcUCkI}}z6RjVq``mBe! zHlF>+RTy*F?@&KKSu~iCa)U@vV)uSKmmDW;Yg_u7{Z?eVRJrQ~UM?|nL{*BX%L!3zmIsS8ltFzpsj_j;ivR16OpQU%O!tz~>^8{$@z*o%$Eb!u?pLP18w2dt0mi}>>2=}DdbLzk_j(|$Lz z-VO7c4Vrn7ap@{0J4sY63Z_{%u%e1*pL;ofvd{l1wjZik=|3bFU+7)an{Uj_X{LIu zYm=7|r>n|mUF?*yJKBQNlZ;9>8T?w;y|1e}^r{{s0Idh02CNle+kNX;5Ucb2(jaY# znnq6!9DA3mh$YL72gw|EQGBx4+qy|OP(6%@Z6hvX+Y*Uw3)4Yv+JxmJ@m`64R=5!c7eQ6qucK#A_=f+Y6r}5T{n8er7!JPi}DE5W3Oy^>L~pT zB$Ur=rwe7uan&Sl+m;?^tc=i{kDP&i z%6}iay!F#{zq`tkRw;ezIS<1jz2gwdd<~{3bbxXUn}|{&bODT9X;sGq07@iUiNu zq~_Cf41HKi*f{?oX9AHRv+e*@eBlvPM6p+SZ$%vh_N0UdpCo90fmdO&Fs)W5IZDs4 z{UpG17fu2xW@>*9ZNE>-;=MzKOYcmLPi0N0m>tbAEO5I*dL)aVxi^SZYB9y=nY=2^ zNIG_n;v9qe{-(5mdE3g7M`{n08T^qGDSB&a?iE#(q+VE)b}LKH2MtVZT=d@(eSSO^ z)z&qSr>YQ1OM5^c5^gnII6yT<*LmM&RzZArNe7Z^UMxO2s~fyI2D*yUa|m4SQ!jid zs`lWrnn}jCT(>LK8Lb`H6_TX`QSQS*ca*`i7y4A8bMh4X;Ktge(%*6P&}m>2Y=iT* zhutK07)##ZTEX~%31V||xQX}efw0q5uPE~PoOdM~TTRX%hsoT18|P;AmNnYSnN`5} z7t#dFyx-kV_dB6Yy-Zn3&^;#c$-Q5c%(UZ7?^0*Z=0X{p+-^5h{RONsrxVD~4W4~i z35u;5=j)L#&;JhmmUA3n{e5b}bXZ)~O$qI>hw43c9pStn%W{$#@zrUTs>X=<^@)?g zZA=fo{!txd&7TgX;Qh58saL{cof}b7lvvk!{rGGgHrQ;D8*7lKmTAn{1B5qAGdhl<<1n` zEF7YS%qJ>S+ed-CvxnPQYH-(OJlY_>- zFZmgb5u4FyCu~T{{H^xlE8)04_4fcvS?Cv9RvmKx^yuuHBrnn#aJ$6AB0cCZ`AyO> ztKn<6OTi~D8~tm_HlGgk3cw(NPOfMA&ri1k8knj~jP{B3br}{<3b|+sDB}S@5*vq( zmDjAk{#*1LGLUJqS{(L{GN~$B`vw4=V6Q4>`w|Ke)ze8%BGLj=h$yFThun};o_znj z?o`#y^v250+6gziOrQ?TQi)6P{>~>IBW<#tFUs?3SVl_?;lrQbKi zd6F@S9*m}xq+@4%=40y&PLnq_xQIcA?58z%%j~)DkoKWvMKy7%>%ing*pO$MC~->@ z_+GUUqNSm9@g>a6x{sjevtkq3^U1M2+NL!CH#HG`(`)3}!#&IeypJq?vClKr2<-Wu zwSE;svJIa4GFGj!f+)F3+2A`|P6JHdRwcnaKS~`d_7#~i$?X6RKFnABU|#nNSvMz&vEVbIx~5BN6>eA z)2+9$sGYzVGFK$qQP^;pZGB>=|3MQo)z#Di@uVw~Gg>VHSSC0#4De{Qg@Qr6*hu;- z*^4&;%T{2M9C*9$>U~Z?oTwH#nr&D^nen9PVICVTTTOAgrtY=>bm#q*!gk@F*qQHO zvN-cso=8VXrnPN;ww$nG{nY8qWSGh7@wQMs=krzNK17$dOA8vzCY8^R7v8zePm=>z zVO99-b5*!m`Z1JHx|cwRa~%;;qgV&}iLfpy*_ql4KaQ?OYoVsWlML^HZq5!}O<6 zAAntl=Z;qA5z@u_BfI$uL2p}8E(NeXh?M(=sSWu1K(*^WosV{lql(AtFTZ88qUYOU z(-EQkzOh2JK?j_7Bhr4G6w{yTO^UiycqieJ?EaTb^@PEofk@A#c$X7q)>rIiu!>mj zg2pC#p>_8?u5bGZDDboNClzay#sz3iIW)QX6T&w$wLnYt%fxXuACUV z)wo_evS+63`mvkkYccKr%pn0A>dL%XEpU6_2FOHltbY0ty_SXzQG(3_SG%9UEOKl1 zOn0N#%%DH*m_n{lfNZfEMKp3ph{+o#;+Gb~XKt=$qAK^@tZ4jQBmxXfRQ@Gl6~07E zGoJquw2?I9vs&9x(P>cL*|!+QO^ce{G2@Z?xxTu30Xkp4_P^z({(C^}r{gwO2O4b( zwX+}@i?Bqa;I~tCH6*bQdj{+s@ShPB4|j5VZeMgekZA5Hgtu!uDBG|9h=H+>e;4HD-?Ty0~NmnKQb#m}-xn?NhJuBs*1C zhI#{``0%=j0+8*DD2|XyYZV4I&ioZ$8VWE2Fx~&mFqEg+Y8DzC$uG@9BFUW-$ z*#^s0EnRPq)C01H$;74bfsmnd(zr#8Ywx@Xaj_5B+O`-Bwrbamyf#?X`M=t`vZyAH zJswNzQjmgHj70>Ch|1Oo1ZAs5k)lKv3t=l@kRnJxWKV!ls1yi`2nK`#r7S8TfEXdH z(IZPG2H6QDAw7wZLP8>fAQ0isr|muGKHb-zd-IZ)oaE%2nf(91ZDs^J&a*{LVp6fR z)?shX{YnCH^X_mKdH!8jE$MrQ-RS!nL74Wk*g9G~n$^&Yo2i0k&3v`eSZ{c_)u08i zh#$DvFfxiMus)V=VR9+oEWavdL$*%ew4*pofa#*4I=xrIB=}0V>Vp6NIMgKVsUJ07 z>`whgfX=VdXob`Q5P#_bIN{bt=Nn{=!}`)iLhWtEg)~%)_kKTsiiBkeRmYjXW^-1B zKHf+1eMj|z18^WDaK^6HyN*|K3|rj0o76Op^$3ZWeh|bz*9Yv>&ZSLSk@26=qt4I- zPB&Tr8M>f4Jy%3{m7;0%j{eNw3iQXJccW8yO?QAV#3_t=U8Rl-wQQ(MaF?4VM=T{3 zHfuGrZ@D1c(6?SVpa(zCjKC9H`=ZKla~|()+4@-|@^}3)1`X@~xggQ57>EP$qm}B@D4U1%5l1BV<1vpy&5!D2sj<$4UU1X z>T8NZN`(=_gO>yU* z!*k~tsg5BV_dPoTKp}`(L!c~uJvMeOz)!Us>TlIX(fyqsFFcp})@mFQsHUHIdzbMi zWd3&UtdNc6z~|RX@ds)~Ei%ADy3^f?>KBl8TlMq9cpa;DB&`H*@MM@+aqsQ_zdvXP*~eV}XfBIBfVhH`qYeG{}0PiVhks@r)cO<_uXo(3MXgJR6qm`bvJfYXG?u%}mK0XpVJ*P{fEfaT@xSk7#M z$AsjkkgkCo@K|5&-`LbU;mwQSXRoxvg=abTxnsuJ)Tb&HF1_=~voXuNQZkXKWbJfo z*((818XG}gT;!9Ub@Q%lC6MWnNg zuHf9_0I4>b`;hfPk(vOv)s!zzXvEaV^RyPKQ}}OgRTQl(tN90+p7c4(PLEO-9_Z#3 zh5Dl&eSkfMJuwb=tE)uU;VZ;TlcM_rZeE#ytQYG3@q01gqz1u{Rr#b2Xd8`nAWI7V zVAefh*@3e|v%R;Y;TVrDWkhl^v||GK*+I$6v~csDJ2|v@!>xxV399E8^8dN0FX zQ>m{0L-*zzugNp~E}eJrUw{RY&kUZpElo_MChsJ(HL!)Ed|bMIuhErUH$SD}u`$&c>n)xvll_L|9svOUX?DTS`*9;K z?4w4~YBuYh8>L8s+t-ZE#CY-$5Jh)Gkv~Y&O_P}Yy2M_v^@AnaiFtYY@i$FhiqrJ6 z3Vd+3&5OIX71DI-?VXO-P@mqE9PzijDXQyu5HWZISUc^qxln%T7$O@ot?^DobbC*K zvrH_bo=FJ5ig}LLXTVWyGI0X#qiZA1x+8P&!*gj0((b(!akLHLI&-JC#(ghw^qPTJC(|gyOsm~$91v|#{3vVPaN6jL09vvjT zqoHF0%PCl$W#a`}(0(HU=6w6D!~u6xECbu&;N>NXE1jnGv)vuB)NY#AzNr57)sLU< zIPvR`m$vkNNhHrq^E$uPn6_2R3A{aCOjd=#^v$yjNh5x=nf z=?uG|GxF__IkET25V&H^Z*V*K5@00rRr8=&eFa)L1tfF5`aiRBTez)en;5)7eKXOh zv(^pVrKgsar0|7%K7cYOePpTd+VBCrNGS*v^@HQ!Jy*F4;>(`dtGiM{ddRGdsO9CD z_87j;VeSfv!95rs1g}KhN{g`7>u+B4ALvG6r(KG zZjkF*JKYZ3sdBnBG!}ZY;LVpHKihid8i3MKn&`OI?#)`%)A;n5CMj+B0QUj%OIF&C ze*Pt&R>5HIq5m63HVh^sM2ibQ2Ac%^oHoZ8h*u3i!5VbIU5>CMt0&NDD&if=(3_6$ z&zQm|L-#7Oc0*qN&d9#4QHKL^)Id zgCIvrU=ZX$QI3=4G~xe_Sgm+J`y2*Sylj8woA2a=QC@ E3&hqp@&Et; literal 0 HcmV?d00001 diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/DocsScreenshotTestsKt/ScreenshotDocsSearchBarEmpty_Dark_d19fbf1f_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/DocsScreenshotTestsKt/ScreenshotDocsSearchBarEmpty_Dark_d19fbf1f_0.png new file mode 100644 index 0000000000000000000000000000000000000000..ccdb1a515f0cc85dd4979666a626105632a10100 GIT binary patch literal 9341 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 literal 0 HcmV?d00001 diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/DocsScreenshotTestsKt/ScreenshotDocsSearchBarEmpty_Light_b29dc7a7_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/DocsScreenshotTestsKt/ScreenshotDocsSearchBarEmpty_Light_b29dc7a7_0.png new file mode 100644 index 0000000000000000000000000000000000000000..91dc4e2c4df97da896e4c3f71f641752a9396d8d GIT binary patch literal 9373 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

3JoAF>!UZO9X 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 literal 0 HcmV?d00001 diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/DocsScreenshotTestsKt/ScreenshotDocsSearchBarWithQuery_Dark_d19fbf1f_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/DocsScreenshotTestsKt/ScreenshotDocsSearchBarWithQuery_Dark_d19fbf1f_0.png new file mode 100644 index 0000000000000000000000000000000000000000..607267e08f478edd9575185fb947c3fa45d80bdc GIT binary patch literal 9216 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 literal 0 HcmV?d00001 diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/MapScreenshotTestsKt/ScreenshotMapControlsOverlay_Light_b29dc7a7_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/MapScreenshotTestsKt/ScreenshotMapControlsOverlay_Light_b29dc7a7_0.png new file mode 100644 index 0000000000000000000000000000000000000000..4a7ac640e6051631fbb1ecfaab5f711e916cd4ac GIT binary patch literal 13933 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 literal 0 HcmV?d00001 diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/NodeScreenshotTestsKt/ScreenshotNodeDetailContentMinimal_Dark_d19fbf1f_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/NodeScreenshotTestsKt/ScreenshotNodeDetailContentMinimal_Dark_d19fbf1f_0.png new file mode 100644 index 0000000000000000000000000000000000000000..68adb57cc2fee5a019d25409be7dff40200d5882 GIT binary patch literal 132307 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�$< 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 V;33m|0eD>+Ej3+Ll=8i2{{t3mgMt76 literal 0 HcmV?d00001 diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/NodeScreenshotTestsKt/ScreenshotNodeDetailContentMinimal_Light_b29dc7a7_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/NodeScreenshotTestsKt/ScreenshotNodeDetailContentMinimal_Light_b29dc7a7_0.png new file mode 100644 index 0000000000000000000000000000000000000000..fc5a4913a41403ff7887f0edba83a9eaadc185c6 GIT binary patch literal 135195 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 aeEQF@<$FWDv?{L)$WBjJKbLh*2~7Z>f@qKc literal 0 HcmV?d00001 diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotNotificationSection_Light_b29dc7a7_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotNotificationSection_Light_b29dc7a7_0.png new file mode 100644 index 0000000000000000000000000000000000000000..a18dcf00b650fa3c8cde6ac7539de1b52cee9334 GIT binary patch literal 38215 zcmd?RS6Guv*fttKMNz%rnnC^`3hO)z(yDW&$&TKpr(lFbw;pGQsjgG}ADavcV*D$iW6su47AVw*M^SNss zd9OPZ&6Aq=;pztx`^t;wKIEj1obfhxi8%JFgzcYZe#?Dq?R0>mv8TJJ4zn zi1FavZ&`YdgE!ZxC!G%71Pt@kA3pCA_5bBV??3ErYgJ&`YG$~+=Jh=%%sQ&WtL`sp z)}_}~6DeK9FZ^FC??8mz1xGf2b4qWOqlIbWq)E|p$e*$6C%K?ymS0Pkl0O#CU?zsc z&}c7MdXnT`0lS3PXX*9s`@|S^Tj`~eT4I8UN|lzJ?EI9z8~pacBHIdXGjK$)ri>B& z?4xH!ze8%uHdyUUz)_Th=D^*rl^sz&Q^=_FpvpD{B1xi8J(1A_MJ%|I^wM*Q1ybN% zHdVE50}H{yCnTL0*&%f|?9}hkM6>bJU>kku-}4p9aODrrL z(5+iIPp(xI8^#?CBd6_m8WAdgn?==5BAK^WGXW zB2_Po;1`k1CS{8Zj_h9U6k7=V)6EOzxRBRM8RkAc@LeZ!*vZxu*(Nnt^%}~SvBYGh zS0UDS0^j?YgxC}d&u^s}i~Jo?{Q%3A)fVQozr+d`JvN{PpkSdVCC#{YTNEhx&*!@D zc#eeO)mWoEJR5%5M_x=Dk2N_%S0uDHOzU9;tqZ_Zj%6NBFM(F$Hdw=9IKWcKQ8%v z@^p9&yy2viB-)v5P4JuCtA%*O!f&=7>V-q&!f0pGan$!rKE9&Gd&Aq?7ZjjmR8+}Q z27?3MJ2j?j_|%xF33>_A#=5*}N2>4&CqR(*oOethMQYvca-kJ;EN$1nOrUU#LwD<) z7iX~!4cpcD*L;cUR{356aRpnQz8hV8Ph_vV2?s6=Q9pks+-W}jI4<7Izb*V+y8`Bp z{ncjvRF2!~XglnOe$tCSW)n*)qEVr3{HAdv_)hP(pYLgJXdlObe@U6!{KDxG*T*kv z%o2KCr=+lFC+$%({W(S4M`X$x9w1n-wR}hPP+Frtu3tQN|NckRz zArudcye<4pp(?kM46IhRUQ=m~6C08S*-p_d&*2dpCm+*Bs&3eWFULlzF z6rE>u5w&*&7e+&R7~*blaU#X?e-8a`b(_V{H2%D+}6-iUYEdM;sKwm?!76e z?p`#wUGKch*-;sV<`z1Bd&x8Q*2!mN=Esn@rV|~@s61rHd#u2T1e%Au=)Xu8dCrmz zamnZ2#(s61XJs?#c-O+-3iLowUUwMUTCL%PJ;7))^=EVlC>U|v)V1{?iKKHO62(`4 zPR!>z3$ygMO{>9gMBv*(|L#%cQDW0gefTlftGhvH4O6u2#1FGs6 zk`l9XVrm~3-N~zW9KOVRUf$$CcWJcKC29VK01EO^64yBv)fNX67R5})oZ`OkAe|zt3^@}E)>GXrxz8~7jx1|el z@Qk|69Hwc8|U&9LYO=0qQ4Y4F&Z8X99%sLzoWSDDK61geEvu7_{m7O2}GLN6bmS-bkB?zPqTydgx}0O^Yw95WM~gz)n?Er(fXS0$rd6$ z)f?6$5}Z%`nhk2&^X=O1Y|#|Q58^!B@9^~-q?cU;(^ViDkg!NLM=xW zH6_9MNgqV(zwpVxjdL!Y(bi&MZY##+wE80#-g`7i2`zzCdO5E4f$P&jA^7Q9Aa~70 zhgC%hw$Xj?xcA&$PU*O0Zh__nG3UIX(l}+g?WNZL?qbrGGDwsFMALQyL>qQ$ za)mO;FD}Q_Tj7Hdu=Omg2<+uyk|2*aNu=h=dahvi8KeLnK z`oqssWHU$s^4|GHk93i3arhAP!nZO8jw*5SsOFU)UD2!D%N&=HxENjx1l70egs<{Da1o$8pu3{q~;0d;7LJfOzskYn8qU^@Qcs>=bafibm2d`GHG>+K6I+Fwy#i8 zPDu_4OubA%FA>5Ci4FRbbP#+J` zv2>kHRcn1}m|@`wH`6%<%>6sV^n|1)*S@$jvMw%LB6a=5wRD8!zzOrAP5uwO_1D4a zPkYpQ+1E1ZSeV~_gB4_-$cbY`!Fn8?1S2^|L#kdZh?i*vOf*DM;te#4HyK4Logcz< zan;<3dguFk(z23VOLxpGC^%CeJ1NGAX$7h1k=~*zDi+>{3Gyk54ci{SmVVQ$ERQ=g+5fyM1IKx>F&jP|U=F19*S1{Q z+nI=S151hxg7!mYhdT{LObJ7h%bIvIbQCJfE-uFN@2;J9=k`<#;K|#*y#P}Al%l_2 zLcF6Pif9eIP_sinl#0I$Ob$5dX(yXsAJx<|QNj9oauf>Nfdh2@T_}#RxzCU&zO?f( zo4@|LGlQlM9gCS~q5&7XOoKXmmc&pjB0QwyifCnR+cA-Q7)@ba*nBFqFbey`yL5R3pTL@;mwdD|F}ON;1+g7SOA}ni|EuL;x*G{C601654CW^Y4g zcj7uNg$N%Qd;^eZFaGJ$231Fx_SwBLS)R`77CS5UUXYpZY}*A3G7GJ9QHKnX@=6Wk zR}Gf!7ErrZI6l}DM!?PN2dl8^?43?$lEWh>@a59OcRSk1-61WLK*EHydVY^?gG%Xu zM%Ry%Vh!%-N{LO1F)Ef5q)Cojz0$HQhlYP3?`l$iKK~ z%}r;%3s5z&Lrq@A6RGdkyZg`gG1p;tCtADpPs{V(u_S^?S4w`%g`$p0^5$AUN;3{n zfO`8Dpf%3V50=k0fBV=^op3cpQG+<7x7_pfrN*^8 zPA2*rOueVj4C1f>W}Ee(eo9bZ3w!-k-270}H|xKkV~pp18jLELk>Fd#y~`z=$9f<0 zKEwh=p4dME8oHm9_EgKn>aX|Rg~2z9ft~^)x3DFhLPnJj4SkEtr{_=s z+HE3Yjn6SrQd#TC;uKrR{JHlrtHoaGfE3faF&+UETwS3ALbr@XA0fNngr}>X4Rq6?JBius-|*P>To`**RFRSDzqBL=l;<{4AeHh{ zDig;fpZC|Sf3SKSIxRT3_MHooswR%k3lv**+O<}kX`%;XTJdMh24SE9tPz{bCdNW3q2 zyf~M$j-DOdi1tsF3l#uF*FIKx%E>JTsEDscyuQ9g&2#MsFq+yK@tQhmO7}aUZt;}T z5+ed2f$6+^TBUNC@uO%}s|*{lh**-3o-vo6<7T;NkwFeDYV1CzYJ-7jaW*~u{HaV; zS@#qs#ep(s*fVwJLG6wJpx|=pF(LlKc+Yo0gj!u5lKom*zNT^soAGegwfv*7w&vKD z{Oq6@RQe|%BS?}i1ocqb9}p1)3JU(S?+e5AdC|lP8^e z-+O>=EbY+JJm?lZJ%?B(XTblPpMP_jdm-UGWRimMj`W5teDK(#jRd+#M@K96K%n>D zG%OEz$rI0w9=rinsszxS6u{NE{ttO5hf%UtW^OoiqMcK2&#d{*Jxa1PVojQQ0EdBW zz_tr{ZAB>mvy9r0TA$(X{RZ1S;_m`u;vPfi4mr;Oh^?UW=*bUcs^)M=ynsZ!FIfn$wu_<`4X z;;%07sH7%|`QU^1JYiP<_W^Fr{?cJ`@^OxieSGk}{NAlB;Q7v<9O8#l$Y-3s$u4|c zGE)EH(G;^6du|<3l6$-eSV!Zz8Wk;5-6|Gxyq|WJ z2*vn1_|OaGrwL|tIA(72fSEh_VbNIBe%iv_^eL$V!Z%!X(5)k?-?`Iu_U5Xu-txsb)(Y1Pbc8LHLENv*(x=$EUVzf?2+SGxh3Uy z{yj^3i*G#J!ov>Nmxf=GUXEp#_NrWPYkLfx;8>ceiCd6%XbJ0HM_Fl$9<6t2x^v7? z?c;OkuzLvhiVDIF^R?aBtZEPSDD3soKy8sed&!BVP8rp!)7F?qiIR*3InS;}U9W+^ zZ9R^Lfv*k{Aj5dAM=N05tfT;IY`AdV3+2P0q>a`vp;U`tX3M)m^h5->OwieQN! zXjUK2-?SU<*5|HZPV}fsPUUb?iA-_Yn)P3I+%+5NNJ3}D)OwTdK%q-t24|+O9hybR z+f8xX1rI9Op?fWs*nG z!7t*X66J4Uc|OM{l1q9{8B_7C%-mZ@HAe=1b;hjcm?Xh$_Z9p7XEoKE{oZEO6i@LQ z69-I3#7oL?G@^}>P)RdWd7jVW-Vs=Nk&+&fg$2M`7AV{@ww7l<`;?7*Rc^n{87zz9 zeF1qnBDf&a>KkA=Q>Z{p@#c2*-aI#&iP->J(!=&#-XY&h)|yA4w5fO>k<1If!L<_NALC<;g@<8Lm_J9hC-q zJqdaE-a0UqYblwBwg|U3Iv3&)%wspCNJ9@C@Qs|}S)K1w_3coxk=PUk4gp7R)=7;* z1`df4mm)Ua-=!vw)g#g>v|s)n`U?1vYZ2G1*z54D8H^>Ku&ZLv@#Tx06qFM!8*g0J zyF`q0K~w)p0cQTv_t5_RwGPBuP3zIm!5E3Hn41Q^j${#bx!=F66Yd|hlW|EL=H|{~4?v5#u-5A-|_oW-K}i;$*1fzr6wixqzdw$u>q4k7~c&;3`cvHxIe(Uyk@9 ze=`w{ovYKhfr zGjx&9WhFK5Ey;LVQgP}yq{j9p^>N2~gIDS7W(2om#gPZrL54im>J_c&yHgq%Co zsIM@G({0E~Zc+RjIVCrc@hS;rbxo;P7CF^pQY6Iu0xajtDv1dT-ulQsIG2}w8vDxP zX@}-+G2-YKRKZsn=k9m?E#Fq}uWq8DV354{(CVYwiNat^n({#Bm?Z{2R8n_iOp4Bi zm66qVsl76Hz|~Q-we#Y(s+69R>$h3IZ`6kwtzH2s}rd^H9~a~BR*JlM$kiZla%J7y5c|Eq=pE* zgQsPqrblaBk*lMK(NcdtzT072@O>s=$+ogX-jPm*|b%W^A!uUPj=ko=Q<3s;P? z!-q$SyQqlMqJ7ptY$Mz={Mck6aF5mL=fZdAp}CoAS??%sob^~wM`YDw&4o$M$9%Fb ze<}VtA$c+8l;O|J{f`a9!e~56q#|2AhpH@zvAJ>2j4jdgVims8lAYC?lDymvl20R8 zE6a9FVzxEomKHqgS|eaT^u8y^ zSjBD6r0!?gSF4L)#QRNd|1@+&UXj0JwfSeDWWA@v7r*~h4#Hd;4@@sVkR`m0IpOf3 zrub!G1f%Gb^>mFGq0%s8`v*ZVLI^PZm$H(p|Io2}M@HO)1@NTt(fRKO_q3oQ5`?+e zzv!O17All_l~hPDMHPKLF-3~dHYgEd1D&L0Qf!5AG(&LY;1l`Ben8}%Pxcn8f-GXX zf4gvvhKvOAup)+gYv@=8x5lgq?=R^i;8MN8YIg#7OMG7BBfKpKYfmt9O(DNi4+dQ5 z_f7%^3`-=kTTg&AcDpu*?9M7t-(n2GM(qq7%?KyA1?R8q;yy|2dyA)$e2*AlJ0{z6 zLrdbME4j@Rycw$W01W)10q42k7aZScTuoF!j~6f()f#vtDb(Ih!Sa^Np|#HpqAQ9?zZZS4l`Y;D9RN? ztjC@JznEm;wq~8WS-kC3%+IX0>ft18e3kPA)Z=khyR&+H!Fr49Zcvmli6{0$8&9EV zi$s`jt^Kx*;~+J``k$FxS3kc$RIK~n4|I*&dZ(+_j1+a<%33eg*lOwb1?)93YYHvA%xM0P$wu_$rIzy{T1xQ&xb)$Io7)nLc52_)B@9Y=4m(e_#Iy#$;R?=d*LZpSVdr8klVF3!UQF42m z?@DBB^;1O6RV01OL+4PW0rNOY=>0%-f5Ts7?tLtzwYI0b+++K%B^Bnfkv$^B3is9w zvFYxx*|JVRm1mc@l+`mmRNI|F_=NWR`4}J%tj5&s2k*}jF{IG`AoCePNBiAE zl^m`zaaa4 zt#_C6_Q_4%@1r^>9Ap%09)-PtcmDG^>SufJ8@=hsXK*f6igkIDtGJr?UR;R?Tb?Yb z_?wVF1STi_>c*|D)o;?C+~4j5WbMuREQw{`)N1`TEmME4h_T6w&5eR;>%NyPLXOOd zzOgoXR?MxzYnC}&<3e0!_X|P2+~u{U{db04=k(JSDX*gL6AVjN!C4E>$RX)z0r=Vk zZ-m@5W;c$Kdy(IQfkTS)N-JWSa!Kjc&8ZCZo3Fd;GNf&_-oGMkH}s+n28Ewg)ow_@YhThldJ=tgClc<%3NxABr+RS-% z)TU@AKeo~F_JYePJCe7MP~M1oLWgGB!>kUo88O@Nae!AcMDf3V-&m{>8h)!vZc(-; zn-+qwffES}4y&j(-S|B3mrZ)AcMH>XL%|YbGG$50|7u2Vuek%$qH%2&ZviK)hHg(4 z?PCt)YX(KfH{S742xA(xMS~Ukg%DD z+c&Z{UrZ)fCW{Ehek=?x^hTo5D6B?IFgNEYJdb>eXeY+iKn-l?@eu(KEWkufDVyo? z>KnpkalF{_S**WJ4r8eBcx=!euL*iM%TV1IE)Fmwd*S;egfTxv z<5R&?{k*b4CVlx!?G`+Zu>>yIPDvvex5=Z}^g?i)R^u)`#?@_fuXX;gWQbqOB5z*)!n=A;uN6a0q7FT6;nwNxZ#A zA>r;1mi0Q+!xq9bna?Z#})Qh7-Fb_3yVgur3KR&-=a;aqOr z?2iXmwHoG!Z;YV)i*{}Nhl*t5ZYj-uzrNq^Qu}}__vsL+AsQ&1^s^lnJ-mN48t`?< z%H`PO_Ow{Y-ETC!r`Ai>&?B2^@i(0wt8WJN*w)e~-h70A-zRwEVNv03Upt1N=6pVu zo}-*d2e%wa2_=*am04IeX$h+rp$o+|o)}wwJtf%CRFrZu_VwR%?iOgw89it8T*+^9 zui%kSdkZA3f-50RJ-A6HLV|r~)~V|Gd7{;v9l$#&UX|OOF^`8|;IIE+uz6EwZZjQ? z?*kVy6$ZB&PU+-XWEbv?`3}3_cJ)c8rmX$<6CMs`l`e`qr(RV}X?_JD)-YM?(hcF` zCAZ>*h{a_l;%n zGhjsk69fK+oMUiXRToxzDc66qk7Q}cqCdyPTB+R;sOI=Of7!%JKSpp#>w;BKl=_8{ zLDAUk;wuErS9cR{J{3%jjm#*p4^S}s3QthG_?*env+I|kH%v%hdB4?vmsEh8ZA;O( z@UV2zp7pIU^Glrx>6*5ZOI;I}d;W|}7dXs_Mq%6u3k)<9)DO2(9>4k;` z^+1RGj<;h{{xV>hsim;}xF6jj@%aaeK|LBG51zWH^C3ROY_I(?jsp2<-L)D)C=YQV zGhC?g&eE9zQb`@73YX1dp=^_K50s7t$6P+do?Htd0NtCthd5~>Kf*t zY|AHDSqpYK->mKNy#nRZVP;6Y2^*5FIaVg*AqgLr=(U}EgU-7&`mogJ zM+EsxRwQt>tnmI$Q+W0p5l0UkdXYf}&g-Oa!KK zKQTt{R6Fi}AuhT?)>j=^l|Bb5NF{rE8Qt$A%>OJX3oX#*yK0#?HSq&yds{j&>%6cM zU=U_=@B}A`JzFyeVdP_p(SSJ1av1%(LDJ}<#`J&ji_hHO24X+ z-VNKMg%ir6^t1oMi3_oh0rTIkHzif7W0n?>g-M3yxE`E}$t4&|WL=VrCa`3IbZ0@h zuH##^Ud;Ug&53VIR2_Rujfp}ym^t=TtsHqVyoQ8Rz{HO8&NDj=@UgQAQ}{pS@p7E( zd1ANid#$bHg1ZXq*PhO+n24mm-8Cn}PN-%k*CEF^6P6##f^TYl*6*+Ad0sPSnbUvk zw3co*ah|e$i&BMUa>_KTb?yUJ?fA#K!)zRR%7(u2TC%~`w-M}l=$D7;cW|VJqhJag z`8{7rDj!-vUySppeC{4)wc_2pHF!$&uGmv}2I{0{b$-$IbfV)?UTPnKepCZ~!t21w z(zXXj!}AQkc2Frj2IT^q5os8Djxn?dxW}%JHQWUD5h19Tz`!f>%G6{)xo(xkpWD;) zr7mq>ZGM7O60F#?d6X4?1LPK>&N@rB=iv7;GArc^)CNV>6Yc|B8K;Xq{7Mi9mL$Hc zy)+oFwArXnBJ()}YRrIBJhM{x+95!5xj;d*17Z4THNbK4^Yx@yQ9pGcOR2|EpA6Np zHID<{`!?v>fHGW%L&|3uwR?J{%L`|B?(KDftD(5SjFkNV>}q4pC4%2j?k!o##fnK| z$M@rULx2fpi?UZ2Tawh`>+ELUH+m)PjotX68e=&nZQQs1VYe@Kfzp*KI2MGU16pnQwq z+ic?*WEA!W)5mu&Xgkr>ZRxR%n)M}35bgtOaCNeIR^-HmaUd=sPlZ2*o$fXH(yi-^ z`dhE4P=a6(hlZyi_1jV1SJApjiaaMIyM?ON-1c*%s|*x3+V*!#<5lEa&nZW67G+_` zSec6+Mh3?(Z3Cc7gttXP;>r*`+HG*CUzIBQ#at4um+`0ePTg9G9Y$0q`j}*i$cXK{ zZ|zU`H)PjFKC0!d2K%9tJ(NChvVxK5*cX-0y`qr2-o-=Pz`7#h=*oe0y|l)w9HbnB zsA6DYtv?SJ#vX62f_akbBxGJp5H_hTobtyi?KrMcOJ{249573MkbR0aP!Z)01d+4F zEPa#IOwtHUvB_r&TlMiZqU$Bh-$fA@Lkrv*3oi0^h0w|l5f)(!Nr&N9Vx8o&l=Z~|=y z@46DeBxA*{T?^7@`mO_BTH?cQAylh^JC*Bm&L<(yILFC7Uue)<2 z9jmpD;mf?CxxBce*a5y%e;qKz^9X6%_}tzr>y-KP$)fv}MG!&typbXeOFmf4+>-ly z8WNO4>zg4Oe1J7}-ZYQOY0IMrfW^P;FQ7*svyx_l0yAHc=-Lv;^ zUNG8$j;n0}g_h0Yv8SZ=*L4zOaq z*xAwDHvzAj3=^!5gR^_yZjp4To_N*ov)(9}tL|uW;8{8co+Z1r#;)rjV{G<43l?6n zY1jAOsj7h6ZyH$~E!wi^@)2Qa+oKmPTHp2WIy6372KC%DI`u;&+{A9f{C_gr|H|h= zeh}4Pz8>^SqP|3_A{~>9fhry4@cn;$+z1q7#m|^gUs4K84_JVxA#0>@?2dA094NRy zpSAAZdFHDnbNN6@&q4pgrw|+^j5D}fgcDr{OM9pp5qh9rc=gB46i&t#RL`GXag8)u zGLHZQd3dpqgixOwYN54jwMEZ?&fKc$?$c2xh{om3JUb7`pugc7VC#W!|0gg;_g67$6%R1 z5cJ~J4QN3xUNkjX{+uv$Ko#)tOY0m|I1u~GN#)H*zC2H_703P`~!!i+aJ_^;+E_3@*NUb zj|?0&9o26SSR?cK09E|B<4So(T^QNPv6qg>a3rC1f&49yhL#^&5;K2Ta3T@B``z@| z{2o|rEFqFF$+K=x0V8T**Y6;l_;ZDZVCvl|pQHCoWU7d4&4T4AGdn#5ihK#5F&{w; zzTDo@1^}`!!20(Wvrk#gtzE9_z8405&7)ka9S1F3)b+hGSS~Sa8VB7k?4R|T!M9mi zZt%62LJAHoVfciJysX8KImgPSz1*h4nMD9ZhTxQ~9D9uZ#~OGGX6!H5A>}VmMgNkG zqmcO8togO|@Q5b=3;=x^1JI|Q7j;W!fw%rc9Bm4@IH+<19nww8mJA#K4Ao!7o07f# zHO~C;sKTWu8uFJlAxsYTFG-dV(k)d1IN-tbU}ekr_@0&A2M&V%+>RsW2}C6wJs@&G`3Xo^K(a7=teTuV4vSuj+Y z#VJ$Y19yLDVQ)-jUoWl*tPwl?s`Jw}t)oTuIm-K^VWq!EDBsQ&B&2z3jtHJD_P_@t z`;N6sZ9jt)xK*W<#yfuUYxQ_b56_qaH(<@ow#uJHV~Y4RX{gD86VX)1yts^mb>&`* z1y>os6Q<`nB1XfsI{3hV^e01=NnX#QBj`le z`J0z7;@K!r*z=<>Q9J>qv=?^`fK+tR!wB>7&=H_%oG;LR3xl5B4l-K1`NYy!zpGSM zSJ7-%EHt+b^62AV215q;w-Az#!tH&v2VaaGuTL#`ihJR9OQxAdx0eq;4a2O?vlBehL4icO z<2M%1esrpmq+?Od^O?v!$Xb_Cehn(b_`0n?PZ0#y3F^;Z@um~L``dC!)8cT#)Rdv> zQOE??L#jXx^2<@RL?FJ5R1Ad7gWhnc%&LwCGxtD9hMz11RD-|H)_$X^@c>668D0pd zB#*642jHBLa8En|VEF;aN32QZyeyEIi&nXz?5P7ECiXP7?o z-au7*;@Xa9o23Q0{G$A~h!8bBal``Wp2;vMI8(pY8L0VHyPux!Njguf%cZ~GGIOkH zTN?PhSjV$2b5Ly=0o=Zb8GC~|zUExh?wY2OEllP*klJ$9i>v|IU+1FLr?B>(6z_|8 zRtgu)jkeiZtdXBfFMH2mLu`S|5Yvi|Z$v8-!NR%OKh326R*P0M!CcB!6P-(_Dl1>6@3l<^V4QCG}Ygfp^#6fAsYD#4?`Q+dQT6s}NFKkVagg#d+a0crOI z12zwLFLcA-^a%C5M&03iFG^a>6_iCV`8()~8`zOl<9TClw?NYV*WfI8L1jinW$qr;xn1W)yY@pgv(@`0)o{3B-Z`Fi9{k& z4nY7w$NjG2;Ul^R2Ut|=>Jb$6AYYg&77|Ew1_G=8tbkpxKEWJ-V%G^=4f+O zV=1FQaUnA%wW?0*lO)D%r_~@|FtMWRL<<+`?(bHf!m<|hIhfeh-4u7ZkaqWl;8d@< z`K~`5@5)k2jdlPeI9`-goPV&d>AzclwPel-!XKsO+?SH`Ztt6fc@4-PLTqQ)?+}C? zbDri!o0a&O1@D_Qh^-pHKmn9AiP13t>DU+$1rAod4^9RF(j~T2m??R?c*1<3LjJK& zWa>tDva9}1iN5iFw$e-d{vkM2n(kW1TECPknueO2UmiVakPaNsa%wf4x3@$;RMs+m zZpoklbR&bV1vjG_9`gbi)x50aNe7Vpmgvt+poV=WT)9Em#I^%xgf9TNV!fmu zS^m@baN6-K{!2p>+~*oLRY4^(zP&ZY?&3OO!`^WTVaC$}z%^BjjNh3-4@U-89-9PS zN_bg3)E!Q$sUF;&ig9g0INA`-&}jc|`NbdOy(0)W=J3`f+mvdOebTjf?&Ky}tw*cv z#o*XF4FBp4EM26DLv_b#``;BSdY|a7oo3R0!*JOJ*#1iEporVTBiYRysos9Nzb=6t zYNwzGfacQ~K;hmI=(1&R%QgziJ;NC zU_Uc@nLCZ)g>M;)vr?>{B(v z`!UiWEudi|KE4VrO&R*6SnU&2wCZU0R6);AK*a>r7H~M|HB<-1Z_L4egRf}p9m#BH z>8gZHuPJ&JUqB3p)S-&Qo^Zpd{qwB&(Joi@%|YK@^{K4YQmY}MqszeO@A*ucNZ9|m zQA8KvV(sDAji)RhlNcQwB)-jQ9j@UcRj#vpR>^Kh#?W8gGT$}vPyGvS1QWZ6!~!?o zP++MS7CFQAM&cKaHnplo+%Zsk7hu2u1S5s143`os?7O3><|&i}Ga_(VsU}EFDy2nf z%Ca@z=t%!%%}vsBo)W{GHQ0LPCLOPAQ+p$^yGMhHOTV18lkjS+UYnkM%7*{zr$)kx zW{!;gRWa$KCp=04=8MCRUi9!LmYD(`dDyXuW$}PKGBf&LoGbj&AQj1e7xwvpyk*I; zq=Kbx#x3M8z+2O7j-=Er_3luWuwP8qWo5ugs_eSSx|_NCE{Q<|j^^s6k(a3LLuL*e z6~Abgk-eBbdb1X?(i(BXSRHH+bRzx8M1Btkb90Nd^*IC3=rAmvvJNKCPV6Co8uT?%2xjCxzAe_o1)`6ANi_x4MNG;&fr!|D zkw)&`oRe{{m2yn3D{NrIvBVXIV+=x$cwztNkX4Vo<^N>9?*D%(aLaBpVXg2|7q5=D zF7(KNnvS11le$1$kZxPA@vK?!>2dM|t^)&i^0!1eljGa9X1vVnU`R5Tth4Hz)F1P$ z2Xj>ec5iKt1pMsnx$7X|GyKf6uZ;&2B)1n>*bx%9P=;u5Ac504ju?pZw4_w<(zBXf z)HbC$fBUbZ>rq2)_!ChnB!k-O2AbcIz-*jHPuqHs?#%^7m`zHVN&mL{mf^={x?jeA zXHNsYU3!7=KmO{0ro{#TqABbV)AEXNElVXE7m_M&3#wspaSyuAjsispz#~pn2(G)W z5$)xSy$-eHnCn_kk+O52+rs^Qo9VwWw7Ti((EcNW*pisK4j%a(S-3x}#I8PN(V9K@ zUmUacu50g}}e!yZ_NBi|>pm`^X}q+%5Sb&ZW~u z&gzD~qvG~Ma~^&!^_=$*Kjt#_`|8#`edSyU3A$TEOw&uR^57S#@qtIV2Rh@f?mp5^Lgi2Yj&;?M*l1TYBQ02}dgF6{TgDFQ#s^>=Kbu@tae2?`?!? z=ITAfVkZ0g_>XSCrDERyMe@|wNW?VSU1J-B#jm>q{5|(=R<80pA&>44kskBR#6&i5 znVc_Wt0Bd@ryNb9Xk3o?y1g*9Thr*QV@9yd#?`o^BksBVR%!Y&QQUMT9`QQgcmHnD zAM(E>*>pHAidJbXioFZZ^-OIR#!h8M+;y8(Y08)=X#!)B_@KC!!8l*8qZwXOI5%3% z{DC`{ffXT|)n!GA8}m$5JisXJyu!_i4KEU+MoJg56Mbs`?^O<{Bm0y(CdlbrGH}}+ z?J&W@{un57a>a0JO?DmESz^%`#?`D&y2vOL$@TQ*LKn*>%;JkSuO9eNO)F5p0WT%; zT*^n{a2_K9D5~bXNKeq7`{#gCX*Md-unFFQye#ZqU5z{_)ZU(US{(4|#8c(Xso1+B zPBemQ3UK@qx!~15(SsRMD^Y@7I1<}l8oaoT2fK*6~6Cn41bHc~?! zzx60!qP?1n^7@LiDPi*j+P8@gB1fCgM*07Vf_Y0Zz!IS6dA$nfMNq16trz5*HrGls z9De?0Gj2<%{;3`~z5YE8UueGnrLgCCGQPua#e{}OHM^6XzXE)#;`qxT5N`&7-P(;v z5<`SfrtsgabYyq0jCsSItkTW*yf55xyD)=*`M{{bJ^EyypaQK==lb~d4`o%;w!xdb zI=Py~%b)T6AE36a+FwiEFYE&j^GV1DmjA=l>|2yue#^emdy;Ctx8M&E+?PLKXwKse zb({-;?IB^ljJAK_X@VyKokw7B6d#N6-2HDEV`wy5FeK6q#usrw#y~g@yQD3Ad(9$}8QhN+smiKc@V|!u~t}asD zk5l1D*lC{@dp3FOaLV7015ORI;LH&pSD-?iVj=oI@+JQN%oEr!9=51q>O=S3oD5? zA>TR;oJWG*x-U2f$9I%!Tpra%4tTH@y#+DOD+Odslq0Vv_r?{Z0*uc+#%(XyGDfKN zIH=QIVL`@@HXV`5-lAY0JKB^rH{TE+N02t>}Q-d_oxe$}8 zj@+*>!m+;r%A|Wks_&Ox>5R2H9{!j;>g({r)zx_dxv-xUxCTa*JRK8&kd*&^K1;TW zogq-~Ln)*K9$$aK{%>4iG=<5D2FOadQpUS&nIKw;6LCUj6CVCsmGOn=*CmZs`hyHe zm^#{_L_)cV33~In=aR24YUatH-@KWNq|@kVywzsTckVr?>t!J`RKLb&sU}&u7cMZb zkFCLmd!?tD3gY z2yEj3wph3r-BaKXqO|xASH$BT{i*RKGCxExJ5p$$DTJfR0=91R@q)Pj7PYj7BrI08 z4?x(xRc)miw$#SYl$HgnCdyF05;TGLfV^q`?ac}$nGwI_DLc7`8`=L^&Go7&<%(YJ zPn?Y1Ai$N!ejPbW{lD0I?{~PmHf&fDCE`X9B)TZkrRZIBqDG0HCc4pk3keZHB1#ZF z>gZ)g8zLfl9|nWb`;2ZdhIdQy+|TnJ-*J4$_XoW5+l+1Ry{@&^)z0&}RVQE!jCO2H_@@~}C;>Z9K6=85?+{HYaVPVB`e45IP{V?FJRq-f`L zg2<`C17qP(y||Hqra_>SOlOaE%_3MEWeld#8Ba+B`mMmIPN7LJD9(cxSLtESr9gU^ zHK?ilRU6x*HU}q`XO!~yvjp&w$U|TIAMmS`1ud)dV3^1lo^sz=yPVW?!FV@!y!$*$ zkwc5TDdg-J)U;QwyyCR?|D-;C8A3iy)4c&Zu3fsW!f)4`y7y`V1$6A0#LZ~%^|(83 z-S25&pB}nIfeS2N%9x33Hxn{%4F&M3pQv+QQK0)vRHOe>!z^UJ3C<6vWit{O5ohF+`$XMVDfH{LT zUD2gr!sLO#$7II-ID0~G3JM@y>_g6e_1qGK5ObMab7p~Wg=LmnVYjiRTF=hUlyrtV^You+<}4m!vb9c%kREr;6~{HO9{gjd znJ+lXPbV)G( z$yUO&aVv#v!3E<$_T=bso|P1YK5n=Kb)8w@a%dCpE@3XEoaE@gs56%?O^jGjsM4GMR_7S{t(B zvVdK(3bb#)rM2LnnNAiG4`#qRdWIdWsM5Hz_A1G*l3J7W2)Ri*>?;dv8$fnhkMOKI z9%S?|bRI$?L^S7z{b&VrO`uQKwYz8~$=L@@E}k4lBv!gCtgpoJ)fiVI>M~vSk)7et za7{cb$Wv;|T{x(eK+O!RV_=$KPG`gIAP@-!i$TL}7-0~m63C);~&`me}Tu#qrZ1|xRBY9eIgd|$tjFuXL~ybzk4S-YMdlh^GC zl#ThH`TruaYIbm%@RaqRS;}xIs_U4rRx6^L9jpM>>gZNaGs1#IEKXqT_7>>6Iz3`_J@-l(qmSpZnN^(CucI{k}HF1NBwR0?2&rfiV9Vv_+Z++OVw42vS z`_&B~JTk*Ipq9nc?5k0be@Ov;cHhAl zfcZ6=*^dC(34GJ3a1mJZ5dr?49!C6XZWoSua*MG}<=XB=vx3dj8^uRzUQs&Kfa7zR z8GHgBt6|vHUlUBD4R$Pl5mmey7x2t%qEfjupPEIJisgRxdr!j`T&H8k9nLM~k)@~n z)<(_FQX2sOnh#kv=^MC2?^0)f-}u10a;*e#-jj*g3|$iaUvxGcAiHB%;zHy&#z6fP z?1gl*>VT@djdt(J>Aei8OkF(Tv{%;x(7e(a8h{HAOjT`={Yg<8ByuvvNHi3 z%BOa|jO1Mv_9X({T+ujy`SyPNei5w&Es%fL5VpP|3c`wCkpory-OHH6GKEAj?>Pj(77Wg&ScfYbD zM+)g5<@A*Y9XCHHPL%{IsWOiNMu9Fg=xGSkzY)#IF6LJrn9s!NkHe9$& zRk+XrccN-~1f%bhy&U>T@sf77;xmt99u444GroHl5I35WWiNqZY@EjARsLqbR@a2^ zKfl7{#?3wI_BOfPXz*A5rBIoMl7LgvJ86CSrHvQdw@fcaA78|6pz5gB`m)ITA4C$D z&8U{reZ(7Yl?!?f#H3jGbClSykGfXbBQ@J}okABT^lMFS*((EDzIc1Wj}P8ivjz~P zYD56iRH=sS74KjYa-$0S%X5iO;o8%|tS&$8reMnpgN&oIAfM^ILTF5Sh?1;@Q>y=X zcStR9@RwzhcL6fj2mz8yQ72M-PQSw^2w~nmyw(KB@q&3(=QFR_I90_{tw2YpzNi7@Oj<}mQ;u`%uP0KjIem&by=toD{LiPVlc%hGpZ`e@g*-!3k#2myj z{E9b(C5GUZy$+|itWra{_sE9r+ppq+1RGdd4}TX@1dt|!fo2RSH4W<7&iR=r{y%Ho zROH(gQzD5UvQ;94eZiT;ygSG(z!4tVKW8>)lc z)y`MT*S#5XVP#;aSEA`!ER)8XyU5CC?qLtMP}lgfvZ2APC{ZV_CT-s{@)&X`uEb0N%fse4YVq%%MqxB2sY^*lDMVFv>KAQTR!`oJ zw5NyUvRrdmZMl?aOjw*x1yBg5ZSBvDe;Cr4rHVIce<_Rd2UT(kguW_ZzX}1kOpz3< z(0|p|vv-=|X3%Hm_UiAKTUOta?>dL6d4KrA6L0xR_#15Z}HzGnR9PCujM ziF^drTSmAhO~$ti{JAC=tDM3Yp!aZ$>0DS}g|VbKBmJsdyPYZ}dG{L>-jp2suO;Pc@1`g-(9D$urSeVI|GJXG!O zz(asbkTh3K+vjg&-f#2+v|H8;vE4wmflGMU=w_CI_{6+rggUGhg+67}=dXrypu0mD zVs18?g(Z@a}-stin zL8#2|{j7^=-zvd%{$950_W%ytvy^cPk(Gly3?_iZtKjTF2FQb0HDH^1v{Uc*ptbef zEb5M&eSEgm%=xO6rk5$b{ZK0^fDN~^)AUWt%DyT7{n?$#4R@ncal8ghWUY1#Z)X?o ze`|GXu8X7%rl$;({GlXhTz;IjkKI0HO#KeWfCY!kPQf{>I<}GY?L%v){ASSe3umf5 z(X%_E@T*TfHt2t(P|_{%l(7gs{gI;Q_V;Izh42UaISjH|XYSpSrN@q6IsmL1<`?i| z6OX)l(fI6Q{BHJ96F>!@5cz{qCe67(6-C}ga)QOt|1Un}=nWw1@MFZEejBc{V*H>! zVm(mzT~_j`uS>uScy0zkBt!08L`jpF$Fog>$TxTLa3d|5OF<|rNbr&A#65da!oC{T z50Z%Ub(FU>x!X0!&~U+tx$jvF5ESl0?4t$v&gT+cMUHdu%?zSXet>C|wK2D>>Q%At z@N$~Ks(I*ENj8&j5}drwn^(7}X&TGT006K=vPOk2F+{uSrcN5?N898lXfF?taLjm=oj6e838deE#&N&`HX9ZK z7O=oa6(y;UMxhH3X%;)}f()X>2pzZ7J9QmbLwF9$e*8XeYjvL(^~tqGF4H1Nd; zfdY$mW@Eo2oUR>!WB*&-bkSVk!j`yPVG1~8@v&^2UM6CY8m?cloEcVd#H5UEkh`vy zraRk3pyoAdS(yHKyryX9)WiFBgPmh|3(uX=ylcMOATM6%no7*OZNfZ&8{&vRU!P>k zNT`v0secUJE3h+9@mpqk(et|xM0(3gxD;mvvpFh@DRe_Db))|y;OQu(WNuesXY zo^>@N5(gY5$d-g2#4^vQN~D+lE4Pk<#d$gzXoLrl1m?n9a0e`}CPIrP_+= zOt>fH`}aAZs=PC|onLOBp;qOh)tJ-2wOqzc)zcTF6}rO2P#p-A%EJhhI3x;2Y%mLG zly1(%2Y`n84xo9NSM8nG`mkDg7}{oZ;6a-c)wbB)%@pQT}=-v2u}zHlWrGK_*y} zmB0_Dho$Sq4N$AmJvezgHPhsnb?UZtvqupUdhV+y)Q=39@mjdk%y8OtU0#ws_;&ud zxrscLJDwa0J+*utBWPYE!g7|FuoLNHHw>e>V{UDvZdu=QJU|b1DiGQnvfxfie`oZ0 zkb7;{IZ~Wf`dkF5Os<3ZE{SHCporxyXg9aE!>vQj+W4+sE*QQV* zBAiqNRhZeixUeip%Ga~m7mVlP`lGnDP< z+8dJ-PZ&A=9d07f%I@E`oP2)l1%)vDvo(o#aY?+KXo8rp>)I5MT|A+jqtgCh+jC-- zRxdHm-Q}0a5fd4*h6s6Sb*#n`RJ^4tUr?a5^9O)N#fgQT>dd$6DjJE|ZFd$ElR33`3yg$oU2N^A_}7Exl4CafUQ8&DP92w%*buOR zSymHHV}f&s-lX;I+x}`IZx!WHM*n~$`X|*Bc0`68PfdGjHL?}y=>~hY54c;dqASJ2 zG-;UppN=unp2^)V<+?0VUtrmw`&m`Ux{}?u!dRGr{EmKHXkp1OIB23lejLOUGCbJ% zF?%80U5+`kxy_}(iU8u2H|%>vPvmfBuA~3(wvgRq{f4Vckx9$uKpCvouIi!4R)qGG zDc?C3gnLXdtXQjM*?lO@xWy@cPq!L<~4zn@VZ3J?Q3VBdS;&?9y{t!B})pIhQ#z)4_v) z9AA(y$Ll~3DTP<}a!KrGy`;Hzp#CD^uXu9uuucm6rCbs(mx{GprGCKYrA4sEc@`vrn6dr^_|IZ$bB%~wmlTpVCq4MCx}>#>`W)J&KI6-y z(A96OaL&uH5o)b;I*wpV(TgJ{?=m*Y_*VRB_Il$~2B(H=XMSJ6t}%~&49mKCKxge{ z+X1C;BOebFj9xm-vM3ZL&pZBk7fvvt7qXqf`Y|efdDN>d{-)}5@yYO_q9ob2+{ zt093lLr;LCNTwf90rV3AhPAWq7#;TVq3rsh1!{JjQL&bqY5jgFiEoIt1`SgVDH?7m zff00AECz#mwTI~uHd3VW73!&lgW-)K|D=BGPb!KKVLb~nqc8zIK-b0=_TcBa9K+G^ z2FY$jp>C}a@#MO)Be^zf{fwZ7>czcekx3nPXMIp@$%E+*2I^;x$6BIS)*$Mx@A`F> zM&|uJ-cd7B%E9H5-&G*#a_3B-s81mlR9xF4kGL3&hxhVMmuf^G^!&Re742*%$v}8^Cx!d(cv1s$HjV(F+X1N&apk9b)a7&%*#o%wr zyz(1VU1uhZWmuam^>N)SBqz%Dcg+y7c_noBNu8b7=#|HdBi)<;_S#Qmp5tic^ftv{ zO&c0P%CnZ2rKI)Xm-f_?qE`;mz%csUa`5&kMnRFwi9B2qWj+pZnpJihkBJ5~Hy!d4 zIAy8cPgL%uTRc}lXlo7g=?|L;e>A93fx)ZN^Hf?K4e5mkzGO<1^o{1Si`F)K6X;Q< z`qe*4k@86IBNc(Orf15oJg=&eapLqKjU^&8A?kYLzi+UW-CB8pyDGr^&%;|97%>=T z!iK(wD`z_sx=vPE>}OwPu|m^+m~bvpM_5JT2^%}lifeC z?Vs0fm8?}ga6vvydMVZVyJ1>k^8?mk%%rRc=he`(u8^q-pv(jJu8;BM{JlA?dK(V5KjVc2gd{Q4KDr`mNw@ig;b#6Y^l!KXe}_yH?(c`PzR%h3=8A%96u z`dj`AC1pXch+ex^A1~prOvO%bP0Bp9JevUAJD)uej(BB|VYIpwCvf}EtGx5tg%@DN zDJdy0&%g5MOP8IBH$pngWtW}xnm0)L08~fw+!G^NWW&I1YM^})AgnNNwB(XYU8B$S zo8q~OFX-wAxeNw<4>~}R}&8AU$}o%%58lR4j? zfrBsKnp_-+43S)6*%FhK_{C|MS!`mCFjf6C(7|FV8WSQ#_v(g&<};V|UN6kl@qkl5 zd!qcwOi}gN(gh#G;6*_x>AJ**`kymK%)FL!2P`93@=0F1KWJQ=X)fZH%J~`5j9}5? zHH?Dy7e5hs-cOqLxv-lRZGtNosbnvfAI&XAsw(_>kB{S( zG?{fB4Ub4K+Xl`Zk`OmEbI{d!fzV!=fhQ(uVD)`9B&^acb3@!+(IwD?dvhx;+h3Lx31R}}LD=|!njU3@vKc2!G3vi!uj;jG>a+B)jbrYgl+t8dVY+-8&GAHSaApFx-^VN)W@C-RiqYR?$ zJMjunW?4ZQxU3wu-1q+P1^-7WU3Kfk~S;Y$p7{$g6t31@s--& zxoHR@8CYCi_dQyR!mJ~${|WPJnmt?SXTc2F-f8SAFB`BF4j}&&_xHxyu#jc>X$*d= zu@=PQUQO@Z)5kmHv3(h`ueDOJ2R~kK@;YmvXkfYM1DJjH z&jb*#?fsQnXzyR)5ZwR!0D?}L|9jE@6~X_XRgk5P9zTvXuXXsG27Q{BcGevz{%Wen zW%gqwCeKP~>Vc(yLkH5wEl%d-W!sS7+No!T6bh(v>PkO9eG8r{9!;Arvy2RPeEZ|? zVl?nt-!E`Em=tu`|6*S@@_B&dwR|)DxM*eiOQmpQ?FOWNWGjThLMt%pKbwq#RdRt& zzzlstd6SlKN8RQ7_aT?Lc~MMf04p(~ZsM=rhW9pKxigiOy%46roXB|J^C9MB(s8Eb z?^BC0+l{OZ`Y-Z{6eWvwJ$#t_l3AGlDjXw^%_CEB`|eG)t7^`&V`rw~UXx4!!@WLB zCza^09&Q)8vE$-4D2drgc_OTa>=fYWfKIpAMbt zfh|uIU-@ICR{h5v6Oqa!d7{mm9m}>CiL}Iut;J=nW$yMK{vW>%!uRfPUb=W(hjh|#ZHG2G=6MV`cQtzdbt!A#>Sk8tnmYtseOPgyK(EJ z-hw~NW&fj4)gOU9_c0Fyu4a{ieV_i+zm6!JX$X0hDlYN?6Xb`f=fRBv9X-) zo8zX4(tu1hSBQwo8}c9e0ekc{axV*UdqExtb{i0?|6Dk1HV_k=-qzLJ{K<8@T=eFI zPtB;GB!eJ?tMyrLDhzIUw%}+c>NB&^`kN~_Xa^wlG=#t8O7owGJHq2G7MRyEvc|?* zZ^cw4tj%|S$2RPx>eoZ&24dtzJ6r`0Nzc^;M^vTb^&4s;$>HRM`XMKWj8t&TZ%QjJ znAz6Hiqp1Kq!bIUNmwc4Z@Gy$wY&Uo2plti6t!2Tg|JdoU>ahg48YzK;35;T$aDNO z3Tp7&K}xSrs0TiAzL5zS=}a4H1CYh*K#c+8$A%8q2d%M*1(}cW_`D( zf&U@+NW`J4O&W&kjL!oRzV;9W7@UZ{)au@tTiB`%`KL7-XMw0G8Md4jEUSbRHl@3; zWSXTNXo1C7IP#ABL#;ErR;o~Ic9)UU!yGzd3Kp6`@r%2{8>a)}h+l(V4t{h~{BA)G z9&_?mQhVgCD~Er$onAU5HffBjz^OD{3jaljxK}0KCcKd*)H;-BUe0z)pUkrHfTH=L z;XlFpbZG0_a8xOhg0R({3!s;65dR}^8kA=+TNX6Ar6_k0Scwn<_*F+)+Amf1xFj0# zKhNsjZVwjMi_Psgn~$JCFbP|Kfj+g-BUV68!d7Gvxhrfw3xen=sPIWMZYIxU(HNQf z0HmTv2RQE#8{BKQ*_aQvq-C!r^we&kIqLBMdtsy%Yp98XHy;cL1UTXIU%A-Jt` z{w=wfrok5q724mvZaJ!2+#yg;ralxKPXv^87hVpc=q{PyyE@^hzRf&32FB_^0|tg> zaXW9B>DTuv?_`jdrR`&+W$YMD2R%t+Z69y64t*hwHF+iAiao{X3IhBw`UFKUK=nF+ zcHyRi8t)@n*EZ!&SNF0WG0ARDe2V}LeynU2OANHG2HIpQG}N$#lY4SJ&hI0=yyy;` z8-TjddQZ=5htc(N^;&rtHr2ViH8|5vu3DtB$X3U%-n2_0fK)53Uw63MYo^;2!j4aEx zdM^e4d4-c#eWomg^~2eZu@<{+#2tBN)h^(T@#A{nEymWmR-TMO2o7A=28$eB`(9#B z5#eG6Tfmb01a$EH^))=4Q0;_4u=Sn?(B)84<;KtP`)>`a1XGnHofpF&gm_uwC!v}Y z-$tYRP_O0}QxsDqfX61~nFIBX_qs{e}qpUT1ji+i1@;Mp|$HHl8`hNA!X5 zT+ zjfr4!A_Sj1V0;zLi)?{Msh5+GkWv_ukjAb95BO-zI8lwYo59K)Jc`Tur#ZnGMnKRF z^+zwW)g>M>HxgfRD*_})w+Ss>1@1TJ+4_tRsL~~!)ReuLEM8d&Ox>Q3OM5qT3J8;@ zcWFTl)-!G(z5MIiuU@n?0t#K7_1`D?IW8dmP$LCf75_d-+@ZGyc+#`BJ4CIny!!?U z9#6;d5L#w3C8LK*5wVnIi62;`W$pM6N{*?Sxb|lO4edJvX~Z_uC-A;u=PRV6W*VKK z>tin!s|s%GZ`#s_nwt|_1KANkIQ$~VEA#CeVNdIB(A=T5%F8WX{j%vM)<_g>OoGrz zxLyV1wM4DMIG$0)rn%VDJMoK8`P%A<=^!xsvxRgq^)nEBmU)G1Eu;L7k@&M=$NEt+ z@6EtFJmw#`Yt3=LAaqC{rfc0lCjisfBevCy)!(l7+C1v;L*?Eoa85C(Nt*Rt*(P!6 zsuFjnVS0a7mN|h>(83wq6?Z%wo?5?d#^(#<4x`H69wBrA3SC*#-q5$#XDh+8kGmim zMb3RG(Az#Pzq2DyY%I65xFr6pz^|hsU?4y+GhGU=;S%Cdo%-aSnZA=ty=o^r0S{rfyS?wA z!e%2G5!?-*0A77!36EY{t!yF0@hsuq>m$ve!2vx%MGK}izS?RfX)w)0+m?3107wEBf)KQiNGe=4q&5?X@z!7UZWan=1{1aX^&^Hg1j?BUM` zt#ZiJSo;k~cLAt^wH{ z1VGy_`Cgn3itGGj!2;pRMZ0I$J#A+^qYu+0b0We=OD2P`26e~M_hS@sz*$(<7jhs#<3q?ap zi^gPyfi&({2WYi=DmFS8E5GM7FpGVs3+|QKUAd#B8Gl*fYrEDMv0~}|nzYQ-H(L5} zF!9^_^H&en9|+XxRQawoWc9(p7vg5l*^Nf>X}R82&btpPLCrM>4PnD0>mTlC6^jRX z%O|a)Q2i82Rr~n^!XX>ZJ|s3J1sTDWc}DifD zco1!_2Lu;oNWE%U<;)HMI8LJP_KNzDK}SyCb3+%~Gp>Z=-(6;M&ShH}4#8>6*lPIS zSZm&f)~`TA{^?HWW(h%&QQp7Sd%h%{Ox(e$hE15ZWv{I(2al@86AnA41J%F|n%m6n zo||yle^Ke(;O6aA;0-E}OhOM_+y{HATF33kP2SAq%voJvor@}cVlpc+J`!uUJ@aDqU zv|gFAZ1MXJgFCun$m@evX=R^6#?VhdEO=))@<-Cnao78IGw=y_IYIhciTKg-5Y|8| zzBJ(U8sGpG|3V{Oa%~5&<6c_h`E{o9-i&Gi050(=Y5~eR!qA|)9SX#8*NP?JD^G=o zII-f44W}#7XUZ_T8#h&*X5Fx|l*>UFpUU!=ND0uEpLjXR8;kvE);f~2ZC}h(MsR)s zZlV@Syg~=di+OP+qYlCt#WbzOe{WQWeo)EbasQ}$h|5M zs-Q#GlgE)$TQ;ThyPx^X$+}P1=5$m7$l>!D$s!x=CSY$mjfLO|0OzSlk7qu?DtA4` zH=77Er!5-aB7atmyAsODt(`$jSbKkAR7LUnSNN~KfH3?hBXh1S=2iaO=mZ8&|TiN9?`T_hi#7ZcwHn27N7AC-S1h?ZW{mcvh>}a{29P5 zSd#V1xz(5 zv#c`x`iYEP=Xg_8fGv226L*G7{hiMsB>|> z!eGKrf-B&IAT&QTW;_c4Ap;LFWor|9#2I9p*Nz#Aq~bTxPzw&b7lqNZcIcey`A zwoWx?g#!6%-DreMBL48gtMIMWaUB(9Y7`n(Ex_49e}$ItH;evwcixXiJXb$3Z1su^c;&+=AU!#MkZU1u5UBI z@(x;*J|9ioPbw|{_F5+oxqgaw4rmsU;902lD(Wh9x)nv{3wUOg%3YD*vgUgrY3&HR z9_4-S31KjF9r8$WKGqu47)?~>-?rHzYuw07cQfD3T5Z!?1Nj%sI$Fq-T26E>O)HED zIPxH|FH5Pz7kCY5F&xCJN`nvZIZ``4Rv~R@l>tQ!7bJh_u%91+NI@`OjYzSyFuSW{_3kR_@skL0-Opdx(P z`TAGG?4U6kZic=B!X}t%PD71zz7^mC0w*5O7TJU?v_?*@pc@k+MQ};gwQimA4SH(& zre5ceOkC^hU)7Eh?Sa5Pwre{sM98RyS#krW&*F8B(@3OU^VPuTia~yS&pOm5WHdC z44hY0&(A|bF#77sBw~n{|K~|o4MBLlr=Xnk#!IL zHli}2IG(U$mzHrC!YoyCbhInM(4BqE>UlPjKhQ^(db+`>5tiotBP6X zsK}(xDO)+i+MiuA&z}mtlar`-iuTfWzNHIIioP9X6Zf6dS zD{Jazq!cYHUn06E1{|{||7YOJN^gPnhcVaC#+UKbO#VY)xE@7e8J=Z)h?b`#Y}MfP zdx|vysk<&d4njI|I`xWksIQHAzG!ipT>$J-btcYf7KHjZ z?K_e#m?`+=Nab$Pn~0fw6?sGjZ3tt?S&VyZ%STOWCT|vsK7L@)>4)aNd>6tTuTH(0 zz_^;wSUQ;`|LHl`d=+AeScWPFi$#t9B7Zz&kTtYocFh1Z*E?vJ&%Q{|pT{Pe@ocVo4#+guqA(r7K%d zKzPoSU>_3{Dl``Uu&=4_oi;vQ|l=UUqpPV$z%(T%Z;5y-*cFx?1YVT>t zEJK$Tec5N{KWbcKW%i>HSbW793B{YoA8GBW$V2x)H_TGxynfKc)oQg`=oZlpzR zl&OI@>-Zm`ifYj`IBZ zjIt7%Igt_}Ek3Bdr+WFK;xnh(w~0xRh$ZRG-uGW?rjk{0bX~C32LA*1bln}qDC<=`CNh)h6D(>kh4&se392SFX z2Nsn*S2tvCmR-(b0yyzE0bkf_a*FM$j>7_wvN~Iji5+6`d5|XKAwREIoLq0I466ijB|FA z`<94qK$g*JZHAiz`{!uyL_X}%XJRLN6yjg=)R7w}KW(5YOLmPsod>8>`mbf`o-4n` zZFc-C=~C#JfLRSUFopYH))cQ>y!X$rOCVKM;^=rpUiR5;_5H;L268%pAEplYVczwR zWUo)&e+ys3S06>Nyw;5ft{ni@g(M0rS@CL52bvpxW_&CofT88#;205b~%V7@7b~<*;KMTo8pS zJ20--gC1)F=2znipqV$^k-rtQahMVf9d0S%4d7m_vbUpzT%uNMFn&c|uy3OP&9LPZ zgN<7(OI&^X0WTA){pN68mXqfSL82_2y;({wy$Ya3(s9<;JeP)xq=Gr*F?P{TE@tegi*%=v zmp&kE?asrpmbt^E7XGIdHvBd;OqykzQ(h80wtZh~ML>;(Pz`owX|DnPa#AAaTRn%@ zHK;dNFU_D-FMSq#tX_}gt6UJ~D0;?v`#(=lUxwitKqhtshG z&;NUlUx(k>>t4eG%|D*(H%f~J@)X$C1$f;=GQ zg;UgHoH#iA#CBarvnO`lCvV!;eB_?}s1y)&KRR$Kf4tb)X#1Z)Z|pj)ziUE)_4y}1 z9AY=6ea38KZtIMMr3d+H{9Tk{{lgmAxhvz)8xKf{?!w@v*nPL%-Ylm)VD6>lWbKeu zRHYg71Ji7&U;2~w)*6nN5=(eJ(X>y2P5|r@W!5NK`H~JqE1{8;v3dSSO-QYW1>nh> zn=^yU@Qx~^i6-LPbsPGCC~T33;eNQ?B1V{?H926!hC{W7o639s^+xp5k8A?=nQkQP zTp$>hKonk+fVkdJmtkW+y%+zNgW6JveQPaLwi07QW8|^Y!jb^!F%d*Exs%OVn33XL zi}x2e5zfg`iaX$Ip9|(R5m*;1R-3FfiT-1N88`5Eo!SAT>S@bcmUO<#Y$TPA&$_fM zKowISHi&ic@d+O=OjQLw<@Mh36CQ`IvQLGCbD2r9VV*sK-JHaqoHbR+Hy)1VfKc;C zpCeRjUM2ux-eN8TB?vl#3^s=txRFxmU(VG593C&cwd&6sd*d zDN0qZdufb#O*h$CyCemNV5m_s&>FHsNBc6G5JqxFt=*)mVP_*-?-UjCD?_^jVppYn zR}Ed>#kW*Nt($|`H-me~eXr^3GKPfYL~%RUJMjKqRq@L~mOvi+FNO2L@&$#{%8zKd zK^zYO?->ps|0QrT7;=^dSPd5f968g{EqZ)2Hd5g|wVB%e!vsO2V*tfPbsg}aD|9Yd^VXadWQx#6|lm~v77BPec|QO~@;>hq*g zfZzB#ZP!9~O*h{-5o*+RY)fklLwlk{s0vv& zP0A;zogT+H+W=`^zqXIJ*YmQy^FmhwlC7u$%Qi~c<-J3IUHJH&|K#{qxlQt(dz`%e zcRG!Y3qz7Xt*(_yN-vgj?LNlI#~O3OTUVP&kF(^rpW2HzhQS-s^W0hrNg`zB z@DvSe^k}nwMOj;sH|@f?KaJy`sS@Y`3EqJ4Sz{^Bbq2z=yyAj-i7x>hGYjZOLWCy7 z3HhIO2e^-AjdO=j&4(CS%*A3~6+n?+xR!)a!T7NtOC3gD z(T_UPt?Zf&9YiZ`@C9`xO{XnR{@?3_zQ{&eYa=+N#notVq2wkP^cq(bLDr48VN;@x zPyo2#-3N_F3zJ_vOoPw|{L{-EE!+GG>d?15YZeu64vB#`0!h$>;c%ryG^law`wjrP z?9cKD+22>ts#@1hoR-VMz@w8($RYfR=if8-$M+RBS);lAt8I!~xg~OpZira?@UD#I zp(@x}T@vE0pFa=>O7<5?=%~1~;Wo1CRx^8ft$vxhU-r!^9KgBV*?hLhbmaK3vVJ|((Q%V^3-OfJb;u6an`<*9hHUknxTlD1h`jkrKYJ3TU#*_?PRqSX>0HG}nt9&}QJ{4XgU{TYs%6F$vnZ`!Q5;6mn3_VCb)qD6e zi8uMzBR=&(gTzUwJW5T}&g!4hyu(1yjm>eRZLOU-?&JIe`6_1=jqCsvAC8on)`@9j}slGr(OyG4vkh0)BVF)FC*9I zmu~HOtYp=P-{67oHe9mP(Gos22M+pP+h5$PN2QD16-r$8UjGa5ReE5jdK3d>^tMu8 zlqnUsw2FSV;h*^pH8vBfk;+QkUSD?z8B28;5Pd~SK~S6LvV6v9Mq~^52f*wFnWWDE z60NETX%TsBPxf(q&Hc#fkWv}!!xl1>-(3lcz-Pk=rmdpUg|g#+QA1CPSWT~N5|YsS zp6jO;TJB2Id*~GaXs#9U?L1-|r0pBfFCA5bJ3jrMb+6UO(ER*TZi+|lJ7#H0B80$w z&nG*1BO4dVJIz};2BZ;%1U!kBx7`7xRq+-8=$j4iy(9PL$W_%P3tMz&mhqGlzw;>~ zZhWgK;ZV|cW}|+q0u?Q6&r<{QrV4UFs?v#AhH=1Hm|$UB#GwyGF6AbLe28bHw>)i| zstYg&IG9;uzdi&>UiIZjgKUytUedIiAD~jXj5dh5DVfrxOfz2Rrt6Bny};c>T@zJe z2LvFJfah{?I^_EyWy=S)LS5Pv$M6y1hG^k>84xB$HN)ZtfXzeO)cWf>GJM6Z2CB5l zIaOGYJB~Sfg-3qiuQPPMH~DJtt#d79qxH{`_tA$^@7M9L+@;c=PbmL@t`q=8=34dV zs1rcrWlDRc&Hy-l7Wz?|ocPsXjy<}PYnPWD%o+k=!0Dy&0YJ`bDte(`R~EH9ebV?` zFepERwa29CmQ&pPa=-O0xc$o${=IO>M=k*N%mOCGKTG@{u}XHz(>XVv3yf6;nB-Kz z(r*3Mkl(5NwO)=)dLhFbKGbZD3z}>}1Yc?ZsK3F+MM8|=8nWsjv=Klmdi!d#fBv#b zwnqQb{xbI){T2Z3Wd23g*7Q1|8gMhrZ#v3gp|x2K6j*hNma5CW=2SJWOD>`~0ND8Dv){BzbtqKXbdEi@M|P-TZeMuumN11S1FTb3&Rrl`M}o-I{r z>h2+iLowaf=rQ*ns%TfKMJ?~u*dRRd2Y0}qBnxw_VJ2rafQ>iomRdpu3pWJ*@|5gG zYu5I{2qp?7CBOLA$Q80QcyBSoKW#0U&=Gol_4>=eiURVnd;o!mS=z@3>WfEF9%YVLImPczebyCxSDW+$JXXs8S^u$q7HI7=4?q4N zTF`S%_uq`9uceo+bkqU;PKgyIia`tcu+n}gd$IUvX6cBk;vagZUKJ^gHQD7=2_P!* zlJ;i4;4bMPya0{VDjN6T**sX0S&ZQ?X{$=W3L zHza#eapb&EXk{o5>1Uw*%Q{n`V3u0SK#%cXt%$Zq6{RuWbFVV5bboQZb3sd!n4I-q zm)B~7KoOOGP@$ERrRe?t(8|(-&mV|;jK%+ikp*gce_(jf*XQe%ohE(m1${Z;|C=8% z_G{V&*Y6XS)uO+N3=!}NmeNfx?+@s2LQL~Npj%!R(g!L=O3iXN&L>OS>rX1Y;H&?k z(k+kgRJ+W7dr9*#r-9p|4g>TM{V!2&lv&1i5^%cjUHzdS)Fx!HqO{e-3RkTDOA{+h z0k|rSEHGjcMM*vc7&|z1P>X0X{SSw4su|xgy(!sa36S9c9$(i%vnzhN*D|9qFwOTvEvP?%|M(w=AuF4 zkLKOvxHi^5XQaP;>(2Oh!7Ai0Q8TfAp1s&K1O&Id4>wU$Cj0V-zlrYzp(UMM68-69 zzuUV3+xps)ShM@tS2DRjm;e60+vWFXI0S5s3CN@Ff|WMPKYy-zSRYd!co@~A{p*?h z#lgh{1cg2;{bzl=&`$tH`{;tx1@QJixibioQbZK}{uU}=pp(nh+IpAv_t%f2-8Ra8 zF-e3Zus{1%Aql8S*rjH2$5=eM`TLTr8J@_w6%pXK{rTTN5SY$lXRcB+)mt&yn(F^~ z2wZqc$VrYv-E}bf&&c2pkO3TGt?Vl)|M`J^Nx+FE_i32Y&Eh{&TJNg&cy^XEN*MVS zFEIs}E8wFr*`E=!RsV^nHT#}m2z%F`L)a%jy3@Grxp3;ZDr-Tz4dt z9s4JRe^a;#3KQHZ#3(;0o03u-?>G5-ydnAXmU_h=wxXO|z4Dw!-eDZOYj-%Mem_sa z&pj&UOQ2E_AMjQ=$|PW*haK<%A z(;D9YC+|xtr$mWvf6%9GJ@4hsiI)1ff#H$gvI|wsee!=6Z@53H{wc#0?f}07&p5Ll Z{%4H8lyLr& { + existingPages.add(`${section}/${slug}`); +}); + +console.log(`Checking doc coverage for ${Object.keys(MODULE_TO_DOCS).length} feature modules...`); +console.log(`Found ${existingPages.size} doc pages.`); +console.log(""); + +let gaps = 0; + +for (const [module, config] of Object.entries(MODULE_TO_DOCS)) { + if (config.internal) continue; + + const moduleDir = path.join(REPO_ROOT, module); + if (!fs.existsSync(moduleDir)) continue; + + for (const page of config.pages) { + const key = `${config.section}/${page}`; + if (!existingPages.has(key)) { + console.log(` ✗ ${module} → missing ${key}.md`); + gaps++; + } + } +} + +// Also check for doc pages that reference non-existent modules (orphans) +const documentedModules = new Set(); +for (const config of Object.values(MODULE_TO_DOCS)) { + for (const page of config.pages) { + documentedModules.add(`${config.section}/${page}`); + } +} + +// Report coverage summary +const coveredModules = Object.entries(MODULE_TO_DOCS) + .filter(([, c]) => !c.internal) + .filter(([m]) => fs.existsSync(path.join(REPO_ROOT, m))); +const totalExpected = coveredModules.reduce((sum, [, c]) => sum + c.pages.length, 0); +const covered = totalExpected - gaps; +const pct = totalExpected > 0 ? Math.round((covered / totalExpected) * 100) : 100; + +console.log(""); +console.log(`Coverage: ${covered}/${totalExpected} required pages present (${pct}%)`); + +if (gaps > 0) { + console.log(`\n${gaps} documentation gap(s) found.`); + process.exit(1); +} else { + console.log("All feature modules have documentation coverage."); + process.exit(0); +} diff --git a/scripts/check-doc-freshness.js b/scripts/check-doc-freshness.js new file mode 100644 index 000000000..a73c6261a --- /dev/null +++ b/scripts/check-doc-freshness.js @@ -0,0 +1,55 @@ +#!/usr/bin/env node +// scripts/check-doc-freshness.js +// Reports doc pages whose last_updated frontmatter is older than a threshold. +// Exit 0 = all fresh, Exit 1 = stale pages found (advisory). +// +// Usage: node scripts/check-doc-freshness.js [docs-dir] [--max-age-days=180] + +"use strict"; + +const fs = require("fs"); +const path = require("path"); +const { parseFrontmatter, forEachDocPage } = require("./lib/frontmatter"); + +const args = process.argv.slice(2); +const positional = args.filter(a => !a.startsWith("--")); +const DOCS_DIR = path.resolve(positional[0] || "docs"); + +const maxAgeArg = args.find(a => a.startsWith("--max-age-days=")); +const MAX_AGE_DAYS = maxAgeArg ? parseInt(maxAgeArg.split("=")[1], 10) : 180; + +const now = new Date(); +let staleCount = 0; +let totalCount = 0; + +console.log(`Checking doc freshness (max age: ${MAX_AGE_DAYS} days)...`); +console.log(""); + +forEachDocPage(DOCS_DIR, (filePath, slug, section) => { + totalCount++; + const content = fs.readFileSync(filePath, "utf-8"); + const { fields } = parseFrontmatter(content); + + if (!fields.last_updated) { + console.log(` ⚠ ${section}/${slug}.md — missing last_updated field`); + staleCount++; + return; + } + + const lastUpdated = new Date(fields.last_updated); + const ageDays = Math.floor((now - lastUpdated) / (1000 * 60 * 60 * 24)); + + if (ageDays > MAX_AGE_DAYS) { + console.log(` ⚠ ${section}/${slug}.md — ${ageDays} days old (last: ${fields.last_updated})`); + staleCount++; + } +}); + +console.log(""); +if (staleCount > 0) { + console.log(`${staleCount}/${totalCount} page(s) need review (older than ${MAX_AGE_DAYS} days or missing date).`); + process.exit(1); +} else { + console.log(`All ${totalCount} pages are fresh (updated within ${MAX_AGE_DAYS} days).`); + process.exit(0); +} diff --git a/scripts/lib/frontmatter.js b/scripts/lib/frontmatter.js new file mode 100644 index 000000000..3d39e52cf --- /dev/null +++ b/scripts/lib/frontmatter.js @@ -0,0 +1,51 @@ +"use strict"; + +const fs = require("fs"); +const path = require("path"); + +const FM_RE = /^---\n([\s\S]*?)\n---\n/; + +/** + * Parse YAML-ish frontmatter from a markdown string. + * Returns { fields: { key: string }, body: string, raw: string }. + * `fields` maps lowercase keys to their raw string values (no YAML arrays). + */ +function parseFrontmatter(content) { + const match = content.match(FM_RE); + if (!match) return { fields: {}, body: content, raw: "" }; + + const raw = match[1]; + const body = content.slice(match[0].length); + const fields = {}; + + for (const line of raw.split("\n")) { + const kv = line.match(/^(\w[\w_-]*):\s*(.*)/); + if (kv) fields[kv[1]] = kv[2].trim(); + } + + return { fields, body, raw }; +} + +/** Discover all .md page slugs under docs/{section}/ */ +function discoverSlugs(docsDir, section) { + const dir = path.join(docsDir, section); + if (!fs.existsSync(dir)) return new Set(); + return new Set( + fs.readdirSync(dir) + .filter(f => f.endsWith(".md")) + .map(f => f.replace(/\.md$/, "")), + ); +} + +/** Iterate all doc pages, calling fn(filePath, slug, section) */ +function forEachDocPage(docsDir, fn) { + for (const section of ["user", "developer"]) { + const dir = path.join(docsDir, section); + if (!fs.existsSync(dir)) continue; + for (const file of fs.readdirSync(dir).filter(f => f.endsWith(".md")).sort()) { + fn(path.join(dir, file), file.replace(/\.md$/, ""), section); + } + } +} + +module.exports = { parseFrontmatter, discoverSlugs, forEachDocPage }; diff --git a/scripts/sync-android-docs.js b/scripts/sync-android-docs.js new file mode 100755 index 000000000..b555f87db --- /dev/null +++ b/scripts/sync-android-docs.js @@ -0,0 +1,331 @@ +#!/usr/bin/env node +// scripts/sync-android-docs.js +// Transforms Android in-app docs for publishing on the meshtastic.org Docusaurus site. +// +// Usage: node scripts/sync-android-docs.js [--convert-webp] [--dry-run] +// +// Path to a clone of meshtastic/Meshtastic-Android (or omit to +// auto-detect from this script's location in the repo). +// --convert-webp Convert PNG/JPG/JPEG/GIF images to WebP via cwebp and rewrite +// all image references in Markdown to use .webp. Requires cwebp on PATH. +// --dry-run Print what would be written without actually writing files. +// +// Output structure (relative to CWD, typically the meshtastic/meshtastic repo root): +// docs/software/android/user/*.md +// docs/software/android/developer/*.md +// docs/software/android/index.md +// static/img/android/docs/*.webp (or .png/.svg if not converting) + +"use strict"; + +const fs = require("fs"); +const path = require("path"); +const { execSync } = require("child_process"); +const { discoverSlugs } = require("./lib/frontmatter"); + +// ── Configuration ──────────────────────────────────────────────────────────── + +const args = process.argv.slice(2); +const CONVERT_WEBP = args.includes("--convert-webp"); +const DRY_RUN = args.includes("--dry-run"); +const positionalArgs = args.filter(a => !a.startsWith("--")); + +const WEBP_CONVERTIBLE = new Set([".png", ".jpg", ".jpeg", ".gif"]); +const IMAGE_EXTENSIONS = new Set([".png", ".jpg", ".jpeg", ".gif", ".svg", ".webp"]); + +// Resolve source: explicit path argument, or auto-detect from script location +const ANDROID_REPO_ROOT = positionalArgs.length > 0 + ? path.resolve(positionalArgs[0]) + : path.resolve(__dirname, ".."); +const SRC_DOCS_DIR = path.join(ANDROID_REPO_ROOT, "docs"); +const SRC_SCREENSHOTS_DIR = path.join(SRC_DOCS_DIR, "assets", "screenshots"); + +if (!fs.existsSync(SRC_DOCS_DIR)) { + console.error(`Error: docs directory not found at ${SRC_DOCS_DIR}`); + console.error("Usage: node sync-android-docs.js [--convert-webp] [--dry-run]"); + process.exit(1); +} + +// Output directories (relative to CWD, which should be the meshtastic/meshtastic repo) +const DEST_DOCS_DIR = path.join("docs", "software", "android"); +const DEST_IMAGES_DIR = path.join("static", "img", "android", "docs"); + +// Derive sibling page slugs from the filesystem (no manual sync needed) +const KNOWN_USER_SLUGS = discoverSlugs(SRC_DOCS_DIR, "user"); +const KNOWN_DEV_SLUGS = discoverSlugs(SRC_DOCS_DIR, "developer"); + +// ── Helpers ────────────────────────────────────────────────────────────────── + +function ensureDir(dir) { + if (!DRY_RUN) { + fs.mkdirSync(dir, { recursive: true }); + } +} + +function writeFile(filePath, content) { + if (DRY_RUN) { + console.log(`[dry-run] Would write: ${filePath} (${Buffer.byteLength(content)} bytes)`); + } else { + ensureDir(path.dirname(filePath)); + fs.writeFileSync(filePath, content, "utf-8"); + console.log(`Wrote: ${filePath}`); + } +} + +function copyFile(src, dest) { + if (DRY_RUN) { + console.log(`[dry-run] Would copy: ${src} → ${dest}`); + } else { + ensureDir(path.dirname(dest)); + fs.copyFileSync(src, dest); + console.log(`Copied: ${dest}`); + } +} + +/** + * Rewrite image references in markdown to point to /img/android/docs/. + * When --convert-webp, convertible extensions become .webp. + */ +function rewriteImagePaths(content) { + function destBasename(imgPath) { + const base = path.basename(imgPath); + const ext = path.extname(base).toLowerCase(); + if (CONVERT_WEBP && WEBP_CONVERTIBLE.has(ext)) { + return base.slice(0, -ext.length) + ".webp"; + } + return base; + } + + return content + .replace( + /!\[([^\]]*)\]\((?!https?:\/\/)(?!\/img\/)([^)]+)\)/g, + (match, alt, imgPath) => { + const ext = path.extname(path.basename(imgPath)).toLowerCase(); + if (!IMAGE_EXTENSIONS.has(ext)) return match; + return `![${alt}](/img/android/docs/${destBasename(imgPath)})`; + }, + ) + .replace( + /]*?)src=["'](?!https?:\/\/)(?!\/img\/)([^"']+)["']([^>]*)>/gi, + (match, before, imgPath, after) => { + const ext = path.extname(path.basename(imgPath)).toLowerCase(); + if (!IMAGE_EXTENSIONS.has(ext)) return match; + return ``; + }, + ); +} + +/** + * Rewrite relative markdown links between sibling pages. + * e.g., `[text](connections)` → `[text](connections.md)` + * e.g., `[text](../developer/testing)` → `[text](../developer/testing.md)` + */ +function rewriteSiblingLinks(content, section) { + const slugs = section === "user" ? KNOWN_USER_SLUGS : KNOWN_DEV_SLUGS; + + // Match [text](link) where link is NOT an absolute URL, NOT an anchor, NOT already .md + return content.replace( + /\[([^\]]*)\]\((?!https?:\/\/)(?!#)([^)]+)\)/g, + (match, text, link) => { + // Skip if already has .md extension or is an image + if (link.endsWith(".md") || IMAGE_EXTENSIONS.has(path.extname(link).toLowerCase())) { + return match; + } + + // Check for cross-section links like ../developer/testing + const crossMatch = link.match(/^\.\.\/(\w+)\/(.+)/); + if (crossMatch) { + const [, targetSection, slug] = crossMatch; + const targetSlugs = targetSection === "user" ? KNOWN_USER_SLUGS : KNOWN_DEV_SLUGS; + if (targetSlugs.has(slug)) { + return `[${text}](../${targetSection}/${slug}.md)`; + } + } + + // Check for sibling links + const bare = link.replace(/^\.\//, ""); + if (slugs.has(bare)) { + return `[${text}](${bare}.md)`; + } + + return match; + }, + ); +} + +/** + * Transform Jekyll/kramdown frontmatter to Docusaurus-compatible format. + * Strips `parent`, `aliases`, and remaps `nav_order` to `sidebar_position`. + */ +function transformFrontmatter(content, section) { + const fmMatch = content.match(/^---\n([\s\S]*?)\n---\n/); + if (!fmMatch) return content; + + const fmBlock = fmMatch[1]; + const body = content.slice(fmMatch[0].length); + + const lines = fmBlock.split("\n"); + const newLines = []; + let sidebarPosition = null; + + for (const line of lines) { + const trimmed = line.trim(); + + // Skip Jekyll-specific fields + if (trimmed.startsWith("parent:")) continue; + if (trimmed.startsWith("aliases:")) continue; + if (trimmed.startsWith("- ")) continue; // alias list items + + // Remap nav_order → sidebar_position + const navMatch = trimmed.match(/^nav_order:\s*(\d+)/); + if (navMatch) { + sidebarPosition = navMatch[1]; + newLines.push(`sidebar_position: ${sidebarPosition}`); + continue; + } + + if (trimmed) newLines.push(line); + } + + // Add parent reference for Docusaurus category + const parentTitle = section === "user" ? "User Guide" : "Developer Guide"; + newLines.push(`parent: ${parentTitle}`); + + return `---\n${newLines.join("\n")}\n---\n${body}`; +} + +/** + * Convert Jekyll-style callouts to Docusaurus admonitions. + * > **Tip — text** → :::tip\ntext\n::: + */ +function convertCallouts(content) { + // Match blockquotes starting with **Tip/Note/Warning — + return content.replace( + /^(> \*\*(Tip|Note|Warning)\s*[—–-]\s*)([^*]*)\*\*\s*([\s\S]*?)(?=\n(?!>)|$)/gm, + (match, prefix, type, title, body) => { + const admonitionType = type.toLowerCase(); + const cleanBody = body.replace(/^>\s?/gm, "").trim(); + const fullContent = title.trim() ? `${title.trim()} ${cleanBody}` : cleanBody; + return `:::${admonitionType}\n${fullContent}\n:::`; + }, + ); +} + +// ── Main ───────────────────────────────────────────────────────────────────── + +function processMarkdown(srcPath, destPath, section) { + let content = fs.readFileSync(srcPath, "utf-8"); + content = transformFrontmatter(content, section); + content = rewriteImagePaths(content); + content = rewriteSiblingLinks(content, section); + content = convertCallouts(content); + writeFile(destPath, content); +} + +function processImages() { + if (!fs.existsSync(SRC_SCREENSHOTS_DIR)) { + console.log("No screenshots directory found, skipping image sync."); + return; + } + + const images = fs.readdirSync(SRC_SCREENSHOTS_DIR) + .filter(f => IMAGE_EXTENSIONS.has(path.extname(f).toLowerCase())); + + for (const img of images) { + const srcPath = path.join(SRC_SCREENSHOTS_DIR, img); + const ext = path.extname(img).toLowerCase(); + + if (CONVERT_WEBP && WEBP_CONVERTIBLE.has(ext)) { + const destName = img.slice(0, -ext.length) + ".webp"; + const destPath = path.join(DEST_IMAGES_DIR, destName); + + if (DRY_RUN) { + console.log(`[dry-run] Would convert: ${srcPath} → ${destPath}`); + } else { + ensureDir(path.dirname(destPath)); + try { + execSync(`cwebp -q 80 "${srcPath}" -o "${destPath}"`, { stdio: "pipe" }); + console.log(`Converted: ${destPath}`); + } catch (err) { + console.error(`Failed to convert ${img}: ${err.message}`); + // Fall back to copying the original + copyFile(srcPath, path.join(DEST_IMAGES_DIR, img)); + } + } + } else { + copyFile(srcPath, path.join(DEST_IMAGES_DIR, img)); + } + } +} + +function createIndexPage() { + const content = `--- +title: Android App +sidebar_position: 1 +--- + +# Meshtastic Android & Desktop App + +Documentation for the [Meshtastic Android](https://github.com/meshtastic/Meshtastic-Android) application, also available as a Desktop (JVM) app for Linux, macOS, and Windows. + +## Guides + +- **[User Guide](user/)** — Setup, messaging, nodes, maps, settings, and more +- **[Developer Guide](developer/)** — Architecture, KMP conventions, testing, and contributing +`; + writeFile(path.join(DEST_DOCS_DIR, "index.md"), content); +} + +function createCategoryFiles() { + const userCategory = `label: User Guide +position: 1 +`; + const devCategory = `label: Developer Guide +position: 2 +`; + writeFile(path.join(DEST_DOCS_DIR, "user", "_category_.yml"), userCategory); + writeFile(path.join(DEST_DOCS_DIR, "developer", "_category_.yml"), devCategory); +} + +function main() { + console.log(`Source: ${SRC_DOCS_DIR}`); + console.log(`Destination: ${DEST_DOCS_DIR}`); + console.log(`WebP conversion: ${CONVERT_WEBP ? "enabled" : "disabled"}`); + console.log(`Dry run: ${DRY_RUN}`); + console.log(""); + + // Process user guide + const userDir = path.join(SRC_DOCS_DIR, "user"); + if (fs.existsSync(userDir)) { + for (const file of fs.readdirSync(userDir).filter(f => f.endsWith(".md"))) { + processMarkdown( + path.join(userDir, file), + path.join(DEST_DOCS_DIR, "user", file), + "user", + ); + } + } + + // Process developer guide + const devDir = path.join(SRC_DOCS_DIR, "developer"); + if (fs.existsSync(devDir)) { + for (const file of fs.readdirSync(devDir).filter(f => f.endsWith(".md"))) { + processMarkdown( + path.join(devDir, file), + path.join(DEST_DOCS_DIR, "developer", file), + "developer", + ); + } + } + + // Create index and category files + createIndexPage(); + createCategoryFiles(); + + // Process images + processImages(); + + console.log("\nSync complete."); +} + +main(); diff --git a/scripts/validate-doc-links.js b/scripts/validate-doc-links.js new file mode 100644 index 000000000..dcd82c39f --- /dev/null +++ b/scripts/validate-doc-links.js @@ -0,0 +1,83 @@ +#!/usr/bin/env node +// scripts/validate-doc-links.js +// Validates internal cross-references and image paths in in-app documentation. +// Exit 0 = all valid, Exit 1 = broken links found. +// +// Usage: node scripts/validate-doc-links.js [docs-dir] + +"use strict"; + +const fs = require("fs"); +const path = require("path"); +const { discoverSlugs, forEachDocPage } = require("./lib/frontmatter"); + +const DOCS_DIR = path.resolve(process.argv[2] || "docs"); +const IMAGE_EXTS = new Set([".png", ".jpg", ".jpeg", ".gif", ".svg", ".webp"]); + +// Collect known page slugs from both sections +const knownPages = new Set([ + ...discoverSlugs(DOCS_DIR, "user"), + ...discoverSlugs(DOCS_DIR, "developer"), +]); + +console.log(`Validating links across ${knownPages.size} doc pages in ${DOCS_DIR}...`); + +let errors = 0; + +forEachDocPage(DOCS_DIR, (filePath, slug, section) => { + const lines = fs.readFileSync(filePath, "utf-8").split("\n"); + + lines.forEach((line, idx) => { + const lineNum = idx + 1; + + // Check markdown links (non-image) + let match; + const linkRe = /(? 0) { + console.log(`\nFAILED: ${errors} broken link(s) found.`); + process.exit(1); +} else { + console.log("PASSED: All internal links and images are valid."); + process.exit(0); +} diff --git a/settings.gradle.kts b/settings.gradle.kts index 6d37b6559..da7e1295a 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -104,6 +104,7 @@ include( ":feature:map", ":feature:node", ":feature:settings", + ":feature:docs", ":feature:firmware", ":feature:wifi-provision", ":desktopApp", diff --git a/specs/20260507-161858-app-docs-markdown/checklists/requirements.md b/specs/20260507-161858-app-docs-markdown/checklists/requirements.md index bdeedd356..f8a7b746c 100644 --- a/specs/20260507-161858-app-docs-markdown/checklists/requirements.md +++ b/specs/20260507-161858-app-docs-markdown/checklists/requirements.md @@ -19,6 +19,7 @@ - [x] Edge cases cover missing assets, unsupported AI environments, stale deep links, and degraded screenshot automation. - [x] The deep-link contract, keyword-index schema, and CI workflow contract are defined as separate artifacts. - [x] Search and AI fallback behavior are specified for unsupported targets and flavors. +- [x] Screenshot asset bundling and inline rendering via custom `ImageTransformer` are specified (FR-038). ## Android/KMP Adaptation Checks diff --git a/specs/20260507-161858-app-docs-markdown/plan.md b/specs/20260507-161858-app-docs-markdown/plan.md index 2abadbe85..370000a1d 100644 --- a/specs/20260507-161858-app-docs-markdown/plan.md +++ b/specs/20260507-161858-app-docs-markdown/plan.md @@ -104,6 +104,7 @@ specs/003-app-docs-markdown/ │ ├── ui/DocsBrowserScreen.kt │ ├── ui/DocsSearchBar.kt │ ├── ui/DocsPageRouteScreen.kt +│ ├── ui/ComposeResourceImageTransformer.kt │ ├── ui/ChirpyAssistantSheet.kt │ ├── navigation/DocsNavigation.kt │ ├── di/FeatureDocsModule.kt @@ -222,6 +223,54 @@ Possible internal task breakdown: - Keep the same content pipeline for both website and in-app docs. - Support Android WebView without forcing every target to use assets. +### Screenshot image adapter for Compose renderer (FR-038) + +The `DocsPageRouteScreen` on Desktop/iOS uses `com.mikepenz.markdown.m3.Markdown` for rendering. By default it uses `NoOpImageTransformerImpl`, which silently drops all `![alt](path)` image references. Two changes are needed to render screenshots inline: + +**1. Bundle screenshots into Compose resources** + +The `syncDocsToComposeResources` task must include `assets/screenshots/**/*.png` alongside `user/**/*.md` and `developer/**/*.md`. The `:screenshot-tests:copyDocsScreenshots` task must run first to populate `docs/screenshots/`, which is then synced as `assets/screenshots/` into compose resources. Task dependency: `syncDocsToComposeResources.dependsOn(":screenshot-tests:copyDocsScreenshots")`. + +**2. Custom `ImageTransformer` using `Res.getUri()` + Coil3** + +The CMP generated `Res` object provides two APIs: +- `suspend fun readBytes(path: String): ByteArray` — cannot be used in `@Composable` +- `fun getUri(path: String): String` — **synchronous**, returns a platform URI + +Since `ImageTransformer.transform(link: String)` is `@Composable` (not suspend), we CANNOT use `Res.readBytes()` directly. Instead, use `Res.getUri()` to resolve the local resource URI, then pass it to Coil3's `rememberAsyncImagePainter()`: + +```kotlin +// ComposeResourceImageTransformer.kt +class ComposeResourceImageTransformer : ImageTransformer { + @Composable + override fun transform(link: String): ImageData? { + if (link.startsWith("http://") || link.startsWith("https://")) return null + val resourcePath = "files/docs/$link" // e.g., "files/docs/assets/screenshots/foo.png" + val uri = Res.getUri(resourcePath) + val painter = rememberAsyncImagePainter( + model = ImageRequest.Builder(LocalPlatformContext.current) + .data(uri) + .size(coil3.size.Size.ORIGINAL) + .build() + ) + return ImageData(painter) + } +} +``` + +**Why Coil3 after all?** The `ImageTransformer.transform()` is `@Composable`, not `suspend`. `Res.readBytes()` is a suspend function and cannot be called in composition. `Res.getUri()` gives us a synchronous local URI that Coil3 can load asynchronously via `rememberAsyncImagePainter`. Since the project already has Coil 3.4.0 in the version catalog, this is the correct approach — it handles the composable→async bridge that CMP resources require. + +**Dependencies**: Add `libs.coil` to `feature/docs/build.gradle.kts` commonMain dependencies. + +Wire into the renderer in `DocsPageRouteScreen.kt`: +```kotlin +Markdown( + content = markdownText, + imageTransformer = ComposeResourceImageTransformer(), + modifier = ... +) +``` + ## Navigation Plan ### Route additions @@ -359,6 +408,9 @@ Update `feature/settings/.../SettingsNavigation.kt` so Help & Documentation appe 7. **Phase 6 – AI assistant**: Android Google flavor Gemini implementation + fallbacks. 8. **Phase 7 – CI automation**: deploy/release workflows, screenshot PR bot. 9. **Phase 8 – Polish**: accessibility, dark mode, edge cases, documentation cleanup. +10. **Phase 9 – Apple alignment**: per-page TOC icons, signal-meter/units-locale pages, staleness CI. +11. **Phase 10 – Docusaurus sync & content gaps**: meshtastic.org sync script + workflow, WebP optimization, translate page, developer measurement page. +12. **Phase 11 – Governance consolidation**: shared frontmatter library, filesystem-derived slugs, workflow merge, 3-consumer propagation model, preview & screenshot staleness advisories. ## Validation Matrix @@ -379,3 +431,7 @@ Update `feature/settings/.../SettingsNavigation.kt` so Help & Documentation appe - Gemini Nano assistant works on supported Android Google devices and gracefully falls back everywhere else. - CI enforces schema, size, and deployment correctness. - Documentation and assets remain under the configured bundle-size ceiling. +- Android docs are synced to meshtastic.org via automated workflow under `docs/software/android/`. +- A "Translate the App" user page and a developer measurement page exist. +- All docs CI checks are consolidated into a single `docs-governance.yml` workflow. +- Governance scripts share a common frontmatter library with filesystem-derived slug discovery. diff --git a/specs/20260507-161858-app-docs-markdown/spec.md b/specs/20260507-161858-app-docs-markdown/spec.md index c2fc11e39..e03946d8b 100644 --- a/specs/20260507-161858-app-docs-markdown/spec.md +++ b/specs/20260507-161858-app-docs-markdown/spec.md @@ -147,6 +147,20 @@ When documentation-relevant UI or workflow changes merge to `main`, GitHub Actio - **FR-035**: Chirpy branding MUST use a shared SVG or vector drawable sourced from the Meshtastic design system and bundled as a scalable asset that renders crisply across Android, Desktop, and iOS. - **FR-036**: Connection-state icon captures and inline docs illustrations MUST use `MeshtasticIcons` equivalents and Material 3 semantic colors so they remain legible in both light and dark themes without relying on ad-hoc color inversion. - **FR-037**: Lock and security icon captures using `MeshtasticIcons.Lock`, `MeshtasticIcons.LockOpen`, `MeshtasticIcons.KeyOff`, or their final equivalents MUST preserve portrait aspect ratio at the shared 44dp reference height and MUST avoid canvas squashing in generated docs assets. +- **FR-039**: A sync script and GitHub Actions workflow MUST exist to export Android in-app docs into the `meshtastic/meshtastic` Docusaurus site under `docs/software/android/`. The script MUST handle relative link resolution (sibling `.md` links, image paths) and produce Docusaurus-compatible frontmatter. The workflow MUST open a PR in `meshtastic/meshtastic` rather than pushing directly, matching the pattern established by Apple's `sync-apple-docs.yml`. +- **FR-040**: The docs site sync pipeline SHOULD convert screenshot PNGs to WebP format before publishing to the Docusaurus site. A `--convert-webp` flag or equivalent MUST be supported. Original PNGs remain canonical in-repo; WebP is a site-publishing optimization only. +- **FR-041**: A `docs/user/translate.md` page MUST explain how contributors can translate the Android app via Crowdin. The page MUST link to the Crowdin project, describe which resource files are translatable (composeResources strings, user guide markdown), and provide step-by-step contribution instructions. This is a contributor guide, not a runtime translation feature. +- **FR-042**: A `docs/developer/measurement.md` page MUST document the `MetricFormatter` API, locale-aware unit conversion patterns, and how to add new measurement types. This provides developer-facing guidance complementing the user-facing `units-and-locale.md`. +- **FR-043**: Documentation governance MUST enforce a 3-consumer propagation model: every doc page automatically flows to (1) the in-app docs browser via `syncDocsToComposeResources`, (2) the Jekyll/GitHub Pages site via `docs-deploy.yml`, and (3) the Docusaurus meshtastic.org site via `sync-android-docs.js`. CI MUST validate that every `docs/**/*.md` page slug is registered in `DocBundleLoader.kt` for in-app discovery. +- **FR-044**: Doc governance scripts MUST share a common frontmatter parsing library (`scripts/lib/frontmatter.js`) to avoid duplication across link validation, freshness checks, coverage checks, and sync scripts. Slug discovery MUST be filesystem-derived, not hardcoded. +- **FR-045**: All docs CI checks (staleness, link validation, coverage, freshness, registry validation) MUST be consolidated into a single governance workflow with separate jobs for staleness detection and quality gates. +- **FR-046**: The governance workflow MUST include an advisory preview-staleness job that detects UI composable changes (`feature/*/ui/`, `core/ui/`) without corresponding `*Previews.kt` updates. The check MUST be bypassable via a `skip-preview-check` label. +- **FR-047**: The governance workflow MUST include an advisory screenshot-reference-staleness job that detects `*Previews.kt` changes without updates to reference images in `screenshot-tests/src/screenshotTestDebug/reference/`. The advisory MUST include the `updateDebugScreenshotTest` command. +- **FR-048**: User Guide documentation MUST support a three-tier translation cascade: (1) **Crowdin bundled** — community-translated markdown shipped with the app via Crowdin `%android_code%` locale directories synced to CMP `files-{qualifier}/` resources; (2) **ML Kit runtime** — on-device translation via `DocTranslationService` on supported Android `google` flavor devices when no Crowdin translation exists; (3) **English fallback** — the default `files/docs/` content used when neither bundled nor runtime translation is available. The `fdroid` flavor, Desktop, and iOS MUST use a `NoOpDocTranslator` that skips ML Kit and falls back to English. Developer Guide pages remain English-only. The locale resolution chain MUST try region-qualified (`files-pt-rBR/`) then language-only (`files-pt/`) before English. +- **FR-049**: The `crowdin.yml` configuration MUST use the `%android_code%` placeholder for docs translation paths so that Crowdin outputs locale directories in CMP resource qualifier format (e.g., `pt-rBR`, `zh-rCN`) with zero format conversion needed at build or runtime. The `syncTranslatedDocsToComposeResources` Gradle task MUST copy translated docs into `composeResources/files-{locale}/docs/` without locale format transformation. +- **FR-050**: The Jekyll documentation site MUST support locale-qualified paths using Android resource qualifier format (`docs/pt-rBR/user/*.md`) with a `_data/locales.yml` registry of supported locales including native names and text direction (LTR/RTL). The site MUST include a language switcher component. +- **FR-051**: A `currentLocaleQualifier()` expect/actual function in `core:common` MUST return the device locale in CMP resource qualifier format (e.g., `"pt-rBR"` or `"fr"`). This function is used by `DocBundleLoader` to resolve locale-qualified resource paths at runtime. +- **FR-038**: The Compose Multiplatform markdown renderer (`multiplatform-markdown-renderer-m3`) used by `DocsPageRouteScreen` on non-WebView targets MUST be configured with a custom `ImageTransformer` that resolves relative image paths (e.g., `assets/screenshots/*.png`) to bundled Compose resource URIs via `Res.getUri()` and loads them asynchronously using Coil 3 (`rememberAsyncImagePainter`). The default `NoOpImageTransformerImpl` MUST NOT be used for docs rendering. The `syncDocsToComposeResources` task MUST include screenshot assets alongside markdown files so that images are available at runtime. The `copyDocsScreenshots` task from `screenshot-tests/` MUST be wired as a dependency of `syncDocsToComposeResources` to ensure generated screenshots are available before resource bundling. ### Key Entities @@ -174,6 +188,17 @@ When documentation-relevant UI or workflow changes merge to `main`, GitHub Actio - **SC-012**: Icon/state screenshot coverage exists for connection state, security/lock state, node status, and at least one docs-browser rendering case. - **SC-013**: The Chirpy assistant appears as a chat interface with a bundled vector asset and preserves per-session message history while the browser is open. - **SC-014**: Connection and security icon assets remain legible in light and dark modes and preserve expected aspect ratio in generated docs output. +- **SC-015**: Android docs are published on meshtastic.org under `docs/software/android/` and stay current via automated sync workflow. +- **SC-016**: A "Translate the App" page exists in the User Guide and links to the Crowdin project with step-by-step contribution instructions. +- **SC-017**: A developer measurement/locale page exists documenting `MetricFormatter` internals and locale-aware patterns. +- **SC-018**: All docs CI checks (staleness, links, coverage, freshness, registry) run in a single consolidated `docs-governance.yml` workflow with no duplicate validation steps across workflows. +- **SC-019**: Sync script slug discovery is filesystem-derived — adding a new `.md` file under `docs/` requires no hardcoded string updates in scripts. +- **SC-020**: PRs that modify UI composables without updating previews receive an advisory PR comment with a checklist. The check is bypassable via `skip-preview-check` label. +- **SC-021**: PRs that modify previews without updating screenshot reference images receive an advisory PR comment with the regeneration command. +- **SC-022**: The `crowdin.yml` docs entries use `%android_code%` placeholders and the sync task copies translations into CMP resources with zero locale format conversion. +- **SC-023**: `DocBundleLoader` resolves locale-qualified docs resources using a region → language → English fallback chain driven by `currentLocaleQualifier()`. +- **SC-024**: On Google-flavor Android devices, ML Kit runtime translation is available as a fallback when no Crowdin bundled translation exists for the user's locale. +- **SC-025**: The Jekyll site supports 38 locale paths with a language switcher, and all locale directories use Android resource qualifier format (`pt-rBR`, not `pt-BR`). ## Clarifications @@ -202,3 +227,70 @@ When documentation-relevant UI or workflow changes merge to `main`, GitHub Actio - Gemini Nano availability is gated at runtime and may vary by hardware, region, downloaded models, and Google/AICore rollout. Unsupported environments must gracefully fall back to keyword search. - The `google` flavor can host AI bindings; `fdroid` must remain functional without requiring proprietary AI integrations. - Chirpy branding will be sourced from the Meshtastic design repository and packaged as a vector-compatible asset for all KMP targets. + +## Apple Alignment (Cross-Platform Parity) + +### Session 2026-05-12 + +Gap analysis against `meshtastic-apple` identified these alignment items for Android: + +**Implemented:** +1. **Per-page TOC icons** — Apple uses SF Symbols per `DocPage`; Android now maps `iconId` to `MeshtasticIcons` via `DocPageIconResolver.kt`. +2. **Signal meter user guide page** — `docs/user/signal-meter.md` explains RSSI vs SNR, bar-level criteria, and LoRa-specific signal concepts. Adapted from Apple equivalent for Android signal surfaces. +3. **Units & locale user guide page** — `docs/user/units-and-locale.md` explains automatic metric/imperial formatting via `MetricFormatter`. Adapted from Apple equivalent for Android/KMP stack. +4. **Docs staleness CI workflow** — `.github/workflows/docs-staleness.yml` posts advisory PR comments when user-facing UI files change without corresponding `docs/` updates. Adapted from Apple's workflow for KMP feature/core paths. + +**Skipped (platform-specific to Apple):** +- `docs/user/watch.md` — watchOS-only +- `docs/user/carplay.md` — iOS CarPlay only +- `docs/developer/carplay.md` — iOS CarPlay architecture only +- `docs/developer/swiftdata.md` — Android has `persistence.md` (Room KMP) +- `docs/developer/deep-links.md` — Android has `navigation-and-deep-links.md` +- TipKit contextual tips — iOS TipKit has no direct KMP equivalent; contextual help is deferred + +**Corrected (previously skipped, now implemented or planned):** +- `docs/user/translate.md` — Previously marked "iOS Translate framework only" but is actually a **Crowdin contribution guide** applicable to all platforms. Android equivalent planned as FR-041. +- `docs/developer/measurement.md` — Previously marked "covered by user page" but Apple version provides developer-facing API guidance. Android equivalent planned as FR-042. + +### Session 2026-05-13 + +Gap analysis against PR [meshtastic/meshtastic#2393](https://github.com/meshtastic/meshtastic/pull/2393) (Apple docs sync to Docusaurus) and `meshtastic-apple` `specs/003-app-docs-markdown/` identified these additional alignment items: + +**Planned (Phase 10):** +1. **Docusaurus sync script + workflow** — Apple has `sync-apple-docs.js` + `sync-apple-docs.yml` syncing in-app docs to meshtastic.org under `docs/software/apple/`. Android needs an equivalent `sync-android-docs.js` publishing to `docs/software/android/` (FR-039). +2. **WebP image optimization** — Apple converts PNGs to WebP for the docs site via `--convert-webp` flag. Android should add the same optimization (FR-040). +3. **Translate the App page** — `docs/user/translate.md` contributor guide for Crowdin (FR-041). +4. **Developer measurement page** — `docs/developer/measurement.md` for MetricFormatter API docs (FR-042). + +**Confirmed non-goals:** +- `docs/user/watch.md`, `docs/user/carplay.md`, `docs/developer/carplay.md` — remain Apple-only. + +**Implemented (Phase 11 — Governance & Consolidation):** + +Audit of docs infrastructure identified duplication across 4 JS scripts, 3 CI workflows, and hardcoded slug registries. Consolidation implemented: + +1. **Shared frontmatter library** — `scripts/lib/frontmatter.js` provides `parseFrontmatter()`, `discoverSlugs()`, and `forEachDocPage()` used by all governance scripts. Eliminated 4 independent frontmatter parsers (FR-044). +2. **Filesystem-derived slugs** — `sync-android-docs.js` now auto-discovers page slugs from `docs/user/` and `docs/developer/` instead of maintaining hardcoded `KNOWN_*_SLUGS` sets (26 strings eliminated). The slug registry CI check is no longer needed (FR-044). +3. **Workflow consolidation** — `docs-staleness.yml` merged into `docs-governance.yml` as a parallel `staleness` job alongside the existing `validate` job. Duplicate link validation removed from `docs-deploy.yml` (FR-045). +4. **3-consumer propagation** — Constitution principle VI updated to explicitly name in-app, Jekyll, and Docusaurus consumers with propagation rules. Staleness check comment includes new-page checklist (FR-043). +5. **Duplicate script removal** — `sync-android-docs.js` copy removed from meshtastic/meshtastic PR #2405 since the workflow runs from the Android repo clone. + +**Implemented (Phase 11 continued — Preview & Screenshot Governance):** + +Extended governance to cover preview composables and screenshot testing: + +1. **Preview staleness advisory** — `preview-staleness` job detects UI composable changes without `*Previews.kt` updates. Posts advisory PR comment with checklist. Bypassable via `skip-preview-check` label (FR-046). +2. **Screenshot reference staleness advisory** — Same job detects preview changes without reference image updates. Posts advisory with `updateDebugScreenshotTest` command (FR-047). +3. **Workflow renamed** — `Docs Governance` → `UI & Docs Governance` to reflect expanded scope. +4. **Contributing checklist** — `docs/developer.md` updated with preview/screenshot maintenance guidance. + +### Session 2026-05-18 + +Translation cascade and locale pipeline implementation: + +1. **Scope change** — Translating User Guide docs is now in scope. Crowdin provides community translations bundled with the app; ML Kit provides runtime fallback on Google flavor. Developer Guide remains English-only. +2. **Zero-conversion locale pipeline** — Crowdin `%android_code%` outputs locale directories in CMP resource qualifier format (`pt-rBR`, `fr`). The sync task just prepends `files-` — no format conversion at build or runtime. +3. **Locale resolution chain** — `DocBundleLoader.localeQualifiers()` tries region-qualified (`files-pt-rBR/`) → language-only (`files-pt/`) → English default (`files/`). +4. **Platform actuals** — `currentLocaleQualifier()` expect/actual in `core:common` returns CMP qualifier format on all platforms. +5. **ML Kit translation** — `DocTranslationService` interface with `MlKitDocTranslator` (google), `NoOpDocTranslator` (fdroid/desktop/iOS). `DocTranslationCache` provides file-backed caching. `MarkdownTranslationSegmenter` splits docs into translatable segments preserving markdown structure. +6. **Web i18n** — Jekyll `_config.yml` and `_data/locales.yml` support 38 locales with Android qualifier paths. Language switcher included. diff --git a/specs/20260507-161858-app-docs-markdown/tasks.md b/specs/20260507-161858-app-docs-markdown/tasks.md index 07f628046..f566024af 100644 --- a/specs/20260507-161858-app-docs-markdown/tasks.md +++ b/specs/20260507-161858-app-docs-markdown/tasks.md @@ -6,7 +6,7 @@ description: "Task list for feature: App Documentation (Android/KMP)" **Input**: Design documents from `specs/003-app-docs-markdown/` **Prerequisites**: `spec.md`, `plan.md`, `research.md`, `data-model.md`, `contracts/`, `quickstart.md` -**Status**: Not Started +**Status**: Complete (Phases 0–14) ## Format: `[ID] [P?] [Story] Description` @@ -20,8 +20,8 @@ description: "Task list for feature: App Documentation (Android/KMP)" **Purpose**: Review Meshtastic design standards before shipping any new UI for docs or the Chirpy assistant. -- [ ] T000 **[UI-GATE]** Review `.skills/design-standards/SKILL.md` and upstream Meshtastic design standards; record constraints for `feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/ui/DocsBrowserScreen.kt`, `ChirpyAssistantSheet.kt`, and screenshot styling. -- [ ] T001 **[UI-GATE]** Confirm icon choices in `core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/icon/` for help/search/info/security states and choose MeshtasticIcons equivalents for docs UI and reference tables. +- [X] T000 **[UI-GATE]** Review `.skills/design-standards/SKILL.md` and upstream Meshtastic design standards; record constraints for `feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/ui/DocsBrowserScreen.kt`, `ChirpyAssistantSheet.kt`, and screenshot styling. +- [X] T001 **[UI-GATE]** Confirm icon choices in `core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/icon/` for help/search/info/security states and choose MeshtasticIcons equivalents for docs UI and reference tables. **Checkpoint**: Design constraints are documented and ready to guide implementation. @@ -32,35 +32,35 @@ description: "Task list for feature: App Documentation (Android/KMP)" **Purpose**: Author the docs corpus that both the website and in-app browser will consume. ### User Guide pages -- [ ] T010 [P] [US1] Create `docs/user/onboarding.md` covering first launch, intro flow, permissions, and initial setup using content from `feature/intro/src/androidMain/kotlin/org/meshtastic/feature/intro/WelcomeScreen.kt`, `LocationScreen.kt`, and `NotificationsScreen.kt`. -- [ ] T011 [P] [US1] Create `docs/user/connections.md` covering Bluetooth, USB, and TCP connection flows using `feature/intro/.../BluetoothScreen.kt` and `feature/connections/**` as authoritative sources. -- [ ] T012 [P] [US1] Create `docs/user/messages-and-channels.md` covering conversations, channel security, direct messages, and message state using `feature/messaging/src/commonMain/kotlin/org/meshtastic/feature/messaging/Message.kt` and `component/MessageScreenComponents.kt`. -- [ ] T013 [P] [US1] Create `docs/user/nodes.md` covering node list status, roles, badges, and quick actions using `feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/list/NodeListScreen.kt`. -- [ ] T014 [P] [US1] Create `docs/user/node-metrics.md` covering node detail, device metrics, environment metrics, signal, power, traceroute, and logs using `feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/detail/NodeDetailScreens.kt` and `metrics/*`. -- [ ] T015 [P] [US1] Create `docs/user/map-and-waypoints.md` covering maps, waypoints, and map-specific actions using `feature/map/src/androidMain/kotlin/org/meshtastic/feature/map/MapScreen.kt`. -- [ ] T016 [P] [US1] Create `docs/user/settings-radio-user.md` covering radio, LoRa, display, and user settings using `feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/DeviceConfigurationScreen.kt`. -- [ ] T017 [P] [US1] Create `docs/user/settings-module-admin.md` covering module, administration, and advanced settings using `feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/ModuleConfigurationScreen.kt` and `AdministrationScreen.kt`. -- [ ] T018 [P] [US1] Create `docs/user/telemetry-and-sensors.md` covering telemetry surfaces and sensor interpretation using `feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/metrics/EnvironmentMetrics.kt`, `PowerMetrics.kt`, and related metric screens. -- [ ] T019 [P] [US1] Create `docs/user/tak.md` covering TAK integration and setup using `feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/TAKConfigItemList.kt` and related settings screens. -- [ ] T020 [P] [US1] Create `docs/user/mqtt.md` covering MQTT setup and usage using `feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/MQTTConfigItemList.kt` and messaging references. -- [ ] T021 [P] [US1] Create `docs/user/discovery.md` covering local mesh discovery and node exploration based on current discovery-related UI/state and app navigation flows. **Note**: Feature 001 (Local Mesh Discovery) is Not Started — author this page as a concept/goals overview initially and revise with screenshots and detailed UI guidance once 001 reaches Phase 5+ UI milestones. -- [ ] T022 [P] [US1] Create `docs/user/firmware.md` covering update flows, warnings, and recovery using `feature/firmware/src/commonMain/kotlin/org/meshtastic/feature/firmware/FirmwareUpdateScreen.kt`. -- [ ] T023 [P] [US1] Create `docs/user/desktop.md` covering Desktop host usage, transport differences, and parity notes using `desktop/src/main/kotlin/org/meshtastic/desktop/` and shared navigation patterns. +- [X] T010 [P] [US1] Create `docs/user/onboarding.md` covering first launch, intro flow, permissions, and initial setup using content from `feature/intro/src/androidMain/kotlin/org/meshtastic/feature/intro/WelcomeScreen.kt`, `LocationScreen.kt`, and `NotificationsScreen.kt`. +- [X] T011 [P] [US1] Create `docs/user/connections.md` covering Bluetooth, USB, and TCP connection flows using `feature/intro/.../BluetoothScreen.kt` and `feature/connections/**` as authoritative sources. +- [X] T012 [P] [US1] Create `docs/user/messages-and-channels.md` covering conversations, channel security, direct messages, and message state using `feature/messaging/src/commonMain/kotlin/org/meshtastic/feature/messaging/Message.kt` and `component/MessageScreenComponents.kt`. +- [X] T013 [P] [US1] Create `docs/user/nodes.md` covering node list status, roles, badges, and quick actions using `feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/list/NodeListScreen.kt`. +- [X] T014 [P] [US1] Create `docs/user/node-metrics.md` covering node detail, device metrics, environment metrics, signal, power, traceroute, and logs using `feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/detail/NodeDetailScreens.kt` and `metrics/*`. +- [X] T015 [P] [US1] Create `docs/user/map-and-waypoints.md` covering maps, waypoints, and map-specific actions using `feature/map/src/androidMain/kotlin/org/meshtastic/feature/map/MapScreen.kt`. +- [X] T016 [P] [US1] Create `docs/user/settings-radio-user.md` covering radio, LoRa, display, and user settings using `feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/DeviceConfigurationScreen.kt`. +- [X] T017 [P] [US1] Create `docs/user/settings-module-admin.md` covering module, administration, and advanced settings using `feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/ModuleConfigurationScreen.kt` and `AdministrationScreen.kt`. +- [X] T018 [P] [US1] Create `docs/user/telemetry-and-sensors.md` covering telemetry surfaces and sensor interpretation using `feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/metrics/EnvironmentMetrics.kt`, `PowerMetrics.kt`, and related metric screens. +- [X] T019 [P] [US1] Create `docs/user/tak.md` covering TAK integration and setup using `feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/TAKConfigItemList.kt` and related settings screens. +- [X] T020 [P] [US1] Create `docs/user/mqtt.md` covering MQTT setup and usage using `feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/MQTTConfigItemList.kt` and messaging references. +- [X] T021 [P] [US1] Create `docs/user/discovery.md` covering local mesh discovery and node exploration based on current discovery-related UI/state and app navigation flows. **Note**: Feature 001 (Local Mesh Discovery) is Not Started — author this page as a concept/goals overview initially and revise with screenshots and detailed UI guidance once 001 reaches Phase 5+ UI milestones. +- [X] T022 [P] [US1] Create `docs/user/firmware.md` covering update flows, warnings, and recovery using `feature/firmware/src/commonMain/kotlin/org/meshtastic/feature/firmware/FirmwareUpdateScreen.kt`. +- [X] T023 [P] [US1] Create `docs/user/desktop.md` covering Desktop host usage, transport differences, and parity notes using `desktop/src/main/kotlin/org/meshtastic/desktop/` and shared navigation patterns. ### Developer Guide pages -- [ ] T024 [P] [US4] Create `docs/developer/architecture.md` describing layer boundaries (`app`, `desktop`, `feature/*`, `core/*`) and shared KMP responsibilities. -- [ ] T025 [P] [US4] Create `docs/developer/codebase.md` documenting repository layout, namespacing, and build-logic conventions. -- [ ] T026 [P] [US4] Create `docs/developer/adding-a-feature-module.md` documenting `meshtastic.kmp.feature`, source sets, DI, resources, and testing expectations. -- [ ] T027 [P] [US4] Create `docs/developer/navigation-and-deep-links.md` documenting `Routes.kt`, `DeepLinkRouter.kt`, and Navigation 3 graph registration patterns. -- [ ] T028 [P] [US4] Create `docs/developer/transport.md` documenting BLE, TCP, Serial/USB, and host-specific abstractions. -- [ ] T029 [P] [US4] Create `docs/developer/persistence.md` documenting Room KMP, DataStore/core:prefs, and where docs intentionally do **not** use persistence. -- [ ] T030 [P] [US4] Create `docs/developer/testing.md` documenting KMP test strategy, host tests, and planned screenshot automation. -- [ ] T031 [P] [US4] Create `docs/developer/contributing.md` documenting branch naming, verification, and PR hygiene. +- [X] T024 [P] [US4] Create `docs/developer/architecture.md` describing layer boundaries (`app`, `desktop`, `feature/*`, `core/*`) and shared KMP responsibilities. +- [X] T025 [P] [US4] Create `docs/developer/codebase.md` documenting repository layout, namespacing, and build-logic conventions. +- [X] T026 [P] [US4] Create `docs/developer/adding-a-feature-module.md` documenting `meshtastic.kmp.feature`, source sets, DI, resources, and testing expectations. +- [X] T027 [P] [US4] Create `docs/developer/navigation-and-deep-links.md` documenting `Routes.kt`, `DeepLinkRouter.kt`, and Navigation 3 graph registration patterns. +- [X] T028 [P] [US4] Create `docs/developer/transport.md` documenting BLE, TCP, Serial/USB, and host-specific abstractions. +- [X] T029 [P] [US4] Create `docs/developer/persistence.md` documenting Room KMP, DataStore/core:prefs, and where docs intentionally do **not** use persistence. +- [X] T030 [P] [US4] Create `docs/developer/testing.md` documenting KMP test strategy, host tests, and planned screenshot automation. +- [X] T031 [P] [US4] Create `docs/developer/contributing.md` documenting branch naming, verification, and PR hygiene. ### Content-supporting assets -- [ ] T032 [P] [US1] Create or inventory `docs/assets/screenshots/` references and map each page to required PNG or SVG assets. -- [ ] T033 [P] [US1] Extract onboarding tips, warnings, and disclaimers from `feature/intro/**`, `feature/firmware/**`, and relevant feature UIs into highlighted callout sections inside the authored markdown. -- [ ] T034 [US1] Review all markdown for reference-table compliance where 2+ icon/state captures appear together. +- [X] T032 [P] [US1] Create or inventory `docs/assets/screenshots/` references and map each page to required PNG or SVG assets. +- [X] T033 [P] [US1] Extract onboarding tips, warnings, and disclaimers from `feature/intro/**`, `feature/firmware/**`, and relevant feature UIs into highlighted callout sections inside the authored markdown. +- [X] T034 [US1] Review all markdown for reference-table compliance where 2+ icon/state captures appear together. **Checkpoint**: Complete markdown corpus exists with planned screenshots and callouts. @@ -70,11 +70,11 @@ description: "Task list for feature: App Documentation (Android/KMP)" **Purpose**: Make the authored markdown browsable on the web with versioning. -- [ ] T040 [P] [US1] Create `docs/_config.yml` with `just-the-docs`, sidebar search, and the required collection/navigation settings. -- [ ] T041 [P] [US1] Create `docs/index.md` redirect behavior for `/latest/` and beta handling. -- [ ] T042 [P] [US1] Create `docs/_data/versions.yml` with an initial `beta` entry and stable release entry schema. -- [ ] T043 [P] [US1] Create any shared include/layout files needed for version selector, beta banner, and consistent screenshot styling. -- [ ] T044 [US1] Validate local Jekyll build output from the authored markdown and confirm the navigation hierarchy matches the spec. +- [X] T040 [P] [US1] Create `docs/_config.yml` with `just-the-docs`, sidebar search, and the required collection/navigation settings. +- [X] T041 [P] [US1] Create `docs/index.md` redirect behavior for `/latest/` and beta handling. +- [X] T042 [P] [US1] Create `docs/_data/versions.yml` with an initial `beta` entry and stable release entry schema. +- [X] T043 [P] [US1] Create any shared include/layout files needed for version selector, beta banner, and consistent screenshot styling. +- [X] T044 [US1] Validate local Jekyll build output from the authored markdown and confirm the navigation hierarchy matches the spec. **Checkpoint**: Local website build is navigable and version-ready. @@ -84,17 +84,19 @@ description: "Task list for feature: App Documentation (Android/KMP)" **Purpose**: Implement Gradle-native docs generation suitable for KMP. -- [ ] T050 [P] [US1] Create `feature/docs/build.gradle.kts` using `meshtastic.kmp.feature` and dependencies for `core:common`, `core:navigation`, `core:resources`, `core:ui`, `core:di`, and existing markdown renderer libraries. -- [ ] T051 [P] [US1] Add `:feature:docs` to `settings.gradle.kts`. -- [ ] T052 [P] [US1] Add docs-generation support in `build-logic/convention/src/main/kotlin/org/meshtastic/buildlogic/DocsTasks.kt` (or equivalent) with lazy task registration. -- [ ] T053 [P] [US1] Implement frontmatter parsing, nav-order extraction, and markdown normalization in build logic or `feature/docs` build task code. -- [ ] T054 [P] [US1] Implement HTML rendering via `flexmark-java` (or `commonmark-java` fallback) in the docs generation task. -- [ ] T055 [P] [US1] Implement callout and banner post-processing, shared CSS injection, and `data-page` emission for generated HTML. -- [ ] T056 [P] [US1] Generate `index.json` matching `specs/003-app-docs-markdown/contracts/keyword-index-schema.json`. -- [ ] T057 [P] [US1] Wire generated output into `feature/docs/build/generated/docs/common/` as a Gradle resource source directory. -- [ ] T058 [P] [US1] Add Android asset mirroring if required for WebView file loading under `feature/docs/build/generated/docs/androidAssets/`. -- [ ] T059 [P] [US1] Enforce bundle-size warnings/failures and missing-asset validation in `validateDocsBundle`. -- [ ] T060 [US1] Add aggregate root tasks (`generateDocsBundle`, `validateDocsBundle`, `publishDocsSite`) and document their usage. +- [X] T050 [P] [US1] Create `feature/docs/build.gradle.kts` using `meshtastic.kmp.feature` and dependencies for `core:common`, `core:navigation`, `core:resources`, `core:ui`, `core:di`, and existing markdown renderer libraries. +- [X] T051 [P] [US1] Add `:feature:docs` to `settings.gradle.kts`. +- [X] T052 [P] [US1] Add docs-generation support in `build-logic/convention/src/main/kotlin/org/meshtastic/buildlogic/DocsTasks.kt` (or equivalent) with lazy task registration. +- [X] T053 [P] [US1] Implement frontmatter parsing, nav-order extraction, and markdown normalization in build logic or `feature/docs` build task code. +- [X] T054 [P] [US1] Implement HTML rendering via `flexmark-java` (or `commonmark-java` fallback) in the docs generation task. +- [X] T055 [P] [US1] Implement callout and banner post-processing, shared CSS injection, and `data-page` emission for generated HTML. +- [X] T056 [P] [US1] Generate `index.json` matching `specs/003-app-docs-markdown/contracts/keyword-index-schema.json`. +- [X] T057 [P] [US1] Wire generated output into `feature/docs/build/generated/docs/common/` as a Gradle resource source directory. +- [X] T058 [P] [US1] Add Android asset mirroring if required for WebView file loading under `feature/docs/build/generated/docs/androidAssets/`. +- [X] T059 [P] [US1] Enforce bundle-size warnings/failures and missing-asset validation in `validateDocsBundle`. +- [X] T060 [US1] Add aggregate root tasks (`generateDocsBundle`, `validateDocsBundle`, `publishDocsSite`) and document their usage. + - [X] T061 [P] [US1] [FR-038] Update `syncDocsToComposeResources` in `feature/docs/build.gradle.kts` to include `assets/screenshots/**/*.png` alongside markdown files, and add a task dependency on `:screenshot-tests:copyDocsScreenshots` to ensure generated screenshots are populated before sync. +- [X] T062 [P] [US1] [FR-038] Rewrite or restructure markdown image paths during sync so `assets/screenshots/` references resolve to the compose resource file structure expected by the custom `ImageTransformer` at runtime. **Checkpoint**: Gradle can generate the docs bundle and website artifact from markdown. @@ -104,19 +106,22 @@ description: "Task list for feature: App Documentation (Android/KMP)" **Purpose**: Ship the offline docs browser inside Settings. -- [ ] T070 [P] [US2] Create `feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/model/DocModels.kt` implementing the entities from `data-model.md`. -- [ ] T071 [P] [US2] Create `feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/data/DocBundleLoader.kt` to load packaged docs metadata and page content. -- [ ] T072 [P] [US2] Create `feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/ui/DocsBrowserScreen.kt` with grouped TOC, search entry point, and loading/empty states. -- [ ] T073 [P] [US2] Create `feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/ui/DocsPageRouteScreen.kt` to route page IDs to renderer surfaces. -- [ ] T074 [P] [US2] Create Android renderer `feature/docs/src/androidMain/kotlin/org/meshtastic/feature/docs/ui/DocHtmlView.android.kt` using `AndroidView` + `WebView`. -- [ ] T075 [P] [US2] Create Desktop/iOS page renderers in `src/jvmMain` and `src/iosMain` using Compose markdown or embedded browser abstraction. -- [ ] T076 [P] [US2] Create `feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/navigation/DocsNavigation.kt` with typed navigation entries. -- [ ] T077 [P] [US2] Add `SettingsRoute.HelpDocs` and `SettingsRoute.HelpDocPage` to `core/navigation/src/commonMain/kotlin/org/meshtastic/core/navigation/Routes.kt`. -- [ ] T078 [P] [US2] Update `core/navigation/src/commonMain/kotlin/org/meshtastic/core/navigation/DeepLinkRouter.kt` for `help-docs` (canonical) / `helpDocs` (compat alias) routing. -- [ ] T079 [P] [US2] Update `feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/navigation/SettingsNavigation.kt` to add the Help & Documentation row and register docs destinations. -- [ ] T080 [P] [US2] Create `feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/di/FeatureDocsModule.kt`. -- [ ] T081 [P] [US2] Include `FeatureDocsModule` in `app/src/main/kotlin/org/meshtastic/app/di/AppKoinModule.kt` and `desktop/src/main/kotlin/org/meshtastic/desktop/di/DesktopKoinModule.kt`. -- [ ] T082 [US2] Add shared/unit tests for bundle loading, page ordering, and route serialization under `feature/docs/src/commonTest/kotlin/org/meshtastic/feature/docs/`. +- [X] T070 [P] [US2] Create `feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/model/DocModels.kt` implementing the entities from `data-model.md`. +- [X] T071 [P] [US2] Create `feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/data/DocBundleLoader.kt` to load packaged docs metadata and page content. +- [X] T072 [P] [US2] Create `feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/ui/DocsBrowserScreen.kt` with grouped TOC, search entry point, and loading/empty states. +- [X] T073 [P] [US2] Create `feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/ui/DocsPageRouteScreen.kt` to route page IDs to renderer surfaces. +- [X] T074 [P] [US2] Create Android renderer `feature/docs/src/androidMain/kotlin/org/meshtastic/feature/docs/ui/DocHtmlView.android.kt` using `AndroidView` + `WebView`. +- [X] T075 [P] [US2] Create Desktop/iOS page renderers in `src/jvmMain` and `src/iosMain` using Compose markdown or embedded browser abstraction. +- [X] T076 [P] [US2] Create `feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/navigation/DocsNavigation.kt` with typed navigation entries. +- [X] T077 [P] [US2] Add `SettingsRoute.HelpDocs` and `SettingsRoute.HelpDocPage` to `core/navigation/src/commonMain/kotlin/org/meshtastic/core/navigation/Routes.kt`. +- [X] T078 [P] [US2] Update `core/navigation/src/commonMain/kotlin/org/meshtastic/core/navigation/DeepLinkRouter.kt` for `help-docs` (canonical) / `helpDocs` (compat alias) routing. +- [X] T079 [P] [US2] Update `feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/navigation/SettingsNavigation.kt` to add the Help & Documentation row and register docs destinations. +- [X] T080 [P] [US2] Create `feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/di/FeatureDocsModule.kt`. +- [X] T081 [P] [US2] Include `FeatureDocsModule` in `app/src/main/kotlin/org/meshtastic/app/di/AppKoinModule.kt` and `desktop/src/main/kotlin/org/meshtastic/desktop/di/DesktopKoinModule.kt`. +- [X] T082 [US2] Add shared/unit tests for bundle loading, page ordering, and route serialization under `feature/docs/src/commonTest/kotlin/org/meshtastic/feature/docs/`. +- [X] T083 [P] [US2] [FR-038] Create `feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/ui/ComposeResourceImageTransformer.kt` implementing `ImageTransformer` from mikepenz markdown renderer. Must use `Res.getUri("files/docs/$link")` (synchronous) to resolve local resource URIs, then `rememberAsyncImagePainter()` from Coil 3 to load the image composably. Must return `null` for external `http://`/`https://` URLs. Add `libs.coil` dependency to `feature/docs/build.gradle.kts` commonMain. +- [X] T084 [P] [US2] [FR-038] Update `DocsPageRouteScreen.kt` to pass `ComposeResourceImageTransformer()` as the `imageTransformer` parameter to the `Markdown()` composable instead of using the default `NoOpImageTransformerImpl`. +- [X] T085 [US2] [FR-038] Verify inline screenshot rendering end-to-end: run `copyDocsScreenshots`, `syncDocsToComposeResources`, then launch the docs browser on Desktop and confirm images render inline on a page with `![alt](...)` references. **Checkpoint**: Help & Documentation opens inside Settings and reads bundled content offline. @@ -126,12 +131,12 @@ description: "Task list for feature: App Documentation (Android/KMP)" **Purpose**: Make the docs corpus searchable on all targets. -- [ ] T090 [P] [US2] Create `feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/data/KeywordSearchEngine.kt` using `KeywordIndexEntry`. -- [ ] T091 [P] [US2] Add alias normalization and title-first ranking logic. -- [ ] T092 [P] [US2] Create `feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/ui/DocsSearchBar.kt` and wire it into `DocsBrowserScreen.kt`. -- [ ] T093 [P] [US2] Add section-aware search results and page suggestions for missing page/deep-link cases. -- [ ] T094 [P] [US2] Add tests for ranking, aliases, and tie-breaking in `KeywordSearchEngineTest.kt`. -- [ ] T095 [US2] Ensure keyword search is the user-visible fallback on unsupported AI targets. +- [X] T090 [P] [US2] Create `feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/data/KeywordSearchEngine.kt` using `KeywordIndexEntry`. +- [X] T091 [P] [US2] Add alias normalization and title-first ranking logic. +- [X] T092 [P] [US2] Create `feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/ui/DocsSearchBar.kt` and wire it into `DocsBrowserScreen.kt`. +- [X] T093 [P] [US2] Add section-aware search results and page suggestions for missing page/deep-link cases. +- [X] T094 [P] [US2] Add tests for ranking, aliases, and tie-breaking in `KeywordSearchEngineTest.kt`. +- [X] T095 [US2] Ensure keyword search is the user-visible fallback on unsupported AI targets. **Checkpoint**: Search works without AI on every target. @@ -141,17 +146,17 @@ description: "Task list for feature: App Documentation (Android/KMP)" **Purpose**: Add an Android-only on-device assistant without breaking KMP or `fdroid`. -- [ ] T100 [P] [US3] Create shared AI contracts in `feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/ai/AIDocAssistant.kt` and result/state models. -- [ ] T101 [P] [US3] Create `feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/ui/ChirpyAssistantSheet.kt` with chat UI, pinned input, session history, and source-page chips. -- [ ] T102 [P] [US3] Add keyword-retrieval + token-budget helper logic in shared code. -- [ ] T103 [P] [US3] Implement Google-flavor Android binding under `app/src/google/kotlin/org/meshtastic/app/docs/GoogleDocsAiModule.kt` (or equivalent) to call Gemini Nano via Google AI Edge SDK. -- [ ] T104 [P] [US3] Bind a no-op or keyword-only fallback implementation in `app/src/fdroid/kotlin/org/meshtastic/app/di/FlavorModule.kt`. -- [ ] T105 [P] [US3] Bind a Desktop fallback implementation from `desktop/src/main/kotlin/org/meshtastic/desktop/di/DesktopKoinModule.kt`. -- [ ] T105b [P] [US3] Bind an iOS fallback implementation (keyword-search-only, sharing the Desktop fallback pattern) in the iOS Koin module or via a shared non-Android default binding. -- [ ] T106 [P] [US3] Add runtime capability checks for Android API level, flavor, model availability, and busy/quota states. -- [ ] T107 [P] [US3] Surface assistant fallback states cleanly in the shared UI and hide the input entirely when unsupported. -- [ ] T108 [P] [US3] Add tests covering token budget trimming, unsupported platform behavior, and fallback search suggestions. -- [ ] T109 [US3] Verify the Chirpy vector asset is bundled and rendered correctly across targets. +- [X] T100 [P] [US3] Create shared AI contracts in `feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/ai/AIDocAssistant.kt` and result/state models. +- [X] T101 [P] [US3] Create `feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/ui/ChirpyAssistantSheet.kt` with chat UI, pinned input, session history, and source-page chips. +- [X] T102 [P] [US3] Add keyword-retrieval + token-budget helper logic in shared code. +- [X] T103 [P] [US3] Implement Google-flavor Android binding under `app/src/google/kotlin/org/meshtastic/app/docs/GoogleDocsAiModule.kt` (or equivalent) to call Gemini Nano via Google AI Edge SDK. +- [X] T104 [P] [US3] Bind a no-op or keyword-only fallback implementation in `app/src/fdroid/kotlin/org/meshtastic/app/di/FlavorModule.kt`. +- [X] T105 [P] [US3] Bind a Desktop fallback implementation from `desktop/src/main/kotlin/org/meshtastic/desktop/di/DesktopKoinModule.kt`. +- [X] T105b [P] [US3] Bind an iOS fallback implementation (keyword-search-only, sharing the Desktop fallback pattern) in the iOS Koin module or via a shared non-Android default binding. +- [X] T106 [P] [US3] Add runtime capability checks for Android API level, flavor, model availability, and busy/quota states. +- [X] T107 [P] [US3] Surface assistant fallback states cleanly in the shared UI and hide the input entirely when unsupported. +- [X] T108 [P] [US3] Add tests covering token budget trimming, unsupported platform behavior, and fallback search suggestions. +- [X] T109 [US3] Verify the Chirpy vector asset is bundled and rendered correctly across targets. **Checkpoint**: Supported Android Google builds get Gemini Nano; all other targets fall back gracefully. @@ -161,14 +166,14 @@ description: "Task list for feature: App Documentation (Android/KMP)" **Purpose**: Keep docs current and deployable. -- [ ] T120 [P] [US5] Create `.github/workflows/docs-deploy.yml` using `ubuntu-24.04`, JDK 21, Gradle setup, docs-generation tasks, and Pages deploy steps. -- [ ] T121 [P] [US5] Create `.github/workflows/docs-release.yml` for `v*.*.*` tags, version manifest updates, and `/latest/` redirect refresh. -- [ ] T122 [P] [US5] Create or wire `recordDocsScreenshots` to the chosen screenshot framework (`Roborazzi` preferred, `Paparazzi` acceptable). -- [ ] T123 [P] [US5] Add screenshot asset diff detection and automated PR creation logic for changed PNGs. -- [ ] T124 [P] [US5] Add schema validation against `specs/003-app-docs-markdown/contracts/keyword-index-schema.json` during CI. -- [ ] T125 [P] [US5] Add bundle-size validation and missing-asset validation to CI as blocking steps. -- [ ] T126 [P] [US5] Update workflow permissions and Pages artifact publishing configuration. -- [ ] T127 [US5] Dry-run the workflows locally as far as practical and verify contract alignment. +- [X] T120 [P] [US5] Create `.github/workflows/docs-deploy.yml` using `ubuntu-24.04`, JDK 21, Gradle setup, docs-generation tasks, and Pages deploy steps. +- [X] T121 [P] [US5] Create `.github/workflows/docs-release.yml` for `v*.*.*` tags, version manifest updates, and `/latest/` redirect refresh. +- [X] T122 [P] [US5] Create or wire `recordDocsScreenshots` to the chosen screenshot framework (`Roborazzi` preferred, `Paparazzi` acceptable). +- [X] T123 [P] [US5] Add screenshot asset diff detection and automated PR creation logic for changed PNGs. +- [X] T124 [P] [US5] Add schema validation against `specs/003-app-docs-markdown/contracts/keyword-index-schema.json` during CI. +- [X] T125 [P] [US5] Add bundle-size validation and missing-asset validation to CI as blocking steps. +- [X] T126 [P] [US5] Update workflow permissions and Pages artifact publishing configuration. +- [X] T127 [US5] Dry-run the workflows locally as far as practical and verify contract alignment. **Checkpoint**: Docs build, validate, and deploy automatically in CI. @@ -178,15 +183,15 @@ description: "Task list for feature: App Documentation (Android/KMP)" **Purpose**: Final quality pass before implementation is considered complete. -- [ ] T130 [P] [US2] Add accessibility labels, headings, and focus order checks to docs browser and Chirpy UI. -- [ ] T131 [P] [US2] Validate dark-mode rendering for generated HTML, screenshots, and icon reference tables. -- [ ] T132 [P] [US2] Handle missing-page and stale-deep-link fallbacks in the docs browser UI. -- [ ] T133 [P] [US3] Add explicit user messaging for Gemini busy/quota/model-not-installed states. -- [ ] T134 [P] [US1] Review all pages for plain-language voice, no internal jargon leaks, and consistency with current UI strings. -- [ ] T135 [P] [US4] Review developer docs for correctness against actual modules, routes, and DI setup. -- [ ] T136 [P] [US5] Validate Lighthouse accessibility on the generated site and record results. -- [ ] T137 [P] [US5] Add README updates for Help & Documentation and the deep-link contract. -- [ ] T138 [US1] Run final verification: `./gradlew spotlessCheck detekt kmpSmokeCompile test allTests generateDocsBundle validateDocsBundle publishDocsSite`. +- [X] T130 [P] [US2] Add accessibility labels, headings, and focus order checks to docs browser and Chirpy UI. +- [X] T131 [P] [US2] Validate dark-mode rendering for generated HTML, screenshots, and icon reference tables. +- [X] T132 [P] [US2] Handle missing-page and stale-deep-link fallbacks in the docs browser UI. +- [X] T133 [P] [US3] Add explicit user messaging for Gemini busy/quota/model-not-installed states. +- [X] T134 [P] [US1] Review all pages for plain-language voice, no internal jargon leaks, and consistency with current UI strings. +- [X] T135 [P] [US4] Review developer docs for correctness against actual modules, routes, and DI setup. +- [X] T136 [P] [US5] Validate Lighthouse accessibility on the generated site and record results. +- [X] T137 [P] [US5] Add README updates for Help & Documentation and the deep-link contract. +- [X] T138 [US1] Run final verification: `./gradlew spotlessCheck detekt kmpSmokeCompile test allTests generateDocsBundle validateDocsBundle publishDocsSite`. **Checkpoint**: Feature is accessible, correct, and release-ready. @@ -197,10 +202,15 @@ description: "Task list for feature: App Documentation (Android/KMP)" - Phase 0 blocks all UI work. - Phase 1 (content) and Phase 2 (site scaffolding) can overlap. - Phase 3 must finish before Phase 4 can load generated bundles reliably. +- T083/T084 (ImageTransformer) depend on T061/T062 (screenshots must be bundled before the transformer can resolve them). - Phase 5 depends on Phase 3 metadata/index generation and Phase 4 browser UI. - Phase 6 depends on Phase 5 because AI retrieval uses the keyword index and search engine. - Phase 7 depends on Phases 2 and 3. - Phase 8 depends on all preceding phases. +- Phase 10 depends on Phases 1–9 (all content and CI must be in place before Docusaurus sync). +- Phase 11 depends on Phases 9–10 (governance workflows and sync script must exist before consolidation). +- Phase 12 depends on Phase 6 (Chirpy assistant must exist before UX polish). +- Phase 13 depends on Phase 12 (Chirpy bubble redesign must exist before further polish). ## Recommended Delivery Order @@ -209,3 +219,243 @@ description: "Task list for feature: App Documentation (Android/KMP)" 3. Add **US3** (Gemini Nano + fallbacks). 4. Finish **US4** polishing and architecture docs. 5. Finish **US5** automation and screenshot bot flow. + +--- + +## Phase 9: Apple Alignment (Cross-Platform Feature Parity) + +**Purpose**: Close feature gaps identified by comparing with `meshtastic-apple` docs implementation. + +- [X] T200 [P] [US1] Create `docs/user/signal-meter.md` explaining LoRa signal quality, RSSI vs SNR, bar-level criteria, and common misconceptions — adapted from Apple equivalent for Android-specific signal surfaces. +- [X] T201 [P] [US1] Create `docs/user/units-and-locale.md` explaining automatic metric/imperial formatting via `MetricFormatter`, covering temperature, distance, speed, wind, rainfall, and locale settings — adapted from Apple equivalent for Android/KMP. +- [X] T202 [P] [US2] Add `iconId: String?` field to `DocPage` and `KeywordIndexEntry` models in `feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/model/DocModels.kt`. +- [X] T203 [P] [US2] Create `feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/ui/DocPageIconResolver.kt` mapping `iconId` values to `MeshtasticIcons` vectors (equivalent to Apple's SF Symbols per-page mapping). +- [X] T204 [P] [US2] Update `DocsBrowserScreen.kt` TOC list items to show leading icon using `resolveIcon()`. +- [X] T205 [P] [US2] Update `DocBundleLoader.kt` static index with `iconId` for all 24 pages and add two new `KeywordIndexEntry` entries for `signal-meter` and `units-and-locale`. +- [X] T206 [P] [US5] Create `.github/workflows/docs-staleness.yml` — advisory CI workflow that posts a PR comment when user-facing UI files change without corresponding `docs/` updates, with `skip-docs-check` label bypass (adapted from Apple's `docs-staleness.yml` for Android KMP paths). + +**Checkpoint**: Feature parity with Apple docs: per-page icons in TOC, two new user guide pages, and docs staleness CI check. + +--- + +## Phase 10: Docusaurus Sync & Content Gaps (meshtastic.org Parity) + +**Purpose**: Close gaps identified by comparing with Apple's `sync-apple-docs.js` workflow (PR [meshtastic/meshtastic#2393](https://github.com/meshtastic/meshtastic/pull/2393)) and Apple in-app doc content. Ensures Android docs are published on meshtastic.org alongside Apple docs and addresses missing content pages. + +**Depends on**: Phases 1–9 (all content and CI must be in place before sync). + +### Content + +- [X] T210 [P] [US1] [FR-041] Create `docs/user/translate.md` — "Translate the App" contributor guide explaining how to submit translations via Crowdin. Cover: link to Crowdin project, which files are translatable (composeResources `strings.xml`, `docs/user/*.md`), step-by-step workflow, and how to add a new locale. Add frontmatter with `nav_order: 17`. Add Crowdin string resources for title and keywords. +- [X] T211 [P] [US4] [FR-042] Create `docs/developer/measurement.md` — developer guide for the `MetricFormatter` API and locale-aware unit conversion. Cover: supported measurement types (temperature, distance, speed, wind, rainfall), how locale detection works, how to add a new measurement type, and testing patterns. Reference `core/common/src/commonMain/kotlin/org/meshtastic/core/common/util/` formatters. +- [X] T212 [P] [US2] Update `DocBundleLoader.kt` static index with new pages (`translate`, `measurement`), `iconId` mappings, and `KeywordIndexEntry` entries. Update nav ordering for existing pages to accommodate the two new entries. + +### Docusaurus Sync Script + +- [X] T220 [P] [US5] [FR-039] Create `scripts/sync-android-docs.js` — Node.js script that reads `docs/user/*.md` and `docs/developer/*.md`, transforms them for Docusaurus compatibility (rewrite frontmatter to Docusaurus format, fix sibling `.md` links, rewrite image paths to `static/img/android/`), and writes output to a staging directory. Model after Apple's `scripts/sync-apple-docs.js` structure. +- [X] T221 [P] [US5] [FR-040] Add `--convert-webp` flag to `sync-android-docs.js` that converts PNG/JPG screenshots to WebP via `cwebp` and rewrites image references in markdown. Original PNGs remain canonical in-repo. +- [X] T222 [P] [US5] [FR-039] Create `.github/workflows/sync-android-docs.yml` — workflow triggered on push to `main` when `docs/**` files change. Steps: checkout, install Node.js and `webp`, run `sync-android-docs.js --convert-webp`, copy images to `static/img/android/`, and open a PR in `meshtastic/meshtastic` targeting `docs/software/android/`. Use `ubuntu-24.04` runner and `peter-evans/create-pull-request` or equivalent action. +- [X] T223 [US5] Dry-run the sync script locally: run `node scripts/sync-android-docs.js --convert-webp --dry-run` and verify output structure matches Docusaurus expectations (`docs/software/android/user/*.md`, `docs/software/android/developer/*.md`, `static/img/android/*.webp`). + +### Integration + +- [X] T230 [P] [US2] Add Crowdin string resources for `translate.md` title (`doc_title_translate`) and keywords (`doc_keywords_translate`) in `core/resources/src/commonMain/composeResources/values/strings.xml`. Run `python3 scripts/sort-strings.py`. +- [X] T231 [P] [US2] Add Crowdin string resources for `measurement.md` title (`doc_title_measurement`) and keywords (`doc_keywords_measurement`). Run `python3 scripts/sort-strings.py`. +- [X] T232 [US1] Update `docs/user.md` and `docs/developer.md` What's New sections to include `translate.md` and `measurement.md`. Jekyll scope-based defaults handle nav/sidebar automatically. +- [X] T233 [US5] Verified `crowdin.yml` glob `/docs/user/*.md` already covers `translate.md` — no update needed. +- [X] T234 [US1] Run final verification: `./gradlew spotlessApply detekt :feature:docs:allTests`. + +**Checkpoint**: Android docs published on meshtastic.org, translate contributor page live, developer measurement docs complete. + +--- + +## Phase 11: Governance Consolidation & Script Optimization + +**Purpose**: Eliminate duplication across docs governance scripts and CI workflows. Reduce the number of places that must be manually updated when adding a doc page from 3 to 2 (markdown file + DocBundleLoader only). + +**Depends on**: Phases 9–10 (governance workflows and sync script must exist). + +### Shared Library + +- [X] T240 [P] [US5] [FR-044] Create `scripts/lib/frontmatter.js` with `parseFrontmatter()`, `discoverSlugs()`, and `forEachDocPage()` utilities. Consolidates 4 independent frontmatter parsers and directory traversal patterns. +- [X] T241 [P] [US5] [FR-044] Refactor `scripts/validate-doc-links.js` to use shared `discoverSlugs()` and `forEachDocPage()`. +- [X] T242 [P] [US5] [FR-044] Refactor `scripts/check-doc-freshness.js` to use shared `parseFrontmatter()` and `forEachDocPage()`. +- [X] T243 [P] [US5] [FR-044] Refactor `scripts/check-doc-coverage.js` to use shared `forEachDocPage()`. +- [X] T244 [P] [US5] [FR-044] Refactor `scripts/sync-android-docs.js` to use shared `discoverSlugs()` — replace hardcoded `KNOWN_USER_SLUGS` and `KNOWN_DEV_SLUGS` sets with filesystem-derived discovery. + +### Workflow Consolidation + +- [X] T250 [P] [US5] [FR-045] Merge `docs-staleness.yml` into `docs-governance.yml` as a parallel `staleness` job. The staleness job uses `fetch-depth: 0` for git diff; the `validate` job uses `fetch-depth: 1`. +- [X] T251 [P] [US5] [FR-045] Remove standalone `.github/workflows/docs-staleness.yml`. +- [X] T252 [US5] Remove slug registry validation step from `docs-governance.yml` (no longer needed since slugs are filesystem-derived). +- [X] T253 [US5] Remove duplicate link validation step and Node.js setup from `docs-deploy.yml`. Remove unused `pull-requests: write` permission. + +### 3-Consumer Propagation + +- [X] T260 [P] [US5] [FR-043] Update Constitution principle VI to explicitly name in-app, Jekyll, and Docusaurus consumers with propagation rules. +- [X] T261 [US5] Update staleness check PR comment to include new-page checklist for all 3 consumer registries. +- [X] T262 [US5] Add `DocBundleLoader` registry validation step to `docs-governance.yml` (ensures every doc page is registered in the in-app index). + +### Cleanup + +- [X] T270 [US5] Remove duplicate `sync-android-docs.js` from meshtastic/meshtastic PR #2405 (workflow runs from Android clone). +- [X] T271 [US5] Update `docs/developer.md` references from `docs-staleness` to consolidated `Docs Governance` workflow. +- [X] T272 [US5] Verify all 4 scripts pass locally: `validate-doc-links`, `check-doc-freshness`, `check-doc-coverage`, `sync-android-docs --dry-run`. + +**Checkpoint**: Single docs governance workflow, shared frontmatter library, filesystem-derived slugs, 3-consumer propagation model enforced. + +### Preview & Screenshot Governance + +- [X] T280 [P] [US5] [FR-046] Add `preview-staleness` job to `docs-governance.yml` — detects UI composable changes without `*Previews.kt` updates. Posts advisory PR comment with checklist. Bypassable via `skip-preview-check` label. +- [X] T281 [P] [US5] [FR-047] Add screenshot reference staleness detection to same job — detects `*Previews.kt` changes without reference image updates in `screenshot-tests/src/screenshotTestDebug/reference/`. Posts advisory with `updateDebugScreenshotTest` command. +- [X] T282 [US5] Rename workflow `Docs Governance` → `UI & Docs Governance` to reflect expanded scope. +- [X] T283 [US5] Update `docs/developer.md` contributing checklist with preview/screenshot maintenance guidance. +- [X] T284 [US5] Add dismiss-on-resolve logic: clear preview/screenshot advisory comments when both conditions resolve. + +**Checkpoint**: Unified UI & Docs Governance workflow with advisory checks for docs, previews, and screenshot references. + +--- + +## Phase 12: Chirpy UX & M3 Adaptive Nav Polish + +**Purpose**: Bring Chirpy assistant and docs navigation up to M3 adaptive navigation best practices and improve conversational UX. + +### M3 Adaptive Navigation + +- [X] T300 [P] [US2] Integrate `ListDetailSceneStrategy` metadata into `DocsNavigation.kt` — `listPane()` for `HelpDocs`, `detailPane()` for `HelpDocPage`. Enables proper dual-pane layout on tablets/desktop. +- [X] T301 [P] [US2] Add `feature/docs/build.gradle.kts` dependency on `libs.jetbrains.compose.material3.adaptive.navigation3`. + +### Global Chirpy State + +- [X] T310 [P] [US3] Create `feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/ai/ChirpySessionHolder.kt` — Koin `@Single` with Compose snapshot state (`showSheet`, `sessionState`) for shared Chirpy conversation across panes. +- [X] T311 [P] [US3] Refactor `DocsNavigation.kt` `rememberChirpyState()` to inject `ChirpySessionHolder` and derive `showFab` from backstack — FAB shows on list pane only when no detail is selected, always on detail pane. +- [X] T312 [P] [US3] Add auto-intro prompt: Chirpy generates a natural introduction when the sheet first opens with no messages. + +### Chirpy Bubble Redesign (MessageItem Parity) + +- [X] T320 [P] [US3] Rewrite `ChirpyAssistantSheet.kt` bubbles to use `Surface` + `BorderStroke(0.5.dp)` + `RoundedCornerShape` matching `MessageItem.kt` sender/receiver pattern — user bubbles right-aligned with `primaryContainer`, Chirpy bubbles left-aligned with `surfaceVariant`. +- [X] T321 [P] [US3] Add 24dp Chirpy avatar (`img_chirpy`) to the left of every assistant reply bubble. +- [X] T322 [P] [US3] Update `DocsPreviews.kt` with matching bubble styles and avatar. + +### Thinking State & Source Navigation + +- [X] T330 [P] [US3] Replace plain "Chirpy is thinking..." text with proper `ThinkingBubble` composable — assistant-styled bubble with Chirpy avatar and pulsing alpha animation. +- [X] T331 [P] [US3] Add `SourceRef(id, title)` data class to `DocModels.kt`; update `ChirpyMessage.sources` to carry page titles alongside IDs. +- [X] T332 [P] [US3] Replace plain-text source list with tappable `SuggestionChip`s in `AssistantBubble` using `FlowRow` layout and `secondaryContainer` colors. +- [X] T333 [P] [US3] Add `onNavigateToPage` to `ChirpyUiState` — dismisses sheet and navigates to referenced doc page. Wire through `DocsBrowserScreen` and `DocsPageRouteScreen`. +- [X] T334 [US3] Update `DocsPreviews.kt` with `SourceRef` sample data, `PreviewThinkingBubble`, and chip-enabled `ChirpyBubble`. + +### Verification + +- [X] T340 [US3] Verify M3 FAB behavior: confirmed no existing FABs implement hide-on-scroll (consistent with M3 guidelines which do not prescribe it). Chirpy FAB is always-visible, matching all other FABs in the app. +- [X] T341 [US3] Build, detekt, spotless, and all `feature:docs` tests pass. Deployed and verified on Pixel 9 Pro. + +**Checkpoint**: Chirpy assistant follows M3 adaptive nav best practices with global state, MessageItem-style bubbles, thinking animation, and tappable source chips. + +--- + +## Phase 13: Chirpy Messaging UI Polish & Firebase AI Hybrid + +> Align Chirpy chat with messaging module conventions; add markdown rendering; update Firebase AI binding. + +- Phase 13 depends on Phase 12 (Chirpy bubble redesign must exist before further polish). + +### Firebase AI Logic Hybrid API + +- [X] T350 [P] [US3] Update `GeminiNanoDocAssistant.kt` to use `gemini-2.5-flash-lite` model with `InferenceMode.PREFER_ON_DEVICE` — hybrid on-device/cloud inference via Firebase AI Logic. +- [X] T351 [P] [US3] Implement paragraph extraction with markdown stripping and 8K character context budget with 3K retry fallback on token limit errors. +- [X] T352 [P] [US3] Migrate imports from deprecated `com.google.firebase.ai.ondevice` to `com.google.firebase.ai`. + +### Markdown Rendering in Assistant Messages + +- [X] T360 [US3] Replace `Text()` with mikepenz `Markdown()` composable in `AssistantBubble` — Chirpy responses now render rich markdown (headers, lists, bold, code blocks, links). + +### ChirpyChip Sender Label + +- [X] T370 [P] [US3] Create `ChirpyChip` composable in `ChirpyAssistantSheet.kt` — simplified `NodeChip` pattern using `Card` with `tertiaryContainer` colors, 28dp height, 18dp Chirpy avatar + "Chirpy" text label. +- [X] T371 [P] [US3] Replace inline avatar-beside-bubble layout in `AssistantBubble` and `ThinkingBubble` with `ChirpyChip` positioned above the bubble — matching how `NodeChip` appears above received messages in `MessageItem.kt`. + +### MessageInput-Style Text Field + +- [X] T380 [P] [US3] Replace `OutlinedTextField` + `TextButton("Send")` with messaging-style input: `RoundedCornerShape(50f)` pill shape, `IconButton` with `MeshtasticIcons.Send`. +- [X] T381 [P] [US3] Add `KeyboardOptions(capitalization = Sentences, imeAction = Send)` + `KeyboardActions(onSend)` for keyboard submit support. +- [X] T382 [P] [US3] Add `LocalSoftwareKeyboardController.current?.hide()` on send to dismiss keyboard after submitting a message. + +### Verification + +- [X] T390 [US3] Build, detekt, spotless, and all tests pass. Deployed and verified on Pixel 9 Pro. + +**Checkpoint**: Chirpy chat fully aligned with messaging module conventions — NodeChip-style sender label, MessageInput-style text field, markdown rendering, and Firebase AI hybrid inference. + +--- + +## Phase 14: Translation Cascade (Crowdin → ML Kit → English) + +**Purpose**: Enable runtime translation of bundled docs for users whose locale lacks Crowdin coverage. + +### Translation Service Interface & Implementations + +- [X] T400 [P] [US1] Create `DocTranslationService` interface in `feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/translation/` with `translatePage()`, `isLanguageAvailable()`, `downloadLanguageModel()` and sealed result types. +- [X] T401 [P] [US1] Create `NoOpDocTranslator` for F-Droid/Desktop/iOS that returns `Unavailable`. +- [X] T402 [P] [US1] Create `MlKitDocTranslator` in `androidApp/src/google/kotlin/org/meshtastic/app/translation/` with auto model download, segment-and-translate pattern, and proper `suspendCancellableCoroutine` bridging. + +### Markdown-Aware Translation + +- [X] T410 [P] [US1] Create `MarkdownTranslationSegmenter` that extracts translatable text from markdown while preserving code blocks, links, images, frontmatter, and HTML blocks. +- [X] T411 [P] [US1] Create `DocTranslationCache` with Okio file-based caching, MD5 content keying, Mutex-guarded concurrency, atomic writes, and access-time eviction at 50MB. + +### Cascade Integration + +- [X] T420 [US1] Add `hasTranslatedResource()` to `DocBundleLoader` to detect Crowdin-provided locale-qualified bundles. +- [X] T421 [US1] Wire cascade into `DocsPageScreen`: show English content immediately, attempt ML Kit translation in background only when Crowdin bundle is absent, auto-download model on first use. +- [X] T422 [US1] Add `TranslationSource` model enum and UI indicator (subtitle in TopAppBar: "Community translated" or "Auto-translated"). +- [X] T423 [US1] Add `ioDispatcher` hop and locale-keyed `LaunchedEffect` for correct threading and reactivity. + +### DI & Platform Wiring + +- [X] T430 [P] [US1] Bind `DocTranslationService` → `MlKitDocTranslator` in `GoogleAiModule`. +- [X] T431 [P] [US1] Bind `DocTranslationService` → `NoOpDocTranslator` in `DesktopKoinModule`. + +### Testing + +- [X] T440 [P] [US1] Create `MarkdownTranslationSegmenterTest` (15 tests covering paragraphs, headings, code, links, images, frontmatter, lists, tables, HTML blocks). +- [X] T441 [P] [US1] Create `DocTranslationCacheTest` (8 tests covering cache miss/hit, stale hash, locale isolation, clear, size, eviction, hash consistency). +- [X] T442 [P] [US1] Create `TranslationCascadeTest` (8 tests covering NoOp behavior, fake translator variations, sealed hierarchy). + +### CI + +- [X] T450 [US1] Add `docs/**/*.md` to `scheduled-updates.yml` `add-paths`. + +**Checkpoint**: Translation cascade complete — Crowdin bundled translations served automatically by CMP, ML Kit auto-translates on Google flavor when Crowdin unavailable, graceful English fallback on all other platforms. + +--- + +## Phase 15: Web i18n — Crowdin Translations on GitHub Pages + +**Purpose**: Ensure in-repo Crowdin translations flow to web consumers (GH Pages docs site), not just the in-app bundle. + +### Jekyll Configuration + +- [X] T500 [P] Add `_data/locales.yml` with all supported locale metadata (name, text direction). +- [X] T501 [P] Add scope defaults in `_config.yml` for each locale path (`es`, `fr`, `de`, etc.) with `layout: locale_page` and `nav_exclude: true`. +- [X] T502 [P] Create `_layouts/locale_page.html` — wraps content with locale banner, language tag, RTL support, and link back to English. + +### Language Switcher UI + +- [X] T510 [P] Create `_includes/language_switcher.html` — detects available translations for current page from `site.pages`, renders dropdown with locale links. +- [X] T511 [P] Add language switcher CSS to `_includes/head_custom.html` (dropdown, hover states, dark-mode compatible). +- [X] T512 [P] Wire language switcher into `_includes/header_custom.html` alongside theme toggle. + +### DocsTasks Locale Generation + +- [X] T520 [P] Extend `GenerateDocsBundleTask` to discover `docs/{locale}/user/` directories and generate locale-qualified HTML + index entries. +- [X] T521 [P] Add `locales.json` manifest output listing all detected translation locales. +- [X] T522 [P] Add `locale` field to index.json entries for locale-aware consumers. +- [X] T523 [P] Set `lang` and `dir` attributes on generated HTML for locale pages. + +### Content & Navigation + +- [X] T530 [P] Create `docs/translations.md` — lists all available languages with links, Crowdin CTA, contribution instructions. +- [X] T531 [P] Crowdin config (`crowdin.yml`) already maps `docs/index.md` → `docs/{locale}/index.md` — locale landing pages auto-generated. + +**Checkpoint**: Crowdin-contributed translations serve to web consumers via Jekyll GH Pages with locale routing, language switcher, and proper locale/RTL HTML attributes. Same markdown source serves both in-app (CMP bundle) and web (Jekyll) consumers. From 2e484e219c132b89597ffa939e1801765a5d5352 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 19 May 2026 06:18:50 -0500 Subject: [PATCH 31/78] chore(deps): update actions/checkout action to v6 (#5481) --- .github/workflows/docs-governance.yml | 6 +++--- .github/workflows/sync-android-docs.yml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/docs-governance.yml b/.github/workflows/docs-governance.yml index 71489a8e7..dca5157b4 100644 --- a/.github/workflows/docs-governance.yml +++ b/.github/workflows/docs-governance.yml @@ -23,7 +23,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: fetch-depth: 0 @@ -160,7 +160,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: fetch-depth: 1 @@ -208,7 +208,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: fetch-depth: 0 diff --git a/.github/workflows/sync-android-docs.yml b/.github/workflows/sync-android-docs.yml index 4d56c12fc..91cda7367 100644 --- a/.github/workflows/sync-android-docs.yml +++ b/.github/workflows/sync-android-docs.yml @@ -14,7 +14,7 @@ jobs: steps: - name: Checkout meshtastic/meshtastic - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: fetch-depth: 1 From d7cccd0dba442d8c8892a4aac8124f565563434a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 19 May 2026 06:19:10 -0500 Subject: [PATCH 32/78] chore(deps): update actions/deploy-pages action to v5 (#5482) --- .github/workflows/docs-deploy.yml | 2 +- .github/workflows/docs-release.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docs-deploy.yml b/.github/workflows/docs-deploy.yml index 350fd04a1..a45ebdcad 100644 --- a/.github/workflows/docs-deploy.yml +++ b/.github/workflows/docs-deploy.yml @@ -59,5 +59,5 @@ jobs: - name: Deploy to GitHub Pages id: deployment - uses: actions/deploy-pages@v4 + uses: actions/deploy-pages@v5 diff --git a/.github/workflows/docs-release.yml b/.github/workflows/docs-release.yml index 7331d9e53..ad1526577 100644 --- a/.github/workflows/docs-release.yml +++ b/.github/workflows/docs-release.yml @@ -78,5 +78,5 @@ jobs: - name: Deploy to GitHub Pages id: deployment - uses: actions/deploy-pages@v4 + uses: actions/deploy-pages@v5 From f8a5f894a86b6145b86143888f7ea1fe3d9ccbb6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 19 May 2026 06:19:30 -0500 Subject: [PATCH 33/78] chore(deps): update actions/github-script action to v9 (#5483) --- .github/workflows/docs-governance.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/docs-governance.yml b/.github/workflows/docs-governance.yml index dca5157b4..f4709e358 100644 --- a/.github/workflows/docs-governance.yml +++ b/.github/workflows/docs-governance.yml @@ -57,7 +57,7 @@ jobs: - name: Post warning comment if: steps.changed.outputs.stale == 'true' - uses: actions/github-script@v7 + uses: actions/github-script@v9 with: script: | const viewsChanged = `${{ steps.changed.outputs.views_changed }}`.trim(); @@ -124,7 +124,7 @@ jobs: - name: Dismiss stale comment when docs are updated if: steps.changed.outputs.stale == 'false' - uses: actions/github-script@v7 + uses: actions/github-script@v9 with: script: | const { data: comments } = await github.rest.issues.listComments({ @@ -267,7 +267,7 @@ jobs: - name: Post preview advisory if: steps.changed.outputs.preview_stale == 'true' - uses: actions/github-script@v7 + uses: actions/github-script@v9 with: script: | const uiChanged = `${{ steps.changed.outputs.ui_changed }}`.trim(); @@ -325,7 +325,7 @@ jobs: - name: Post screenshot advisory if: steps.changed.outputs.screenshot_stale == 'true' - uses: actions/github-script@v7 + uses: actions/github-script@v9 with: script: | const previewChanged = `${{ steps.changed.outputs.preview_changed }}`.trim(); @@ -379,7 +379,7 @@ jobs: if: >- steps.changed.outputs.preview_stale == 'false' && steps.changed.outputs.screenshot_stale == 'false' - uses: actions/github-script@v7 + uses: actions/github-script@v9 with: script: | const { data: comments } = await github.rest.issues.listComments({ From 4eb7ed8fe0853850a8056524403d4da3d8c36de3 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 19 May 2026 06:19:51 -0500 Subject: [PATCH 34/78] chore(deps): update io.nlopez.compose.rules:detekt to v0.5.9 (#5485) --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 8c9772ab9..99e45a8dc 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -260,7 +260,7 @@ androidx-room-gradlePlugin = { module = "androidx.room3:room3-gradle-plugin", ve compose-gradlePlugin = { module = "org.jetbrains.kotlin:compose-compiler-gradle-plugin", version.ref = "kotlin" } compose-multiplatform-gradlePlugin = { module = "org.jetbrains.compose:compose-gradle-plugin", version.ref = "compose-multiplatform" } datadog-gradlePlugin = { module = "com.datadoghq.dd-sdk-android-gradle-plugin:com.datadoghq.dd-sdk-android-gradle-plugin.gradle.plugin", version.ref = "datadog-gradle" } -detekt-compose = { module = "io.nlopez.compose.rules:detekt", version = "0.5.8" } +detekt-compose = { module = "io.nlopez.compose.rules:detekt", version = "0.5.9" } detekt-formatting = { module = "dev.detekt:detekt-rules-ktlint-wrapper", version.ref = "detekt" } detekt-gradlePlugin = { module = "dev.detekt:detekt-gradle-plugin", version.ref = "detekt" } firebase-crashlytics-gradlePlugin = { module = "com.google.firebase:firebase-crashlytics-gradle", version.ref = "firebase-crashlytics-gradle" } From 733cb92aecb51deab11edb2e9c3e198f9579304c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 19 May 2026 06:20:13 -0500 Subject: [PATCH 35/78] chore(deps): update actions/setup-node action to v6 (#5486) --- .github/workflows/docs-governance.yml | 2 +- .github/workflows/sync-android-docs.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docs-governance.yml b/.github/workflows/docs-governance.yml index f4709e358..e5a6272e5 100644 --- a/.github/workflows/docs-governance.yml +++ b/.github/workflows/docs-governance.yml @@ -165,7 +165,7 @@ jobs: fetch-depth: 1 - name: Setup Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version: "20" diff --git a/.github/workflows/sync-android-docs.yml b/.github/workflows/sync-android-docs.yml index 91cda7367..3490973a7 100644 --- a/.github/workflows/sync-android-docs.yml +++ b/.github/workflows/sync-android-docs.yml @@ -23,7 +23,7 @@ jobs: git clone --depth=1 --branch main https://github.com/meshtastic/Meshtastic-Android.git /tmp/Meshtastic-Android - name: Setup Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version-file: ".nvmrc" From 21993b6cc7eba8776262c3805942ddc460ab0c5b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 19 May 2026 06:21:55 -0500 Subject: [PATCH 36/78] chore(deps): update gradle/actions action to v6 (#5488) --- .github/workflows/docs-deploy.yml | 2 +- .github/workflows/docs-release.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docs-deploy.yml b/.github/workflows/docs-deploy.yml index a45ebdcad..3ccec1964 100644 --- a/.github/workflows/docs-deploy.yml +++ b/.github/workflows/docs-deploy.yml @@ -39,7 +39,7 @@ jobs: distribution: 'temurin' - name: Setup Gradle - uses: gradle/actions/setup-gradle@v4 + uses: gradle/actions/setup-gradle@v6 with: cache-read-only: false diff --git a/.github/workflows/docs-release.yml b/.github/workflows/docs-release.yml index ad1526577..afa5d9aae 100644 --- a/.github/workflows/docs-release.yml +++ b/.github/workflows/docs-release.yml @@ -42,7 +42,7 @@ jobs: distribution: 'temurin' - name: Setup Gradle - uses: gradle/actions/setup-gradle@v4 + uses: gradle/actions/setup-gradle@v6 with: cache-read-only: true From 4afa1a032fc465464e7408ef36d0505876ce9d61 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 19 May 2026 06:22:20 -0500 Subject: [PATCH 37/78] chore(deps): update actions/upload-pages-artifact action to v5 (#5487) --- .github/workflows/docs-deploy.yml | 2 +- .github/workflows/docs-release.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docs-deploy.yml b/.github/workflows/docs-deploy.yml index 3ccec1964..4244c3d1a 100644 --- a/.github/workflows/docs-deploy.yml +++ b/.github/workflows/docs-deploy.yml @@ -53,7 +53,7 @@ jobs: run: ./gradlew publishDocsSite -Pdocs.channel=beta -Pci=true - name: Upload Pages Artifact - uses: actions/upload-pages-artifact@v3 + uses: actions/upload-pages-artifact@v5 with: path: build/_site/ diff --git a/.github/workflows/docs-release.yml b/.github/workflows/docs-release.yml index afa5d9aae..204ecdacb 100644 --- a/.github/workflows/docs-release.yml +++ b/.github/workflows/docs-release.yml @@ -72,7 +72,7 @@ jobs: mv /tmp/versions_merged.yml docs/_data/versions.yml - name: Upload Pages Artifact - uses: actions/upload-pages-artifact@v3 + uses: actions/upload-pages-artifact@v5 with: path: build/_site/ From bbdc4a300406ae417ad7a70fb4cdd826debb5cb3 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 19 May 2026 06:22:43 -0500 Subject: [PATCH 38/78] chore(deps): update actions/setup-java action to v5 (#5484) --- .github/workflows/docs-deploy.yml | 2 +- .github/workflows/docs-release.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docs-deploy.yml b/.github/workflows/docs-deploy.yml index 4244c3d1a..a1e67ef35 100644 --- a/.github/workflows/docs-deploy.yml +++ b/.github/workflows/docs-deploy.yml @@ -33,7 +33,7 @@ jobs: fetch-depth: 0 - name: Set up JDK 21 - uses: actions/setup-java@v4 + uses: actions/setup-java@v5 with: java-version: '21' distribution: 'temurin' diff --git a/.github/workflows/docs-release.yml b/.github/workflows/docs-release.yml index 204ecdacb..6aa59308d 100644 --- a/.github/workflows/docs-release.yml +++ b/.github/workflows/docs-release.yml @@ -36,7 +36,7 @@ jobs: echo "Deploying docs for version: $TAG" - name: Set up JDK 21 - uses: actions/setup-java@v4 + uses: actions/setup-java@v5 with: java-version: '21' distribution: 'temurin' From ece771edb06f0110050baac322a093214b89f6c8 Mon Sep 17 00:00:00 2001 From: James Rich <2199651+jamesarich@users.noreply.github.com> Date: Tue, 19 May 2026 09:06:12 -0500 Subject: [PATCH 39/78] docs: comprehensive accuracy audit and CI fix (#5489) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../org/meshtastic/buildlogic/DocsTasks.kt | 2 +- docs/_config.yml | 80 +++++++++--------- docs/_includes/language_switcher.html | 45 ++++++---- docs/assets/screenshots/README.md | 1 - .../messages-and-channels_channel_list.png | Bin 77302 -> 0 bytes .../screenshots/messages_channel_info.png | Bin 1656 -> 0 bytes .../settings-radio-user_lora_config.png | Bin 12667 -> 0 bytes docs/developer.md | 1 - docs/developer/adding-a-feature-module.md | 11 +-- docs/developer/architecture.md | 8 +- docs/developer/codebase.md | 29 ++++--- docs/developer/contributing.md | 23 +++-- docs/developer/navigation-and-deep-links.md | 22 ++--- docs/developer/persistence.md | 26 ++++-- docs/developer/testing.md | 8 +- docs/developer/transport.md | 16 ++-- docs/translations.md | 20 ++--- docs/user.md | 1 - docs/user/connections.md | 25 ++++-- docs/user/desktop.md | 30 +++++-- docs/user/discovery.md | 2 +- docs/user/firmware.md | 2 + docs/user/messages-and-channels.md | 11 ++- docs/user/mqtt.md | 11 ++- docs/user/nodes.md | 12 +-- docs/user/settings-module-admin.md | 8 +- docs/user/settings-radio-user.md | 30 ++++--- docs/user/signal-meter.md | 8 +- 28 files changed, 247 insertions(+), 185 deletions(-) delete mode 100644 docs/assets/screenshots/messages-and-channels_channel_list.png delete mode 100644 docs/assets/screenshots/messages_channel_info.png delete mode 100644 docs/assets/screenshots/settings-radio-user_lora_config.png diff --git a/build-logic/convention/src/main/kotlin/org/meshtastic/buildlogic/DocsTasks.kt b/build-logic/convention/src/main/kotlin/org/meshtastic/buildlogic/DocsTasks.kt index 450b05e3b..15cbdca9e 100644 --- a/build-logic/convention/src/main/kotlin/org/meshtastic/buildlogic/DocsTasks.kt +++ b/build-logic/convention/src/main/kotlin/org/meshtastic/buildlogic/DocsTasks.kt @@ -61,7 +61,7 @@ class DocsTasks : Plugin { bundleDir.set(outputDir.map { it.dir("common") }) schemaFile.set( project.rootProject.layout.projectDirectory - .file("specs/003-app-docs-markdown/contracts/keyword-index-schema.json") + .file("specs/20260507-161858-app-docs-markdown/contracts/keyword-index-schema.json") ) } diff --git a/docs/_config.yml b/docs/_config.yml index 4b76bae58..bd7c6dc00 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -28,12 +28,12 @@ color_scheme: meshtastic # Default front-matter for pages in subdirectories defaults: - scope: - path: "user" + path: "user/" values: parent: User Guide layout: default - scope: - path: "developer" + path: "developer/" values: parent: Developer Guide layout: default @@ -41,229 +41,229 @@ defaults: # They use a dedicated locale layout with a back-link to the English version. # Auto-generated from Android app locales (values-* resource dirs). - scope: - path: "ar" + path: "ar/" values: layout: locale_page locale: ar nav_exclude: true - scope: - path: "be" + path: "be/" values: layout: locale_page locale: be nav_exclude: true - scope: - path: "bg" + path: "bg/" values: layout: locale_page locale: bg nav_exclude: true - scope: - path: "ca" + path: "ca/" values: layout: locale_page locale: ca nav_exclude: true - scope: - path: "cs" + path: "cs/" values: layout: locale_page locale: cs nav_exclude: true - scope: - path: "de" + path: "de/" values: layout: locale_page locale: de nav_exclude: true - scope: - path: "el" + path: "el/" values: layout: locale_page locale: el nav_exclude: true - scope: - path: "es" + path: "es/" values: layout: locale_page locale: es nav_exclude: true - scope: - path: "et" + path: "et/" values: layout: locale_page locale: et nav_exclude: true - scope: - path: "fi" + path: "fi/" values: layout: locale_page locale: fi nav_exclude: true - scope: - path: "fr" + path: "fr/" values: layout: locale_page locale: fr nav_exclude: true - scope: - path: "ga" + path: "ga/" values: layout: locale_page locale: ga nav_exclude: true - scope: - path: "gl" + path: "gl/" values: layout: locale_page locale: gl nav_exclude: true - scope: - path: "he" + path: "he/" values: layout: locale_page locale: he nav_exclude: true - scope: - path: "hr" + path: "hr/" values: layout: locale_page locale: hr nav_exclude: true - scope: - path: "ht" + path: "ht/" values: layout: locale_page locale: ht nav_exclude: true - scope: - path: "hu" + path: "hu/" values: layout: locale_page locale: hu nav_exclude: true - scope: - path: "is" + path: "is/" values: layout: locale_page locale: is nav_exclude: true - scope: - path: "it" + path: "it/" values: layout: locale_page locale: it nav_exclude: true - scope: - path: "ja" + path: "ja/" values: layout: locale_page locale: ja nav_exclude: true - scope: - path: "ko" + path: "ko/" values: layout: locale_page locale: ko nav_exclude: true - scope: - path: "lt" + path: "lt/" values: layout: locale_page locale: lt nav_exclude: true - scope: - path: "nl" + path: "nl/" values: layout: locale_page locale: nl nav_exclude: true - scope: - path: "no" + path: "no/" values: layout: locale_page locale: no nav_exclude: true - scope: - path: "pl" + path: "pl/" values: layout: locale_page locale: pl nav_exclude: true - scope: - path: "pt" + path: "pt/" values: layout: locale_page locale: pt nav_exclude: true - scope: - path: "pt-rBR" + path: "pt-rBR/" values: layout: locale_page locale: pt-rBR nav_exclude: true - scope: - path: "ro" + path: "ro/" values: layout: locale_page locale: ro nav_exclude: true - scope: - path: "ru" + path: "ru/" values: layout: locale_page locale: ru nav_exclude: true - scope: - path: "sk" + path: "sk/" values: layout: locale_page locale: sk nav_exclude: true - scope: - path: "sl" + path: "sl/" values: layout: locale_page locale: sl nav_exclude: true - scope: - path: "sq" + path: "sq/" values: layout: locale_page locale: sq nav_exclude: true - scope: - path: "sr" + path: "sr/" values: layout: locale_page locale: sr nav_exclude: true - scope: - path: "sv" + path: "sv/" values: layout: locale_page locale: sv nav_exclude: true - scope: - path: "tr" + path: "tr/" values: layout: locale_page locale: tr nav_exclude: true - scope: - path: "uk" + path: "uk/" values: layout: locale_page locale: uk nav_exclude: true - scope: - path: "zh-rCN" + path: "zh-rCN/" values: layout: locale_page locale: zh-rCN nav_exclude: true - scope: - path: "zh-rTW" + path: "zh-rTW/" values: layout: locale_page locale: zh-rTW diff --git a/docs/_includes/language_switcher.html b/docs/_includes/language_switcher.html index 1b0cf4238..3fe3bb662 100644 --- a/docs/_includes/language_switcher.html +++ b/docs/_includes/language_switcher.html @@ -15,44 +15,56 @@ {% assign locales = site.data.locales %} {% if locales and current_path %} +{% assign path_parts = current_path | split: "/" %} +{% assign first_segment = path_parts[0] %} + +{% comment %} Build the list of available translations first {% endcomment %} +{% assign has_translations = false %} + +{% if locales[first_segment] %} + {% comment %} We're on a translated page — English link is always available {% endcomment %} + {% assign has_translations = true %} + {% assign remaining_parts = path_parts | slice: 1, path_parts.size %} + {% assign en_path = remaining_parts | join: "/" | replace: ".md", "" %} +{% else %} + {% comment %} Check if any translated version exists {% endcomment %} + {% assign en_relative = current_path | replace: ".md", "" %} + {% for locale in locales %} + {% assign locale_code = locale[0] %} + {% assign locale_file = locale_code | append: "/" | append: en_relative | append: ".md" %} + {% for p in site.pages %} + {% if p.path == locale_file %} + {% assign has_translations = true %} + {% break %} + {% endif %} + {% endfor %} + {% if has_translations %}{% break %}{% endif %} + {% endfor %} +{% endif %} + +{% if has_translations %}

🌐 English
{% endif %} +{% endif %} diff --git a/docs/assets/screenshots/README.md b/docs/assets/screenshots/README.md index 5fb2efe28..edf5ca8d1 100644 --- a/docs/assets/screenshots/README.md +++ b/docs/assets/screenshots/README.md @@ -30,7 +30,6 @@ Then copy the relevant light-mode PNGs from the reference directory. The Examples: - `onboarding_welcome.png` - `connections_bluetooth_scan.png` -- `messages-and-channels_channel_list.png` - `firmware_disclaimer.png` ## Guidelines diff --git a/docs/assets/screenshots/messages-and-channels_channel_list.png b/docs/assets/screenshots/messages-and-channels_channel_list.png deleted file mode 100644 index 4054990a14befb64349f07d48b60b726ce2620b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77302 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�!lu5A==3!;JwBGOfwf`AZuRgn^^ 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 diff --git a/docs/assets/screenshots/messages_channel_info.png b/docs/assets/screenshots/messages_channel_info.png deleted file mode 100644 index 6f022378f80c00b3072e2cf319e6a6a708aef466..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1656 zcmV-;28a2HP)}x4)QJOYYt5lRi zS{4aLXrT=2fQ5n1urC3Axz2g`hIh}oZ{8dFhF~*4d~)*UoOAEo?>lqvyZ6nGwY4?o z<;mHBKk%|Syh0j;S4e~K3TY5tAq`?vLfY(h_G{g5?CiPoEG_*6i;GWTVc{mp!u7eF z3zC0oYKr7Ot+*xR@UTS^DI_e4g*wo(Ku+#=QXXz=yD&a(W!0B!oZR}Qj>PCemypxb zGpwxq;<`woO0i7nTHO!%Gcz-!Z6g>M7-ZLP+>~xwN@^O*%sRsg3QE}R+x2X2exAfD z>Fm7Eo_W^CNzmbN5~BxAA^ZCWSVH1a)ru2+uI5ilJ|?w?``9eQ77H^)CvZYwe0TY= zg2Ga^w6sL>fh`g8?!6Xi?xU5axW-n)5A8L#w35EurM=~TFlMOvG@0U#0~yH;326(7Z(?uaWyOh|KI|N3B6<~Xq75z#IejXp;k@d>FUPh6y%gBh+uO_6`YL#xn!9yX;@3jEOGjcM!a`k)FXJaB{enBy*By3}1lSo6DzdO4~ zp2!vymXKUEMn*=tK?9E;+ejQHC^(GEssFvf=@SXraHomA;^$BL0{jEsmZlNh2PY)V zF;HzAgT-^)MkT>qv%I`a8kAXGU1d?Gc-4Hledtd)x48nI3zdU{MFq#W3l?&x@2f;S z%!@C*&g^!+GC3jJ+S<86%ZMsT&A+&~u_~sdrW3y?Uv!5>T&%jx4G30Y9OEunNSWgq zSyJWRX>4-r=FSs8UbHwNYiep~szxBy9La6(d_2xQ5*Y?o5ej)mG*!tzJQ@E?waU6Q7VmV%!A_q*us~KMCUe zoRAq`ouYG^z`|+_6^A>Mk)9(H^*u*|J&}2uv>^gcc$9;Id>rF0SRg}$%*nkVtQc%z z?vrz1alw9ft==6DtnSLeyy5>Ai4g&t2M|JLVsg^y!vYy1B%B$F<}hyXq5MyAVPS#z zweqpQva*_daS?E~s2mL7YKJ9*_vWy0$UZEPAwvGq(8vv123L^Yid4(T{zk#$h8l1a zl>^GlFCsBYKxi!f*x0z!j|DPB$l2Lh7K+awu?^!Z66VUDo`ZNSa9da)!-NFNE2>E4 zfR&N2Mdy(Ke6A-S_RhF(y}(h}zWsqjED>;GqxO0O3uLH}Gmg13$+3@>294)9gKTn2 znp<0vReKFgQ5G!atAUD#$1s5gE%YmW{(z zBY;H@4r5`#gSU&K7hRr2RY;(@xpm_$qAZ5XIZxXU?X|SDk-q-#xD*oD&hNFi6PiK- z@K1}6!%AER(fNEw^WrulEQ zy1II1x2wM4F4EC<#S^^d3kc`DWue@AG_XeSe>KeeYT?f5M(UGkfNqyIl7*_n$YeBX$cM z5a8h8*!}yJ%QrbVcEC6|I0N{3LCa?Oq!9;X@qDxEIJvcjDr@^ZR*R} zRA(!iaTl9CpQVry0NUh(y~R+u7K9_(>)}%1MbBg5c>P)MBD92fyYAHe7E5IMi?gmP znb|U+F}Acq0H#tKa&6ze@vV&#OFUt^SI-UXHPnk}SXbmll0YVQy*2&N8BOK}-GAbe zL+#qiO|kNJ6fD!BDMcN|*dml+qRD4z)f;k7Y82}mj&n@8IASxw*HeK8)7;zPEsA>kus#JD`@o#dhkqelBeGS4D3~r*jW2l4$j z#iCqWdVKMs9kP36goSiiPZ}^PHu+{^tE4wuU^V9zvZF%BQa(jtIpp`V2iqEEA~)y5 z9*BO>+cLg+JQOy$E>+xR_u+DF!FWHO*C|R|HHtBt%L1EA-_xU4cgp^+?_G7e>oZYe z5o1mCXr~J+)n1o-j1I?fJuTH@tPB(z=`v4GRjM(7s6+K*gX)SL+sQM9aPEu?Yzi~l z9VZ#W&Ybisq=sc7(f%@f&hNOS50_aTlKi!}D{!jcVw`VAeaOOJYTuKchg0abUOM|V z0&e!$SQ9u#SEA+=t9V5pzchkdrdAiS?l7!RAHoT;dZsH}n~OWOtA9zVnNQku&`eX_ zY^_%&Hd@@GNcQR=*;6x zZVVzdNcq4xUyPyOIb3jH2OrW3HJfLLCEsl45t*-{+ZtQ$6F-}`uPS^9xumA={I7wx zRLa%Bz>U6J&oG*HcZ~S*P`V~p>{xT z^un0bO{Mv0=cu_VIw>2z|Lg+`W6Pdlj?rS4u)f>l4Z#F2XEqq{jsN9tn0qbl%{`Qy z&QecLcIjk0DJp}J4w(TtV~tnD_QkiLWa_N1?qtv3l8{8@n&UOJb2~%tp=u8{nB;DB z?j%c{zoSka$u<<}<@(w7UmdT#VYr_uq}*uKH+lv?de4L7L6&*RV_CY5a21cuzq}vb4817J+VTl9VY*o1`lrKF3Xtf{-8?xj zqZW3awZEjVlX4CiwCluxpa9-LNOSQ^whF)6HO0IbS1u0Ic@~i1JJb!WH`yGxw zr4P3Je$q&8zR{gRx*HRd>wnTVwF4Ou=3Pz`#J^ou^A2e#0|G~enP@}o!aO21DJeSb zj9T()M}zB7MR~#1ztx|M6Cr3JdfxTv-`S|xj<`4CiXFAw*ag+u?PzGuIaJL;m;4IX_x3#a$&ruYb@9!6#b(+z^iZ8 z2VMBzT!Kg5i`L+icIgeNW?hPq0x!-h2U&iVUGl$dK;DN6*SkC>3?Y|Evx8w@X?uw! ziqwUx5V-k9GRfaH(DFr7@31njv`b$|od01S(B2QLQMMP|s5(^OTxUB04J|ApI4*YK zIGb>{dk4WYhek~-a@;e@ghx8ZRPZcl2+dcp7u(p(03(#Pw>y15M38ih%0FMi|Lgt7 zr2uJU-3W0X=$)>Vvx2*7UT3=o&HiomGalB$C4}GZxG&fG7CZ`joO&`4iuG3z8z(UD zLltI@N=ZP^UWPeWdqgO%miGfBYVokY|?kLfu| zDjF92Fq8b}5Q5>TsEED4j|;=jt=%I5J!i_>OAYnr7O|j(#OBAkdEtNkTMYiSthT6w z&LC3>bTY|fX=p)1Vu4ZDG*{%^IZlNhy9p18W#(mKrB5N*?G-PMcHgjp4l+}Jd+={Y z{|!ILKbpI5lSGZGV~5mdSThwYZv3)J`3dd0@bCCAVaR6iJ6 zcuK(tH|Enayn}bQ>4VlSm1-D=aYB{ z$dT_QhT2U?Ef-^BG>;1?IDhOb`e2VAPLfN3&gEOtfkV`C_M->L^>5!=oR%<{vAgi-R@nCI)kvCc04=o@8H&2E*#G@1Vbp zmpd47zA1Y;bnKau$J578Zc>=67(5mOKP9DW`_O0oMH8YajLBkWyi=GDIi@8py+ISj z?-V`igvevR(T(q$udu{=LiVL`XNXt2j{<`U?7te}W=jbOw0*ahbzBWQ_Bp8=E)1K@ z&OVa3w3OShST<~Z>#6sgWe6H%Tds)!L8tmHZOpJY>5j;9k#JK({pZrROxOu_ zMt@G#u)~xE9_ig5D)~7t?if7oVl)}-Xg*Z9N7&KQ^^=vcMEG*R!_BBJO-SWuA$&dk zeYibjWsEJwBUnEl!fu+W-Y{sLqE(muh7(jNUr0kz>iuap2Z+4O5+{^$0_V4~NGg@A zQ#iqf0J-l@ZP5%!!O0);xiG@w=oed~rj?f;T`X+P4|Ecg2o@)NDy1kR-A*!xJ|o>0 zI%b43$W)sxk0@uF>gI0)_i5*_WU6WHM)2AQq7|#LdT2)aJ9E6oFg0Z2M>d!^l-&+z zk50R`w0hXf1#dcdJ@3uQ2_4H^<^CBID>Ab_plcrmU)RA2`)mviBezafGcJ2)H8f;w zXxNtO*Qg}cQeQRDXwzZeJ7BuF0*SIgjglD)1cmKq4EFzR(mI*pQ@W+L}XovI&@pVwBh-(F@mo($6`*bR-@QZ#8+;9EGPNdsMKG~o{&Z2Dro*~9k z;pTG5o2Z;@crNXf-9%M(jVwRN={PKWu5{XE6phB2QuY(OiYs=)0;ExXD_Q)kVCFfb z8?qKXbb!cSK=EDWw+O8mMmz*>Kp*)3FS4fIJmUc8^rx+pm1! zD6ef*QbATl1wTwyj(%swfqzYR;c0eh&m*zY;92jP<4CK+2pO5$_j_NK1zCNZD18&` z-rbX};msukBpILL*KLD6^+(t4vqFDP-M6;dA&n;2F3m(6ufWm+L|z?&lD_k;4UYS3 zhq9I?_SGA5yT_1km@jc6)=zJyv4>AE_GbR}mffJ2rr#HTdb{^@c>8f5#;k0YSVgL9{K!}G%7q$ zL%eAg>CmEtPpYD`x{JpQ67rg@gYN6ELH?lf$rcTt8nPCbouAk6xWov9J|%T(wEiMx zL@hqJxHNYn+I;?Oim9jI0IxxOo=W8t-y{+P<}p_l(@G9rM-I%}AmC9~wU*$wMakz_ ze`PkP>#To!72$HPa|;rP@xUXs{lAUhLoRVPy^CCZCL8ojNOx&{l6lm_zQ+%I;kia~HK^`|C#CKYXKVf_8A zg-+B>Lb;K@t?-h_+nHjQstB*Hu4;z;E1M7nXW+-AMs*J&men-p_FLGX_s`$^oljaW zxGH1R{m5~FzCAup%{F$prLb{}9nx|qtW#40$o^f`xf9*3EV0#Fzr(5fPg2)rvYOTK zY3wCk=B=`E$bm6(f7@{|;SO2V+2;5Cs9KHHl!heb&y?Fz<-U$}$X2I4JxlPo05q#u zoIB~}i1iO9klAje+YyA>Fty_yNEbE{-JDHooi%&UEl|6fQro{6y?tw#2sq1@V+dLU4&(<{3 zU4Gc(VLhopQCV5-tC0|!8~Kc`)zV&%#U^9i7}&IZ``A`))M0Z@L|&TSjaH`dnZS-w z*GL&(RpxV>Eyuo@6*ZM(cN!fM=$*itzE0{q!v}((gEdZW-g6PN$5(eB;oxHE*f8^p zzA!VPmSts}Ai=tt>>+V2?bKOZ-UQ*J2O@aKwi9Y+k~)2#k%!oIqDU*~I50x61{<~k zQ+R->QTFApy86ae=f=A7EP^~RsxJ4+`Gj-KK^J7OndhNhlLju0bub&#Dc~`lF>2pa zLNDHpEeM{TjUc^?Y*G`%?H<%tqGqq+vsZ%!;LOdOnWxz6$6P#@m3_snO^@eUvVN42 zsO89N?O#yEaO_dZ zK64j$WQXJi{BhrhYANExs?LlmvT}fTchuC)IJw_^?d$f4`=3ZLTx1TdwZpB8Pvext zcAlj+J4@SjfxD>>pIw6c5*K|ZCO35f$RMM z?QxMaH@$-&rZr~X!+`T#nm=G=LSZv5APql8%F5c9pji}^7yw}JUb?+4e54Gl1IGtc zUBcSSVI`KCx=hbjnQ#7J{gfP`im1s~U)tIsnwq+o_#Jc1y|)m67ucT?}hLgwinf<9;w-x=%dG5Gj6L znxld0jN~Tp!^l|W&J4A=@4;9(<(z8fFd`%A>JwpfdhSpr?SsBL2y%Nael5DCrlzSe zvG@R^?=SYW(Yy#0jR*^mYUq#^3dn;&X^4K89E zNmt3IQS&%Xgk`Fp)8Gfsj_S-@4OgDG1s}&(@8es^5q)=-pv58I8>Zb_qoid)0nM25 z^ra9?v7K5zUK|3X)Q?ERkO{uLO-GX5#a4+)s(qi?ip8RtzsGy?F5DV<}@k0&ody*w0CY)%U?VmcphWlMsSAFP?A?PHV_NmKBxh{#3A+ z%|_OsLBe!HP&_1Qw#4&C->ruDB6`V^*tCAESKWg#!$lQE+mYHJtKn9elBkwZ;Z{DR zUV&loQC$19zh6~UOQ_}C({1hQJ4E$c&f_74oD+(gvvb*A#4cDvI)ka(pYd^G(mFUJ zX`;l3D(eNjew0&}B>ngd*DKw$HRt=5cLDauIjKUj{V*Z1U*^=qYd!B@90rUV58txz zhD0s-Fs?P3KHP+?ygQLg&mcQD_!I&+5?lDgW%;VF+p!9d9_+t7A%kxt?>wDMOP>J% zuvLF>>&DuoU8lWj%^8K{rIy^sh5b(V-8{plGA#I{v(yoCo;N{Y>=hae>kxoBub$8v zgDc-L_RpcM!B$I_GXR&BUfob$Y*Bvd;TGD3HgKi_*d9RJ2w^RL7uV-$CqJR8x;y15 zN6H`6)hhL#rQ_MFVHxnpK~^lM<|C`@Je6!nIpj`?Pc#(rI{yF&Ii=4hXJ{;ADuteMXy6HD;*!P_!ZM0 zE;T~fr*>A+K#R)%y_L;GYsAR{BH82z;BY<9tc>ETj`eft)W!3&Pgo*2Tyq!_dH== z0bdf*8lRke_hGV7i+o7q>-IPJxmUYuXdO%#uGytET`SwWZV&HZmiNKuU%}+@j{^HY zXO^s`nck5j8oxyQ5VtmCpZc>QPu^0#T^i#S22>1QWLjeUUFU8yc?-;8cF}DWUIPOTxN` zM>ZvTNjA~TAe8Qcsj!$tAh!smWp#gU-a+f$_vCb~uaVp`GN`sdkKfI$%)B&qwJdx4 zZ?JN94>nFqTe@vUy(jC=bSdDP1>G8aa34gBy4UbXiLD)+L$)a zXhsP}$ z{MyH3TL&LstHcI|3@#ESUgZK=zx8S%IS@uDwp|@TR$V=PPEN_b?E64I+;sU9NhI>} zPWs82pqmzQ#)42Z^!gH9G1?;4GS&F_y)w`7`KrqD`_Zu>eM96KZ*GqB>LW2j+N{zI z)EJZnx@G68aA6)8U3*ruqn^blyN4LBHA&S)xCO`rUNtsthH@Y`Vfad7cD`{8HwK_B z(KHYv->b->?w}jf-@9EL7#-4-(+{SxadL0_nQb!waVSa)hfyTeXkw+u&Ml;4L6Y`O zyjSPv^H96qk+x35z3wblUSy|me4(CBM1~>CbEK3C4EHB8iJm*pTGoI9Tb~uUw zTyFdd{AWQIx>kG$H5QwlIziN{+aqmuFqa=!jYnItA0fAd`-C%bTi!6U3RmxUDwH*b z6d!`1$L(IDfD;z_Nm9b)@oj`+s~gl>=rYDh_rHk`uv{avJ8uGW-65=d`k+>s{I1kX z{o=f&jlQE-r!CY_l*O{Z%UknBeJpbT2gDqO-KyJFv13^{9_b4ZTAXI?t6CUcxi^6j zalF3*|KxFygAAptVNgb74$v0<{?zci1wC zKhv zXR(#fkoHu;%R=mxL>?rgGJe~rGb|_{aepb)B zBo{208b0i#Z}VLKTC0b9SDls5mYuPjwQh4?oYv^qF|0-zRK{apZ6UoTX6o%DGhx)dltQwUOZ+ipEh5Rt;UU!4>G!VB^GUX zh(B!7KxNi6G5Q5XCUc&Ij$z<_E2&&rn$D<+y67ClOrblbp%=Z^`pao87{Wf(KH`-5 zYaBqk@hX#z$$F#j;z&Xy^v{F31XjTDO-?AP5)OQoMSE`A(bot*Nt>`h*Mo=fr~- z{Cl3P`9pYn%;=h;tI`2SYPdPq20`?uNQY+Ii3(ax5h+ag+?(n%4vwWWuLy=sjiD7Q zfnJ8SoJcuhP?f#I+ER{(qwsV8ViA~*ChN27gw(w6WcAc@C*(BKm~3RGKpRHd3DR9Q z!xO>}0K&0+A@a*{)y@_;!%y!Qv7wO2U}%%xC%eh;2-J7f4pfS0z3#20hg4np12ys) z&})1&_Uux&h98>MeW%s{pW=h*gY$<}eKx}1|4zFce955U#Gl>s-6@w4dg|py0AM|x zQlaw8b{ZC`5`Gw!s-7@2vp^3nF3#<-9jVjwZ1r78)Se$Jj@T7-UFT(cF%n^?UE@nxR%$;oR_^tkit}=$DZEALxKZ%iE9->bszA8Rm(Duyv+4~x} z_CR1-SZj@ut>M!kt8)*b_4fiIPk}#5#=Uey1KA(j7o3x(S1VY$MG}gr<@dnP7GUj& zy{8@9!-&VXUc3|GUUvlT1 zC!`iF@pV1T!Z^j-`$nE zmHF(tnJPh*R*d$@%1rtt)}3`p)>Z+lObiqG=75~4mEPPc28&GtR%emtaNjm^jP+^%G>VhT2w|15M+}>c;Hz&Z*N=Zl z8StuV;zV3-;(@MKzde{bO@+}04KmIjgv~x*#*%x>M_XXjN#p_4+r50!A5ufCzc1cM z)(u%z=g#PS=N5m$DsK0ut+^vcI;$5UOn=@k8z5zR<-7!sK;XP5%DB(M)XMW#4+UUW zl2=vtE=+OgSSXCjA3UKOS!!Om@Txd4U~VG;A}u)1JgE?bL0pr7C}5@9G0v9L5CgZB z5Msq-*i}RW8hemI2GJx`PVadM;Qze3YK|r?4)gcm}_HJ-m--RksMxM8?T? z+w=xmvF+=zwKCc;pQE67Fxe{?tYJwVHX4ex?xXfU%$dcy%pL=m7S?O#5M$2q48+b! z-=Vy&I=@=kbJ&VC=uT$l(J3SS+OuI}+S`3JpoJUs6oogI17O zj|7p>Y;$C3hEhhkWfnHt7!#i$lLKgl+kJ!kR=bXADNzCFHe4GuP!kYr90nJGu5Fi$ z96B_*Sn=c&}-C7Mvkgguyf>=(j26J z2yxbMUa^bl^s}G&Yi2{@eI7esoh=DrKU;(Gq8RwCdunsdH2fQnDx3A(Ah$r*Np+x4 zJy*AQq{SRjJpsEh@n&JzI{+*LwAb2EyO2h5O!g2RqG#k3$ixOigiL3AIEU?DPx2RH@k~!?3+BsFJ@9NdIt_L{**fcf^NnRxMaH z)6LtN%LxwWVqh9mA2h*r)0ru(F@OWBXNS-H23l;z^(K$D;ri!|Ko$`PT@XYBzSd2c z@LKuzExHZ|S2k$vKX{M7AS#?av@*Zhc|e*{#Vqa8G!GlA4D3R3Hp#6`A~m)taj_cV zzEwH1L|YMF`UY)bMNJj4Wper-mfMAyLzziR3Hic9g1B{+$|`gz&{h2{aFKC(D(9FS z%C&3@W60KS>t1)EL=^)sf;9UJ93ck75NdEy8gOM!7kes}YA@#s;$_g4h@K;N5H8l{ zA3y*5ioNt4Q9-_{T8h+TWHrm)Leu}SGS>-JoH7Gzap_;W)dg2#B7 zkOhF`Efe(5AANf2SLNE26&vbjXL4kP!1qg&3_EbyaBSBnB0wB(5PUe?Oqu{;!oAgZpJ& z#_0g}+1vNE$^Xyy5mE4%RLel<_6y0jIt7@XUlJYSkv6pozIEo?)U*6gYZH@$QhJJ< zO-Ix6m2X0jCg6ub2j!i=? zykSy}fJ~2@E&M)5ijc68OtDkAdYsC?q`kbI+westAiT3K`W5xT`NXD}R=zH!o2?#7 zy|32>ZgXMMO@5u2w+yPJH^nzvMXHTJ{AT-pp-j&i!Ys9IKCB^Y2asoYLlZ(P~@-qKNx;-@-Qro<;rsBi=sn8hAcu0-$tV=`X}M61TR7)GZ5M;_^V zLDlP>8uP60lcY#V!D^$qWQbBCUDuwMlo2incpkj+Cc8ErOmaavf7>DNkXC8{ft=IM z(mcG#?dC4nhP=P=j!nyf+s{tQU&Np*=fcCW-YB*83=m$^}z^|1z)F6*cUF;Kh}cP`m0E zbe(+>;%*NhRSSmjUkakGXt)*Rtrw$8{Z6YL{XAp7H()B%-8^HVN-mq+wm?)YxiWvhbLbkCizt0n5==Wx8&fbsO0SfM{?uqz9-!3cy1$QTwH1+YE2i0_~g~Sp~Dt|*NzV`>z zS*y1!qU~VXr4oHmJt%)o^i(n=fl2-x)3VvP*Hu1z(t6W1d%d8pv$yy)6vubF5$ZV+ z$WxPr15h2)4a2WO7oU9FQ?HMVPj++Q^HjXbTBS#7A$VG*-;@tIIKB&u`SP zmX&MM4SL~TM_iYSA8zU8nMv9}j6`hy$zEYQ*2y(t$@5>iE*^>P-03{R=Ct9BRI=vV SQ3rZ({H}NXa{k4;kN*!m*bcJ* diff --git a/docs/developer.md b/docs/developer.md index 3802081cd..19785e5c7 100644 --- a/docs/developer.md +++ b/docs/developer.md @@ -3,7 +3,6 @@ title: Developer Guide layout: default nav_order: 2 has_children: true -parent: "" --- # Developer Guide diff --git a/docs/developer/adding-a-feature-module.md b/docs/developer/adding-a-feature-module.md index e2bc3634d..ae290dbda 100644 --- a/docs/developer/adding-a-feature-module.md +++ b/docs/developer/adding-a-feature-module.md @@ -23,15 +23,10 @@ mkdir -p feature/my-feature/src/{commonMain,commonTest,androidMain,jvmMain,iosMa ```kotlin plugins { alias(libs.plugins.meshtastic.kmp.feature) - alias(libs.plugins.meshtastic.kotlinx.serialization) - id("meshtastic.kmp.jvm.android") } kotlin { - android { - namespace = "org.meshtastic.feature.myfeature" - androidResources.enable = false - } + androidLibrary { withHostTest { } } sourceSets { commonMain.dependencies { @@ -82,8 +77,8 @@ class FeatureMyFeatureModule ## 5. Register DI in App/Desktop Add your module to: -- `app/src/main/kotlin/org/meshtastic/app/di/AppKoinModule.kt` -- `desktop/src/main/kotlin/org/meshtastic/desktop/di/DesktopKoinModule.kt` +- `androidApp/src/main/kotlin/org/meshtastic/app/di/AppKoinModule.kt` +- `desktopApp/src/main/kotlin/org/meshtastic/desktop/di/DesktopKoinModule.kt` ## 6. Add Navigation Routes diff --git a/docs/developer/architecture.md b/docs/developer/architecture.md index c3d5395ff..8d1bacc1b 100644 --- a/docs/developer/architecture.md +++ b/docs/developer/architecture.md @@ -16,7 +16,7 @@ The Meshtastic Android/Desktop/iOS application follows a modular Kotlin Multipla ``` ┌─────────────────────────────────────────────┐ -│ app / desktop │ Platform entry points +│ androidApp / desktopApp │ Platform entry points ├─────────────────────────────────────────────┤ │ feature/* modules │ UI + Business Logic ├─────────────────────────────────────────────┤ @@ -28,7 +28,7 @@ The Meshtastic Android/Desktop/iOS application follows a modular Kotlin Multipla ## Module Categories -### `app/` — Android Application +### `androidApp/` — Android Application The Android application entry point: - Activity, Application, and Manifest definitions @@ -36,13 +36,13 @@ The Android application entry point: - Flavor-specific bindings (`google/`, `fdroid/`) - Android-only integrations (widgets, services) -### `desktop/` — Desktop JVM Application +### `desktopApp/` — Desktop JVM Application The Desktop (Linux/macOS/Windows) entry point: - Compose Desktop window management - Desktop-specific DI (`DesktopKoinModule`) - Platform stubs for Android-only capabilities -- Serial transport implementation +- BLE (Kable), Serial, and TCP transport implementations ### `feature/*` — Feature Modules diff --git a/docs/developer/codebase.md b/docs/developer/codebase.md index 045223dfa..9f67c6e97 100644 --- a/docs/developer/codebase.md +++ b/docs/developer/codebase.md @@ -16,11 +16,11 @@ Repository layout, namespacing conventions, and build system overview. ``` Meshtastic-Android/ -├── app/ # Android application module +├── androidApp/ # Android application module │ ├── src/main/ # Shared Android code │ ├── src/google/ # Google Play flavor (Gemini, proprietary) │ └── src/fdroid/ # F-Droid flavor (FOSS-only) -├── desktop/ # Desktop JVM application +├── desktopApp/ # Desktop JVM application ├── feature/ # Feature modules (KMP) │ ├── intro/ │ ├── messaging/ @@ -33,22 +33,27 @@ Meshtastic-Android/ │ ├── wifi-provision/ │ └── widget/ ├── core/ # Core infrastructure modules (KMP) +│ ├── api/ +│ ├── barcode/ +│ ├── ble/ │ ├── common/ -│ ├── navigation/ -│ ├── ui/ -│ ├── resources/ -│ ├── model/ │ ├── data/ │ ├── database/ │ ├── datastore/ -│ ├── prefs/ -│ ├── repository/ -│ ├── service/ │ ├── di/ +│ ├── domain/ +│ ├── model/ +│ ├── navigation/ │ ├── network/ -│ ├── ble/ +│ ├── nfc/ +│ ├── prefs/ │ ├── proto/ -│ └── testing/ +│ ├── repository/ +│ ├── resources/ +│ ├── service/ +│ ├── takserver/ +│ ├── testing/ +│ └── ui/ ├── build-logic/ # Convention plugins and build helpers │ └── convention/ ├── docs/ # Documentation source (markdown) @@ -115,7 +120,7 @@ Located in `build-logic/convention/src/main/kotlin/org/meshtastic/buildlogic/`: ./gradlew assembleGoogleDebug assembleFdroidDebug # Desktop run -./gradlew :desktop:run +./gradlew :desktopApp:run ``` ## Version Catalog Highlights diff --git a/docs/developer/contributing.md b/docs/developer/contributing.md index 7783fac1a..f5d0bbaf6 100644 --- a/docs/developer/contributing.md +++ b/docs/developer/contributing.md @@ -14,15 +14,26 @@ Guidelines for contributing to the Meshtastic Android/Desktop/iOS project. ## Branch Naming -Feature branches follow the pattern: -``` -{issue-number}-{short-description} -``` +Branches use conventional-commit style prefixes: + +| Prefix | Use for | +|--------|---------| +| `feat/` | New user-visible behavior | +| `fix/` | Bug fixes | +| `refactor/` | Code structure changes | +| `chore/` | Tooling, deps, CI, cleanup | +| `docs/` | Documentation only | +| `build/` | Build system changes | +| `ci/` | CI workflow changes | +| `test/` | Test additions or fixes | +| `deps/` | Dependency updates | + +Numeric spec prefixes (e.g., `003-app-docs-markdown`) are also valid for spec-driven work. Examples: -- `003-app-docs-markdown` -- `001-local-mesh-discovery` +- `feat/desktop-ble-transport` - `fix/bluetooth-reconnect` +- `003-app-docs-markdown` ## Development Workflow diff --git a/docs/developer/navigation-and-deep-links.md b/docs/developer/navigation-and-deep-links.md index 08622c60a..c86afdf85 100644 --- a/docs/developer/navigation-and-deep-links.md +++ b/docs/developer/navigation-and-deep-links.md @@ -24,7 +24,7 @@ interface Graph : Route // Graph roots for navigation hierarchies @Serializable sealed interface SettingsRoute : Route { - @Serializable data class SettingsGraph(val destNum: Int?) : SettingsRoute, Graph + @Serializable data class Settings(val destNum: Int? = null) : SettingsRoute, Graph @Serializable data object DeviceConfiguration : SettingsRoute @Serializable data object HelpDocs : SettingsRoute @Serializable data class HelpDocPage(val pageId: String) : SettingsRoute @@ -54,7 +54,7 @@ meshtastic://meshtastic/{path} | URI Path | Route | Notes | |----------|-------|-------| -| `/settings` | `SettingsRoute.SettingsGraph(null)` | Settings root | +| `/settings` | `SettingsRoute.Settings(null)` | Settings root | | `/settings/helpDocs` | `SettingsRoute.HelpDocs` | Docs browser | | `/settings/helpDocs/{pageId}` | `SettingsRoute.HelpDocPage(pageId)` | Specific doc page | | `/settings/help-docs` | `SettingsRoute.HelpDocs` | Compatibility alias | @@ -70,7 +70,7 @@ Deep links synthesize a full backstack, not just the target screen: ```kotlin // /settings/helpDocs/messages-and-channels produces: listOf( - SettingsRoute.SettingsGraph(null), + SettingsRoute.Settings(null), SettingsRoute.HelpDocs, SettingsRoute.HelpDocPage("messages-and-channels"), ) @@ -90,9 +90,9 @@ This ensures the user can navigate "up" correctly. Each feature module provides entries via an extension function: ```kotlin -fun EntryProviderScope<*>.docsEntries(backStack: NavBackStack) { +fun EntryProviderScope.docsEntries(backStack: NavBackStack) { entry { DocsBrowserScreen(backStack) } - entry { DocsPageRouteScreen(it.pageId, backStack) } + entry { route -> DocsPageRouteScreen(route.pageId, backStack) } } ``` @@ -105,17 +105,5 @@ Deep link routing is tested in: core/navigation/src/commonTest/kotlin/org/meshtastic/core/navigation/DeepLinkRouterTest.kt ``` -Example: -```kotlin -@Test -fun `help docs deep link routes correctly`() { - val result = DeepLinkRouter.route(CommonUri.parse("meshtastic://meshtastic/settings/helpDocs")) - assertEquals( - listOf(SettingsRoute.SettingsGraph(null), SettingsRoute.HelpDocs), - result, - ) -} -``` - --- diff --git a/docs/developer/persistence.md b/docs/developer/persistence.md index 9b42538e9..4f1f1f472 100644 --- a/docs/developer/persistence.md +++ b/docs/developer/persistence.md @@ -35,20 +35,30 @@ The primary structured data store: | Entity | Description | |--------|-------------| -| Nodes | All known mesh nodes and metadata | -| Messages | Message history (channel and direct) | -| Waypoints | Shared geographic points | -| Telemetry | Device, environment, power metrics | -| Channels | Channel configurations | +| `NodeEntity` | All known mesh nodes and their metadata | +| `MyNodeEntity` | The local node's own info | +| `Packet` | Message history (channel and direct), waypoints, and telemetry data | +| `ContactSettings` | Per-contact mute and read-state | +| `ReactionEntity` | Emoji reactions on messages | +| `MeshLog` | Raw mesh protocol logs | +| `MetadataEntity` | Device metadata (firmware version, hardware model) | +| `QuickChatAction` | User-configured quick-chat messages | +| `DeviceHardwareEntity` | Cached device hardware catalog | +| `FirmwareReleaseEntity` | Cached firmware release info | +| `TracerouteNodePositionEntity` | Traceroute hop position data | + +> 💡 **Note:** Waypoints, telemetry, and channel data are stored within the `Packet` entity (using the `port_num` field to distinguish packet types) rather than in separate tables. ## DataStore Preferences **Module:** `core:datastore` For lightweight key-value preferences: -- Connection state -- Last connected device -- UI preferences +- Local radio configuration (LocalConfig proto) +- Module configuration (ModuleConfig proto) +- Channel set data +- Local statistics +- Recently connected device addresses ## Core Prefs diff --git a/docs/developer/testing.md b/docs/developer/testing.md index 816ab6527..d1ed344fc 100644 --- a/docs/developer/testing.md +++ b/docs/developer/testing.md @@ -55,12 +55,12 @@ Located in `commonTest` or `jvmTest` source sets. ### Screenshot Tests -Preferred: **Roborazzi** (Gradle-native, Ubuntu CI compatible) -Fallback: **Paparazzi** (Android-view-centric) +Uses Android Gradle Plugin's native screenshot testing framework: ```bash -./gradlew recordDocsScreenshots # Record golden images -./gradlew verifyDocsScreenshots # Compare against goldens +./gradlew :screenshot-tests:updateDebugScreenshotTest # Record golden images +./gradlew :screenshot-tests:validateDebugScreenshotTest # Compare against goldens +./gradlew :screenshot-tests:copyDocsScreenshots # Copy reference images to docs pipeline ``` ## Test Organization diff --git a/docs/developer/transport.md b/docs/developer/transport.md index 15467f0ba..82faaa269 100644 --- a/docs/developer/transport.md +++ b/docs/developer/transport.md @@ -24,9 +24,9 @@ App ← RadioController → Transport (BLE | Serial | TCP) ## Bluetooth Low Energy (BLE) **Module:** `core:ble` -**Platforms:** Android, (planned: iOS) +**Platforms:** Android, Desktop (JVM via Kable), iOS (planned) -The primary transport for Android mobile devices: +The primary transport for mobile devices and also available on desktop: - Service discovery for Meshtastic GATT services - Characteristic-based read/write for protobuf packets - Connection state management and automatic reconnection @@ -35,7 +35,7 @@ The primary transport for Android mobile devices: ### Key Classes - `core/ble/` — BLE scanning, connection, and GATT operations -- Platform-specific implementations in `androidMain` +- Platform-specific implementations in `androidMain` and `jvmMain` (Kable) ## USB Serial @@ -51,7 +51,7 @@ Serial communication over USB: ### Key Classes - Serial prober and transport factory in `core/network` -- Desktop-specific serial in `desktop/src/main/kotlin/.../radio/` +- Desktop-specific serial in `desktopApp/src/main/kotlin/.../radio/` ## TCP/IP @@ -70,13 +70,17 @@ The `RadioTransportFactory` interface abstracts transport creation: ```kotlin interface RadioTransportFactory { - fun createTransport(config: TransportConfig): RadioTransport + val supportedDeviceTypes: List + fun createTransport(address: String, service: RadioInterfaceService): RadioTransport + fun isMockTransport(): Boolean + fun isAddressValid(address: String?): Boolean + fun toInterfaceAddress(interfaceId: InterfaceId, rest: String): String } ``` Platform-specific implementations: - **Android:** Supports BLE + USB + TCP -- **Desktop:** Supports USB + TCP (no BLE) +- **Desktop:** Supports BLE (Kable) + USB + TCP - **iOS:** Planned BLE + TCP ## Connection Lifecycle diff --git a/docs/translations.md b/docs/translations.md index 347d70d00..feda7aaa5 100644 --- a/docs/translations.md +++ b/docs/translations.md @@ -10,14 +10,17 @@ This documentation is translated by the community via [Crowdin](https://crowdin. ## Available Languages +{% assign any_locale_exists = false %} {% for locale in site.data.locales %} {% assign locale_code = locale[0] %} {% assign locale_info = locale[1] %} -{% assign locale_index = locale_code | append: "/index.md" %} +{% assign locale_prefix = locale_code | append: "/" %} {% assign has_content = false %} {% for p in site.pages %} - {% if p.path contains locale_code %} + {% assign page_path_check = p.path | slice: 0, locale_prefix.size %} + {% if page_path_check == locale_prefix %} {% assign has_content = true %} + {% assign any_locale_exists = true %} {% break %} {% endif %} {% endfor %} @@ -27,19 +30,6 @@ This documentation is translated by the community via [Crowdin](https://crowdin. {% endif %} {% endfor %} -{% comment %} Show notice if no translations exist yet {% endcomment %} -{% assign any_locale_exists = false %} -{% for locale in site.data.locales %} - {% assign locale_code = locale[0] %} - {% for p in site.pages %} - {% if p.path contains locale_code %} - {% assign any_locale_exists = true %} - {% break %} - {% endif %} - {% endfor %} - {% if any_locale_exists %}{% break %}{% endif %} -{% endfor %} - {% unless any_locale_exists %} > No translations available yet. Want to help? [Join our Crowdin project →](https://crowdin.com/project/meshtastic-android) {% endunless %} diff --git a/docs/user.md b/docs/user.md index 72fcfbf5b..1b88fac94 100644 --- a/docs/user.md +++ b/docs/user.md @@ -3,7 +3,6 @@ title: User Guide layout: default nav_order: 1 has_children: true -parent: "" --- # User Guide diff --git a/docs/user/connections.md b/docs/user/connections.md index 574433b50..0f69adb81 100644 --- a/docs/user/connections.md +++ b/docs/user/connections.md @@ -80,25 +80,36 @@ Some Meshtastic radios support WiFi connectivity, allowing TCP-based connections 3. Enter the radio's IP address and port (default: 4403). 4. Tap **Connect**. +![WiFi scanning for devices](/assets/screenshots/connections_wifi_scanning.png) + +When a device is found, it appears in the connection list: + +![WiFi device found](/assets/screenshots/connections_wifi_device_found.png) + +A successful connection is confirmed with a status indicator: + +![WiFi connection success](/assets/screenshots/connections_wifi_success.png) + ### When to Use TCP - Radio is on the same local network - Testing with a simulated radio - Environments where Bluetooth has interference issues -## Connection Priority +## Reconnection Behavior -The app attempts connections in this order: -1. Last successful Bluetooth device -2. USB (if detected) -3. Manual TCP (if configured) +The app reconnects to the **last selected device** on startup. You can manually switch transports from the connections screen at any time. + +To disconnect from a radio, use the disconnect button on the connections screen: + +![Disconnect from radio](/assets/screenshots/connections_disconnect.png) ## Desktop Connections On Desktop (Linux/macOS/Windows), the app supports: -- **USB Serial** — primary connection method +- **Bluetooth (BLE)** — via the Kable library; works on macOS, Linux, and Windows +- **USB Serial** — primary wired connection method - **TCP/IP** — for network-connected radios -- Bluetooth is **not** currently supported on Desktop See [Desktop App](desktop) for platform-specific details and keyboard shortcuts. diff --git a/docs/user/desktop.md b/docs/user/desktop.md index 2734b9ab3..8921fcb3f 100644 --- a/docs/user/desktop.md +++ b/docs/user/desktop.md @@ -24,7 +24,7 @@ The Desktop app shares its core codebase with the Android app through Kotlin Mul ### Linux - Download the `.deb` or `.AppImage` package from the releases page -- Or build from source using `./gradlew :desktop:run` +- Or build from source using `./gradlew :desktopApp:run` ### macOS @@ -53,9 +53,13 @@ For network-connected radios: 1. Enter the radio's IP address and port (default: 4403). 2. Click **Connect**. -### Bluetooth +### Bluetooth (BLE) -> ⚠️ **Note:** Bluetooth is not currently supported on the Desktop app. Use USB or TCP connections. +Bluetooth Low Energy is supported on Desktop via the [Kable](https://github.com/JuulLabs/kable) library: + +1. Ensure your system has a Bluetooth adapter. +2. The app scans for nearby Meshtastic radios automatically. +3. Select your device from the connections screen. ## Feature Parity @@ -65,7 +69,7 @@ For network-connected radios: | Node List | ✓ | ✓ | Full parity | | Map | ✓ | ✓ | Full parity | | Settings | ✓ | ✓ | Full parity | -| Bluetooth | ✓ | ✗ | USB/TCP on desktop | +| Bluetooth (BLE) | ✓ | ✓ | Via Kable on desktop | | Firmware Update OTA | ✓ | ✗ | Use web flasher | | Notifications | ✓ | ✓ | Native OS notifications | | Widgets | ✓ | ✗ | Android-only | @@ -99,13 +103,27 @@ The Desktop app uses the same Compose Multiplatform UI with adaptations for larg The Desktop app provides in-app toggles for controlling which notifications are shown — messages, new nodes, and low battery alerts. Access these from **Settings → Notifications** within the app. +## Built-in Documentation Browser + +The Desktop app includes a built-in documentation browser for quick access to help content without leaving the application. + +![Docs browser with table of contents](/assets/screenshots/docs-browser_toc.png) + +The browser supports full-text search across all documentation: + +![Searching the docs browser](/assets/screenshots/docs-browser_search.png) + +Individual doc pages render with full formatting: + +![A documentation page](/assets/screenshots/docs-browser_page.png) + ## Building from Source ```bash git clone https://github.com/meshtastic/Meshtastic-Android.git cd Meshtastic-Android git submodule update --init -./gradlew :desktop:run +./gradlew :desktopApp:run ``` Requirements: @@ -114,10 +132,10 @@ Requirements: ## Known Limitations -- No Bluetooth support - No OTA firmware updates (use web flasher) - Some Android-specific features (widgets, specific notification channels) are unavailable - Performance may vary on low-spec hardware running Compose Desktop +- BLE bonding is not yet supported on desktop (pairing works without bonding) ## Related Topics diff --git a/docs/user/discovery.md b/docs/user/discovery.md index 55c5d8d34..7a0fba364 100644 --- a/docs/user/discovery.md +++ b/docs/user/discovery.md @@ -96,7 +96,7 @@ The node list itself is a powerful discovery tool when you use its filtering and ### Infrastructure Audit -- Disable **Exclude infrastructure** to see Router, Repeater, and Router Client nodes. +- Disable **Exclude infrastructure** to see Router, Repeater, Router Late, and Client Base nodes. - Check their signal quality and last-heard times to verify your infrastructure nodes are healthy. See [Nodes](nodes) for full details on filtering and sorting options. diff --git a/docs/user/firmware.md b/docs/user/firmware.md index 05fc04169..0b0697ca4 100644 --- a/docs/user/firmware.md +++ b/docs/user/firmware.md @@ -78,6 +78,8 @@ If the update appears frozen: - If truly stuck, power-cycle the radio - Attempt the update again +![Firmware update error](/assets/screenshots/firmware_error.png) + ### Device Won't Boot After Update If your device fails to boot: diff --git a/docs/user/messages-and-channels.md b/docs/user/messages-and-channels.md index 80a7195e5..0f8ed3175 100644 --- a/docs/user/messages-and-channels.md +++ b/docs/user/messages-and-channels.md @@ -42,6 +42,8 @@ Channels support multiple encryption levels: 3. Configure the channel name and encryption key. 4. Share the channel URL/QR code with others who need access. +Tapping a channel shows its details and sharing options. + ## Direct Messages Direct messages (DMs) are point-to-point encrypted communications between two specific nodes. @@ -57,8 +59,11 @@ Direct messages (DMs) are point-to-point encrypted communications between two sp | State | Icon | Meaning | |-------|------|---------| | Queued | ⏳ | Message waiting to be sent | -| Sent | ✓ | Message transmitted to mesh | +| En route | ✓ | Delivered to the radio, awaiting acknowledgment | | Delivered | ✓✓ | Acknowledgment received from recipient | +| Received | ✓ | Message received from the mesh (incoming) | +| S&F Routing | 🔗 | Store & Forward: message being routed through an S&F node | +| S&F Confirmed | 🔗 | Store & Forward: delivery confirmed via S&F node | | Error | ✗ | Delivery failed after retries | ### Delivery Errors @@ -92,9 +97,7 @@ Pre-configured messages for rapid communication: ![Quick chat option](/assets/screenshots/messages_quick_chat.png) -The channel list shows each channel with its latest message preview: - -![Channel list item showing channel name and last message](/assets/screenshots/messages-and-channels_channel_list.png) +The channel list shows each channel with its latest message preview. ### Message Bubbles diff --git a/docs/user/mqtt.md b/docs/user/mqtt.md index f79bffc3e..94c4c9db1 100644 --- a/docs/user/mqtt.md +++ b/docs/user/mqtt.md @@ -2,7 +2,7 @@ title: MQTT nav_order: 11 last_updated: 2026-05-13 -description: Bridge your mesh to the internet — MQTT broker setup, encryption layers, JSON output, and map reporting. +description: Bridge your mesh to the internet — MQTT broker setup, encryption layers, and map reporting. aliases: - mqtt - internet-bridge @@ -46,7 +46,7 @@ A gateway node with internet access (WiFi or Ethernet) publishes mesh messages t | Password | Broker authentication | large4cats | | Root Topic | Base topic for messages | msh | | Encryption | Encrypt MQTT payload | Enabled | -| JSON Output | Publish JSON alongside protobuf | Disabled | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON packet support has been removed from firmware; this field is ignored | Disabled | | TLS | Secure connection to broker | Disabled | | Map Reporting | Report position to public map | Disabled | @@ -83,14 +83,13 @@ Configure per-channel which directions are active to control message flow and ai ## Message Formats -MQTT supports two message formats: +MQTT uses protobuf message format: | Format | Description | Use case | |--------|-------------|----------| -| **Protobuf** (default) | Binary Meshtastic protobuf encoding | Node-to-node mesh bridging | -| **JSON** | Human-readable JSON encoding | Home automation, logging, custom integrations | +| **Protobuf** | Binary Meshtastic protobuf encoding | Node-to-node mesh bridging | -When **JSON Output** is enabled, the gateway publishes both protobuf and JSON versions of each message to separate topics. +> ⚠️ **Note:** JSON output support was removed from firmware. The `json_enabled` setting is still visible in the app for legacy compatibility but has no effect on current firmware versions. ## Encryption & Privacy diff --git a/docs/user/nodes.md b/docs/user/nodes.md index b66a94b6e..ec5f2ebd9 100644 --- a/docs/user/nodes.md +++ b/docs/user/nodes.md @@ -39,11 +39,13 @@ Nodes can be configured with different roles that affect their mesh behavior: | Role | Description | |------|-------------| | Client | Standard end-user device | +| Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | | Client Mute | Receives but doesn't retransmit | | Client Hidden | Like Client Mute, plus hides from node list | | Router | Prioritizes message forwarding; stays awake to relay | -| Router Client | Routes and operates as a client | -| Repeater | Retransmits only; no user interface | +| Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | +| ~~Router Client~~ | ⚠️ **Deprecated** (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | +| ~~Repeater~~ | ⚠️ **Deprecated** (removed in firmware 2.7.11) — no longer selectable; use Router instead | | Tracker | Optimized for position reporting at regular intervals | | Sensor | Optimized for telemetry reporting | | TAK | Interoperates with TAK systems (sends/receives CoT) | @@ -55,9 +57,9 @@ Nodes can be configured with different roles that affect their mesh behavior: Most users should keep the default **Client** role. Consider a different role when: - **Router** — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don't use Router on battery-powered handheld devices. -- **Router Client** — Like Router, but the device is also used as a personal client. Good for a home base station that you also send messages from. +- **Router Late** — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. +- **Client Base** — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. - **Client Mute** — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only devices or to reduce congestion in dense areas. -- **Repeater** — A dedicated relay node with no screen or user interaction. Optimized purely for forwarding; lowest power consumption of the relay roles. - **Tracker** — An unattended device whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. - **Sensor** — An unattended device reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. - **TAK / TAK Tracker** — Only needed if interoperating with ATAK/WinTAK systems. See [TAK Integration](tak) for details. @@ -100,7 +102,7 @@ Type in the search field to filter nodes by name or short name. The filter updat | **Only online** | Show only nodes heard within the last 15 minutes | | **Only direct** | Show only nodes with direct (non-relayed) connections | | **Include unknown** | Show nodes that haven't sent user info yet | -| **Exclude infrastructure** | Hide infrastructure-role nodes (Router, Repeater, Router Client) | +| **Exclude infrastructure** | Hide infrastructure-role nodes (Router, Repeater, Router Late, Client Base) | | **Exclude MQTT** | Hide nodes heard only via MQTT internet bridge | | **Show ignored** | Show nodes you've previously dismissed or muted | diff --git a/docs/user/settings-module-admin.md b/docs/user/settings-module-admin.md index c866ef08f..5cd31e7a7 100644 --- a/docs/user/settings-module-admin.md +++ b/docs/user/settings-module-admin.md @@ -21,6 +21,10 @@ Module settings use a card-based layout with toggle switches, dropdowns, text fi ![Dropdown selector](/assets/screenshots/settings_dropdown.png) +![Text field](/assets/screenshots/settings_text_field.png) + +![Settings card layout](/assets/screenshots/settings_titled_card.png) + ## Module Configuration ### MQTT Module @@ -34,7 +38,7 @@ Bridges mesh messages to and from an MQTT broker for internet connectivity. This | Username | Authentication username | | Password | Authentication password | | Encryption | Encrypt MQTT payloads | -| JSON Output | Also publish in JSON format | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON support removed from firmware; field is ignored | | TLS | Use secure connection | | Root Topic | Base MQTT topic path | | Map Report | Publish position for public map | @@ -112,7 +116,7 @@ Pre-configured messages accessible from the device's physical buttons (for radio | Setting | Description | |---------|-------------| -| Enabled | Activate canned messages | +| ~~Enabled~~ | ⚠️ **Deprecated** — current firmware may ignore this toggle | | Messages | Newline-separated list of messages | | Send Bell | Play bell sound on send | | Rotary Encoder | Enable rotary encoder input | diff --git a/docs/user/settings-radio-user.md b/docs/user/settings-radio-user.md index 7bed4a4d8..f2bd9e2d8 100644 --- a/docs/user/settings-radio-user.md +++ b/docs/user/settings-radio-user.md @@ -28,8 +28,6 @@ Configure your radio hardware and user identity parameters. After modifying settings, tap **Save** to write the configuration to your radio. The device may reboot to apply changes. -![Settings appearance section](/assets/screenshots/settings-radio-user_lora_config.png) - ## Radio Configuration ### Device Config @@ -37,8 +35,6 @@ After modifying settings, tap **Save** to write the configuration to your radio. | Setting | Description | Default | |---------|-------------|---------| | Role | Node behavior (Client, Router, etc.) | Client | -| Serial Output | Enable serial console output | Disabled | -| Debug Log | Enable verbose debug logging | Disabled | | Rebroadcast Mode | How the node retransmits messages | All | | Node Info Broadcast (s) | Interval for broadcasting node info | 10800 | | Double-tap Button | Action for double-tap button press | Disabled | @@ -62,11 +58,18 @@ After modifying settings, tap **Save** to write the configuration to your radio. |--------|-------|-------|-----------|----------| | Short Turbo | ~1 km | 21.9 kbps | −5 dB | Dense urban with line-of-sight; data-heavy applications | | Short Fast | ~3 km | 10.9 kbps | −7.5 dB | Urban neighborhoods; buildings within a few blocks | +| Short Slow | ~5 km | 5.5 kbps | −10 dB | Suburban short-range; moderate building density | | Medium Fast | ~5 km | 5.5 kbps | −10 dB | Suburban areas; moderate building density | +| Medium Slow | ~8 km | 1.1 kbps | −12.5 dB | Suburban/rural; moderate range with slower speed | +| Long Turbo | ~10 km | 4.4 kbps | −10 dB | Similar range to Long Fast but with 500 kHz bandwidth; faster throughput | | Long Fast | ~10 km | 1.1 kbps | −12.5 dB | **General use (default)** — balanced range and speed | | Long Moderate | ~20 km | 0.34 kbps | −15 dB | Rural with some terrain; occasional use | -| Long Slow | ~30 km | 0.18 kbps | −17.5 dB | Sparse rural; maximum reliable range | -| Very Long Slow | ~40+ km | 0.09 kbps | −20 dB | Extreme range experiments; very slow throughput | +| Lite Fast | ~5 km | 5.5 kbps | −10 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Medium Fast | +| Lite Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Long Fast | +| Narrow Fast | ~5 km | 2.7 kbps | −10 dB | EU 868 MHz band (62.5 kHz BW); avoids interference with other devices | +| Narrow Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 868 MHz band (62.5 kHz BW); comparable to Long Fast | +| ~~Long Slow~~ | ~30 km | 0.18 kbps | −17.5 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | +| ~~Very Long Slow~~ | ~40+ km | 0.09 kbps | −20 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | #### Choosing a Modem Preset @@ -78,8 +81,9 @@ The modem preset controls the fundamental tradeoff between **range** and **data **Practical guidance:** - **Urban mesh (many nodes, short distances):** Use **Long Fast** (default) or **Short Fast**. Higher speed means less airtime congestion when many nodes share the channel. -- **Rural/sparse mesh (few nodes, long distances):** Use **Long Moderate** or **Long Slow**. Range matters more than speed when nodes are far apart. -- **Fixed infrastructure links:** Use **Short Turbo** for dedicated point-to-point links with good antennas and line-of-sight. +- **Rural/sparse mesh (few nodes, long distances):** Use **Long Moderate**. Range matters more than speed when nodes are far apart. +- **EU 866/868 MHz regulatory compliance:** Use **Lite Fast**, **Lite Slow**, **Narrow Fast**, or **Narrow Slow** — these are optimized for the EU SRD/868 MHz bands with narrower bandwidths. +- **Fixed infrastructure links:** Use **Short Turbo** or **Long Turbo** for dedicated point-to-point links with good antennas and line-of-sight. - **Mixed environments:** Stick with **Long Fast** — it's the community default and ensures compatibility with others in your area. > ⚠️ **Important:** All nodes on the same channel **must** use the same modem preset. Nodes with mismatched presets cannot communicate even if they share the same frequency and encryption key. @@ -92,9 +96,9 @@ The modem preset controls the fundamental tradeoff between **range** and **data |---------|-------------| | Screen Timeout | Time before display sleeps | | Display Units | Metric or Imperial | -| GPS Format | DMS, Decimal, UTM, MGRS, OLC | | OLED Type | Auto, SSD1306, SH1106, SH1107 | -| Compass North | True North or Magnetic North | +| Compass Orientation | Rotation offset for compass display (0°, 90°, 180°, 270°) | +| ~~Compass North~~ | ⚠️ **Deprecated** — replaced by Compass Orientation; still visible in older firmware | ### Position Config @@ -126,6 +130,8 @@ The modem preset controls the fundamental tradeoff between **range** and **data | NTP Server | Time synchronization server | | Syslog Server | Remote logging server | +![IP address field](/assets/screenshots/settings_ipv4_field.png) + ### Bluetooth Config | Setting | Description | @@ -142,8 +148,12 @@ The modem preset controls the fundamental tradeoff between **range** and **data | Admin Key | Key for remote administration | | Private Key | Your node's private key (handle securely) | | Admin Channel Enabled | Allow admin commands via channel | +| Debug Log | Output live debug logging over serial/bluetooth | +| Serial Enabled | Enable serial console access (moved from Device Config) | | Managed Mode | Restrict non-admin channel changes | +![Password field](/assets/screenshots/settings_password_field.png) + Settings use standard preference controls — dropdowns, toggles, and sliders: | Control | Screenshot | diff --git a/docs/user/signal-meter.md b/docs/user/signal-meter.md index 3f573ca4d..ce2d0a66d 100644 --- a/docs/user/signal-meter.md +++ b/docs/user/signal-meter.md @@ -52,10 +52,10 @@ Here is exactly how the app decides how many bars (or what color) to show you: | Level | Bars | Criteria | Meaning | |-------|------|----------|---------| -| Good | 3 | RSSI better than `-115 dBm` **AND** SNR above the baseline limit for your preset | Signal is both loud and clear — healthy connection. | -| Fair | 2 | Falls between Good and Bad | Signal getting quieter or noisier, but the radio understands the message fine. | -| Bad | 1 | RSSI drops to `-120 dBm` or worse, **OR** SNR within `5.5 dB` of your preset's absolute breaking point | Barely hanging on — at the edge of range or heavy interference. | -| None | 0 | RSSI worse than `-126 dBm` **AND** SNR has fallen `7.5 dB` below the ideal limit | Transmission completely buried in static. | +| Good | 3 | RSSI better than `-115 dBm` **AND** SNR better than `-7 dB` | Signal is both loud and clear — healthy connection. | +| Fair | 2 | RSSI better than `-126 dBm` with good SNR, **OR** SNR better than `-15 dB` with good RSSI | Signal getting quieter or noisier, but still decodable. | +| Bad | 1 | Falls between Fair and None thresholds | At the edge of range or experiencing interference. | +| None | 0 | RSSI worse than `-126 dBm` **AND** SNR worse than `-15 dB` | Transmission completely buried in noise. | --- From fe2cbae8756c4af9f1daacd842ab0fde097ffab6 Mon Sep 17 00:00:00 2001 From: James Rich <2199651+jamesarich@users.noreply.github.com> Date: Tue, 19 May 2026 10:05:49 -0500 Subject: [PATCH 40/78] fix(ci): disable configuration cache for Dokka build (#5492) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/workflows/docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index ed21cdd60..7b4d82083 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -63,7 +63,7 @@ jobs: gradle_encryption_key: ${{ secrets.GRADLE_ENCRYPTION_KEY }} - name: Build Dokka HTML documentation - run: ./gradlew dokkaGeneratePublicationHtml + run: ./gradlew dokkaGeneratePublicationHtml --no-configuration-cache - name: Upload artifact uses: actions/upload-pages-artifact@v5 From 3bfaa466afc01fe03cc69ba7437610441ba8bcf7 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 19 May 2026 10:06:57 -0500 Subject: [PATCH 41/78] chore(deps): update compose-multiplatform to v1.3.0-beta01 (#5490) --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 99e45a8dc..70009a10c 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -51,7 +51,7 @@ androidx-compose-bom-aligned = "1.11.1" # maps-compose-widgets requests `androidx.compose.material:material` without # a version (relying on a BOM that we exclude). M2 is frozen at 1.7.8. androidx-compose-material = "1.7.8" -jetbrains-adaptive = "1.3.0-alpha07" +jetbrains-adaptive = "1.3.0-beta01" # Google maps-compose = "8.3.0" From cdf57ced8e9d6a6ce66a88f10da304a41b0ab4c1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 19 May 2026 10:07:22 -0500 Subject: [PATCH 42/78] chore(deps): update node to v24 (#5491) --- .github/workflows/docs-governance.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docs-governance.yml b/.github/workflows/docs-governance.yml index e5a6272e5..4b526c996 100644 --- a/.github/workflows/docs-governance.yml +++ b/.github/workflows/docs-governance.yml @@ -167,7 +167,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v6 with: - node-version: "20" + node-version: "24" - name: Validate internal links run: node scripts/validate-doc-links.js docs From a141df437298b039086e9084ec234f925ffa09b2 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 19 May 2026 10:11:03 -0500 Subject: [PATCH 43/78] chore(deps): update peter-evans/create-pull-request action to v8 (#5493) --- .github/workflows/sync-android-docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/sync-android-docs.yml b/.github/workflows/sync-android-docs.yml index 3490973a7..e312f2662 100644 --- a/.github/workflows/sync-android-docs.yml +++ b/.github/workflows/sync-android-docs.yml @@ -34,7 +34,7 @@ jobs: run: node /tmp/Meshtastic-Android/scripts/sync-android-docs.js /tmp/Meshtastic-Android --convert-webp - name: Create Pull Request - uses: peter-evans/create-pull-request@v7 + uses: peter-evans/create-pull-request@v8 with: token: ${{ secrets.GITHUB_TOKEN }} commit-message: "docs: sync latest Android app documentation" From 83bb1a31f75bfd2717428f2fed287eb1e830302f Mon Sep 17 00:00:00 2001 From: James Rich <2199651+jamesarich@users.noreply.github.com> Date: Tue, 19 May 2026 10:12:04 -0500 Subject: [PATCH 44/78] chore: Scheduled updates (Firmware, Hardware, Translations, Graphs) (#5465) --- androidApp/README.md | 1 + .../src/main/assets/device_hardware.json | 15 ++ .../composeResources/values-ar/strings.xml | 2 + .../composeResources/values-be/strings.xml | 3 + .../composeResources/values-bg/strings.xml | 7 + .../composeResources/values-ca/strings.xml | 1 + .../composeResources/values-cs/strings.xml | 6 + .../composeResources/values-de/strings.xml | 23 ++ .../composeResources/values-el/strings.xml | 2 + .../composeResources/values-es/strings.xml | 6 + .../composeResources/values-et/strings.xml | 21 ++ .../composeResources/values-fi/strings.xml | 6 + .../composeResources/values-fr/strings.xml | 6 + .../composeResources/values-ga/strings.xml | 1 + .../composeResources/values-gl/strings.xml | 1 + .../composeResources/values-he/strings.xml | 1 + .../composeResources/values-hr/strings.xml | 1 + .../composeResources/values-ht/strings.xml | 1 + .../composeResources/values-hu/strings.xml | 4 + .../composeResources/values-is/strings.xml | 1 + .../composeResources/values-it/strings.xml | 6 + .../composeResources/values-ja/strings.xml | 6 + .../composeResources/values-ko/strings.xml | 3 + .../composeResources/values-lt/strings.xml | 1 + .../composeResources/values-nl/strings.xml | 2 + .../composeResources/values-no/strings.xml | 1 + .../composeResources/values-pl/strings.xml | 4 + .../values-pt-rBR/strings.xml | 5 + .../composeResources/values-pt/strings.xml | 4 + .../composeResources/values-ro/strings.xml | 5 + .../composeResources/values-ru/strings.xml | 55 +++- .../composeResources/values-sk/strings.xml | 3 + .../composeResources/values-sl/strings.xml | 1 + .../composeResources/values-sq/strings.xml | 1 + .../composeResources/values-sr/strings.xml | 3 + .../composeResources/values-srp/strings.xml | 3 + .../composeResources/values-sv/strings.xml | 6 + .../composeResources/values-tr/strings.xml | 5 + .../composeResources/values-uk/strings.xml | 4 + .../values-zh-rCN/strings.xml | 7 + .../values-zh-rTW/strings.xml | 7 + docs/ar-rSA/index.md | 30 +++ docs/ar-rSA/user/connections.md | 125 +++++++++ docs/ar-rSA/user/desktop.md | 147 +++++++++++ docs/ar-rSA/user/discovery.md | 114 ++++++++ docs/ar-rSA/user/firmware.md | 114 ++++++++ docs/ar-rSA/user/map-and-waypoints.md | 116 +++++++++ docs/ar-rSA/user/messages-and-channels.md | 159 +++++++++++ docs/ar-rSA/user/mqtt.md | 137 ++++++++++ docs/ar-rSA/user/node-metrics.md | 130 +++++++++ docs/ar-rSA/user/nodes.md | 152 +++++++++++ docs/ar-rSA/user/onboarding.md | 99 +++++++ docs/ar-rSA/user/settings-module-admin.md | 246 ++++++++++++++++++ docs/ar-rSA/user/settings-radio-user.md | 173 ++++++++++++ docs/ar-rSA/user/signal-meter.md | 81 ++++++ docs/ar-rSA/user/tak.md | 126 +++++++++ docs/ar-rSA/user/telemetry-and-sensors.md | 118 +++++++++ docs/ar-rSA/user/translate.md | 97 +++++++ docs/ar-rSA/user/units-and-locale.md | 118 +++++++++ docs/be-rBY/index.md | 30 +++ docs/be-rBY/user/connections.md | 125 +++++++++ docs/be-rBY/user/desktop.md | 147 +++++++++++ docs/be-rBY/user/discovery.md | 114 ++++++++ docs/be-rBY/user/firmware.md | 114 ++++++++ docs/be-rBY/user/map-and-waypoints.md | 116 +++++++++ docs/be-rBY/user/messages-and-channels.md | 159 +++++++++++ docs/be-rBY/user/mqtt.md | 137 ++++++++++ docs/be-rBY/user/node-metrics.md | 130 +++++++++ docs/be-rBY/user/nodes.md | 152 +++++++++++ docs/be-rBY/user/onboarding.md | 99 +++++++ docs/be-rBY/user/settings-module-admin.md | 246 ++++++++++++++++++ docs/be-rBY/user/settings-radio-user.md | 173 ++++++++++++ docs/be-rBY/user/signal-meter.md | 81 ++++++ docs/be-rBY/user/tak.md | 126 +++++++++ docs/be-rBY/user/telemetry-and-sensors.md | 118 +++++++++ docs/be-rBY/user/translate.md | 97 +++++++ docs/be-rBY/user/units-and-locale.md | 118 +++++++++ docs/bg-rBG/index.md | 30 +++ docs/bg-rBG/user/connections.md | 125 +++++++++ docs/bg-rBG/user/desktop.md | 147 +++++++++++ docs/bg-rBG/user/discovery.md | 114 ++++++++ docs/bg-rBG/user/firmware.md | 114 ++++++++ docs/bg-rBG/user/map-and-waypoints.md | 116 +++++++++ docs/bg-rBG/user/messages-and-channels.md | 159 +++++++++++ docs/bg-rBG/user/mqtt.md | 137 ++++++++++ docs/bg-rBG/user/node-metrics.md | 130 +++++++++ docs/bg-rBG/user/nodes.md | 152 +++++++++++ docs/bg-rBG/user/onboarding.md | 99 +++++++ docs/bg-rBG/user/settings-module-admin.md | 246 ++++++++++++++++++ docs/bg-rBG/user/settings-radio-user.md | 173 ++++++++++++ docs/bg-rBG/user/signal-meter.md | 81 ++++++ docs/bg-rBG/user/tak.md | 126 +++++++++ docs/bg-rBG/user/telemetry-and-sensors.md | 118 +++++++++ docs/bg-rBG/user/translate.md | 97 +++++++ docs/bg-rBG/user/units-and-locale.md | 118 +++++++++ docs/ca-rES/index.md | 30 +++ docs/ca-rES/user/connections.md | 125 +++++++++ docs/ca-rES/user/desktop.md | 147 +++++++++++ docs/ca-rES/user/discovery.md | 114 ++++++++ docs/ca-rES/user/firmware.md | 114 ++++++++ docs/ca-rES/user/map-and-waypoints.md | 116 +++++++++ docs/ca-rES/user/messages-and-channels.md | 159 +++++++++++ docs/ca-rES/user/mqtt.md | 137 ++++++++++ docs/ca-rES/user/node-metrics.md | 130 +++++++++ docs/ca-rES/user/nodes.md | 152 +++++++++++ docs/ca-rES/user/onboarding.md | 99 +++++++ docs/ca-rES/user/settings-module-admin.md | 246 ++++++++++++++++++ docs/ca-rES/user/settings-radio-user.md | 173 ++++++++++++ docs/ca-rES/user/signal-meter.md | 81 ++++++ docs/ca-rES/user/tak.md | 126 +++++++++ docs/ca-rES/user/telemetry-and-sensors.md | 118 +++++++++ docs/ca-rES/user/translate.md | 97 +++++++ docs/ca-rES/user/units-and-locale.md | 118 +++++++++ docs/cs-rCZ/index.md | 30 +++ docs/cs-rCZ/user/connections.md | 125 +++++++++ docs/cs-rCZ/user/desktop.md | 147 +++++++++++ docs/cs-rCZ/user/discovery.md | 114 ++++++++ docs/cs-rCZ/user/firmware.md | 114 ++++++++ docs/cs-rCZ/user/map-and-waypoints.md | 116 +++++++++ docs/cs-rCZ/user/messages-and-channels.md | 159 +++++++++++ docs/cs-rCZ/user/mqtt.md | 137 ++++++++++ docs/cs-rCZ/user/node-metrics.md | 130 +++++++++ docs/cs-rCZ/user/nodes.md | 152 +++++++++++ docs/cs-rCZ/user/onboarding.md | 99 +++++++ docs/cs-rCZ/user/settings-module-admin.md | 246 ++++++++++++++++++ docs/cs-rCZ/user/settings-radio-user.md | 173 ++++++++++++ docs/cs-rCZ/user/signal-meter.md | 81 ++++++ docs/cs-rCZ/user/tak.md | 126 +++++++++ docs/cs-rCZ/user/telemetry-and-sensors.md | 118 +++++++++ docs/cs-rCZ/user/translate.md | 97 +++++++ docs/cs-rCZ/user/units-and-locale.md | 118 +++++++++ docs/de-rDE/index.md | 30 +++ docs/de-rDE/user/connections.md | 125 +++++++++ docs/de-rDE/user/desktop.md | 147 +++++++++++ docs/de-rDE/user/discovery.md | 114 ++++++++ docs/de-rDE/user/firmware.md | 114 ++++++++ docs/de-rDE/user/map-and-waypoints.md | 116 +++++++++ docs/de-rDE/user/messages-and-channels.md | 159 +++++++++++ docs/de-rDE/user/mqtt.md | 137 ++++++++++ docs/de-rDE/user/node-metrics.md | 130 +++++++++ docs/de-rDE/user/nodes.md | 152 +++++++++++ docs/de-rDE/user/onboarding.md | 99 +++++++ docs/de-rDE/user/settings-module-admin.md | 246 ++++++++++++++++++ docs/de-rDE/user/settings-radio-user.md | 173 ++++++++++++ docs/de-rDE/user/signal-meter.md | 81 ++++++ docs/de-rDE/user/tak.md | 126 +++++++++ docs/de-rDE/user/telemetry-and-sensors.md | 118 +++++++++ docs/de-rDE/user/translate.md | 97 +++++++ docs/de-rDE/user/units-and-locale.md | 118 +++++++++ docs/el-rGR/index.md | 30 +++ docs/el-rGR/user/connections.md | 125 +++++++++ docs/el-rGR/user/desktop.md | 147 +++++++++++ docs/el-rGR/user/discovery.md | 114 ++++++++ docs/el-rGR/user/firmware.md | 114 ++++++++ docs/el-rGR/user/map-and-waypoints.md | 116 +++++++++ docs/el-rGR/user/messages-and-channels.md | 159 +++++++++++ docs/el-rGR/user/mqtt.md | 137 ++++++++++ docs/el-rGR/user/node-metrics.md | 130 +++++++++ docs/el-rGR/user/nodes.md | 152 +++++++++++ docs/el-rGR/user/onboarding.md | 99 +++++++ docs/el-rGR/user/settings-module-admin.md | 246 ++++++++++++++++++ docs/el-rGR/user/settings-radio-user.md | 173 ++++++++++++ docs/el-rGR/user/signal-meter.md | 81 ++++++ docs/el-rGR/user/tak.md | 126 +++++++++ docs/el-rGR/user/telemetry-and-sensors.md | 118 +++++++++ docs/el-rGR/user/translate.md | 97 +++++++ docs/el-rGR/user/units-and-locale.md | 118 +++++++++ docs/es-rES/index.md | 30 +++ docs/es-rES/user/connections.md | 125 +++++++++ docs/es-rES/user/desktop.md | 147 +++++++++++ docs/es-rES/user/discovery.md | 114 ++++++++ docs/es-rES/user/firmware.md | 114 ++++++++ docs/es-rES/user/map-and-waypoints.md | 116 +++++++++ docs/es-rES/user/messages-and-channels.md | 159 +++++++++++ docs/es-rES/user/mqtt.md | 137 ++++++++++ docs/es-rES/user/node-metrics.md | 130 +++++++++ docs/es-rES/user/nodes.md | 152 +++++++++++ docs/es-rES/user/onboarding.md | 99 +++++++ docs/es-rES/user/settings-module-admin.md | 246 ++++++++++++++++++ docs/es-rES/user/settings-radio-user.md | 173 ++++++++++++ docs/es-rES/user/signal-meter.md | 81 ++++++ docs/es-rES/user/tak.md | 126 +++++++++ docs/es-rES/user/telemetry-and-sensors.md | 118 +++++++++ docs/es-rES/user/translate.md | 97 +++++++ docs/es-rES/user/units-and-locale.md | 118 +++++++++ docs/et-rEE/index.md | 30 +++ docs/et-rEE/user/connections.md | 125 +++++++++ docs/et-rEE/user/desktop.md | 147 +++++++++++ docs/et-rEE/user/discovery.md | 114 ++++++++ docs/et-rEE/user/firmware.md | 114 ++++++++ docs/et-rEE/user/map-and-waypoints.md | 116 +++++++++ docs/et-rEE/user/messages-and-channels.md | 159 +++++++++++ docs/et-rEE/user/mqtt.md | 137 ++++++++++ docs/et-rEE/user/node-metrics.md | 130 +++++++++ docs/et-rEE/user/nodes.md | 152 +++++++++++ docs/et-rEE/user/onboarding.md | 99 +++++++ docs/et-rEE/user/settings-module-admin.md | 246 ++++++++++++++++++ docs/et-rEE/user/settings-radio-user.md | 173 ++++++++++++ docs/et-rEE/user/signal-meter.md | 81 ++++++ docs/et-rEE/user/tak.md | 126 +++++++++ docs/et-rEE/user/telemetry-and-sensors.md | 118 +++++++++ docs/et-rEE/user/translate.md | 97 +++++++ docs/et-rEE/user/units-and-locale.md | 118 +++++++++ docs/fi-rFI/index.md | 30 +++ docs/fi-rFI/user/connections.md | 125 +++++++++ docs/fi-rFI/user/desktop.md | 147 +++++++++++ docs/fi-rFI/user/discovery.md | 114 ++++++++ docs/fi-rFI/user/firmware.md | 114 ++++++++ docs/fi-rFI/user/map-and-waypoints.md | 116 +++++++++ docs/fi-rFI/user/messages-and-channels.md | 159 +++++++++++ docs/fi-rFI/user/mqtt.md | 137 ++++++++++ docs/fi-rFI/user/node-metrics.md | 130 +++++++++ docs/fi-rFI/user/nodes.md | 152 +++++++++++ docs/fi-rFI/user/onboarding.md | 99 +++++++ docs/fi-rFI/user/settings-module-admin.md | 246 ++++++++++++++++++ docs/fi-rFI/user/settings-radio-user.md | 173 ++++++++++++ docs/fi-rFI/user/signal-meter.md | 81 ++++++ docs/fi-rFI/user/tak.md | 126 +++++++++ docs/fi-rFI/user/telemetry-and-sensors.md | 118 +++++++++ docs/fi-rFI/user/translate.md | 97 +++++++ docs/fi-rFI/user/units-and-locale.md | 118 +++++++++ docs/fr-rFR/index.md | 30 +++ docs/fr-rFR/user/connections.md | 125 +++++++++ docs/fr-rFR/user/desktop.md | 147 +++++++++++ docs/fr-rFR/user/discovery.md | 114 ++++++++ docs/fr-rFR/user/firmware.md | 114 ++++++++ docs/fr-rFR/user/map-and-waypoints.md | 116 +++++++++ docs/fr-rFR/user/messages-and-channels.md | 159 +++++++++++ docs/fr-rFR/user/mqtt.md | 137 ++++++++++ docs/fr-rFR/user/node-metrics.md | 130 +++++++++ docs/fr-rFR/user/nodes.md | 152 +++++++++++ docs/fr-rFR/user/onboarding.md | 99 +++++++ docs/fr-rFR/user/settings-module-admin.md | 246 ++++++++++++++++++ docs/fr-rFR/user/settings-radio-user.md | 173 ++++++++++++ docs/fr-rFR/user/signal-meter.md | 81 ++++++ docs/fr-rFR/user/tak.md | 126 +++++++++ docs/fr-rFR/user/telemetry-and-sensors.md | 118 +++++++++ docs/fr-rFR/user/translate.md | 97 +++++++ docs/fr-rFR/user/units-and-locale.md | 118 +++++++++ docs/ga-rIE/index.md | 30 +++ docs/ga-rIE/user/connections.md | 125 +++++++++ docs/ga-rIE/user/desktop.md | 147 +++++++++++ docs/ga-rIE/user/discovery.md | 114 ++++++++ docs/ga-rIE/user/firmware.md | 114 ++++++++ docs/ga-rIE/user/map-and-waypoints.md | 116 +++++++++ docs/ga-rIE/user/messages-and-channels.md | 159 +++++++++++ docs/ga-rIE/user/mqtt.md | 137 ++++++++++ docs/ga-rIE/user/node-metrics.md | 130 +++++++++ docs/ga-rIE/user/nodes.md | 152 +++++++++++ docs/ga-rIE/user/onboarding.md | 99 +++++++ docs/ga-rIE/user/settings-module-admin.md | 246 ++++++++++++++++++ docs/ga-rIE/user/settings-radio-user.md | 173 ++++++++++++ docs/ga-rIE/user/signal-meter.md | 81 ++++++ docs/ga-rIE/user/tak.md | 126 +++++++++ docs/ga-rIE/user/telemetry-and-sensors.md | 118 +++++++++ docs/ga-rIE/user/translate.md | 97 +++++++ docs/ga-rIE/user/units-and-locale.md | 118 +++++++++ docs/gl-rES/index.md | 30 +++ docs/gl-rES/user/connections.md | 125 +++++++++ docs/gl-rES/user/desktop.md | 147 +++++++++++ docs/gl-rES/user/discovery.md | 114 ++++++++ docs/gl-rES/user/firmware.md | 114 ++++++++ docs/gl-rES/user/map-and-waypoints.md | 116 +++++++++ docs/gl-rES/user/messages-and-channels.md | 159 +++++++++++ docs/gl-rES/user/mqtt.md | 137 ++++++++++ docs/gl-rES/user/node-metrics.md | 130 +++++++++ docs/gl-rES/user/nodes.md | 152 +++++++++++ docs/gl-rES/user/onboarding.md | 99 +++++++ docs/gl-rES/user/settings-module-admin.md | 246 ++++++++++++++++++ docs/gl-rES/user/settings-radio-user.md | 173 ++++++++++++ docs/gl-rES/user/signal-meter.md | 81 ++++++ docs/gl-rES/user/tak.md | 126 +++++++++ docs/gl-rES/user/telemetry-and-sensors.md | 118 +++++++++ docs/gl-rES/user/translate.md | 97 +++++++ docs/gl-rES/user/units-and-locale.md | 118 +++++++++ docs/hr-rHR/index.md | 30 +++ docs/hr-rHR/user/connections.md | 125 +++++++++ docs/hr-rHR/user/desktop.md | 147 +++++++++++ docs/hr-rHR/user/discovery.md | 114 ++++++++ docs/hr-rHR/user/firmware.md | 114 ++++++++ docs/hr-rHR/user/map-and-waypoints.md | 116 +++++++++ docs/hr-rHR/user/messages-and-channels.md | 159 +++++++++++ docs/hr-rHR/user/mqtt.md | 137 ++++++++++ docs/hr-rHR/user/node-metrics.md | 130 +++++++++ docs/hr-rHR/user/nodes.md | 152 +++++++++++ docs/hr-rHR/user/onboarding.md | 99 +++++++ docs/hr-rHR/user/settings-module-admin.md | 246 ++++++++++++++++++ docs/hr-rHR/user/settings-radio-user.md | 173 ++++++++++++ docs/hr-rHR/user/signal-meter.md | 81 ++++++ docs/hr-rHR/user/tak.md | 126 +++++++++ docs/hr-rHR/user/telemetry-and-sensors.md | 118 +++++++++ docs/hr-rHR/user/translate.md | 97 +++++++ docs/hr-rHR/user/units-and-locale.md | 118 +++++++++ docs/ht-rHT/index.md | 30 +++ docs/ht-rHT/user/connections.md | 125 +++++++++ docs/ht-rHT/user/desktop.md | 147 +++++++++++ docs/ht-rHT/user/discovery.md | 114 ++++++++ docs/ht-rHT/user/firmware.md | 114 ++++++++ docs/ht-rHT/user/map-and-waypoints.md | 116 +++++++++ docs/ht-rHT/user/messages-and-channels.md | 159 +++++++++++ docs/ht-rHT/user/mqtt.md | 137 ++++++++++ docs/ht-rHT/user/node-metrics.md | 130 +++++++++ docs/ht-rHT/user/nodes.md | 152 +++++++++++ docs/ht-rHT/user/onboarding.md | 99 +++++++ docs/ht-rHT/user/settings-module-admin.md | 246 ++++++++++++++++++ docs/ht-rHT/user/settings-radio-user.md | 173 ++++++++++++ docs/ht-rHT/user/signal-meter.md | 81 ++++++ docs/ht-rHT/user/tak.md | 126 +++++++++ docs/ht-rHT/user/telemetry-and-sensors.md | 118 +++++++++ docs/ht-rHT/user/translate.md | 97 +++++++ docs/ht-rHT/user/units-and-locale.md | 118 +++++++++ docs/hu-rHU/index.md | 30 +++ docs/hu-rHU/user/connections.md | 125 +++++++++ docs/hu-rHU/user/desktop.md | 147 +++++++++++ docs/hu-rHU/user/discovery.md | 114 ++++++++ docs/hu-rHU/user/firmware.md | 114 ++++++++ docs/hu-rHU/user/map-and-waypoints.md | 116 +++++++++ docs/hu-rHU/user/messages-and-channels.md | 159 +++++++++++ docs/hu-rHU/user/mqtt.md | 137 ++++++++++ docs/hu-rHU/user/node-metrics.md | 130 +++++++++ docs/hu-rHU/user/nodes.md | 152 +++++++++++ docs/hu-rHU/user/onboarding.md | 99 +++++++ docs/hu-rHU/user/settings-module-admin.md | 246 ++++++++++++++++++ docs/hu-rHU/user/settings-radio-user.md | 173 ++++++++++++ docs/hu-rHU/user/signal-meter.md | 81 ++++++ docs/hu-rHU/user/tak.md | 126 +++++++++ docs/hu-rHU/user/telemetry-and-sensors.md | 118 +++++++++ docs/hu-rHU/user/translate.md | 97 +++++++ docs/hu-rHU/user/units-and-locale.md | 118 +++++++++ docs/is-rIS/index.md | 30 +++ docs/is-rIS/user/connections.md | 125 +++++++++ docs/is-rIS/user/desktop.md | 147 +++++++++++ docs/is-rIS/user/discovery.md | 114 ++++++++ docs/is-rIS/user/firmware.md | 114 ++++++++ docs/is-rIS/user/map-and-waypoints.md | 116 +++++++++ docs/is-rIS/user/messages-and-channels.md | 159 +++++++++++ docs/is-rIS/user/mqtt.md | 137 ++++++++++ docs/is-rIS/user/node-metrics.md | 130 +++++++++ docs/is-rIS/user/nodes.md | 152 +++++++++++ docs/is-rIS/user/onboarding.md | 99 +++++++ docs/is-rIS/user/settings-module-admin.md | 246 ++++++++++++++++++ docs/is-rIS/user/settings-radio-user.md | 173 ++++++++++++ docs/is-rIS/user/signal-meter.md | 81 ++++++ docs/is-rIS/user/tak.md | 126 +++++++++ docs/is-rIS/user/telemetry-and-sensors.md | 118 +++++++++ docs/is-rIS/user/translate.md | 97 +++++++ docs/is-rIS/user/units-and-locale.md | 118 +++++++++ docs/it-rIT/index.md | 30 +++ docs/it-rIT/user/connections.md | 125 +++++++++ docs/it-rIT/user/desktop.md | 147 +++++++++++ docs/it-rIT/user/discovery.md | 114 ++++++++ docs/it-rIT/user/firmware.md | 114 ++++++++ docs/it-rIT/user/map-and-waypoints.md | 116 +++++++++ docs/it-rIT/user/messages-and-channels.md | 159 +++++++++++ docs/it-rIT/user/mqtt.md | 137 ++++++++++ docs/it-rIT/user/node-metrics.md | 130 +++++++++ docs/it-rIT/user/nodes.md | 152 +++++++++++ docs/it-rIT/user/onboarding.md | 99 +++++++ docs/it-rIT/user/settings-module-admin.md | 246 ++++++++++++++++++ docs/it-rIT/user/settings-radio-user.md | 173 ++++++++++++ docs/it-rIT/user/signal-meter.md | 81 ++++++ docs/it-rIT/user/tak.md | 126 +++++++++ docs/it-rIT/user/telemetry-and-sensors.md | 118 +++++++++ docs/it-rIT/user/translate.md | 97 +++++++ docs/it-rIT/user/units-and-locale.md | 118 +++++++++ docs/iw-rIL/index.md | 30 +++ docs/iw-rIL/user/connections.md | 125 +++++++++ docs/iw-rIL/user/desktop.md | 147 +++++++++++ docs/iw-rIL/user/discovery.md | 114 ++++++++ docs/iw-rIL/user/firmware.md | 114 ++++++++ docs/iw-rIL/user/map-and-waypoints.md | 116 +++++++++ docs/iw-rIL/user/messages-and-channels.md | 159 +++++++++++ docs/iw-rIL/user/mqtt.md | 137 ++++++++++ docs/iw-rIL/user/node-metrics.md | 130 +++++++++ docs/iw-rIL/user/nodes.md | 152 +++++++++++ docs/iw-rIL/user/onboarding.md | 99 +++++++ docs/iw-rIL/user/settings-module-admin.md | 246 ++++++++++++++++++ docs/iw-rIL/user/settings-radio-user.md | 173 ++++++++++++ docs/iw-rIL/user/signal-meter.md | 81 ++++++ docs/iw-rIL/user/tak.md | 126 +++++++++ docs/iw-rIL/user/telemetry-and-sensors.md | 118 +++++++++ docs/iw-rIL/user/translate.md | 97 +++++++ docs/iw-rIL/user/units-and-locale.md | 118 +++++++++ docs/ja-rJP/index.md | 30 +++ docs/ja-rJP/user/connections.md | 125 +++++++++ docs/ja-rJP/user/desktop.md | 147 +++++++++++ docs/ja-rJP/user/discovery.md | 114 ++++++++ docs/ja-rJP/user/firmware.md | 114 ++++++++ docs/ja-rJP/user/map-and-waypoints.md | 116 +++++++++ docs/ja-rJP/user/messages-and-channels.md | 159 +++++++++++ docs/ja-rJP/user/mqtt.md | 137 ++++++++++ docs/ja-rJP/user/node-metrics.md | 130 +++++++++ docs/ja-rJP/user/nodes.md | 152 +++++++++++ docs/ja-rJP/user/onboarding.md | 99 +++++++ docs/ja-rJP/user/settings-module-admin.md | 246 ++++++++++++++++++ docs/ja-rJP/user/settings-radio-user.md | 173 ++++++++++++ docs/ja-rJP/user/signal-meter.md | 81 ++++++ docs/ja-rJP/user/tak.md | 126 +++++++++ docs/ja-rJP/user/telemetry-and-sensors.md | 118 +++++++++ docs/ja-rJP/user/translate.md | 97 +++++++ docs/ja-rJP/user/units-and-locale.md | 118 +++++++++ docs/ko-rKR/index.md | 30 +++ docs/ko-rKR/user/connections.md | 125 +++++++++ docs/ko-rKR/user/desktop.md | 147 +++++++++++ docs/ko-rKR/user/discovery.md | 114 ++++++++ docs/ko-rKR/user/firmware.md | 114 ++++++++ docs/ko-rKR/user/map-and-waypoints.md | 116 +++++++++ docs/ko-rKR/user/messages-and-channels.md | 159 +++++++++++ docs/ko-rKR/user/mqtt.md | 137 ++++++++++ docs/ko-rKR/user/node-metrics.md | 130 +++++++++ docs/ko-rKR/user/nodes.md | 152 +++++++++++ docs/ko-rKR/user/onboarding.md | 99 +++++++ docs/ko-rKR/user/settings-module-admin.md | 246 ++++++++++++++++++ docs/ko-rKR/user/settings-radio-user.md | 173 ++++++++++++ docs/ko-rKR/user/signal-meter.md | 81 ++++++ docs/ko-rKR/user/tak.md | 126 +++++++++ docs/ko-rKR/user/telemetry-and-sensors.md | 118 +++++++++ docs/ko-rKR/user/translate.md | 97 +++++++ docs/ko-rKR/user/units-and-locale.md | 118 +++++++++ docs/lt-rLT/index.md | 30 +++ docs/lt-rLT/user/connections.md | 125 +++++++++ docs/lt-rLT/user/desktop.md | 147 +++++++++++ docs/lt-rLT/user/discovery.md | 114 ++++++++ docs/lt-rLT/user/firmware.md | 114 ++++++++ docs/lt-rLT/user/map-and-waypoints.md | 116 +++++++++ docs/lt-rLT/user/messages-and-channels.md | 159 +++++++++++ docs/lt-rLT/user/mqtt.md | 137 ++++++++++ docs/lt-rLT/user/node-metrics.md | 130 +++++++++ docs/lt-rLT/user/nodes.md | 152 +++++++++++ docs/lt-rLT/user/onboarding.md | 99 +++++++ docs/lt-rLT/user/settings-module-admin.md | 246 ++++++++++++++++++ docs/lt-rLT/user/settings-radio-user.md | 173 ++++++++++++ docs/lt-rLT/user/signal-meter.md | 81 ++++++ docs/lt-rLT/user/tak.md | 126 +++++++++ docs/lt-rLT/user/telemetry-and-sensors.md | 118 +++++++++ docs/lt-rLT/user/translate.md | 97 +++++++ docs/lt-rLT/user/units-and-locale.md | 118 +++++++++ docs/nl-rNL/index.md | 30 +++ docs/nl-rNL/user/connections.md | 125 +++++++++ docs/nl-rNL/user/desktop.md | 147 +++++++++++ docs/nl-rNL/user/discovery.md | 114 ++++++++ docs/nl-rNL/user/firmware.md | 114 ++++++++ docs/nl-rNL/user/map-and-waypoints.md | 116 +++++++++ docs/nl-rNL/user/messages-and-channels.md | 159 +++++++++++ docs/nl-rNL/user/mqtt.md | 137 ++++++++++ docs/nl-rNL/user/node-metrics.md | 130 +++++++++ docs/nl-rNL/user/nodes.md | 152 +++++++++++ docs/nl-rNL/user/onboarding.md | 99 +++++++ docs/nl-rNL/user/settings-module-admin.md | 246 ++++++++++++++++++ docs/nl-rNL/user/settings-radio-user.md | 173 ++++++++++++ docs/nl-rNL/user/signal-meter.md | 81 ++++++ docs/nl-rNL/user/tak.md | 126 +++++++++ docs/nl-rNL/user/telemetry-and-sensors.md | 118 +++++++++ docs/nl-rNL/user/translate.md | 97 +++++++ docs/nl-rNL/user/units-and-locale.md | 118 +++++++++ docs/no-rNO/index.md | 30 +++ docs/no-rNO/user/connections.md | 125 +++++++++ docs/no-rNO/user/desktop.md | 147 +++++++++++ docs/no-rNO/user/discovery.md | 114 ++++++++ docs/no-rNO/user/firmware.md | 114 ++++++++ docs/no-rNO/user/map-and-waypoints.md | 116 +++++++++ docs/no-rNO/user/messages-and-channels.md | 159 +++++++++++ docs/no-rNO/user/mqtt.md | 137 ++++++++++ docs/no-rNO/user/node-metrics.md | 130 +++++++++ docs/no-rNO/user/nodes.md | 152 +++++++++++ docs/no-rNO/user/onboarding.md | 99 +++++++ docs/no-rNO/user/settings-module-admin.md | 246 ++++++++++++++++++ docs/no-rNO/user/settings-radio-user.md | 173 ++++++++++++ docs/no-rNO/user/signal-meter.md | 81 ++++++ docs/no-rNO/user/tak.md | 126 +++++++++ docs/no-rNO/user/telemetry-and-sensors.md | 118 +++++++++ docs/no-rNO/user/translate.md | 97 +++++++ docs/no-rNO/user/units-and-locale.md | 118 +++++++++ docs/pl-rPL/index.md | 30 +++ docs/pl-rPL/user/connections.md | 125 +++++++++ docs/pl-rPL/user/desktop.md | 147 +++++++++++ docs/pl-rPL/user/discovery.md | 114 ++++++++ docs/pl-rPL/user/firmware.md | 114 ++++++++ docs/pl-rPL/user/map-and-waypoints.md | 116 +++++++++ docs/pl-rPL/user/messages-and-channels.md | 159 +++++++++++ docs/pl-rPL/user/mqtt.md | 137 ++++++++++ docs/pl-rPL/user/node-metrics.md | 130 +++++++++ docs/pl-rPL/user/nodes.md | 152 +++++++++++ docs/pl-rPL/user/onboarding.md | 99 +++++++ docs/pl-rPL/user/settings-module-admin.md | 246 ++++++++++++++++++ docs/pl-rPL/user/settings-radio-user.md | 173 ++++++++++++ docs/pl-rPL/user/signal-meter.md | 81 ++++++ docs/pl-rPL/user/tak.md | 126 +++++++++ docs/pl-rPL/user/telemetry-and-sensors.md | 118 +++++++++ docs/pl-rPL/user/translate.md | 97 +++++++ docs/pl-rPL/user/units-and-locale.md | 118 +++++++++ docs/pt-rBR/index.md | 30 +++ docs/pt-rBR/user/connections.md | 125 +++++++++ docs/pt-rBR/user/desktop.md | 147 +++++++++++ docs/pt-rBR/user/discovery.md | 114 ++++++++ docs/pt-rBR/user/firmware.md | 114 ++++++++ docs/pt-rBR/user/map-and-waypoints.md | 116 +++++++++ docs/pt-rBR/user/messages-and-channels.md | 159 +++++++++++ docs/pt-rBR/user/mqtt.md | 137 ++++++++++ docs/pt-rBR/user/node-metrics.md | 130 +++++++++ docs/pt-rBR/user/nodes.md | 152 +++++++++++ docs/pt-rBR/user/onboarding.md | 99 +++++++ docs/pt-rBR/user/settings-module-admin.md | 246 ++++++++++++++++++ docs/pt-rBR/user/settings-radio-user.md | 173 ++++++++++++ docs/pt-rBR/user/signal-meter.md | 81 ++++++ docs/pt-rBR/user/tak.md | 126 +++++++++ docs/pt-rBR/user/telemetry-and-sensors.md | 118 +++++++++ docs/pt-rBR/user/translate.md | 97 +++++++ docs/pt-rBR/user/units-and-locale.md | 118 +++++++++ docs/pt-rPT/index.md | 30 +++ docs/pt-rPT/user/connections.md | 125 +++++++++ docs/pt-rPT/user/desktop.md | 147 +++++++++++ docs/pt-rPT/user/discovery.md | 114 ++++++++ docs/pt-rPT/user/firmware.md | 114 ++++++++ docs/pt-rPT/user/map-and-waypoints.md | 116 +++++++++ docs/pt-rPT/user/messages-and-channels.md | 159 +++++++++++ docs/pt-rPT/user/mqtt.md | 137 ++++++++++ docs/pt-rPT/user/node-metrics.md | 130 +++++++++ docs/pt-rPT/user/nodes.md | 152 +++++++++++ docs/pt-rPT/user/onboarding.md | 99 +++++++ docs/pt-rPT/user/settings-module-admin.md | 246 ++++++++++++++++++ docs/pt-rPT/user/settings-radio-user.md | 173 ++++++++++++ docs/pt-rPT/user/signal-meter.md | 81 ++++++ docs/pt-rPT/user/tak.md | 126 +++++++++ docs/pt-rPT/user/telemetry-and-sensors.md | 118 +++++++++ docs/pt-rPT/user/translate.md | 97 +++++++ docs/pt-rPT/user/units-and-locale.md | 118 +++++++++ docs/ro-rRO/index.md | 30 +++ docs/ro-rRO/user/connections.md | 125 +++++++++ docs/ro-rRO/user/desktop.md | 147 +++++++++++ docs/ro-rRO/user/discovery.md | 114 ++++++++ docs/ro-rRO/user/firmware.md | 114 ++++++++ docs/ro-rRO/user/map-and-waypoints.md | 116 +++++++++ docs/ro-rRO/user/messages-and-channels.md | 159 +++++++++++ docs/ro-rRO/user/mqtt.md | 137 ++++++++++ docs/ro-rRO/user/node-metrics.md | 130 +++++++++ docs/ro-rRO/user/nodes.md | 152 +++++++++++ docs/ro-rRO/user/onboarding.md | 99 +++++++ docs/ro-rRO/user/settings-module-admin.md | 246 ++++++++++++++++++ docs/ro-rRO/user/settings-radio-user.md | 173 ++++++++++++ docs/ro-rRO/user/signal-meter.md | 81 ++++++ docs/ro-rRO/user/tak.md | 126 +++++++++ docs/ro-rRO/user/telemetry-and-sensors.md | 118 +++++++++ docs/ro-rRO/user/translate.md | 97 +++++++ docs/ro-rRO/user/units-and-locale.md | 118 +++++++++ docs/ru-rRU/index.md | 30 +++ docs/ru-rRU/user/connections.md | 125 +++++++++ docs/ru-rRU/user/desktop.md | 147 +++++++++++ docs/ru-rRU/user/discovery.md | 114 ++++++++ docs/ru-rRU/user/firmware.md | 114 ++++++++ docs/ru-rRU/user/map-and-waypoints.md | 116 +++++++++ docs/ru-rRU/user/messages-and-channels.md | 159 +++++++++++ docs/ru-rRU/user/mqtt.md | 137 ++++++++++ docs/ru-rRU/user/node-metrics.md | 130 +++++++++ docs/ru-rRU/user/nodes.md | 152 +++++++++++ docs/ru-rRU/user/onboarding.md | 99 +++++++ docs/ru-rRU/user/settings-module-admin.md | 246 ++++++++++++++++++ docs/ru-rRU/user/settings-radio-user.md | 173 ++++++++++++ docs/ru-rRU/user/signal-meter.md | 81 ++++++ docs/ru-rRU/user/tak.md | 126 +++++++++ docs/ru-rRU/user/telemetry-and-sensors.md | 118 +++++++++ docs/ru-rRU/user/translate.md | 96 +++++++ docs/ru-rRU/user/units-and-locale.md | 118 +++++++++ docs/sk-rSK/index.md | 30 +++ docs/sk-rSK/user/connections.md | 125 +++++++++ docs/sk-rSK/user/desktop.md | 147 +++++++++++ docs/sk-rSK/user/discovery.md | 114 ++++++++ docs/sk-rSK/user/firmware.md | 114 ++++++++ docs/sk-rSK/user/map-and-waypoints.md | 116 +++++++++ docs/sk-rSK/user/messages-and-channels.md | 159 +++++++++++ docs/sk-rSK/user/mqtt.md | 137 ++++++++++ docs/sk-rSK/user/node-metrics.md | 130 +++++++++ docs/sk-rSK/user/nodes.md | 152 +++++++++++ docs/sk-rSK/user/onboarding.md | 99 +++++++ docs/sk-rSK/user/settings-module-admin.md | 246 ++++++++++++++++++ docs/sk-rSK/user/settings-radio-user.md | 173 ++++++++++++ docs/sk-rSK/user/signal-meter.md | 81 ++++++ docs/sk-rSK/user/tak.md | 126 +++++++++ docs/sk-rSK/user/telemetry-and-sensors.md | 118 +++++++++ docs/sk-rSK/user/translate.md | 97 +++++++ docs/sk-rSK/user/units-and-locale.md | 118 +++++++++ docs/sl-rSI/index.md | 30 +++ docs/sl-rSI/user/connections.md | 125 +++++++++ docs/sl-rSI/user/desktop.md | 147 +++++++++++ docs/sl-rSI/user/discovery.md | 114 ++++++++ docs/sl-rSI/user/firmware.md | 114 ++++++++ docs/sl-rSI/user/map-and-waypoints.md | 116 +++++++++ docs/sl-rSI/user/messages-and-channels.md | 159 +++++++++++ docs/sl-rSI/user/mqtt.md | 137 ++++++++++ docs/sl-rSI/user/node-metrics.md | 130 +++++++++ docs/sl-rSI/user/nodes.md | 152 +++++++++++ docs/sl-rSI/user/onboarding.md | 99 +++++++ docs/sl-rSI/user/settings-module-admin.md | 246 ++++++++++++++++++ docs/sl-rSI/user/settings-radio-user.md | 173 ++++++++++++ docs/sl-rSI/user/signal-meter.md | 81 ++++++ docs/sl-rSI/user/tak.md | 126 +++++++++ docs/sl-rSI/user/telemetry-and-sensors.md | 118 +++++++++ docs/sl-rSI/user/translate.md | 97 +++++++ docs/sl-rSI/user/units-and-locale.md | 118 +++++++++ docs/sq-rAL/index.md | 30 +++ docs/sq-rAL/user/connections.md | 125 +++++++++ docs/sq-rAL/user/desktop.md | 147 +++++++++++ docs/sq-rAL/user/discovery.md | 114 ++++++++ docs/sq-rAL/user/firmware.md | 114 ++++++++ docs/sq-rAL/user/map-and-waypoints.md | 116 +++++++++ docs/sq-rAL/user/messages-and-channels.md | 159 +++++++++++ docs/sq-rAL/user/mqtt.md | 137 ++++++++++ docs/sq-rAL/user/node-metrics.md | 130 +++++++++ docs/sq-rAL/user/nodes.md | 152 +++++++++++ docs/sq-rAL/user/onboarding.md | 99 +++++++ docs/sq-rAL/user/settings-module-admin.md | 246 ++++++++++++++++++ docs/sq-rAL/user/settings-radio-user.md | 173 ++++++++++++ docs/sq-rAL/user/signal-meter.md | 81 ++++++ docs/sq-rAL/user/tak.md | 126 +++++++++ docs/sq-rAL/user/telemetry-and-sensors.md | 118 +++++++++ docs/sq-rAL/user/translate.md | 97 +++++++ docs/sq-rAL/user/units-and-locale.md | 118 +++++++++ docs/sr-rLatn/index.md | 30 +++ docs/sr-rLatn/user/connections.md | 125 +++++++++ docs/sr-rLatn/user/desktop.md | 147 +++++++++++ docs/sr-rLatn/user/discovery.md | 114 ++++++++ docs/sr-rLatn/user/firmware.md | 114 ++++++++ docs/sr-rLatn/user/map-and-waypoints.md | 116 +++++++++ docs/sr-rLatn/user/messages-and-channels.md | 159 +++++++++++ docs/sr-rLatn/user/mqtt.md | 137 ++++++++++ docs/sr-rLatn/user/node-metrics.md | 130 +++++++++ docs/sr-rLatn/user/nodes.md | 152 +++++++++++ docs/sr-rLatn/user/onboarding.md | 99 +++++++ docs/sr-rLatn/user/settings-module-admin.md | 246 ++++++++++++++++++ docs/sr-rLatn/user/settings-radio-user.md | 173 ++++++++++++ docs/sr-rLatn/user/signal-meter.md | 81 ++++++ docs/sr-rLatn/user/tak.md | 126 +++++++++ docs/sr-rLatn/user/telemetry-and-sensors.md | 118 +++++++++ docs/sr-rLatn/user/translate.md | 97 +++++++ docs/sr-rLatn/user/units-and-locale.md | 118 +++++++++ docs/srp/index.md | 30 +++ docs/srp/user/connections.md | 125 +++++++++ docs/srp/user/desktop.md | 147 +++++++++++ docs/srp/user/discovery.md | 114 ++++++++ docs/srp/user/firmware.md | 114 ++++++++ docs/srp/user/map-and-waypoints.md | 116 +++++++++ docs/srp/user/messages-and-channels.md | 159 +++++++++++ docs/srp/user/mqtt.md | 137 ++++++++++ docs/srp/user/node-metrics.md | 130 +++++++++ docs/srp/user/nodes.md | 152 +++++++++++ docs/srp/user/onboarding.md | 99 +++++++ docs/srp/user/settings-module-admin.md | 246 ++++++++++++++++++ docs/srp/user/settings-radio-user.md | 173 ++++++++++++ docs/srp/user/signal-meter.md | 81 ++++++ docs/srp/user/tak.md | 126 +++++++++ docs/srp/user/telemetry-and-sensors.md | 118 +++++++++ docs/srp/user/translate.md | 97 +++++++ docs/srp/user/units-and-locale.md | 118 +++++++++ docs/sv-rSE/index.md | 30 +++ docs/sv-rSE/user/connections.md | 125 +++++++++ docs/sv-rSE/user/desktop.md | 147 +++++++++++ docs/sv-rSE/user/discovery.md | 114 ++++++++ docs/sv-rSE/user/firmware.md | 114 ++++++++ docs/sv-rSE/user/map-and-waypoints.md | 116 +++++++++ docs/sv-rSE/user/messages-and-channels.md | 159 +++++++++++ docs/sv-rSE/user/mqtt.md | 137 ++++++++++ docs/sv-rSE/user/node-metrics.md | 130 +++++++++ docs/sv-rSE/user/nodes.md | 152 +++++++++++ docs/sv-rSE/user/onboarding.md | 99 +++++++ docs/sv-rSE/user/settings-module-admin.md | 246 ++++++++++++++++++ docs/sv-rSE/user/settings-radio-user.md | 173 ++++++++++++ docs/sv-rSE/user/signal-meter.md | 81 ++++++ docs/sv-rSE/user/tak.md | 126 +++++++++ docs/sv-rSE/user/telemetry-and-sensors.md | 118 +++++++++ docs/sv-rSE/user/translate.md | 97 +++++++ docs/sv-rSE/user/units-and-locale.md | 118 +++++++++ docs/tr-rTR/index.md | 30 +++ docs/tr-rTR/user/connections.md | 125 +++++++++ docs/tr-rTR/user/desktop.md | 147 +++++++++++ docs/tr-rTR/user/discovery.md | 114 ++++++++ docs/tr-rTR/user/firmware.md | 114 ++++++++ docs/tr-rTR/user/map-and-waypoints.md | 116 +++++++++ docs/tr-rTR/user/messages-and-channels.md | 159 +++++++++++ docs/tr-rTR/user/mqtt.md | 137 ++++++++++ docs/tr-rTR/user/node-metrics.md | 130 +++++++++ docs/tr-rTR/user/nodes.md | 152 +++++++++++ docs/tr-rTR/user/onboarding.md | 99 +++++++ docs/tr-rTR/user/settings-module-admin.md | 246 ++++++++++++++++++ docs/tr-rTR/user/settings-radio-user.md | 173 ++++++++++++ docs/tr-rTR/user/signal-meter.md | 81 ++++++ docs/tr-rTR/user/tak.md | 126 +++++++++ docs/tr-rTR/user/telemetry-and-sensors.md | 118 +++++++++ docs/tr-rTR/user/translate.md | 97 +++++++ docs/tr-rTR/user/units-and-locale.md | 118 +++++++++ docs/uk-rUA/index.md | 30 +++ docs/uk-rUA/user/connections.md | 125 +++++++++ docs/uk-rUA/user/desktop.md | 147 +++++++++++ docs/uk-rUA/user/discovery.md | 114 ++++++++ docs/uk-rUA/user/firmware.md | 114 ++++++++ docs/uk-rUA/user/map-and-waypoints.md | 116 +++++++++ docs/uk-rUA/user/messages-and-channels.md | 159 +++++++++++ docs/uk-rUA/user/mqtt.md | 137 ++++++++++ docs/uk-rUA/user/node-metrics.md | 130 +++++++++ docs/uk-rUA/user/nodes.md | 152 +++++++++++ docs/uk-rUA/user/onboarding.md | 99 +++++++ docs/uk-rUA/user/settings-module-admin.md | 246 ++++++++++++++++++ docs/uk-rUA/user/settings-radio-user.md | 173 ++++++++++++ docs/uk-rUA/user/signal-meter.md | 81 ++++++ docs/uk-rUA/user/tak.md | 126 +++++++++ docs/uk-rUA/user/telemetry-and-sensors.md | 118 +++++++++ docs/uk-rUA/user/translate.md | 97 +++++++ docs/uk-rUA/user/units-and-locale.md | 118 +++++++++ docs/zh-rCN/index.md | 30 +++ docs/zh-rCN/user/connections.md | 125 +++++++++ docs/zh-rCN/user/desktop.md | 147 +++++++++++ docs/zh-rCN/user/discovery.md | 114 ++++++++ docs/zh-rCN/user/firmware.md | 114 ++++++++ docs/zh-rCN/user/map-and-waypoints.md | 116 +++++++++ docs/zh-rCN/user/messages-and-channels.md | 159 +++++++++++ docs/zh-rCN/user/mqtt.md | 137 ++++++++++ docs/zh-rCN/user/node-metrics.md | 130 +++++++++ docs/zh-rCN/user/nodes.md | 152 +++++++++++ docs/zh-rCN/user/onboarding.md | 99 +++++++ docs/zh-rCN/user/settings-module-admin.md | 246 ++++++++++++++++++ docs/zh-rCN/user/settings-radio-user.md | 173 ++++++++++++ docs/zh-rCN/user/signal-meter.md | 81 ++++++ docs/zh-rCN/user/tak.md | 126 +++++++++ docs/zh-rCN/user/telemetry-and-sensors.md | 118 +++++++++ docs/zh-rCN/user/translate.md | 97 +++++++ docs/zh-rCN/user/units-and-locale.md | 118 +++++++++ docs/zh-rTW/index.md | 30 +++ docs/zh-rTW/user/connections.md | 125 +++++++++ docs/zh-rTW/user/desktop.md | 147 +++++++++++ docs/zh-rTW/user/discovery.md | 114 ++++++++ docs/zh-rTW/user/firmware.md | 114 ++++++++ docs/zh-rTW/user/map-and-waypoints.md | 116 +++++++++ docs/zh-rTW/user/messages-and-channels.md | 159 +++++++++++ docs/zh-rTW/user/mqtt.md | 137 ++++++++++ docs/zh-rTW/user/node-metrics.md | 130 +++++++++ docs/zh-rTW/user/nodes.md | 152 +++++++++++ docs/zh-rTW/user/onboarding.md | 237 +++++++++++++++++ docs/zh-rTW/user/settings-module-admin.md | 246 ++++++++++++++++++ docs/zh-rTW/user/settings-radio-user.md | 173 ++++++++++++ docs/zh-rTW/user/signal-meter.md | 225 ++++++++++++++++ docs/zh-rTW/user/tak.md | 126 +++++++++ docs/zh-rTW/user/telemetry-and-sensors.md | 118 +++++++++ docs/zh-rTW/user/translate.md | 97 +++++++ docs/zh-rTW/user/units-and-locale.md | 118 +++++++++ 743 files changed, 89519 insertions(+), 1 deletion(-) create mode 100644 docs/ar-rSA/index.md create mode 100644 docs/ar-rSA/user/connections.md create mode 100644 docs/ar-rSA/user/desktop.md create mode 100644 docs/ar-rSA/user/discovery.md create mode 100644 docs/ar-rSA/user/firmware.md create mode 100644 docs/ar-rSA/user/map-and-waypoints.md create mode 100644 docs/ar-rSA/user/messages-and-channels.md create mode 100644 docs/ar-rSA/user/mqtt.md create mode 100644 docs/ar-rSA/user/node-metrics.md create mode 100644 docs/ar-rSA/user/nodes.md create mode 100644 docs/ar-rSA/user/onboarding.md create mode 100644 docs/ar-rSA/user/settings-module-admin.md create mode 100644 docs/ar-rSA/user/settings-radio-user.md create mode 100644 docs/ar-rSA/user/signal-meter.md create mode 100644 docs/ar-rSA/user/tak.md create mode 100644 docs/ar-rSA/user/telemetry-and-sensors.md create mode 100644 docs/ar-rSA/user/translate.md create mode 100644 docs/ar-rSA/user/units-and-locale.md create mode 100644 docs/be-rBY/index.md create mode 100644 docs/be-rBY/user/connections.md create mode 100644 docs/be-rBY/user/desktop.md create mode 100644 docs/be-rBY/user/discovery.md create mode 100644 docs/be-rBY/user/firmware.md create mode 100644 docs/be-rBY/user/map-and-waypoints.md create mode 100644 docs/be-rBY/user/messages-and-channels.md create mode 100644 docs/be-rBY/user/mqtt.md create mode 100644 docs/be-rBY/user/node-metrics.md create mode 100644 docs/be-rBY/user/nodes.md create mode 100644 docs/be-rBY/user/onboarding.md create mode 100644 docs/be-rBY/user/settings-module-admin.md create mode 100644 docs/be-rBY/user/settings-radio-user.md create mode 100644 docs/be-rBY/user/signal-meter.md create mode 100644 docs/be-rBY/user/tak.md create mode 100644 docs/be-rBY/user/telemetry-and-sensors.md create mode 100644 docs/be-rBY/user/translate.md create mode 100644 docs/be-rBY/user/units-and-locale.md create mode 100644 docs/bg-rBG/index.md create mode 100644 docs/bg-rBG/user/connections.md create mode 100644 docs/bg-rBG/user/desktop.md create mode 100644 docs/bg-rBG/user/discovery.md create mode 100644 docs/bg-rBG/user/firmware.md create mode 100644 docs/bg-rBG/user/map-and-waypoints.md create mode 100644 docs/bg-rBG/user/messages-and-channels.md create mode 100644 docs/bg-rBG/user/mqtt.md create mode 100644 docs/bg-rBG/user/node-metrics.md create mode 100644 docs/bg-rBG/user/nodes.md create mode 100644 docs/bg-rBG/user/onboarding.md create mode 100644 docs/bg-rBG/user/settings-module-admin.md create mode 100644 docs/bg-rBG/user/settings-radio-user.md create mode 100644 docs/bg-rBG/user/signal-meter.md create mode 100644 docs/bg-rBG/user/tak.md create mode 100644 docs/bg-rBG/user/telemetry-and-sensors.md create mode 100644 docs/bg-rBG/user/translate.md create mode 100644 docs/bg-rBG/user/units-and-locale.md create mode 100644 docs/ca-rES/index.md create mode 100644 docs/ca-rES/user/connections.md create mode 100644 docs/ca-rES/user/desktop.md create mode 100644 docs/ca-rES/user/discovery.md create mode 100644 docs/ca-rES/user/firmware.md create mode 100644 docs/ca-rES/user/map-and-waypoints.md create mode 100644 docs/ca-rES/user/messages-and-channels.md create mode 100644 docs/ca-rES/user/mqtt.md create mode 100644 docs/ca-rES/user/node-metrics.md create mode 100644 docs/ca-rES/user/nodes.md create mode 100644 docs/ca-rES/user/onboarding.md create mode 100644 docs/ca-rES/user/settings-module-admin.md create mode 100644 docs/ca-rES/user/settings-radio-user.md create mode 100644 docs/ca-rES/user/signal-meter.md create mode 100644 docs/ca-rES/user/tak.md create mode 100644 docs/ca-rES/user/telemetry-and-sensors.md create mode 100644 docs/ca-rES/user/translate.md create mode 100644 docs/ca-rES/user/units-and-locale.md create mode 100644 docs/cs-rCZ/index.md create mode 100644 docs/cs-rCZ/user/connections.md create mode 100644 docs/cs-rCZ/user/desktop.md create mode 100644 docs/cs-rCZ/user/discovery.md create mode 100644 docs/cs-rCZ/user/firmware.md create mode 100644 docs/cs-rCZ/user/map-and-waypoints.md create mode 100644 docs/cs-rCZ/user/messages-and-channels.md create mode 100644 docs/cs-rCZ/user/mqtt.md create mode 100644 docs/cs-rCZ/user/node-metrics.md create mode 100644 docs/cs-rCZ/user/nodes.md create mode 100644 docs/cs-rCZ/user/onboarding.md create mode 100644 docs/cs-rCZ/user/settings-module-admin.md create mode 100644 docs/cs-rCZ/user/settings-radio-user.md create mode 100644 docs/cs-rCZ/user/signal-meter.md create mode 100644 docs/cs-rCZ/user/tak.md create mode 100644 docs/cs-rCZ/user/telemetry-and-sensors.md create mode 100644 docs/cs-rCZ/user/translate.md create mode 100644 docs/cs-rCZ/user/units-and-locale.md create mode 100644 docs/de-rDE/index.md create mode 100644 docs/de-rDE/user/connections.md create mode 100644 docs/de-rDE/user/desktop.md create mode 100644 docs/de-rDE/user/discovery.md create mode 100644 docs/de-rDE/user/firmware.md create mode 100644 docs/de-rDE/user/map-and-waypoints.md create mode 100644 docs/de-rDE/user/messages-and-channels.md create mode 100644 docs/de-rDE/user/mqtt.md create mode 100644 docs/de-rDE/user/node-metrics.md create mode 100644 docs/de-rDE/user/nodes.md create mode 100644 docs/de-rDE/user/onboarding.md create mode 100644 docs/de-rDE/user/settings-module-admin.md create mode 100644 docs/de-rDE/user/settings-radio-user.md create mode 100644 docs/de-rDE/user/signal-meter.md create mode 100644 docs/de-rDE/user/tak.md create mode 100644 docs/de-rDE/user/telemetry-and-sensors.md create mode 100644 docs/de-rDE/user/translate.md create mode 100644 docs/de-rDE/user/units-and-locale.md create mode 100644 docs/el-rGR/index.md create mode 100644 docs/el-rGR/user/connections.md create mode 100644 docs/el-rGR/user/desktop.md create mode 100644 docs/el-rGR/user/discovery.md create mode 100644 docs/el-rGR/user/firmware.md create mode 100644 docs/el-rGR/user/map-and-waypoints.md create mode 100644 docs/el-rGR/user/messages-and-channels.md create mode 100644 docs/el-rGR/user/mqtt.md create mode 100644 docs/el-rGR/user/node-metrics.md create mode 100644 docs/el-rGR/user/nodes.md create mode 100644 docs/el-rGR/user/onboarding.md create mode 100644 docs/el-rGR/user/settings-module-admin.md create mode 100644 docs/el-rGR/user/settings-radio-user.md create mode 100644 docs/el-rGR/user/signal-meter.md create mode 100644 docs/el-rGR/user/tak.md create mode 100644 docs/el-rGR/user/telemetry-and-sensors.md create mode 100644 docs/el-rGR/user/translate.md create mode 100644 docs/el-rGR/user/units-and-locale.md create mode 100644 docs/es-rES/index.md create mode 100644 docs/es-rES/user/connections.md create mode 100644 docs/es-rES/user/desktop.md create mode 100644 docs/es-rES/user/discovery.md create mode 100644 docs/es-rES/user/firmware.md create mode 100644 docs/es-rES/user/map-and-waypoints.md create mode 100644 docs/es-rES/user/messages-and-channels.md create mode 100644 docs/es-rES/user/mqtt.md create mode 100644 docs/es-rES/user/node-metrics.md create mode 100644 docs/es-rES/user/nodes.md create mode 100644 docs/es-rES/user/onboarding.md create mode 100644 docs/es-rES/user/settings-module-admin.md create mode 100644 docs/es-rES/user/settings-radio-user.md create mode 100644 docs/es-rES/user/signal-meter.md create mode 100644 docs/es-rES/user/tak.md create mode 100644 docs/es-rES/user/telemetry-and-sensors.md create mode 100644 docs/es-rES/user/translate.md create mode 100644 docs/es-rES/user/units-and-locale.md create mode 100644 docs/et-rEE/index.md create mode 100644 docs/et-rEE/user/connections.md create mode 100644 docs/et-rEE/user/desktop.md create mode 100644 docs/et-rEE/user/discovery.md create mode 100644 docs/et-rEE/user/firmware.md create mode 100644 docs/et-rEE/user/map-and-waypoints.md create mode 100644 docs/et-rEE/user/messages-and-channels.md create mode 100644 docs/et-rEE/user/mqtt.md create mode 100644 docs/et-rEE/user/node-metrics.md create mode 100644 docs/et-rEE/user/nodes.md create mode 100644 docs/et-rEE/user/onboarding.md create mode 100644 docs/et-rEE/user/settings-module-admin.md create mode 100644 docs/et-rEE/user/settings-radio-user.md create mode 100644 docs/et-rEE/user/signal-meter.md create mode 100644 docs/et-rEE/user/tak.md create mode 100644 docs/et-rEE/user/telemetry-and-sensors.md create mode 100644 docs/et-rEE/user/translate.md create mode 100644 docs/et-rEE/user/units-and-locale.md create mode 100644 docs/fi-rFI/index.md create mode 100644 docs/fi-rFI/user/connections.md create mode 100644 docs/fi-rFI/user/desktop.md create mode 100644 docs/fi-rFI/user/discovery.md create mode 100644 docs/fi-rFI/user/firmware.md create mode 100644 docs/fi-rFI/user/map-and-waypoints.md create mode 100644 docs/fi-rFI/user/messages-and-channels.md create mode 100644 docs/fi-rFI/user/mqtt.md create mode 100644 docs/fi-rFI/user/node-metrics.md create mode 100644 docs/fi-rFI/user/nodes.md create mode 100644 docs/fi-rFI/user/onboarding.md create mode 100644 docs/fi-rFI/user/settings-module-admin.md create mode 100644 docs/fi-rFI/user/settings-radio-user.md create mode 100644 docs/fi-rFI/user/signal-meter.md create mode 100644 docs/fi-rFI/user/tak.md create mode 100644 docs/fi-rFI/user/telemetry-and-sensors.md create mode 100644 docs/fi-rFI/user/translate.md create mode 100644 docs/fi-rFI/user/units-and-locale.md create mode 100644 docs/fr-rFR/index.md create mode 100644 docs/fr-rFR/user/connections.md create mode 100644 docs/fr-rFR/user/desktop.md create mode 100644 docs/fr-rFR/user/discovery.md create mode 100644 docs/fr-rFR/user/firmware.md create mode 100644 docs/fr-rFR/user/map-and-waypoints.md create mode 100644 docs/fr-rFR/user/messages-and-channels.md create mode 100644 docs/fr-rFR/user/mqtt.md create mode 100644 docs/fr-rFR/user/node-metrics.md create mode 100644 docs/fr-rFR/user/nodes.md create mode 100644 docs/fr-rFR/user/onboarding.md create mode 100644 docs/fr-rFR/user/settings-module-admin.md create mode 100644 docs/fr-rFR/user/settings-radio-user.md create mode 100644 docs/fr-rFR/user/signal-meter.md create mode 100644 docs/fr-rFR/user/tak.md create mode 100644 docs/fr-rFR/user/telemetry-and-sensors.md create mode 100644 docs/fr-rFR/user/translate.md create mode 100644 docs/fr-rFR/user/units-and-locale.md create mode 100644 docs/ga-rIE/index.md create mode 100644 docs/ga-rIE/user/connections.md create mode 100644 docs/ga-rIE/user/desktop.md create mode 100644 docs/ga-rIE/user/discovery.md create mode 100644 docs/ga-rIE/user/firmware.md create mode 100644 docs/ga-rIE/user/map-and-waypoints.md create mode 100644 docs/ga-rIE/user/messages-and-channels.md create mode 100644 docs/ga-rIE/user/mqtt.md create mode 100644 docs/ga-rIE/user/node-metrics.md create mode 100644 docs/ga-rIE/user/nodes.md create mode 100644 docs/ga-rIE/user/onboarding.md create mode 100644 docs/ga-rIE/user/settings-module-admin.md create mode 100644 docs/ga-rIE/user/settings-radio-user.md create mode 100644 docs/ga-rIE/user/signal-meter.md create mode 100644 docs/ga-rIE/user/tak.md create mode 100644 docs/ga-rIE/user/telemetry-and-sensors.md create mode 100644 docs/ga-rIE/user/translate.md create mode 100644 docs/ga-rIE/user/units-and-locale.md create mode 100644 docs/gl-rES/index.md create mode 100644 docs/gl-rES/user/connections.md create mode 100644 docs/gl-rES/user/desktop.md create mode 100644 docs/gl-rES/user/discovery.md create mode 100644 docs/gl-rES/user/firmware.md create mode 100644 docs/gl-rES/user/map-and-waypoints.md create mode 100644 docs/gl-rES/user/messages-and-channels.md create mode 100644 docs/gl-rES/user/mqtt.md create mode 100644 docs/gl-rES/user/node-metrics.md create mode 100644 docs/gl-rES/user/nodes.md create mode 100644 docs/gl-rES/user/onboarding.md create mode 100644 docs/gl-rES/user/settings-module-admin.md create mode 100644 docs/gl-rES/user/settings-radio-user.md create mode 100644 docs/gl-rES/user/signal-meter.md create mode 100644 docs/gl-rES/user/tak.md create mode 100644 docs/gl-rES/user/telemetry-and-sensors.md create mode 100644 docs/gl-rES/user/translate.md create mode 100644 docs/gl-rES/user/units-and-locale.md create mode 100644 docs/hr-rHR/index.md create mode 100644 docs/hr-rHR/user/connections.md create mode 100644 docs/hr-rHR/user/desktop.md create mode 100644 docs/hr-rHR/user/discovery.md create mode 100644 docs/hr-rHR/user/firmware.md create mode 100644 docs/hr-rHR/user/map-and-waypoints.md create mode 100644 docs/hr-rHR/user/messages-and-channels.md create mode 100644 docs/hr-rHR/user/mqtt.md create mode 100644 docs/hr-rHR/user/node-metrics.md create mode 100644 docs/hr-rHR/user/nodes.md create mode 100644 docs/hr-rHR/user/onboarding.md create mode 100644 docs/hr-rHR/user/settings-module-admin.md create mode 100644 docs/hr-rHR/user/settings-radio-user.md create mode 100644 docs/hr-rHR/user/signal-meter.md create mode 100644 docs/hr-rHR/user/tak.md create mode 100644 docs/hr-rHR/user/telemetry-and-sensors.md create mode 100644 docs/hr-rHR/user/translate.md create mode 100644 docs/hr-rHR/user/units-and-locale.md create mode 100644 docs/ht-rHT/index.md create mode 100644 docs/ht-rHT/user/connections.md create mode 100644 docs/ht-rHT/user/desktop.md create mode 100644 docs/ht-rHT/user/discovery.md create mode 100644 docs/ht-rHT/user/firmware.md create mode 100644 docs/ht-rHT/user/map-and-waypoints.md create mode 100644 docs/ht-rHT/user/messages-and-channels.md create mode 100644 docs/ht-rHT/user/mqtt.md create mode 100644 docs/ht-rHT/user/node-metrics.md create mode 100644 docs/ht-rHT/user/nodes.md create mode 100644 docs/ht-rHT/user/onboarding.md create mode 100644 docs/ht-rHT/user/settings-module-admin.md create mode 100644 docs/ht-rHT/user/settings-radio-user.md create mode 100644 docs/ht-rHT/user/signal-meter.md create mode 100644 docs/ht-rHT/user/tak.md create mode 100644 docs/ht-rHT/user/telemetry-and-sensors.md create mode 100644 docs/ht-rHT/user/translate.md create mode 100644 docs/ht-rHT/user/units-and-locale.md create mode 100644 docs/hu-rHU/index.md create mode 100644 docs/hu-rHU/user/connections.md create mode 100644 docs/hu-rHU/user/desktop.md create mode 100644 docs/hu-rHU/user/discovery.md create mode 100644 docs/hu-rHU/user/firmware.md create mode 100644 docs/hu-rHU/user/map-and-waypoints.md create mode 100644 docs/hu-rHU/user/messages-and-channels.md create mode 100644 docs/hu-rHU/user/mqtt.md create mode 100644 docs/hu-rHU/user/node-metrics.md create mode 100644 docs/hu-rHU/user/nodes.md create mode 100644 docs/hu-rHU/user/onboarding.md create mode 100644 docs/hu-rHU/user/settings-module-admin.md create mode 100644 docs/hu-rHU/user/settings-radio-user.md create mode 100644 docs/hu-rHU/user/signal-meter.md create mode 100644 docs/hu-rHU/user/tak.md create mode 100644 docs/hu-rHU/user/telemetry-and-sensors.md create mode 100644 docs/hu-rHU/user/translate.md create mode 100644 docs/hu-rHU/user/units-and-locale.md create mode 100644 docs/is-rIS/index.md create mode 100644 docs/is-rIS/user/connections.md create mode 100644 docs/is-rIS/user/desktop.md create mode 100644 docs/is-rIS/user/discovery.md create mode 100644 docs/is-rIS/user/firmware.md create mode 100644 docs/is-rIS/user/map-and-waypoints.md create mode 100644 docs/is-rIS/user/messages-and-channels.md create mode 100644 docs/is-rIS/user/mqtt.md create mode 100644 docs/is-rIS/user/node-metrics.md create mode 100644 docs/is-rIS/user/nodes.md create mode 100644 docs/is-rIS/user/onboarding.md create mode 100644 docs/is-rIS/user/settings-module-admin.md create mode 100644 docs/is-rIS/user/settings-radio-user.md create mode 100644 docs/is-rIS/user/signal-meter.md create mode 100644 docs/is-rIS/user/tak.md create mode 100644 docs/is-rIS/user/telemetry-and-sensors.md create mode 100644 docs/is-rIS/user/translate.md create mode 100644 docs/is-rIS/user/units-and-locale.md create mode 100644 docs/it-rIT/index.md create mode 100644 docs/it-rIT/user/connections.md create mode 100644 docs/it-rIT/user/desktop.md create mode 100644 docs/it-rIT/user/discovery.md create mode 100644 docs/it-rIT/user/firmware.md create mode 100644 docs/it-rIT/user/map-and-waypoints.md create mode 100644 docs/it-rIT/user/messages-and-channels.md create mode 100644 docs/it-rIT/user/mqtt.md create mode 100644 docs/it-rIT/user/node-metrics.md create mode 100644 docs/it-rIT/user/nodes.md create mode 100644 docs/it-rIT/user/onboarding.md create mode 100644 docs/it-rIT/user/settings-module-admin.md create mode 100644 docs/it-rIT/user/settings-radio-user.md create mode 100644 docs/it-rIT/user/signal-meter.md create mode 100644 docs/it-rIT/user/tak.md create mode 100644 docs/it-rIT/user/telemetry-and-sensors.md create mode 100644 docs/it-rIT/user/translate.md create mode 100644 docs/it-rIT/user/units-and-locale.md create mode 100644 docs/iw-rIL/index.md create mode 100644 docs/iw-rIL/user/connections.md create mode 100644 docs/iw-rIL/user/desktop.md create mode 100644 docs/iw-rIL/user/discovery.md create mode 100644 docs/iw-rIL/user/firmware.md create mode 100644 docs/iw-rIL/user/map-and-waypoints.md create mode 100644 docs/iw-rIL/user/messages-and-channels.md create mode 100644 docs/iw-rIL/user/mqtt.md create mode 100644 docs/iw-rIL/user/node-metrics.md create mode 100644 docs/iw-rIL/user/nodes.md create mode 100644 docs/iw-rIL/user/onboarding.md create mode 100644 docs/iw-rIL/user/settings-module-admin.md create mode 100644 docs/iw-rIL/user/settings-radio-user.md create mode 100644 docs/iw-rIL/user/signal-meter.md create mode 100644 docs/iw-rIL/user/tak.md create mode 100644 docs/iw-rIL/user/telemetry-and-sensors.md create mode 100644 docs/iw-rIL/user/translate.md create mode 100644 docs/iw-rIL/user/units-and-locale.md create mode 100644 docs/ja-rJP/index.md create mode 100644 docs/ja-rJP/user/connections.md create mode 100644 docs/ja-rJP/user/desktop.md create mode 100644 docs/ja-rJP/user/discovery.md create mode 100644 docs/ja-rJP/user/firmware.md create mode 100644 docs/ja-rJP/user/map-and-waypoints.md create mode 100644 docs/ja-rJP/user/messages-and-channels.md create mode 100644 docs/ja-rJP/user/mqtt.md create mode 100644 docs/ja-rJP/user/node-metrics.md create mode 100644 docs/ja-rJP/user/nodes.md create mode 100644 docs/ja-rJP/user/onboarding.md create mode 100644 docs/ja-rJP/user/settings-module-admin.md create mode 100644 docs/ja-rJP/user/settings-radio-user.md create mode 100644 docs/ja-rJP/user/signal-meter.md create mode 100644 docs/ja-rJP/user/tak.md create mode 100644 docs/ja-rJP/user/telemetry-and-sensors.md create mode 100644 docs/ja-rJP/user/translate.md create mode 100644 docs/ja-rJP/user/units-and-locale.md create mode 100644 docs/ko-rKR/index.md create mode 100644 docs/ko-rKR/user/connections.md create mode 100644 docs/ko-rKR/user/desktop.md create mode 100644 docs/ko-rKR/user/discovery.md create mode 100644 docs/ko-rKR/user/firmware.md create mode 100644 docs/ko-rKR/user/map-and-waypoints.md create mode 100644 docs/ko-rKR/user/messages-and-channels.md create mode 100644 docs/ko-rKR/user/mqtt.md create mode 100644 docs/ko-rKR/user/node-metrics.md create mode 100644 docs/ko-rKR/user/nodes.md create mode 100644 docs/ko-rKR/user/onboarding.md create mode 100644 docs/ko-rKR/user/settings-module-admin.md create mode 100644 docs/ko-rKR/user/settings-radio-user.md create mode 100644 docs/ko-rKR/user/signal-meter.md create mode 100644 docs/ko-rKR/user/tak.md create mode 100644 docs/ko-rKR/user/telemetry-and-sensors.md create mode 100644 docs/ko-rKR/user/translate.md create mode 100644 docs/ko-rKR/user/units-and-locale.md create mode 100644 docs/lt-rLT/index.md create mode 100644 docs/lt-rLT/user/connections.md create mode 100644 docs/lt-rLT/user/desktop.md create mode 100644 docs/lt-rLT/user/discovery.md create mode 100644 docs/lt-rLT/user/firmware.md create mode 100644 docs/lt-rLT/user/map-and-waypoints.md create mode 100644 docs/lt-rLT/user/messages-and-channels.md create mode 100644 docs/lt-rLT/user/mqtt.md create mode 100644 docs/lt-rLT/user/node-metrics.md create mode 100644 docs/lt-rLT/user/nodes.md create mode 100644 docs/lt-rLT/user/onboarding.md create mode 100644 docs/lt-rLT/user/settings-module-admin.md create mode 100644 docs/lt-rLT/user/settings-radio-user.md create mode 100644 docs/lt-rLT/user/signal-meter.md create mode 100644 docs/lt-rLT/user/tak.md create mode 100644 docs/lt-rLT/user/telemetry-and-sensors.md create mode 100644 docs/lt-rLT/user/translate.md create mode 100644 docs/lt-rLT/user/units-and-locale.md create mode 100644 docs/nl-rNL/index.md create mode 100644 docs/nl-rNL/user/connections.md create mode 100644 docs/nl-rNL/user/desktop.md create mode 100644 docs/nl-rNL/user/discovery.md create mode 100644 docs/nl-rNL/user/firmware.md create mode 100644 docs/nl-rNL/user/map-and-waypoints.md create mode 100644 docs/nl-rNL/user/messages-and-channels.md create mode 100644 docs/nl-rNL/user/mqtt.md create mode 100644 docs/nl-rNL/user/node-metrics.md create mode 100644 docs/nl-rNL/user/nodes.md create mode 100644 docs/nl-rNL/user/onboarding.md create mode 100644 docs/nl-rNL/user/settings-module-admin.md create mode 100644 docs/nl-rNL/user/settings-radio-user.md create mode 100644 docs/nl-rNL/user/signal-meter.md create mode 100644 docs/nl-rNL/user/tak.md create mode 100644 docs/nl-rNL/user/telemetry-and-sensors.md create mode 100644 docs/nl-rNL/user/translate.md create mode 100644 docs/nl-rNL/user/units-and-locale.md create mode 100644 docs/no-rNO/index.md create mode 100644 docs/no-rNO/user/connections.md create mode 100644 docs/no-rNO/user/desktop.md create mode 100644 docs/no-rNO/user/discovery.md create mode 100644 docs/no-rNO/user/firmware.md create mode 100644 docs/no-rNO/user/map-and-waypoints.md create mode 100644 docs/no-rNO/user/messages-and-channels.md create mode 100644 docs/no-rNO/user/mqtt.md create mode 100644 docs/no-rNO/user/node-metrics.md create mode 100644 docs/no-rNO/user/nodes.md create mode 100644 docs/no-rNO/user/onboarding.md create mode 100644 docs/no-rNO/user/settings-module-admin.md create mode 100644 docs/no-rNO/user/settings-radio-user.md create mode 100644 docs/no-rNO/user/signal-meter.md create mode 100644 docs/no-rNO/user/tak.md create mode 100644 docs/no-rNO/user/telemetry-and-sensors.md create mode 100644 docs/no-rNO/user/translate.md create mode 100644 docs/no-rNO/user/units-and-locale.md create mode 100644 docs/pl-rPL/index.md create mode 100644 docs/pl-rPL/user/connections.md create mode 100644 docs/pl-rPL/user/desktop.md create mode 100644 docs/pl-rPL/user/discovery.md create mode 100644 docs/pl-rPL/user/firmware.md create mode 100644 docs/pl-rPL/user/map-and-waypoints.md create mode 100644 docs/pl-rPL/user/messages-and-channels.md create mode 100644 docs/pl-rPL/user/mqtt.md create mode 100644 docs/pl-rPL/user/node-metrics.md create mode 100644 docs/pl-rPL/user/nodes.md create mode 100644 docs/pl-rPL/user/onboarding.md create mode 100644 docs/pl-rPL/user/settings-module-admin.md create mode 100644 docs/pl-rPL/user/settings-radio-user.md create mode 100644 docs/pl-rPL/user/signal-meter.md create mode 100644 docs/pl-rPL/user/tak.md create mode 100644 docs/pl-rPL/user/telemetry-and-sensors.md create mode 100644 docs/pl-rPL/user/translate.md create mode 100644 docs/pl-rPL/user/units-and-locale.md create mode 100644 docs/pt-rBR/index.md create mode 100644 docs/pt-rBR/user/connections.md create mode 100644 docs/pt-rBR/user/desktop.md create mode 100644 docs/pt-rBR/user/discovery.md create mode 100644 docs/pt-rBR/user/firmware.md create mode 100644 docs/pt-rBR/user/map-and-waypoints.md create mode 100644 docs/pt-rBR/user/messages-and-channels.md create mode 100644 docs/pt-rBR/user/mqtt.md create mode 100644 docs/pt-rBR/user/node-metrics.md create mode 100644 docs/pt-rBR/user/nodes.md create mode 100644 docs/pt-rBR/user/onboarding.md create mode 100644 docs/pt-rBR/user/settings-module-admin.md create mode 100644 docs/pt-rBR/user/settings-radio-user.md create mode 100644 docs/pt-rBR/user/signal-meter.md create mode 100644 docs/pt-rBR/user/tak.md create mode 100644 docs/pt-rBR/user/telemetry-and-sensors.md create mode 100644 docs/pt-rBR/user/translate.md create mode 100644 docs/pt-rBR/user/units-and-locale.md create mode 100644 docs/pt-rPT/index.md create mode 100644 docs/pt-rPT/user/connections.md create mode 100644 docs/pt-rPT/user/desktop.md create mode 100644 docs/pt-rPT/user/discovery.md create mode 100644 docs/pt-rPT/user/firmware.md create mode 100644 docs/pt-rPT/user/map-and-waypoints.md create mode 100644 docs/pt-rPT/user/messages-and-channels.md create mode 100644 docs/pt-rPT/user/mqtt.md create mode 100644 docs/pt-rPT/user/node-metrics.md create mode 100644 docs/pt-rPT/user/nodes.md create mode 100644 docs/pt-rPT/user/onboarding.md create mode 100644 docs/pt-rPT/user/settings-module-admin.md create mode 100644 docs/pt-rPT/user/settings-radio-user.md create mode 100644 docs/pt-rPT/user/signal-meter.md create mode 100644 docs/pt-rPT/user/tak.md create mode 100644 docs/pt-rPT/user/telemetry-and-sensors.md create mode 100644 docs/pt-rPT/user/translate.md create mode 100644 docs/pt-rPT/user/units-and-locale.md create mode 100644 docs/ro-rRO/index.md create mode 100644 docs/ro-rRO/user/connections.md create mode 100644 docs/ro-rRO/user/desktop.md create mode 100644 docs/ro-rRO/user/discovery.md create mode 100644 docs/ro-rRO/user/firmware.md create mode 100644 docs/ro-rRO/user/map-and-waypoints.md create mode 100644 docs/ro-rRO/user/messages-and-channels.md create mode 100644 docs/ro-rRO/user/mqtt.md create mode 100644 docs/ro-rRO/user/node-metrics.md create mode 100644 docs/ro-rRO/user/nodes.md create mode 100644 docs/ro-rRO/user/onboarding.md create mode 100644 docs/ro-rRO/user/settings-module-admin.md create mode 100644 docs/ro-rRO/user/settings-radio-user.md create mode 100644 docs/ro-rRO/user/signal-meter.md create mode 100644 docs/ro-rRO/user/tak.md create mode 100644 docs/ro-rRO/user/telemetry-and-sensors.md create mode 100644 docs/ro-rRO/user/translate.md create mode 100644 docs/ro-rRO/user/units-and-locale.md create mode 100644 docs/ru-rRU/index.md create mode 100644 docs/ru-rRU/user/connections.md create mode 100644 docs/ru-rRU/user/desktop.md create mode 100644 docs/ru-rRU/user/discovery.md create mode 100644 docs/ru-rRU/user/firmware.md create mode 100644 docs/ru-rRU/user/map-and-waypoints.md create mode 100644 docs/ru-rRU/user/messages-and-channels.md create mode 100644 docs/ru-rRU/user/mqtt.md create mode 100644 docs/ru-rRU/user/node-metrics.md create mode 100644 docs/ru-rRU/user/nodes.md create mode 100644 docs/ru-rRU/user/onboarding.md create mode 100644 docs/ru-rRU/user/settings-module-admin.md create mode 100644 docs/ru-rRU/user/settings-radio-user.md create mode 100644 docs/ru-rRU/user/signal-meter.md create mode 100644 docs/ru-rRU/user/tak.md create mode 100644 docs/ru-rRU/user/telemetry-and-sensors.md create mode 100644 docs/ru-rRU/user/translate.md create mode 100644 docs/ru-rRU/user/units-and-locale.md create mode 100644 docs/sk-rSK/index.md create mode 100644 docs/sk-rSK/user/connections.md create mode 100644 docs/sk-rSK/user/desktop.md create mode 100644 docs/sk-rSK/user/discovery.md create mode 100644 docs/sk-rSK/user/firmware.md create mode 100644 docs/sk-rSK/user/map-and-waypoints.md create mode 100644 docs/sk-rSK/user/messages-and-channels.md create mode 100644 docs/sk-rSK/user/mqtt.md create mode 100644 docs/sk-rSK/user/node-metrics.md create mode 100644 docs/sk-rSK/user/nodes.md create mode 100644 docs/sk-rSK/user/onboarding.md create mode 100644 docs/sk-rSK/user/settings-module-admin.md create mode 100644 docs/sk-rSK/user/settings-radio-user.md create mode 100644 docs/sk-rSK/user/signal-meter.md create mode 100644 docs/sk-rSK/user/tak.md create mode 100644 docs/sk-rSK/user/telemetry-and-sensors.md create mode 100644 docs/sk-rSK/user/translate.md create mode 100644 docs/sk-rSK/user/units-and-locale.md create mode 100644 docs/sl-rSI/index.md create mode 100644 docs/sl-rSI/user/connections.md create mode 100644 docs/sl-rSI/user/desktop.md create mode 100644 docs/sl-rSI/user/discovery.md create mode 100644 docs/sl-rSI/user/firmware.md create mode 100644 docs/sl-rSI/user/map-and-waypoints.md create mode 100644 docs/sl-rSI/user/messages-and-channels.md create mode 100644 docs/sl-rSI/user/mqtt.md create mode 100644 docs/sl-rSI/user/node-metrics.md create mode 100644 docs/sl-rSI/user/nodes.md create mode 100644 docs/sl-rSI/user/onboarding.md create mode 100644 docs/sl-rSI/user/settings-module-admin.md create mode 100644 docs/sl-rSI/user/settings-radio-user.md create mode 100644 docs/sl-rSI/user/signal-meter.md create mode 100644 docs/sl-rSI/user/tak.md create mode 100644 docs/sl-rSI/user/telemetry-and-sensors.md create mode 100644 docs/sl-rSI/user/translate.md create mode 100644 docs/sl-rSI/user/units-and-locale.md create mode 100644 docs/sq-rAL/index.md create mode 100644 docs/sq-rAL/user/connections.md create mode 100644 docs/sq-rAL/user/desktop.md create mode 100644 docs/sq-rAL/user/discovery.md create mode 100644 docs/sq-rAL/user/firmware.md create mode 100644 docs/sq-rAL/user/map-and-waypoints.md create mode 100644 docs/sq-rAL/user/messages-and-channels.md create mode 100644 docs/sq-rAL/user/mqtt.md create mode 100644 docs/sq-rAL/user/node-metrics.md create mode 100644 docs/sq-rAL/user/nodes.md create mode 100644 docs/sq-rAL/user/onboarding.md create mode 100644 docs/sq-rAL/user/settings-module-admin.md create mode 100644 docs/sq-rAL/user/settings-radio-user.md create mode 100644 docs/sq-rAL/user/signal-meter.md create mode 100644 docs/sq-rAL/user/tak.md create mode 100644 docs/sq-rAL/user/telemetry-and-sensors.md create mode 100644 docs/sq-rAL/user/translate.md create mode 100644 docs/sq-rAL/user/units-and-locale.md create mode 100644 docs/sr-rLatn/index.md create mode 100644 docs/sr-rLatn/user/connections.md create mode 100644 docs/sr-rLatn/user/desktop.md create mode 100644 docs/sr-rLatn/user/discovery.md create mode 100644 docs/sr-rLatn/user/firmware.md create mode 100644 docs/sr-rLatn/user/map-and-waypoints.md create mode 100644 docs/sr-rLatn/user/messages-and-channels.md create mode 100644 docs/sr-rLatn/user/mqtt.md create mode 100644 docs/sr-rLatn/user/node-metrics.md create mode 100644 docs/sr-rLatn/user/nodes.md create mode 100644 docs/sr-rLatn/user/onboarding.md create mode 100644 docs/sr-rLatn/user/settings-module-admin.md create mode 100644 docs/sr-rLatn/user/settings-radio-user.md create mode 100644 docs/sr-rLatn/user/signal-meter.md create mode 100644 docs/sr-rLatn/user/tak.md create mode 100644 docs/sr-rLatn/user/telemetry-and-sensors.md create mode 100644 docs/sr-rLatn/user/translate.md create mode 100644 docs/sr-rLatn/user/units-and-locale.md create mode 100644 docs/srp/index.md create mode 100644 docs/srp/user/connections.md create mode 100644 docs/srp/user/desktop.md create mode 100644 docs/srp/user/discovery.md create mode 100644 docs/srp/user/firmware.md create mode 100644 docs/srp/user/map-and-waypoints.md create mode 100644 docs/srp/user/messages-and-channels.md create mode 100644 docs/srp/user/mqtt.md create mode 100644 docs/srp/user/node-metrics.md create mode 100644 docs/srp/user/nodes.md create mode 100644 docs/srp/user/onboarding.md create mode 100644 docs/srp/user/settings-module-admin.md create mode 100644 docs/srp/user/settings-radio-user.md create mode 100644 docs/srp/user/signal-meter.md create mode 100644 docs/srp/user/tak.md create mode 100644 docs/srp/user/telemetry-and-sensors.md create mode 100644 docs/srp/user/translate.md create mode 100644 docs/srp/user/units-and-locale.md create mode 100644 docs/sv-rSE/index.md create mode 100644 docs/sv-rSE/user/connections.md create mode 100644 docs/sv-rSE/user/desktop.md create mode 100644 docs/sv-rSE/user/discovery.md create mode 100644 docs/sv-rSE/user/firmware.md create mode 100644 docs/sv-rSE/user/map-and-waypoints.md create mode 100644 docs/sv-rSE/user/messages-and-channels.md create mode 100644 docs/sv-rSE/user/mqtt.md create mode 100644 docs/sv-rSE/user/node-metrics.md create mode 100644 docs/sv-rSE/user/nodes.md create mode 100644 docs/sv-rSE/user/onboarding.md create mode 100644 docs/sv-rSE/user/settings-module-admin.md create mode 100644 docs/sv-rSE/user/settings-radio-user.md create mode 100644 docs/sv-rSE/user/signal-meter.md create mode 100644 docs/sv-rSE/user/tak.md create mode 100644 docs/sv-rSE/user/telemetry-and-sensors.md create mode 100644 docs/sv-rSE/user/translate.md create mode 100644 docs/sv-rSE/user/units-and-locale.md create mode 100644 docs/tr-rTR/index.md create mode 100644 docs/tr-rTR/user/connections.md create mode 100644 docs/tr-rTR/user/desktop.md create mode 100644 docs/tr-rTR/user/discovery.md create mode 100644 docs/tr-rTR/user/firmware.md create mode 100644 docs/tr-rTR/user/map-and-waypoints.md create mode 100644 docs/tr-rTR/user/messages-and-channels.md create mode 100644 docs/tr-rTR/user/mqtt.md create mode 100644 docs/tr-rTR/user/node-metrics.md create mode 100644 docs/tr-rTR/user/nodes.md create mode 100644 docs/tr-rTR/user/onboarding.md create mode 100644 docs/tr-rTR/user/settings-module-admin.md create mode 100644 docs/tr-rTR/user/settings-radio-user.md create mode 100644 docs/tr-rTR/user/signal-meter.md create mode 100644 docs/tr-rTR/user/tak.md create mode 100644 docs/tr-rTR/user/telemetry-and-sensors.md create mode 100644 docs/tr-rTR/user/translate.md create mode 100644 docs/tr-rTR/user/units-and-locale.md create mode 100644 docs/uk-rUA/index.md create mode 100644 docs/uk-rUA/user/connections.md create mode 100644 docs/uk-rUA/user/desktop.md create mode 100644 docs/uk-rUA/user/discovery.md create mode 100644 docs/uk-rUA/user/firmware.md create mode 100644 docs/uk-rUA/user/map-and-waypoints.md create mode 100644 docs/uk-rUA/user/messages-and-channels.md create mode 100644 docs/uk-rUA/user/mqtt.md create mode 100644 docs/uk-rUA/user/node-metrics.md create mode 100644 docs/uk-rUA/user/nodes.md create mode 100644 docs/uk-rUA/user/onboarding.md create mode 100644 docs/uk-rUA/user/settings-module-admin.md create mode 100644 docs/uk-rUA/user/settings-radio-user.md create mode 100644 docs/uk-rUA/user/signal-meter.md create mode 100644 docs/uk-rUA/user/tak.md create mode 100644 docs/uk-rUA/user/telemetry-and-sensors.md create mode 100644 docs/uk-rUA/user/translate.md create mode 100644 docs/uk-rUA/user/units-and-locale.md create mode 100644 docs/zh-rCN/index.md create mode 100644 docs/zh-rCN/user/connections.md create mode 100644 docs/zh-rCN/user/desktop.md create mode 100644 docs/zh-rCN/user/discovery.md create mode 100644 docs/zh-rCN/user/firmware.md create mode 100644 docs/zh-rCN/user/map-and-waypoints.md create mode 100644 docs/zh-rCN/user/messages-and-channels.md create mode 100644 docs/zh-rCN/user/mqtt.md create mode 100644 docs/zh-rCN/user/node-metrics.md create mode 100644 docs/zh-rCN/user/nodes.md create mode 100644 docs/zh-rCN/user/onboarding.md create mode 100644 docs/zh-rCN/user/settings-module-admin.md create mode 100644 docs/zh-rCN/user/settings-radio-user.md create mode 100644 docs/zh-rCN/user/signal-meter.md create mode 100644 docs/zh-rCN/user/tak.md create mode 100644 docs/zh-rCN/user/telemetry-and-sensors.md create mode 100644 docs/zh-rCN/user/translate.md create mode 100644 docs/zh-rCN/user/units-and-locale.md create mode 100644 docs/zh-rTW/index.md create mode 100644 docs/zh-rTW/user/connections.md create mode 100644 docs/zh-rTW/user/desktop.md create mode 100644 docs/zh-rTW/user/discovery.md create mode 100644 docs/zh-rTW/user/firmware.md create mode 100644 docs/zh-rTW/user/map-and-waypoints.md create mode 100644 docs/zh-rTW/user/messages-and-channels.md create mode 100644 docs/zh-rTW/user/mqtt.md create mode 100644 docs/zh-rTW/user/node-metrics.md create mode 100644 docs/zh-rTW/user/nodes.md create mode 100644 docs/zh-rTW/user/onboarding.md create mode 100644 docs/zh-rTW/user/settings-module-admin.md create mode 100644 docs/zh-rTW/user/settings-radio-user.md create mode 100644 docs/zh-rTW/user/signal-meter.md create mode 100644 docs/zh-rTW/user/tak.md create mode 100644 docs/zh-rTW/user/telemetry-and-sensors.md create mode 100644 docs/zh-rTW/user/translate.md create mode 100644 docs/zh-rTW/user/units-and-locale.md diff --git a/androidApp/README.md b/androidApp/README.md index cc4b8cafe..c5c172202 100644 --- a/androidApp/README.md +++ b/androidApp/README.md @@ -49,6 +49,7 @@ graph TB :androidApp -.-> :feature:map :androidApp -.-> :feature:node :androidApp -.-> :feature:settings + :androidApp -.-> :feature:docs :androidApp -.-> :feature:firmware :androidApp -.-> :feature:wifi-provision :androidApp -.-> :feature:widget diff --git a/androidApp/src/main/assets/device_hardware.json b/androidApp/src/main/assets/device_hardware.json index 297ff98dc..e701bbc43 100644 --- a/androidApp/src/main/assets/device_hardware.json +++ b/androidApp/src/main/assets/device_hardware.json @@ -1398,5 +1398,20 @@ "images": [ "mini-epaper-s3.svg" ] + }, + { + "hwModel": 127, + "hwModelSlug": "HELTEC_MESH_NODE_T096", + "platformioTarget": "heltec-mesh-node-t096", + "architecture": "nrf52840", + "activelySupported": false, + "supportLevel": 1, + "displayName": "Heltec Mesh Node 096", + "tags": [ + "Heltec" + ], + "images": [ + "heltec-mesh-node-t096.svg" + ] } ] \ No newline at end of file diff --git a/core/resources/src/commonMain/composeResources/values-ar/strings.xml b/core/resources/src/commonMain/composeResources/values-ar/strings.xml index 92ac33871..9d5bde219 100644 --- a/core/resources/src/commonMain/composeResources/values-ar/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-ar/strings.xml @@ -70,6 +70,8 @@ إعدادات الشاشة المسافة + + MQTT تعديل 8 ساعات diff --git a/core/resources/src/commonMain/composeResources/values-be/strings.xml b/core/resources/src/commonMain/composeResources/values-be/strings.xml index dba5380ae..c8dc859b2 100644 --- a/core/resources/src/commonMain/composeResources/values-be/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-be/strings.xml @@ -85,6 +85,9 @@ Экран Адлегласць + + MQTT + Начало работы Сцягнуць Змяніць 8 Гадзін diff --git a/core/resources/src/commonMain/composeResources/values-bg/strings.xml b/core/resources/src/commonMain/composeResources/values-bg/strings.xml index 41b3abdd7..901ae1d6a 100644 --- a/core/resources/src/commonMain/composeResources/values-bg/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-bg/strings.xml @@ -262,6 +262,13 @@ Измервания на разстояния Показване на разстоянието между вашия телефон и други възли на Meshtastic с позиции. DNS + + Изчистване на търсенето + Връзки + Откриване + MQTT + Възли + Първи стъпки Готово Да не се показва отново за това устройство Downlink активиран diff --git a/core/resources/src/commonMain/composeResources/values-ca/strings.xml b/core/resources/src/commonMain/composeResources/values-ca/strings.xml index f03cde5db..6397542ed 100644 --- a/core/resources/src/commonMain/composeResources/values-ca/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-ca/strings.xml @@ -63,6 +63,7 @@ Distància + Editar 8 Hores diff --git a/core/resources/src/commonMain/composeResources/values-cs/strings.xml b/core/resources/src/commonMain/composeResources/values-cs/strings.xml index f4ba6ffe6..2477f4166 100644 --- a/core/resources/src/commonMain/composeResources/values-cs/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-cs/strings.xml @@ -287,6 +287,12 @@ Filtrovat seznam uzlů a mesh mapu podle vzdálenosti od vašeho telefonu. Měření vzdálenosti Zobrazí vzdálenost mezi vaším telefonem a ostatními uzly Meshtastic s určenou polohou. + + Vymazat hledání + Připojení + Objevujte + MQTT + Uzly Hotovo Dvojité klepnutí jako stisk tlačítka Stahování povoleno diff --git a/core/resources/src/commonMain/composeResources/values-de/strings.xml b/core/resources/src/commonMain/composeResources/values-de/strings.xml index ac9ca54fe..90d889ff7 100644 --- a/core/resources/src/commonMain/composeResources/values-de/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-de/strings.xml @@ -324,6 +324,14 @@ Entfernungsmessungen Zeigt den Abstand zwischen Ihrem Telefon und anderen Meshtastic Knoten mit einem Standort an. DNS + + Neue Suche + Verbindungen + Entdecken + Firmwareaktualisierungen + MQTT + Knoten + Erste Schritte Fertig Für dieses Gerät nicht erneut anzeigen Doppelklick als Taste @@ -731,6 +739,7 @@ Immer Benachrichtigungen stummschalten Benachrichtigungen für '%1$s ' einschalten? + Auswahl stumm schalten Immer stumm Stumm für %1$d Tage, %2$s Stunden Stumm für %1$s Stunden @@ -1135,6 +1144,7 @@ Speichern & Weiterleiten Einstellungen Speichern & Weiterleiten aktiviert Subnet + Erfolgreich Dauer Supertiefschlaf Unterstützt Unterstützt von der Meshtastic Gemeinschaft @@ -1153,8 +1163,19 @@ Teamleiter Teammitglied Unspecified + TAK Server Lokalen TAK Server aktivieren + Startet einen lokalen TLS-Server auf Port 8089 für ATAK/iTAK Verbindungen + Erstelle .zip für ATAK/iTAK um sich mit diesem Server zu verbinden + Server + TAK Mesh Test (Debug) + Alle %1$d Tests an das Netz senden + %1$dB ✓ + + %1$d bestanden, %2$d fehlgeschlagen von %3$d/%4$d + Ausführen + Ausführen: %1$s Teamfarbe Blau Braun @@ -1247,6 +1268,7 @@ Nicht erreichbar Unbeaufsichtigt oder Infrastruktur Stummschaltung aufheben + Auswahl aktivieren Unbekannt Nicht gesetzt - 0 Up/Down/Select Eingang aktiviert @@ -1302,6 +1324,7 @@ Stellen Sie Ihrem mPWRD-OS Gerät WLAN Zugangsdaten über Bluetooth zur Verfügung. Gerät gefunden Bereit zur Suche nach WLAN Netzwerken. + Verstecktes Netzwerk Erfahren Sie mehr über das mPWRD-OS Projekt\nhttps://github.com/mPWRD-OS Keine Netzwerke gefunden Suche nach WLAN Netzwerken fehlgeschlagen: %1$s diff --git a/core/resources/src/commonMain/composeResources/values-el/strings.xml b/core/resources/src/commonMain/composeResources/values-el/strings.xml index f738b3d80..a39e97e18 100644 --- a/core/resources/src/commonMain/composeResources/values-el/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-el/strings.xml @@ -81,6 +81,8 @@ Οθόνη Απόσταση + + MQTT Επεξεργασία 8 Ώρες diff --git a/core/resources/src/commonMain/composeResources/values-es/strings.xml b/core/resources/src/commonMain/composeResources/values-es/strings.xml index d28584d86..c9b6d5fab 100644 --- a/core/resources/src/commonMain/composeResources/values-es/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-es/strings.xml @@ -250,6 +250,12 @@ Mediciones de Distancia Muestra la distancia entre tu teléfono y otros nodos Meshtastic posicionados. DNS + + Borrar búsqueda + Conexiones + MQTT + Nodos + Primeros Pasos Hecho Doble pulsación como botón Baja de Paquetes Permitida diff --git a/core/resources/src/commonMain/composeResources/values-et/strings.xml b/core/resources/src/commonMain/composeResources/values-et/strings.xml index 3d9baec58..bc67f6768 100644 --- a/core/resources/src/commonMain/composeResources/values-et/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-et/strings.xml @@ -324,6 +324,12 @@ Kauguse mõõtmised Kuva telefoni ja teiste Meshtastic sõlmede asukoha vaheline kaugus. DNS + + Puhasta otsing + Ühendus + Avastamine + MQTT + Sõlmed Valmis Ära selle seadme puhul enam kuva Topeltpuudutus nupuna @@ -731,6 +737,7 @@ Alati Vaigista teatised Tühistada '%1$s' teadete vaigistus? + Vaigista valitud Alati vaigistatud Vaigistatud %1$d päeva, %2$s tundi Vaigistatud %1$s tundi @@ -1135,6 +1142,7 @@ Salvesta & edasta sätted Salvesta & edastamine lubatud Alamvõrk + Edukas Super sügava une kestus Toetatud Toetatud Meshtastic kommuuni poolt @@ -1153,8 +1161,19 @@ Meeskonna ülem Meeskonnaliige Määramata + TAK server Kohaliku TAK-serveri lubamine + Käivitab ATAK/iTAK-ühenduste jaoks kohaliku TLS serveri, pordil 8089 + Genereeri selle serveriga ühendumiseks ATAK/iTAK-il .zip fail + Server + TAK kärgvõrgu test (silu) + Saada kõik %1$d testkinnitust kärgvõrku + %1$dB ✓ + + %1$d läbitud, %2$d ebaõnnestunud %3$d/%4$d + Käivita + Töötav: %1$s Meeskonna värv Sinine Pruun @@ -1247,6 +1266,7 @@ Ei võta sõnumeid vastu Jälgimata või infrastruktuuripõhine Eemalda vaigistus + Lõpeta valitud vaigistus Tundmatu Tühistatud - 0 Üles/Alla/Vali sisend lubatud @@ -1302,6 +1322,7 @@ Anna mPWRD-OS-seadmele Sinihamba kaudu WiFi mandaadid. Seade leitud Valmis WiFi võrkude otsimiseks. + Peidetud võrk Lisateavet mPWRD-OS projekti kohta leiate aadressilt\nhttps://github.com/mPWRD-OS Võrke ei leitud WiFi võrkude leidmine ebaõnnestus %1$s diff --git a/core/resources/src/commonMain/composeResources/values-fi/strings.xml b/core/resources/src/commonMain/composeResources/values-fi/strings.xml index ffeeef478..db1bfd87b 100644 --- a/core/resources/src/commonMain/composeResources/values-fi/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-fi/strings.xml @@ -324,6 +324,12 @@ Etäisyyden mittaukset Näytä etäisyys puhelimen ja muiden sijainnin jakavien Meshtastic laitteiden välillä. DNS + + Tyhjennä haku + Yhteydet + Haku + MQTT + Laitteet Valmis Älä näytä enää tälle laitteelle Kaksoisnapautus painikkeena diff --git a/core/resources/src/commonMain/composeResources/values-fr/strings.xml b/core/resources/src/commonMain/composeResources/values-fr/strings.xml index 180d36124..9483cc9d1 100644 --- a/core/resources/src/commonMain/composeResources/values-fr/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-fr/strings.xml @@ -321,6 +321,12 @@ Mesures de distance Afficher la distance entre votre téléphone et les autres nœuds Meshtastic avec des positions. DNS + + Effacer la recherche + Connexions + Découverte + MQTT + Nœuds Terminé Ne plus afficher pour cet appareil Double clic comme appui sur le bouton diff --git a/core/resources/src/commonMain/composeResources/values-ga/strings.xml b/core/resources/src/commonMain/composeResources/values-ga/strings.xml index df75f7caa..68ce105f8 100644 --- a/core/resources/src/commonMain/composeResources/values-ga/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-ga/strings.xml @@ -71,6 +71,7 @@ Sáth + Cuir in eagar 8 Uair an chloig diff --git a/core/resources/src/commonMain/composeResources/values-gl/strings.xml b/core/resources/src/commonMain/composeResources/values-gl/strings.xml index 0d99f2beb..14d45ce2d 100644 --- a/core/resources/src/commonMain/composeResources/values-gl/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-gl/strings.xml @@ -65,6 +65,7 @@ Distancia + Editar 8 Horas diff --git a/core/resources/src/commonMain/composeResources/values-he/strings.xml b/core/resources/src/commonMain/composeResources/values-he/strings.xml index 7f2013e7e..5f0b8c9be 100644 --- a/core/resources/src/commonMain/composeResources/values-he/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-he/strings.xml @@ -64,6 +64,7 @@ מרחק + שגיאה diff --git a/core/resources/src/commonMain/composeResources/values-hr/strings.xml b/core/resources/src/commonMain/composeResources/values-hr/strings.xml index de00f61c7..cf4b948c4 100644 --- a/core/resources/src/commonMain/composeResources/values-hr/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-hr/strings.xml @@ -69,6 +69,7 @@ Udaljenost + Uredi 8 Sati diff --git a/core/resources/src/commonMain/composeResources/values-ht/strings.xml b/core/resources/src/commonMain/composeResources/values-ht/strings.xml index ee2ee0aec..af23992da 100644 --- a/core/resources/src/commonMain/composeResources/values-ht/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-ht/strings.xml @@ -68,6 +68,7 @@ Distans + Modifye 8 Èdtan diff --git a/core/resources/src/commonMain/composeResources/values-hu/strings.xml b/core/resources/src/commonMain/composeResources/values-hu/strings.xml index eeb53a454..11ebf52e9 100644 --- a/core/resources/src/commonMain/composeResources/values-hu/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-hu/strings.xml @@ -254,6 +254,10 @@ Szűrd a csomópont-listát és a mesh térképet a telefon közelsége alapján. Távolságmérés Megjeleníti a távolságot a telefonod és más, pozícióval rendelkező Meshtastic csomópontok között. + + Keresés törlése + MQTT + Csomópontok Dupla koppintás mint gomb Letöltés engedélyezve A nyilvános internetes átjáróból érkező üzenetek továbbításra kerülnek a helyi mesh hálózatra. A zéró-ugrási szabály miatt az alapértelmezett MQTT szerver forgalma nem terjed tovább ennél az eszköznél. diff --git a/core/resources/src/commonMain/composeResources/values-is/strings.xml b/core/resources/src/commonMain/composeResources/values-is/strings.xml index 1e1d6fab6..1d61f5161 100644 --- a/core/resources/src/commonMain/composeResources/values-is/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-is/strings.xml @@ -58,6 +58,7 @@ Aftengd + Hámarsksendingartíma náð. Ekki hægt að senda skilaboð, vinsamlegast reynið aftur síðar. diff --git a/core/resources/src/commonMain/composeResources/values-it/strings.xml b/core/resources/src/commonMain/composeResources/values-it/strings.xml index 7f11f97b1..87fb46eb7 100644 --- a/core/resources/src/commonMain/composeResources/values-it/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-it/strings.xml @@ -276,6 +276,12 @@ Misure di distanza Visualizza la distanza tra il telefono e gli altri nodi Meshtastic con posizione attiva. DNS + + Azzera ricerca + Connessioni + MQTT + Nodi + Come iniziare Fatto Doppio tocco come pressione pulsante Downlink attivato diff --git a/core/resources/src/commonMain/composeResources/values-ja/strings.xml b/core/resources/src/commonMain/composeResources/values-ja/strings.xml index 920316f96..e46e36327 100644 --- a/core/resources/src/commonMain/composeResources/values-ja/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-ja/strings.xml @@ -192,6 +192,12 @@ 表示単位 距離 + + 検索をクリア + コネクション + ディスカバリー + MQTT + ノード ダウンリンクの有効化 動的 Echoを有効化 diff --git a/core/resources/src/commonMain/composeResources/values-ko/strings.xml b/core/resources/src/commonMain/composeResources/values-ko/strings.xml index f56d12d38..23a148ec9 100644 --- a/core/resources/src/commonMain/composeResources/values-ko/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-ko/strings.xml @@ -148,6 +148,9 @@ 거리 DNS + + MQTT + 노드 다운링크 활성화 다운로드 에코 활성화 diff --git a/core/resources/src/commonMain/composeResources/values-lt/strings.xml b/core/resources/src/commonMain/composeResources/values-lt/strings.xml index 0c541ed28..402b54686 100644 --- a/core/resources/src/commonMain/composeResources/values-lt/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-lt/strings.xml @@ -72,6 +72,7 @@ Atstumas + Redaguoti 8 Valandos diff --git a/core/resources/src/commonMain/composeResources/values-nl/strings.xml b/core/resources/src/commonMain/composeResources/values-nl/strings.xml index b85928af1..8bba93e9a 100644 --- a/core/resources/src/commonMain/composeResources/values-nl/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-nl/strings.xml @@ -120,6 +120,8 @@ Geef eenheden weer Afstand + + MQTT Downlink ingeschakeld Dynamisch Echo ingeschakeld diff --git a/core/resources/src/commonMain/composeResources/values-no/strings.xml b/core/resources/src/commonMain/composeResources/values-no/strings.xml index 27349a64a..3335672b8 100644 --- a/core/resources/src/commonMain/composeResources/values-no/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-no/strings.xml @@ -73,6 +73,7 @@ Distanse + Rediger 8 Timer diff --git a/core/resources/src/commonMain/composeResources/values-pl/strings.xml b/core/resources/src/commonMain/composeResources/values-pl/strings.xml index c8fea8a74..a9c8ff1b2 100644 --- a/core/resources/src/commonMain/composeResources/values-pl/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-pl/strings.xml @@ -226,6 +226,10 @@ Odległość DNS + + Wyczyść wyszukiwanie + MQTT + Węzły Wykonano Podwójne dotknięcie jako naciśnięcie przycisku Odbiór włączony diff --git a/core/resources/src/commonMain/composeResources/values-pt-rBR/strings.xml b/core/resources/src/commonMain/composeResources/values-pt-rBR/strings.xml index eb727d403..12bed3d0b 100644 --- a/core/resources/src/commonMain/composeResources/values-pt-rBR/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-pt-rBR/strings.xml @@ -186,6 +186,11 @@ Filtre a lista de nós e o mapa da malha baseado na proximidade do seu telefone. Medição de Distâncias Exiba a distância entre o telefone e outros nós do Meshtastic com posições. + + Limpar busca + Conexões + MQTT + Nós Concluído Downlink ativado Baixar diff --git a/core/resources/src/commonMain/composeResources/values-pt/strings.xml b/core/resources/src/commonMain/composeResources/values-pt/strings.xml index a6525242c..8fb90e093 100644 --- a/core/resources/src/commonMain/composeResources/values-pt/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-pt/strings.xml @@ -150,6 +150,10 @@ Unidade de visualização Distância + + Ligações + MQTT + Nodes Downlink ativado Dinâmico Eco ativado diff --git a/core/resources/src/commonMain/composeResources/values-ro/strings.xml b/core/resources/src/commonMain/composeResources/values-ro/strings.xml index fd52022d7..bde6ecb15 100644 --- a/core/resources/src/commonMain/composeResources/values-ro/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-ro/strings.xml @@ -300,6 +300,11 @@ Măsurătorile distanței Afișează distanța dintre telefonul dvs. și alte noduri Meshtastice cu poziții. DNS + + Ștergeți căutarea + Descoperiți + MQTT + Noduri Gata Apăsare dublă ca buton Downlink activat diff --git a/core/resources/src/commonMain/composeResources/values-ru/strings.xml b/core/resources/src/commonMain/composeResources/values-ru/strings.xml index fe3193c27..4a702d5d2 100644 --- a/core/resources/src/commonMain/composeResources/values-ru/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-ru/strings.xml @@ -326,6 +326,47 @@ Измерения расстояния Показать расстояния между вашим телефоном и другими нодами Meshstatic с позициями. Служба доменных имен (DNS) + + Очистить условия поиска + bluetooth,usb,tcp,pairing,serial,wifi + desktop,linux,macos,windows,serial + discovery,topology,network,scan,neighbor + firmware,update,ota,flash,version,recovery + map,waypoint,gps,position,location,marker + formatter,metric,number,locale,temperature,conversion,api + message,channel,encryption,direct,broadcast,quick-chat + mqtt,broker,internet,bridge,uplink,downlink + metrics,telemetry,signal,snr,rssi,battery,traceroute + node,mesh,list,role,status,favorite,filter + setup,welcome,permissions,first-launch + module,serial,telemetry,canned,store-forward,administration + settings,radio,lora,region,modem,device,power,security + signal,rssi,snr,bars,quality,lora,noise,meter + tak,atak,cursor-on-target,team-awareness + telemetry,sensor,temperature,humidity,pressure,power + translate,crowdin,localization,language,i18n,contribute + units,locale,metric,imperial,temperature,distance + Поиск по документации… + Руководство разработчика + Руководство пользователя + Соединения + Десктопное приложение + Обнаружение + Обновления прошивки + Карта и путевые точки + Измерение и форматирование + Сообщения и каналы + MQTT + Метрики ноды + Ноды + Начало работы + Настройки - Модули и администрирование + Настройки - Радио и пользователь + Измеритель сигнала + Интеграция TAK + Телеметрия и датчики + Перевести приложение + Ед.изм. и локализация Готово Больше не показывать для этого устройства Двойное нажатие как кнопка @@ -503,6 +544,7 @@ Модель оборудования Курс Heartbeat + Справка и документация Скрыть слой Скрыть пароль Макс возврат истории @@ -1168,8 +1210,19 @@ Руководитель команды Участник команды Не определена + Сервер TAK Включить локальный сервер TAK + Запускает локальный TLS-сервер на порту 8089 для подключений ATAK/iTAK + Создайте .zip для ATAK/iTAK, чтобы подключиться к этому серверу + ... Сервер + Сетевой тест TAK (Отладка) + Отправить все %1$d тестовых приспособлений в сеть + %1$dБ ✓ + + %1$d пройдено, %2$d неудачно из %3$d/%4$d + Запустить + Запущено: %1$s Цвет команды Синий Коричневый @@ -1239,7 +1292,7 @@ Ограничение скорости Макс пакетов в окне Окно ограничения скорости (сек.) - Сохраняить хопы маршрутизатора + Сохранять хопы маршрутизатора Порог передач неизвестных пакетов Передать через LoRa BLE diff --git a/core/resources/src/commonMain/composeResources/values-sk/strings.xml b/core/resources/src/commonMain/composeResources/values-sk/strings.xml index b588c65f1..586a2cf66 100644 --- a/core/resources/src/commonMain/composeResources/values-sk/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-sk/strings.xml @@ -130,6 +130,9 @@ Obrazovka Vzdialenosť + + Vymazať vyhľadávanie + MQTT Upraviť 8 Hodín diff --git a/core/resources/src/commonMain/composeResources/values-sl/strings.xml b/core/resources/src/commonMain/composeResources/values-sl/strings.xml index 0b8224682..c7fbd807f 100644 --- a/core/resources/src/commonMain/composeResources/values-sl/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-sl/strings.xml @@ -75,6 +75,7 @@ Razdalja + Uredi 8 Ur diff --git a/core/resources/src/commonMain/composeResources/values-sq/strings.xml b/core/resources/src/commonMain/composeResources/values-sq/strings.xml index b46c26d4e..3c936f5dd 100644 --- a/core/resources/src/commonMain/composeResources/values-sq/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-sq/strings.xml @@ -68,6 +68,7 @@ Distanca + Redakto 8 Orë diff --git a/core/resources/src/commonMain/composeResources/values-sr/strings.xml b/core/resources/src/commonMain/composeResources/values-sr/strings.xml index 4dfd45da8..0a276733c 100644 --- a/core/resources/src/commonMain/composeResources/values-sr/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-sr/strings.xml @@ -142,6 +142,9 @@ Приказ Udaljenost + + Ажурирања фирмвера + Чворови Двоструки додир као дугме Измени 8 Сати diff --git a/core/resources/src/commonMain/composeResources/values-srp/strings.xml b/core/resources/src/commonMain/composeResources/values-srp/strings.xml index dff900b16..3c6105982 100644 --- a/core/resources/src/commonMain/composeResources/values-srp/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-srp/strings.xml @@ -142,6 +142,9 @@ Приказ Раздаљина + + Ажурирања фирмвера + Чворови Двоструки додир као дугме Измени 8 Сати diff --git a/core/resources/src/commonMain/composeResources/values-sv/strings.xml b/core/resources/src/commonMain/composeResources/values-sv/strings.xml index 25b2faccb..babb2d4b7 100644 --- a/core/resources/src/commonMain/composeResources/values-sv/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-sv/strings.xml @@ -303,6 +303,12 @@ Avståndsmätning Visa avståndet mellan din telefon och andra Meshtastic noder med kända positioner. DNS + + Rensa sökning + Upptäckt + MQTT + Noder + Kom igång Klart Visa inte igen för denna enhet Dubbeltryck som knapptryck diff --git a/core/resources/src/commonMain/composeResources/values-tr/strings.xml b/core/resources/src/commonMain/composeResources/values-tr/strings.xml index 85797b2cc..f185cf715 100644 --- a/core/resources/src/commonMain/composeResources/values-tr/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-tr/strings.xml @@ -159,6 +159,11 @@ Mesafe Filtresi Uzaklık Ölçüsü DNS + + Aramayı sil + Bağlantılar + MQTT + Nodelar Aşağı bağlantı etkinleştirildi İndir Dinamik diff --git a/core/resources/src/commonMain/composeResources/values-uk/strings.xml b/core/resources/src/commonMain/composeResources/values-uk/strings.xml index 4561ed44d..82d015e8e 100644 --- a/core/resources/src/commonMain/composeResources/values-uk/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-uk/strings.xml @@ -287,6 +287,10 @@ Фільтри відстані Вимірювання відстані DNS + + Очистити пошук + MQTT + Вузли Готово Подвійний дотик як натискання кнопки Прийом увімкнений diff --git a/core/resources/src/commonMain/composeResources/values-zh-rCN/strings.xml b/core/resources/src/commonMain/composeResources/values-zh-rCN/strings.xml index d94ae3a04..88ba94c80 100644 --- a/core/resources/src/commonMain/composeResources/values-zh-rCN/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-zh-rCN/strings.xml @@ -302,6 +302,13 @@ 距离测量 显示您的手机和其他带有位置的 Meshtastic 节点之间的距离。 DNS + + 清除搜索 + 连接数 + 发现 + 固件升级 + MQTT + 节点 完成 双击作为按钮 启用下行 diff --git a/core/resources/src/commonMain/composeResources/values-zh-rTW/strings.xml b/core/resources/src/commonMain/composeResources/values-zh-rTW/strings.xml index f7e38f343..e624c7b3c 100644 --- a/core/resources/src/commonMain/composeResources/values-zh-rTW/strings.xml +++ b/core/resources/src/commonMain/composeResources/values-zh-rTW/strings.xml @@ -319,6 +319,13 @@ 距離量測 顯示您手機與其他有定位資訊的 Meshtastic 節點之間的距離。 DNS + + 清除搜尋結果 + 連線 + 尋找 + MQTT + 節點 + # 入門指南 完成 雙擊觸發按鈕功能 已啓用下行 diff --git a/docs/ar-rSA/index.md b/docs/ar-rSA/index.md new file mode 100644 index 000000000..98756518f --- /dev/null +++ b/docs/ar-rSA/index.md @@ -0,0 +1,30 @@ +--- +title: Home +layout: default +nav_order: 0 +--- + +# Meshtastic Android App Documentation + +User and developer documentation for the Meshtastic Android, Desktop, and iOS applications powered by KMP (Kotlin Multiplatform). + +Use the sidebar navigation to browse the **User Guide** for app features and the **Developer Guide** for contributing to the project. + +--- + +## Quick Links + +| Guide | الوصف | +| --------------------------------------------------------------------- | -------------------------------------------------------------- | +| [Getting Started](user/onboarding) | Connect your first radio and send a message | +| [Messages & Channels](user/messages-and-channels) | Channel broadcasts, direct messages, reactions, and encryption | +| [Nodes](user/nodes) | Understanding the mesh network node list | +| [Signal Meter](user/signal-meter) | How the LoRa signal quality meter works | +| [Units & Locale](user/units-and-locale) | How temperatures, distances, and times adapt to your region | +| [Desktop App](user/desktop) | Linux, macOS, and Windows desktop usage | +| [Architecture](developer/architecture) | App architecture overview for contributors | +| [Contributing](developer/contributing) | Branch naming, PR workflow, and verification commands | + +--- + +> This documentation is served from the same markdown source that powers the in-app **Help & Documentation** browser. diff --git a/docs/ar-rSA/user/connections.md b/docs/ar-rSA/user/connections.md new file mode 100644 index 000000000..e9cd56955 --- /dev/null +++ b/docs/ar-rSA/user/connections.md @@ -0,0 +1,125 @@ +--- +title: Connections +nav_order: 2 +last_updated: 2026-05-13 +description: Connect your phone or desktop to a Meshtastic radio via Bluetooth, USB, or TCP/IP. +aliases: + - bluetooth + - usb + - tcp + - pairing +--- + +# Connections + +Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node. + +## Bluetooth (BLE) + +Bluetooth Low Energy is the default and most common connection method on Android. + +### Pairing a Device + +1. Ensure your Meshtastic radio is powered on and in pairing mode. +2. Open the app and navigate to **Connections**. +3. Tap **Scan for Devices** — nearby Meshtastic radios will appear. +4. Select your device from the list. +5. Accept the Bluetooth pairing prompt if shown. + +![Device list item](/assets/screenshots/connections_bluetooth_scan.png) + +You can filter devices by transport type using the filter chips at the top: + +![Transport filter chips](/assets/screenshots/connections_transport_filters.png) + +> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. + +### Connection Status + +| Icon | State | الوصف | +| ---- | -------------- | ----------------------------- | +| 🟢 | Connected | Active radio link established | +| 🟡 | Connecting | Handshake in progress | +| 🔴 | انقطع الاتصال | No active connection | +| ⚪ | Not configured | No device selected | + +When connecting, a status indicator shows the current connection state: + +![Connecting status](/assets/screenshots/connections_connecting.png) + +If no devices are found, the app shows an empty state with instructions: + +![No devices found](/assets/screenshots/connections_empty_state.png) + +### Troubleshooting Bluetooth + +- **Device not found:** Toggle Bluetooth off/on, ensure location is enabled. +- **Connection drops:** Move closer to the radio; check for interference. +- **Pairing rejected:** Forget the device in Android Bluetooth settings and retry. + +## USB Serial + +USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable. + +### Setup + +1. Connect your radio via USB cable to your device. +2. The app will prompt for USB permission — tap **Allow**. +3. The connection is established automatically. + +> ⚠️ **Note:** USB connections require OTG support on Android devices. + +## TCP/IP (WiFi) + +Some Meshtastic radios support WiFi connectivity, allowing TCP-based connections. + +### Configuration + +1. Connect your radio to a WiFi network via the radio's web interface or settings. +2. In the app, go to **Connections → TCP**. +3. Enter the radio's IP address and port (default: 4403). +4. Tap **Connect**. + +![WiFi scanning for devices](/assets/screenshots/connections_wifi_scanning.png) + +When a device is found, it appears in the connection list: + +![WiFi device found](/assets/screenshots/connections_wifi_device_found.png) + +A successful connection is confirmed with a status indicator: + +![WiFi connection success](/assets/screenshots/connections_wifi_success.png) + +### When to Use TCP + +- Radio is on the same local network +- Testing with a simulated radio +- Environments where Bluetooth has interference issues + +## Reconnection Behavior + +The app reconnects to the **last selected device** on startup. You can manually switch transports from the connections screen at any time. + +To disconnect from a radio, use the disconnect button on the connections screen: + +![Disconnect from radio](/assets/screenshots/connections_disconnect.png) + +## Desktop Connections + +On Desktop (Linux/macOS/Windows), the app supports: + +- **Bluetooth (BLE)** — via the Kable library; works on macOS, Linux, and Windows +- **USB Serial** — primary wired connection method +- **TCP/IP** — for network-connected radios + +See [Desktop App](desktop) for platform-specific details and keyboard shortcuts. + +## Related Topics + +- [Getting Started](onboarding) — first-launch setup and permissions +- [Settings — Radio & User](settings-radio-user) — Bluetooth and network configuration +- [Desktop App](desktop) — desktop-specific connection details +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — full list of compatible radios on meshtastic.org + +--- + diff --git a/docs/ar-rSA/user/desktop.md b/docs/ar-rSA/user/desktop.md new file mode 100644 index 000000000..4060f9c86 --- /dev/null +++ b/docs/ar-rSA/user/desktop.md @@ -0,0 +1,147 @@ +--- +title: Desktop App +nav_order: 14 +last_updated: 2026-05-13 +description: Install and use the Meshtastic Desktop app on Linux, macOS, and Windows — connections, feature parity, and keyboard shortcuts. +aliases: + - desktop + - linux + - macos + - windows + - jvm +--- + +# Desktop App + +The Meshtastic Desktop application provides the same mesh communication features on Linux, macOS, and Windows. + +## Overview + +The Desktop app shares its core codebase with the Android app through Kotlin Multiplatform (KMP). Most features work identically across platforms. + +## Installation + +### Linux + +- Download the `.deb` or `.AppImage` package from the releases page +- Or build from source using `./gradlew :desktopApp:run` + +### macOS + +- Download the `.dmg` package from releases +- Or build from source + +### Windows + +- Download the `.msi` installer from releases +- Or build from source + +## Connecting Your Radio + +### USB Serial (Primary) + +The most reliable connection method on Desktop: + +1. Connect your Meshtastic radio via USB cable. +2. The app should detect the serial port automatically. +3. If not detected, select the correct serial port from the connections menu. + +### TCP/IP + +For network-connected radios: + +1. Enter the radio's IP address and port (default: 4403). +2. Click **Connect**. + +### Bluetooth (BLE) + +Bluetooth Low Energy is supported on Desktop via the [Kable](https://github.com/JuulLabs/kable) library: + +1. Ensure your system has a Bluetooth adapter. +2. The app scans for nearby Meshtastic radios automatically. +3. Select your device from the connections screen. + +## Feature Parity + +| Feature | Android | Desktop | Notes | +| ---------------------------------------- | ------- | ------- | -------------------------- | +| Messaging | ✓ | ✓ | Full parity | +| Node List | ✓ | ✓ | Full parity | +| الخريطة | ✓ | ✓ | Full parity | +| الإعدادات | ✓ | ✓ | Full parity | +| Bluetooth (BLE) | ✓ | ✓ | Via Kable on desktop | +| Firmware Update OTA | ✓ | ✗ | Use web flasher | +| Notifications | ✓ | ✓ | Native OS notifications | +| Widgets | ✓ | ✗ | Android-only | +| AI Assistant (Chirpy) | ✓\* | ✗ | Google flavor Android only | + +\*Chirpy AI requires Android 14+ on Google flavor builds with supported hardware. + +## UI Differences + +The Desktop app uses the same Compose Multiplatform UI with adaptations for larger screens and desktop interaction. + +### Keyboard Shortcuts + +| Shortcut | Action | +| ------------------- | --------------------------- | +| **⌘Q** / **Ctrl+Q** | Quit the application | +| **⌘,** / **Ctrl+,** | Open Settings | +| **⌘1** / **Ctrl+1** | Switch to Conversations tab | +| **⌘2** / **Ctrl+2** | Switch to Nodes tab | +| **⌘3** / **Ctrl+3** | Switch to Map tab | +| **⌘4** / **Ctrl+4** | Switch to Connections tab | + +### Window & System Tray + +- **Window resizing** — responsive layout adapts to window dimensions +- **System tray** — minimize to system tray for background mesh operation +- **Tray menu** — right-click the tray icon to show window or quit +- **Mouse interaction** — hover states and standard desktop navigation + +### Notification Preferences + +The Desktop app provides in-app toggles for controlling which notifications are shown — messages, new nodes, and low battery alerts. Access these from **Settings → Notifications** within the app. + +## Built-in Documentation Browser + +The Desktop app includes a built-in documentation browser for quick access to help content without leaving the application. + +![Docs browser with table of contents](/assets/screenshots/docs-browser_toc.png) + +The browser supports full-text search across all documentation: + +![Searching the docs browser](/assets/screenshots/docs-browser_search.png) + +Individual doc pages render with full formatting: + +![A documentation page](/assets/screenshots/docs-browser_page.png) + +## Building from Source + +```bash +git clone https://github.com/meshtastic/Meshtastic-Android.git +cd Meshtastic-Android +git submodule update --init +./gradlew :desktopApp:run +``` + +Requirements: + +- JDK 21 +- No Android SDK required for desktop-only builds + +## Known Limitations + +- No OTA firmware updates (use web flasher) +- Some Android-specific features (widgets, specific notification channels) are unavailable +- Performance may vary on low-spec hardware running Compose Desktop +- BLE bonding is not yet supported on desktop (pairing works without bonding) + +## Related Topics + +- [Connections](connections) — connection methods overview +- [Firmware Updates](firmware) — use the [Web Flasher](https://flasher.meshtastic.org) for desktop firmware updates + +--- + diff --git a/docs/ar-rSA/user/discovery.md b/docs/ar-rSA/user/discovery.md new file mode 100644 index 000000000..fe696299b --- /dev/null +++ b/docs/ar-rSA/user/discovery.md @@ -0,0 +1,114 @@ +--- +title: Discovery +nav_order: 12 +last_updated: 2026-05-13 +description: Explore your mesh network — traceroute paths, neighbor maps, and node discovery tools. +aliases: + - mesh-discovery + - local-discovery + - network-scan + - traceroute + - neighbor-info +--- + +# Discovery + +Discovery tools help you understand **how** your mesh network is connected — which nodes can hear each other, what paths messages take, and where bottlenecks or weak links exist. + +> 💡 **Tip:** You don't need a dedicated "discovery mode" to start exploring your mesh. The tools below are available right now from the node list and node detail screens. + +--- + +## Traceroute + +Traceroute reveals the exact path a message takes from your node to any other node on the mesh. It's the single most useful tool for debugging connectivity problems. + +### Running a Traceroute + +1. Navigate to **Nodes** and tap the node you want to trace. +2. On the node detail screen, tap **Traceroute**. +3. The app sends a traceroute request and waits for the response. +4. Results display each hop in order, with signal quality at every step. + +### Reading the Results + +A traceroute result looks like this: + +``` +You → Node A (SNR: 8.5, RSSI: -95) → Node B (SNR: 5.2, RSSI: -108) → Target +``` + +Each hop represents a relay node that forwarded the message. The SNR and RSSI values at each hop tell you about the link quality on that specific segment. + +| What to look for | What it means | +| -------------------------------------------------------------------------- | --------------------------------------------------------------------------- | +| All hops show Good SNR (> 5 dB) | Healthy path — messages flow reliably | +| One hop shows Bad SNR (< 0 dB) | Weak link — this relay segment is fragile | +| Many hops (4+) | Long path — consider repositioning a node to shorten it | +| Different path on retry | Mesh is adapting — multiple routes exist (this is good!) | + +> 💡 **Tip:** Run traceroute several times over a few minutes. If the path changes, your mesh has redundant routes — a sign of a well-connected network. + +### Troubleshooting with Traceroute + +- **"No route found"** — The target node may be offline, out of range, or on a different channel. Check that both nodes share at least one channel with the same encryption key. +- **Traceroute times out** — The path may be too long (exceeds hop limit) or a relay node is congested. Try increasing the hop limit in **Settings → LoRa Config**. +- **Asymmetric paths** — A traceroute from A→B may take a different path than B→A. This is normal — radio propagation is not always symmetric. + +--- + +## Neighbor Info + +The Neighbor Info module lets each node broadcast a list of the nodes it can **directly hear** (single-hop). When multiple nodes share their neighbor lists, you can piece together a topology map of the entire mesh. + +### Enabling Neighbor Info + +1. Navigate to **Settings → Module Config → Neighbor Info**. +2. Enable the module. +3. Set the broadcast interval (default: 900 seconds / 15 minutes). + +Once enabled, your node periodically broadcasts its neighbor table. Other nodes with Neighbor Info enabled do the same. + +### Viewing Neighbor Data + +- Open any node's detail screen and look for the **Neighbors** section. +- Each neighbor entry shows the node that was directly heard and its signal quality. +- Combine neighbor data from multiple nodes to understand the full mesh topology. + +> ⚠️ **Note:** Neighbor Info increases airtime usage because every enabled node periodically broadcasts its neighbor list. On busy meshes with many nodes, consider longer broadcast intervals (3600 seconds or more) to avoid congestion. + +--- + +## Node List as a Discovery Tool + +The node list itself is a powerful discovery tool when you use its filtering and sorting features effectively. + +### Finding New Nodes + +- Sort by **Last heard** to see the most recently active nodes at the top. +- Enable **Include unknown** to see nodes that have appeared on the mesh but haven't sent user info yet — these are often newly powered-on devices. + +### Assessing Connectivity + +- Sort by **Hops away** to see which nodes are directly reachable (0 hops) versus relayed. +- Sort by **Distance** to find nearby nodes and verify they're reachable. +- Use **Exclude MQTT** to focus on nodes reachable over radio (not via internet bridge). + +### Infrastructure Audit + +- Disable **Exclude infrastructure** to see Router, Repeater, Router Late, and Client Base nodes. +- Check their signal quality and last-heard times to verify your infrastructure nodes are healthy. + +See [Nodes](nodes) for full details on filtering and sorting options. + +--- + +## Tips for Mesh Exploration + +- **Start with traceroute** — it gives you immediate, actionable information about a specific path. +- **Enable Neighbor Info on key nodes** — especially routers and repeaters, to build a picture of the backbone. +- **Check the map** — node positions on the [Map](map-and-waypoints) combined with signal data help you understand why some links are strong and others are weak. +- **Compare signal over time** — use the [Signal Meter](signal-meter) guide to interpret SNR and RSSI values correctly. + +--- + diff --git a/docs/ar-rSA/user/firmware.md b/docs/ar-rSA/user/firmware.md new file mode 100644 index 000000000..165a5edd1 --- /dev/null +++ b/docs/ar-rSA/user/firmware.md @@ -0,0 +1,114 @@ +--- +title: Firmware Updates +nav_order: 13 +last_updated: 2026-05-13 +description: Update your radio firmware over Bluetooth — OTA process, version channels, pre-flight checks, and recovery. +aliases: + - firmware + - update + - ota + - flash +--- + +# Firmware Updates + +Keep your Meshtastic radio up to date with the latest firmware for new features, bug fixes, and security improvements. + +## Checking for Updates + +1. Navigate to **Settings → Firmware Update** or tap the firmware notification if shown. +2. The app checks for available firmware versions. +3. Available updates show the version number and changelog summary. + +## Update Methods + +### OTA (Over-The-Air) via Bluetooth + +The most common update method for Android users: + +1. Ensure your radio is connected via Bluetooth. +2. Navigate to the Firmware Update screen. +3. Select the desired firmware version. +4. Tap **Update** to begin the OTA process. +5. Wait for the update to complete — **do not disconnect** during the update. + +![Firmware checking for updates](/assets/screenshots/firmware_checking.png) + +> ⚠️ **Warning:** Interrupting a firmware update can brick your device. Ensure your radio has sufficient battery (>50% recommended) and maintain Bluetooth proximity during the entire process. + +![Firmware disclaimer](/assets/screenshots/firmware_disclaimer.png) + +### USB Flashing + +For recovery or when OTA is unavailable: + +- Use the [Meshtastic Web Flasher](https://flasher.meshtastic.org) +- Or the [Meshtastic CLI tool](https://meshtastic.org/docs/getting-started/flashing-firmware) on desktop + +## Version Channels + +| عربي | الوصف | +| ------ | ------------------------------------------- | +| Stable | Recommended for most users; tested releases | +| Alpha | Preview releases; may contain bugs | + +## Pre-Update Checklist + +Before updating: + +- [ ] Battery > 50% +- [ ] Stable Bluetooth connection +- [ ] Note your current settings (they may reset on major version changes) +- [ ] Check the release notes for breaking changes + +## Post-Update + +After a successful update: + +- The radio will reboot automatically +- Bluetooth connection will re-establish +- Verify your settings are intact +- Check the firmware version in **Settings → About** + +![Firmware update success](/assets/screenshots/firmware_success.png) + +## Troubleshooting + +### Update Stuck + +If the update appears frozen: + +- Wait at least 5 minutes before intervening +- If truly stuck, power-cycle the radio +- Attempt the update again + +![Firmware update error](/assets/screenshots/firmware_error.png) + +### Device Won't Boot After Update + +If your device fails to boot: + +1. Try connecting via USB to a computer +2. Use the web flasher in recovery/DFU mode +3. Flash a known-good firmware version +4. Check the Meshtastic Discord for device-specific recovery steps + +### Compatibility Warnings + +The app may show warnings when: + +- Connected radio firmware is below minimum supported version +- Major version mismatch between app and firmware +- Deprecated features need migration + +> ⚠️ **Important:** Always update the Meshtastic app before or alongside firmware updates to ensure compatibility. + +## Related Topics + +- [Connections](connections) — reconnecting after a firmware update +- [Flashing firmware guide](https://meshtastic.org/docs/getting-started/flashing-firmware) — full firmware flashing walkthrough on meshtastic.org +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — check firmware compatibility by device +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/ar-rSA/user/map-and-waypoints.md b/docs/ar-rSA/user/map-and-waypoints.md new file mode 100644 index 000000000..18d5af5e9 --- /dev/null +++ b/docs/ar-rSA/user/map-and-waypoints.md @@ -0,0 +1,116 @@ +--- +title: Map & Waypoints +nav_order: 6 +last_updated: 2026-05-13 +description: View node positions on the map, create and share waypoints, and manage position sharing and privacy. +aliases: + - map + - waypoints + - gps + - location +--- + +# Map & Waypoints + +The Map screen shows the geographic positions of nodes on your mesh, along with shared waypoints. + +## Map View + +The map displays: + +- **Node positions** — colored markers for each node reporting location +- **Waypoints** — shared points of interest +- **Your position** — your current GPS location + +### Node Markers + +Node markers on the map indicate: + +| Color | Meaning | +| ------ | ---------------------------------------------- | +| Green | Online (heard recently) | +| Yellow | Away (heard within 2 hours) | +| Gray | Offline (stale position) | +| Blue | Your own node | + +### Map Controls + +- **Zoom** — pinch or use +/- buttons +- **Pan** — drag to explore +- **Center** — select the location button to center on your position +- **Node tap** — tap a node marker to view details + +The floating toolbar provides quick access to compass, layer switching, node filters, refresh, and location tracking. Tap the compass to reorient north-up, or tap the location button to center on your current position. + +![Map controls overlay](/assets/screenshots/map_controls_overlay.png) + +## Waypoints + +Waypoints are shared geographic points of interest that all mesh members can see. + +### Creating a Waypoint + +1. Long-press on the map at the desired location. +2. Enter a name and optional description. +3. Choose an icon/emoji for the waypoint. +4. Tap **Send** to share with the mesh. + +### Waypoint Properties + +| Property | الوصف | +| ---------- | ------------------------------------------------------- | +| الاسم | Short identifier (max 30 characters) | +| الوصف | Optional longer description | +| Icon | Visual marker emoji on the map | +| مقفل | If locked, only the creator can edit or delete | +| Expiration | Optional auto-remove time | + +### Waypoint Expiration + +Waypoints can be set to expire automatically: + +- **Never** (default) — waypoint remains until manually deleted +- **Timed** — waypoint is automatically removed after the specified duration (e.g., "remove after 2 hours"). Useful for temporary markers like rally points, hazards, or meeting locations. + +Expired waypoints are automatically hidden from the map so they don't clutter the display. The expiration countdown begins when the waypoint is created, not when other nodes receive it. + +### Managing Waypoints + +- Tap a waypoint on the map to view its details and coordinates +- Edit or delete waypoints you created +- **Locked waypoints** cannot be modified or deleted by other nodes — only the original creator can change them +- Unlocked waypoints can be edited by any mesh member + +## Position Sharing + +### Enabling Position Sharing + +Your node shares its GPS position based on: + +- **Fixed interval** — broadcast position at regular intervals +- **Smart position** — broadcast when movement exceeds a threshold +- **Manual** — only share when explicitly requested + +Configure position behavior in **Settings → Position**. + +### Privacy Considerations + +> 🔒 **Privacy:** Position data is broadcast to all nodes on your channel. If you don't want your location shared, disable GPS position in settings or use a fixed/fake position. + +## Map Sources + +The app supports multiple map tile sources: + +- OpenStreetMap (default) +- Satellite imagery (where available) +- Offline tiles (download map areas for offline use) + +## Related Topics + +- [Nodes](nodes) — view and filter your node list +- [Node Metrics](node-metrics) — signal quality and position history for individual nodes +- [Discovery](discovery) — traceroute and neighbor info for understanding mesh topology +- [Units & Locale](units-and-locale) — distance and coordinate display formats + +--- + diff --git a/docs/ar-rSA/user/messages-and-channels.md b/docs/ar-rSA/user/messages-and-channels.md new file mode 100644 index 000000000..43e9c21c6 --- /dev/null +++ b/docs/ar-rSA/user/messages-and-channels.md @@ -0,0 +1,159 @@ +--- +title: Messages & Channels +nav_order: 3 +last_updated: 2026-05-13 +description: Send and receive messages, manage channels, configure encryption, and use quick chat, reactions, and message actions. +aliases: + - channels + - direct-messages + - messaging + - conversations +--- + +# Messages & Channels + +Meshtastic supports two communication modes: **channel broadcasts** and **direct messages**. + +## القنوات + +Channels are shared communication groups. All nodes configured with the same channel key can read and send messages on that channel. + +### Default Channel + +Every Meshtastic device comes with a default **LongFast** channel. This is an unencrypted channel used for general mesh communication. + +### Channel Security + +Channels support multiple encryption levels: + +| Icon | Security Level | الوصف | +| ---- | ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------- | +| 🔒 | PSK (256-bit AES) | Fully encrypted with a strong pre-shared key. Only nodes with the matching key can read messages. | +| 🔐 | PSK (128-bit AES) | Encrypted with a shorter key. Secure for most uses but 256-bit is preferred for sensitive data. | +| 🔓 | Default / Open | Uses the well-known default key. **Any Meshtastic device** on the same preset can read these messages. | +| ⚠️ | Insecure + Position | Open channel that also broadcasts your GPS position. Use with caution in public meshes. | + +> 🔒 **Security Tip:** 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. + +### Adding a Channel + +1. Navigate to **Settings → Channels**. +2. Tap **Add Channel** or scan a QR code. +3. Configure the channel name and encryption key. +4. Share the channel URL/QR code with others who need access. + +Tapping a channel shows its details and sharing options. + +## Direct Messages + +Direct messages (DMs) are point-to-point encrypted communications between two specific nodes. + +### Sending a Direct Message + +1. Open the **Messages** tab. +2. Select a node from your contacts list or tap a node in the node list. +3. Type your message and tap **Send**. + +### Message States + +| State | Icon | Meaning | +| --------------------------------- | ---- | ----------------------------------------------------------------------------------------------------------------- | +| Queued | ⏳ | Message waiting to be sent | +| En route | ✓ | Delivered to the radio, awaiting acknowledgment | +| Delivered | ✓✓ | Acknowledgment received from recipient | +| Received | ✓ | Message received from the mesh (incoming) | +| S&F Routing | 🔗 | Store & Forward: message being routed through an S&F node | +| S&F Confirmed | 🔗 | Store & Forward: delivery confirmed via S&F node | +| غلط | ✗ | Delivery failed after retries | + +### Delivery Errors + +When a message fails to deliver, the error indicator shows what went wrong: + +| غلط | Meaning | What to Do | +| ---------------- | ---------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| No Route | No path exists to the destination node | The recipient may be offline or out of mesh range. Try later or move closer. | +| Got NAK | The next-hop node refused to relay | The relay node may be congested. Wait and retry. | +| استغرق وقت طويل | No acknowledgment within retry window | The recipient may be just out of range. Try increasing hop limit or moving to a better position. | +| لم يجد وسيط | No radio interface available to send | Check that your radio is connected and the channel is configured. | +| Max Retransmit | All retry attempts exhausted | The mesh path is unreliable. Try a different channel or wait for conditions to improve. | +| لا يوجد قناه | The destination channel doesn't exist | Verify both nodes share the same channel configuration. | +| Too Large | Message exceeds maximum payload size | Shorten your message (max ~230 characters). | +| No Response | Node received message but didn't respond | The recipient's radio may be busy or in low-power sleep mode. | +| Duty Cycle Limit | Regional airtime limit reached | Your radio has used its allowed transmit time. Wait for the duty cycle window to reset (typically 1 hour in EU regions). | +| طلب غير جيد | Malformed or invalid message | This usually indicates a software bug. Try restarting the app. | + +> 💡 **Tip:** 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. + +## Message Features + +### Quick Chat + +Pre-configured messages for rapid communication: + +- Access via the Quick Chat button in the message input area +- Choose from built-in phrases or custom messages +- Customize quick chat messages in **Settings → Quick Chat** +- Useful when typing is impractical (gloves, small screen, urgent) + +![Quick chat option](/assets/screenshots/messages_quick_chat.png) + +The channel list shows each channel with its latest message preview. + +### Message Bubbles + +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. + +### Reactions + +React to messages with emoji: + +- **Long-press** a message to open the actions menu +- Tap **Add Reaction** to choose an emoji +- Reactions appear below the message bubble +- Multiple users can react to the same message +- React to your own messages or others' messages + +![Emoji reaction badges displayed beneath a message](/assets/screenshots/messages_reaction.png) + +> 💡 **Tip:** Reactions are lightweight — they use minimal mesh bandwidth compared to full text messages. + +### Message Actions + +Long-press any message to access: + +- **Copy** — copy message text to clipboard +- **Reply** — quote the message in your response +- **React** — add an emoji reaction +- **Delete** — remove a message you sent (local deletion) + +### Message Priority + +Messages are queued and transmitted based on priority: + +1. Emergency/alert messages (highest) +2. Direct messages +3. Channel broadcasts (lowest) + +### Message Limits + +- **Maximum length:** 237 bytes (approximately 230 characters for ASCII text) +- **Rate limiting:** The mesh enforces airtime fairness; heavy message volume may be throttled +- **Delivery:** Messages are retried automatically if no acknowledgment is received + +## Best Practices + +- Use channels for group coordination +- Use direct messages for private person-to-person communication +- Keep messages short — mesh bandwidth is limited +- Configure encryption for sensitive communications + +## Related Topics + +- [Nodes](nodes) — tap a node to start a direct message +- [Settings — Radio & User](settings-radio-user) — configure channel encryption and presets +- [MQTT](mqtt) — bridge channel messages to the internet +- [Channel configuration](https://meshtastic.org/docs/configuration/radio/channels) — detailed channel settings on meshtastic.org + +--- + diff --git a/docs/ar-rSA/user/mqtt.md b/docs/ar-rSA/user/mqtt.md new file mode 100644 index 000000000..bfdf062c4 --- /dev/null +++ b/docs/ar-rSA/user/mqtt.md @@ -0,0 +1,137 @@ +--- +title: MQTT +nav_order: 11 +last_updated: 2026-05-13 +description: Bridge your mesh to the internet — MQTT broker setup, encryption layers, and map reporting. +aliases: + - mqtt + - internet-bridge + - broker +--- + +# MQTT + +MQTT bridges your Meshtastic mesh network to the internet, enabling long-range communication beyond radio range. + +## Overview + +The MQTT module connects your node to an MQTT broker, allowing: + +- Messages to reach nodes on different physical meshes via the internet +- Integration with home automation and monitoring systems +- Publishing node positions to the public Meshtastic map +- Custom data pipelines for logging and alerting + +## How It Works + +``` +[Your Node] → Radio → [Gateway Node with WiFi] → MQTT Broker → [Remote Gateway] → Radio → [Remote Node] +``` + +A gateway node with internet access (WiFi or Ethernet) publishes mesh messages to an MQTT topic. Remote gateways subscribed to the same topic inject those messages into their local mesh. + +## Configuration + +### Enabling MQTT + +1. Navigate to **Settings → Module Config → MQTT**. +2. Enable the MQTT module. +3. Configure the broker connection: + +![MQTT toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | الوصف | Default | +| --------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------- | +| Server Address | MQTT broker hostname | mqtt.meshtastic.org | +| Username | Broker authentication | meshdev | +| Password | Broker authentication | large4cats | +| Root Topic | Base topic for messages | msh | +| Encryption | Encrypt MQTT payload | Enabled | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON packet support has been removed from firmware; this field is ignored | Disabled | +| TLS | Secure connection to broker | Disabled | +| Map Reporting | Report position to public map | Disabled | + +### Default Meshtastic Broker + +The community maintains a public broker at `mqtt.meshtastic.org`. This is intended for general use and testing. + +> 🔒 **Privacy:** Messages on the public broker are readable by anyone subscribed. Always use channel encryption for private communications. + +### Private Broker + +For better privacy and control, you can run your own MQTT broker: + +- Mosquitto (lightweight, open-source) +- HiveMQ +- EMQX + +Configure your node to point to your private broker with appropriate credentials. + +## Map Reporting + +When Map Reporting is enabled, your node publishes its position to the Meshtastic community map: + +- Visible at [meshmap.net](https://meshmap.net) and similar community map services +- Only position and node info are shared +- Disable this if you don't want your location publicly visible + +## Uplink vs Downlink + +| Direction | الوصف | +| ------------ | -------------------------------- | +| **Uplink** | Messages from mesh → MQTT broker | +| **Downlink** | Messages from MQTT broker → mesh | + +Configure per-channel which directions are active to control message flow and airtime usage. + +## Message Formats + +MQTT uses protobuf message format: + +| Format | الوصف | Use case | +| ------------ | ----------------------------------- | -------------------------- | +| **Protobuf** | Binary Meshtastic protobuf encoding | Node-to-node mesh bridging | + +> ⚠️ **Note:** JSON output support was removed from firmware. The `json_enabled` setting is still visible in the app for legacy compatibility but has no effect on current firmware versions. + +## Encryption & Privacy + +Understanding the layered encryption model: + +1. **Channel encryption** happens on the mesh _before_ MQTT. If your channel has a PSK, the MQTT payload is already encrypted — the broker and any subscribers see only the ciphertext. +2. **MQTT encryption** (the module setting) adds an additional encryption layer for transit to the broker. This protects metadata and routing information. +3. **TLS** encrypts the TCP connection to the broker itself, preventing network-level eavesdropping. + +> 🔒 **Important:** The default public channel has a well-known key. Messages on the default channel sent via MQTT are effectively **unencrypted** — anyone can decode them. Always use a custom PSK for private communications. + +## Best Practices + +- Use channel-level encryption (PSK) on channels that bridge to MQTT +- Don't enable MQTT on nodes without internet access (it will buffer and waste memory) +- Use a private broker for sensitive deployments +- Be mindful of airtime when downlinking messages from busy MQTT topics — every downlinked message consumes radio airtime on your local mesh +- Consider enabling uplink-only if you only need to monitor your mesh remotely without injecting messages back + +## Troubleshooting + +### MQTT Not Connecting + +- **Check WiFi** — the gateway node must have an active internet connection (WiFi or Ethernet). MQTT does not work over the LoRa radio link itself. +- **Verify credentials** — incorrect username or password will silently fail on most brokers. Double-check for trailing spaces. +- **Firewall** — port 1883 (MQTT) or 8883 (MQTT+TLS) must be open. Some networks block non-standard ports. +- **DNS resolution** — if using a custom broker hostname, verify the node can resolve it. Try the broker's IP address directly. + +### Messages Not Bridging + +- **Check uplink/downlink settings** — if only uplink is enabled, messages flow from mesh to MQTT but not back. Enable downlink on the receiving gateway. +- **Channel mismatch** — both gateways must share the same channel with the same PSK. A mismatch means messages are encrypted with different keys and appear as garbage. +- **Topic mismatch** — ensure both gateways use the same root topic. The default `msh` works for the public broker. + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — MQTT module configuration reference +- [Messages & Channels](messages-and-channels) — channel encryption and PSK setup +- [MQTT integration guide](https://meshtastic.org/docs/software/integrations/mqtt) — detailed MQTT documentation on meshtastic.org + +--- + diff --git a/docs/ar-rSA/user/node-metrics.md b/docs/ar-rSA/user/node-metrics.md new file mode 100644 index 000000000..acef754d6 --- /dev/null +++ b/docs/ar-rSA/user/node-metrics.md @@ -0,0 +1,130 @@ +--- +title: Node Metrics +nav_order: 5 +last_updated: 2026-05-13 +description: Telemetry dashboards for each mesh node — device health, environment sensors, signal quality, power, traceroute, and position history. +aliases: + - metrics + - telemetry + - device-metrics + - signal +--- + +# Node Metrics + +The node detail screen provides comprehensive telemetry and metrics for each node on your mesh. + +## Device Metrics + +Basic operating information reported by each node: + +| Metric | الوصف | +| -------------- | ----------------------------------- | +| Battery Level | Current battery percentage | +| شدة التيار | Battery voltage reading | +| استخدام القناة | Percentage of airtime consumed | +| Airtime | Transmission time used by this node | +| Uptime | Time since last reboot | + +Device metrics are displayed as individual cards with trend sparklines showing battery level, voltage, channel utilization, airtime, and uptime over time. + +> 💡 **Tip:** Tap any metric card to expand it into a full chart with historical data points. Pinch to zoom the time axis. + +## Environment Metrics + +Environmental sensor data (requires compatible hardware): + +| Metric | Sensor Examples | +| ------------------------------------ | --------------------- | +| الحرارة | BME280, BME680, SHT31 | +| الرطوبة | BME280, BME680, SHT31 | +| الضغط الجوي | BME280, BMP280 | +| Gas Resistance | BME680 | +| IAQ (Air Quality) | BME680 | + +Environment metrics are charted over time for easy trend analysis — temperature, humidity, and pressure each get their own line chart with the measurement unit displayed on the Y axis. + +> 💡 **Tip:** Environment metrics require a sensor connected to the remote node. Not all nodes report environmental data. See [Telemetry & Sensors](telemetry-and-sensors) for a full list of supported sensors. + +## Signal Metrics + +Radio signal quality information: + +| Metric | الوصف | +| ------------------ | ----------------------------------------------------------------------------- | +| SNR | Signal-to-Noise Ratio (higher is better) | +| مؤشر القوة النسبية | Received Signal Strength Indicator (closer to 0 is better) | +| Hop Count | Number of mesh hops for last message | + +### Signal Quality Reference + +| SNR Range | Quality | +| --------------------------------- | --------- | +| > 10 dB | Excellent | +| 0 to 10 dB | جيد | +| -10 to 0 dB | مناسب | +| < -10 dB | Poor | + +## Power Metrics + +Power management telemetry (requires INA sensor or compatible hardware): + +| Metric | الوصف | +| ----------- | ----------------------- | +| Bus Voltage | Supply voltage | +| الحالي | Power draw in milliamps | +| Power | Calculated wattage | + +## Traceroute + +Traceroute shows the path a message takes through the mesh: + +1. From the node detail screen, tap **Traceroute**. +2. The app sends a traceroute request to the target node. +3. Results show each hop with SNR/RSSI values. + +### Reading Traceroute Results + +``` +You → Node A (SNR: 8.5) → Node B (SNR: 5.2) → Target +``` + +Each hop represents a relay node that forwarded the message. + +## سجل الموقع + +Historical position data for nodes that share their location: + +- GPS coordinates +- Altitude +- Speed (if moving) +- Timestamp for each position report + +## Neighbor Info + +Shows which nodes a given node can directly hear, useful for understanding mesh topology. + +## Viewing Metrics + +1. Navigate to **Nodes**. +2. Tap the node you want to inspect. +3. Select the metric category from the detail tabs. + +![Node detail — local device](/assets/screenshots/nodes_detail_local.png) + +The position tab shows location data for nodes that share GPS: + +![Position inline content](/assets/screenshots/nodes_position.png) + +> ⚠️ **Note:** Metrics are only available when they have been reported by the remote node. Metrics update at intervals configured on each node's telemetry settings. + +## Related Topics + +- [Nodes](nodes) — node list, filtering, and sorting +- [Telemetry & Sensors](telemetry-and-sensors) — supported sensors and configuration +- [Signal Meter](signal-meter) — how signal quality is calculated from SNR and RSSI +- [Discovery](discovery) — traceroute details and neighbor info +- [Units & Locale](units-and-locale) — temperature, distance, and speed display formats + +--- + diff --git a/docs/ar-rSA/user/nodes.md b/docs/ar-rSA/user/nodes.md new file mode 100644 index 000000000..7b80e2ab4 --- /dev/null +++ b/docs/ar-rSA/user/nodes.md @@ -0,0 +1,152 @@ +--- +title: Nodes +nav_order: 4 +last_updated: 2026-05-13 +description: Browse, filter, and sort mesh nodes — view details, signal quality, roles, and quick actions. +aliases: + - node-list + - mesh-nodes + - peers +--- + +# Nodes + +The Nodes screen displays all devices visible on your mesh network. + +## Node List + +The node list shows every node your radio has heard, including: + +- **Node name** — user-configured long name +- **Short name** — 4-character identifier +- **Signal quality** — last heard signal strength +- **Last heard** — time since last communication +- **Distance** — estimated distance (if positions are shared) +- **Battery** — remote node battery level (if telemetry is enabled) + +### Node Status Indicators + +| Badge | Meaning | +| ---------- | ------------------------------------- | +| 🟢 Online | Node heard within the last 15 minutes | +| 🟡 Away | Node heard within the last 2 hours | +| 🔴 Offline | Node not heard for over 2 hours | +| ⭐ Favorite | Node marked as favorite by the user | + +### Node Roles + +Nodes can be configured with different roles that affect their mesh behavior: + +| Role | الوصف | +| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Client | Standard end-user device | +| Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | +| Client Mute | Receives but doesn't retransmit | +| Client Hidden | Like Client Mute, plus hides from node list | +| Router | Prioritizes message forwarding; stays awake to relay | +| Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | +| ~~Router Client~~ | ⚠️ **Deprecated** (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | +| ~~Repeater~~ | ⚠️ **Deprecated** (removed in firmware 2.7.11) — no longer selectable; use Router instead | +| Tracker | Optimized for position reporting at regular intervals | +| Sensor | Optimized for telemetry reporting | +| TAK | Interoperates with TAK systems (sends/receives CoT) | +| TAK Tracker | TAK position reporting only | +| Lost & Found | Continuous position beacon for recovery | + +### Choosing a Role + +Most users should keep the default **Client** role. Consider a different role when: + +- **Router** — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don't use Router on battery-powered handheld devices. +- **Router Late** — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. +- **Client Base** — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. +- **Client Mute** — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only devices or to reduce congestion in dense areas. +- **Tracker** — An unattended device whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. +- **Sensor** — An unattended device reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. +- **TAK / TAK Tracker** — Only needed if interoperating with ATAK/WinTAK systems. See [TAK Integration](tak) for details. + +> 💡 **Tip:** The mesh works best when most nodes are **Client** or **Router**. Too many Mute nodes reduces mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. + +### Encryption Indicators + +Nodes display encryption status icons next to their name: + +| Icon | Meaning | +| ----------- | ------------------------------------------------------------------------------------------------------------------- | +| 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | +| 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | +| ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) | + +> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. + +## Quick Actions + +From the node list, you can: + +- **Tap** a node to view its detail page +- **Long-press** for quick actions: + - Send a direct message + - View on map + - Request position + - Mark as favorite + - Traceroute + +## Filtering & Sorting + +### Text Search + +Type in the search field to filter nodes by name or short name. The filter updates in real time as you type. + +### Filter Toggles + +| عربي | الوصف | +| -------------------------- | ---------------------------------------------------------------------------------------------- | +| **Only online** | Show only nodes heard within the last 15 minutes | +| **Only direct** | Show only nodes with direct (non-relayed) connections | +| **Include unknown** | Show nodes that haven't sent user info yet | +| **Exclude infrastructure** | Hide infrastructure-role nodes (Router, Repeater, Router Late, Client Base) | +| **Exclude MQTT** | Hide nodes heard only via MQTT internet bridge | +| **Show ignored** | Show nodes you've previously dismissed or muted | + +### Sort Options + +| Sort | الوصف | +| ------------------------------------------- | ------------------------------------------------------------------ | +| **Last heard** (default) | Most recently heard nodes first | +| **Alphabetical** | Sorted by node long name | +| **Distance** | Nearest nodes first (requires position sharing) | +| **Hops away** | Fewest relay hops first | +| **Channel** | Grouped by channel index | +| **Via MQTT** | Grouped by MQTT vs. radio-heard | +| **Favorites** | Favorited nodes first | + +## Node Detail + +Tapping a node opens the detail view with comprehensive information. See [Node Metrics](node-metrics) for full details on metrics and telemetry. + +![Node detail view](/assets/screenshots/nodes_node_list.png) + +The detail screen includes device info, position, and action buttons: + +![Node detail section](/assets/screenshots/nodes_detail_section.png) + +Inline status indicators show key metrics at a glance: + +| Indicator | Screenshot | +| -------------- | -------------------------------------------------------- | +| Signal quality | ![Signal](/assets/screenshots/nodes_signal_info.png) | +| Battery level | ![Battery](/assets/screenshots/nodes_battery_info.png) | +| Hop count | ![Hops](/assets/screenshots/nodes_hops_info.png) | +| آخر ظهور | ![Last heard](/assets/screenshots/nodes_last_heard.png) | +| المسافة | ![Distance](/assets/screenshots/nodes_distance_info.png) | + +## Related Topics + +- [Node Metrics](node-metrics) — detailed telemetry dashboards for each node +- [Messages & Channels](messages-and-channels) — send a direct message to a node +- [Map & Waypoints](map-and-waypoints) — view node positions geographically +- [Discovery](discovery) — traceroute and neighbor info for topology exploration +- [Signal Meter](signal-meter) — understand what the signal bars mean + +--- + diff --git a/docs/ar-rSA/user/onboarding.md b/docs/ar-rSA/user/onboarding.md new file mode 100644 index 000000000..3b910534e --- /dev/null +++ b/docs/ar-rSA/user/onboarding.md @@ -0,0 +1,99 @@ +--- +title: Getting Started +nav_order: 1 +last_updated: 2026-05-13 +description: First-launch setup — permissions, onboarding flow, and next steps after connecting your radio. +aliases: + - first-launch + - setup + - intro +--- + +# Getting Started + +Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app. + +## First Launch + +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. + +### Welcome Screen + +The welcome screen introduces Meshtastic and its core capabilities: + +- Off-grid mesh communication +- No cellular or internet required +- End-to-end encrypted messaging + +Tap **Get Started** to proceed through the setup flow. + +![Welcome screen](/assets/screenshots/onboarding_welcome.png) + +## Permissions + +The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. + +### Bluetooth Permission + +Bluetooth is the primary connection method between your phone and Meshtastic radio: + +- **Bluetooth scanning** — discover nearby Meshtastic radios +- **Bluetooth connect** — establish and maintain connections with paired radios + +Grant both permissions when prompted. Without Bluetooth, you'll need to use USB or TCP connections instead. + +### Location Permission + +> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. + +Meshtastic also uses your location for: + +- Showing your position on the mesh map +- Calculating distances to other nodes +- Sharing your GPS coordinates with other mesh members (if enabled) + +Grant **"While using the app"** or **"Always"** depending on your preference: + +- **While using the app** — position updates only when the app is open +- **Always** — enables background position updates for always-on mesh presence + +If denied, Bluetooth scanning will not function and your node will not report a position. + +### Notifications Permission + +Notifications alert you to: + +- Incoming messages from channels and direct messages +- Connection status changes (connected, disconnected, reconnecting) +- Firmware update availability + +> 💡 **Tip:** You can fine-tune notification preferences later in Android system settings. The app creates separate notification channels for messages, connection events, and background service status. + +### Critical Alerts Permission + +On supported devices, the app may request permission for critical alerts: + +- These are high-priority notifications that can break through Do Not Disturb mode +- Useful for emergency mesh alerts or urgent messages +- You can **skip** this step if you don't need breakthrough notifications +- Configure or revoke later in Android notification settings + +## After Setup + +Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. + +> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. + +## What's Next? + +Once connected to a radio, explore: + +- [Connections](connections) — pair your first radio device +- [Messages & Channels](messages-and-channels) — send your first message +- [Nodes](nodes) — see who's on your mesh +- [Map & Waypoints](map-and-waypoints) — view node positions +- [Settings](settings-radio-user) — configure your radio and user profile + +New to Meshtastic? The [getting started guide](https://meshtastic.org/docs/getting-started) on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup. + +--- diff --git a/docs/ar-rSA/user/settings-module-admin.md b/docs/ar-rSA/user/settings-module-admin.md new file mode 100644 index 000000000..b3228640a --- /dev/null +++ b/docs/ar-rSA/user/settings-module-admin.md @@ -0,0 +1,246 @@ +--- +title: Settings — Modules & Admin +nav_order: 8 +last_updated: 2026-05-13 +description: Configure optional feature modules (MQTT, telemetry, canned messages, TAK, and more) and perform device administration. +aliases: + - modules + - module-config + - administration +--- + +# Settings — Modules & Admin + +Configure optional feature modules and perform device administration. Modules extend Meshtastic with specialized capabilities — each can be independently enabled or disabled. + +> 💡 **Tip:** You only need to enable the modules you actually use. Disabling unused modules reduces airtime, saves battery, and simplifies your configuration. + +Module settings use a card-based layout with toggle switches, dropdowns, text fields, and sliders: + +![Toggle switch](/assets/screenshots/settings_switch.png) + +![Dropdown selector](/assets/screenshots/settings_dropdown.png) + +![Text field](/assets/screenshots/settings_text_field.png) + +![Settings card layout](/assets/screenshots/settings_titled_card.png) + +## Module Configuration + +### MQTT Module + +Bridges mesh messages to and from an MQTT broker for internet connectivity. This is how you extend your mesh beyond radio range or integrate with home automation systems. + +| Setting | الوصف | +| --------------- | ------------------------------------------------------------------------ | +| Enabled | Toggle MQTT bridge | +| Server | MQTT broker address | +| Username | Authentication username | +| Password | Authentication password | +| Encryption | Encrypt MQTT payloads | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON support removed from firmware; field is ignored | +| TLS | Use secure connection | +| Root Topic | Base MQTT topic path | +| Map Report | Publish position for public map | + +See [MQTT](mqtt) for a detailed usage guide including encryption, privacy, and broker setup. + +### Serial Module + +Enables serial port communication for external device integrations (GPS modules, sensors, or custom hardware). When enabled, the node's serial port can send and receive protobuf or text data, allowing external microcontrollers or computers to interact with the mesh. + +| Setting | الوصف | +| ---------- | ------------------------------- | +| Enabled | Activate serial communication | +| Echo | Echo received serial data back | +| Mode | Text, Protobuf, or NMEA output | +| RX/TX Pins | GPIO pins for serial connection | +| Baud Rate | Serial communication speed | + +### External Notification Module + +Controls buzzer, LED, or vibration alerts on your radio hardware. Useful for devices that need to physically signal when a message arrives — particularly helpful for unattended or outdoor installations. + +| Setting | الوصف | +| -------------------------------- | --------------------------- | +| Enabled | Activate notifications | +| Alert Message | Notify on incoming messages | +| Alert Message Buzzer | Use buzzer for messages | +| Alert Message Vibra | Use vibration for messages | +| Alert Bell | Notify on bell character | +| Output (GPIO) | Pin for notification output | +| Active | High or Low active | +| Duration (ms) | Notification length | +| Use I2S as Buzzer | Use I2S audio output | + +### Store & Forward Module + +Buffers messages for nodes that were temporarily offline, then replays them when those nodes reconnect. Essential for meshes where nodes go in and out of range regularly — ensures messages aren't lost during brief disconnections. + +| Setting | الوصف | +| ------------------------------------------ | -------------------------- | +| Enabled | Activate store and forward | +| Heartbeat (s) | Announcement interval | +| Records | Maximum stored messages | +| History Return (max) | Max messages to replay | +| History Return (window) | Time window for replay | + +> 💡 **Tip:** Store and Forward works best on nodes with ample memory (ESP32 with PSRAM). Router nodes are ideal candidates since they're typically always-on. + +### Range Test Module + +Automated range testing tool for evaluating link quality between nodes. When enabled, the node periodically transmits test messages with incrementing counters. A receiver node logs these messages, allowing you to walk or drive away and later analyze at what distance messages stopped arriving. + +| Setting | الوصف | +| -------------------------------------- | --------------------------------- | +| Enabled | Activate range testing | +| Sender Interval (s) | Time between test transmissions | +| Save CSV | Log received test data to SD card | + +### Telemetry Module + +Controls what telemetry data your node shares with the mesh. Telemetry includes device health (battery, uptime) and environmental sensor data (temperature, humidity, pressure). + +| Setting | الوصف | +| ---------------------------- | --------------------------------------- | +| Device Metrics Interval | How often to report device metrics | +| Environment Metrics Interval | How often to report environment sensors | +| Air Quality Enabled | Report particulate sensor data | +| Power Metrics Enabled | Report power usage | + +See [Telemetry & Sensors](telemetry-and-sensors) for supported sensors and configuration recommendations. + +### Canned Message Module + +Pre-configured messages accessible from the device's physical buttons (for radios with rotary encoders, keypads, or similar input hardware). Define a list of quick-send messages that can be transmitted without a phone connected — ideal for field use. + +| Setting | الوصف | +| ------------------ | ----------------------------------------------------------- | +| ~~Enabled~~ | ⚠️ **Deprecated** — current firmware may ignore this toggle | +| الرسائل | Newline-separated list of messages | +| Send Bell | Play bell sound on send | +| Rotary Encoder | Enable rotary encoder input | +| Up/Down/Press Pins | GPIO pin assignments for input | + +### Audio Module + +Codec2 audio support for low-bandwidth voice communication over the mesh. This is an **experimental** feature that encodes voice into very small data packets using the Codec2 codec. + +| Setting | الوصف | +| --------------- | -------------------------------- | +| Enabled | Activate audio module | +| Codec2 Rate | Audio quality/bandwidth tradeoff | +| I2S Word Select | GPIO pin for I2S WS | +| I2S Data In | GPIO pin for I2S DIN | +| I2S Data Out | GPIO pin for I2S DOUT | + +> ⚠️ **Note:** Audio requires specific hardware (I2S microphone and speaker). Voice quality is very low-bandwidth — think "understandable radio voice," not phone-call quality. + +### Remote Hardware Module + +GPIO control over the mesh network. Allows a remote node to read or write GPIO pins on another node — useful for activating relays, reading switches, or controlling external hardware from a distance. + +| Setting | الوصف | +| -------------------- | --------------------------------------------------------------- | +| Enabled | Activate remote GPIO access | +| Allow Undefined Pins | Allow access to any GPIO pin (security risk) | + +> ⚠️ **Warning:** Enabling "Allow Undefined Pins" gives remote nodes access to all GPIO pins, which could interfere with the radio's own hardware. Only enable on dedicated GPIO nodes. + +### Neighbor Info Module + +Broadcasts information about directly heard neighbors, enabling mesh topology mapping. Each enabled node periodically shares a list of the other nodes it can hear and their signal quality. + +| Setting | الوصف | +| -------------------------------------- | ------------------------------------ | +| Enabled | Activate neighbor broadcasting | +| Update Interval (s) | How often to broadcast neighbor list | + +See [Discovery](discovery) for how to use neighbor data for mesh topology exploration. + +### Ambient Lighting Module + +Controls onboard NeoPixel or other addressable RGB LEDs on supported hardware. Can be used for visual status indicators, notification lights, or decorative effects. + +| Setting | الوصف | +| ------------------ | ---------------------------------------------------------- | +| Enabled | Activate LED control | +| LED State | On, Off, or set specific color | +| Red / Green / Blue | Individual color channel values (0–255) | + +### Detection Sensor Module + +Turns your node into a motion or door sensor alert system. When a GPIO pin detects a state change (motion detected, door opened), the node broadcasts an alert message over the mesh. + +| Setting | الوصف | +| ---------------------------------------- | ----------------------------------------------------------------------- | +| Enabled | Activate detection sensor | +| Monitor Pin | GPIO pin connected to sensor | +| Detection Triggered High | Trigger when pin goes high (vs. low) | +| Minimum Broadcast (s) | Minimum time between alert broadcasts | +| State Broadcast (s) | Periodic state broadcast interval | +| Send Bell | Include bell character in alerts | +| Friendly Name | Custom name for this sensor | + +### Paxcounter Module + +People counter using WiFi and BLE probe requests. Counts nearby devices by passively listening for probe requests that phones and laptops emit when scanning for networks. Available only on ESP32 devices. + +| Setting | الوصف | +| -------------------------------------- | -------------------------- | +| Enabled | Activate people counting | +| Update Interval (s) | How often to report counts | + +> 💡 **Tip:** Paxcounter is useful for estimating foot traffic at trailheads, event venues, or other locations. Counts are approximate — one person may carry multiple devices. + +### TAK Module + +Team Awareness Kit integration for interoperability with ATAK and WinTAK. See [TAK Integration](tak) for detailed setup and usage. + +## الإدارة + +### Remote Administration + +Remotely configure nodes that share your admin key: + +1. Select the target node in the node list. +2. Navigate to **Settings** for that node. +3. Modify configuration. +4. Tap **Save** — changes are sent over the mesh. + +> ⚠️ **Requires:** Admin key configured on both your node and the target node. + +### Clean Node Database + +Removes stale nodes from your local database that haven't been heard in a configurable time window. + +### Factory Reset + +Resets all settings to factory defaults. **This cannot be undone.** + +### إعادة التشغيل + +Remotely reboot a connected or administered node. + +### Debug Panel + +View detailed diagnostic information: + +- Protocol buffers debug output +- Mesh packet log +- Connection state details + +### Troubleshooting Remote Admin + +- **"No response from target node"** — the target may be out of range, offline, or have a mismatched admin key. Verify the admin key matches on both nodes. +- **Changes not applying** — some settings require a reboot to take effect. Try the Reboot action after saving. +- **Can't see remote settings** — ensure your node has the admin key for the target node and that Admin Channel is enabled in Security Config. + +## Related Topics + +- [Settings — Radio & User](settings-radio-user) — core radio and user profile settings +- [Module configuration reference](https://meshtastic.org/docs/configuration/module) — detailed module docs on meshtastic.org +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/ar-rSA/user/settings-radio-user.md b/docs/ar-rSA/user/settings-radio-user.md new file mode 100644 index 000000000..3bbf19712 --- /dev/null +++ b/docs/ar-rSA/user/settings-radio-user.md @@ -0,0 +1,173 @@ +--- +title: Settings — Radio & User +nav_order: 7 +last_updated: 2026-05-13 +description: Configure your radio hardware, LoRa presets, user profile, position sharing, power management, and security. +aliases: + - الإعدادات + - radio-config + - user-config + - lora +--- + +# Settings — Radio & User + +Configure your radio hardware and user identity parameters. + +## User Settings + +### User Profile + +| Setting | الوصف | +| ----------------- | ------------------------------------------------------------------------------------- | +| Long Name | Your display name (up to 39 characters) | +| Short Name | 4-character abbreviated name | +| Licensed Operator | Enable if you hold an amateur radio license (enables higher power) | + +### Applying Changes + +After modifying settings, tap **Save** to write the configuration to your radio. The device may reboot to apply changes. + +## Radio Configuration + +### Device Config + +| Setting | الوصف | Default | +| ------------------------------------------ | ----------------------------------------------------------------------- | -------- | +| Role | Node behavior (Client, Router, etc.) | Client | +| Rebroadcast Mode | How the node retransmits messages | All | +| Node Info Broadcast (s) | Interval for broadcasting node info | 10800 | +| Double-tap Button | Action for double-tap button press | Disabled | + +### LoRa Config + +| Setting | الوصف | Default | +| ----------------- | ----------------------------------------------------------------------- | ----------------------------------------- | +| الجهة | Regulatory region for frequency bands | Unset (must configure) | +| Modem Preset | Speed/range tradeoff | LongFast | +| Hop Limit | Maximum retransmit hops | 3 | +| TX Power | Transmission power (dBm); 0 = max allowed for region | 0 (region max) | +| Frequency Offset | Fine-tune frequency (MHz) | 0 | +| Channel Bandwidth | Bandwidth setting | Default for preset | + +> ⚠️ **Important:** You **must** set your region before transmitting. Operating without the correct region may violate local radio regulations. See the [region configuration guide](https://meshtastic.org/docs/getting-started/initial-config) on meshtastic.org for details. + +### Modem Presets + +| Preset | Range | Speed | SNR Limit | Best For | +| ------------------ | ----------------------- | ------------------------- | ------------------------ | -------------------------------------------------------------------------------------------------------- | +| Short Turbo | ~1 km | 21.9 kbps | −5 dB | Dense urban with line-of-sight; data-heavy applications | +| Short Fast | ~3 km | 10.9 kbps | −7.5 dB | Urban neighborhoods; buildings within a few blocks | +| Short Slow | ~5 km | 5.5 kbps | −10 dB | Suburban short-range; moderate building density | +| Medium Fast | ~5 km | 5.5 kbps | −10 dB | Suburban areas; moderate building density | +| Medium Slow | ~8 km | 1.1 kbps | −12.5 dB | Suburban/rural; moderate range with slower speed | +| Long Turbo | ~10 km | 4.4 kbps | −10 dB | Similar range to Long Fast but with 500 kHz bandwidth; faster throughput | +| Long Fast | ~10 km | 1.1 kbps | −12.5 dB | **General use (default)** — balanced range and speed | +| Long Moderate | ~20 km | 0.34 kbps | −15 dB | Rural with some terrain; occasional use | +| Lite Fast | ~5 km | 5.5 kbps | −10 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Medium Fast | +| Lite Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Long Fast | +| Narrow Fast | ~5 km | 2.7 kbps | −10 dB | EU 868 MHz band (62.5 kHz BW); avoids interference with other devices | +| Narrow Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 868 MHz band (62.5 kHz BW); comparable to Long Fast | +| ~~Long Slow~~ | ~30 km | 0.18 kbps | −17.5 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | +| ~~Very Long Slow~~ | ~40+ km | 0.09 kbps | −20 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | + +#### Choosing a Modem Preset + +The modem preset controls the fundamental tradeoff between **range** and **data rate**: + +- **Slower presets** use more spreading, making signals decodable at weaker signal levels (lower SNR limit). This means longer range but fewer bytes per second. +- **Faster presets** pack more data per transmission but require a stronger signal to decode. + +**Practical guidance:** + +- **Urban mesh (many nodes, short distances):** Use **Long Fast** (default) or **Short Fast**. Higher speed means less airtime congestion when many nodes share the channel. +- **Rural/sparse mesh (few nodes, long distances):** Use **Long Moderate**. Range matters more than speed when nodes are far apart. +- **EU 866/868 MHz regulatory compliance:** Use **Lite Fast**, **Lite Slow**, **Narrow Fast**, or **Narrow Slow** — these are optimized for the EU SRD/868 MHz bands with narrower bandwidths. +- **Fixed infrastructure links:** Use **Short Turbo** or **Long Turbo** for dedicated point-to-point links with good antennas and line-of-sight. +- **Mixed environments:** Stick with **Long Fast** — it's the community default and ensures compatibility with others in your area. + +> ⚠️ **Important:** All nodes on the same channel **must** use the same modem preset. Nodes with mismatched presets cannot communicate even if they share the same frequency and encryption key. + +> 💡 **Tip:** The range estimates above assume flat terrain and modest antennas. Elevation advantage (hilltop, rooftop) dramatically increases effective range. A well-placed Router with Long Fast can often outperform a ground-level node with Long Slow. + +### Display Config + +| Setting | الوصف | +| ------------------- | ------------------------------------------------------------------------------------ | +| Screen Timeout | Time before display sleeps | +| Display Units | Metric or Imperial | +| OLED Type | Auto, SSD1306, SH1106, SH1107 | +| Compass Orientation | Rotation offset for compass display (0°, 90°, 180°, 270°) | +| ~~Compass North~~ | ⚠️ **Deprecated** — replaced by Compass Orientation; still visible in older firmware | + +### Position Config + +| Setting | الوصف | +| ----------------------------------------- | ---------------------------------- | +| GPS Enabled | Enable/disable GPS | +| GPS Update Interval | How often to acquire GPS fix | +| Position Broadcast (s) | How often to share position | +| Smart Position | Enable movement-based broadcasting | +| Fixed Position | Use a manually set position | + +### Power Config + +| Setting | الوصف | +| --------------------------------------- | --------------------------------------- | +| Power Saving | Enable low-power sleep mode | +| Shutdown After (s) | Auto-shutdown idle timer | +| ADC Multiplier | Battery voltage calibration factor | +| Wait Bluetooth (s) | Time to wait for BLE connection at boot | +| Mesh SDS Timeout (s) | Super-deep-sleep timeout | + +### Network Config + +| Setting | الوصف | +| ------------- | ---------------------------------------------------- | +| WiFi Enabled | Enable WiFi radio (ESP32 devices) | +| WiFi SSID | Network name to connect to | +| WiFi PSK | Network password | +| NTP Server | Time synchronization server | +| Syslog Server | Remote logging server | + +![IP address field](/assets/screenshots/settings_ipv4_field.png) + +### Bluetooth Config + +| Setting | الوصف | +| ----------------- | ------------------------------------------------------------------------- | +| Bluetooth Enabled | Enable/disable BLE radio | +| Pairing Mode | Fixed PIN, Random PIN, or No PIN | +| Fixed PIN | PIN code for pairing (default: 123456) | + +### Security Config + +| Setting | الوصف | +| --------------------- | -------------------------------------------------------------------------- | +| Public Key | Your node's public key (read-only) | +| Admin Key | Key for remote administration | +| Private Key | Your node's private key (handle securely) | +| Admin Channel Enabled | Allow admin commands via channel | +| Debug Log | Output live debug logging over serial/bluetooth | +| Serial Enabled | Enable serial console access (moved from Device Config) | +| Managed Mode | Restrict non-admin channel changes | + +![Password field](/assets/screenshots/settings_password_field.png) + +Settings use standard preference controls — dropdowns, toggles, and sliders: + +| Control | Screenshot | +| -------- | ------------------------------------------------------ | +| Dropdown | ![Dropdown](/assets/screenshots/settings_dropdown.png) | +| Toggle | ![Toggle](/assets/screenshots/settings_switch.png) | +| Slider | ![Slider](/assets/screenshots/settings_slider.png) | + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — optional feature modules and device administration +- [Signal Meter](signal-meter) — how modem presets affect signal quality thresholds +- [LoRa configuration](https://meshtastic.org/docs/configuration/radio/lora) — detailed LoRa settings reference on meshtastic.org +- [Initial configuration](https://meshtastic.org/docs/getting-started/initial-config) — region setup guide on meshtastic.org + +--- + diff --git a/docs/ar-rSA/user/signal-meter.md b/docs/ar-rSA/user/signal-meter.md new file mode 100644 index 000000000..d1822e68c --- /dev/null +++ b/docs/ar-rSA/user/signal-meter.md @@ -0,0 +1,81 @@ +--- +title: How the Meshtastic Signal Meter Works +nav_order: 15 +last_updated: 2026-05-13 +description: How the signal meter calculates quality from RSSI and SNR — LoRa spread spectrum, presets, and what the bars really mean. +aliases: + - signal + - signal-meter + - snr + - rssi +--- + +# How the Meshtastic Signal Meter Works + +The Meshtastic signal meter — the familiar bars or status color in the app — is calculated very differently than the "bars" on a traditional cell phone or Wi-Fi router. + +Most consumer devices simply measure how "loud" a signal is. However, because Meshtastic uses **LoRa (Long Range)** technology, its signal meter measures how **clear** the signal is, relative to the specific settings your mesh is using. + +--- + +## 1. The Two Metrics: "Loudness" vs. "Clarity" + +Every time the LoRa radio chip receives a message, it reports two measurements: + +- **RSSI (Received Signal Strength Indicator):** The **loudness** of the raw power hitting your antenna. +- **SNR (Signal-to-Noise Ratio):** The **clarity** of the signal compared to the background static. + +> **Tip — The Analogy:** Imagine you are trying to hear a friend talking to you. +> +> - **RSSI** is how loud their voice is. +> - **The Noise Floor** is the background noise in the room (air conditioning, other people talking, traffic). +> - **SNR** is how easily you can distinguish your friend's voice from the background noise. + +If your friend shouts at you at a deafening rock concert, the signal is incredibly loud (High RSSI), but you still can't understand them because the background noise is louder (Bad SNR). Conversely, if your friend whispers to you in a dead-silent library, the signal is very weak (Low RSSI), but you can understand them perfectly (Great SNR). + +--- + +## 2. The Magic of LoRa: Hearing "Below the Noise Floor" + +For standard radios (like FM or Wi-Fi), if the background noise is louder than the signal (a negative SNR), the receiver just hears static. + +LoRa is special. It uses **"Spread Spectrum"** modulation, which allows the radio to mathematically pull a signal out of the air even when it is buried deep _underneath_ the background noise. This is why you will frequently see **negative SNR numbers** in Meshtastic (e.g., -10 dB, which means the signal is 10 decibels weaker than the background static). + +Depending on which Meshtastic preset you are using (e.g., `LongFast` vs. `ShortFast`), the radio has a specific **SNR Limit** — the absolute maximum amount of noise it can tolerate before the message is completely lost to the static. + +--- + +## 3. How the Signal Meter Calculates Quality + +The Meshtastic apps take both RSSI and SNR and run them through a specific formula to assign your signal a quality rating (None, Bad, Fair, or Good). It specifically scales these values based on the physical limits of the radio preset you are using. + +Here is exactly how the app decides how many bars (or what color) to show you: + +| Level | Bars | Criteria | Meaning | +| ------- | ---- | ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | +| جيد | 3 | RSSI better than `-115 dBm` **AND** SNR better than `-7 dB` | Signal is both loud and clear — healthy connection. | +| مناسب | 2 | RSSI better than `-126 dBm` with good SNR, **OR** SNR better than `-15 dB` with good RSSI | Signal getting quieter or noisier, but still decodable. | +| سيئ | 1 | Falls between Fair and None thresholds | At the edge of range or experiencing interference. | +| لا يوجد | 0 | RSSI worse than `-126 dBm` **AND** SNR worse than `-15 dB` | Transmission completely buried in noise. | + +--- + +## 4. What This Means for You + +Because Meshtastic's meter acts as a **"Clarity Meter"**, it behaves differently than what most people expect: + +> **Tip — Don't panic over low RSSI:** You might see a seemingly terrible RSSI value like `-118 dBm`. On a cell phone, you would have zero bars. But if you have an SNR of `+2 dB`, Meshtastic will still show a strong signal! _The library is quiet, so the whisper is heard perfectly._ + +> **Warning — Watch out for local noise:** If you hook up a massive antenna and see a great RSSI (e.g., `-90 dBm`) but your signal meter is only showing **1 Bar (Bad)**, you have a problem. It means you have local interference — perhaps a cheap power supply, a noisy computer, or a nearby radio tower — creating so much static that it is drowning out your mesh. + +## Where Signal Information Appears + +In the app, signal data is shown in several places: + +- **Node list** — signal bars icon next to each node +- **Node detail** — SNR, RSSI, and signal quality in the device metrics section +- **Traceroute** — per-hop signal quality for each relay node +- **Signal metrics** — historical SNR and RSSI data in the metrics charts + +![Node entry showing SNR, RSSI values and colored signal bars](/assets/screenshots/nodes_signal_info.png) + diff --git a/docs/ar-rSA/user/tak.md b/docs/ar-rSA/user/tak.md new file mode 100644 index 000000000..ae31a73b0 --- /dev/null +++ b/docs/ar-rSA/user/tak.md @@ -0,0 +1,126 @@ +--- +title: TAK Integration +nav_order: 10 +last_updated: 2026-05-13 +description: Interoperate with ATAK and WinTAK — CoT position sharing, TAK roles, and plugin setup. +aliases: + - tak + - atak + - team-awareness-kit +--- + +# TAK Integration + +Meshtastic integrates with the Team Awareness Kit (TAK) ecosystem, enabling interoperability between Meshtastic mesh devices and TAK applications like ATAK and WinTAK. + +## Overview + +The TAK module allows Meshtastic nodes to: + +- Share position data in TAK-compatible CoT (Cursor on Target) format +- Appear as team members on TAK map displays +- Receive TAK PLI (Position Location Information) messages + +## Setup + +### Prerequisites + +- ATAK (Android Team Awareness Kit) or WinTAK installed +- Meshtastic ATAK Plugin installed +- TAK module enabled on your Meshtastic radio + +### Configuration + +1. Navigate to **Settings → Module Config → TAK**. +2. Enable the TAK module. +3. Configure the TAK team/group settings: + +![Module toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | الوصف | +| ------- | -------------------------- | +| Enabled | Activate TAK interop | +| Mode | TAK-compatible output mode | + +### ATAK Plugin Setup + +1. Install the Meshtastic ATAK Plugin from the plugin repository. +2. Open ATAK and enable the Meshtastic plugin. +3. The plugin bridges messages between ATAK and your mesh network. + +## TAK Roles + +Nodes configured with TAK-related roles behave differently from standard clients: + +| Role | الوصف | +| --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **TAK** | Full TAK interoperability — sends and receives CoT data, chat messages, and PLI updates. Functions as a standard client plus TAK bridge. | +| **TAK Tracker** | Position-only TAK output — automatically broadcasts PLI at regular intervals without user interaction. Optimized for unattended position beacons (vehicles, equipment, waypoints). Does not relay chat messages. | + +> 💡 **Tip:** Use **TAK Tracker** for devices that only need to report position (e.g., a radio mounted in a vehicle). Use **TAK** for devices where users actively participate in TAK operations. + +### CoT (Cursor on Target) Format + +TAK messages use the Cursor on Target XML format — a military standard for sharing situational awareness data. Meshtastic converts its internal protobuf messages to CoT format when bridging to TAK systems, so no manual format conversion is needed. + +## TAK Identity + +When using TAK roles, your node broadcasts identity information that appears on TAK maps: + +| Setting | الوصف | +| -------- | ---------------------------------------------------------------------------------------------------------------- | +| Team | Your team color on the TAK map (e.g., Blue, Red, Cyan, Green) | +| Role | Your operational role (Team Member, Team Lead, HQ, Medic, RTO, etc.) | +| Callsign | Your TAK callsign (defaults to your Meshtastic long name) | + +These settings appear in **Settings → Module Config → TAK** when the TAK module is enabled. + +> 💡 **Tip:** Team/role colors are the standard TAK affiliation colors. Coordinate with your TAK team to use consistent team assignments. + +## Wire Format (V1 / V2) + +Meshtastic supports two TAK wire formats: + +| Format | Compatibility | Features | +| ------------------------------- | --------------------------------------------------------------- | --------------------------------------------------------- | +| V1 (Legacy) | ATAK Plugin v1.x, older firmware | Basic CoT position sharing only | +| V2 (Current) | ATAK Plugin v2.x, firmware 2.3+ | Full CoT support including chat, routes, zstd compression | + +The app automatically selects V2 when both sides support it. No manual configuration needed — the TAK module negotiates format based on firmware capabilities. + +## Usage with ATAK + +Once configured: + +- Meshtastic nodes appear as markers on the ATAK map with callsign labels +- Chat messages can bridge between mesh and TAK networks +- Position updates flow bidirectionally between Meshtastic and TAK +- TAK Tracker nodes broadcast PLI automatically — their positions appear on ATAK maps without any ATAK-side configuration + +> ⚠️ **Note:** TAK integration requires specific node roles and module configuration. Standard client nodes don't automatically participate in TAK operations. + +## Troubleshooting + +| Problem | Cause | Solution | +| -------------------------------- | ------------------------------------- | ----------------------------------------------------------------------- | +| Node doesn't appear on ATAK map | TAK module disabled or wrong role | Verify TAK module is enabled and node role is TAK or TAK Tracker | +| Position updates are stale | GPS fix lost or interval too long | Check GPS status; reduce position broadcast interval in Position Config | +| ATAK plugin shows "disconnected" | BLE connection lost or plugin crashed | Reconnect Bluetooth in Meshtastic app, then restart ATAK plugin | +| Chat messages not bridging | V1 format doesn't support chat | Ensure both nodes run firmware 2.3+ for V2 wire format | +| CoT data not flowing | Channel mismatch | All TAK nodes must be on the same channel with matching encryption | + +## Security Considerations + +- TAK data shares your position and callsign information +- Ensure your channel encryption is configured when using TAK in sensitive environments +- The TAK module respects the same channel encryption as other Meshtastic messages + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — TAK module configuration +- [Nodes](nodes) — TAK and TAK Tracker roles in the node list +- [Map & Waypoints](map-and-waypoints) — node positions on the map +- [ATAK plugin guide](https://meshtastic.org/docs/software/integrations/atak-plugin) — detailed ATAK setup on meshtastic.org + +--- + diff --git a/docs/ar-rSA/user/telemetry-and-sensors.md b/docs/ar-rSA/user/telemetry-and-sensors.md new file mode 100644 index 000000000..05b50de21 --- /dev/null +++ b/docs/ar-rSA/user/telemetry-and-sensors.md @@ -0,0 +1,118 @@ +--- +title: Telemetry & Sensors +nav_order: 9 +last_updated: 2026-05-13 +description: Sensor data on the mesh — supported environment, air quality, and power sensors, plus configuration and viewing guides. +aliases: + - sensors + - environment + - weather + - power-metrics +--- + +# Telemetry & Sensors + +Meshtastic nodes can collect and share sensor data across the mesh network. + +## Overview + +Telemetry allows nodes equipped with sensors to broadcast environmental, power, and device health information. This data is visible on the node detail screen and can be logged over time. + +## Device Telemetry + +All Meshtastic nodes report basic device telemetry: + +| Metric | الوصف | Typical Range | +| ------------------ | ------------------------------ | ------------------------------------------------------------------ | +| Battery Level | Charge percentage | 0–100% | +| شدة التيار | Battery voltage | 3.0–4.2V (LiPo) | +| استخدام القناة | % of airtime used locally | 0–100% | +| Air Utilization TX | % of airtime used by this node | 0–100% | +| Uptime | Seconds since last boot | Varies | + +## Environment Sensors + +Supported environmental sensors: + +### Temperature & Humidity + +| Sensor | الحرارة | الرطوبة | Pressure | Notes | +| ------- | ------- | ------- | -------- | ----------------------- | +| BME280 | ✓ | ✓ | ✓ | Recommended all-in-one | +| BME680 | ✓ | ✓ | ✓ | Adds gas resistance/IAQ | +| SHT31 | ✓ | ✓ | — | High accuracy | +| MCP9808 | ✓ | — | — | Precision temperature | +| LPS22 | — | — | ✓ | Pressure only | + +### Air Quality + +| Sensor | Metric | Notes | +| -------- | -------------------------------------------------- | -------------------------- | +| BME680 | Gas Resistance / IAQ | Volatile organic compounds | +| PMSA003I | PM1.0, PM2.5, PM10 | Particulate matter | +| SEN55 | PM, NOx, VOC, Temp, Humidity | Multi-sensor | + +### Light & UV + +| Sensor | Metric | +| -------- | -------------------------------------- | +| OPT3001 | Ambient light (lux) | +| VEML7700 | Ambient light (lux) | +| LTR390 | UV index | + +## Power Metrics + +Nodes with INA-series power sensors can report: + +| Metric | الوصف | +| ----------- | ----------------------------------------- | +| Bus Voltage | Supply rail voltage | +| الحالي | Power consumption (mA) | +| Power | Calculated power (mW) | + +Useful for monitoring solar charging or battery health on remote nodes. + +## Configuring Telemetry + +1. Navigate to **Settings → Module Config → Telemetry**. +2. Set reporting intervals: + - **Device Metrics Interval** — how often to broadcast device metrics + - **Environment Metrics Interval** — how often to broadcast sensor data +3. Enable specific sensor types as needed. + +### Recommended Intervals + +| Use Case | Device (s) | Environment (s) | +| ------------------------------------------ | ----------------------------- | ---------------------------------- | +| Urban mesh (many nodes) | 3600 | 3600 | +| Rural mesh (few nodes) | 900 | 900 | +| Weather station | 900 | 300 | +| Battery conservation | 7200 | 7200 | + +> ⚠️ **Note:** Shorter intervals increase airtime usage and battery drain across the mesh. + +## Viewing Telemetry + +1. Navigate to **Nodes** and select a node. +2. Telemetry sections show on the detail screen: + - Device Metrics (always available) + - Environment Metrics (if sensors present) + - Power Metrics (if INA sensor present) +3. Historical graphs show trends over time. + +![Telemetry actions](/assets/screenshots/node-metrics_telemetric_actions.png) + +## Troubleshooting + +- **No environment data showing?** The remote node needs a physical sensor connected (e.g., BME280 on I2C). Device telemetry (battery, uptime) is always available, but environment metrics require hardware. +- **Stale readings?** Check the reporting interval — very long intervals (7200s+) mean data updates infrequently. Also verify the remote node is still online. +- **Sensor conflict on I2C bus?** Some sensors share I2C addresses. If you have multiple sensors on the same bus, check for address collisions in the radio's serial debug output. + +## Related Topics + +- [Node Metrics](node-metrics) — view telemetry data on the node detail screen +- [Settings — Modules & Admin](settings-module-admin) — telemetry module configuration +- [Units & Locale](units-and-locale) — temperature and pressure display units + +--- + diff --git a/docs/ar-rSA/user/translate.md b/docs/ar-rSA/user/translate.md new file mode 100644 index 000000000..b2ed79a34 --- /dev/null +++ b/docs/ar-rSA/user/translate.md @@ -0,0 +1,97 @@ +--- +title: Translate the App +parent: User Guide +nav_order: 17 +last_updated: 2026-05-13 +aliases: + - translate + - crowdin + - localization +--- + +# Translate the App + +Contributing translations helps make Meshtastic accessible to a wider audience. The app uses [Crowdin](https://crowdin.com/) to manage community translations for both the user interface and in-app documentation. + +--- + +## What Gets Translated + +| Resource | Source Location | Notes | +| ----------------- | ------------------------------------- | ---------------------------------------------------------------------- | +| UI strings | `composeResources/values/strings.xml` | Buttons, labels, messages, and all user-visible text | +| User Guide pages | `docs/user/*.md` | In-app documentation shown in Help & Documentation | +| Fastlane metadata | `fastlane/metadata/android/en-US/` | App Store listing title, description, and changelogs | + +> **Note — Developer Guide pages are English-only.** Code-focused documentation targeting contributors is not translated. + +--- + +## How to Contribute + +1. **Visit the Crowdin project.** Open the [Meshtastic Android Crowdin project](https://crowdin.com/project/meshtastic-android) and sign in or create a free account. +2. **Choose your language.** Select an existing language or request a new one by opening a [GitHub issue](https://github.com/meshtastic/Meshtastic-Android/issues/new). +3. **Translate strings.** Crowdin shows the English source on the left and your translation on the right. Translate each string and save. +4. **Review context.** Many strings include screenshots or context comments — check these to understand where the text appears in the app. +5. **Submit.** Approved translations are automatically merged into the next release. + +> **Tip — Keep translations short.** UI strings often appear in buttons, chips, or narrow columns. If a translation is significantly longer than the English original, consider abbreviating where the meaning stays clear. + +--- + +## Adding a New Language + +If your language is not yet listed on Crowdin: + +1. Open an issue on [GitHub](https://github.com/meshtastic/Meshtastic-Android/issues/new) requesting the new locale. +2. A maintainer will add the language to Crowdin and configure `crowdin.yml`. +3. Once added, you can begin translating immediately. + +--- + +## How Translations Are Organized + +The Android app uses **Compose Multiplatform resources** for all user-visible strings: + +``` +core/resources/src/commonMain/composeResources/ +├── values/ ← English (default) +│ └── strings.xml +├── values-de/ ← German +│ └── strings.xml +├── values-fr/ ← French +│ └── strings.xml +└── ... +``` + +In-app documentation follows a similar pattern under `docs/`: + +``` +docs/ +├── user/ ← English source (default) +│ ├── onboarding.md +│ └── ... +├── fr/user/ ← French translations +│ ├── onboarding.md +│ └── ... +└── ... +``` + +The app automatically selects the correct locale based on your device's **Language & Region** settings. + +--- + +## Translation Guidelines + +- **Do not translate** technical terms like "LoRa", "MQTT", "BLE", "TAK", "SNR", or "RSSI" — these are universal. +- **Keep placeholders intact.** Strings like `%1$s` or `%d` are filled in at runtime. Do not remove or reorder them unless the grammar of your language requires it. +- **Match tone.** The app uses a friendly, direct voice. Avoid overly formal language. +- **Test if possible.** Switch your device language and open the app to see how translations look in context. + +--- + +## Questions? + +If you have questions about a specific string's context or need help getting started, open a discussion on the [Meshtastic GitHub Discussions](https://github.com/meshtastic/Meshtastic-Android/discussions) page. + +Thank you for helping expand the reach of Meshtastic! diff --git a/docs/ar-rSA/user/units-and-locale.md b/docs/ar-rSA/user/units-and-locale.md new file mode 100644 index 000000000..661aa7320 --- /dev/null +++ b/docs/ar-rSA/user/units-and-locale.md @@ -0,0 +1,118 @@ +--- +title: Units, Measurement & Locale +parent: User Guide +nav_order: 16 +last_updated: 2026-05-12 +--- + +# Units, Measurement & Locale + +The Meshtastic app automatically displays temperatures, distances, speeds, and times in the units your device is configured to use — no settings to change inside the app. + +--- + +## How It Works + +Meshtastic radios always transmit data in **metric units** (meters, °C, km/h, hPa, etc.). When the app receives this data, it uses the `MetricFormatter` utility to convert and display values in whatever unit system your device's locale specifies. + +On Android, your measurement preferences are determined by your system **Language & Region** settings. On Desktop (JVM), the app uses the JVM's default `Locale`. + +> **Tip — You never need to toggle units inside the app.** Change your system measurement preferences and every screen in Meshtastic updates automatically — node details, telemetry charts, weather, altitude, and more. + +--- + +## الحرارة + +Temperature values from environment sensors are transmitted as **°C** and displayed based on your device's temperature unit preference. + +![Environment metrics with temperature](/assets/screenshots/nodes_environment_metrics.png) + +| Your Setting | You See | +| ------------ | ------- | +| Celsius | 22°C | +| Fahrenheit | 72°F | + +This affects all temperature displays throughout the app: node environment telemetry, soil temperature, dew point, and telemetry chart axes. + +## Distance & Altitude + +Distances between nodes and GPS altitudes are transmitted as **meters** and automatically scaled and converted. + +![Distance info display](/assets/screenshots/nodes_distance_info.png) + +| Your Setting | Small Distance | Large Distance | Altitude | +| -------------------------------- | -------------- | ---------------------- | -------- | +| Metric | 350 m | 2.5 km | 1,200 m | +| Imperial (US) | 1,148 ft | 1.6 mi | 3,937 ft | + +The app uses natural scaling — short distances stay in meters or feet, while longer distances switch to kilometres or miles automatically. + +### Where these appear + +- **Node list** — distance and bearing to each node +- **Node detail** — altitude, distance from your position +- **Map** — waypoint distances, traceroute hop distances +- **Compass** — distance to selected node + +## Speed + +GPS ground speed is displayed in your locale's preferred speed unit. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Metric | 12 km/h | +| Imperial (US) | 7 mph | + +## Wind + +Wind speed and gust data from environment sensors are transmitted as **m/s** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Metric | 5 m/s | +| Imperial (US) | 11 mph | + +Wind readings appear in the **Node Detail** environment section and the **Environment Telemetry** charts. + +## Rainfall + +Rainfall measurements (1-hour and 24-hour totals) are transmitted as **mm** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ---------------------- | +| Metric | 12 mm | +| Imperial (US) | 0.5 in | + +## Units That Never Change + +Some units are international standards and are displayed the same way regardless of your locale: + +| Measurement | Unit | Why | +| -------------------------------- | ------------------------------ | ------------------------------------- | +| Barometric pressure | hPa | International meteorological standard | +| Heading / bearing | ° (degrees) | Universal navigation convention | +| Radiation | μR/hr | Standard dosimetry unit | +| GPS coordinates | decimal degrees | Universal geographic standard | +| Humidity, battery, soil moisture | % | Universal | + +## Date & Time + +All timestamps throughout the app — last heard, message times, telemetry logs, chart axes — follow your device's date and time preferences. + +| Setting | What It Controls | Example | +| ---------------- | ---------------- | ------------------------------------------------ | +| **24-Hour Time** | Clock format | 14:30 vs 2:30 PM | +| **Date Format** | Date ordering | 09/05/2026 vs 05/09/2026 | + +The app also uses **relative time** where it makes sense — for example, "5 min ago" or "2 hours ago" in the node list — which is automatically localised into your device language. + +## Changing Your Measurement System (Android) + +On Android, your measurement system (metric vs imperial) is tied to your region setting: + +1. Open **Android Settings → System → Language & Region** +2. Change your **Region** or **Measurement units** preference +3. Return to Meshtastic — values update immediately + +> **Tip — The app uses `MetricFormatter` from `core:common`.** All measurement formatting is handled by a shared KMP utility that respects your platform's locale. Developers adding new measurement displays should use `MetricFormatter` rather than hard-coding unit conversions. + diff --git a/docs/be-rBY/index.md b/docs/be-rBY/index.md new file mode 100644 index 000000000..20894cd66 --- /dev/null +++ b/docs/be-rBY/index.md @@ -0,0 +1,30 @@ +--- +title: Home +layout: default +nav_order: 0 +--- + +# Meshtastic Android App Documentation + +User and developer documentation for the Meshtastic Android, Desktop, and iOS applications powered by KMP (Kotlin Multiplatform). + +Use the sidebar navigation to browse the **User Guide** for app features and the **Developer Guide** for contributing to the project. + +--- + +## Quick Links + +| Guide | Апісанне | +| --------------------------------------------------------------------- | -------------------------------------------------------------- | +| [Getting Started](user/onboarding) | Connect your first radio and send a message | +| [Messages & Channels](user/messages-and-channels) | Channel broadcasts, direct messages, reactions, and encryption | +| [Nodes](user/nodes) | Understanding the mesh network node list | +| [Signal Meter](user/signal-meter) | How the LoRa signal quality meter works | +| [Units & Locale](user/units-and-locale) | How temperatures, distances, and times adapt to your region | +| [Desktop App](user/desktop) | Linux, macOS, and Windows desktop usage | +| [Architecture](developer/architecture) | App architecture overview for contributors | +| [Contributing](developer/contributing) | Branch naming, PR workflow, and verification commands | + +--- + +> This documentation is served from the same markdown source that powers the in-app **Help & Documentation** browser. diff --git a/docs/be-rBY/user/connections.md b/docs/be-rBY/user/connections.md new file mode 100644 index 000000000..f421dcbd3 --- /dev/null +++ b/docs/be-rBY/user/connections.md @@ -0,0 +1,125 @@ +--- +title: Connections +nav_order: 2 +last_updated: 2026-05-13 +description: Connect your phone or desktop to a Meshtastic radio via Bluetooth, USB, or TCP/IP. +aliases: + - bluetooth + - usb + - tcp + - pairing +--- + +# Connections + +Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node. + +## Bluetooth (BLE) + +Bluetooth Low Energy is the default and most common connection method on Android. + +### Pairing a Device + +1. Ensure your Meshtastic radio is powered on and in pairing mode. +2. Open the app and navigate to **Connections**. +3. Tap **Scan for Devices** — nearby Meshtastic radios will appear. +4. Select your device from the list. +5. Accept the Bluetooth pairing prompt if shown. + +![Device list item](/assets/screenshots/connections_bluetooth_scan.png) + +You can filter devices by transport type using the filter chips at the top: + +![Transport filter chips](/assets/screenshots/connections_transport_filters.png) + +> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. + +### Connection Status + +| Icon | State | Апісанне | +| ---- | -------------- | ----------------------------- | +| 🟢 | Злучаны | Active radio link established | +| 🟡 | Злучаемся | Handshake in progress | +| 🔴 | Адлучана | No active connection | +| ⚪ | Not configured | No device selected | + +When connecting, a status indicator shows the current connection state: + +![Connecting status](/assets/screenshots/connections_connecting.png) + +If no devices are found, the app shows an empty state with instructions: + +![No devices found](/assets/screenshots/connections_empty_state.png) + +### Troubleshooting Bluetooth + +- **Device not found:** Toggle Bluetooth off/on, ensure location is enabled. +- **Connection drops:** Move closer to the radio; check for interference. +- **Pairing rejected:** Forget the device in Android Bluetooth settings and retry. + +## USB Serial + +USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable. + +### Setup + +1. Connect your radio via USB cable to your device. +2. The app will prompt for USB permission — tap **Allow**. +3. The connection is established automatically. + +> ⚠️ **Note:** USB connections require OTG support on Android devices. + +## TCP/IP (WiFi) + +Some Meshtastic radios support WiFi connectivity, allowing TCP-based connections. + +### Конфигурация + +1. Connect your radio to a WiFi network via the radio's web interface or settings. +2. In the app, go to **Connections → TCP**. +3. Enter the radio's IP address and port (default: 4403). +4. Tap **Connect**. + +![WiFi scanning for devices](/assets/screenshots/connections_wifi_scanning.png) + +When a device is found, it appears in the connection list: + +![WiFi device found](/assets/screenshots/connections_wifi_device_found.png) + +A successful connection is confirmed with a status indicator: + +![WiFi connection success](/assets/screenshots/connections_wifi_success.png) + +### When to Use TCP + +- Radio is on the same local network +- Testing with a simulated radio +- Environments where Bluetooth has interference issues + +## Reconnection Behavior + +The app reconnects to the **last selected device** on startup. You can manually switch transports from the connections screen at any time. + +To disconnect from a radio, use the disconnect button on the connections screen: + +![Disconnect from radio](/assets/screenshots/connections_disconnect.png) + +## Desktop Connections + +On Desktop (Linux/macOS/Windows), the app supports: + +- **Bluetooth (BLE)** — via the Kable library; works on macOS, Linux, and Windows +- **USB Serial** — primary wired connection method +- **TCP/IP** — for network-connected radios + +See [Desktop App](desktop) for platform-specific details and keyboard shortcuts. + +## Related Topics + +- [Getting Started](onboarding) — first-launch setup and permissions +- [Settings — Radio & User](settings-radio-user) — Bluetooth and network configuration +- [Desktop App](desktop) — desktop-specific connection details +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — full list of compatible radios on meshtastic.org + +--- + diff --git a/docs/be-rBY/user/desktop.md b/docs/be-rBY/user/desktop.md new file mode 100644 index 000000000..c92122a6f --- /dev/null +++ b/docs/be-rBY/user/desktop.md @@ -0,0 +1,147 @@ +--- +title: Desktop App +nav_order: 14 +last_updated: 2026-05-13 +description: Install and use the Meshtastic Desktop app on Linux, macOS, and Windows — connections, feature parity, and keyboard shortcuts. +aliases: + - desktop + - linux + - macos + - windows + - jvm +--- + +# Desktop App + +The Meshtastic Desktop application provides the same mesh communication features on Linux, macOS, and Windows. + +## Абзор + +The Desktop app shares its core codebase with the Android app through Kotlin Multiplatform (KMP). Most features work identically across platforms. + +## Установка + +### Linux + +- Download the `.deb` or `.AppImage` package from the releases page +- Or build from source using `./gradlew :desktopApp:run` + +### macOS + +- Download the `.dmg` package from releases +- Or build from source + +### Windows + +- Download the `.msi` installer from releases +- Or build from source + +## Connecting Your Radio + +### USB Serial (Primary) + +The most reliable connection method on Desktop: + +1. Connect your Meshtastic radio via USB cable. +2. The app should detect the serial port automatically. +3. If not detected, select the correct serial port from the connections menu. + +### TCP/IP + +For network-connected radios: + +1. Enter the radio's IP address and port (default: 4403). +2. Click **Connect**. + +### Bluetooth (BLE) + +Bluetooth Low Energy is supported on Desktop via the [Kable](https://github.com/JuulLabs/kable) library: + +1. Ensure your system has a Bluetooth adapter. +2. The app scans for nearby Meshtastic radios automatically. +3. Select your device from the connections screen. + +## Feature Parity + +| Feature | Android | Desktop | Notes | +| ---------------------------------------- | ------- | ------- | -------------------------- | +| Messaging | ✓ | ✓ | Full parity | +| Node List | ✓ | ✓ | Full parity | +| Map | ✓ | ✓ | Full parity | +| Налады | ✓ | ✓ | Full parity | +| Bluetooth (BLE) | ✓ | ✓ | Via Kable on desktop | +| Firmware Update OTA | ✓ | ✗ | Use web flasher | +| Notifications | ✓ | ✓ | Native OS notifications | +| Widgets | ✓ | ✗ | Android-only | +| AI Assistant (Chirpy) | ✓\* | ✗ | Google flavor Android only | + +\*Chirpy AI requires Android 14+ on Google flavor builds with supported hardware. + +## UI Differences + +The Desktop app uses the same Compose Multiplatform UI with adaptations for larger screens and desktop interaction. + +### Keyboard Shortcuts + +| Shortcut | Action | +| ------------------- | --------------------------- | +| **⌘Q** / **Ctrl+Q** | Quit the application | +| **⌘,** / **Ctrl+,** | Open Settings | +| **⌘1** / **Ctrl+1** | Switch to Conversations tab | +| **⌘2** / **Ctrl+2** | Switch to Nodes tab | +| **⌘3** / **Ctrl+3** | Switch to Map tab | +| **⌘4** / **Ctrl+4** | Switch to Connections tab | + +### Window & System Tray + +- **Window resizing** — responsive layout adapts to window dimensions +- **System tray** — minimize to system tray for background mesh operation +- **Tray menu** — right-click the tray icon to show window or quit +- **Mouse interaction** — hover states and standard desktop navigation + +### Notification Preferences + +The Desktop app provides in-app toggles for controlling which notifications are shown — messages, new nodes, and low battery alerts. Access these from **Settings → Notifications** within the app. + +## Built-in Documentation Browser + +The Desktop app includes a built-in documentation browser for quick access to help content without leaving the application. + +![Docs browser with table of contents](/assets/screenshots/docs-browser_toc.png) + +The browser supports full-text search across all documentation: + +![Searching the docs browser](/assets/screenshots/docs-browser_search.png) + +Individual doc pages render with full formatting: + +![A documentation page](/assets/screenshots/docs-browser_page.png) + +## Building from Source + +```bash +git clone https://github.com/meshtastic/Meshtastic-Android.git +cd Meshtastic-Android +git submodule update --init +./gradlew :desktopApp:run +``` + +Requirements: + +- JDK 21 +- No Android SDK required for desktop-only builds + +## Known Limitations + +- No OTA firmware updates (use web flasher) +- Some Android-specific features (widgets, specific notification channels) are unavailable +- Performance may vary on low-spec hardware running Compose Desktop +- BLE bonding is not yet supported on desktop (pairing works without bonding) + +## Related Topics + +- [Connections](connections) — connection methods overview +- [Firmware Updates](firmware) — use the [Web Flasher](https://flasher.meshtastic.org) for desktop firmware updates + +--- + diff --git a/docs/be-rBY/user/discovery.md b/docs/be-rBY/user/discovery.md new file mode 100644 index 000000000..fe696299b --- /dev/null +++ b/docs/be-rBY/user/discovery.md @@ -0,0 +1,114 @@ +--- +title: Discovery +nav_order: 12 +last_updated: 2026-05-13 +description: Explore your mesh network — traceroute paths, neighbor maps, and node discovery tools. +aliases: + - mesh-discovery + - local-discovery + - network-scan + - traceroute + - neighbor-info +--- + +# Discovery + +Discovery tools help you understand **how** your mesh network is connected — which nodes can hear each other, what paths messages take, and where bottlenecks or weak links exist. + +> 💡 **Tip:** You don't need a dedicated "discovery mode" to start exploring your mesh. The tools below are available right now from the node list and node detail screens. + +--- + +## Traceroute + +Traceroute reveals the exact path a message takes from your node to any other node on the mesh. It's the single most useful tool for debugging connectivity problems. + +### Running a Traceroute + +1. Navigate to **Nodes** and tap the node you want to trace. +2. On the node detail screen, tap **Traceroute**. +3. The app sends a traceroute request and waits for the response. +4. Results display each hop in order, with signal quality at every step. + +### Reading the Results + +A traceroute result looks like this: + +``` +You → Node A (SNR: 8.5, RSSI: -95) → Node B (SNR: 5.2, RSSI: -108) → Target +``` + +Each hop represents a relay node that forwarded the message. The SNR and RSSI values at each hop tell you about the link quality on that specific segment. + +| What to look for | What it means | +| -------------------------------------------------------------------------- | --------------------------------------------------------------------------- | +| All hops show Good SNR (> 5 dB) | Healthy path — messages flow reliably | +| One hop shows Bad SNR (< 0 dB) | Weak link — this relay segment is fragile | +| Many hops (4+) | Long path — consider repositioning a node to shorten it | +| Different path on retry | Mesh is adapting — multiple routes exist (this is good!) | + +> 💡 **Tip:** Run traceroute several times over a few minutes. If the path changes, your mesh has redundant routes — a sign of a well-connected network. + +### Troubleshooting with Traceroute + +- **"No route found"** — The target node may be offline, out of range, or on a different channel. Check that both nodes share at least one channel with the same encryption key. +- **Traceroute times out** — The path may be too long (exceeds hop limit) or a relay node is congested. Try increasing the hop limit in **Settings → LoRa Config**. +- **Asymmetric paths** — A traceroute from A→B may take a different path than B→A. This is normal — radio propagation is not always symmetric. + +--- + +## Neighbor Info + +The Neighbor Info module lets each node broadcast a list of the nodes it can **directly hear** (single-hop). When multiple nodes share their neighbor lists, you can piece together a topology map of the entire mesh. + +### Enabling Neighbor Info + +1. Navigate to **Settings → Module Config → Neighbor Info**. +2. Enable the module. +3. Set the broadcast interval (default: 900 seconds / 15 minutes). + +Once enabled, your node periodically broadcasts its neighbor table. Other nodes with Neighbor Info enabled do the same. + +### Viewing Neighbor Data + +- Open any node's detail screen and look for the **Neighbors** section. +- Each neighbor entry shows the node that was directly heard and its signal quality. +- Combine neighbor data from multiple nodes to understand the full mesh topology. + +> ⚠️ **Note:** Neighbor Info increases airtime usage because every enabled node periodically broadcasts its neighbor list. On busy meshes with many nodes, consider longer broadcast intervals (3600 seconds or more) to avoid congestion. + +--- + +## Node List as a Discovery Tool + +The node list itself is a powerful discovery tool when you use its filtering and sorting features effectively. + +### Finding New Nodes + +- Sort by **Last heard** to see the most recently active nodes at the top. +- Enable **Include unknown** to see nodes that have appeared on the mesh but haven't sent user info yet — these are often newly powered-on devices. + +### Assessing Connectivity + +- Sort by **Hops away** to see which nodes are directly reachable (0 hops) versus relayed. +- Sort by **Distance** to find nearby nodes and verify they're reachable. +- Use **Exclude MQTT** to focus on nodes reachable over radio (not via internet bridge). + +### Infrastructure Audit + +- Disable **Exclude infrastructure** to see Router, Repeater, Router Late, and Client Base nodes. +- Check their signal quality and last-heard times to verify your infrastructure nodes are healthy. + +See [Nodes](nodes) for full details on filtering and sorting options. + +--- + +## Tips for Mesh Exploration + +- **Start with traceroute** — it gives you immediate, actionable information about a specific path. +- **Enable Neighbor Info on key nodes** — especially routers and repeaters, to build a picture of the backbone. +- **Check the map** — node positions on the [Map](map-and-waypoints) combined with signal data help you understand why some links are strong and others are weak. +- **Compare signal over time** — use the [Signal Meter](signal-meter) guide to interpret SNR and RSSI values correctly. + +--- + diff --git a/docs/be-rBY/user/firmware.md b/docs/be-rBY/user/firmware.md new file mode 100644 index 000000000..088ecd3ce --- /dev/null +++ b/docs/be-rBY/user/firmware.md @@ -0,0 +1,114 @@ +--- +title: Firmware Updates +nav_order: 13 +last_updated: 2026-05-13 +description: Update your radio firmware over Bluetooth — OTA process, version channels, pre-flight checks, and recovery. +aliases: + - firmware + - update + - ota + - flash +--- + +# Firmware Updates + +Keep your Meshtastic radio up to date with the latest firmware for new features, bug fixes, and security improvements. + +## Checking for Updates + +1. Navigate to **Settings → Firmware Update** or tap the firmware notification if shown. +2. The app checks for available firmware versions. +3. Available updates show the version number and changelog summary. + +## Update Methods + +### OTA (Over-The-Air) via Bluetooth + +The most common update method for Android users: + +1. Ensure your radio is connected via Bluetooth. +2. Navigate to the Firmware Update screen. +3. Select the desired firmware version. +4. Tap **Update** to begin the OTA process. +5. Wait for the update to complete — **do not disconnect** during the update. + +![Firmware checking for updates](/assets/screenshots/firmware_checking.png) + +> ⚠️ **Warning:** Interrupting a firmware update can brick your device. Ensure your radio has sufficient battery (>50% recommended) and maintain Bluetooth proximity during the entire process. + +![Firmware disclaimer](/assets/screenshots/firmware_disclaimer.png) + +### USB Flashing + +For recovery or when OTA is unavailable: + +- Use the [Meshtastic Web Flasher](https://flasher.meshtastic.org) +- Or the [Meshtastic CLI tool](https://meshtastic.org/docs/getting-started/flashing-firmware) on desktop + +## Version Channels + +| Канал | Апісанне | +| ------ | ------------------------------------------- | +| Stable | Recommended for most users; tested releases | +| Alpha | Preview releases; may contain bugs | + +## Pre-Update Checklist + +Before updating: + +- [ ] Battery > 50% +- [ ] Stable Bluetooth connection +- [ ] Note your current settings (they may reset on major version changes) +- [ ] Check the release notes for breaking changes + +## Post-Update + +After a successful update: + +- The radio will reboot automatically +- Bluetooth connection will re-establish +- Verify your settings are intact +- Check the firmware version in **Settings → About** + +![Firmware update success](/assets/screenshots/firmware_success.png) + +## Troubleshooting + +### Update Stuck + +If the update appears frozen: + +- Wait at least 5 minutes before intervening +- If truly stuck, power-cycle the radio +- Attempt the update again + +![Firmware update error](/assets/screenshots/firmware_error.png) + +### Device Won't Boot After Update + +If your device fails to boot: + +1. Try connecting via USB to a computer +2. Use the web flasher in recovery/DFU mode +3. Flash a known-good firmware version +4. Check the Meshtastic Discord for device-specific recovery steps + +### Compatibility Warnings + +The app may show warnings when: + +- Connected radio firmware is below minimum supported version +- Major version mismatch between app and firmware +- Deprecated features need migration + +> ⚠️ **Important:** Always update the Meshtastic app before or alongside firmware updates to ensure compatibility. + +## Related Topics + +- [Connections](connections) — reconnecting after a firmware update +- [Flashing firmware guide](https://meshtastic.org/docs/getting-started/flashing-firmware) — full firmware flashing walkthrough on meshtastic.org +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — check firmware compatibility by device +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/be-rBY/user/map-and-waypoints.md b/docs/be-rBY/user/map-and-waypoints.md new file mode 100644 index 000000000..3b736b450 --- /dev/null +++ b/docs/be-rBY/user/map-and-waypoints.md @@ -0,0 +1,116 @@ +--- +title: Map & Waypoints +nav_order: 6 +last_updated: 2026-05-13 +description: View node positions on the map, create and share waypoints, and manage position sharing and privacy. +aliases: + - map + - waypoints + - gps + - location +--- + +# Map & Waypoints + +The Map screen shows the geographic positions of nodes on your mesh, along with shared waypoints. + +## Map View + +The map displays: + +- **Node positions** — colored markers for each node reporting location +- **Waypoints** — shared points of interest +- **Your position** — your current GPS location + +### Node Markers + +Node markers on the map indicate: + +| Color | Meaning | +| ------ | ---------------------------------------------- | +| Зялёны | Online (heard recently) | +| Yellow | Away (heard within 2 hours) | +| Gray | Offline (stale position) | +| Сіні | Your own node | + +### Map Controls + +- **Zoom** — pinch or use +/- buttons +- **Pan** — drag to explore +- **Center** — select the location button to center on your position +- **Node tap** — tap a node marker to view details + +The floating toolbar provides quick access to compass, layer switching, node filters, refresh, and location tracking. Tap the compass to reorient north-up, or tap the location button to center on your current position. + +![Map controls overlay](/assets/screenshots/map_controls_overlay.png) + +## Waypoints + +Waypoints are shared geographic points of interest that all mesh members can see. + +### Creating a Waypoint + +1. Long-press on the map at the desired location. +2. Enter a name and optional description. +3. Choose an icon/emoji for the waypoint. +4. Tap **Send** to share with the mesh. + +### Waypoint Properties + +| Property | Апісанне | +| ---------- | ------------------------------------------------------- | +| Назва | Short identifier (max 30 characters) | +| Апісанне | Optional longer description | +| Icon | Visual marker emoji on the map | +| Locked | If locked, only the creator can edit or delete | +| Expiration | Optional auto-remove time | + +### Waypoint Expiration + +Waypoints can be set to expire automatically: + +- **Never** (default) — waypoint remains until manually deleted +- **Timed** — waypoint is automatically removed after the specified duration (e.g., "remove after 2 hours"). Useful for temporary markers like rally points, hazards, or meeting locations. + +Expired waypoints are automatically hidden from the map so they don't clutter the display. The expiration countdown begins when the waypoint is created, not when other nodes receive it. + +### Managing Waypoints + +- Tap a waypoint on the map to view its details and coordinates +- Edit or delete waypoints you created +- **Locked waypoints** cannot be modified or deleted by other nodes — only the original creator can change them +- Unlocked waypoints can be edited by any mesh member + +## Position Sharing + +### Enabling Position Sharing + +Your node shares its GPS position based on: + +- **Fixed interval** — broadcast position at regular intervals +- **Smart position** — broadcast when movement exceeds a threshold +- **Manual** — only share when explicitly requested + +Configure position behavior in **Settings → Position**. + +### Privacy Considerations + +> 🔒 **Privacy:** Position data is broadcast to all nodes on your channel. If you don't want your location shared, disable GPS position in settings or use a fixed/fake position. + +## Map Sources + +The app supports multiple map tile sources: + +- OpenStreetMap (default) +- Satellite imagery (where available) +- Offline tiles (download map areas for offline use) + +## Related Topics + +- [Nodes](nodes) — view and filter your node list +- [Node Metrics](node-metrics) — signal quality and position history for individual nodes +- [Discovery](discovery) — traceroute and neighbor info for understanding mesh topology +- [Units & Locale](units-and-locale) — distance and coordinate display formats + +--- + diff --git a/docs/be-rBY/user/messages-and-channels.md b/docs/be-rBY/user/messages-and-channels.md new file mode 100644 index 000000000..36ca1b47b --- /dev/null +++ b/docs/be-rBY/user/messages-and-channels.md @@ -0,0 +1,159 @@ +--- +title: Messages & Channels +nav_order: 3 +last_updated: 2026-05-13 +description: Send and receive messages, manage channels, configure encryption, and use quick chat, reactions, and message actions. +aliases: + - channels + - direct-messages + - messaging + - conversations +--- + +# Messages & Channels + +Meshtastic supports two communication modes: **channel broadcasts** and **direct messages**. + +## Каналы + +Channels are shared communication groups. All nodes configured with the same channel key can read and send messages on that channel. + +### Default Channel + +Every Meshtastic device comes with a default **LongFast** channel. This is an unencrypted channel used for general mesh communication. + +### Channel Security + +Channels support multiple encryption levels: + +| Icon | Security Level | Апісанне | +| ---- | ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------- | +| 🔒 | PSK (256-bit AES) | Fully encrypted with a strong pre-shared key. Only nodes with the matching key can read messages. | +| 🔐 | PSK (128-bit AES) | Encrypted with a shorter key. Secure for most uses but 256-bit is preferred for sensitive data. | +| 🔓 | Default / Open | Uses the well-known default key. **Any Meshtastic device** on the same preset can read these messages. | +| ⚠️ | Insecure + Position | Open channel that also broadcasts your GPS position. Use with caution in public meshes. | + +> 🔒 **Security Tip:** 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. + +### Adding a Channel + +1. Navigate to **Settings → Channels**. +2. Tap **Add Channel** or scan a QR code. +3. Configure the channel name and encryption key. +4. Share the channel URL/QR code with others who need access. + +Tapping a channel shows its details and sharing options. + +## Direct Messages + +Direct messages (DMs) are point-to-point encrypted communications between two specific nodes. + +### Sending a Direct Message + +1. Open the **Messages** tab. +2. Select a node from your contacts list or tap a node in the node list. +3. Type your message and tap **Send**. + +### Message States + +| State | Icon | Meaning | +| --------------------------------- | ---- | ----------------------------------------------------------------------------------------------------------------- | +| Queued | ⏳ | Message waiting to be sent | +| En route | ✓ | Delivered to the radio, awaiting acknowledgment | +| Delivered | ✓✓ | Acknowledgment received from recipient | +| Received | ✓ | Message received from the mesh (incoming) | +| S&F Routing | 🔗 | Store & Forward: message being routed through an S&F node | +| S&F Confirmed | 🔗 | Store & Forward: delivery confirmed via S&F node | +| Памылка | ✗ | Delivery failed after retries | + +### Delivery Errors + +When a message fails to deliver, the error indicator shows what went wrong: + +| Памылка | Meaning | What to Do | +| --------------------- | ---------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| No Route | No path exists to the destination node | The recipient may be offline or out of mesh range. Try later or move closer. | +| Got NAK | The next-hop node refused to relay | The relay node may be congested. Wait and retry. | +| Скончыўся час чакання | No acknowledgment within retry window | The recipient may be just out of range. Try increasing hop limit or moving to a better position. | +| Няма інтэрфейсу | No radio interface available to send | Check that your radio is connected and the channel is configured. | +| Max Retransmit | All retry attempts exhausted | The mesh path is unreliable. Try a different channel or wait for conditions to improve. | +| Няма канала | The destination channel doesn't exist | Verify both nodes share the same channel configuration. | +| Too Large | Message exceeds maximum payload size | Shorten your message (max ~230 characters). | +| No Response | Node received message but didn't respond | The recipient's radio may be busy or in low-power sleep mode. | +| Duty Cycle Limit | Regional airtime limit reached | Your radio has used its allowed transmit time. Wait for the duty cycle window to reset (typically 1 hour in EU regions). | +| Няправільны запыт | Malformed or invalid message | This usually indicates a software bug. Try restarting the app. | + +> 💡 **Tip:** 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. + +## Message Features + +### Quick Chat + +Pre-configured messages for rapid communication: + +- Access via the Quick Chat button in the message input area +- Choose from built-in phrases or custom messages +- Customize quick chat messages in **Settings → Quick Chat** +- Useful when typing is impractical (gloves, small screen, urgent) + +![Quick chat option](/assets/screenshots/messages_quick_chat.png) + +The channel list shows each channel with its latest message preview. + +### Message Bubbles + +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. + +### Reactions + +React to messages with emoji: + +- **Long-press** a message to open the actions menu +- Tap **Add Reaction** to choose an emoji +- Reactions appear below the message bubble +- Multiple users can react to the same message +- React to your own messages or others' messages + +![Emoji reaction badges displayed beneath a message](/assets/screenshots/messages_reaction.png) + +> 💡 **Tip:** Reactions are lightweight — they use minimal mesh bandwidth compared to full text messages. + +### Message Actions + +Long-press any message to access: + +- **Copy** — copy message text to clipboard +- **Reply** — quote the message in your response +- **React** — add an emoji reaction +- **Delete** — remove a message you sent (local deletion) + +### Message Priority + +Messages are queued and transmitted based on priority: + +1. Emergency/alert messages (highest) +2. Direct messages +3. Channel broadcasts (lowest) + +### Message Limits + +- **Maximum length:** 237 bytes (approximately 230 characters for ASCII text) +- **Rate limiting:** The mesh enforces airtime fairness; heavy message volume may be throttled +- **Delivery:** Messages are retried automatically if no acknowledgment is received + +## Best Practices + +- Use channels for group coordination +- Use direct messages for private person-to-person communication +- Keep messages short — mesh bandwidth is limited +- Configure encryption for sensitive communications + +## Related Topics + +- [Nodes](nodes) — tap a node to start a direct message +- [Settings — Radio & User](settings-radio-user) — configure channel encryption and presets +- [MQTT](mqtt) — bridge channel messages to the internet +- [Channel configuration](https://meshtastic.org/docs/configuration/radio/channels) — detailed channel settings on meshtastic.org + +--- + diff --git a/docs/be-rBY/user/mqtt.md b/docs/be-rBY/user/mqtt.md new file mode 100644 index 000000000..96ee17240 --- /dev/null +++ b/docs/be-rBY/user/mqtt.md @@ -0,0 +1,137 @@ +--- +title: MQTT +nav_order: 11 +last_updated: 2026-05-13 +description: Bridge your mesh to the internet — MQTT broker setup, encryption layers, and map reporting. +aliases: + - mqtt + - internet-bridge + - broker +--- + +# MQTT + +MQTT bridges your Meshtastic mesh network to the internet, enabling long-range communication beyond radio range. + +## Абзор + +The MQTT module connects your node to an MQTT broker, allowing: + +- Messages to reach nodes on different physical meshes via the internet +- Integration with home automation and monitoring systems +- Publishing node positions to the public Meshtastic map +- Custom data pipelines for logging and alerting + +## How It Works + +``` +[Your Node] → Radio → [Gateway Node with WiFi] → MQTT Broker → [Remote Gateway] → Radio → [Remote Node] +``` + +A gateway node with internet access (WiFi or Ethernet) publishes mesh messages to an MQTT topic. Remote gateways subscribed to the same topic inject those messages into their local mesh. + +## Конфигурация + +### Enabling MQTT + +1. Navigate to **Settings → Module Config → MQTT**. +2. Enable the MQTT module. +3. Configure the broker connection: + +![MQTT toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | Апісанне | Default | +| ----------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------- | +| Server Address | MQTT broker hostname | mqtt.meshtastic.org | +| Імя карыстальніка | Broker authentication | meshdev | +| Пароль | Broker authentication | large4cats | +| Root Topic | Base topic for messages | msh | +| Шифравание | Encrypt MQTT payload | Уключана | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON packet support has been removed from firmware; this field is ignored | Disabled | +| TLS | Secure connection to broker | Disabled | +| Map Reporting | Report position to public map | Disabled | + +### Default Meshtastic Broker + +The community maintains a public broker at `mqtt.meshtastic.org`. This is intended for general use and testing. + +> 🔒 **Privacy:** Messages on the public broker are readable by anyone subscribed. Always use channel encryption for private communications. + +### Private Broker + +For better privacy and control, you can run your own MQTT broker: + +- Mosquitto (lightweight, open-source) +- HiveMQ +- EMQX + +Configure your node to point to your private broker with appropriate credentials. + +## Map Reporting + +When Map Reporting is enabled, your node publishes its position to the Meshtastic community map: + +- Visible at [meshmap.net](https://meshmap.net) and similar community map services +- Only position and node info are shared +- Disable this if you don't want your location publicly visible + +## Uplink vs Downlink + +| Direction | Апісанне | +| ------------ | -------------------------------- | +| **Uplink** | Messages from mesh → MQTT broker | +| **Downlink** | Messages from MQTT broker → mesh | + +Configure per-channel which directions are active to control message flow and airtime usage. + +## Message Formats + +MQTT uses protobuf message format: + +| Format | Апісанне | Use case | +| ------------ | ----------------------------------- | -------------------------- | +| **Protobuf** | Binary Meshtastic protobuf encoding | Node-to-node mesh bridging | + +> ⚠️ **Note:** JSON output support was removed from firmware. The `json_enabled` setting is still visible in the app for legacy compatibility but has no effect on current firmware versions. + +## Encryption & Privacy + +Understanding the layered encryption model: + +1. **Channel encryption** happens on the mesh _before_ MQTT. If your channel has a PSK, the MQTT payload is already encrypted — the broker and any subscribers see only the ciphertext. +2. **MQTT encryption** (the module setting) adds an additional encryption layer for transit to the broker. This protects metadata and routing information. +3. **TLS** encrypts the TCP connection to the broker itself, preventing network-level eavesdropping. + +> 🔒 **Important:** The default public channel has a well-known key. Messages on the default channel sent via MQTT are effectively **unencrypted** — anyone can decode them. Always use a custom PSK for private communications. + +## Best Practices + +- Use channel-level encryption (PSK) on channels that bridge to MQTT +- Don't enable MQTT on nodes without internet access (it will buffer and waste memory) +- Use a private broker for sensitive deployments +- Be mindful of airtime when downlinking messages from busy MQTT topics — every downlinked message consumes radio airtime on your local mesh +- Consider enabling uplink-only if you only need to monitor your mesh remotely without injecting messages back + +## Troubleshooting + +### MQTT Not Connecting + +- **Check WiFi** — the gateway node must have an active internet connection (WiFi or Ethernet). MQTT does not work over the LoRa radio link itself. +- **Verify credentials** — incorrect username or password will silently fail on most brokers. Double-check for trailing spaces. +- **Firewall** — port 1883 (MQTT) or 8883 (MQTT+TLS) must be open. Some networks block non-standard ports. +- **DNS resolution** — if using a custom broker hostname, verify the node can resolve it. Try the broker's IP address directly. + +### Messages Not Bridging + +- **Check uplink/downlink settings** — if only uplink is enabled, messages flow from mesh to MQTT but not back. Enable downlink on the receiving gateway. +- **Channel mismatch** — both gateways must share the same channel with the same PSK. A mismatch means messages are encrypted with different keys and appear as garbage. +- **Topic mismatch** — ensure both gateways use the same root topic. The default `msh` works for the public broker. + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — MQTT module configuration reference +- [Messages & Channels](messages-and-channels) — channel encryption and PSK setup +- [MQTT integration guide](https://meshtastic.org/docs/software/integrations/mqtt) — detailed MQTT documentation on meshtastic.org + +--- + diff --git a/docs/be-rBY/user/node-metrics.md b/docs/be-rBY/user/node-metrics.md new file mode 100644 index 000000000..7b54b1dcb --- /dev/null +++ b/docs/be-rBY/user/node-metrics.md @@ -0,0 +1,130 @@ +--- +title: Node Metrics +nav_order: 5 +last_updated: 2026-05-13 +description: Telemetry dashboards for each mesh node — device health, environment sensors, signal quality, power, traceroute, and position history. +aliases: + - metrics + - telemetry + - device-metrics + - signal +--- + +# Node Metrics + +The node detail screen provides comprehensive telemetry and metrics for each node on your mesh. + +## Device Metrics + +Basic operating information reported by each node: + +| Metric | Апісанне | +| ------------------- | ----------------------------------- | +| Battery Level | Current battery percentage | +| Voltage | Battery voltage reading | +| Channel Utilization | Percentage of airtime consumed | +| Airtime | Transmission time used by this node | +| Uptime | Time since last reboot | + +Device metrics are displayed as individual cards with trend sparklines showing battery level, voltage, channel utilization, airtime, and uptime over time. + +> 💡 **Tip:** Tap any metric card to expand it into a full chart with historical data points. Pinch to zoom the time axis. + +## Environment Metrics + +Environmental sensor data (requires compatible hardware): + +| Metric | Sensor Examples | +| ------------------------------------ | --------------------- | +| Тэмпература | BME280, BME680, SHT31 | +| Вільготнасць | BME280, BME680, SHT31 | +| Barometric Pressure | BME280, BMP280 | +| Gas Resistance | BME680 | +| IAQ (Air Quality) | BME680 | + +Environment metrics are charted over time for easy trend analysis — temperature, humidity, and pressure each get their own line chart with the measurement unit displayed on the Y axis. + +> 💡 **Tip:** Environment metrics require a sensor connected to the remote node. Not all nodes report environmental data. See [Telemetry & Sensors](telemetry-and-sensors) for a full list of supported sensors. + +## Signal Metrics + +Radio signal quality information: + +| Metric | Апісанне | +| ------------------- | ----------------------------------------------------------------------------- | +| сігнал-шум | Signal-to-Noise Ratio (higher is better) | +| адносная магутнасць | Received Signal Strength Indicator (closer to 0 is better) | +| Hop Count | Number of mesh hops for last message | + +### Signal Quality Reference + +| SNR Range | Quality | +| --------------------------------- | --------- | +| > 10 dB | Excellent | +| 0 to 10 dB | Good | +| -10 to 0 dB | Fair | +| < -10 dB | Poor | + +## Power Metrics + +Power management telemetry (requires INA sensor or compatible hardware): + +| Metric | Апісанне | +| ----------- | ----------------------- | +| Bus Voltage | Supply voltage | +| 3 | Power draw in milliamps | +| Power | Calculated wattage | + +## Traceroute + +Traceroute shows the path a message takes through the mesh: + +1. From the node detail screen, tap **Traceroute**. +2. The app sends a traceroute request to the target node. +3. Results show each hop with SNR/RSSI values. + +### Reading Traceroute Results + +``` +You → Node A (SNR: 8.5) → Node B (SNR: 5.2) → Target +``` + +Each hop represents a relay node that forwarded the message. + +## Гісторыя месцазнаходжання + +Historical position data for nodes that share their location: + +- GPS coordinates +- Altitude +- Speed (if moving) +- Timestamp for each position report + +## Neighbor Info + +Shows which nodes a given node can directly hear, useful for understanding mesh topology. + +## Viewing Metrics + +1. Navigate to **Nodes**. +2. Tap the node you want to inspect. +3. Select the metric category from the detail tabs. + +![Node detail — local device](/assets/screenshots/nodes_detail_local.png) + +The position tab shows location data for nodes that share GPS: + +![Position inline content](/assets/screenshots/nodes_position.png) + +> ⚠️ **Note:** Metrics are only available when they have been reported by the remote node. Metrics update at intervals configured on each node's telemetry settings. + +## Related Topics + +- [Nodes](nodes) — node list, filtering, and sorting +- [Telemetry & Sensors](telemetry-and-sensors) — supported sensors and configuration +- [Signal Meter](signal-meter) — how signal quality is calculated from SNR and RSSI +- [Discovery](discovery) — traceroute details and neighbor info +- [Units & Locale](units-and-locale) — temperature, distance, and speed display formats + +--- + diff --git a/docs/be-rBY/user/nodes.md b/docs/be-rBY/user/nodes.md new file mode 100644 index 000000000..a39169a2a --- /dev/null +++ b/docs/be-rBY/user/nodes.md @@ -0,0 +1,152 @@ +--- +title: Nodes +nav_order: 4 +last_updated: 2026-05-13 +description: Browse, filter, and sort mesh nodes — view details, signal quality, roles, and quick actions. +aliases: + - node-list + - mesh-nodes + - peers +--- + +# Nodes + +The Nodes screen displays all devices visible on your mesh network. + +## Node List + +The node list shows every node your radio has heard, including: + +- **Node name** — user-configured long name +- **Short name** — 4-character identifier +- **Signal quality** — last heard signal strength +- **Last heard** — time since last communication +- **Distance** — estimated distance (if positions are shared) +- **Battery** — remote node battery level (if telemetry is enabled) + +### Node Status Indicators + +| Badge | Meaning | +| ---------- | ------------------------------------- | +| 🟢 Online | Node heard within the last 15 minutes | +| 🟡 Away | Node heard within the last 2 hours | +| 🔴 Offline | Node not heard for over 2 hours | +| ⭐ Favorite | Node marked as favorite by the user | + +### Node Roles + +Nodes can be configured with different roles that affect their mesh behavior: + +| Role | Апісанне | +| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | +| CLIENT | Standard end-user device | +| Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | +| CLIENT MUTE | Receives but doesn't retransmit | +| CLIENT HIDDEN | Like Client Mute, plus hides from node list | +| ROUTER | Prioritizes message forwarding; stays awake to relay | +| ROUTER LATE | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | +| ~~Router Client~~ | ⚠️ **Deprecated** (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | +| ~~Repeater~~ | ⚠️ **Deprecated** (removed in firmware 2.7.11) — no longer selectable; use Router instead | +| TRACKER | Optimized for position reporting at regular intervals | +| SENSOR | Optimized for telemetry reporting | +| TAK | Interoperates with TAK systems (sends/receives CoT) | +| TAK TRACKER | TAK position reporting only | +| Lost & Found | Continuous position beacon for recovery | + +### Choosing a Role + +Most users should keep the default **Client** role. Consider a different role when: + +- **Router** — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don't use Router on battery-powered handheld devices. +- **Router Late** — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. +- **Client Base** — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. +- **Client Mute** — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only devices or to reduce congestion in dense areas. +- **Tracker** — An unattended device whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. +- **Sensor** — An unattended device reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. +- **TAK / TAK Tracker** — Only needed if interoperating with ATAK/WinTAK systems. See [TAK Integration](tak) for details. + +> 💡 **Tip:** The mesh works best when most nodes are **Client** or **Router**. Too many Mute nodes reduces mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. + +### Encryption Indicators + +Nodes display encryption status icons next to their name: + +| Icon | Meaning | +| ----------- | ------------------------------------------------------------------------------------------------------------------- | +| 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | +| 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | +| ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) | + +> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. + +## Quick Actions + +From the node list, you can: + +- **Tap** a node to view its detail page +- **Long-press** for quick actions: + - Send a direct message + - View on map + - Request position + - Mark as favorite + - Traceroute + +## Filtering & Sorting + +### Text Search + +Type in the search field to filter nodes by name or short name. The filter updates in real time as you type. + +### Filter Toggles + +| Фільтраваць | Апісанне | +| -------------------------- | ---------------------------------------------------------------------------------------------- | +| **Only online** | Show only nodes heard within the last 15 minutes | +| **Only direct** | Show only nodes with direct (non-relayed) connections | +| **Include unknown** | Show nodes that haven't sent user info yet | +| **Exclude infrastructure** | Hide infrastructure-role nodes (Router, Repeater, Router Late, Client Base) | +| **Exclude MQTT** | Hide nodes heard only via MQTT internet bridge | +| **Show ignored** | Show nodes you've previously dismissed or muted | + +### Sort Options + +| Sort | Апісанне | +| ------------------------------------------- | ------------------------------------------------------------------ | +| **Last heard** (default) | Most recently heard nodes first | +| **Alphabetical** | Sorted by node long name | +| **Distance** | Nearest nodes first (requires position sharing) | +| **Hops away** | Fewest relay hops first | +| **Channel** | Grouped by channel index | +| **Via MQTT** | Grouped by MQTT vs. radio-heard | +| **Favorites** | Favorited nodes first | + +## Node Detail + +Tapping a node opens the detail view with comprehensive information. See [Node Metrics](node-metrics) for full details on metrics and telemetry. + +![Node detail view](/assets/screenshots/nodes_node_list.png) + +The detail screen includes device info, position, and action buttons: + +![Node detail section](/assets/screenshots/nodes_detail_section.png) + +Inline status indicators show key metrics at a glance: + +| Indicator | Screenshot | +| ----------------- | -------------------------------------------------------- | +| Signal quality | ![Signal](/assets/screenshots/nodes_signal_info.png) | +| Battery level | ![Battery](/assets/screenshots/nodes_battery_info.png) | +| Hop count | ![Hops](/assets/screenshots/nodes_hops_info.png) | +| Апошні раз пачуты | ![Last heard](/assets/screenshots/nodes_last_heard.png) | +| Адлегласць | ![Distance](/assets/screenshots/nodes_distance_info.png) | + +## Related Topics + +- [Node Metrics](node-metrics) — detailed telemetry dashboards for each node +- [Messages & Channels](messages-and-channels) — send a direct message to a node +- [Map & Waypoints](map-and-waypoints) — view node positions geographically +- [Discovery](discovery) — traceroute and neighbor info for topology exploration +- [Signal Meter](signal-meter) — understand what the signal bars mean + +--- + diff --git a/docs/be-rBY/user/onboarding.md b/docs/be-rBY/user/onboarding.md new file mode 100644 index 000000000..71a350198 --- /dev/null +++ b/docs/be-rBY/user/onboarding.md @@ -0,0 +1,99 @@ +--- +title: Начало работы +nav_order: 1 +last_updated: 2026-05-13 +description: First-launch setup — permissions, onboarding flow, and next steps after connecting your radio. +aliases: + - first-launch + - setup + - intro +--- + +# Начало работы + +Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app. + +## First Launch + +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. + +### Welcome Screen + +The welcome screen introduces Meshtastic and its core capabilities: + +- Off-grid mesh communication +- No cellular or internet required +- End-to-end encrypted messaging + +Tap **Get Started** to proceed through the setup flow. + +![Welcome screen](/assets/screenshots/onboarding_welcome.png) + +## Permissions + +The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. + +### Bluetooth Permission + +Bluetooth is the primary connection method between your phone and Meshtastic radio: + +- **Bluetooth scanning** — discover nearby Meshtastic radios +- **Bluetooth connect** — establish and maintain connections with paired radios + +Grant both permissions when prompted. Without Bluetooth, you'll need to use USB or TCP connections instead. + +### Location Permission + +> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. + +Meshtastic also uses your location for: + +- Showing your position on the mesh map +- Calculating distances to other nodes +- Sharing your GPS coordinates with other mesh members (if enabled) + +Grant **"While using the app"** or **"Always"** depending on your preference: + +- **While using the app** — position updates only when the app is open +- **Always** — enables background position updates for always-on mesh presence + +If denied, Bluetooth scanning will not function and your node will not report a position. + +### Notifications Permission + +Notifications alert you to: + +- Incoming messages from channels and direct messages +- Connection status changes (connected, disconnected, reconnecting) +- Firmware update availability + +> 💡 **Tip:** You can fine-tune notification preferences later in Android system settings. The app creates separate notification channels for messages, connection events, and background service status. + +### Critical Alerts Permission + +On supported devices, the app may request permission for critical alerts: + +- These are high-priority notifications that can break through Do Not Disturb mode +- Useful for emergency mesh alerts or urgent messages +- You can **skip** this step if you don't need breakthrough notifications +- Configure or revoke later in Android notification settings + +## After Setup + +Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. + +> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. + +## What's Next? + +Once connected to a radio, explore: + +- [Connections](connections) — pair your first radio device +- [Messages & Channels](messages-and-channels) — send your first message +- [Nodes](nodes) — see who's on your mesh +- [Map & Waypoints](map-and-waypoints) — view node positions +- [Settings](settings-radio-user) — configure your radio and user profile + +New to Meshtastic? The [getting started guide](https://meshtastic.org/docs/getting-started) on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup. + +--- diff --git a/docs/be-rBY/user/settings-module-admin.md b/docs/be-rBY/user/settings-module-admin.md new file mode 100644 index 000000000..081e6086d --- /dev/null +++ b/docs/be-rBY/user/settings-module-admin.md @@ -0,0 +1,246 @@ +--- +title: Settings — Modules & Admin +nav_order: 8 +last_updated: 2026-05-13 +description: Configure optional feature modules (MQTT, telemetry, canned messages, TAK, and more) and perform device administration. +aliases: + - modules + - module-config + - administration +--- + +# Settings — Modules & Admin + +Configure optional feature modules and perform device administration. Modules extend Meshtastic with specialized capabilities — each can be independently enabled or disabled. + +> 💡 **Tip:** You only need to enable the modules you actually use. Disabling unused modules reduces airtime, saves battery, and simplifies your configuration. + +Module settings use a card-based layout with toggle switches, dropdowns, text fields, and sliders: + +![Toggle switch](/assets/screenshots/settings_switch.png) + +![Dropdown selector](/assets/screenshots/settings_dropdown.png) + +![Text field](/assets/screenshots/settings_text_field.png) + +![Settings card layout](/assets/screenshots/settings_titled_card.png) + +## Module Configuration + +### MQTT Module + +Bridges mesh messages to and from an MQTT broker for internet connectivity. This is how you extend your mesh beyond radio range or integrate with home automation systems. + +| Setting | Апісанне | +| ----------------- | ------------------------------------------------------------------------ | +| Уключана | Toggle MQTT bridge | +| Сервер | MQTT broker address | +| Імя карыстальніка | Authentication username | +| Пароль | Authentication password | +| Шифравание | Encrypt MQTT payloads | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON support removed from firmware; field is ignored | +| TLS | Use secure connection | +| Root Topic | Base MQTT topic path | +| Map Report | Publish position for public map | + +See [MQTT](mqtt) for a detailed usage guide including encryption, privacy, and broker setup. + +### Serial Module + +Enables serial port communication for external device integrations (GPS modules, sensors, or custom hardware). When enabled, the node's serial port can send and receive protobuf or text data, allowing external microcontrollers or computers to interact with the mesh. + +| Setting | Апісанне | +| ---------- | ------------------------------- | +| Уключана | Activate serial communication | +| Echo | Echo received serial data back | +| Mode | Text, Protobuf, or NMEA output | +| RX/TX Pins | GPIO pins for serial connection | +| Baud Rate | Serial communication speed | + +### External Notification Module + +Controls buzzer, LED, or vibration alerts on your radio hardware. Useful for devices that need to physically signal when a message arrives — particularly helpful for unattended or outdoor installations. + +| Setting | Апісанне | +| -------------------------------- | --------------------------- | +| Уключана | Activate notifications | +| Alert Message | Notify on incoming messages | +| Alert Message Buzzer | Use buzzer for messages | +| Alert Message Vibra | Use vibration for messages | +| Alert Bell | Notify on bell character | +| Output (GPIO) | Pin for notification output | +| Active | High or Low active | +| Duration (ms) | Notification length | +| Use I2S as Buzzer | Use I2S audio output | + +### Store & Forward Module + +Buffers messages for nodes that were temporarily offline, then replays them when those nodes reconnect. Essential for meshes where nodes go in and out of range regularly — ensures messages aren't lost during brief disconnections. + +| Setting | Апісанне | +| ------------------------------------------ | -------------------------- | +| Уключана | Activate store and forward | +| Heartbeat (s) | Announcement interval | +| Records | Maximum stored messages | +| History Return (max) | Max messages to replay | +| History Return (window) | Time window for replay | + +> 💡 **Tip:** Store and Forward works best on nodes with ample memory (ESP32 with PSRAM). Router nodes are ideal candidates since they're typically always-on. + +### Range Test Module + +Automated range testing tool for evaluating link quality between nodes. When enabled, the node periodically transmits test messages with incrementing counters. A receiver node logs these messages, allowing you to walk or drive away and later analyze at what distance messages stopped arriving. + +| Setting | Апісанне | +| -------------------------------------- | --------------------------------- | +| Уключана | Activate range testing | +| Sender Interval (s) | Time between test transmissions | +| Save CSV | Log received test data to SD card | + +### Telemetry Module + +Controls what telemetry data your node shares with the mesh. Telemetry includes device health (battery, uptime) and environmental sensor data (temperature, humidity, pressure). + +| Setting | Апісанне | +| ---------------------------- | --------------------------------------- | +| Device Metrics Interval | How often to report device metrics | +| Environment Metrics Interval | How often to report environment sensors | +| Air Quality Enabled | Report particulate sensor data | +| Power Metrics Enabled | Report power usage | + +See [Telemetry & Sensors](telemetry-and-sensors) for supported sensors and configuration recommendations. + +### Canned Message Module + +Pre-configured messages accessible from the device's physical buttons (for radios with rotary encoders, keypads, or similar input hardware). Define a list of quick-send messages that can be transmitted without a phone connected — ideal for field use. + +| Setting | Апісанне | +| ------------------ | ----------------------------------------------------------- | +| ~~Enabled~~ | ⚠️ **Deprecated** — current firmware may ignore this toggle | +| Паведамленні | Newline-separated list of messages | +| Send Bell | Play bell sound on send | +| Rotary Encoder | Enable rotary encoder input | +| Up/Down/Press Pins | GPIO pin assignments for input | + +### Audio Module + +Codec2 audio support for low-bandwidth voice communication over the mesh. This is an **experimental** feature that encodes voice into very small data packets using the Codec2 codec. + +| Setting | Апісанне | +| --------------- | -------------------------------- | +| Уключана | Activate audio module | +| Codec2 Rate | Audio quality/bandwidth tradeoff | +| I2S Word Select | GPIO pin for I2S WS | +| I2S Data In | GPIO pin for I2S DIN | +| I2S Data Out | GPIO pin for I2S DOUT | + +> ⚠️ **Note:** Audio requires specific hardware (I2S microphone and speaker). Voice quality is very low-bandwidth — think "understandable radio voice," not phone-call quality. + +### Remote Hardware Module + +GPIO control over the mesh network. Allows a remote node to read or write GPIO pins on another node — useful for activating relays, reading switches, or controlling external hardware from a distance. + +| Setting | Апісанне | +| -------------------- | --------------------------------------------------------------- | +| Уключана | Activate remote GPIO access | +| Allow Undefined Pins | Allow access to any GPIO pin (security risk) | + +> ⚠️ **Warning:** Enabling "Allow Undefined Pins" gives remote nodes access to all GPIO pins, which could interfere with the radio's own hardware. Only enable on dedicated GPIO nodes. + +### Neighbor Info Module + +Broadcasts information about directly heard neighbors, enabling mesh topology mapping. Each enabled node periodically shares a list of the other nodes it can hear and their signal quality. + +| Setting | Апісанне | +| -------------------------------------- | ------------------------------------ | +| Уключана | Activate neighbor broadcasting | +| Update Interval (s) | How often to broadcast neighbor list | + +See [Discovery](discovery) for how to use neighbor data for mesh topology exploration. + +### Ambient Lighting Module + +Controls onboard NeoPixel or other addressable RGB LEDs on supported hardware. Can be used for visual status indicators, notification lights, or decorative effects. + +| Setting | Апісанне | +| ------------------ | ---------------------------------------------------------- | +| Уключана | Activate LED control | +| LED State | On, Off, or set specific color | +| Red / Green / Blue | Individual color channel values (0–255) | + +### Detection Sensor Module + +Turns your node into a motion or door sensor alert system. When a GPIO pin detects a state change (motion detected, door opened), the node broadcasts an alert message over the mesh. + +| Setting | Апісанне | +| ---------------------------------------- | ----------------------------------------------------------------------- | +| Уключана | Activate detection sensor | +| Monitor Pin | GPIO pin connected to sensor | +| Detection Triggered High | Trigger when pin goes high (vs. low) | +| Minimum Broadcast (s) | Minimum time between alert broadcasts | +| State Broadcast (s) | Periodic state broadcast interval | +| Send Bell | Include bell character in alerts | +| Friendly Name | Custom name for this sensor | + +### Paxcounter Module + +People counter using WiFi and BLE probe requests. Counts nearby devices by passively listening for probe requests that phones and laptops emit when scanning for networks. Available only on ESP32 devices. + +| Setting | Апісанне | +| -------------------------------------- | -------------------------- | +| Уключана | Activate people counting | +| Update Interval (s) | How often to report counts | + +> 💡 **Tip:** Paxcounter is useful for estimating foot traffic at trailheads, event venues, or other locations. Counts are approximate — one person may carry multiple devices. + +### TAK Module + +Team Awareness Kit integration for interoperability with ATAK and WinTAK. See [TAK Integration](tak) for detailed setup and usage. + +## Administration + +### Remote Administration + +Remotely configure nodes that share your admin key: + +1. Select the target node in the node list. +2. Navigate to **Settings** for that node. +3. Modify configuration. +4. Tap **Save** — changes are sent over the mesh. + +> ⚠️ **Requires:** Admin key configured on both your node and the target node. + +### Clean Node Database + +Removes stale nodes from your local database that haven't been heard in a configurable time window. + +### Factory Reset + +Resets all settings to factory defaults. **This cannot be undone.** + +### Перазагрузіць + +Remotely reboot a connected or administered node. + +### Панэль адладкі + +View detailed diagnostic information: + +- Protocol buffers debug output +- Mesh packet log +- Connection state details + +### Troubleshooting Remote Admin + +- **"No response from target node"** — the target may be out of range, offline, or have a mismatched admin key. Verify the admin key matches on both nodes. +- **Changes not applying** — some settings require a reboot to take effect. Try the Reboot action after saving. +- **Can't see remote settings** — ensure your node has the admin key for the target node and that Admin Channel is enabled in Security Config. + +## Related Topics + +- [Settings — Radio & User](settings-radio-user) — core radio and user profile settings +- [Module configuration reference](https://meshtastic.org/docs/configuration/module) — detailed module docs on meshtastic.org +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/be-rBY/user/settings-radio-user.md b/docs/be-rBY/user/settings-radio-user.md new file mode 100644 index 000000000..dfc0aea8e --- /dev/null +++ b/docs/be-rBY/user/settings-radio-user.md @@ -0,0 +1,173 @@ +--- +title: Settings — Radio & User +nav_order: 7 +last_updated: 2026-05-13 +description: Configure your radio hardware, LoRa presets, user profile, position sharing, power management, and security. +aliases: + - settings + - radio-config + - user-config + - lora +--- + +# Settings — Radio & User + +Configure your radio hardware and user identity parameters. + +## User Settings + +### User Profile + +| Setting | Апісанне | +| ----------------- | ------------------------------------------------------------------------------------- | +| Long Name | Your display name (up to 39 characters) | +| Short Name | 4-character abbreviated name | +| Licensed Operator | Enable if you hold an amateur radio license (enables higher power) | + +### Applying Changes + +After modifying settings, tap **Save** to write the configuration to your radio. The device may reboot to apply changes. + +## Radio Configuration + +### Device Config + +| Setting | Апісанне | Default | +| ------------------------------------------ | ----------------------------------------------------------------------- | -------- | +| Role | Node behavior (Client, Router, etc.) | CLIENT | +| Rebroadcast Mode | How the node retransmits messages | Усе | +| Node Info Broadcast (s) | Interval for broadcasting node info | 10800 | +| Double-tap Button | Action for double-tap button press | Disabled | + +### LoRa Config + +| Setting | Апісанне | Default | +| ----------------- | ----------------------------------------------------------------------- | ----------------------------------------- | +| Рэгіён | Regulatory region for frequency bands | Unset (must configure) | +| Modem Preset | Speed/range tradeoff | LongFast | +| Hop Limit | Maximum retransmit hops | 3 | +| TX Power | Transmission power (dBm); 0 = max allowed for region | 0 (region max) | +| Frequency Offset | Fine-tune frequency (MHz) | 0 | +| Channel Bandwidth | Bandwidth setting | Default for preset | + +> ⚠️ **Important:** You **must** set your region before transmitting. Operating without the correct region may violate local radio regulations. See the [region configuration guide](https://meshtastic.org/docs/getting-started/initial-config) on meshtastic.org for details. + +### Modem Presets + +| Preset | Range | Хуткасць | SNR Limit | Best For | +| ------------------ | ----------------------- | ------------------------- | ------------------------ | -------------------------------------------------------------------------------------------------------- | +| Short Turbo | ~1 km | 21.9 kbps | −5 dB | Dense urban with line-of-sight; data-heavy applications | +| Short Fast | ~3 km | 10.9 kbps | −7.5 dB | Urban neighborhoods; buildings within a few blocks | +| Short Slow | ~5 km | 5.5 kbps | −10 dB | Suburban short-range; moderate building density | +| Medium Fast | ~5 km | 5.5 kbps | −10 dB | Suburban areas; moderate building density | +| Medium Slow | ~8 km | 1.1 kbps | −12.5 dB | Suburban/rural; moderate range with slower speed | +| Long Turbo | ~10 km | 4.4 kbps | −10 dB | Similar range to Long Fast but with 500 kHz bandwidth; faster throughput | +| Long Fast | ~10 km | 1.1 kbps | −12.5 dB | **General use (default)** — balanced range and speed | +| Long Moderate | ~20 km | 0.34 kbps | −15 dB | Rural with some terrain; occasional use | +| Lite Fast | ~5 km | 5.5 kbps | −10 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Medium Fast | +| Lite Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Long Fast | +| Narrow Fast | ~5 km | 2.7 kbps | −10 dB | EU 868 MHz band (62.5 kHz BW); avoids interference with other devices | +| Narrow Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 868 MHz band (62.5 kHz BW); comparable to Long Fast | +| ~~Long Slow~~ | ~30 km | 0.18 kbps | −17.5 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | +| ~~Very Long Slow~~ | ~40+ km | 0.09 kbps | −20 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | + +#### Choosing a Modem Preset + +The modem preset controls the fundamental tradeoff between **range** and **data rate**: + +- **Slower presets** use more spreading, making signals decodable at weaker signal levels (lower SNR limit). This means longer range but fewer bytes per second. +- **Faster presets** pack more data per transmission but require a stronger signal to decode. + +**Practical guidance:** + +- **Urban mesh (many nodes, short distances):** Use **Long Fast** (default) or **Short Fast**. Higher speed means less airtime congestion when many nodes share the channel. +- **Rural/sparse mesh (few nodes, long distances):** Use **Long Moderate**. Range matters more than speed when nodes are far apart. +- **EU 866/868 MHz regulatory compliance:** Use **Lite Fast**, **Lite Slow**, **Narrow Fast**, or **Narrow Slow** — these are optimized for the EU SRD/868 MHz bands with narrower bandwidths. +- **Fixed infrastructure links:** Use **Short Turbo** or **Long Turbo** for dedicated point-to-point links with good antennas and line-of-sight. +- **Mixed environments:** Stick with **Long Fast** — it's the community default and ensures compatibility with others in your area. + +> ⚠️ **Important:** All nodes on the same channel **must** use the same modem preset. Nodes with mismatched presets cannot communicate even if they share the same frequency and encryption key. + +> 💡 **Tip:** The range estimates above assume flat terrain and modest antennas. Elevation advantage (hilltop, rooftop) dramatically increases effective range. A well-placed Router with Long Fast can often outperform a ground-level node with Long Slow. + +### Display Config + +| Setting | Апісанне | +| ------------------- | ------------------------------------------------------------------------------------ | +| Screen Timeout | Time before display sleeps | +| Display Units | Metric or Imperial | +| OLED Type | Auto, SSD1306, SH1106, SH1107 | +| Compass Orientation | Rotation offset for compass display (0°, 90°, 180°, 270°) | +| ~~Compass North~~ | ⚠️ **Deprecated** — replaced by Compass Orientation; still visible in older firmware | + +### Position Config + +| Setting | Апісанне | +| ----------------------------------------- | ---------------------------------- | +| GPS Enabled | Enable/disable GPS | +| GPS Update Interval | How often to acquire GPS fix | +| Position Broadcast (s) | How often to share position | +| Smart Position | Enable movement-based broadcasting | +| Fixed Position | Use a manually set position | + +### Power Config + +| Setting | Апісанне | +| --------------------------------------- | --------------------------------------- | +| | Enable low-power sleep mode | +| Shutdown After (s) | Auto-shutdown idle timer | +| ADC Multiplier | Battery voltage calibration factor | +| Wait Bluetooth (s) | Time to wait for BLE connection at boot | +| Mesh SDS Timeout (s) | Super-deep-sleep timeout | + +### Network Config + +| Setting | Апісанне | +| ------------- | ---------------------------------------------------- | +| WiFi Enabled | Enable WiFi radio (ESP32 devices) | +| WiFi SSID | Network name to connect to | +| WiFi PSK | Network password | +| NTP Server | Time synchronization server | +| Syslog Server | Remote logging server | + +![IP address field](/assets/screenshots/settings_ipv4_field.png) + +### Bluetooth Config + +| Setting | Апісанне | +| ----------------- | ------------------------------------------------------------------------- | +| Bluetooth Enabled | Enable/disable BLE radio | +| Pairing Mode | Fixed PIN, Random PIN, or No PIN | +| Fixed PIN | PIN code for pairing (default: 123456) | + +### Security Config + +| Setting | Апісанне | +| --------------------- | -------------------------------------------------------------------------- | +| Public Key | Your node's public key (read-only) | +| Admin Key | Key for remote administration | +| Прыватны ключ | Your node's private key (handle securely) | +| Admin Channel Enabled | Allow admin commands via channel | +| Debug Log | Output live debug logging over serial/bluetooth | +| Serial Enabled | Enable serial console access (moved from Device Config) | +| Managed Mode | Restrict non-admin channel changes | + +![Password field](/assets/screenshots/settings_password_field.png) + +Settings use standard preference controls — dropdowns, toggles, and sliders: + +| Control | Screenshot | +| -------- | ------------------------------------------------------ | +| Dropdown | ![Dropdown](/assets/screenshots/settings_dropdown.png) | +| Toggle | ![Toggle](/assets/screenshots/settings_switch.png) | +| Slider | ![Slider](/assets/screenshots/settings_slider.png) | + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — optional feature modules and device administration +- [Signal Meter](signal-meter) — how modem presets affect signal quality thresholds +- [LoRa configuration](https://meshtastic.org/docs/configuration/radio/lora) — detailed LoRa settings reference on meshtastic.org +- [Initial configuration](https://meshtastic.org/docs/getting-started/initial-config) — region setup guide on meshtastic.org + +--- + diff --git a/docs/be-rBY/user/signal-meter.md b/docs/be-rBY/user/signal-meter.md new file mode 100644 index 000000000..c6e34b4f9 --- /dev/null +++ b/docs/be-rBY/user/signal-meter.md @@ -0,0 +1,81 @@ +--- +title: How the Meshtastic Signal Meter Works +nav_order: 15 +last_updated: 2026-05-13 +description: How the signal meter calculates quality from RSSI and SNR — LoRa spread spectrum, presets, and what the bars really mean. +aliases: + - signal + - signal-meter + - snr + - rssi +--- + +# How the Meshtastic Signal Meter Works + +The Meshtastic signal meter — the familiar bars or status color in the app — is calculated very differently than the "bars" on a traditional cell phone or Wi-Fi router. + +Most consumer devices simply measure how "loud" a signal is. However, because Meshtastic uses **LoRa (Long Range)** technology, its signal meter measures how **clear** the signal is, relative to the specific settings your mesh is using. + +--- + +## 1. The Two Metrics: "Loudness" vs. "Clarity" + +Every time the LoRa radio chip receives a message, it reports two measurements: + +- **RSSI (Received Signal Strength Indicator):** The **loudness** of the raw power hitting your antenna. +- **SNR (Signal-to-Noise Ratio):** The **clarity** of the signal compared to the background static. + +> **Tip — The Analogy:** Imagine you are trying to hear a friend talking to you. +> +> - **RSSI** is how loud their voice is. +> - **The Noise Floor** is the background noise in the room (air conditioning, other people talking, traffic). +> - **SNR** is how easily you can distinguish your friend's voice from the background noise. + +If your friend shouts at you at a deafening rock concert, the signal is incredibly loud (High RSSI), but you still can't understand them because the background noise is louder (Bad SNR). Conversely, if your friend whispers to you in a dead-silent library, the signal is very weak (Low RSSI), but you can understand them perfectly (Great SNR). + +--- + +## 2. The Magic of LoRa: Hearing "Below the Noise Floor" + +For standard radios (like FM or Wi-Fi), if the background noise is louder than the signal (a negative SNR), the receiver just hears static. + +LoRa is special. It uses **"Spread Spectrum"** modulation, which allows the radio to mathematically pull a signal out of the air even when it is buried deep _underneath_ the background noise. This is why you will frequently see **negative SNR numbers** in Meshtastic (e.g., -10 dB, which means the signal is 10 decibels weaker than the background static). + +Depending on which Meshtastic preset you are using (e.g., `LongFast` vs. `ShortFast`), the radio has a specific **SNR Limit** — the absolute maximum amount of noise it can tolerate before the message is completely lost to the static. + +--- + +## 3. How the Signal Meter Calculates Quality + +The Meshtastic apps take both RSSI and SNR and run them through a specific formula to assign your signal a quality rating (None, Bad, Fair, or Good). It specifically scales these values based on the physical limits of the radio preset you are using. + +Here is exactly how the app decides how many bars (or what color) to show you: + +| Level | Bars | Criteria | Meaning | +| ------ | ---- | ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | +| Good | 3 | RSSI better than `-115 dBm` **AND** SNR better than `-7 dB` | Signal is both loud and clear — healthy connection. | +| Fair | 2 | RSSI better than `-126 dBm` with good SNR, **OR** SNR better than `-15 dB` with good RSSI | Signal getting quieter or noisier, but still decodable. | +| Bad | 1 | Falls between Fair and None thresholds | At the edge of range or experiencing interference. | +| Нічога | 0 | RSSI worse than `-126 dBm` **AND** SNR worse than `-15 dB` | Transmission completely buried in noise. | + +--- + +## 4. What This Means for You + +Because Meshtastic's meter acts as a **"Clarity Meter"**, it behaves differently than what most people expect: + +> **Tip — Don't panic over low RSSI:** You might see a seemingly terrible RSSI value like `-118 dBm`. On a cell phone, you would have zero bars. But if you have an SNR of `+2 dB`, Meshtastic will still show a strong signal! _The library is quiet, so the whisper is heard perfectly._ + +> **Warning — Watch out for local noise:** If you hook up a massive antenna and see a great RSSI (e.g., `-90 dBm`) but your signal meter is only showing **1 Bar (Bad)**, you have a problem. It means you have local interference — perhaps a cheap power supply, a noisy computer, or a nearby radio tower — creating so much static that it is drowning out your mesh. + +## Where Signal Information Appears + +In the app, signal data is shown in several places: + +- **Node list** — signal bars icon next to each node +- **Node detail** — SNR, RSSI, and signal quality in the device metrics section +- **Traceroute** — per-hop signal quality for each relay node +- **Signal metrics** — historical SNR and RSSI data in the metrics charts + +![Node entry showing SNR, RSSI values and colored signal bars](/assets/screenshots/nodes_signal_info.png) + diff --git a/docs/be-rBY/user/tak.md b/docs/be-rBY/user/tak.md new file mode 100644 index 000000000..93c5be2e2 --- /dev/null +++ b/docs/be-rBY/user/tak.md @@ -0,0 +1,126 @@ +--- +title: TAK Integration +nav_order: 10 +last_updated: 2026-05-13 +description: Interoperate with ATAK and WinTAK — CoT position sharing, TAK roles, and plugin setup. +aliases: + - tak + - atak + - team-awareness-kit +--- + +# TAK Integration + +Meshtastic integrates with the Team Awareness Kit (TAK) ecosystem, enabling interoperability between Meshtastic mesh devices and TAK applications like ATAK and WinTAK. + +## Абзор + +The TAK module allows Meshtastic nodes to: + +- Share position data in TAK-compatible CoT (Cursor on Target) format +- Appear as team members on TAK map displays +- Receive TAK PLI (Position Location Information) messages + +## Setup + +### Prerequisites + +- ATAK (Android Team Awareness Kit) or WinTAK installed +- Meshtastic ATAK Plugin installed +- TAK module enabled on your Meshtastic radio + +### Конфигурация + +1. Navigate to **Settings → Module Config → TAK**. +2. Enable the TAK module. +3. Configure the TAK team/group settings: + +![Module toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | Апісанне | +| -------- | -------------------------- | +| Уключана | Activate TAK interop | +| Mode | TAK-compatible output mode | + +### ATAK Plugin Setup + +1. Install the Meshtastic ATAK Plugin from the plugin repository. +2. Open ATAK and enable the Meshtastic plugin. +3. The plugin bridges messages between ATAK and your mesh network. + +## TAK Roles + +Nodes configured with TAK-related roles behave differently from standard clients: + +| Role | Апісанне | +| --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **TAK** | Full TAK interoperability — sends and receives CoT data, chat messages, and PLI updates. Functions as a standard client plus TAK bridge. | +| **TAK Tracker** | Position-only TAK output — automatically broadcasts PLI at regular intervals without user interaction. Optimized for unattended position beacons (vehicles, equipment, waypoints). Does not relay chat messages. | + +> 💡 **Tip:** Use **TAK Tracker** for devices that only need to report position (e.g., a radio mounted in a vehicle). Use **TAK** for devices where users actively participate in TAK operations. + +### CoT (Cursor on Target) Format + +TAK messages use the Cursor on Target XML format — a military standard for sharing situational awareness data. Meshtastic converts its internal protobuf messages to CoT format when bridging to TAK systems, so no manual format conversion is needed. + +## TAK Identity + +When using TAK roles, your node broadcasts identity information that appears on TAK maps: + +| Setting | Апісанне | +| -------- | ---------------------------------------------------------------------------------------------------------------- | +| Team | Your team color on the TAK map (e.g., Blue, Red, Cyan, Green) | +| Role | Your operational role (Team Member, Team Lead, HQ, Medic, RTO, etc.) | +| Callsign | Your TAK callsign (defaults to your Meshtastic long name) | + +These settings appear in **Settings → Module Config → TAK** when the TAK module is enabled. + +> 💡 **Tip:** Team/role colors are the standard TAK affiliation colors. Coordinate with your TAK team to use consistent team assignments. + +## Wire Format (V1 / V2) + +Meshtastic supports two TAK wire formats: + +| Format | Compatibility | Функцианал | +| ------------------------------- | --------------------------------------------------------------- | --------------------------------------------------------- | +| V1 (Legacy) | ATAK Plugin v1.x, older firmware | Basic CoT position sharing only | +| V2 (Current) | ATAK Plugin v2.x, firmware 2.3+ | Full CoT support including chat, routes, zstd compression | + +The app automatically selects V2 when both sides support it. No manual configuration needed — the TAK module negotiates format based on firmware capabilities. + +## Usage with ATAK + +Once configured: + +- Meshtastic nodes appear as markers on the ATAK map with callsign labels +- Chat messages can bridge between mesh and TAK networks +- Position updates flow bidirectionally between Meshtastic and TAK +- TAK Tracker nodes broadcast PLI automatically — their positions appear on ATAK maps without any ATAK-side configuration + +> ⚠️ **Note:** TAK integration requires specific node roles and module configuration. Standard client nodes don't automatically participate in TAK operations. + +## Troubleshooting + +| Problem | Cause | Solution | +| -------------------------------- | ------------------------------------- | ----------------------------------------------------------------------- | +| Node doesn't appear on ATAK map | TAK module disabled or wrong role | Verify TAK module is enabled and node role is TAK or TAK Tracker | +| Position updates are stale | GPS fix lost or interval too long | Check GPS status; reduce position broadcast interval in Position Config | +| ATAK plugin shows "disconnected" | BLE connection lost or plugin crashed | Reconnect Bluetooth in Meshtastic app, then restart ATAK plugin | +| Chat messages not bridging | V1 format doesn't support chat | Ensure both nodes run firmware 2.3+ for V2 wire format | +| CoT data not flowing | Channel mismatch | All TAK nodes must be on the same channel with matching encryption | + +## Security Considerations + +- TAK data shares your position and callsign information +- Ensure your channel encryption is configured when using TAK in sensitive environments +- The TAK module respects the same channel encryption as other Meshtastic messages + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — TAK module configuration +- [Nodes](nodes) — TAK and TAK Tracker roles in the node list +- [Map & Waypoints](map-and-waypoints) — node positions on the map +- [ATAK plugin guide](https://meshtastic.org/docs/software/integrations/atak-plugin) — detailed ATAK setup on meshtastic.org + +--- + diff --git a/docs/be-rBY/user/telemetry-and-sensors.md b/docs/be-rBY/user/telemetry-and-sensors.md new file mode 100644 index 000000000..92cc0154b --- /dev/null +++ b/docs/be-rBY/user/telemetry-and-sensors.md @@ -0,0 +1,118 @@ +--- +title: Telemetry & Sensors +nav_order: 9 +last_updated: 2026-05-13 +description: Sensor data on the mesh — supported environment, air quality, and power sensors, plus configuration and viewing guides. +aliases: + - sensors + - environment + - weather + - power-metrics +--- + +# Telemetry & Sensors + +Meshtastic nodes can collect and share sensor data across the mesh network. + +## Абзор + +Telemetry allows nodes equipped with sensors to broadcast environmental, power, and device health information. This data is visible on the node detail screen and can be logged over time. + +## Device Telemetry + +All Meshtastic nodes report basic device telemetry: + +| Metric | Апісанне | Typical Range | +| ------------------- | ------------------------------ | ------------------------------------------------------------------ | +| Battery Level | Charge percentage | 0–100% | +| Voltage | Battery voltage | 3.0–4.2V (LiPo) | +| Channel Utilization | % of airtime used locally | 0–100% | +| Air Utilization TX | % of airtime used by this node | 0–100% | +| Uptime | Seconds since last boot | Varies | + +## Environment Sensors + +Supported environmental sensors: + +### Temperature & Humidity + +| SENSOR | Тэмпература | Вільготнасць | Pressure | Notes | +| ------- | ----------- | ------------ | -------- | ----------------------- | +| BME280 | ✓ | ✓ | ✓ | Recommended all-in-one | +| BME680 | ✓ | ✓ | ✓ | Adds gas resistance/IAQ | +| SHT31 | ✓ | ✓ | — | High accuracy | +| MCP9808 | ✓ | — | — | Precision temperature | +| LPS22 | — | — | ✓ | Pressure only | + +### Air Quality + +| SENSOR | Metric | Notes | +| -------- | -------------------------------------------------- | -------------------------- | +| BME680 | Gas Resistance / IAQ | Volatile organic compounds | +| PMSA003I | PM1.0, PM2.5, PM10 | Particulate matter | +| SEN55 | PM, NOx, VOC, Temp, Humidity | Multi-sensor | + +### Light & UV + +| SENSOR | Metric | +| -------- | -------------------------------------- | +| OPT3001 | Ambient light (lux) | +| VEML7700 | Ambient light (lux) | +| LTR390 | UV index | + +## Power Metrics + +Nodes with INA-series power sensors can report: + +| Metric | Апісанне | +| ----------- | ----------------------------------------- | +| Bus Voltage | Supply rail voltage | +| 3 | Power consumption (mA) | +| Power | Calculated power (mW) | + +Useful for monitoring solar charging or battery health on remote nodes. + +## Configuring Telemetry + +1. Navigate to **Settings → Module Config → Telemetry**. +2. Set reporting intervals: + - **Device Metrics Interval** — how often to broadcast device metrics + - **Environment Metrics Interval** — how often to broadcast sensor data +3. Enable specific sensor types as needed. + +### Recommended Intervals + +| Use Case | Device (s) | Environment (s) | +| ------------------------------------------ | ----------------------------- | ---------------------------------- | +| Urban mesh (many nodes) | 3600 | 3600 | +| Rural mesh (few nodes) | 900 | 900 | +| Weather station | 900 | 300 | +| Battery conservation | 7200 | 7200 | + +> ⚠️ **Note:** Shorter intervals increase airtime usage and battery drain across the mesh. + +## Viewing Telemetry + +1. Navigate to **Nodes** and select a node. +2. Telemetry sections show on the detail screen: + - Device Metrics (always available) + - Environment Metrics (if sensors present) + - Power Metrics (if INA sensor present) +3. Historical graphs show trends over time. + +![Telemetry actions](/assets/screenshots/node-metrics_telemetric_actions.png) + +## Troubleshooting + +- **No environment data showing?** The remote node needs a physical sensor connected (e.g., BME280 on I2C). Device telemetry (battery, uptime) is always available, but environment metrics require hardware. +- **Stale readings?** Check the reporting interval — very long intervals (7200s+) mean data updates infrequently. Also verify the remote node is still online. +- **Sensor conflict on I2C bus?** Some sensors share I2C addresses. If you have multiple sensors on the same bus, check for address collisions in the radio's serial debug output. + +## Related Topics + +- [Node Metrics](node-metrics) — view telemetry data on the node detail screen +- [Settings — Modules & Admin](settings-module-admin) — telemetry module configuration +- [Units & Locale](units-and-locale) — temperature and pressure display units + +--- + diff --git a/docs/be-rBY/user/translate.md b/docs/be-rBY/user/translate.md new file mode 100644 index 000000000..b2ed79a34 --- /dev/null +++ b/docs/be-rBY/user/translate.md @@ -0,0 +1,97 @@ +--- +title: Translate the App +parent: User Guide +nav_order: 17 +last_updated: 2026-05-13 +aliases: + - translate + - crowdin + - localization +--- + +# Translate the App + +Contributing translations helps make Meshtastic accessible to a wider audience. The app uses [Crowdin](https://crowdin.com/) to manage community translations for both the user interface and in-app documentation. + +--- + +## What Gets Translated + +| Resource | Source Location | Notes | +| ----------------- | ------------------------------------- | ---------------------------------------------------------------------- | +| UI strings | `composeResources/values/strings.xml` | Buttons, labels, messages, and all user-visible text | +| User Guide pages | `docs/user/*.md` | In-app documentation shown in Help & Documentation | +| Fastlane metadata | `fastlane/metadata/android/en-US/` | App Store listing title, description, and changelogs | + +> **Note — Developer Guide pages are English-only.** Code-focused documentation targeting contributors is not translated. + +--- + +## How to Contribute + +1. **Visit the Crowdin project.** Open the [Meshtastic Android Crowdin project](https://crowdin.com/project/meshtastic-android) and sign in or create a free account. +2. **Choose your language.** Select an existing language or request a new one by opening a [GitHub issue](https://github.com/meshtastic/Meshtastic-Android/issues/new). +3. **Translate strings.** Crowdin shows the English source on the left and your translation on the right. Translate each string and save. +4. **Review context.** Many strings include screenshots or context comments — check these to understand where the text appears in the app. +5. **Submit.** Approved translations are automatically merged into the next release. + +> **Tip — Keep translations short.** UI strings often appear in buttons, chips, or narrow columns. If a translation is significantly longer than the English original, consider abbreviating where the meaning stays clear. + +--- + +## Adding a New Language + +If your language is not yet listed on Crowdin: + +1. Open an issue on [GitHub](https://github.com/meshtastic/Meshtastic-Android/issues/new) requesting the new locale. +2. A maintainer will add the language to Crowdin and configure `crowdin.yml`. +3. Once added, you can begin translating immediately. + +--- + +## How Translations Are Organized + +The Android app uses **Compose Multiplatform resources** for all user-visible strings: + +``` +core/resources/src/commonMain/composeResources/ +├── values/ ← English (default) +│ └── strings.xml +├── values-de/ ← German +│ └── strings.xml +├── values-fr/ ← French +│ └── strings.xml +└── ... +``` + +In-app documentation follows a similar pattern under `docs/`: + +``` +docs/ +├── user/ ← English source (default) +│ ├── onboarding.md +│ └── ... +├── fr/user/ ← French translations +│ ├── onboarding.md +│ └── ... +└── ... +``` + +The app automatically selects the correct locale based on your device's **Language & Region** settings. + +--- + +## Translation Guidelines + +- **Do not translate** technical terms like "LoRa", "MQTT", "BLE", "TAK", "SNR", or "RSSI" — these are universal. +- **Keep placeholders intact.** Strings like `%1$s` or `%d` are filled in at runtime. Do not remove or reorder them unless the grammar of your language requires it. +- **Match tone.** The app uses a friendly, direct voice. Avoid overly formal language. +- **Test if possible.** Switch your device language and open the app to see how translations look in context. + +--- + +## Questions? + +If you have questions about a specific string's context or need help getting started, open a discussion on the [Meshtastic GitHub Discussions](https://github.com/meshtastic/Meshtastic-Android/discussions) page. + +Thank you for helping expand the reach of Meshtastic! diff --git a/docs/be-rBY/user/units-and-locale.md b/docs/be-rBY/user/units-and-locale.md new file mode 100644 index 000000000..ee856d059 --- /dev/null +++ b/docs/be-rBY/user/units-and-locale.md @@ -0,0 +1,118 @@ +--- +title: Units, Measurement & Locale +parent: User Guide +nav_order: 16 +last_updated: 2026-05-12 +--- + +# Units, Measurement & Locale + +The Meshtastic app automatically displays temperatures, distances, speeds, and times in the units your device is configured to use — no settings to change inside the app. + +--- + +## How It Works + +Meshtastic radios always transmit data in **metric units** (meters, °C, km/h, hPa, etc.). When the app receives this data, it uses the `MetricFormatter` utility to convert and display values in whatever unit system your device's locale specifies. + +On Android, your measurement preferences are determined by your system **Language & Region** settings. On Desktop (JVM), the app uses the JVM's default `Locale`. + +> **Tip — You never need to toggle units inside the app.** Change your system measurement preferences and every screen in Meshtastic updates automatically — node details, telemetry charts, weather, altitude, and more. + +--- + +## Тэмпература + +Temperature values from environment sensors are transmitted as **°C** and displayed based on your device's temperature unit preference. + +![Environment metrics with temperature](/assets/screenshots/nodes_environment_metrics.png) + +| Your Setting | You See | +| ------------ | ------- | +| Celsius | 22°C | +| Fahrenheit | 72°F | + +This affects all temperature displays throughout the app: node environment telemetry, soil temperature, dew point, and telemetry chart axes. + +## Distance & Altitude + +Distances between nodes and GPS altitudes are transmitted as **meters** and automatically scaled and converted. + +![Distance info display](/assets/screenshots/nodes_distance_info.png) + +| Your Setting | Small Distance | Large Distance | Altitude | +| -------------------------------- | -------------- | ---------------------- | -------- | +| Metric | 350 m | 2.5 km | 1,200 m | +| Imperial (US) | 1,148 ft | 1.6 mi | 3,937 ft | + +The app uses natural scaling — short distances stay in meters or feet, while longer distances switch to kilometres or miles automatically. + +### Where these appear + +- **Node list** — distance and bearing to each node +- **Node detail** — altitude, distance from your position +- **Map** — waypoint distances, traceroute hop distances +- **Compass** — distance to selected node + +## Хуткасць + +GPS ground speed is displayed in your locale's preferred speed unit. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Metric | 12 km/h | +| Imperial (US) | 7 mph | + +## Wind + +Wind speed and gust data from environment sensors are transmitted as **m/s** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Metric | 5 m/s | +| Imperial (US) | 11 mph | + +Wind readings appear in the **Node Detail** environment section and the **Environment Telemetry** charts. + +## Rainfall + +Rainfall measurements (1-hour and 24-hour totals) are transmitted as **mm** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ---------------------- | +| Metric | 12 mm | +| Imperial (US) | 0.5 in | + +## Units That Never Change + +Some units are international standards and are displayed the same way regardless of your locale: + +| Measurement | Unit | Why | +| -------------------------------- | ------------------------------ | ------------------------------------- | +| Barometric pressure | hPa | International meteorological standard | +| Heading / bearing | ° (degrees) | Universal navigation convention | +| Radiation | μR/hr | Standard dosimetry unit | +| GPS coordinates | decimal degrees | Universal geographic standard | +| Humidity, battery, soil moisture | % | Universal | + +## Date & Time + +All timestamps throughout the app — last heard, message times, telemetry logs, chart axes — follow your device's date and time preferences. + +| Setting | What It Controls | Example | +| ---------------- | ---------------- | ------------------------------------------------ | +| **24-Hour Time** | Clock format | 14:30 vs 2:30 PM | +| **Date Format** | Date ordering | 09/05/2026 vs 05/09/2026 | + +The app also uses **relative time** where it makes sense — for example, "5 min ago" or "2 hours ago" in the node list — which is automatically localised into your device language. + +## Changing Your Measurement System (Android) + +On Android, your measurement system (metric vs imperial) is tied to your region setting: + +1. Open **Android Settings → System → Language & Region** +2. Change your **Region** or **Measurement units** preference +3. Return to Meshtastic — values update immediately + +> **Tip — The app uses `MetricFormatter` from `core:common`.** All measurement formatting is handled by a shared KMP utility that respects your platform's locale. Developers adding new measurement displays should use `MetricFormatter` rather than hard-coding unit conversions. + diff --git a/docs/bg-rBG/index.md b/docs/bg-rBG/index.md new file mode 100644 index 000000000..da181a83b --- /dev/null +++ b/docs/bg-rBG/index.md @@ -0,0 +1,30 @@ +--- +title: Home +layout: default +nav_order: 0 +--- + +# Meshtastic Android App Documentation + +User and developer documentation for the Meshtastic Android, Desktop, and iOS applications powered by KMP (Kotlin Multiplatform). + +Use the sidebar navigation to browse the **User Guide** for app features and the **Developer Guide** for contributing to the project. + +--- + +## Quick Links + +| Guide | Описание | +| --------------------------------------------------------------------- | -------------------------------------------------------------- | +| [Getting Started](user/onboarding) | Connect your first radio and send a message | +| [Messages & Channels](user/messages-and-channels) | Channel broadcasts, direct messages, reactions, and encryption | +| [Nodes](user/nodes) | Understanding the mesh network node list | +| [Signal Meter](user/signal-meter) | How the LoRa signal quality meter works | +| [Units & Locale](user/units-and-locale) | How temperatures, distances, and times adapt to your region | +| [Desktop App](user/desktop) | Linux, macOS, and Windows desktop usage | +| [Architecture](developer/architecture) | App architecture overview for contributors | +| [Contributing](developer/contributing) | Branch naming, PR workflow, and verification commands | + +--- + +> This documentation is served from the same markdown source that powers the in-app **Help & Documentation** browser. diff --git a/docs/bg-rBG/user/connections.md b/docs/bg-rBG/user/connections.md new file mode 100644 index 000000000..08c6403e0 --- /dev/null +++ b/docs/bg-rBG/user/connections.md @@ -0,0 +1,125 @@ +--- +title: Връзки +nav_order: 2 +last_updated: 2026-05-13 +description: Connect your phone or desktop to a Meshtastic radio via Bluetooth, USB, or TCP/IP. +aliases: + - bluetooth + - usb + - tcp + - pairing +--- + +# Връзки + +Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node. + +## Bluetooth (BLE) + +Bluetooth Low Energy is the default and most common connection method on Android. + +### Pairing a Device + +1. Ensure your Meshtastic radio is powered on and in pairing mode. +2. Open the app and navigate to **Connections**. +3. Tap **Scan for Devices** — nearby Meshtastic radios will appear. +4. Select your device from the list. +5. Accept the Bluetooth pairing prompt if shown. + +![Device list item](/assets/screenshots/connections_bluetooth_scan.png) + +You can filter devices by transport type using the filter chips at the top: + +![Transport filter chips](/assets/screenshots/connections_transport_filters.png) + +> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. + +### Connection Status + +| Icon | State | Описание | +| ---- | ----------------- | ----------------------------- | +| 🟢 | Свързано | Active radio link established | +| 🟡 | Свързване | Handshake in progress | +| 🔴 | Прекъсната връзка | No active connection | +| ⚪ | Not configured | Няма избрано устройство | + +When connecting, a status indicator shows the current connection state: + +![Connecting status](/assets/screenshots/connections_connecting.png) + +If no devices are found, the app shows an empty state with instructions: + +![No devices found](/assets/screenshots/connections_empty_state.png) + +### Troubleshooting Bluetooth + +- **Device not found:** Toggle Bluetooth off/on, ensure location is enabled. +- **Connection drops:** Move closer to the radio; check for interference. +- **Pairing rejected:** Forget the device in Android Bluetooth settings and retry. + +## USB Serial + +USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable. + +### Setup + +1. Connect your radio via USB cable to your device. +2. The app will prompt for USB permission — tap **Allow**. +3. The connection is established automatically. + +> ⚠️ **Note:** USB connections require OTG support on Android devices. + +## TCP/IP (WiFi) + +Some Meshtastic radios support WiFi connectivity, allowing TCP-based connections. + +### Конфигурация + +1. Connect your radio to a WiFi network via the radio's web interface or settings. +2. In the app, go to **Connections → TCP**. +3. Enter the radio's IP address and port (default: 4403). +4. Tap **Connect**. + +![WiFi scanning for devices](/assets/screenshots/connections_wifi_scanning.png) + +When a device is found, it appears in the connection list: + +![WiFi device found](/assets/screenshots/connections_wifi_device_found.png) + +A successful connection is confirmed with a status indicator: + +![WiFi connection success](/assets/screenshots/connections_wifi_success.png) + +### When to Use TCP + +- Radio is on the same local network +- Testing with a simulated radio +- Environments where Bluetooth has interference issues + +## Reconnection Behavior + +The app reconnects to the **last selected device** on startup. You can manually switch transports from the connections screen at any time. + +To disconnect from a radio, use the disconnect button on the connections screen: + +![Disconnect from radio](/assets/screenshots/connections_disconnect.png) + +## Desktop Connections + +On Desktop (Linux/macOS/Windows), the app supports: + +- **Bluetooth (BLE)** — via the Kable library; works on macOS, Linux, and Windows +- **USB Serial** — primary wired connection method +- **TCP/IP** — for network-connected radios + +See [Desktop App](desktop) for platform-specific details and keyboard shortcuts. + +## Related Topics + +- [Getting Started](onboarding) — first-launch setup and permissions +- [Settings — Radio & User](settings-radio-user) — Bluetooth and network configuration +- [Desktop App](desktop) — desktop-specific connection details +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — full list of compatible radios on meshtastic.org + +--- + diff --git a/docs/bg-rBG/user/desktop.md b/docs/bg-rBG/user/desktop.md new file mode 100644 index 000000000..968302146 --- /dev/null +++ b/docs/bg-rBG/user/desktop.md @@ -0,0 +1,147 @@ +--- +title: Desktop App +nav_order: 14 +last_updated: 2026-05-13 +description: Install and use the Meshtastic Desktop app on Linux, macOS, and Windows — connections, feature parity, and keyboard shortcuts. +aliases: + - desktop + - linux + - macos + - windows + - jvm +--- + +# Desktop App + +The Meshtastic Desktop application provides the same mesh communication features on Linux, macOS, and Windows. + +## Преглед + +The Desktop app shares its core codebase with the Android app through Kotlin Multiplatform (KMP). Most features work identically across platforms. + +## Инсталация + +### Linux + +- Download the `.deb` or `.AppImage` package from the releases page +- Or build from source using `./gradlew :desktopApp:run` + +### macOS + +- Download the `.dmg` package from releases +- Or build from source + +### Windows + +- Download the `.msi` installer from releases +- Or build from source + +## Connecting Your Radio + +### USB Serial (Primary) + +The most reliable connection method on Desktop: + +1. Connect your Meshtastic radio via USB cable. +2. The app should detect the serial port automatically. +3. If not detected, select the correct serial port from the connections menu. + +### TCP/IP + +For network-connected radios: + +1. Enter the radio's IP address and port (default: 4403). +2. Click **Connect**. + +### Bluetooth (BLE) + +Bluetooth Low Energy is supported on Desktop via the [Kable](https://github.com/JuulLabs/kable) library: + +1. Ensure your system has a Bluetooth adapter. +2. The app scans for nearby Meshtastic radios automatically. +3. Select your device from the connections screen. + +## Feature Parity + +| Feature | Android | Desktop | Бележки | +| ---------------------------------------- | ------- | ------- | -------------------------- | +| Messaging | ✓ | ✓ | Full parity | +| Node List | ✓ | ✓ | Full parity | +| Карта | ✓ | ✓ | Full parity | +| Настройки | ✓ | ✓ | Full parity | +| Bluetooth (BLE) | ✓ | ✓ | Via Kable on desktop | +| Firmware Update OTA | ✓ | ✗ | Use web flasher | +| Известия | ✓ | ✓ | Native OS notifications | +| Widgets | ✓ | ✗ | Android-only | +| AI Assistant (Chirpy) | ✓\* | ✗ | Google flavor Android only | + +\*Chirpy AI requires Android 14+ on Google flavor builds with supported hardware. + +## UI Differences + +The Desktop app uses the same Compose Multiplatform UI with adaptations for larger screens and desktop interaction. + +### Keyboard Shortcuts + +| Shortcut | Action | +| ------------------- | --------------------------- | +| **⌘Q** / **Ctrl+Q** | Quit the application | +| **⌘,** / **Ctrl+,** | Open Settings | +| **⌘1** / **Ctrl+1** | Switch to Conversations tab | +| **⌘2** / **Ctrl+2** | Switch to Nodes tab | +| **⌘3** / **Ctrl+3** | Switch to Map tab | +| **⌘4** / **Ctrl+4** | Switch to Connections tab | + +### Window & System Tray + +- **Window resizing** — responsive layout adapts to window dimensions +- **System tray** — minimize to system tray for background mesh operation +- **Tray menu** — right-click the tray icon to show window or quit +- **Mouse interaction** — hover states and standard desktop navigation + +### Notification Preferences + +The Desktop app provides in-app toggles for controlling which notifications are shown — messages, new nodes, and low battery alerts. Access these from **Settings → Notifications** within the app. + +## Built-in Documentation Browser + +The Desktop app includes a built-in documentation browser for quick access to help content without leaving the application. + +![Docs browser with table of contents](/assets/screenshots/docs-browser_toc.png) + +The browser supports full-text search across all documentation: + +![Searching the docs browser](/assets/screenshots/docs-browser_search.png) + +Individual doc pages render with full formatting: + +![A documentation page](/assets/screenshots/docs-browser_page.png) + +## Building from Source + +```bash +git clone https://github.com/meshtastic/Meshtastic-Android.git +cd Meshtastic-Android +git submodule update --init +./gradlew :desktopApp:run +``` + +Requirements: + +- JDK 21 +- No Android SDK required for desktop-only builds + +## Known Limitations + +- No OTA firmware updates (use web flasher) +- Some Android-specific features (widgets, specific notification channels) are unavailable +- Performance may vary on low-spec hardware running Compose Desktop +- BLE bonding is not yet supported on desktop (pairing works without bonding) + +## Related Topics + +- [Connections](connections) — connection methods overview +- [Firmware Updates](firmware) — use the [Web Flasher](https://flasher.meshtastic.org) for desktop firmware updates + +--- + diff --git a/docs/bg-rBG/user/discovery.md b/docs/bg-rBG/user/discovery.md new file mode 100644 index 000000000..b110d9b6f --- /dev/null +++ b/docs/bg-rBG/user/discovery.md @@ -0,0 +1,114 @@ +--- +title: Откриване +nav_order: 12 +last_updated: 2026-05-13 +description: Explore your mesh network — traceroute paths, neighbor maps, and node discovery tools. +aliases: + - mesh-discovery + - local-discovery + - network-scan + - traceroute + - neighbor-info +--- + +# Откриване + +Discovery tools help you understand **how** your mesh network is connected — which nodes can hear each other, what paths messages take, and where bottlenecks or weak links exist. + +> 💡 **Tip:** You don't need a dedicated "discovery mode" to start exploring your mesh. The tools below are available right now from the node list and node detail screens. + +--- + +## Трасиране на маршрут + +Traceroute reveals the exact path a message takes from your node to any other node on the mesh. It's the single most useful tool for debugging connectivity problems. + +### Running a Traceroute + +1. Navigate to **Nodes** and tap the node you want to trace. +2. On the node detail screen, tap **Traceroute**. +3. The app sends a traceroute request and waits for the response. +4. Results display each hop in order, with signal quality at every step. + +### Reading the Results + +A traceroute result looks like this: + +``` +You → Node A (SNR: 8.5, RSSI: -95) → Node B (SNR: 5.2, RSSI: -108) → Target +``` + +Each hop represents a relay node that forwarded the message. The SNR and RSSI values at each hop tell you about the link quality on that specific segment. + +| What to look for | What it means | +| -------------------------------------------------------------------------- | --------------------------------------------------------------------------- | +| All hops show Good SNR (> 5 dB) | Healthy path — messages flow reliably | +| One hop shows Bad SNR (< 0 dB) | Weak link — this relay segment is fragile | +| Many hops (4+) | Long path — consider repositioning a node to shorten it | +| Different path on retry | Mesh is adapting — multiple routes exist (this is good!) | + +> 💡 **Tip:** Run traceroute several times over a few minutes. If the path changes, your mesh has redundant routes — a sign of a well-connected network. + +### Troubleshooting with Traceroute + +- **"No route found"** — The target node may be offline, out of range, or on a different channel. Check that both nodes share at least one channel with the same encryption key. +- **Traceroute times out** — The path may be too long (exceeds hop limit) or a relay node is congested. Try increasing the hop limit in **Settings → LoRa Config**. +- **Asymmetric paths** — A traceroute from A→B may take a different path than B→A. This is normal — radio propagation is not always symmetric. + +--- + +## Neighbor Info + +The Neighbor Info module lets each node broadcast a list of the nodes it can **directly hear** (single-hop). When multiple nodes share their neighbor lists, you can piece together a topology map of the entire mesh. + +### Enabling Neighbor Info + +1. Navigate to **Settings → Module Config → Neighbor Info**. +2. Enable the module. +3. Set the broadcast interval (default: 900 seconds / 15 minutes). + +Once enabled, your node periodically broadcasts its neighbor table. Other nodes with Neighbor Info enabled do the same. + +### Viewing Neighbor Data + +- Open any node's detail screen and look for the **Neighbors** section. +- Each neighbor entry shows the node that was directly heard and its signal quality. +- Combine neighbor data from multiple nodes to understand the full mesh topology. + +> ⚠️ **Note:** Neighbor Info increases airtime usage because every enabled node periodically broadcasts its neighbor list. On busy meshes with many nodes, consider longer broadcast intervals (3600 seconds or more) to avoid congestion. + +--- + +## Node List as a Discovery Tool + +The node list itself is a powerful discovery tool when you use its filtering and sorting features effectively. + +### Finding New Nodes + +- Sort by **Last heard** to see the most recently active nodes at the top. +- Enable **Include unknown** to see nodes that have appeared on the mesh but haven't sent user info yet — these are often newly powered-on devices. + +### Assessing Connectivity + +- Sort by **Hops away** to see which nodes are directly reachable (0 hops) versus relayed. +- Sort by **Distance** to find nearby nodes and verify they're reachable. +- Use **Exclude MQTT** to focus on nodes reachable over radio (not via internet bridge). + +### Infrastructure Audit + +- Disable **Exclude infrastructure** to see Router, Repeater, Router Late, and Client Base nodes. +- Check their signal quality and last-heard times to verify your infrastructure nodes are healthy. + +See [Nodes](nodes) for full details on filtering and sorting options. + +--- + +## Tips for Mesh Exploration + +- **Start with traceroute** — it gives you immediate, actionable information about a specific path. +- **Enable Neighbor Info on key nodes** — especially routers and repeaters, to build a picture of the backbone. +- **Check the map** — node positions on the [Map](map-and-waypoints) combined with signal data help you understand why some links are strong and others are weak. +- **Compare signal over time** — use the [Signal Meter](signal-meter) guide to interpret SNR and RSSI values correctly. + +--- + diff --git a/docs/bg-rBG/user/firmware.md b/docs/bg-rBG/user/firmware.md new file mode 100644 index 000000000..09ee8eaca --- /dev/null +++ b/docs/bg-rBG/user/firmware.md @@ -0,0 +1,114 @@ +--- +title: Firmware Updates +nav_order: 13 +last_updated: 2026-05-13 +description: Update your radio firmware over Bluetooth — OTA process, version channels, pre-flight checks, and recovery. +aliases: + - firmware + - update + - ota + - flash +--- + +# Firmware Updates + +Keep your Meshtastic radio up to date with the latest firmware for new features, bug fixes, and security improvements. + +## Checking for Updates + +1. Navigate to **Settings → Firmware Update** or tap the firmware notification if shown. +2. The app checks for available firmware versions. +3. Available updates show the version number and changelog summary. + +## Update Methods + +### OTA (Over-The-Air) via Bluetooth + +The most common update method for Android users: + +1. Ensure your radio is connected via Bluetooth. +2. Navigate to the Firmware Update screen. +3. Select the desired firmware version. +4. Tap **Update** to begin the OTA process. +5. Wait for the update to complete — **do not disconnect** during the update. + +![Firmware checking for updates](/assets/screenshots/firmware_checking.png) + +> ⚠️ **Warning:** Interrupting a firmware update can brick your device. Ensure your radio has sufficient battery (>50% recommended) and maintain Bluetooth proximity during the entire process. + +![Firmware disclaimer](/assets/screenshots/firmware_disclaimer.png) + +### USB Flashing + +For recovery or when OTA is unavailable: + +- Use the [Meshtastic Web Flasher](https://flasher.meshtastic.org) +- Or the [Meshtastic CLI tool](https://meshtastic.org/docs/getting-started/flashing-firmware) on desktop + +## Version Channels + +| Канал | Описание | +| -------- | ------------------------------------------- | +| Стабилен | Recommended for most users; tested releases | +| Алфа | Preview releases; may contain bugs | + +## Pre-Update Checklist + +Before updating: + +- [ ] Battery > 50% +- [ ] Stable Bluetooth connection +- [ ] Note your current settings (they may reset on major version changes) +- [ ] Check the release notes for breaking changes + +## Post-Update + +After a successful update: + +- The radio will reboot automatically +- Bluetooth connection will re-establish +- Verify your settings are intact +- Check the firmware version in **Settings → About** + +![Firmware update success](/assets/screenshots/firmware_success.png) + +## Отстраняване на неизправности + +### Update Stuck + +If the update appears frozen: + +- Wait at least 5 minutes before intervening +- If truly stuck, power-cycle the radio +- Attempt the update again + +![Firmware update error](/assets/screenshots/firmware_error.png) + +### Device Won't Boot After Update + +If your device fails to boot: + +1. Try connecting via USB to a computer +2. Use the web flasher in recovery/DFU mode +3. Flash a known-good firmware version +4. Check the Meshtastic Discord for device-specific recovery steps + +### Compatibility Warnings + +The app may show warnings when: + +- Connected radio firmware is below minimum supported version +- Major version mismatch between app and firmware +- Deprecated features need migration + +> ⚠️ **Important:** Always update the Meshtastic app before or alongside firmware updates to ensure compatibility. + +## Related Topics + +- [Connections](connections) — reconnecting after a firmware update +- [Flashing firmware guide](https://meshtastic.org/docs/getting-started/flashing-firmware) — full firmware flashing walkthrough on meshtastic.org +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — check firmware compatibility by device +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/bg-rBG/user/map-and-waypoints.md b/docs/bg-rBG/user/map-and-waypoints.md new file mode 100644 index 000000000..76e353efe --- /dev/null +++ b/docs/bg-rBG/user/map-and-waypoints.md @@ -0,0 +1,116 @@ +--- +title: Map & Waypoints +nav_order: 6 +last_updated: 2026-05-13 +description: View node positions on the map, create and share waypoints, and manage position sharing and privacy. +aliases: + - map + - waypoints + - gps + - location +--- + +# Map & Waypoints + +The Map screen shows the geographic positions of nodes on your mesh, along with shared waypoints. + +## Map View + +The map displays: + +- **Node positions** — colored markers for each node reporting location +- **Waypoints** — shared points of interest +- **Your position** — your current GPS location + +### Node Markers + +Node markers on the map indicate: + +| Color | Meaning | +| ----- | ---------------------------------------------- | +| Зелен | Online (heard recently) | +| Жълт | Away (heard within 2 hours) | +| Gray | Offline (stale position) | +| Син | Your own node | + +### Map Controls + +- **Zoom** — pinch or use +/- buttons +- **Pan** — drag to explore +- **Center** — select the location button to center on your position +- **Node tap** — tap a node marker to view details + +The floating toolbar provides quick access to compass, layer switching, node filters, refresh, and location tracking. Tap the compass to reorient north-up, or tap the location button to center on your current position. + +![Map controls overlay](/assets/screenshots/map_controls_overlay.png) + +## Waypoints + +Waypoints are shared geographic points of interest that all mesh members can see. + +### Creating a Waypoint + +1. Long-press on the map at the desired location. +2. Enter a name and optional description. +3. Choose an icon/emoji for the waypoint. +4. Tap **Send** to share with the mesh. + +### Waypoint Properties + +| Property | Описание | +| ---------- | ------------------------------------------------------- | +| Име | Short identifier (max 30 characters) | +| Описание | Optional longer description | +| Icon | Visual marker emoji on the map | +| Заключен | If locked, only the creator can edit or delete | +| Expiration | Optional auto-remove time | + +### Waypoint Expiration + +Waypoints can be set to expire automatically: + +- **Never** (default) — waypoint remains until manually deleted +- **Timed** — waypoint is automatically removed after the specified duration (e.g., "remove after 2 hours"). Useful for temporary markers like rally points, hazards, or meeting locations. + +Expired waypoints are automatically hidden from the map so they don't clutter the display. The expiration countdown begins when the waypoint is created, not when other nodes receive it. + +### Managing Waypoints + +- Tap a waypoint on the map to view its details and coordinates +- Edit or delete waypoints you created +- **Locked waypoints** cannot be modified or deleted by other nodes — only the original creator can change them +- Unlocked waypoints can be edited by any mesh member + +## Position Sharing + +### Enabling Position Sharing + +Your node shares its GPS position based on: + +- **Fixed interval** — broadcast position at regular intervals +- **Smart position** — broadcast when movement exceeds a threshold +- **Manual** — only share when explicitly requested + +Configure position behavior in **Settings → Position**. + +### Privacy Considerations + +> 🔒 **Privacy:** Position data is broadcast to all nodes on your channel. If you don't want your location shared, disable GPS position in settings or use a fixed/fake position. + +## Map Sources + +The app supports multiple map tile sources: + +- OpenStreetMap (default) +- Satellite imagery (where available) +- Offline tiles (download map areas for offline use) + +## Related Topics + +- [Nodes](nodes) — view and filter your node list +- [Node Metrics](node-metrics) — signal quality and position history for individual nodes +- [Discovery](discovery) — traceroute and neighbor info for understanding mesh topology +- [Units & Locale](units-and-locale) — distance and coordinate display formats + +--- + diff --git a/docs/bg-rBG/user/messages-and-channels.md b/docs/bg-rBG/user/messages-and-channels.md new file mode 100644 index 000000000..ca2b2be0d --- /dev/null +++ b/docs/bg-rBG/user/messages-and-channels.md @@ -0,0 +1,159 @@ +--- +title: Messages & Channels +nav_order: 3 +last_updated: 2026-05-13 +description: Send and receive messages, manage channels, configure encryption, and use quick chat, reactions, and message actions. +aliases: + - канали + - direct-messages + - messaging + - conversations +--- + +# Messages & Channels + +Meshtastic supports two communication modes: **channel broadcasts** and **direct messages**. + +## Канали + +Channels are shared communication groups. All nodes configured with the same channel key can read and send messages on that channel. + +### Default Channel + +Every Meshtastic device comes with a default **LongFast** channel. This is an unencrypted channel used for general mesh communication. + +### Сигурност на канала + +Channels support multiple encryption levels: + +| Icon | Security Level | Описание | +| ---- | ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------- | +| 🔒 | PSK (256-bit AES) | Fully encrypted with a strong pre-shared key. Only nodes with the matching key can read messages. | +| 🔐 | PSK (128-bit AES) | Encrypted with a shorter key. Secure for most uses but 256-bit is preferred for sensitive data. | +| 🔓 | Default / Open | Uses the well-known default key. **Any Meshtastic device** on the same preset can read these messages. | +| ⚠️ | Insecure + Position | Open channel that also broadcasts your GPS position. Use with caution in public meshes. | + +> 🔒 **Security Tip:** 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. + +### Adding a Channel + +1. Navigate to **Settings → Channels**. +2. Tap **Add Channel** or scan a QR code. +3. Configure the channel name and encryption key. +4. Share the channel URL/QR code with others who need access. + +Tapping a channel shows its details and sharing options. + +## Директни съобщения + +Direct messages (DMs) are point-to-point encrypted communications between two specific nodes. + +### Sending a Direct Message + +1. Open the **Messages** tab. +2. Select a node from your contacts list or tap a node in the node list. +3. Type your message and tap **Send**. + +### Message States + +| State | Icon | Meaning | +| --------------------------------- | ---- | ----------------------------------------------------------------------------------------------------------------- | +| Queued | ⏳ | Message waiting to be sent | +| En route | ✓ | Delivered to the radio, awaiting acknowledgment | +| Доставено | ✓✓ | Acknowledgment received from recipient | +| Received | ✓ | Message received from the mesh (incoming) | +| S&F Routing | 🔗 | Store & Forward: message being routed through an S&F node | +| S&F Confirmed | 🔗 | Store & Forward: delivery confirmed via S&F node | +| Грешка | ✗ | Delivery failed after retries | + +### Delivery Errors + +When a message fails to deliver, the error indicator shows what went wrong: + +| Грешка | Meaning | What to Do | +| ---------------- | ---------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| No Route | No path exists to the destination node | The recipient may be offline or out of mesh range. Try later or move closer. | +| Got NAK | The next-hop node refused to relay | The relay node may be congested. Wait and retry. | +| Timeout | No acknowledgment within retry window | The recipient may be just out of range. Try increasing hop limit or moving to a better position. | +| Няма интерфейс | No radio interface available to send | Check that your radio is connected and the channel is configured. | +| Max Retransmit | All retry attempts exhausted | The mesh path is unreliable. Try a different channel or wait for conditions to improve. | +| Няма канал | The destination channel doesn't exist | Verify both nodes share the same channel configuration. | +| Too Large | Message exceeds maximum payload size | Shorten your message (max ~230 characters). | +| Няма отговор | Node received message but didn't respond | The recipient's radio may be busy or in low-power sleep mode. | +| Duty Cycle Limit | Regional airtime limit reached | Your radio has used its allowed transmit time. Wait for the duty cycle window to reset (typically 1 hour in EU regions). | +| Невалидна заявка | Malformed or invalid message | This usually indicates a software bug. Try restarting the app. | + +> 💡 **Tip:** 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. + +## Message Features + +### Quick Chat + +Pre-configured messages for rapid communication: + +- Access via the Quick Chat button in the message input area +- Choose from built-in phrases or custom messages +- Customize quick chat messages in **Settings → Quick Chat** +- Useful when typing is impractical (gloves, small screen, urgent) + +![Quick chat option](/assets/screenshots/messages_quick_chat.png) + +The channel list shows each channel with its latest message preview. + +### Message Bubbles + +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. + +### Reactions + +React to messages with emoji: + +- **Long-press** a message to open the actions menu +- Tap **Add Reaction** to choose an emoji +- Reactions appear below the message bubble +- Multiple users can react to the same message +- React to your own messages or others' messages + +![Emoji reaction badges displayed beneath a message](/assets/screenshots/messages_reaction.png) + +> 💡 **Tip:** Reactions are lightweight — they use minimal mesh bandwidth compared to full text messages. + +### Message Actions + +Long-press any message to access: + +- **Copy** — copy message text to clipboard +- **Reply** — quote the message in your response +- **React** — add an emoji reaction +- **Delete** — remove a message you sent (local deletion) + +### Message Priority + +Messages are queued and transmitted based on priority: + +1. Emergency/alert messages (highest) +2. Direct messages +3. Channel broadcasts (lowest) + +### Message Limits + +- **Maximum length:** 237 bytes (approximately 230 characters for ASCII text) +- **Rate limiting:** The mesh enforces airtime fairness; heavy message volume may be throttled +- **Delivery:** Messages are retried automatically if no acknowledgment is received + +## Най-добри практики + +- Use channels for group coordination +- Use direct messages for private person-to-person communication +- Keep messages short — mesh bandwidth is limited +- Configure encryption for sensitive communications + +## Related Topics + +- [Nodes](nodes) — tap a node to start a direct message +- [Settings — Radio & User](settings-radio-user) — configure channel encryption and presets +- [MQTT](mqtt) — bridge channel messages to the internet +- [Channel configuration](https://meshtastic.org/docs/configuration/radio/channels) — detailed channel settings on meshtastic.org + +--- + diff --git a/docs/bg-rBG/user/mqtt.md b/docs/bg-rBG/user/mqtt.md new file mode 100644 index 000000000..94e36ff39 --- /dev/null +++ b/docs/bg-rBG/user/mqtt.md @@ -0,0 +1,137 @@ +--- +title: MQTT +nav_order: 11 +last_updated: 2026-05-13 +description: Bridge your mesh to the internet — MQTT broker setup, encryption layers, and map reporting. +aliases: + - mqtt + - internet-bridge + - broker +--- + +# MQTT + +MQTT bridges your Meshtastic mesh network to the internet, enabling long-range communication beyond radio range. + +## Преглед + +The MQTT module connects your node to an MQTT broker, allowing: + +- Messages to reach nodes on different physical meshes via the internet +- Integration with home automation and monitoring systems +- Publishing node positions to the public Meshtastic map +- Custom data pipelines for logging and alerting + +## Как работи + +``` +[Your Node] → Radio → [Gateway Node with WiFi] → MQTT Broker → [Remote Gateway] → Radio → [Remote Node] +``` + +A gateway node with internet access (WiFi or Ethernet) publishes mesh messages to an MQTT topic. Remote gateways subscribed to the same topic inject those messages into their local mesh. + +## Конфигурация + +### Enabling MQTT + +1. Navigate to **Settings → Module Config → MQTT**. +2. Enable the MQTT module. +3. Configure the broker connection: + +![MQTT toggle switch](/assets/screenshots/settings_switch.png) + +| Настройка | Описание | По подразбиране | +| ----------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------- | +| Адрес на сървъра | MQTT broker hostname | mqtt.meshtastic.org | +| Потребителско име | Broker authentication | meshdev | +| Парола | Broker authentication | large4cats | +| Root Topic | Base topic for messages | msh | +| Криптиране | Encrypt MQTT payload | Активиран | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON packet support has been removed from firmware; this field is ignored | Disabled | +| TLS | Secure connection to broker | Disabled | +| Map Reporting | Report position to public map | Disabled | + +### Default Meshtastic Broker + +The community maintains a public broker at `mqtt.meshtastic.org`. This is intended for general use and testing. + +> 🔒 **Privacy:** Messages on the public broker are readable by anyone subscribed. Always use channel encryption for private communications. + +### Private Broker + +For better privacy and control, you can run your own MQTT broker: + +- Mosquitto (lightweight, open-source) +- HiveMQ +- EMQX + +Configure your node to point to your private broker with appropriate credentials. + +## Map Reporting + +When Map Reporting is enabled, your node publishes its position to the Meshtastic community map: + +- Visible at [meshmap.net](https://meshmap.net) and similar community map services +- Only position and node info are shared +- Disable this if you don't want your location publicly visible + +## Uplink vs Downlink + +| Direction | Описание | +| ------------ | -------------------------------- | +| **Uplink** | Messages from mesh → MQTT broker | +| **Downlink** | Messages from MQTT broker → mesh | + +Configure per-channel which directions are active to control message flow and airtime usage. + +## Message Formats + +MQTT uses protobuf message format: + +| Format | Описание | Use case | +| ------------ | ----------------------------------- | -------------------------- | +| **Protobuf** | Binary Meshtastic protobuf encoding | Node-to-node mesh bridging | + +> ⚠️ **Note:** JSON output support was removed from firmware. The `json_enabled` setting is still visible in the app for legacy compatibility but has no effect on current firmware versions. + +## Encryption & Privacy + +Understanding the layered encryption model: + +1. **Channel encryption** happens on the mesh _before_ MQTT. If your channel has a PSK, the MQTT payload is already encrypted — the broker and any subscribers see only the ciphertext. +2. **MQTT encryption** (the module setting) adds an additional encryption layer for transit to the broker. This protects metadata and routing information. +3. **TLS** encrypts the TCP connection to the broker itself, preventing network-level eavesdropping. + +> 🔒 **Important:** The default public channel has a well-known key. Messages on the default channel sent via MQTT are effectively **unencrypted** — anyone can decode them. Always use a custom PSK for private communications. + +## Най-добри практики + +- Use channel-level encryption (PSK) on channels that bridge to MQTT +- Don't enable MQTT on nodes without internet access (it will buffer and waste memory) +- Use a private broker for sensitive deployments +- Be mindful of airtime when downlinking messages from busy MQTT topics — every downlinked message consumes radio airtime on your local mesh +- Consider enabling uplink-only if you only need to monitor your mesh remotely without injecting messages back + +## Отстраняване на неизправности + +### MQTT Not Connecting + +- **Check WiFi** — the gateway node must have an active internet connection (WiFi or Ethernet). MQTT does not work over the LoRa radio link itself. +- **Verify credentials** — incorrect username or password will silently fail on most brokers. Double-check for trailing spaces. +- **Firewall** — port 1883 (MQTT) or 8883 (MQTT+TLS) must be open. Some networks block non-standard ports. +- **DNS resolution** — if using a custom broker hostname, verify the node can resolve it. Try the broker's IP address directly. + +### Messages Not Bridging + +- **Check uplink/downlink settings** — if only uplink is enabled, messages flow from mesh to MQTT but not back. Enable downlink on the receiving gateway. +- **Channel mismatch** — both gateways must share the same channel with the same PSK. A mismatch means messages are encrypted with different keys and appear as garbage. +- **Topic mismatch** — ensure both gateways use the same root topic. The default `msh` works for the public broker. + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — MQTT module configuration reference +- [Messages & Channels](messages-and-channels) — channel encryption and PSK setup +- [MQTT integration guide](https://meshtastic.org/docs/software/integrations/mqtt) — detailed MQTT documentation on meshtastic.org + +--- + diff --git a/docs/bg-rBG/user/node-metrics.md b/docs/bg-rBG/user/node-metrics.md new file mode 100644 index 000000000..a59720bf2 --- /dev/null +++ b/docs/bg-rBG/user/node-metrics.md @@ -0,0 +1,130 @@ +--- +title: Node Metrics +nav_order: 5 +last_updated: 2026-05-13 +description: Telemetry dashboards for each mesh node — device health, environment sensors, signal quality, power, traceroute, and position history. +aliases: + - metrics + - telemetry + - device-metrics + - signal +--- + +# Node Metrics + +The node detail screen provides comprehensive telemetry and metrics for each node on your mesh. + +## Метрики на устройството + +Basic operating information reported by each node: + +| Метрични | Описание | +| -------------------- | ----------------------------------- | +| Battery Level | Current battery percentage | +| Напрежение | Battery voltage reading | +| Използване на канала | Percentage of airtime consumed | +| Airtime | Transmission time used by this node | +| Време на работа | Time since last reboot | + +Device metrics are displayed as individual cards with trend sparklines showing battery level, voltage, channel utilization, airtime, and uptime over time. + +> 💡 **Tip:** Tap any metric card to expand it into a full chart with historical data points. Pinch to zoom the time axis. + +## Показатели на околната среда + +Environmental sensor data (requires compatible hardware): + +| Метрични | Sensor Examples | +| ------------------------------------ | --------------------- | +| Температура | BME280, BME680, SHT31 | +| Влажност | BME280, BME680, SHT31 | +| Барометрично налягане | BME280, BMP280 | +| Gas Resistance | BME680 | +| IAQ (Air Quality) | BME680 | + +Environment metrics are charted over time for easy trend analysis — temperature, humidity, and pressure each get their own line chart with the measurement unit displayed on the Y axis. + +> 💡 **Tip:** Environment metrics require a sensor connected to the remote node. Not all nodes report environmental data. See [Telemetry & Sensors](telemetry-and-sensors) for a full list of supported sensors. + +## Signal Metrics + +Radio signal quality information: + +| Метрични | Описание | +| --------- | ----------------------------------------------------------------------------- | +| SNR | Signal-to-Noise Ratio (higher is better) | +| RSSI | Received Signal Strength Indicator (closer to 0 is better) | +| Hop Count | Number of mesh hops for last message | + +### Signal Quality Reference + +| SNR Range | Quality | +| --------------------------------- | ------------- | +| > 10 dB | Excellent | +| 0 to 10 dB | Добър | +| -10 to 0 dB | Задоволителен | +| < -10 dB | Poor | + +## Показатели на мощност + +Power management telemetry (requires INA sensor or compatible hardware): + +| Метрични | Описание | +| ----------- | ----------------------- | +| Bus Voltage | Supply voltage | +| Текущ | Power draw in milliamps | +| Захранване | Calculated wattage | + +## Трасиране на маршрут + +Traceroute shows the path a message takes through the mesh: + +1. From the node detail screen, tap **Traceroute**. +2. The app sends a traceroute request to the target node. +3. Results show each hop with SNR/RSSI values. + +### Reading Traceroute Results + +``` +You → Node A (SNR: 8.5) → Node B (SNR: 5.2) → Target +``` + +Each hop represents a relay node that forwarded the message. + +## Журнал на позициите + +Historical position data for nodes that share their location: + +- GPS coordinates +- Надморска височина +- Speed (if moving) +- Timestamp for each position report + +## Neighbor Info + +Shows which nodes a given node can directly hear, useful for understanding mesh topology. + +## Viewing Metrics + +1. Navigate to **Nodes**. +2. Tap the node you want to inspect. +3. Select the metric category from the detail tabs. + +![Node detail — local device](/assets/screenshots/nodes_detail_local.png) + +The position tab shows location data for nodes that share GPS: + +![Position inline content](/assets/screenshots/nodes_position.png) + +> ⚠️ **Note:** Metrics are only available when they have been reported by the remote node. Metrics update at intervals configured on each node's telemetry settings. + +## Related Topics + +- [Nodes](nodes) — node list, filtering, and sorting +- [Telemetry & Sensors](telemetry-and-sensors) — supported sensors and configuration +- [Signal Meter](signal-meter) — how signal quality is calculated from SNR and RSSI +- [Discovery](discovery) — traceroute details and neighbor info +- [Units & Locale](units-and-locale) — temperature, distance, and speed display formats + +--- + diff --git a/docs/bg-rBG/user/nodes.md b/docs/bg-rBG/user/nodes.md new file mode 100644 index 000000000..9e61b93a8 --- /dev/null +++ b/docs/bg-rBG/user/nodes.md @@ -0,0 +1,152 @@ +--- +title: Възли +nav_order: 4 +last_updated: 2026-05-13 +description: Browse, filter, and sort mesh nodes — view details, signal quality, roles, and quick actions. +aliases: + - node-list + - mesh-nodes + - peers +--- + +# Възли + +The Nodes screen displays all devices visible on your mesh network. + +## Node List + +The node list shows every node your radio has heard, including: + +- **Node name** — user-configured long name +- **Short name** — 4-character identifier +- **Signal quality** — last heard signal strength +- **Last heard** — time since last communication +- **Distance** — estimated distance (if positions are shared) +- **Battery** — remote node battery level (if telemetry is enabled) + +### Node Status Indicators + +| Badge | Meaning | +| ---------- | ------------------------------------- | +| 🟢 Online | Node heard within the last 15 minutes | +| 🟡 Away | Node heard within the last 2 hours | +| 🔴 Offline | Node not heard for over 2 hours | +| ⭐ Favorite | Node marked as favorite by the user | + +### Node Roles + +Nodes can be configured with different roles that affect their mesh behavior: + +| Роля | Описание | +| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Клиент | Standard end-user device | +| Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | +| Client Mute | Receives but doesn't retransmit | +| Скрит клиент | Like Client Mute, plus hides from node list | +| Рутер | Prioritizes message forwarding; stays awake to relay | +| Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | +| ~~Router Client~~ | ⚠️ **Deprecated** (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | +| ~~Repeater~~ | ⚠️ **Deprecated** (removed in firmware 2.7.11) — no longer selectable; use Router instead | +| Тракер | Optimized for position reporting at regular intervals | +| Сензор | Optimized for telemetry reporting | +| TAK | Interoperates with TAK systems (sends/receives CoT) | +| TAK Tracker | TAK position reporting only | +| Lost & Found | Continuous position beacon for recovery | + +### Choosing a Role + +Most users should keep the default **Client** role. Consider a different role when: + +- **Router** — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don't use Router on battery-powered handheld devices. +- **Router Late** — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. +- **Client Base** — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. +- **Client Mute** — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only devices or to reduce congestion in dense areas. +- **Tracker** — An unattended device whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. +- **Sensor** — An unattended device reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. +- **TAK / TAK Tracker** — Only needed if interoperating with ATAK/WinTAK systems. See [TAK Integration](tak) for details. + +> 💡 **Tip:** The mesh works best when most nodes are **Client** or **Router**. Too many Mute nodes reduces mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. + +### Encryption Indicators + +Nodes display encryption status icons next to their name: + +| Icon | Meaning | +| ----------- | ------------------------------------------------------------------------------------------------------------------- | +| 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | +| 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | +| ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) | + +> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. + +## Quick Actions + +From the node list, you can: + +- **Tap** a node to view its detail page +- **Long-press** for quick actions: + - Send a direct message + - Вижте на картата + - Поискване на позиция + - Mark as favorite + - Трасиране на маршрут + +## Filtering & Sorting + +### Text Search + +Type in the search field to filter nodes by name or short name. The filter updates in real time as you type. + +### Filter Toggles + +| Филтър | Описание | +| -------------------------- | ---------------------------------------------------------------------------------------------- | +| **Only online** | Show only nodes heard within the last 15 minutes | +| **Only direct** | Show only nodes with direct (non-relayed) connections | +| **Include unknown** | Show nodes that haven't sent user info yet | +| **Exclude infrastructure** | Hide infrastructure-role nodes (Router, Repeater, Router Late, Client Base) | +| **Exclude MQTT** | Hide nodes heard only via MQTT internet bridge | +| **Show ignored** | Show nodes you've previously dismissed or muted | + +### Sort Options + +| Sort | Описание | +| ------------------------------------------- | ------------------------------------------------------------------ | +| **Last heard** (default) | Most recently heard nodes first | +| **Alphabetical** | Sorted by node long name | +| **Distance** | Nearest nodes first (requires position sharing) | +| **Hops away** | Fewest relay hops first | +| **Channel** | Grouped by channel index | +| **Via MQTT** | Grouped by MQTT vs. radio-heard | +| **Favorites** | Favorited nodes first | + +## Node Detail + +Tapping a node opens the detail view with comprehensive information. See [Node Metrics](node-metrics) for full details on metrics and telemetry. + +![Node detail view](/assets/screenshots/nodes_node_list.png) + +The detail screen includes device info, position, and action buttons: + +![Node detail section](/assets/screenshots/nodes_detail_section.png) + +Inline status indicators show key metrics at a glance: + +| Indicator | Екранна снимка | +| ----------------- | -------------------------------------------------------- | +| Signal quality | ![Signal](/assets/screenshots/nodes_signal_info.png) | +| Ниво на батерията | ![Battery](/assets/screenshots/nodes_battery_info.png) | +| Hop count | ![Hops](/assets/screenshots/nodes_hops_info.png) | +| Последно чут | ![Last heard](/assets/screenshots/nodes_last_heard.png) | +| Разстояние | ![Distance](/assets/screenshots/nodes_distance_info.png) | + +## Related Topics + +- [Node Metrics](node-metrics) — detailed telemetry dashboards for each node +- [Messages & Channels](messages-and-channels) — send a direct message to a node +- [Map & Waypoints](map-and-waypoints) — view node positions geographically +- [Discovery](discovery) — traceroute and neighbor info for topology exploration +- [Signal Meter](signal-meter) — understand what the signal bars mean + +--- + diff --git a/docs/bg-rBG/user/onboarding.md b/docs/bg-rBG/user/onboarding.md new file mode 100644 index 000000000..e3749c214 --- /dev/null +++ b/docs/bg-rBG/user/onboarding.md @@ -0,0 +1,99 @@ +--- +title: Първи стъпки +nav_order: 1 +last_updated: 2026-05-13 +description: First-launch setup — permissions, onboarding flow, and next steps after connecting your radio. +aliases: + - first-launch + - setup + - intro +--- + +# Първи стъпки + +Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app. + +## First Launch + +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. + +### Welcome Screen + +The welcome screen introduces Meshtastic and its core capabilities: + +- Off-grid mesh communication +- No cellular or internet required +- End-to-end encrypted messaging + +Tap **Get Started** to proceed through the setup flow. + +![Welcome screen](/assets/screenshots/onboarding_welcome.png) + +## Permissions + +The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. + +### Bluetooth Permission + +Bluetooth is the primary connection method between your phone and Meshtastic radio: + +- **Bluetooth scanning** — discover nearby Meshtastic radios +- **Bluetooth connect** — establish and maintain connections with paired radios + +Grant both permissions when prompted. Without Bluetooth, you'll need to use USB or TCP connections instead. + +### Location Permission + +> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. + +Meshtastic also uses your location for: + +- Showing your position on the mesh map +- Calculating distances to other nodes +- Sharing your GPS coordinates with other mesh members (if enabled) + +Grant **"While using the app"** or **"Always"** depending on your preference: + +- **While using the app** — position updates only when the app is open +- **Always** — enables background position updates for always-on mesh presence + +If denied, Bluetooth scanning will not function and your node will not report a position. + +### Notifications Permission + +Notifications alert you to: + +- Incoming messages from channels and direct messages +- Connection status changes (connected, disconnected, reconnecting) +- Firmware update availability + +> 💡 **Tip:** You can fine-tune notification preferences later in Android system settings. The app creates separate notification channels for messages, connection events, and background service status. + +### Critical Alerts Permission + +On supported devices, the app may request permission for critical alerts: + +- These are high-priority notifications that can break through Do Not Disturb mode +- Useful for emergency mesh alerts or urgent messages +- You can **skip** this step if you don't need breakthrough notifications +- Configure or revoke later in Android notification settings + +## After Setup + +Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. + +> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. + +## What's Next? + +Once connected to a radio, explore: + +- [Connections](connections) — pair your first radio device +- [Messages & Channels](messages-and-channels) — send your first message +- [Nodes](nodes) — see who's on your mesh +- [Map & Waypoints](map-and-waypoints) — view node positions +- [Settings](settings-radio-user) — configure your radio and user profile + +New to Meshtastic? The [getting started guide](https://meshtastic.org/docs/getting-started) on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup. + +--- diff --git a/docs/bg-rBG/user/settings-module-admin.md b/docs/bg-rBG/user/settings-module-admin.md new file mode 100644 index 000000000..44a88f34a --- /dev/null +++ b/docs/bg-rBG/user/settings-module-admin.md @@ -0,0 +1,246 @@ +--- +title: Settings — Modules & Admin +nav_order: 8 +last_updated: 2026-05-13 +description: Configure optional feature modules (MQTT, telemetry, canned messages, TAK, and more) and perform device administration. +aliases: + - modules + - module-config + - administration +--- + +# Settings — Modules & Admin + +Configure optional feature modules and perform device administration. Modules extend Meshtastic with specialized capabilities — each can be independently enabled or disabled. + +> 💡 **Tip:** You only need to enable the modules you actually use. Disabling unused modules reduces airtime, saves battery, and simplifies your configuration. + +Module settings use a card-based layout with toggle switches, dropdowns, text fields, and sliders: + +![Toggle switch](/assets/screenshots/settings_switch.png) + +![Dropdown selector](/assets/screenshots/settings_dropdown.png) + +![Text field](/assets/screenshots/settings_text_field.png) + +![Settings card layout](/assets/screenshots/settings_titled_card.png) + +## Конфигурация на модулите + +### MQTT Module + +Bridges mesh messages to and from an MQTT broker for internet connectivity. This is how you extend your mesh beyond radio range or integrate with home automation systems. + +| Настройка | Описание | +| ----------------- | ------------------------------------------------------------------------ | +| Активиран | Toggle MQTT bridge | +| Сървър | MQTT broker address | +| Потребителско име | Authentication username | +| Парола | Authentication password | +| Криптиране | Encrypt MQTT payloads | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON support removed from firmware; field is ignored | +| TLS | Use secure connection | +| Root Topic | Base MQTT topic path | +| Map Report | Publish position for public map | + +See [MQTT](mqtt) for a detailed usage guide including encryption, privacy, and broker setup. + +### Serial Module + +Enables serial port communication for external device integrations (GPS modules, sensors, or custom hardware). When enabled, the node's serial port can send and receive protobuf or text data, allowing external microcontrollers or computers to interact with the mesh. + +| Настройка | Описание | +| ---------- | ------------------------------- | +| Активиран | Activate serial communication | +| Ехо | Echo received serial data back | +| Режим | Text, Protobuf, or NMEA output | +| RX/TX Pins | GPIO pins for serial connection | +| Baud Rate | Serial communication speed | + +### External Notification Module + +Controls buzzer, LED, or vibration alerts on your radio hardware. Useful for devices that need to physically signal when a message arrives — particularly helpful for unattended or outdoor installations. + +| Настройка | Описание | +| -------------------------------- | --------------------------- | +| Активиран | Activate notifications | +| Предупредително съобщение | Notify on incoming messages | +| Alert Message Buzzer | Use buzzer for messages | +| Alert Message Vibra | Use vibration for messages | +| Alert Bell | Notify on bell character | +| Output (GPIO) | Pin for notification output | +| Активно | High or Low active | +| Duration (ms) | Notification length | +| Use I2S as Buzzer | Use I2S audio output | + +### Store & Forward Module + +Buffers messages for nodes that were temporarily offline, then replays them when those nodes reconnect. Essential for meshes where nodes go in and out of range regularly — ensures messages aren't lost during brief disconnections. + +| Настройка | Описание | +| ------------------------------------------ | -------------------------- | +| Активиран | Activate store and forward | +| Heartbeat (s) | Announcement interval | +| Записи | Maximum stored messages | +| History Return (max) | Max messages to replay | +| History Return (window) | Time window for replay | + +> 💡 **Tip:** Store and Forward works best on nodes with ample memory (ESP32 with PSRAM). Router nodes are ideal candidates since they're typically always-on. + +### Range Test Module + +Automated range testing tool for evaluating link quality between nodes. When enabled, the node periodically transmits test messages with incrementing counters. A receiver node logs these messages, allowing you to walk or drive away and later analyze at what distance messages stopped arriving. + +| Настройка | Описание | +| -------------------------------------- | --------------------------------- | +| Активиран | Activate range testing | +| Sender Interval (s) | Time between test transmissions | +| Save CSV | Log received test data to SD card | + +### Telemetry Module + +Controls what telemetry data your node shares with the mesh. Telemetry includes device health (battery, uptime) and environmental sensor data (temperature, humidity, pressure). + +| Настройка | Описание | +| -------------------------------- | --------------------------------------- | +| Device Metrics Interval | How often to report device metrics | +| Environment Metrics Interval | How often to report environment sensors | +| Качество на въздуха е активирано | Report particulate sensor data | +| Power Metrics Enabled | Report power usage | + +See [Telemetry & Sensors](telemetry-and-sensors) for supported sensors and configuration recommendations. + +### Canned Message Module + +Pre-configured messages accessible from the device's physical buttons (for radios with rotary encoders, keypads, or similar input hardware). Define a list of quick-send messages that can be transmitted without a phone connected — ideal for field use. + +| Настройка | Описание | +| ------------------ | ----------------------------------------------------------- | +| ~~Enabled~~ | ⚠️ **Deprecated** — current firmware may ignore this toggle | +| Съобщения | Newline-separated list of messages | +| Send Bell | Play bell sound on send | +| Rotary Encoder | Enable rotary encoder input | +| Up/Down/Press Pins | GPIO pin assignments for input | + +### Audio Module + +Codec2 audio support for low-bandwidth voice communication over the mesh. This is an **experimental** feature that encodes voice into very small data packets using the Codec2 codec. + +| Настройка | Описание | +| --------------- | -------------------------------- | +| Активиран | Activate audio module | +| Codec2 Rate | Audio quality/bandwidth tradeoff | +| I2S Word Select | GPIO pin for I2S WS | +| I2S Data In | GPIO pin for I2S DIN | +| I2S Data Out | GPIO pin for I2S DOUT | + +> ⚠️ **Note:** Audio requires specific hardware (I2S microphone and speaker). Voice quality is very low-bandwidth — think "understandable radio voice," not phone-call quality. + +### Remote Hardware Module + +GPIO control over the mesh network. Allows a remote node to read or write GPIO pins on another node — useful for activating relays, reading switches, or controlling external hardware from a distance. + +| Настройка | Описание | +| -------------------- | --------------------------------------------------------------- | +| Активиран | Activate remote GPIO access | +| Allow Undefined Pins | Allow access to any GPIO pin (security risk) | + +> ⚠️ **Warning:** Enabling "Allow Undefined Pins" gives remote nodes access to all GPIO pins, which could interfere with the radio's own hardware. Only enable on dedicated GPIO nodes. + +### Neighbor Info Module + +Broadcasts information about directly heard neighbors, enabling mesh topology mapping. Each enabled node periodically shares a list of the other nodes it can hear and their signal quality. + +| Настройка | Описание | +| -------------------------------------- | ------------------------------------ | +| Активиран | Activate neighbor broadcasting | +| Update Interval (s) | How often to broadcast neighbor list | + +See [Discovery](discovery) for how to use neighbor data for mesh topology exploration. + +### Ambient Lighting Module + +Controls onboard NeoPixel or other addressable RGB LEDs on supported hardware. Can be used for visual status indicators, notification lights, or decorative effects. + +| Настройка | Описание | +| ------------------ | ---------------------------------------------------------- | +| Активиран | Activate LED control | +| LED State | On, Off, or set specific color | +| Red / Green / Blue | Individual color channel values (0–255) | + +### Detection Sensor Module + +Turns your node into a motion or door sensor alert system. When a GPIO pin detects a state change (motion detected, door opened), the node broadcasts an alert message over the mesh. + +| Настройка | Описание | +| ---------------------------------------- | ----------------------------------------------------------------------- | +| Активиран | Activate detection sensor | +| Monitor Pin | GPIO pin connected to sensor | +| Detection Triggered High | Trigger when pin goes high (vs. low) | +| Minimum Broadcast (s) | Minimum time between alert broadcasts | +| State Broadcast (s) | Periodic state broadcast interval | +| Send Bell | Include bell character in alerts | +| Приятелско име | Custom name for this sensor | + +### Paxcounter Module + +People counter using WiFi and BLE probe requests. Counts nearby devices by passively listening for probe requests that phones and laptops emit when scanning for networks. Available only on ESP32 devices. + +| Настройка | Описание | +| -------------------------------------- | -------------------------- | +| Активиран | Activate people counting | +| Update Interval (s) | How often to report counts | + +> 💡 **Tip:** Paxcounter is useful for estimating foot traffic at trailheads, event venues, or other locations. Counts are approximate — one person may carry multiple devices. + +### TAK Module + +Team Awareness Kit integration for interoperability with ATAK and WinTAK. See [TAK Integration](tak) for detailed setup and usage. + +## Администриране + +### Отдалечено администриране + +Remotely configure nodes that share your admin key: + +1. Select the target node in the node list. +2. Navigate to **Settings** for that node. +3. Modify configuration. +4. Tap **Save** — changes are sent over the mesh. + +> ⚠️ **Requires:** Admin key configured on both your node and the target node. + +### Почистване на базата данни с възлите + +Removes stale nodes from your local database that haven't been heard in a configurable time window. + +### Factory Reset + +Resets all settings to factory defaults. **This cannot be undone.** + +### Рестартиране + +Remotely reboot a connected or administered node. + +### Панел за отстраняване на грешки + +View detailed diagnostic information: + +- Protocol buffers debug output +- Mesh packet log +- Connection state details + +### Troubleshooting Remote Admin + +- **"No response from target node"** — the target may be out of range, offline, or have a mismatched admin key. Verify the admin key matches on both nodes. +- **Changes not applying** — some settings require a reboot to take effect. Try the Reboot action after saving. +- **Can't see remote settings** — ensure your node has the admin key for the target node and that Admin Channel is enabled in Security Config. + +## Related Topics + +- [Settings — Radio & User](settings-radio-user) — core radio and user profile settings +- [Module configuration reference](https://meshtastic.org/docs/configuration/module) — detailed module docs on meshtastic.org +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/bg-rBG/user/settings-radio-user.md b/docs/bg-rBG/user/settings-radio-user.md new file mode 100644 index 000000000..fe8f2fb1f --- /dev/null +++ b/docs/bg-rBG/user/settings-radio-user.md @@ -0,0 +1,173 @@ +--- +title: Settings — Radio & User +nav_order: 7 +last_updated: 2026-05-13 +description: Configure your radio hardware, LoRa presets, user profile, position sharing, power management, and security. +aliases: + - настройки + - radio-config + - user-config + - lora +--- + +# Settings — Radio & User + +Configure your radio hardware and user identity parameters. + +## Потребителски настройки + +### User Profile + +| Настройка | Описание | +| ----------------- | ------------------------------------------------------------------------------------- | +| Дълго име | Your display name (up to 39 characters) | +| Кратко име | 4-character abbreviated name | +| Licensed Operator | Enable if you hold an amateur radio license (enables higher power) | + +### Applying Changes + +After modifying settings, tap **Save** to write the configuration to your radio. The device may reboot to apply changes. + +## Конфигурация на радиото + +### Конфигуриране на устройството + +| Настройка | Описание | По подразбиране | +| ------------------------------------------ | ----------------------------------------------------------------------- | --------------- | +| Роля | Node behavior (Client, Router, etc.) | Клиент | +| Режим на препредаване | How the node retransmits messages | Всички | +| Node Info Broadcast (s) | Interval for broadcasting node info | 10800 | +| Double-tap Button | Action for double-tap button press | Disabled | + +### Конфигуриране на LoRa + +| Настройка | Описание | По подразбиране | +| ---------------------------- | ----------------------------------------------------------------------- | ----------------------------------------- | +| Регион | Regulatory region for frequency bands | Unset (must configure) | +| Предварително настроен модем | Speed/range tradeoff | LongFast | +| Лимит на отскоци | Maximum retransmit hops | 3 | +| TX Power | Transmission power (dBm); 0 = max allowed for region | 0 (region max) | +| Отместване на честотата | Fine-tune frequency (MHz) | 0 | +| Channel Bandwidth | Bandwidth setting | Default for preset | + +> ⚠️ **Important:** You **must** set your region before transmitting. Operating without the correct region may violate local radio regulations. See the [region configuration guide](https://meshtastic.org/docs/getting-started/initial-config) on meshtastic.org for details. + +### Modem Presets + +| Preset | Диапазон | Скорост | SNR Limit | Best For | +| ------------------ | ----------------------- | ------------------------- | ------------------------ | -------------------------------------------------------------------------------------------------------- | +| Short Turbo | ~1 km | 21.9 kbps | −5 dB | Dense urban with line-of-sight; data-heavy applications | +| Short Fast | ~3 km | 10.9 kbps | −7.5 dB | Urban neighborhoods; buildings within a few blocks | +| Short Slow | ~5 km | 5.5 kbps | −10 dB | Suburban short-range; moderate building density | +| Medium Fast | ~5 km | 5.5 kbps | −10 dB | Suburban areas; moderate building density | +| Medium Slow | ~8 km | 1.1 kbps | −12.5 dB | Suburban/rural; moderate range with slower speed | +| Long Turbo | ~10 km | 4.4 kbps | −10 dB | Similar range to Long Fast but with 500 kHz bandwidth; faster throughput | +| Long Fast | ~10 km | 1.1 kbps | −12.5 dB | **General use (default)** — balanced range and speed | +| Long Moderate | ~20 km | 0.34 kbps | −15 dB | Rural with some terrain; occasional use | +| Lite Fast | ~5 km | 5.5 kbps | −10 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Medium Fast | +| Lite Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Long Fast | +| Narrow Fast | ~5 km | 2.7 kbps | −10 dB | EU 868 MHz band (62.5 kHz BW); avoids interference with other devices | +| Narrow Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 868 MHz band (62.5 kHz BW); comparable to Long Fast | +| ~~Long Slow~~ | ~30 km | 0.18 kbps | −17.5 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | +| ~~Very Long Slow~~ | ~40+ km | 0.09 kbps | −20 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | + +#### Choosing a Modem Preset + +The modem preset controls the fundamental tradeoff between **range** and **data rate**: + +- **Slower presets** use more spreading, making signals decodable at weaker signal levels (lower SNR limit). This means longer range but fewer bytes per second. +- **Faster presets** pack more data per transmission but require a stronger signal to decode. + +**Practical guidance:** + +- **Urban mesh (many nodes, short distances):** Use **Long Fast** (default) or **Short Fast**. Higher speed means less airtime congestion when many nodes share the channel. +- **Rural/sparse mesh (few nodes, long distances):** Use **Long Moderate**. Range matters more than speed when nodes are far apart. +- **EU 866/868 MHz regulatory compliance:** Use **Lite Fast**, **Lite Slow**, **Narrow Fast**, or **Narrow Slow** — these are optimized for the EU SRD/868 MHz bands with narrower bandwidths. +- **Fixed infrastructure links:** Use **Short Turbo** or **Long Turbo** for dedicated point-to-point links with good antennas and line-of-sight. +- **Mixed environments:** Stick with **Long Fast** — it's the community default and ensures compatibility with others in your area. + +> ⚠️ **Important:** All nodes on the same channel **must** use the same modem preset. Nodes with mismatched presets cannot communicate even if they share the same frequency and encryption key. + +> 💡 **Tip:** The range estimates above assume flat terrain and modest antennas. Elevation advantage (hilltop, rooftop) dramatically increases effective range. A well-placed Router with Long Fast can often outperform a ground-level node with Long Slow. + +### Конфигуриране на дисплея + +| Настройка | Описание | +| ------------------- | ------------------------------------------------------------------------------------ | +| Screen Timeout | Time before display sleeps | +| Display Units | Metric or Imperial | +| Тип OLED | Auto, SSD1306, SH1106, SH1107 | +| Compass Orientation | Rotation offset for compass display (0°, 90°, 180°, 270°) | +| ~~Compass North~~ | ⚠️ **Deprecated** — replaced by Compass Orientation; still visible in older firmware | + +### Конфигуриране на позицията + +| Настройка | Описание | +| ----------------------------------------- | ---------------------------------- | +| GPS Enabled | Enable/disable GPS | +| Интервал на актуализиране на GPS | How often to acquire GPS fix | +| Position Broadcast (s) | How often to share position | +| Интелигентна позиция | Enable movement-based broadcasting | +| Фиксирана позиция | Use a manually set position | + +### Конфигуриране на захранването + +| Настройка | Описание | +| --------------------------------------- | --------------------------------------- | +| Power Saving | Enable low-power sleep mode | +| Shutdown After (s) | Auto-shutdown idle timer | +| ADC Multiplier | Battery voltage calibration factor | +| Wait Bluetooth (s) | Time to wait for BLE connection at boot | +| Mesh SDS Timeout (s) | Super-deep-sleep timeout | + +### Конфигуриране на мрежата + +| Настройка | Описание | +| ------------- | ---------------------------------------------------- | +| WiFi Enabled | Enable WiFi radio (ESP32 devices) | +| WiFi SSID | Network name to connect to | +| WiFi PSK | Парола за мрежата | +| NTP сървър | Time synchronization server | +| Syslog Server | Remote logging server | + +![IP address field](/assets/screenshots/settings_ipv4_field.png) + +### Конфигуриране на Bluetooth + +| Настройка | Описание | +| ------------------ | ------------------------------------------------------------------------- | +| Bluetooth Enabled | Enable/disable BLE radio | +| Режим на сдвояване | Fixed PIN, Random PIN, or No PIN | +| Фиксиран ПИН | PIN code for pairing (default: 123456) | + +### Конфигуриране на сигурността + +| Настройка | Описание | +| --------------------- | -------------------------------------------------------------------------- | +| Публичен ключ | Your node's public key (read-only) | +| Администраторски ключ | Key for remote administration | +| Частен ключ | Your node's private key (handle securely) | +| Admin Channel Enabled | Allow admin commands via channel | +| Debug Log | Output live debug logging over serial/bluetooth | +| Serial Enabled | Enable serial console access (moved from Device Config) | +| Управляем режим | Restrict non-admin channel changes | + +![Password field](/assets/screenshots/settings_password_field.png) + +Settings use standard preference controls — dropdowns, toggles, and sliders: + +| Control | Екранна снимка | +| -------- | ------------------------------------------------------ | +| Dropdown | ![Dropdown](/assets/screenshots/settings_dropdown.png) | +| Toggle | ![Toggle](/assets/screenshots/settings_switch.png) | +| Slider | ![Slider](/assets/screenshots/settings_slider.png) | + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — optional feature modules and device administration +- [Signal Meter](signal-meter) — how modem presets affect signal quality thresholds +- [LoRa configuration](https://meshtastic.org/docs/configuration/radio/lora) — detailed LoRa settings reference on meshtastic.org +- [Initial configuration](https://meshtastic.org/docs/getting-started/initial-config) — region setup guide on meshtastic.org + +--- + diff --git a/docs/bg-rBG/user/signal-meter.md b/docs/bg-rBG/user/signal-meter.md new file mode 100644 index 000000000..6720c8ba9 --- /dev/null +++ b/docs/bg-rBG/user/signal-meter.md @@ -0,0 +1,81 @@ +--- +title: How the Meshtastic Signal Meter Works +nav_order: 15 +last_updated: 2026-05-13 +description: How the signal meter calculates quality from RSSI and SNR — LoRa spread spectrum, presets, and what the bars really mean. +aliases: + - signal + - signal-meter + - snr + - rssi +--- + +# How the Meshtastic Signal Meter Works + +The Meshtastic signal meter — the familiar bars or status color in the app — is calculated very differently than the "bars" on a traditional cell phone or Wi-Fi router. + +Most consumer devices simply measure how "loud" a signal is. However, because Meshtastic uses **LoRa (Long Range)** technology, its signal meter measures how **clear** the signal is, relative to the specific settings your mesh is using. + +--- + +## 1. The Two Metrics: "Loudness" vs. "Clarity" + +Every time the LoRa radio chip receives a message, it reports two measurements: + +- **RSSI (Received Signal Strength Indicator):** The **loudness** of the raw power hitting your antenna. +- **SNR (Signal-to-Noise Ratio):** The **clarity** of the signal compared to the background static. + +> **Tip — The Analogy:** Imagine you are trying to hear a friend talking to you. +> +> - **RSSI** is how loud their voice is. +> - **The Noise Floor** is the background noise in the room (air conditioning, other people talking, traffic). +> - **SNR** is how easily you can distinguish your friend's voice from the background noise. + +If your friend shouts at you at a deafening rock concert, the signal is incredibly loud (High RSSI), but you still can't understand them because the background noise is louder (Bad SNR). Conversely, if your friend whispers to you in a dead-silent library, the signal is very weak (Low RSSI), but you can understand them perfectly (Great SNR). + +--- + +## 2. The Magic of LoRa: Hearing "Below the Noise Floor" + +For standard radios (like FM or Wi-Fi), if the background noise is louder than the signal (a negative SNR), the receiver just hears static. + +LoRa is special. It uses **"Spread Spectrum"** modulation, which allows the radio to mathematically pull a signal out of the air even when it is buried deep _underneath_ the background noise. This is why you will frequently see **negative SNR numbers** in Meshtastic (e.g., -10 dB, which means the signal is 10 decibels weaker than the background static). + +Depending on which Meshtastic preset you are using (e.g., `LongFast` vs. `ShortFast`), the radio has a specific **SNR Limit** — the absolute maximum amount of noise it can tolerate before the message is completely lost to the static. + +--- + +## 3. How the Signal Meter Calculates Quality + +The Meshtastic apps take both RSSI and SNR and run them through a specific formula to assign your signal a quality rating (None, Bad, Fair, or Good). It specifically scales these values based on the physical limits of the radio preset you are using. + +Here is exactly how the app decides how many bars (or what color) to show you: + +| Level | Bars | Criteria | Meaning | +| ------------- | ---- | ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | +| Добър | 3 | RSSI better than `-115 dBm` **AND** SNR better than `-7 dB` | Signal is both loud and clear — healthy connection. | +| Задоволителен | 2 | RSSI better than `-126 dBm` with good SNR, **OR** SNR better than `-15 dB` with good RSSI | Signal getting quieter or noisier, but still decodable. | +| Лош | 1 | Falls between Fair and None thresholds | At the edge of range or experiencing interference. | +| Няма | 0 | RSSI worse than `-126 dBm` **AND** SNR worse than `-15 dB` | Transmission completely buried in noise. | + +--- + +## 4. What This Means for You + +Because Meshtastic's meter acts as a **"Clarity Meter"**, it behaves differently than what most people expect: + +> **Tip — Don't panic over low RSSI:** You might see a seemingly terrible RSSI value like `-118 dBm`. On a cell phone, you would have zero bars. But if you have an SNR of `+2 dB`, Meshtastic will still show a strong signal! _The library is quiet, so the whisper is heard perfectly._ + +> **Warning — Watch out for local noise:** If you hook up a massive antenna and see a great RSSI (e.g., `-90 dBm`) but your signal meter is only showing **1 Bar (Bad)**, you have a problem. It means you have local interference — perhaps a cheap power supply, a noisy computer, or a nearby radio tower — creating so much static that it is drowning out your mesh. + +## Where Signal Information Appears + +In the app, signal data is shown in several places: + +- **Node list** — signal bars icon next to each node +- **Node detail** — SNR, RSSI, and signal quality in the device metrics section +- **Traceroute** — per-hop signal quality for each relay node +- **Signal metrics** — historical SNR and RSSI data in the metrics charts + +![Node entry showing SNR, RSSI values and colored signal bars](/assets/screenshots/nodes_signal_info.png) + diff --git a/docs/bg-rBG/user/tak.md b/docs/bg-rBG/user/tak.md new file mode 100644 index 000000000..8076f2a94 --- /dev/null +++ b/docs/bg-rBG/user/tak.md @@ -0,0 +1,126 @@ +--- +title: TAK Integration +nav_order: 10 +last_updated: 2026-05-13 +description: Interoperate with ATAK and WinTAK — CoT position sharing, TAK roles, and plugin setup. +aliases: + - tak + - atak + - team-awareness-kit +--- + +# TAK Integration + +Meshtastic integrates with the Team Awareness Kit (TAK) ecosystem, enabling interoperability between Meshtastic mesh devices and TAK applications like ATAK and WinTAK. + +## Преглед + +The TAK module allows Meshtastic nodes to: + +- Share position data in TAK-compatible CoT (Cursor on Target) format +- Appear as team members on TAK map displays +- Receive TAK PLI (Position Location Information) messages + +## Setup + +### Prerequisites + +- ATAK (Android Team Awareness Kit) or WinTAK installed +- Meshtastic ATAK Plugin installed +- TAK module enabled on your Meshtastic radio + +### Конфигурация + +1. Navigate to **Settings → Module Config → TAK**. +2. Enable the TAK module. +3. Configure the TAK team/group settings: + +![Module toggle switch](/assets/screenshots/settings_switch.png) + +| Настройка | Описание | +| --------- | -------------------------- | +| Активиран | Activate TAK interop | +| Режим | TAK-compatible output mode | + +### ATAK Plugin Setup + +1. Install the Meshtastic ATAK Plugin from the plugin repository. +2. Open ATAK and enable the Meshtastic plugin. +3. The plugin bridges messages between ATAK and your mesh network. + +## TAK Roles + +Nodes configured with TAK-related roles behave differently from standard clients: + +| Роля | Описание | +| --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **TAK** | Full TAK interoperability — sends and receives CoT data, chat messages, and PLI updates. Functions as a standard client plus TAK bridge. | +| **TAK Tracker** | Position-only TAK output — automatically broadcasts PLI at regular intervals without user interaction. Optimized for unattended position beacons (vehicles, equipment, waypoints). Does not relay chat messages. | + +> 💡 **Tip:** Use **TAK Tracker** for devices that only need to report position (e.g., a radio mounted in a vehicle). Use **TAK** for devices where users actively participate in TAK operations. + +### CoT (Cursor on Target) Format + +TAK messages use the Cursor on Target XML format — a military standard for sharing situational awareness data. Meshtastic converts its internal protobuf messages to CoT format when bridging to TAK systems, so no manual format conversion is needed. + +## TAK Identity + +When using TAK roles, your node broadcasts identity information that appears on TAK maps: + +| Настройка | Описание | +| --------- | ---------------------------------------------------------------------------------------------------------------- | +| Team | Your team color on the TAK map (e.g., Blue, Red, Cyan, Green) | +| Роля | Your operational role (Team Member, Team Lead, HQ, Medic, RTO, etc.) | +| Callsign | Your TAK callsign (defaults to your Meshtastic long name) | + +These settings appear in **Settings → Module Config → TAK** when the TAK module is enabled. + +> 💡 **Tip:** Team/role colors are the standard TAK affiliation colors. Coordinate with your TAK team to use consistent team assignments. + +## Wire Format (V1 / V2) + +Meshtastic supports two TAK wire formats: + +| Format | Съвместимост | Характеристики | +| ------------------------------- | --------------------------------------------------------------- | --------------------------------------------------------- | +| V1 (Legacy) | ATAK Plugin v1.x, older firmware | Basic CoT position sharing only | +| V2 (Current) | ATAK Plugin v2.x, firmware 2.3+ | Full CoT support including chat, routes, zstd compression | + +The app automatically selects V2 when both sides support it. No manual configuration needed — the TAK module negotiates format based on firmware capabilities. + +## Usage with ATAK + +Once configured: + +- Meshtastic nodes appear as markers on the ATAK map with callsign labels +- Chat messages can bridge between mesh and TAK networks +- Position updates flow bidirectionally between Meshtastic and TAK +- TAK Tracker nodes broadcast PLI automatically — their positions appear on ATAK maps without any ATAK-side configuration + +> ⚠️ **Note:** TAK integration requires specific node roles and module configuration. Standard client nodes don't automatically participate in TAK operations. + +## Отстраняване на неизправности + +| Problem | Cause | Solution | +| -------------------------------- | ------------------------------------- | ----------------------------------------------------------------------- | +| Node doesn't appear on ATAK map | TAK module disabled or wrong role | Verify TAK module is enabled and node role is TAK or TAK Tracker | +| Position updates are stale | GPS fix lost or interval too long | Check GPS status; reduce position broadcast interval in Position Config | +| ATAK plugin shows "disconnected" | BLE connection lost or plugin crashed | Reconnect Bluetooth in Meshtastic app, then restart ATAK plugin | +| Chat messages not bridging | V1 format doesn't support chat | Ensure both nodes run firmware 2.3+ for V2 wire format | +| CoT data not flowing | Channel mismatch | All TAK nodes must be on the same channel with matching encryption | + +## Security Considerations + +- TAK data shares your position and callsign information +- Ensure your channel encryption is configured when using TAK in sensitive environments +- The TAK module respects the same channel encryption as other Meshtastic messages + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — TAK module configuration +- [Nodes](nodes) — TAK and TAK Tracker roles in the node list +- [Map & Waypoints](map-and-waypoints) — node positions on the map +- [ATAK plugin guide](https://meshtastic.org/docs/software/integrations/atak-plugin) — detailed ATAK setup on meshtastic.org + +--- + diff --git a/docs/bg-rBG/user/telemetry-and-sensors.md b/docs/bg-rBG/user/telemetry-and-sensors.md new file mode 100644 index 000000000..efeb54094 --- /dev/null +++ b/docs/bg-rBG/user/telemetry-and-sensors.md @@ -0,0 +1,118 @@ +--- +title: Telemetry & Sensors +nav_order: 9 +last_updated: 2026-05-13 +description: Sensor data on the mesh — supported environment, air quality, and power sensors, plus configuration and viewing guides. +aliases: + - sensors + - environment + - weather + - power-metrics +--- + +# Telemetry & Sensors + +Meshtastic nodes can collect and share sensor data across the mesh network. + +## Преглед + +Telemetry allows nodes equipped with sensors to broadcast environmental, power, and device health information. This data is visible on the node detail screen and can be logged over time. + +## Device Telemetry + +All Meshtastic nodes report basic device telemetry: + +| Метрични | Описание | Typical Range | +| -------------------- | ------------------------------ | ------------------------------------------------------------------ | +| Battery Level | Charge percentage | 0–100% | +| Напрежение | Battery voltage | 3.0–4.2V (LiPo) | +| Използване на канала | % of airtime used locally | 0–100% | +| Air Utilization TX | % of airtime used by this node | 0–100% | +| Време на работа | Seconds since last boot | Varies | + +## Environment Sensors + +Supported environmental sensors: + +### Temperature & Humidity + +| Сензор | Температура | Влажност | Налягане | Бележки | +| ------- | ----------- | -------- | -------- | ----------------------- | +| BME280 | ✓ | ✓ | ✓ | Recommended all-in-one | +| BME680 | ✓ | ✓ | ✓ | Adds gas resistance/IAQ | +| SHT31 | ✓ | ✓ | — | High accuracy | +| MCP9808 | ✓ | — | — | Precision temperature | +| LPS22 | — | — | ✓ | Pressure only | + +### Air Quality + +| Сензор | Метрични | Бележки | +| -------- | -------------------------------------------------- | -------------------------- | +| BME680 | Gas Resistance / IAQ | Volatile organic compounds | +| PMSA003I | PM1.0, PM2.5, PM10 | Particulate matter | +| SEN55 | PM, NOx, VOC, Temp, Humidity | Multi-sensor | + +### Light & UV + +| Сензор | Метрични | +| -------- | -------------------------------------- | +| OPT3001 | Ambient light (lux) | +| VEML7700 | Ambient light (lux) | +| LTR390 | UV index | + +## Показатели на мощност + +Nodes with INA-series power sensors can report: + +| Метрични | Описание | +| ----------- | ----------------------------------------- | +| Bus Voltage | Supply rail voltage | +| Текущ | Power consumption (mA) | +| Захранване | Calculated power (mW) | + +Useful for monitoring solar charging or battery health on remote nodes. + +## Configuring Telemetry + +1. Navigate to **Settings → Module Config → Telemetry**. +2. Set reporting intervals: + - **Device Metrics Interval** — how often to broadcast device metrics + - **Environment Metrics Interval** — how often to broadcast sensor data +3. Enable specific sensor types as needed. + +### Recommended Intervals + +| Use Case | Device (s) | Environment (s) | +| ------------------------------------------ | ----------------------------- | ---------------------------------- | +| Urban mesh (many nodes) | 3600 | 3600 | +| Rural mesh (few nodes) | 900 | 900 | +| Weather station | 900 | 300 | +| Battery conservation | 7200 | 7200 | + +> ⚠️ **Note:** Shorter intervals increase airtime usage and battery drain across the mesh. + +## Viewing Telemetry + +1. Navigate to **Nodes** and select a node. +2. Telemetry sections show on the detail screen: + - Device Metrics (always available) + - Environment Metrics (if sensors present) + - Power Metrics (if INA sensor present) +3. Historical graphs show trends over time. + +![Telemetry actions](/assets/screenshots/node-metrics_telemetric_actions.png) + +## Отстраняване на неизправности + +- **No environment data showing?** The remote node needs a physical sensor connected (e.g., BME280 on I2C). Device telemetry (battery, uptime) is always available, but environment metrics require hardware. +- **Stale readings?** Check the reporting interval — very long intervals (7200s+) mean data updates infrequently. Also verify the remote node is still online. +- **Sensor conflict on I2C bus?** Some sensors share I2C addresses. If you have multiple sensors on the same bus, check for address collisions in the radio's serial debug output. + +## Related Topics + +- [Node Metrics](node-metrics) — view telemetry data on the node detail screen +- [Settings — Modules & Admin](settings-module-admin) — telemetry module configuration +- [Units & Locale](units-and-locale) — temperature and pressure display units + +--- + diff --git a/docs/bg-rBG/user/translate.md b/docs/bg-rBG/user/translate.md new file mode 100644 index 000000000..cf662cb49 --- /dev/null +++ b/docs/bg-rBG/user/translate.md @@ -0,0 +1,97 @@ +--- +title: Translate the App +parent: User Guide +nav_order: 17 +last_updated: 2026-05-13 +aliases: + - translate + - crowdin + - localization +--- + +# Translate the App + +Contributing translations helps make Meshtastic accessible to a wider audience. The app uses [Crowdin](https://crowdin.com/) to manage community translations for both the user interface and in-app documentation. + +--- + +## What Gets Translated + +| Resource | Source Location | Бележки | +| ----------------- | ------------------------------------- | ---------------------------------------------------------------------- | +| UI strings | `composeResources/values/strings.xml` | Buttons, labels, messages, and all user-visible text | +| User Guide pages | `docs/user/*.md` | In-app documentation shown in Help & Documentation | +| Fastlane metadata | `fastlane/metadata/android/en-US/` | App Store listing title, description, and changelogs | + +> **Note — Developer Guide pages are English-only.** Code-focused documentation targeting contributors is not translated. + +--- + +## Как да допринесете + +1. **Visit the Crowdin project.** Open the [Meshtastic Android Crowdin project](https://crowdin.com/project/meshtastic-android) and sign in or create a free account. +2. **Choose your language.** Select an existing language or request a new one by opening a [GitHub issue](https://github.com/meshtastic/Meshtastic-Android/issues/new). +3. **Translate strings.** Crowdin shows the English source on the left and your translation on the right. Translate each string and save. +4. **Review context.** Many strings include screenshots or context comments — check these to understand where the text appears in the app. +5. **Submit.** Approved translations are automatically merged into the next release. + +> **Tip — Keep translations short.** UI strings often appear in buttons, chips, or narrow columns. If a translation is significantly longer than the English original, consider abbreviating where the meaning stays clear. + +--- + +## Adding a New Language + +If your language is not yet listed on Crowdin: + +1. Open an issue on [GitHub](https://github.com/meshtastic/Meshtastic-Android/issues/new) requesting the new locale. +2. A maintainer will add the language to Crowdin and configure `crowdin.yml`. +3. Once added, you can begin translating immediately. + +--- + +## How Translations Are Organized + +The Android app uses **Compose Multiplatform resources** for all user-visible strings: + +``` +core/resources/src/commonMain/composeResources/ +├── values/ ← English (default) +│ └── strings.xml +├── values-de/ ← German +│ └── strings.xml +├── values-fr/ ← French +│ └── strings.xml +└── ... +``` + +In-app documentation follows a similar pattern under `docs/`: + +``` +docs/ +├── user/ ← English source (default) +│ ├── onboarding.md +│ └── ... +├── fr/user/ ← French translations +│ ├── onboarding.md +│ └── ... +└── ... +``` + +The app automatically selects the correct locale based on your device's **Language & Region** settings. + +--- + +## Translation Guidelines + +- **Do not translate** technical terms like "LoRa", "MQTT", "BLE", "TAK", "SNR", or "RSSI" — these are universal. +- **Keep placeholders intact.** Strings like `%1$s` or `%d` are filled in at runtime. Do not remove or reorder them unless the grammar of your language requires it. +- **Match tone.** The app uses a friendly, direct voice. Avoid overly formal language. +- **Test if possible.** Switch your device language and open the app to see how translations look in context. + +--- + +## Questions? + +If you have questions about a specific string's context or need help getting started, open a discussion on the [Meshtastic GitHub Discussions](https://github.com/meshtastic/Meshtastic-Android/discussions) page. + +Благодарим ви, че помогнахте за разширяването на обхвата на Meshtastic! diff --git a/docs/bg-rBG/user/units-and-locale.md b/docs/bg-rBG/user/units-and-locale.md new file mode 100644 index 000000000..7747b2106 --- /dev/null +++ b/docs/bg-rBG/user/units-and-locale.md @@ -0,0 +1,118 @@ +--- +title: Units, Measurement & Locale +parent: User Guide +nav_order: 16 +last_updated: 2026-05-12 +--- + +# Units, Measurement & Locale + +The Meshtastic app automatically displays temperatures, distances, speeds, and times in the units your device is configured to use — no settings to change inside the app. + +--- + +## Как работи + +Meshtastic radios always transmit data in **metric units** (meters, °C, km/h, hPa, etc.). When the app receives this data, it uses the `MetricFormatter` utility to convert and display values in whatever unit system your device's locale specifies. + +On Android, your measurement preferences are determined by your system **Language & Region** settings. On Desktop (JVM), the app uses the JVM's default `Locale`. + +> **Tip — You never need to toggle units inside the app.** Change your system measurement preferences and every screen in Meshtastic updates automatically — node details, telemetry charts, weather, altitude, and more. + +--- + +## Температура + +Temperature values from environment sensors are transmitted as **°C** and displayed based on your device's temperature unit preference. + +![Environment metrics with temperature](/assets/screenshots/nodes_environment_metrics.png) + +| Your Setting | You See | +| ------------ | ------- | +| Celsius | 22°C | +| Fahrenheit | 72°F | + +This affects all temperature displays throughout the app: node environment telemetry, soil temperature, dew point, and telemetry chart axes. + +## Distance & Altitude + +Distances between nodes and GPS altitudes are transmitted as **meters** and automatically scaled and converted. + +![Distance info display](/assets/screenshots/nodes_distance_info.png) + +| Your Setting | Small Distance | Large Distance | Надморска височина | +| -------------------------------- | -------------- | ---------------------- | ------------------ | +| Метрични | 350 m | 2.5 km | 1,200 m | +| Imperial (US) | 1,148 ft | 1.6 mi | 3,937 ft | + +The app uses natural scaling — short distances stay in meters or feet, while longer distances switch to kilometres or miles automatically. + +### Where these appear + +- **Node list** — distance and bearing to each node +- **Node detail** — altitude, distance from your position +- **Map** — waypoint distances, traceroute hop distances +- **Compass** — distance to selected node + +## Скорост + +GPS ground speed is displayed in your locale's preferred speed unit. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Метрични | 12 km/h | +| Imperial (US) | 7 mph | + +## Вятър + +Wind speed and gust data from environment sensors are transmitted as **m/s** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Метрични | 5 m/s | +| Imperial (US) | 11 mph | + +Wind readings appear in the **Node Detail** environment section and the **Environment Telemetry** charts. + +## Rainfall + +Rainfall measurements (1-hour and 24-hour totals) are transmitted as **mm** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ---------------------- | +| Метрични | 12 mm | +| Imperial (US) | 0.5 in | + +## Units That Never Change + +Some units are international standards and are displayed the same way regardless of your locale: + +| Measurement | Unit | Why | +| -------------------------------- | ------------------------------ | ------------------------------------- | +| Barometric pressure | hPa | International meteorological standard | +| Heading / bearing | ° (degrees) | Universal navigation convention | +| Радиация | μR/hr | Standard dosimetry unit | +| GPS coordinates | decimal degrees | Universal geographic standard | +| Humidity, battery, soil moisture | % | Universal | + +## Date & Time + +All timestamps throughout the app — last heard, message times, telemetry logs, chart axes — follow your device's date and time preferences. + +| Настройка | What It Controls | Пример | +| ---------------- | ---------------- | ------------------------------------------------ | +| **24-Hour Time** | Clock format | 14:30 vs 2:30 PM | +| **Date Format** | Date ordering | 09/05/2026 vs 05/09/2026 | + +The app also uses **relative time** where it makes sense — for example, "5 min ago" or "2 hours ago" in the node list — which is automatically localised into your device language. + +## Changing Your Measurement System (Android) + +On Android, your measurement system (metric vs imperial) is tied to your region setting: + +1. Open **Android Settings → System → Language & Region** +2. Change your **Region** or **Measurement units** preference +3. Return to Meshtastic — values update immediately + +> **Tip — The app uses `MetricFormatter` from `core:common`.** All measurement formatting is handled by a shared KMP utility that respects your platform's locale. Developers adding new measurement displays should use `MetricFormatter` rather than hard-coding unit conversions. + diff --git a/docs/ca-rES/index.md b/docs/ca-rES/index.md new file mode 100644 index 000000000..aa4d843c5 --- /dev/null +++ b/docs/ca-rES/index.md @@ -0,0 +1,30 @@ +--- +title: Home +layout: default +nav_order: 0 +--- + +# Meshtastic Android App Documentation + +User and developer documentation for the Meshtastic Android, Desktop, and iOS applications powered by KMP (Kotlin Multiplatform). + +Use the sidebar navigation to browse the **User Guide** for app features and the **Developer Guide** for contributing to the project. + +--- + +## Quick Links + +| Guide | Descripció | +| --------------------------------------------------------------------- | -------------------------------------------------------------- | +| [Getting Started](user/onboarding) | Connect your first radio and send a message | +| [Messages & Channels](user/messages-and-channels) | Channel broadcasts, direct messages, reactions, and encryption | +| [Nodes](user/nodes) | Understanding the mesh network node list | +| [Signal Meter](user/signal-meter) | How the LoRa signal quality meter works | +| [Units & Locale](user/units-and-locale) | How temperatures, distances, and times adapt to your region | +| [Desktop App](user/desktop) | Linux, macOS, and Windows desktop usage | +| [Architecture](developer/architecture) | App architecture overview for contributors | +| [Contributing](developer/contributing) | Branch naming, PR workflow, and verification commands | + +--- + +> This documentation is served from the same markdown source that powers the in-app **Help & Documentation** browser. diff --git a/docs/ca-rES/user/connections.md b/docs/ca-rES/user/connections.md new file mode 100644 index 000000000..fd6260a35 --- /dev/null +++ b/docs/ca-rES/user/connections.md @@ -0,0 +1,125 @@ +--- +title: Connections +nav_order: 2 +last_updated: 2026-05-13 +description: Connect your phone or desktop to a Meshtastic radio via Bluetooth, USB, or TCP/IP. +aliases: + - bluetooth + - usb + - tcp + - pairing +--- + +# Connections + +Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node. + +## Bluetooth (BLE) + +Bluetooth Low Energy is the default and most common connection method on Android. + +### Pairing a Device + +1. Ensure your Meshtastic radio is powered on and in pairing mode. +2. Open the app and navigate to **Connections**. +3. Tap **Scan for Devices** — nearby Meshtastic radios will appear. +4. Select your device from the list. +5. Accept the Bluetooth pairing prompt if shown. + +![Device list item](/assets/screenshots/connections_bluetooth_scan.png) + +You can filter devices by transport type using the filter chips at the top: + +![Transport filter chips](/assets/screenshots/connections_transport_filters.png) + +> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. + +### Connection Status + +| Icon | State | Descripció | +| ---- | -------------- | ----------------------------- | +| 🟢 | Connected | Active radio link established | +| 🟡 | Connecting | Handshake in progress | +| 🔴 | Desconnectat | No active connection | +| ⚪ | Not configured | No device selected | + +When connecting, a status indicator shows the current connection state: + +![Connecting status](/assets/screenshots/connections_connecting.png) + +If no devices are found, the app shows an empty state with instructions: + +![No devices found](/assets/screenshots/connections_empty_state.png) + +### Troubleshooting Bluetooth + +- **Device not found:** Toggle Bluetooth off/on, ensure location is enabled. +- **Connection drops:** Move closer to the radio; check for interference. +- **Pairing rejected:** Forget the device in Android Bluetooth settings and retry. + +## USB Serial + +USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable. + +### Setup + +1. Connect your radio via USB cable to your device. +2. The app will prompt for USB permission — tap **Allow**. +3. The connection is established automatically. + +> ⚠️ **Note:** USB connections require OTG support on Android devices. + +## TCP/IP (WiFi) + +Some Meshtastic radios support WiFi connectivity, allowing TCP-based connections. + +### Configuration + +1. Connect your radio to a WiFi network via the radio's web interface or settings. +2. In the app, go to **Connections → TCP**. +3. Enter the radio's IP address and port (default: 4403). +4. Tap **Connect**. + +![WiFi scanning for devices](/assets/screenshots/connections_wifi_scanning.png) + +When a device is found, it appears in the connection list: + +![WiFi device found](/assets/screenshots/connections_wifi_device_found.png) + +A successful connection is confirmed with a status indicator: + +![WiFi connection success](/assets/screenshots/connections_wifi_success.png) + +### When to Use TCP + +- Radio is on the same local network +- Testing with a simulated radio +- Environments where Bluetooth has interference issues + +## Reconnection Behavior + +The app reconnects to the **last selected device** on startup. You can manually switch transports from the connections screen at any time. + +To disconnect from a radio, use the disconnect button on the connections screen: + +![Disconnect from radio](/assets/screenshots/connections_disconnect.png) + +## Desktop Connections + +On Desktop (Linux/macOS/Windows), the app supports: + +- **Bluetooth (BLE)** — via the Kable library; works on macOS, Linux, and Windows +- **USB Serial** — primary wired connection method +- **TCP/IP** — for network-connected radios + +See [Desktop App](desktop) for platform-specific details and keyboard shortcuts. + +## Related Topics + +- [Getting Started](onboarding) — first-launch setup and permissions +- [Settings — Radio & User](settings-radio-user) — Bluetooth and network configuration +- [Desktop App](desktop) — desktop-specific connection details +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — full list of compatible radios on meshtastic.org + +--- + diff --git a/docs/ca-rES/user/desktop.md b/docs/ca-rES/user/desktop.md new file mode 100644 index 000000000..a688679eb --- /dev/null +++ b/docs/ca-rES/user/desktop.md @@ -0,0 +1,147 @@ +--- +title: Desktop App +nav_order: 14 +last_updated: 2026-05-13 +description: Install and use the Meshtastic Desktop app on Linux, macOS, and Windows — connections, feature parity, and keyboard shortcuts. +aliases: + - desktop + - linux + - macos + - windows + - jvm +--- + +# Desktop App + +The Meshtastic Desktop application provides the same mesh communication features on Linux, macOS, and Windows. + +## Overview + +The Desktop app shares its core codebase with the Android app through Kotlin Multiplatform (KMP). Most features work identically across platforms. + +## Installation + +### Linux + +- Download the `.deb` or `.AppImage` package from the releases page +- Or build from source using `./gradlew :desktopApp:run` + +### macOS + +- Download the `.dmg` package from releases +- Or build from source + +### Windows + +- Download the `.msi` installer from releases +- Or build from source + +## Connecting Your Radio + +### USB Serial (Primary) + +The most reliable connection method on Desktop: + +1. Connect your Meshtastic radio via USB cable. +2. The app should detect the serial port automatically. +3. If not detected, select the correct serial port from the connections menu. + +### TCP/IP + +For network-connected radios: + +1. Enter the radio's IP address and port (default: 4403). +2. Click **Connect**. + +### Bluetooth (BLE) + +Bluetooth Low Energy is supported on Desktop via the [Kable](https://github.com/JuulLabs/kable) library: + +1. Ensure your system has a Bluetooth adapter. +2. The app scans for nearby Meshtastic radios automatically. +3. Select your device from the connections screen. + +## Feature Parity + +| Feature | Android | Desktop | Notes | +| ---------------------------------------- | ------- | ------- | -------------------------- | +| Messaging | ✓ | ✓ | Full parity | +| Node List | ✓ | ✓ | Full parity | +| Map | ✓ | ✓ | Full parity | +| Settings | ✓ | ✓ | Full parity | +| Bluetooth (BLE) | ✓ | ✓ | Via Kable on desktop | +| Firmware Update OTA | ✓ | ✗ | Use web flasher | +| Notifications | ✓ | ✓ | Native OS notifications | +| Widgets | ✓ | ✗ | Android-only | +| AI Assistant (Chirpy) | ✓\* | ✗ | Google flavor Android only | + +\*Chirpy AI requires Android 14+ on Google flavor builds with supported hardware. + +## UI Differences + +The Desktop app uses the same Compose Multiplatform UI with adaptations for larger screens and desktop interaction. + +### Keyboard Shortcuts + +| Shortcut | Action | +| ------------------- | --------------------------- | +| **⌘Q** / **Ctrl+Q** | Quit the application | +| **⌘,** / **Ctrl+,** | Open Settings | +| **⌘1** / **Ctrl+1** | Switch to Conversations tab | +| **⌘2** / **Ctrl+2** | Switch to Nodes tab | +| **⌘3** / **Ctrl+3** | Switch to Map tab | +| **⌘4** / **Ctrl+4** | Switch to Connections tab | + +### Window & System Tray + +- **Window resizing** — responsive layout adapts to window dimensions +- **System tray** — minimize to system tray for background mesh operation +- **Tray menu** — right-click the tray icon to show window or quit +- **Mouse interaction** — hover states and standard desktop navigation + +### Notification Preferences + +The Desktop app provides in-app toggles for controlling which notifications are shown — messages, new nodes, and low battery alerts. Access these from **Settings → Notifications** within the app. + +## Built-in Documentation Browser + +The Desktop app includes a built-in documentation browser for quick access to help content without leaving the application. + +![Docs browser with table of contents](/assets/screenshots/docs-browser_toc.png) + +The browser supports full-text search across all documentation: + +![Searching the docs browser](/assets/screenshots/docs-browser_search.png) + +Individual doc pages render with full formatting: + +![A documentation page](/assets/screenshots/docs-browser_page.png) + +## Building from Source + +```bash +git clone https://github.com/meshtastic/Meshtastic-Android.git +cd Meshtastic-Android +git submodule update --init +./gradlew :desktopApp:run +``` + +Requirements: + +- JDK 21 +- No Android SDK required for desktop-only builds + +## Known Limitations + +- No OTA firmware updates (use web flasher) +- Some Android-specific features (widgets, specific notification channels) are unavailable +- Performance may vary on low-spec hardware running Compose Desktop +- BLE bonding is not yet supported on desktop (pairing works without bonding) + +## Related Topics + +- [Connections](connections) — connection methods overview +- [Firmware Updates](firmware) — use the [Web Flasher](https://flasher.meshtastic.org) for desktop firmware updates + +--- + diff --git a/docs/ca-rES/user/discovery.md b/docs/ca-rES/user/discovery.md new file mode 100644 index 000000000..9cf088539 --- /dev/null +++ b/docs/ca-rES/user/discovery.md @@ -0,0 +1,114 @@ +--- +title: Discovery +nav_order: 12 +last_updated: 2026-05-13 +description: Explore your mesh network — traceroute paths, neighbor maps, and node discovery tools. +aliases: + - mesh-discovery + - local-discovery + - network-scan + - traceroute + - neighbor-info +--- + +# Discovery + +Discovery tools help you understand **how** your mesh network is connected — which nodes can hear each other, what paths messages take, and where bottlenecks or weak links exist. + +> 💡 **Tip:** You don't need a dedicated "discovery mode" to start exploring your mesh. The tools below are available right now from the node list and node detail screens. + +--- + +## Traçar ruta + +Traceroute reveals the exact path a message takes from your node to any other node on the mesh. It's the single most useful tool for debugging connectivity problems. + +### Running a Traceroute + +1. Navigate to **Nodes** and tap the node you want to trace. +2. On the node detail screen, tap **Traceroute**. +3. The app sends a traceroute request and waits for the response. +4. Results display each hop in order, with signal quality at every step. + +### Reading the Results + +A traceroute result looks like this: + +``` +You → Node A (SNR: 8.5, RSSI: -95) → Node B (SNR: 5.2, RSSI: -108) → Target +``` + +Each hop represents a relay node that forwarded the message. The SNR and RSSI values at each hop tell you about the link quality on that specific segment. + +| What to look for | What it means | +| -------------------------------------------------------------------------- | --------------------------------------------------------------------------- | +| All hops show Good SNR (> 5 dB) | Healthy path — messages flow reliably | +| One hop shows Bad SNR (< 0 dB) | Weak link — this relay segment is fragile | +| Many hops (4+) | Long path — consider repositioning a node to shorten it | +| Different path on retry | Mesh is adapting — multiple routes exist (this is good!) | + +> 💡 **Tip:** Run traceroute several times over a few minutes. If the path changes, your mesh has redundant routes — a sign of a well-connected network. + +### Troubleshooting with Traceroute + +- **"No route found"** — The target node may be offline, out of range, or on a different channel. Check that both nodes share at least one channel with the same encryption key. +- **Traceroute times out** — The path may be too long (exceeds hop limit) or a relay node is congested. Try increasing the hop limit in **Settings → LoRa Config**. +- **Asymmetric paths** — A traceroute from A→B may take a different path than B→A. This is normal — radio propagation is not always symmetric. + +--- + +## Neighbor Info + +The Neighbor Info module lets each node broadcast a list of the nodes it can **directly hear** (single-hop). When multiple nodes share their neighbor lists, you can piece together a topology map of the entire mesh. + +### Enabling Neighbor Info + +1. Navigate to **Settings → Module Config → Neighbor Info**. +2. Enable the module. +3. Set the broadcast interval (default: 900 seconds / 15 minutes). + +Once enabled, your node periodically broadcasts its neighbor table. Other nodes with Neighbor Info enabled do the same. + +### Viewing Neighbor Data + +- Open any node's detail screen and look for the **Neighbors** section. +- Each neighbor entry shows the node that was directly heard and its signal quality. +- Combine neighbor data from multiple nodes to understand the full mesh topology. + +> ⚠️ **Note:** Neighbor Info increases airtime usage because every enabled node periodically broadcasts its neighbor list. On busy meshes with many nodes, consider longer broadcast intervals (3600 seconds or more) to avoid congestion. + +--- + +## Node List as a Discovery Tool + +The node list itself is a powerful discovery tool when you use its filtering and sorting features effectively. + +### Finding New Nodes + +- Sort by **Last heard** to see the most recently active nodes at the top. +- Enable **Include unknown** to see nodes that have appeared on the mesh but haven't sent user info yet — these are often newly powered-on devices. + +### Assessing Connectivity + +- Sort by **Hops away** to see which nodes are directly reachable (0 hops) versus relayed. +- Sort by **Distance** to find nearby nodes and verify they're reachable. +- Use **Exclude MQTT** to focus on nodes reachable over radio (not via internet bridge). + +### Infrastructure Audit + +- Disable **Exclude infrastructure** to see Router, Repeater, Router Late, and Client Base nodes. +- Check their signal quality and last-heard times to verify your infrastructure nodes are healthy. + +See [Nodes](nodes) for full details on filtering and sorting options. + +--- + +## Tips for Mesh Exploration + +- **Start with traceroute** — it gives you immediate, actionable information about a specific path. +- **Enable Neighbor Info on key nodes** — especially routers and repeaters, to build a picture of the backbone. +- **Check the map** — node positions on the [Map](map-and-waypoints) combined with signal data help you understand why some links are strong and others are weak. +- **Compare signal over time** — use the [Signal Meter](signal-meter) guide to interpret SNR and RSSI values correctly. + +--- + diff --git a/docs/ca-rES/user/firmware.md b/docs/ca-rES/user/firmware.md new file mode 100644 index 000000000..9e33992de --- /dev/null +++ b/docs/ca-rES/user/firmware.md @@ -0,0 +1,114 @@ +--- +title: Firmware Updates +nav_order: 13 +last_updated: 2026-05-13 +description: Update your radio firmware over Bluetooth — OTA process, version channels, pre-flight checks, and recovery. +aliases: + - firmware + - update + - ota + - flash +--- + +# Firmware Updates + +Keep your Meshtastic radio up to date with the latest firmware for new features, bug fixes, and security improvements. + +## Checking for Updates + +1. Navigate to **Settings → Firmware Update** or tap the firmware notification if shown. +2. The app checks for available firmware versions. +3. Available updates show the version number and changelog summary. + +## Update Methods + +### OTA (Over-The-Air) via Bluetooth + +The most common update method for Android users: + +1. Ensure your radio is connected via Bluetooth. +2. Navigate to the Firmware Update screen. +3. Select the desired firmware version. +4. Tap **Update** to begin the OTA process. +5. Wait for the update to complete — **do not disconnect** during the update. + +![Firmware checking for updates](/assets/screenshots/firmware_checking.png) + +> ⚠️ **Warning:** Interrupting a firmware update can brick your device. Ensure your radio has sufficient battery (>50% recommended) and maintain Bluetooth proximity during the entire process. + +![Firmware disclaimer](/assets/screenshots/firmware_disclaimer.png) + +### USB Flashing + +For recovery or when OTA is unavailable: + +- Use the [Meshtastic Web Flasher](https://flasher.meshtastic.org) +- Or the [Meshtastic CLI tool](https://meshtastic.org/docs/getting-started/flashing-firmware) on desktop + +## Version Channels + +| Canal | Descripció | +| ------ | ------------------------------------------- | +| Stable | Recommended for most users; tested releases | +| Alpha | Preview releases; may contain bugs | + +## Pre-Update Checklist + +Before updating: + +- [ ] Battery > 50% +- [ ] Stable Bluetooth connection +- [ ] Note your current settings (they may reset on major version changes) +- [ ] Check the release notes for breaking changes + +## Post-Update + +After a successful update: + +- The radio will reboot automatically +- Bluetooth connection will re-establish +- Verify your settings are intact +- Check the firmware version in **Settings → About** + +![Firmware update success](/assets/screenshots/firmware_success.png) + +## Troubleshooting + +### Update Stuck + +If the update appears frozen: + +- Wait at least 5 minutes before intervening +- If truly stuck, power-cycle the radio +- Attempt the update again + +![Firmware update error](/assets/screenshots/firmware_error.png) + +### Device Won't Boot After Update + +If your device fails to boot: + +1. Try connecting via USB to a computer +2. Use the web flasher in recovery/DFU mode +3. Flash a known-good firmware version +4. Check the Meshtastic Discord for device-specific recovery steps + +### Compatibility Warnings + +The app may show warnings when: + +- Connected radio firmware is below minimum supported version +- Major version mismatch between app and firmware +- Deprecated features need migration + +> ⚠️ **Important:** Always update the Meshtastic app before or alongside firmware updates to ensure compatibility. + +## Related Topics + +- [Connections](connections) — reconnecting after a firmware update +- [Flashing firmware guide](https://meshtastic.org/docs/getting-started/flashing-firmware) — full firmware flashing walkthrough on meshtastic.org +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — check firmware compatibility by device +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/ca-rES/user/map-and-waypoints.md b/docs/ca-rES/user/map-and-waypoints.md new file mode 100644 index 000000000..e623a6210 --- /dev/null +++ b/docs/ca-rES/user/map-and-waypoints.md @@ -0,0 +1,116 @@ +--- +title: Map & Waypoints +nav_order: 6 +last_updated: 2026-05-13 +description: View node positions on the map, create and share waypoints, and manage position sharing and privacy. +aliases: + - map + - waypoints + - gps + - location +--- + +# Map & Waypoints + +The Map screen shows the geographic positions of nodes on your mesh, along with shared waypoints. + +## Map View + +The map displays: + +- **Node positions** — colored markers for each node reporting location +- **Waypoints** — shared points of interest +- **Your position** — your current GPS location + +### Node Markers + +Node markers on the map indicate: + +| Color | Meaning | +| ------ | ---------------------------------------------- | +| Green | Online (heard recently) | +| Yellow | Away (heard within 2 hours) | +| Gray | Offline (stale position) | +| Blue | Your own node | + +### Map Controls + +- **Zoom** — pinch or use +/- buttons +- **Pan** — drag to explore +- **Center** — select the location button to center on your position +- **Node tap** — tap a node marker to view details + +The floating toolbar provides quick access to compass, layer switching, node filters, refresh, and location tracking. Tap the compass to reorient north-up, or tap the location button to center on your current position. + +![Map controls overlay](/assets/screenshots/map_controls_overlay.png) + +## Waypoints + +Waypoints are shared geographic points of interest that all mesh members can see. + +### Creating a Waypoint + +1. Long-press on the map at the desired location. +2. Enter a name and optional description. +3. Choose an icon/emoji for the waypoint. +4. Tap **Send** to share with the mesh. + +### Waypoint Properties + +| Property | Descripció | +| ---------- | ------------------------------------------------------- | +| Nom | Short identifier (max 30 characters) | +| Descripció | Optional longer description | +| Icon | Visual marker emoji on the map | +| Bloquejat | If locked, only the creator can edit or delete | +| Expiration | Optional auto-remove time | + +### Waypoint Expiration + +Waypoints can be set to expire automatically: + +- **Never** (default) — waypoint remains until manually deleted +- **Timed** — waypoint is automatically removed after the specified duration (e.g., "remove after 2 hours"). Useful for temporary markers like rally points, hazards, or meeting locations. + +Expired waypoints are automatically hidden from the map so they don't clutter the display. The expiration countdown begins when the waypoint is created, not when other nodes receive it. + +### Managing Waypoints + +- Tap a waypoint on the map to view its details and coordinates +- Edit or delete waypoints you created +- **Locked waypoints** cannot be modified or deleted by other nodes — only the original creator can change them +- Unlocked waypoints can be edited by any mesh member + +## Position Sharing + +### Enabling Position Sharing + +Your node shares its GPS position based on: + +- **Fixed interval** — broadcast position at regular intervals +- **Smart position** — broadcast when movement exceeds a threshold +- **Manual** — only share when explicitly requested + +Configure position behavior in **Settings → Position**. + +### Privacy Considerations + +> 🔒 **Privacy:** Position data is broadcast to all nodes on your channel. If you don't want your location shared, disable GPS position in settings or use a fixed/fake position. + +## Map Sources + +The app supports multiple map tile sources: + +- OpenStreetMap (default) +- Satellite imagery (where available) +- Offline tiles (download map areas for offline use) + +## Related Topics + +- [Nodes](nodes) — view and filter your node list +- [Node Metrics](node-metrics) — signal quality and position history for individual nodes +- [Discovery](discovery) — traceroute and neighbor info for understanding mesh topology +- [Units & Locale](units-and-locale) — distance and coordinate display formats + +--- + diff --git a/docs/ca-rES/user/messages-and-channels.md b/docs/ca-rES/user/messages-and-channels.md new file mode 100644 index 000000000..61d4ac58e --- /dev/null +++ b/docs/ca-rES/user/messages-and-channels.md @@ -0,0 +1,159 @@ +--- +title: Messages & Channels +nav_order: 3 +last_updated: 2026-05-13 +description: Send and receive messages, manage channels, configure encryption, and use quick chat, reactions, and message actions. +aliases: + - channels + - direct-messages + - messaging + - conversations +--- + +# Messages & Channels + +Meshtastic supports two communication modes: **channel broadcasts** and **direct messages**. + +## Channels + +Channels are shared communication groups. All nodes configured with the same channel key can read and send messages on that channel. + +### Default Channel + +Every Meshtastic device comes with a default **LongFast** channel. This is an unencrypted channel used for general mesh communication. + +### Channel Security + +Channels support multiple encryption levels: + +| Icon | Security Level | Descripció | +| ---- | ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------- | +| 🔒 | PSK (256-bit AES) | Fully encrypted with a strong pre-shared key. Only nodes with the matching key can read messages. | +| 🔐 | PSK (128-bit AES) | Encrypted with a shorter key. Secure for most uses but 256-bit is preferred for sensitive data. | +| 🔓 | Default / Open | Uses the well-known default key. **Any Meshtastic device** on the same preset can read these messages. | +| ⚠️ | Insecure + Position | Open channel that also broadcasts your GPS position. Use with caution in public meshes. | + +> 🔒 **Security Tip:** 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. + +### Adding a Channel + +1. Navigate to **Settings → Channels**. +2. Tap **Add Channel** or scan a QR code. +3. Configure the channel name and encryption key. +4. Share the channel URL/QR code with others who need access. + +Tapping a channel shows its details and sharing options. + +## Direct Messages + +Direct messages (DMs) are point-to-point encrypted communications between two specific nodes. + +### Sending a Direct Message + +1. Open the **Messages** tab. +2. Select a node from your contacts list or tap a node in the node list. +3. Type your message and tap **Send**. + +### Message States + +| State | Icon | Meaning | +| --------------------------------- | ---- | ----------------------------------------------------------------------------------------------------------------- | +| Queued | ⏳ | Message waiting to be sent | +| En route | ✓ | Delivered to the radio, awaiting acknowledgment | +| Delivered | ✓✓ | Acknowledgment received from recipient | +| Received | ✓ | Message received from the mesh (incoming) | +| S&F Routing | 🔗 | Store & Forward: message being routed through an S&F node | +| S&F Confirmed | 🔗 | Store & Forward: delivery confirmed via S&F node | +| Error | ✗ | Delivery failed after retries | + +### Delivery Errors + +When a message fails to deliver, the error indicator shows what went wrong: + +| Error | Meaning | What to Do | +| ------------------------------------ | ---------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| No Route | No path exists to the destination node | The recipient may be offline or out of mesh range. Try later or move closer. | +| Got NAK | The next-hop node refused to relay | The relay node may be congested. Wait and retry. | +| Temps esgotat | No acknowledgment within retry window | The recipient may be just out of range. Try increasing hop limit or moving to a better position. | +| Sense Interfície | No radio interface available to send | Check that your radio is connected and the channel is configured. | +| Max Retransmit | All retry attempts exhausted | The mesh path is unreliable. Try a different channel or wait for conditions to improve. | +| Sense canal | The destination channel doesn't exist | Verify both nodes share the same channel configuration. | +| Too Large | Message exceeds maximum payload size | Shorten your message (max ~230 characters). | +| No Response | Node received message but didn't respond | The recipient's radio may be busy or in low-power sleep mode. | +| Duty Cycle Limit | Regional airtime limit reached | Your radio has used its allowed transmit time. Wait for the duty cycle window to reset (typically 1 hour in EU regions). | +| Sol·licitud errònia. | Malformed or invalid message | This usually indicates a software bug. Try restarting the app. | + +> 💡 **Tip:** 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. + +## Message Features + +### Quick Chat + +Pre-configured messages for rapid communication: + +- Access via the Quick Chat button in the message input area +- Choose from built-in phrases or custom messages +- Customize quick chat messages in **Settings → Quick Chat** +- Useful when typing is impractical (gloves, small screen, urgent) + +![Quick chat option](/assets/screenshots/messages_quick_chat.png) + +The channel list shows each channel with its latest message preview. + +### Message Bubbles + +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. + +### Reactions + +React to messages with emoji: + +- **Long-press** a message to open the actions menu +- Tap **Add Reaction** to choose an emoji +- Reactions appear below the message bubble +- Multiple users can react to the same message +- React to your own messages or others' messages + +![Emoji reaction badges displayed beneath a message](/assets/screenshots/messages_reaction.png) + +> 💡 **Tip:** Reactions are lightweight — they use minimal mesh bandwidth compared to full text messages. + +### Message Actions + +Long-press any message to access: + +- **Copy** — copy message text to clipboard +- **Reply** — quote the message in your response +- **React** — add an emoji reaction +- **Delete** — remove a message you sent (local deletion) + +### Message Priority + +Messages are queued and transmitted based on priority: + +1. Emergency/alert messages (highest) +2. Direct messages +3. Channel broadcasts (lowest) + +### Message Limits + +- **Maximum length:** 237 bytes (approximately 230 characters for ASCII text) +- **Rate limiting:** The mesh enforces airtime fairness; heavy message volume may be throttled +- **Delivery:** Messages are retried automatically if no acknowledgment is received + +## Best Practices + +- Use channels for group coordination +- Use direct messages for private person-to-person communication +- Keep messages short — mesh bandwidth is limited +- Configure encryption for sensitive communications + +## Related Topics + +- [Nodes](nodes) — tap a node to start a direct message +- [Settings — Radio & User](settings-radio-user) — configure channel encryption and presets +- [MQTT](mqtt) — bridge channel messages to the internet +- [Channel configuration](https://meshtastic.org/docs/configuration/radio/channels) — detailed channel settings on meshtastic.org + +--- + diff --git a/docs/ca-rES/user/mqtt.md b/docs/ca-rES/user/mqtt.md new file mode 100644 index 000000000..9052faf7e --- /dev/null +++ b/docs/ca-rES/user/mqtt.md @@ -0,0 +1,137 @@ +--- +title: MQTT +nav_order: 11 +last_updated: 2026-05-13 +description: Bridge your mesh to the internet — MQTT broker setup, encryption layers, and map reporting. +aliases: + - mqtt + - internet-bridge + - broker +--- + +# MQTT + +MQTT bridges your Meshtastic mesh network to the internet, enabling long-range communication beyond radio range. + +## Overview + +The MQTT module connects your node to an MQTT broker, allowing: + +- Messages to reach nodes on different physical meshes via the internet +- Integration with home automation and monitoring systems +- Publishing node positions to the public Meshtastic map +- Custom data pipelines for logging and alerting + +## How It Works + +``` +[Your Node] → Radio → [Gateway Node with WiFi] → MQTT Broker → [Remote Gateway] → Radio → [Remote Node] +``` + +A gateway node with internet access (WiFi or Ethernet) publishes mesh messages to an MQTT topic. Remote gateways subscribed to the same topic inject those messages into their local mesh. + +## Configuration + +### Enabling MQTT + +1. Navigate to **Settings → Module Config → MQTT**. +2. Enable the MQTT module. +3. Configure the broker connection: + +![MQTT toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | Descripció | Default | +| --------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------- | +| Server Address | MQTT broker hostname | mqtt.meshtastic.org | +| Username | Broker authentication | meshdev | +| Password | Broker authentication | large4cats | +| Root Topic | Base topic for messages | msh | +| Encryption | Encrypt MQTT payload | Enabled | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON packet support has been removed from firmware; this field is ignored | Disabled | +| TLS | Secure connection to broker | Disabled | +| Map Reporting | Report position to public map | Disabled | + +### Default Meshtastic Broker + +The community maintains a public broker at `mqtt.meshtastic.org`. This is intended for general use and testing. + +> 🔒 **Privacy:** Messages on the public broker are readable by anyone subscribed. Always use channel encryption for private communications. + +### Private Broker + +For better privacy and control, you can run your own MQTT broker: + +- Mosquitto (lightweight, open-source) +- HiveMQ +- EMQX + +Configure your node to point to your private broker with appropriate credentials. + +## Map Reporting + +When Map Reporting is enabled, your node publishes its position to the Meshtastic community map: + +- Visible at [meshmap.net](https://meshmap.net) and similar community map services +- Only position and node info are shared +- Disable this if you don't want your location publicly visible + +## Uplink vs Downlink + +| Direction | Descripció | +| ------------ | -------------------------------- | +| **Uplink** | Messages from mesh → MQTT broker | +| **Downlink** | Messages from MQTT broker → mesh | + +Configure per-channel which directions are active to control message flow and airtime usage. + +## Message Formats + +MQTT uses protobuf message format: + +| Format | Descripció | Use case | +| ------------ | ----------------------------------- | -------------------------- | +| **Protobuf** | Binary Meshtastic protobuf encoding | Node-to-node mesh bridging | + +> ⚠️ **Note:** JSON output support was removed from firmware. The `json_enabled` setting is still visible in the app for legacy compatibility but has no effect on current firmware versions. + +## Encryption & Privacy + +Understanding the layered encryption model: + +1. **Channel encryption** happens on the mesh _before_ MQTT. If your channel has a PSK, the MQTT payload is already encrypted — the broker and any subscribers see only the ciphertext. +2. **MQTT encryption** (the module setting) adds an additional encryption layer for transit to the broker. This protects metadata and routing information. +3. **TLS** encrypts the TCP connection to the broker itself, preventing network-level eavesdropping. + +> 🔒 **Important:** The default public channel has a well-known key. Messages on the default channel sent via MQTT are effectively **unencrypted** — anyone can decode them. Always use a custom PSK for private communications. + +## Best Practices + +- Use channel-level encryption (PSK) on channels that bridge to MQTT +- Don't enable MQTT on nodes without internet access (it will buffer and waste memory) +- Use a private broker for sensitive deployments +- Be mindful of airtime when downlinking messages from busy MQTT topics — every downlinked message consumes radio airtime on your local mesh +- Consider enabling uplink-only if you only need to monitor your mesh remotely without injecting messages back + +## Troubleshooting + +### MQTT Not Connecting + +- **Check WiFi** — the gateway node must have an active internet connection (WiFi or Ethernet). MQTT does not work over the LoRa radio link itself. +- **Verify credentials** — incorrect username or password will silently fail on most brokers. Double-check for trailing spaces. +- **Firewall** — port 1883 (MQTT) or 8883 (MQTT+TLS) must be open. Some networks block non-standard ports. +- **DNS resolution** — if using a custom broker hostname, verify the node can resolve it. Try the broker's IP address directly. + +### Messages Not Bridging + +- **Check uplink/downlink settings** — if only uplink is enabled, messages flow from mesh to MQTT but not back. Enable downlink on the receiving gateway. +- **Channel mismatch** — both gateways must share the same channel with the same PSK. A mismatch means messages are encrypted with different keys and appear as garbage. +- **Topic mismatch** — ensure both gateways use the same root topic. The default `msh` works for the public broker. + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — MQTT module configuration reference +- [Messages & Channels](messages-and-channels) — channel encryption and PSK setup +- [MQTT integration guide](https://meshtastic.org/docs/software/integrations/mqtt) — detailed MQTT documentation on meshtastic.org + +--- + diff --git a/docs/ca-rES/user/node-metrics.md b/docs/ca-rES/user/node-metrics.md new file mode 100644 index 000000000..4ee4fcbe7 --- /dev/null +++ b/docs/ca-rES/user/node-metrics.md @@ -0,0 +1,130 @@ +--- +title: Node Metrics +nav_order: 5 +last_updated: 2026-05-13 +description: Telemetry dashboards for each mesh node — device health, environment sensors, signal quality, power, traceroute, and position history. +aliases: + - metrics + - telemetry + - device-metrics + - signal +--- + +# Node Metrics + +The node detail screen provides comprehensive telemetry and metrics for each node on your mesh. + +## Device Metrics + +Basic operating information reported by each node: + +| Metric | Descripció | +| ------------------- | ----------------------------------- | +| Battery Level | Current battery percentage | +| Voltage | Battery voltage reading | +| Channel Utilization | Percentage of airtime consumed | +| Airtime | Transmission time used by this node | +| Uptime | Time since last reboot | + +Device metrics are displayed as individual cards with trend sparklines showing battery level, voltage, channel utilization, airtime, and uptime over time. + +> 💡 **Tip:** Tap any metric card to expand it into a full chart with historical data points. Pinch to zoom the time axis. + +## Environment Metrics + +Environmental sensor data (requires compatible hardware): + +| Metric | Sensor Examples | +| ------------------------------------ | --------------------- | +| Temperature | BME280, BME680, SHT31 | +| Humidity | BME280, BME680, SHT31 | +| Barometric Pressure | BME280, BMP280 | +| Gas Resistance | BME680 | +| IAQ (Air Quality) | BME680 | + +Environment metrics are charted over time for easy trend analysis — temperature, humidity, and pressure each get their own line chart with the measurement unit displayed on the Y axis. + +> 💡 **Tip:** Environment metrics require a sensor connected to the remote node. Not all nodes report environmental data. See [Telemetry & Sensors](telemetry-and-sensors) for a full list of supported sensors. + +## Signal Metrics + +Radio signal quality information: + +| Metric | Descripció | +| --------- | ----------------------------------------------------------------------------- | +| SNR | Signal-to-Noise Ratio (higher is better) | +| RSSI | Received Signal Strength Indicator (closer to 0 is better) | +| Hop Count | Number of mesh hops for last message | + +### Signal Quality Reference + +| SNR Range | Quality | +| --------------------------------- | --------- | +| > 10 dB | Excellent | +| 0 to 10 dB | Good | +| -10 to 0 dB | Fair | +| < -10 dB | Poor | + +## Power Metrics + +Power management telemetry (requires INA sensor or compatible hardware): + +| Metric | Descripció | +| ----------- | ----------------------- | +| Bus Voltage | Supply voltage | +| Current | Power draw in milliamps | +| Power | Calculated wattage | + +## Traçar ruta + +Traceroute shows the path a message takes through the mesh: + +1. From the node detail screen, tap **Traceroute**. +2. The app sends a traceroute request to the target node. +3. Results show each hop with SNR/RSSI values. + +### Reading Traceroute Results + +``` +You → Node A (SNR: 8.5) → Node B (SNR: 5.2) → Target +``` + +Each hop represents a relay node that forwarded the message. + +## Position Log + +Historical position data for nodes that share their location: + +- GPS coordinates +- Altitude +- Speed (if moving) +- Timestamp for each position report + +## Neighbor Info + +Shows which nodes a given node can directly hear, useful for understanding mesh topology. + +## Viewing Metrics + +1. Navigate to **Nodes**. +2. Tap the node you want to inspect. +3. Select the metric category from the detail tabs. + +![Node detail — local device](/assets/screenshots/nodes_detail_local.png) + +The position tab shows location data for nodes that share GPS: + +![Position inline content](/assets/screenshots/nodes_position.png) + +> ⚠️ **Note:** Metrics are only available when they have been reported by the remote node. Metrics update at intervals configured on each node's telemetry settings. + +## Related Topics + +- [Nodes](nodes) — node list, filtering, and sorting +- [Telemetry & Sensors](telemetry-and-sensors) — supported sensors and configuration +- [Signal Meter](signal-meter) — how signal quality is calculated from SNR and RSSI +- [Discovery](discovery) — traceroute details and neighbor info +- [Units & Locale](units-and-locale) — temperature, distance, and speed display formats + +--- + diff --git a/docs/ca-rES/user/nodes.md b/docs/ca-rES/user/nodes.md new file mode 100644 index 000000000..d499a287e --- /dev/null +++ b/docs/ca-rES/user/nodes.md @@ -0,0 +1,152 @@ +--- +title: Nodes +nav_order: 4 +last_updated: 2026-05-13 +description: Browse, filter, and sort mesh nodes — view details, signal quality, roles, and quick actions. +aliases: + - node-list + - mesh-nodes + - peers +--- + +# Nodes + +The Nodes screen displays all devices visible on your mesh network. + +## Node List + +The node list shows every node your radio has heard, including: + +- **Node name** — user-configured long name +- **Short name** — 4-character identifier +- **Signal quality** — last heard signal strength +- **Last heard** — time since last communication +- **Distance** — estimated distance (if positions are shared) +- **Battery** — remote node battery level (if telemetry is enabled) + +### Node Status Indicators + +| Badge | Meaning | +| ---------- | ------------------------------------- | +| 🟢 Online | Node heard within the last 15 minutes | +| 🟡 Away | Node heard within the last 2 hours | +| 🔴 Offline | Node not heard for over 2 hours | +| ⭐ Favorite | Node marked as favorite by the user | + +### Node Roles + +Nodes can be configured with different roles that affect their mesh behavior: + +| Role | Descripció | +| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Client | Standard end-user device | +| Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | +| Client Mute | Receives but doesn't retransmit | +| Client Hidden | Like Client Mute, plus hides from node list | +| Router | Prioritizes message forwarding; stays awake to relay | +| Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | +| ~~Router Client~~ | ⚠️ **Deprecated** (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | +| ~~Repeater~~ | ⚠️ **Deprecated** (removed in firmware 2.7.11) — no longer selectable; use Router instead | +| Tracker | Optimized for position reporting at regular intervals | +| Sensor | Optimized for telemetry reporting | +| TAK | Interoperates with TAK systems (sends/receives CoT) | +| TAK Tracker | TAK position reporting only | +| Lost & Found | Continuous position beacon for recovery | + +### Choosing a Role + +Most users should keep the default **Client** role. Consider a different role when: + +- **Router** — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don't use Router on battery-powered handheld devices. +- **Router Late** — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. +- **Client Base** — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. +- **Client Mute** — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only devices or to reduce congestion in dense areas. +- **Tracker** — An unattended device whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. +- **Sensor** — An unattended device reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. +- **TAK / TAK Tracker** — Only needed if interoperating with ATAK/WinTAK systems. See [TAK Integration](tak) for details. + +> 💡 **Tip:** The mesh works best when most nodes are **Client** or **Router**. Too many Mute nodes reduces mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. + +### Encryption Indicators + +Nodes display encryption status icons next to their name: + +| Icon | Meaning | +| ----------- | ------------------------------------------------------------------------------------------------------------------- | +| 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | +| 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | +| ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) | + +> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. + +## Quick Actions + +From the node list, you can: + +- **Tap** a node to view its detail page +- **Long-press** for quick actions: + - Send a direct message + - View on map + - Sol·licitar posició + - Mark as favorite + - Traçar ruta + +## Filtering & Sorting + +### Text Search + +Type in the search field to filter nodes by name or short name. The filter updates in real time as you type. + +### Filter Toggles + +| Filtre | Descripció | +| -------------------------- | ---------------------------------------------------------------------------------------------- | +| **Only online** | Show only nodes heard within the last 15 minutes | +| **Only direct** | Show only nodes with direct (non-relayed) connections | +| **Include unknown** | Show nodes that haven't sent user info yet | +| **Exclude infrastructure** | Hide infrastructure-role nodes (Router, Repeater, Router Late, Client Base) | +| **Exclude MQTT** | Hide nodes heard only via MQTT internet bridge | +| **Show ignored** | Show nodes you've previously dismissed or muted | + +### Sort Options + +| Sort | Descripció | +| ------------------------------------------- | ------------------------------------------------------------------ | +| **Last heard** (default) | Most recently heard nodes first | +| **Alphabetical** | Sorted by node long name | +| **Distance** | Nearest nodes first (requires position sharing) | +| **Hops away** | Fewest relay hops first | +| **Channel** | Grouped by channel index | +| **Via MQTT** | Grouped by MQTT vs. radio-heard | +| **Favorites** | Favorited nodes first | + +## Node Detail + +Tapping a node opens the detail view with comprehensive information. See [Node Metrics](node-metrics) for full details on metrics and telemetry. + +![Node detail view](/assets/screenshots/nodes_node_list.png) + +The detail screen includes device info, position, and action buttons: + +![Node detail section](/assets/screenshots/nodes_detail_section.png) + +Inline status indicators show key metrics at a glance: + +| Indicator | Screenshot | +| -------------- | -------------------------------------------------------- | +| Signal quality | ![Signal](/assets/screenshots/nodes_signal_info.png) | +| Battery level | ![Battery](/assets/screenshots/nodes_battery_info.png) | +| Hop count | ![Hops](/assets/screenshots/nodes_hops_info.png) | +| Última notícia | ![Last heard](/assets/screenshots/nodes_last_heard.png) | +| Distància | ![Distance](/assets/screenshots/nodes_distance_info.png) | + +## Related Topics + +- [Node Metrics](node-metrics) — detailed telemetry dashboards for each node +- [Messages & Channels](messages-and-channels) — send a direct message to a node +- [Map & Waypoints](map-and-waypoints) — view node positions geographically +- [Discovery](discovery) — traceroute and neighbor info for topology exploration +- [Signal Meter](signal-meter) — understand what the signal bars mean + +--- + diff --git a/docs/ca-rES/user/onboarding.md b/docs/ca-rES/user/onboarding.md new file mode 100644 index 000000000..3b910534e --- /dev/null +++ b/docs/ca-rES/user/onboarding.md @@ -0,0 +1,99 @@ +--- +title: Getting Started +nav_order: 1 +last_updated: 2026-05-13 +description: First-launch setup — permissions, onboarding flow, and next steps after connecting your radio. +aliases: + - first-launch + - setup + - intro +--- + +# Getting Started + +Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app. + +## First Launch + +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. + +### Welcome Screen + +The welcome screen introduces Meshtastic and its core capabilities: + +- Off-grid mesh communication +- No cellular or internet required +- End-to-end encrypted messaging + +Tap **Get Started** to proceed through the setup flow. + +![Welcome screen](/assets/screenshots/onboarding_welcome.png) + +## Permissions + +The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. + +### Bluetooth Permission + +Bluetooth is the primary connection method between your phone and Meshtastic radio: + +- **Bluetooth scanning** — discover nearby Meshtastic radios +- **Bluetooth connect** — establish and maintain connections with paired radios + +Grant both permissions when prompted. Without Bluetooth, you'll need to use USB or TCP connections instead. + +### Location Permission + +> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. + +Meshtastic also uses your location for: + +- Showing your position on the mesh map +- Calculating distances to other nodes +- Sharing your GPS coordinates with other mesh members (if enabled) + +Grant **"While using the app"** or **"Always"** depending on your preference: + +- **While using the app** — position updates only when the app is open +- **Always** — enables background position updates for always-on mesh presence + +If denied, Bluetooth scanning will not function and your node will not report a position. + +### Notifications Permission + +Notifications alert you to: + +- Incoming messages from channels and direct messages +- Connection status changes (connected, disconnected, reconnecting) +- Firmware update availability + +> 💡 **Tip:** You can fine-tune notification preferences later in Android system settings. The app creates separate notification channels for messages, connection events, and background service status. + +### Critical Alerts Permission + +On supported devices, the app may request permission for critical alerts: + +- These are high-priority notifications that can break through Do Not Disturb mode +- Useful for emergency mesh alerts or urgent messages +- You can **skip** this step if you don't need breakthrough notifications +- Configure or revoke later in Android notification settings + +## After Setup + +Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. + +> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. + +## What's Next? + +Once connected to a radio, explore: + +- [Connections](connections) — pair your first radio device +- [Messages & Channels](messages-and-channels) — send your first message +- [Nodes](nodes) — see who's on your mesh +- [Map & Waypoints](map-and-waypoints) — view node positions +- [Settings](settings-radio-user) — configure your radio and user profile + +New to Meshtastic? The [getting started guide](https://meshtastic.org/docs/getting-started) on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup. + +--- diff --git a/docs/ca-rES/user/settings-module-admin.md b/docs/ca-rES/user/settings-module-admin.md new file mode 100644 index 000000000..53a54c2c1 --- /dev/null +++ b/docs/ca-rES/user/settings-module-admin.md @@ -0,0 +1,246 @@ +--- +title: Settings — Modules & Admin +nav_order: 8 +last_updated: 2026-05-13 +description: Configure optional feature modules (MQTT, telemetry, canned messages, TAK, and more) and perform device administration. +aliases: + - modules + - module-config + - administration +--- + +# Settings — Modules & Admin + +Configure optional feature modules and perform device administration. Modules extend Meshtastic with specialized capabilities — each can be independently enabled or disabled. + +> 💡 **Tip:** You only need to enable the modules you actually use. Disabling unused modules reduces airtime, saves battery, and simplifies your configuration. + +Module settings use a card-based layout with toggle switches, dropdowns, text fields, and sliders: + +![Toggle switch](/assets/screenshots/settings_switch.png) + +![Dropdown selector](/assets/screenshots/settings_dropdown.png) + +![Text field](/assets/screenshots/settings_text_field.png) + +![Settings card layout](/assets/screenshots/settings_titled_card.png) + +## Module Configuration + +### MQTT Module + +Bridges mesh messages to and from an MQTT broker for internet connectivity. This is how you extend your mesh beyond radio range or integrate with home automation systems. + +| Setting | Descripció | +| --------------- | ------------------------------------------------------------------------ | +| Enabled | Toggle MQTT bridge | +| Server | MQTT broker address | +| Username | Authentication username | +| Password | Authentication password | +| Encryption | Encrypt MQTT payloads | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON support removed from firmware; field is ignored | +| TLS | Use secure connection | +| Root Topic | Base MQTT topic path | +| Map Report | Publish position for public map | + +See [MQTT](mqtt) for a detailed usage guide including encryption, privacy, and broker setup. + +### Serial Module + +Enables serial port communication for external device integrations (GPS modules, sensors, or custom hardware). When enabled, the node's serial port can send and receive protobuf or text data, allowing external microcontrollers or computers to interact with the mesh. + +| Setting | Descripció | +| ---------- | ------------------------------- | +| Enabled | Activate serial communication | +| Echo | Echo received serial data back | +| Mode | Text, Protobuf, or NMEA output | +| RX/TX Pins | GPIO pins for serial connection | +| Baud Rate | Serial communication speed | + +### External Notification Module + +Controls buzzer, LED, or vibration alerts on your radio hardware. Useful for devices that need to physically signal when a message arrives — particularly helpful for unattended or outdoor installations. + +| Setting | Descripció | +| -------------------------------- | --------------------------- | +| Enabled | Activate notifications | +| Alert Message | Notify on incoming messages | +| Alert Message Buzzer | Use buzzer for messages | +| Alert Message Vibra | Use vibration for messages | +| Alert Bell | Notify on bell character | +| Output (GPIO) | Pin for notification output | +| Active | High or Low active | +| Duration (ms) | Notification length | +| Use I2S as Buzzer | Use I2S audio output | + +### Store & Forward Module + +Buffers messages for nodes that were temporarily offline, then replays them when those nodes reconnect. Essential for meshes where nodes go in and out of range regularly — ensures messages aren't lost during brief disconnections. + +| Setting | Descripció | +| ------------------------------------------ | -------------------------- | +| Enabled | Activate store and forward | +| Heartbeat (s) | Announcement interval | +| Records | Maximum stored messages | +| History Return (max) | Max messages to replay | +| History Return (window) | Time window for replay | + +> 💡 **Tip:** Store and Forward works best on nodes with ample memory (ESP32 with PSRAM). Router nodes are ideal candidates since they're typically always-on. + +### Range Test Module + +Automated range testing tool for evaluating link quality between nodes. When enabled, the node periodically transmits test messages with incrementing counters. A receiver node logs these messages, allowing you to walk or drive away and later analyze at what distance messages stopped arriving. + +| Setting | Descripció | +| -------------------------------------- | --------------------------------- | +| Enabled | Activate range testing | +| Sender Interval (s) | Time between test transmissions | +| Save CSV | Log received test data to SD card | + +### Telemetry Module + +Controls what telemetry data your node shares with the mesh. Telemetry includes device health (battery, uptime) and environmental sensor data (temperature, humidity, pressure). + +| Setting | Descripció | +| ---------------------------- | --------------------------------------- | +| Device Metrics Interval | How often to report device metrics | +| Environment Metrics Interval | How often to report environment sensors | +| Air Quality Enabled | Report particulate sensor data | +| Power Metrics Enabled | Report power usage | + +See [Telemetry & Sensors](telemetry-and-sensors) for supported sensors and configuration recommendations. + +### Canned Message Module + +Pre-configured messages accessible from the device's physical buttons (for radios with rotary encoders, keypads, or similar input hardware). Define a list of quick-send messages that can be transmitted without a phone connected — ideal for field use. + +| Setting | Descripció | +| ------------------ | ----------------------------------------------------------- | +| ~~Enabled~~ | ⚠️ **Deprecated** — current firmware may ignore this toggle | +| Messages | Newline-separated list of messages | +| Send Bell | Play bell sound on send | +| Rotary Encoder | Enable rotary encoder input | +| Up/Down/Press Pins | GPIO pin assignments for input | + +### Audio Module + +Codec2 audio support for low-bandwidth voice communication over the mesh. This is an **experimental** feature that encodes voice into very small data packets using the Codec2 codec. + +| Setting | Descripció | +| --------------- | -------------------------------- | +| Enabled | Activate audio module | +| Codec2 Rate | Audio quality/bandwidth tradeoff | +| I2S Word Select | GPIO pin for I2S WS | +| I2S Data In | GPIO pin for I2S DIN | +| I2S Data Out | GPIO pin for I2S DOUT | + +> ⚠️ **Note:** Audio requires specific hardware (I2S microphone and speaker). Voice quality is very low-bandwidth — think "understandable radio voice," not phone-call quality. + +### Remote Hardware Module + +GPIO control over the mesh network. Allows a remote node to read or write GPIO pins on another node — useful for activating relays, reading switches, or controlling external hardware from a distance. + +| Setting | Descripció | +| -------------------- | --------------------------------------------------------------- | +| Enabled | Activate remote GPIO access | +| Allow Undefined Pins | Allow access to any GPIO pin (security risk) | + +> ⚠️ **Warning:** Enabling "Allow Undefined Pins" gives remote nodes access to all GPIO pins, which could interfere with the radio's own hardware. Only enable on dedicated GPIO nodes. + +### Neighbor Info Module + +Broadcasts information about directly heard neighbors, enabling mesh topology mapping. Each enabled node periodically shares a list of the other nodes it can hear and their signal quality. + +| Setting | Descripció | +| -------------------------------------- | ------------------------------------ | +| Enabled | Activate neighbor broadcasting | +| Update Interval (s) | How often to broadcast neighbor list | + +See [Discovery](discovery) for how to use neighbor data for mesh topology exploration. + +### Ambient Lighting Module + +Controls onboard NeoPixel or other addressable RGB LEDs on supported hardware. Can be used for visual status indicators, notification lights, or decorative effects. + +| Setting | Descripció | +| ------------------ | ---------------------------------------------------------- | +| Enabled | Activate LED control | +| LED State | On, Off, or set specific color | +| Red / Green / Blue | Individual color channel values (0–255) | + +### Detection Sensor Module + +Turns your node into a motion or door sensor alert system. When a GPIO pin detects a state change (motion detected, door opened), the node broadcasts an alert message over the mesh. + +| Setting | Descripció | +| ---------------------------------------- | ----------------------------------------------------------------------- | +| Enabled | Activate detection sensor | +| Monitor Pin | GPIO pin connected to sensor | +| Detection Triggered High | Trigger when pin goes high (vs. low) | +| Minimum Broadcast (s) | Minimum time between alert broadcasts | +| State Broadcast (s) | Periodic state broadcast interval | +| Send Bell | Include bell character in alerts | +| Friendly Name | Custom name for this sensor | + +### Paxcounter Module + +People counter using WiFi and BLE probe requests. Counts nearby devices by passively listening for probe requests that phones and laptops emit when scanning for networks. Available only on ESP32 devices. + +| Setting | Descripció | +| -------------------------------------- | -------------------------- | +| Enabled | Activate people counting | +| Update Interval (s) | How often to report counts | + +> 💡 **Tip:** Paxcounter is useful for estimating foot traffic at trailheads, event venues, or other locations. Counts are approximate — one person may carry multiple devices. + +### TAK Module + +Team Awareness Kit integration for interoperability with ATAK and WinTAK. See [TAK Integration](tak) for detailed setup and usage. + +## Administration + +### Remote Administration + +Remotely configure nodes that share your admin key: + +1. Select the target node in the node list. +2. Navigate to **Settings** for that node. +3. Modify configuration. +4. Tap **Save** — changes are sent over the mesh. + +> ⚠️ **Requires:** Admin key configured on both your node and the target node. + +### Clean Node Database + +Removes stale nodes from your local database that haven't been heard in a configurable time window. + +### Factory Reset + +Resets all settings to factory defaults. **This cannot be undone.** + +### Reiniciar + +Remotely reboot a connected or administered node. + +### Panell de depuració + +View detailed diagnostic information: + +- Protocol buffers debug output +- Mesh packet log +- Connection state details + +### Troubleshooting Remote Admin + +- **"No response from target node"** — the target may be out of range, offline, or have a mismatched admin key. Verify the admin key matches on both nodes. +- **Changes not applying** — some settings require a reboot to take effect. Try the Reboot action after saving. +- **Can't see remote settings** — ensure your node has the admin key for the target node and that Admin Channel is enabled in Security Config. + +## Related Topics + +- [Settings — Radio & User](settings-radio-user) — core radio and user profile settings +- [Module configuration reference](https://meshtastic.org/docs/configuration/module) — detailed module docs on meshtastic.org +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/ca-rES/user/settings-radio-user.md b/docs/ca-rES/user/settings-radio-user.md new file mode 100644 index 000000000..c9fd6e397 --- /dev/null +++ b/docs/ca-rES/user/settings-radio-user.md @@ -0,0 +1,173 @@ +--- +title: Settings — Radio & User +nav_order: 7 +last_updated: 2026-05-13 +description: Configure your radio hardware, LoRa presets, user profile, position sharing, power management, and security. +aliases: + - settings + - radio-config + - user-config + - lora +--- + +# Settings — Radio & User + +Configure your radio hardware and user identity parameters. + +## User Settings + +### User Profile + +| Setting | Descripció | +| ----------------- | ------------------------------------------------------------------------------------- | +| Long Name | Your display name (up to 39 characters) | +| Short Name | 4-character abbreviated name | +| Licensed Operator | Enable if you hold an amateur radio license (enables higher power) | + +### Applying Changes + +After modifying settings, tap **Save** to write the configuration to your radio. The device may reboot to apply changes. + +## Radio Configuration + +### Device Config + +| Setting | Descripció | Default | +| ------------------------------------------ | ----------------------------------------------------------------------- | -------- | +| Role | Node behavior (Client, Router, etc.) | Client | +| Rebroadcast Mode | How the node retransmits messages | All | +| Node Info Broadcast (s) | Interval for broadcasting node info | 10800 | +| Double-tap Button | Action for double-tap button press | Disabled | + +### LoRa Config + +| Setting | Descripció | Default | +| ----------------- | ----------------------------------------------------------------------- | ----------------------------------------- | +| Regió | Regulatory region for frequency bands | Unset (must configure) | +| Modem Preset | Speed/range tradeoff | LongFast | +| Hop Limit | Maximum retransmit hops | 3 | +| TX Power | Transmission power (dBm); 0 = max allowed for region | 0 (region max) | +| Frequency Offset | Fine-tune frequency (MHz) | 0 | +| Channel Bandwidth | Bandwidth setting | Default for preset | + +> ⚠️ **Important:** You **must** set your region before transmitting. Operating without the correct region may violate local radio regulations. See the [region configuration guide](https://meshtastic.org/docs/getting-started/initial-config) on meshtastic.org for details. + +### Modem Presets + +| Preset | Range | Speed | SNR Limit | Best For | +| ------------------ | ----------------------- | ------------------------- | ------------------------ | -------------------------------------------------------------------------------------------------------- | +| Short Turbo | ~1 km | 21.9 kbps | −5 dB | Dense urban with line-of-sight; data-heavy applications | +| Short Fast | ~3 km | 10.9 kbps | −7.5 dB | Urban neighborhoods; buildings within a few blocks | +| Short Slow | ~5 km | 5.5 kbps | −10 dB | Suburban short-range; moderate building density | +| Medium Fast | ~5 km | 5.5 kbps | −10 dB | Suburban areas; moderate building density | +| Medium Slow | ~8 km | 1.1 kbps | −12.5 dB | Suburban/rural; moderate range with slower speed | +| Long Turbo | ~10 km | 4.4 kbps | −10 dB | Similar range to Long Fast but with 500 kHz bandwidth; faster throughput | +| Long Fast | ~10 km | 1.1 kbps | −12.5 dB | **General use (default)** — balanced range and speed | +| Long Moderate | ~20 km | 0.34 kbps | −15 dB | Rural with some terrain; occasional use | +| Lite Fast | ~5 km | 5.5 kbps | −10 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Medium Fast | +| Lite Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Long Fast | +| Narrow Fast | ~5 km | 2.7 kbps | −10 dB | EU 868 MHz band (62.5 kHz BW); avoids interference with other devices | +| Narrow Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 868 MHz band (62.5 kHz BW); comparable to Long Fast | +| ~~Long Slow~~ | ~30 km | 0.18 kbps | −17.5 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | +| ~~Very Long Slow~~ | ~40+ km | 0.09 kbps | −20 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | + +#### Choosing a Modem Preset + +The modem preset controls the fundamental tradeoff between **range** and **data rate**: + +- **Slower presets** use more spreading, making signals decodable at weaker signal levels (lower SNR limit). This means longer range but fewer bytes per second. +- **Faster presets** pack more data per transmission but require a stronger signal to decode. + +**Practical guidance:** + +- **Urban mesh (many nodes, short distances):** Use **Long Fast** (default) or **Short Fast**. Higher speed means less airtime congestion when many nodes share the channel. +- **Rural/sparse mesh (few nodes, long distances):** Use **Long Moderate**. Range matters more than speed when nodes are far apart. +- **EU 866/868 MHz regulatory compliance:** Use **Lite Fast**, **Lite Slow**, **Narrow Fast**, or **Narrow Slow** — these are optimized for the EU SRD/868 MHz bands with narrower bandwidths. +- **Fixed infrastructure links:** Use **Short Turbo** or **Long Turbo** for dedicated point-to-point links with good antennas and line-of-sight. +- **Mixed environments:** Stick with **Long Fast** — it's the community default and ensures compatibility with others in your area. + +> ⚠️ **Important:** All nodes on the same channel **must** use the same modem preset. Nodes with mismatched presets cannot communicate even if they share the same frequency and encryption key. + +> 💡 **Tip:** The range estimates above assume flat terrain and modest antennas. Elevation advantage (hilltop, rooftop) dramatically increases effective range. A well-placed Router with Long Fast can often outperform a ground-level node with Long Slow. + +### Display Config + +| Setting | Descripció | +| ------------------- | ------------------------------------------------------------------------------------ | +| Screen Timeout | Time before display sleeps | +| Display Units | Metric or Imperial | +| OLED Type | Auto, SSD1306, SH1106, SH1107 | +| Compass Orientation | Rotation offset for compass display (0°, 90°, 180°, 270°) | +| ~~Compass North~~ | ⚠️ **Deprecated** — replaced by Compass Orientation; still visible in older firmware | + +### Position Config + +| Setting | Descripció | +| ----------------------------------------- | ---------------------------------- | +| GPS Enabled | Enable/disable GPS | +| GPS Update Interval | How often to acquire GPS fix | +| Position Broadcast (s) | How often to share position | +| Smart Position | Enable movement-based broadcasting | +| Fixed Position | Use a manually set position | + +### Power Config + +| Setting | Descripció | +| --------------------------------------- | --------------------------------------- | +| Power Saving | Enable low-power sleep mode | +| Shutdown After (s) | Auto-shutdown idle timer | +| ADC Multiplier | Battery voltage calibration factor | +| Wait Bluetooth (s) | Time to wait for BLE connection at boot | +| Mesh SDS Timeout (s) | Super-deep-sleep timeout | + +### Network Config + +| Setting | Descripció | +| ------------- | ---------------------------------------------------- | +| WiFi Enabled | Enable WiFi radio (ESP32 devices) | +| WiFi SSID | Network name to connect to | +| WiFi PSK | Network password | +| NTP Server | Time synchronization server | +| Syslog Server | Remote logging server | + +![IP address field](/assets/screenshots/settings_ipv4_field.png) + +### Bluetooth Config + +| Setting | Descripció | +| ----------------- | ------------------------------------------------------------------------- | +| Bluetooth Enabled | Enable/disable BLE radio | +| Pairing Mode | Fixed PIN, Random PIN, or No PIN | +| Fixed PIN | PIN code for pairing (default: 123456) | + +### Security Config + +| Setting | Descripció | +| --------------------- | -------------------------------------------------------------------------- | +| Public Key | Your node's public key (read-only) | +| Admin Key | Key for remote administration | +| Private Key | Your node's private key (handle securely) | +| Admin Channel Enabled | Allow admin commands via channel | +| Debug Log | Output live debug logging over serial/bluetooth | +| Serial Enabled | Enable serial console access (moved from Device Config) | +| Managed Mode | Restrict non-admin channel changes | + +![Password field](/assets/screenshots/settings_password_field.png) + +Settings use standard preference controls — dropdowns, toggles, and sliders: + +| Control | Screenshot | +| -------- | ------------------------------------------------------ | +| Dropdown | ![Dropdown](/assets/screenshots/settings_dropdown.png) | +| Toggle | ![Toggle](/assets/screenshots/settings_switch.png) | +| Slider | ![Slider](/assets/screenshots/settings_slider.png) | + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — optional feature modules and device administration +- [Signal Meter](signal-meter) — how modem presets affect signal quality thresholds +- [LoRa configuration](https://meshtastic.org/docs/configuration/radio/lora) — detailed LoRa settings reference on meshtastic.org +- [Initial configuration](https://meshtastic.org/docs/getting-started/initial-config) — region setup guide on meshtastic.org + +--- + diff --git a/docs/ca-rES/user/signal-meter.md b/docs/ca-rES/user/signal-meter.md new file mode 100644 index 000000000..d34246d0e --- /dev/null +++ b/docs/ca-rES/user/signal-meter.md @@ -0,0 +1,81 @@ +--- +title: How the Meshtastic Signal Meter Works +nav_order: 15 +last_updated: 2026-05-13 +description: How the signal meter calculates quality from RSSI and SNR — LoRa spread spectrum, presets, and what the bars really mean. +aliases: + - signal + - signal-meter + - snr + - rssi +--- + +# How the Meshtastic Signal Meter Works + +The Meshtastic signal meter — the familiar bars or status color in the app — is calculated very differently than the "bars" on a traditional cell phone or Wi-Fi router. + +Most consumer devices simply measure how "loud" a signal is. However, because Meshtastic uses **LoRa (Long Range)** technology, its signal meter measures how **clear** the signal is, relative to the specific settings your mesh is using. + +--- + +## 1. The Two Metrics: "Loudness" vs. "Clarity" + +Every time the LoRa radio chip receives a message, it reports two measurements: + +- **RSSI (Received Signal Strength Indicator):** The **loudness** of the raw power hitting your antenna. +- **SNR (Signal-to-Noise Ratio):** The **clarity** of the signal compared to the background static. + +> **Tip — The Analogy:** Imagine you are trying to hear a friend talking to you. +> +> - **RSSI** is how loud their voice is. +> - **The Noise Floor** is the background noise in the room (air conditioning, other people talking, traffic). +> - **SNR** is how easily you can distinguish your friend's voice from the background noise. + +If your friend shouts at you at a deafening rock concert, the signal is incredibly loud (High RSSI), but you still can't understand them because the background noise is louder (Bad SNR). Conversely, if your friend whispers to you in a dead-silent library, the signal is very weak (Low RSSI), but you can understand them perfectly (Great SNR). + +--- + +## 2. The Magic of LoRa: Hearing "Below the Noise Floor" + +For standard radios (like FM or Wi-Fi), if the background noise is louder than the signal (a negative SNR), the receiver just hears static. + +LoRa is special. It uses **"Spread Spectrum"** modulation, which allows the radio to mathematically pull a signal out of the air even when it is buried deep _underneath_ the background noise. This is why you will frequently see **negative SNR numbers** in Meshtastic (e.g., -10 dB, which means the signal is 10 decibels weaker than the background static). + +Depending on which Meshtastic preset you are using (e.g., `LongFast` vs. `ShortFast`), the radio has a specific **SNR Limit** — the absolute maximum amount of noise it can tolerate before the message is completely lost to the static. + +--- + +## 3. How the Signal Meter Calculates Quality + +The Meshtastic apps take both RSSI and SNR and run them through a specific formula to assign your signal a quality rating (None, Bad, Fair, or Good). It specifically scales these values based on the physical limits of the radio preset you are using. + +Here is exactly how the app decides how many bars (or what color) to show you: + +| Level | Bars | Criteria | Meaning | +| ----- | ---- | ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | +| Good | 3 | RSSI better than `-115 dBm` **AND** SNR better than `-7 dB` | Signal is both loud and clear — healthy connection. | +| Fair | 2 | RSSI better than `-126 dBm` with good SNR, **OR** SNR better than `-15 dB` with good RSSI | Signal getting quieter or noisier, but still decodable. | +| Bad | 1 | Falls between Fair and None thresholds | At the edge of range or experiencing interference. | +| None | 0 | RSSI worse than `-126 dBm` **AND** SNR worse than `-15 dB` | Transmission completely buried in noise. | + +--- + +## 4. What This Means for You + +Because Meshtastic's meter acts as a **"Clarity Meter"**, it behaves differently than what most people expect: + +> **Tip — Don't panic over low RSSI:** You might see a seemingly terrible RSSI value like `-118 dBm`. On a cell phone, you would have zero bars. But if you have an SNR of `+2 dB`, Meshtastic will still show a strong signal! _The library is quiet, so the whisper is heard perfectly._ + +> **Warning — Watch out for local noise:** If you hook up a massive antenna and see a great RSSI (e.g., `-90 dBm`) but your signal meter is only showing **1 Bar (Bad)**, you have a problem. It means you have local interference — perhaps a cheap power supply, a noisy computer, or a nearby radio tower — creating so much static that it is drowning out your mesh. + +## Where Signal Information Appears + +In the app, signal data is shown in several places: + +- **Node list** — signal bars icon next to each node +- **Node detail** — SNR, RSSI, and signal quality in the device metrics section +- **Traceroute** — per-hop signal quality for each relay node +- **Signal metrics** — historical SNR and RSSI data in the metrics charts + +![Node entry showing SNR, RSSI values and colored signal bars](/assets/screenshots/nodes_signal_info.png) + diff --git a/docs/ca-rES/user/tak.md b/docs/ca-rES/user/tak.md new file mode 100644 index 000000000..f7f1cc541 --- /dev/null +++ b/docs/ca-rES/user/tak.md @@ -0,0 +1,126 @@ +--- +title: TAK Integration +nav_order: 10 +last_updated: 2026-05-13 +description: Interoperate with ATAK and WinTAK — CoT position sharing, TAK roles, and plugin setup. +aliases: + - tak + - atak + - team-awareness-kit +--- + +# TAK Integration + +Meshtastic integrates with the Team Awareness Kit (TAK) ecosystem, enabling interoperability between Meshtastic mesh devices and TAK applications like ATAK and WinTAK. + +## Overview + +The TAK module allows Meshtastic nodes to: + +- Share position data in TAK-compatible CoT (Cursor on Target) format +- Appear as team members on TAK map displays +- Receive TAK PLI (Position Location Information) messages + +## Setup + +### Prerequisites + +- ATAK (Android Team Awareness Kit) or WinTAK installed +- Meshtastic ATAK Plugin installed +- TAK module enabled on your Meshtastic radio + +### Configuration + +1. Navigate to **Settings → Module Config → TAK**. +2. Enable the TAK module. +3. Configure the TAK team/group settings: + +![Module toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | Descripció | +| ------- | -------------------------- | +| Enabled | Activate TAK interop | +| Mode | TAK-compatible output mode | + +### ATAK Plugin Setup + +1. Install the Meshtastic ATAK Plugin from the plugin repository. +2. Open ATAK and enable the Meshtastic plugin. +3. The plugin bridges messages between ATAK and your mesh network. + +## TAK Roles + +Nodes configured with TAK-related roles behave differently from standard clients: + +| Role | Descripció | +| --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **TAK** | Full TAK interoperability — sends and receives CoT data, chat messages, and PLI updates. Functions as a standard client plus TAK bridge. | +| **TAK Tracker** | Position-only TAK output — automatically broadcasts PLI at regular intervals without user interaction. Optimized for unattended position beacons (vehicles, equipment, waypoints). Does not relay chat messages. | + +> 💡 **Tip:** Use **TAK Tracker** for devices that only need to report position (e.g., a radio mounted in a vehicle). Use **TAK** for devices where users actively participate in TAK operations. + +### CoT (Cursor on Target) Format + +TAK messages use the Cursor on Target XML format — a military standard for sharing situational awareness data. Meshtastic converts its internal protobuf messages to CoT format when bridging to TAK systems, so no manual format conversion is needed. + +## TAK Identity + +When using TAK roles, your node broadcasts identity information that appears on TAK maps: + +| Setting | Descripció | +| -------- | ---------------------------------------------------------------------------------------------------------------- | +| Team | Your team color on the TAK map (e.g., Blue, Red, Cyan, Green) | +| Role | Your operational role (Team Member, Team Lead, HQ, Medic, RTO, etc.) | +| Callsign | Your TAK callsign (defaults to your Meshtastic long name) | + +These settings appear in **Settings → Module Config → TAK** when the TAK module is enabled. + +> 💡 **Tip:** Team/role colors are the standard TAK affiliation colors. Coordinate with your TAK team to use consistent team assignments. + +## Wire Format (V1 / V2) + +Meshtastic supports two TAK wire formats: + +| Format | Compatibility | Features | +| ------------------------------- | --------------------------------------------------------------- | --------------------------------------------------------- | +| V1 (Legacy) | ATAK Plugin v1.x, older firmware | Basic CoT position sharing only | +| V2 (Current) | ATAK Plugin v2.x, firmware 2.3+ | Full CoT support including chat, routes, zstd compression | + +The app automatically selects V2 when both sides support it. No manual configuration needed — the TAK module negotiates format based on firmware capabilities. + +## Usage with ATAK + +Once configured: + +- Meshtastic nodes appear as markers on the ATAK map with callsign labels +- Chat messages can bridge between mesh and TAK networks +- Position updates flow bidirectionally between Meshtastic and TAK +- TAK Tracker nodes broadcast PLI automatically — their positions appear on ATAK maps without any ATAK-side configuration + +> ⚠️ **Note:** TAK integration requires specific node roles and module configuration. Standard client nodes don't automatically participate in TAK operations. + +## Troubleshooting + +| Problem | Cause | Solution | +| -------------------------------- | ------------------------------------- | ----------------------------------------------------------------------- | +| Node doesn't appear on ATAK map | TAK module disabled or wrong role | Verify TAK module is enabled and node role is TAK or TAK Tracker | +| Position updates are stale | GPS fix lost or interval too long | Check GPS status; reduce position broadcast interval in Position Config | +| ATAK plugin shows "disconnected" | BLE connection lost or plugin crashed | Reconnect Bluetooth in Meshtastic app, then restart ATAK plugin | +| Chat messages not bridging | V1 format doesn't support chat | Ensure both nodes run firmware 2.3+ for V2 wire format | +| CoT data not flowing | Channel mismatch | All TAK nodes must be on the same channel with matching encryption | + +## Security Considerations + +- TAK data shares your position and callsign information +- Ensure your channel encryption is configured when using TAK in sensitive environments +- The TAK module respects the same channel encryption as other Meshtastic messages + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — TAK module configuration +- [Nodes](nodes) — TAK and TAK Tracker roles in the node list +- [Map & Waypoints](map-and-waypoints) — node positions on the map +- [ATAK plugin guide](https://meshtastic.org/docs/software/integrations/atak-plugin) — detailed ATAK setup on meshtastic.org + +--- + diff --git a/docs/ca-rES/user/telemetry-and-sensors.md b/docs/ca-rES/user/telemetry-and-sensors.md new file mode 100644 index 000000000..27a7faa4a --- /dev/null +++ b/docs/ca-rES/user/telemetry-and-sensors.md @@ -0,0 +1,118 @@ +--- +title: Telemetry & Sensors +nav_order: 9 +last_updated: 2026-05-13 +description: Sensor data on the mesh — supported environment, air quality, and power sensors, plus configuration and viewing guides. +aliases: + - sensors + - environment + - weather + - power-metrics +--- + +# Telemetry & Sensors + +Meshtastic nodes can collect and share sensor data across the mesh network. + +## Overview + +Telemetry allows nodes equipped with sensors to broadcast environmental, power, and device health information. This data is visible on the node detail screen and can be logged over time. + +## Device Telemetry + +All Meshtastic nodes report basic device telemetry: + +| Metric | Descripció | Typical Range | +| ------------------- | ------------------------------ | ------------------------------------------------------------------ | +| Battery Level | Charge percentage | 0–100% | +| Voltage | Battery voltage | 3.0–4.2V (LiPo) | +| Channel Utilization | % of airtime used locally | 0–100% | +| Air Utilization TX | % of airtime used by this node | 0–100% | +| Uptime | Seconds since last boot | Varies | + +## Environment Sensors + +Supported environmental sensors: + +### Temperature & Humidity + +| Sensor | Temperature | Humidity | Pressure | Notes | +| ------- | ----------- | -------- | -------- | ----------------------- | +| BME280 | ✓ | ✓ | ✓ | Recommended all-in-one | +| BME680 | ✓ | ✓ | ✓ | Adds gas resistance/IAQ | +| SHT31 | ✓ | ✓ | — | High accuracy | +| MCP9808 | ✓ | — | — | Precision temperature | +| LPS22 | — | — | ✓ | Pressure only | + +### Air Quality + +| Sensor | Metric | Notes | +| -------- | -------------------------------------------------- | -------------------------- | +| BME680 | Gas Resistance / IAQ | Volatile organic compounds | +| PMSA003I | PM1.0, PM2.5, PM10 | Particulate matter | +| SEN55 | PM, NOx, VOC, Temp, Humidity | Multi-sensor | + +### Light & UV + +| Sensor | Metric | +| -------- | -------------------------------------- | +| OPT3001 | Ambient light (lux) | +| VEML7700 | Ambient light (lux) | +| LTR390 | UV index | + +## Power Metrics + +Nodes with INA-series power sensors can report: + +| Metric | Descripció | +| ----------- | ----------------------------------------- | +| Bus Voltage | Supply rail voltage | +| Current | Power consumption (mA) | +| Power | Calculated power (mW) | + +Useful for monitoring solar charging or battery health on remote nodes. + +## Configuring Telemetry + +1. Navigate to **Settings → Module Config → Telemetry**. +2. Set reporting intervals: + - **Device Metrics Interval** — how often to broadcast device metrics + - **Environment Metrics Interval** — how often to broadcast sensor data +3. Enable specific sensor types as needed. + +### Recommended Intervals + +| Use Case | Device (s) | Environment (s) | +| ------------------------------------------ | ----------------------------- | ---------------------------------- | +| Urban mesh (many nodes) | 3600 | 3600 | +| Rural mesh (few nodes) | 900 | 900 | +| Weather station | 900 | 300 | +| Battery conservation | 7200 | 7200 | + +> ⚠️ **Note:** Shorter intervals increase airtime usage and battery drain across the mesh. + +## Viewing Telemetry + +1. Navigate to **Nodes** and select a node. +2. Telemetry sections show on the detail screen: + - Device Metrics (always available) + - Environment Metrics (if sensors present) + - Power Metrics (if INA sensor present) +3. Historical graphs show trends over time. + +![Telemetry actions](/assets/screenshots/node-metrics_telemetric_actions.png) + +## Troubleshooting + +- **No environment data showing?** The remote node needs a physical sensor connected (e.g., BME280 on I2C). Device telemetry (battery, uptime) is always available, but environment metrics require hardware. +- **Stale readings?** Check the reporting interval — very long intervals (7200s+) mean data updates infrequently. Also verify the remote node is still online. +- **Sensor conflict on I2C bus?** Some sensors share I2C addresses. If you have multiple sensors on the same bus, check for address collisions in the radio's serial debug output. + +## Related Topics + +- [Node Metrics](node-metrics) — view telemetry data on the node detail screen +- [Settings — Modules & Admin](settings-module-admin) — telemetry module configuration +- [Units & Locale](units-and-locale) — temperature and pressure display units + +--- + diff --git a/docs/ca-rES/user/translate.md b/docs/ca-rES/user/translate.md new file mode 100644 index 000000000..b2ed79a34 --- /dev/null +++ b/docs/ca-rES/user/translate.md @@ -0,0 +1,97 @@ +--- +title: Translate the App +parent: User Guide +nav_order: 17 +last_updated: 2026-05-13 +aliases: + - translate + - crowdin + - localization +--- + +# Translate the App + +Contributing translations helps make Meshtastic accessible to a wider audience. The app uses [Crowdin](https://crowdin.com/) to manage community translations for both the user interface and in-app documentation. + +--- + +## What Gets Translated + +| Resource | Source Location | Notes | +| ----------------- | ------------------------------------- | ---------------------------------------------------------------------- | +| UI strings | `composeResources/values/strings.xml` | Buttons, labels, messages, and all user-visible text | +| User Guide pages | `docs/user/*.md` | In-app documentation shown in Help & Documentation | +| Fastlane metadata | `fastlane/metadata/android/en-US/` | App Store listing title, description, and changelogs | + +> **Note — Developer Guide pages are English-only.** Code-focused documentation targeting contributors is not translated. + +--- + +## How to Contribute + +1. **Visit the Crowdin project.** Open the [Meshtastic Android Crowdin project](https://crowdin.com/project/meshtastic-android) and sign in or create a free account. +2. **Choose your language.** Select an existing language or request a new one by opening a [GitHub issue](https://github.com/meshtastic/Meshtastic-Android/issues/new). +3. **Translate strings.** Crowdin shows the English source on the left and your translation on the right. Translate each string and save. +4. **Review context.** Many strings include screenshots or context comments — check these to understand where the text appears in the app. +5. **Submit.** Approved translations are automatically merged into the next release. + +> **Tip — Keep translations short.** UI strings often appear in buttons, chips, or narrow columns. If a translation is significantly longer than the English original, consider abbreviating where the meaning stays clear. + +--- + +## Adding a New Language + +If your language is not yet listed on Crowdin: + +1. Open an issue on [GitHub](https://github.com/meshtastic/Meshtastic-Android/issues/new) requesting the new locale. +2. A maintainer will add the language to Crowdin and configure `crowdin.yml`. +3. Once added, you can begin translating immediately. + +--- + +## How Translations Are Organized + +The Android app uses **Compose Multiplatform resources** for all user-visible strings: + +``` +core/resources/src/commonMain/composeResources/ +├── values/ ← English (default) +│ └── strings.xml +├── values-de/ ← German +│ └── strings.xml +├── values-fr/ ← French +│ └── strings.xml +└── ... +``` + +In-app documentation follows a similar pattern under `docs/`: + +``` +docs/ +├── user/ ← English source (default) +│ ├── onboarding.md +│ └── ... +├── fr/user/ ← French translations +│ ├── onboarding.md +│ └── ... +└── ... +``` + +The app automatically selects the correct locale based on your device's **Language & Region** settings. + +--- + +## Translation Guidelines + +- **Do not translate** technical terms like "LoRa", "MQTT", "BLE", "TAK", "SNR", or "RSSI" — these are universal. +- **Keep placeholders intact.** Strings like `%1$s` or `%d` are filled in at runtime. Do not remove or reorder them unless the grammar of your language requires it. +- **Match tone.** The app uses a friendly, direct voice. Avoid overly formal language. +- **Test if possible.** Switch your device language and open the app to see how translations look in context. + +--- + +## Questions? + +If you have questions about a specific string's context or need help getting started, open a discussion on the [Meshtastic GitHub Discussions](https://github.com/meshtastic/Meshtastic-Android/discussions) page. + +Thank you for helping expand the reach of Meshtastic! diff --git a/docs/ca-rES/user/units-and-locale.md b/docs/ca-rES/user/units-and-locale.md new file mode 100644 index 000000000..5f391111d --- /dev/null +++ b/docs/ca-rES/user/units-and-locale.md @@ -0,0 +1,118 @@ +--- +title: Units, Measurement & Locale +parent: User Guide +nav_order: 16 +last_updated: 2026-05-12 +--- + +# Units, Measurement & Locale + +The Meshtastic app automatically displays temperatures, distances, speeds, and times in the units your device is configured to use — no settings to change inside the app. + +--- + +## How It Works + +Meshtastic radios always transmit data in **metric units** (meters, °C, km/h, hPa, etc.). When the app receives this data, it uses the `MetricFormatter` utility to convert and display values in whatever unit system your device's locale specifies. + +On Android, your measurement preferences are determined by your system **Language & Region** settings. On Desktop (JVM), the app uses the JVM's default `Locale`. + +> **Tip — You never need to toggle units inside the app.** Change your system measurement preferences and every screen in Meshtastic updates automatically — node details, telemetry charts, weather, altitude, and more. + +--- + +## Temperature + +Temperature values from environment sensors are transmitted as **°C** and displayed based on your device's temperature unit preference. + +![Environment metrics with temperature](/assets/screenshots/nodes_environment_metrics.png) + +| Your Setting | You See | +| ------------ | ------- | +| Celsius | 22°C | +| Fahrenheit | 72°F | + +This affects all temperature displays throughout the app: node environment telemetry, soil temperature, dew point, and telemetry chart axes. + +## Distance & Altitude + +Distances between nodes and GPS altitudes are transmitted as **meters** and automatically scaled and converted. + +![Distance info display](/assets/screenshots/nodes_distance_info.png) + +| Your Setting | Small Distance | Large Distance | Altitude | +| -------------------------------- | -------------- | ---------------------- | -------- | +| Metric | 350 m | 2.5 km | 1,200 m | +| Imperial (US) | 1,148 ft | 1.6 mi | 3,937 ft | + +The app uses natural scaling — short distances stay in meters or feet, while longer distances switch to kilometres or miles automatically. + +### Where these appear + +- **Node list** — distance and bearing to each node +- **Node detail** — altitude, distance from your position +- **Map** — waypoint distances, traceroute hop distances +- **Compass** — distance to selected node + +## Speed + +GPS ground speed is displayed in your locale's preferred speed unit. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Metric | 12 km/h | +| Imperial (US) | 7 mph | + +## Wind + +Wind speed and gust data from environment sensors are transmitted as **m/s** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Metric | 5 m/s | +| Imperial (US) | 11 mph | + +Wind readings appear in the **Node Detail** environment section and the **Environment Telemetry** charts. + +## Rainfall + +Rainfall measurements (1-hour and 24-hour totals) are transmitted as **mm** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ---------------------- | +| Metric | 12 mm | +| Imperial (US) | 0.5 in | + +## Units That Never Change + +Some units are international standards and are displayed the same way regardless of your locale: + +| Measurement | Unit | Why | +| -------------------------------- | ------------------------------ | ------------------------------------- | +| Barometric pressure | hPa | International meteorological standard | +| Heading / bearing | ° (degrees) | Universal navigation convention | +| Radiation | μR/hr | Standard dosimetry unit | +| GPS coordinates | decimal degrees | Universal geographic standard | +| Humidity, battery, soil moisture | % | Universal | + +## Date & Time + +All timestamps throughout the app — last heard, message times, telemetry logs, chart axes — follow your device's date and time preferences. + +| Setting | What It Controls | Example | +| ---------------- | ---------------- | ------------------------------------------------ | +| **24-Hour Time** | Clock format | 14:30 vs 2:30 PM | +| **Date Format** | Date ordering | 09/05/2026 vs 05/09/2026 | + +The app also uses **relative time** where it makes sense — for example, "5 min ago" or "2 hours ago" in the node list — which is automatically localised into your device language. + +## Changing Your Measurement System (Android) + +On Android, your measurement system (metric vs imperial) is tied to your region setting: + +1. Open **Android Settings → System → Language & Region** +2. Change your **Region** or **Measurement units** preference +3. Return to Meshtastic — values update immediately + +> **Tip — The app uses `MetricFormatter` from `core:common`.** All measurement formatting is handled by a shared KMP utility that respects your platform's locale. Developers adding new measurement displays should use `MetricFormatter` rather than hard-coding unit conversions. + diff --git a/docs/cs-rCZ/index.md b/docs/cs-rCZ/index.md new file mode 100644 index 000000000..99b032289 --- /dev/null +++ b/docs/cs-rCZ/index.md @@ -0,0 +1,30 @@ +--- +title: Home +layout: default +nav_order: 0 +--- + +# Meshtastic Android App Documentation + +User and developer documentation for the Meshtastic Android, Desktop, and iOS applications powered by KMP (Kotlin Multiplatform). + +Use the sidebar navigation to browse the **User Guide** for app features and the **Developer Guide** for contributing to the project. + +--- + +## Quick Links + +| Guide | Popis | +| --------------------------------------------------------------------- | -------------------------------------------------------------- | +| [Getting Started](user/onboarding) | Connect your first radio and send a message | +| [Messages & Channels](user/messages-and-channels) | Channel broadcasts, direct messages, reactions, and encryption | +| [Nodes](user/nodes) | Understanding the mesh network node list | +| [Signal Meter](user/signal-meter) | How the LoRa signal quality meter works | +| [Units & Locale](user/units-and-locale) | How temperatures, distances, and times adapt to your region | +| [Desktop App](user/desktop) | Linux, macOS, and Windows desktop usage | +| [Architecture](developer/architecture) | App architecture overview for contributors | +| [Contributing](developer/contributing) | Branch naming, PR workflow, and verification commands | + +--- + +> This documentation is served from the same markdown source that powers the in-app **Help & Documentation** browser. diff --git a/docs/cs-rCZ/user/connections.md b/docs/cs-rCZ/user/connections.md new file mode 100644 index 000000000..626d041ac --- /dev/null +++ b/docs/cs-rCZ/user/connections.md @@ -0,0 +1,125 @@ +--- +title: Připojení +nav_order: 2 +last_updated: 2026-05-13 +description: Connect your phone or desktop to a Meshtastic radio via Bluetooth, USB, or TCP/IP. +aliases: + - bluetooth + - usb + - tcp + - pairing +--- + +# Připojení + +Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node. + +## Bluetooth (BLE) + +Bluetooth Low Energy is the default and most common connection method on Android. + +### Pairing a Device + +1. Ensure your Meshtastic radio is powered on and in pairing mode. +2. Open the app and navigate to **Connections**. +3. Tap **Scan for Devices** — nearby Meshtastic radios will appear. +4. Select your device from the list. +5. Accept the Bluetooth pairing prompt if shown. + +![Device list item](/assets/screenshots/connections_bluetooth_scan.png) + +You can filter devices by transport type using the filter chips at the top: + +![Transport filter chips](/assets/screenshots/connections_transport_filters.png) + +> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. + +### Connection Status + +| Icon | State | Popis | +| ---- | -------------- | ----------------------------- | +| 🟢 | Připojeno | Active radio link established | +| 🟡 | Připojování | Handshake in progress | +| 🔴 | Odpojeno | No active connection | +| ⚪ | Not configured | Není vybráno žádné zařízení | + +When connecting, a status indicator shows the current connection state: + +![Connecting status](/assets/screenshots/connections_connecting.png) + +If no devices are found, the app shows an empty state with instructions: + +![No devices found](/assets/screenshots/connections_empty_state.png) + +### Troubleshooting Bluetooth + +- **Device not found:** Toggle Bluetooth off/on, ensure location is enabled. +- **Connection drops:** Move closer to the radio; check for interference. +- **Pairing rejected:** Forget the device in Android Bluetooth settings and retry. + +## USB Serial + +USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable. + +### Setup + +1. Connect your radio via USB cable to your device. +2. The app will prompt for USB permission — tap **Allow**. +3. The connection is established automatically. + +> ⚠️ **Note:** USB connections require OTG support on Android devices. + +## TCP/IP (WiFi) + +Some Meshtastic radios support WiFi connectivity, allowing TCP-based connections. + +### Nastavení + +1. Connect your radio to a WiFi network via the radio's web interface or settings. +2. In the app, go to **Connections → TCP**. +3. Enter the radio's IP address and port (default: 4403). +4. Tap **Connect**. + +![WiFi scanning for devices](/assets/screenshots/connections_wifi_scanning.png) + +When a device is found, it appears in the connection list: + +![WiFi device found](/assets/screenshots/connections_wifi_device_found.png) + +A successful connection is confirmed with a status indicator: + +![WiFi connection success](/assets/screenshots/connections_wifi_success.png) + +### When to Use TCP + +- Radio is on the same local network +- Testing with a simulated radio +- Environments where Bluetooth has interference issues + +## Reconnection Behavior + +The app reconnects to the **last selected device** on startup. You can manually switch transports from the connections screen at any time. + +To disconnect from a radio, use the disconnect button on the connections screen: + +![Disconnect from radio](/assets/screenshots/connections_disconnect.png) + +## Desktop Connections + +On Desktop (Linux/macOS/Windows), the app supports: + +- **Bluetooth (BLE)** — via the Kable library; works on macOS, Linux, and Windows +- **USB Serial** — primary wired connection method +- **TCP/IP** — for network-connected radios + +See [Desktop App](desktop) for platform-specific details and keyboard shortcuts. + +## Related Topics + +- [Getting Started](onboarding) — first-launch setup and permissions +- [Settings — Radio & User](settings-radio-user) — Bluetooth and network configuration +- [Desktop App](desktop) — desktop-specific connection details +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — full list of compatible radios on meshtastic.org + +--- + diff --git a/docs/cs-rCZ/user/desktop.md b/docs/cs-rCZ/user/desktop.md new file mode 100644 index 000000000..dee774ea9 --- /dev/null +++ b/docs/cs-rCZ/user/desktop.md @@ -0,0 +1,147 @@ +--- +title: Desktop App +nav_order: 14 +last_updated: 2026-05-13 +description: Install and use the Meshtastic Desktop app on Linux, macOS, and Windows — connections, feature parity, and keyboard shortcuts. +aliases: + - desktop + - linux + - macos + - windows + - jvm +--- + +# Desktop App + +The Meshtastic Desktop application provides the same mesh communication features on Linux, macOS, and Windows. + +## Overview + +The Desktop app shares its core codebase with the Android app through Kotlin Multiplatform (KMP). Most features work identically across platforms. + +## Installation + +### Linux + +- Download the `.deb` or `.AppImage` package from the releases page +- Or build from source using `./gradlew :desktopApp:run` + +### macOS + +- Download the `.dmg` package from releases +- Or build from source + +### Windows + +- Download the `.msi` installer from releases +- Or build from source + +## Connecting Your Radio + +### USB Serial (Primary) + +The most reliable connection method on Desktop: + +1. Connect your Meshtastic radio via USB cable. +2. The app should detect the serial port automatically. +3. If not detected, select the correct serial port from the connections menu. + +### TCP/IP + +For network-connected radios: + +1. Enter the radio's IP address and port (default: 4403). +2. Click **Connect**. + +### Bluetooth (BLE) + +Bluetooth Low Energy is supported on Desktop via the [Kable](https://github.com/JuulLabs/kable) library: + +1. Ensure your system has a Bluetooth adapter. +2. The app scans for nearby Meshtastic radios automatically. +3. Select your device from the connections screen. + +## Feature Parity + +| Feature | Android | Desktop | Poznámka | +| ---------------------------------------- | ------- | ------- | -------------------------- | +| Messaging | ✓ | ✓ | Full parity | +| Node List | ✓ | ✓ | Full parity | +| Mapa | ✓ | ✓ | Full parity | +| Nastavení | ✓ | ✓ | Full parity | +| Bluetooth (BLE) | ✓ | ✓ | Via Kable on desktop | +| Firmware Update OTA | ✓ | ✗ | Use web flasher | +| Notifications | ✓ | ✓ | Native OS notifications | +| Widgets | ✓ | ✗ | Android-only | +| AI Assistant (Chirpy) | ✓\* | ✗ | Google flavor Android only | + +\*Chirpy AI requires Android 14+ on Google flavor builds with supported hardware. + +## UI Differences + +The Desktop app uses the same Compose Multiplatform UI with adaptations for larger screens and desktop interaction. + +### Keyboard Shortcuts + +| Shortcut | Action | +| ------------------- | --------------------------- | +| **⌘Q** / **Ctrl+Q** | Quit the application | +| **⌘,** / **Ctrl+,** | Open Settings | +| **⌘1** / **Ctrl+1** | Switch to Conversations tab | +| **⌘2** / **Ctrl+2** | Switch to Nodes tab | +| **⌘3** / **Ctrl+3** | Switch to Map tab | +| **⌘4** / **Ctrl+4** | Switch to Connections tab | + +### Window & System Tray + +- **Window resizing** — responsive layout adapts to window dimensions +- **System tray** — minimize to system tray for background mesh operation +- **Tray menu** — right-click the tray icon to show window or quit +- **Mouse interaction** — hover states and standard desktop navigation + +### Notification Preferences + +The Desktop app provides in-app toggles for controlling which notifications are shown — messages, new nodes, and low battery alerts. Access these from **Settings → Notifications** within the app. + +## Built-in Documentation Browser + +The Desktop app includes a built-in documentation browser for quick access to help content without leaving the application. + +![Docs browser with table of contents](/assets/screenshots/docs-browser_toc.png) + +The browser supports full-text search across all documentation: + +![Searching the docs browser](/assets/screenshots/docs-browser_search.png) + +Individual doc pages render with full formatting: + +![A documentation page](/assets/screenshots/docs-browser_page.png) + +## Building from Source + +```bash +git clone https://github.com/meshtastic/Meshtastic-Android.git +cd Meshtastic-Android +git submodule update --init +./gradlew :desktopApp:run +``` + +Požadavky: + +- JDK 21 +- No Android SDK required for desktop-only builds + +## Known Limitations + +- No OTA firmware updates (use web flasher) +- Some Android-specific features (widgets, specific notification channels) are unavailable +- Performance may vary on low-spec hardware running Compose Desktop +- BLE bonding is not yet supported on desktop (pairing works without bonding) + +## Related Topics + +- [Connections](connections) — connection methods overview +- [Firmware Updates](firmware) — use the [Web Flasher](https://flasher.meshtastic.org) for desktop firmware updates + +--- + diff --git a/docs/cs-rCZ/user/discovery.md b/docs/cs-rCZ/user/discovery.md new file mode 100644 index 000000000..73069965e --- /dev/null +++ b/docs/cs-rCZ/user/discovery.md @@ -0,0 +1,114 @@ +--- +title: Objevujte +nav_order: 12 +last_updated: 2026-05-13 +description: Explore your mesh network — traceroute paths, neighbor maps, and node discovery tools. +aliases: + - mesh-discovery + - local-discovery + - network-scan + - traceroute + - neighbor-info +--- + +# Objevujte + +Discovery tools help you understand **how** your mesh network is connected — which nodes can hear each other, what paths messages take, and where bottlenecks or weak links exist. + +> 💡 **Tip:** You don't need a dedicated "discovery mode" to start exploring your mesh. The tools below are available right now from the node list and node detail screens. + +--- + +## Traceroute + +Traceroute reveals the exact path a message takes from your node to any other node on the mesh. It's the single most useful tool for debugging connectivity problems. + +### Running a Traceroute + +1. Navigate to **Nodes** and tap the node you want to trace. +2. On the node detail screen, tap **Traceroute**. +3. The app sends a traceroute request and waits for the response. +4. Results display each hop in order, with signal quality at every step. + +### Reading the Results + +A traceroute result looks like this: + +``` +You → Node A (SNR: 8.5, RSSI: -95) → Node B (SNR: 5.2, RSSI: -108) → Target +``` + +Each hop represents a relay node that forwarded the message. The SNR and RSSI values at each hop tell you about the link quality on that specific segment. + +| What to look for | What it means | +| -------------------------------------------------------------------------- | --------------------------------------------------------------------------- | +| All hops show Good SNR (> 5 dB) | Healthy path — messages flow reliably | +| One hop shows Bad SNR (< 0 dB) | Weak link — this relay segment is fragile | +| Many hops (4+) | Long path — consider repositioning a node to shorten it | +| Different path on retry | Mesh is adapting — multiple routes exist (this is good!) | + +> 💡 **Tip:** Run traceroute several times over a few minutes. If the path changes, your mesh has redundant routes — a sign of a well-connected network. + +### Troubleshooting with Traceroute + +- **"No route found"** — The target node may be offline, out of range, or on a different channel. Check that both nodes share at least one channel with the same encryption key. +- **Traceroute times out** — The path may be too long (exceeds hop limit) or a relay node is congested. Try increasing the hop limit in **Settings → LoRa Config**. +- **Asymmetric paths** — A traceroute from A→B may take a different path than B→A. This is normal — radio propagation is not always symmetric. + +--- + +## Informace o sousedech + +The Neighbor Info module lets each node broadcast a list of the nodes it can **directly hear** (single-hop). When multiple nodes share their neighbor lists, you can piece together a topology map of the entire mesh. + +### Enabling Neighbor Info + +1. Navigate to **Settings → Module Config → Neighbor Info**. +2. Enable the module. +3. Set the broadcast interval (default: 900 seconds / 15 minutes). + +Once enabled, your node periodically broadcasts its neighbor table. Other nodes with Neighbor Info enabled do the same. + +### Viewing Neighbor Data + +- Open any node's detail screen and look for the **Neighbors** section. +- Each neighbor entry shows the node that was directly heard and its signal quality. +- Combine neighbor data from multiple nodes to understand the full mesh topology. + +> ⚠️ **Note:** Neighbor Info increases airtime usage because every enabled node periodically broadcasts its neighbor list. On busy meshes with many nodes, consider longer broadcast intervals (3600 seconds or more) to avoid congestion. + +--- + +## Node List as a Discovery Tool + +The node list itself is a powerful discovery tool when you use its filtering and sorting features effectively. + +### Finding New Nodes + +- Sort by **Last heard** to see the most recently active nodes at the top. +- Enable **Include unknown** to see nodes that have appeared on the mesh but haven't sent user info yet — these are often newly powered-on devices. + +### Assessing Connectivity + +- Sort by **Hops away** to see which nodes are directly reachable (0 hops) versus relayed. +- Sort by **Distance** to find nearby nodes and verify they're reachable. +- Use **Exclude MQTT** to focus on nodes reachable over radio (not via internet bridge). + +### Infrastructure Audit + +- Disable **Exclude infrastructure** to see Router, Repeater, Router Late, and Client Base nodes. +- Check their signal quality and last-heard times to verify your infrastructure nodes are healthy. + +See [Nodes](nodes) for full details on filtering and sorting options. + +--- + +## Tips for Mesh Exploration + +- **Start with traceroute** — it gives you immediate, actionable information about a specific path. +- **Enable Neighbor Info on key nodes** — especially routers and repeaters, to build a picture of the backbone. +- **Check the map** — node positions on the [Map](map-and-waypoints) combined with signal data help you understand why some links are strong and others are weak. +- **Compare signal over time** — use the [Signal Meter](signal-meter) guide to interpret SNR and RSSI values correctly. + +--- + diff --git a/docs/cs-rCZ/user/firmware.md b/docs/cs-rCZ/user/firmware.md new file mode 100644 index 000000000..643c4aff3 --- /dev/null +++ b/docs/cs-rCZ/user/firmware.md @@ -0,0 +1,114 @@ +--- +title: Firmware Updates +nav_order: 13 +last_updated: 2026-05-13 +description: Update your radio firmware over Bluetooth — OTA process, version channels, pre-flight checks, and recovery. +aliases: + - firmware + - update + - ota + - flash +--- + +# Firmware Updates + +Keep your Meshtastic radio up to date with the latest firmware for new features, bug fixes, and security improvements. + +## Checking for Updates + +1. Navigate to **Settings → Firmware Update** or tap the firmware notification if shown. +2. The app checks for available firmware versions. +3. Available updates show the version number and changelog summary. + +## Update Methods + +### OTA (Over-The-Air) via Bluetooth + +The most common update method for Android users: + +1. Ensure your radio is connected via Bluetooth. +2. Navigate to the Firmware Update screen. +3. Select the desired firmware version. +4. Tap **Update** to begin the OTA process. +5. Wait for the update to complete — **do not disconnect** during the update. + +![Firmware checking for updates](/assets/screenshots/firmware_checking.png) + +> ⚠️ **Warning:** Interrupting a firmware update can brick your device. Ensure your radio has sufficient battery (>50% recommended) and maintain Bluetooth proximity during the entire process. + +![Firmware disclaimer](/assets/screenshots/firmware_disclaimer.png) + +### USB Flashing + +For recovery or when OTA is unavailable: + +- Use the [Meshtastic Web Flasher](https://flasher.meshtastic.org) +- Or the [Meshtastic CLI tool](https://meshtastic.org/docs/getting-started/flashing-firmware) on desktop + +## Version Channels + +| Kanál | Popis | +| -------- | ------------------------------------------- | +| Stabilní | Recommended for most users; tested releases | +| Alfa | Preview releases; may contain bugs | + +## Pre-Update Checklist + +Before updating: + +- [ ] Battery > 50% +- [ ] Stable Bluetooth connection +- [ ] Note your current settings (they may reset on major version changes) +- [ ] Check the release notes for breaking changes + +## Post-Update + +After a successful update: + +- The radio will reboot automatically +- Bluetooth connection will re-establish +- Verify your settings are intact +- Check the firmware version in **Settings → About** + +![Firmware update success](/assets/screenshots/firmware_success.png) + +## Troubleshooting + +### Update Stuck + +If the update appears frozen: + +- Wait at least 5 minutes before intervening +- If truly stuck, power-cycle the radio +- Attempt the update again + +![Firmware update error](/assets/screenshots/firmware_error.png) + +### Device Won't Boot After Update + +If your device fails to boot: + +1. Try connecting via USB to a computer +2. Use the web flasher in recovery/DFU mode +3. Flash a known-good firmware version +4. Check the Meshtastic Discord for device-specific recovery steps + +### Compatibility Warnings + +The app may show warnings when: + +- Connected radio firmware is below minimum supported version +- Major version mismatch between app and firmware +- Deprecated features need migration + +> ⚠️ **Important:** Always update the Meshtastic app before or alongside firmware updates to ensure compatibility. + +## Related Topics + +- [Connections](connections) — reconnecting after a firmware update +- [Flashing firmware guide](https://meshtastic.org/docs/getting-started/flashing-firmware) — full firmware flashing walkthrough on meshtastic.org +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — check firmware compatibility by device +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/cs-rCZ/user/map-and-waypoints.md b/docs/cs-rCZ/user/map-and-waypoints.md new file mode 100644 index 000000000..d69d82a54 --- /dev/null +++ b/docs/cs-rCZ/user/map-and-waypoints.md @@ -0,0 +1,116 @@ +--- +title: Map & Waypoints +nav_order: 6 +last_updated: 2026-05-13 +description: View node positions on the map, create and share waypoints, and manage position sharing and privacy. +aliases: + - map + - waypoints + - gps + - location +--- + +# Map & Waypoints + +The Map screen shows the geographic positions of nodes on your mesh, along with shared waypoints. + +## Map View + +The map displays: + +- **Node positions** — colored markers for each node reporting location +- **Waypoints** — shared points of interest +- **Your position** — your current GPS location + +### Node Markers + +Node markers on the map indicate: + +| Color | Meaning | +| ------ | ---------------------------------------------- | +| Zelená | Online (heard recently) | +| Yellow | Away (heard within 2 hours) | +| Gray | Offline (stale position) | +| Modrá | Your own node | + +### Map Controls + +- **Zoom** — pinch or use +/- buttons +- **Pan** — drag to explore +- **Center** — select the location button to center on your position +- **Node tap** — tap a node marker to view details + +The floating toolbar provides quick access to compass, layer switching, node filters, refresh, and location tracking. Tap the compass to reorient north-up, or tap the location button to center on your current position. + +![Map controls overlay](/assets/screenshots/map_controls_overlay.png) + +## Waypoints + +Waypoints are shared geographic points of interest that all mesh members can see. + +### Creating a Waypoint + +1. Long-press on the map at the desired location. +2. Enter a name and optional description. +3. Choose an icon/emoji for the waypoint. +4. Tap **Send** to share with the mesh. + +### Waypoint Properties + +| Property | Popis | +| ---------- | ------------------------------------------------------- | +| Jméno | Short identifier (max 30 characters) | +| Popis | Optional longer description | +| Icon | Visual marker emoji on the map | +| Uzamknout | If locked, only the creator can edit or delete | +| Expiration | Optional auto-remove time | + +### Waypoint Expiration + +Waypoints can be set to expire automatically: + +- **Never** (default) — waypoint remains until manually deleted +- **Timed** — waypoint is automatically removed after the specified duration (e.g., "remove after 2 hours"). Useful for temporary markers like rally points, hazards, or meeting locations. + +Expired waypoints are automatically hidden from the map so they don't clutter the display. The expiration countdown begins when the waypoint is created, not when other nodes receive it. + +### Managing Waypoints + +- Tap a waypoint on the map to view its details and coordinates +- Edit or delete waypoints you created +- **Locked waypoints** cannot be modified or deleted by other nodes — only the original creator can change them +- Unlocked waypoints can be edited by any mesh member + +## Position Sharing + +### Enabling Position Sharing + +Your node shares its GPS position based on: + +- **Fixed interval** — broadcast position at regular intervals +- **Smart position** — broadcast when movement exceeds a threshold +- **Manual** — only share when explicitly requested + +Configure position behavior in **Settings → Position**. + +### Privacy Considerations + +> 🔒 **Privacy:** Position data is broadcast to all nodes on your channel. If you don't want your location shared, disable GPS position in settings or use a fixed/fake position. + +## Map Sources + +The app supports multiple map tile sources: + +- OpenStreetMap (default) +- Satellite imagery (where available) +- Offline tiles (download map areas for offline use) + +## Related Topics + +- [Nodes](nodes) — view and filter your node list +- [Node Metrics](node-metrics) — signal quality and position history for individual nodes +- [Discovery](discovery) — traceroute and neighbor info for understanding mesh topology +- [Units & Locale](units-and-locale) — distance and coordinate display formats + +--- + diff --git a/docs/cs-rCZ/user/messages-and-channels.md b/docs/cs-rCZ/user/messages-and-channels.md new file mode 100644 index 000000000..55992c626 --- /dev/null +++ b/docs/cs-rCZ/user/messages-and-channels.md @@ -0,0 +1,159 @@ +--- +title: Messages & Channels +nav_order: 3 +last_updated: 2026-05-13 +description: Send and receive messages, manage channels, configure encryption, and use quick chat, reactions, and message actions. +aliases: + - channels + - direct-messages + - messaging + - conversations +--- + +# Messages & Channels + +Meshtastic supports two communication modes: **channel broadcasts** and **direct messages**. + +## Kanály + +Channels are shared communication groups. All nodes configured with the same channel key can read and send messages on that channel. + +### Default Channel + +Every Meshtastic device comes with a default **LongFast** channel. This is an unencrypted channel used for general mesh communication. + +### Zabezpečení kanálu + +Channels support multiple encryption levels: + +| Icon | Security Level | Popis | +| ---- | ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------- | +| 🔒 | PSK (256-bit AES) | Fully encrypted with a strong pre-shared key. Only nodes with the matching key can read messages. | +| 🔐 | PSK (128-bit AES) | Encrypted with a shorter key. Secure for most uses but 256-bit is preferred for sensitive data. | +| 🔓 | Default / Open | Uses the well-known default key. **Any Meshtastic device** on the same preset can read these messages. | +| ⚠️ | Insecure + Position | Open channel that also broadcasts your GPS position. Use with caution in public meshes. | + +> 🔒 **Security Tip:** 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. + +### Adding a Channel + +1. Navigate to **Settings → Channels**. +2. Tap **Add Channel** or scan a QR code. +3. Configure the channel name and encryption key. +4. Share the channel URL/QR code with others who need access. + +Tapping a channel shows its details and sharing options. + +## Direct Messages + +Direct messages (DMs) are point-to-point encrypted communications between two specific nodes. + +### Sending a Direct Message + +1. Open the **Messages** tab. +2. Select a node from your contacts list or tap a node in the node list. +3. Type your message and tap **Send**. + +### Message States + +| State | Icon | Meaning | +| --------------------------------- | ---- | ----------------------------------------------------------------------------------------------------------------- | +| Queued | ⏳ | Message waiting to be sent | +| En route | ✓ | Delivered to the radio, awaiting acknowledgment | +| Delivered | ✓✓ | Acknowledgment received from recipient | +| Received | ✓ | Message received from the mesh (incoming) | +| S&F Routing | 🔗 | Store & Forward: message being routed through an S&F node | +| S&F Confirmed | 🔗 | Store & Forward: delivery confirmed via S&F node | +| Chyba | ✗ | Delivery failed after retries | + +### Delivery Errors + +When a message fails to deliver, the error indicator shows what went wrong: + +| Chyba | Meaning | What to Do | +| ------------------- | ---------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| No Route | No path exists to the destination node | The recipient may be offline or out of mesh range. Try later or move closer. | +| Got NAK | The next-hop node refused to relay | The relay node may be congested. Wait and retry. | +| Vypršel čas spojení | No acknowledgment within retry window | The recipient may be just out of range. Try increasing hop limit or moving to a better position. | +| Žádné rozhraní | No radio interface available to send | Check that your radio is connected and the channel is configured. | +| Max Retransmit | All retry attempts exhausted | The mesh path is unreliable. Try a different channel or wait for conditions to improve. | +| Žádný kanál | The destination channel doesn't exist | Verify both nodes share the same channel configuration. | +| Too Large | Message exceeds maximum payload size | Shorten your message (max ~230 characters). | +| Žádná odpověď | Node received message but didn't respond | The recipient's radio may be busy or in low-power sleep mode. | +| Duty Cycle Limit | Regional airtime limit reached | Your radio has used its allowed transmit time. Wait for the duty cycle window to reset (typically 1 hour in EU regions). | +| Špatný požadavek | Malformed or invalid message | This usually indicates a software bug. Try restarting the app. | + +> 💡 **Tip:** 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. + +## Message Features + +### Quick Chat + +Pre-configured messages for rapid communication: + +- Access via the Quick Chat button in the message input area +- Choose from built-in phrases or custom messages +- Customize quick chat messages in **Settings → Quick Chat** +- Useful when typing is impractical (gloves, small screen, urgent) + +![Quick chat option](/assets/screenshots/messages_quick_chat.png) + +The channel list shows each channel with its latest message preview. + +### Message Bubbles + +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. + +### Reactions + +React to messages with emoji: + +- **Long-press** a message to open the actions menu +- Tap **Add Reaction** to choose an emoji +- Reactions appear below the message bubble +- Multiple users can react to the same message +- React to your own messages or others' messages + +![Emoji reaction badges displayed beneath a message](/assets/screenshots/messages_reaction.png) + +> 💡 **Tip:** Reactions are lightweight — they use minimal mesh bandwidth compared to full text messages. + +### Message Actions + +Long-press any message to access: + +- **Copy** — copy message text to clipboard +- **Reply** — quote the message in your response +- **React** — add an emoji reaction +- **Delete** — remove a message you sent (local deletion) + +### Message Priority + +Messages are queued and transmitted based on priority: + +1. Emergency/alert messages (highest) +2. Direct messages +3. Channel broadcasts (lowest) + +### Message Limits + +- **Maximum length:** 237 bytes (approximately 230 characters for ASCII text) +- **Rate limiting:** The mesh enforces airtime fairness; heavy message volume may be throttled +- **Delivery:** Messages are retried automatically if no acknowledgment is received + +## Best Practices + +- Use channels for group coordination +- Use direct messages for private person-to-person communication +- Keep messages short — mesh bandwidth is limited +- Configure encryption for sensitive communications + +## Related Topics + +- [Nodes](nodes) — tap a node to start a direct message +- [Settings — Radio & User](settings-radio-user) — configure channel encryption and presets +- [MQTT](mqtt) — bridge channel messages to the internet +- [Channel configuration](https://meshtastic.org/docs/configuration/radio/channels) — detailed channel settings on meshtastic.org + +--- + diff --git a/docs/cs-rCZ/user/mqtt.md b/docs/cs-rCZ/user/mqtt.md new file mode 100644 index 000000000..22399976f --- /dev/null +++ b/docs/cs-rCZ/user/mqtt.md @@ -0,0 +1,137 @@ +--- +title: MQTT +nav_order: 11 +last_updated: 2026-05-13 +description: Bridge your mesh to the internet — MQTT broker setup, encryption layers, and map reporting. +aliases: + - mqtt + - internet-bridge + - broker +--- + +# MQTT + +MQTT bridges your Meshtastic mesh network to the internet, enabling long-range communication beyond radio range. + +## Overview + +The MQTT module connects your node to an MQTT broker, allowing: + +- Messages to reach nodes on different physical meshes via the internet +- Integration with home automation and monitoring systems +- Publishing node positions to the public Meshtastic map +- Custom data pipelines for logging and alerting + +## How It Works + +``` +[Your Node] → Radio → [Gateway Node with WiFi] → MQTT Broker → [Remote Gateway] → Radio → [Remote Node] +``` + +A gateway node with internet access (WiFi or Ethernet) publishes mesh messages to an MQTT topic. Remote gateways subscribed to the same topic inject those messages into their local mesh. + +## Nastavení + +### Enabling MQTT + +1. Navigate to **Settings → Module Config → MQTT**. +2. Enable the MQTT module. +3. Configure the broker connection: + +![MQTT toggle switch](/assets/screenshots/settings_switch.png) + +| Nastavení | Popis | Výchozí | +| ----------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------- | +| Adresa serveru | MQTT broker hostname | mqtt.meshtastic.org | +| Uživatelské jméno | Broker authentication | meshdev | +| Heslo | Broker authentication | large4cats | +| Kořenové téma | Base topic for messages | msh | +| Encryption | Encrypt MQTT payload | Povoleno | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON packet support has been removed from firmware; this field is ignored | Disabled | +| TLS | Secure connection to broker | Disabled | +| Map Reporting | Report position to public map | Disabled | + +### Default Meshtastic Broker + +The community maintains a public broker at `mqtt.meshtastic.org`. This is intended for general use and testing. + +> 🔒 **Privacy:** Messages on the public broker are readable by anyone subscribed. Always use channel encryption for private communications. + +### Private Broker + +For better privacy and control, you can run your own MQTT broker: + +- Mosquitto (lightweight, open-source) +- HiveMQ +- EMQX + +Configure your node to point to your private broker with appropriate credentials. + +## Map Reporting + +When Map Reporting is enabled, your node publishes its position to the Meshtastic community map: + +- Visible at [meshmap.net](https://meshmap.net) and similar community map services +- Only position and node info are shared +- Disable this if you don't want your location publicly visible + +## Uplink vs Downlink + +| Direction | Popis | +| ------------ | -------------------------------- | +| **Uplink** | Messages from mesh → MQTT broker | +| **Downlink** | Messages from MQTT broker → mesh | + +Configure per-channel which directions are active to control message flow and airtime usage. + +## Message Formats + +MQTT uses protobuf message format: + +| Format | Popis | Use case | +| ------------ | ----------------------------------- | -------------------------- | +| **Protobuf** | Binary Meshtastic protobuf encoding | Node-to-node mesh bridging | + +> ⚠️ **Note:** JSON output support was removed from firmware. The `json_enabled` setting is still visible in the app for legacy compatibility but has no effect on current firmware versions. + +## Encryption & Privacy + +Understanding the layered encryption model: + +1. **Channel encryption** happens on the mesh _before_ MQTT. If your channel has a PSK, the MQTT payload is already encrypted — the broker and any subscribers see only the ciphertext. +2. **MQTT encryption** (the module setting) adds an additional encryption layer for transit to the broker. This protects metadata and routing information. +3. **TLS** encrypts the TCP connection to the broker itself, preventing network-level eavesdropping. + +> 🔒 **Important:** The default public channel has a well-known key. Messages on the default channel sent via MQTT are effectively **unencrypted** — anyone can decode them. Always use a custom PSK for private communications. + +## Best Practices + +- Use channel-level encryption (PSK) on channels that bridge to MQTT +- Don't enable MQTT on nodes without internet access (it will buffer and waste memory) +- Use a private broker for sensitive deployments +- Be mindful of airtime when downlinking messages from busy MQTT topics — every downlinked message consumes radio airtime on your local mesh +- Consider enabling uplink-only if you only need to monitor your mesh remotely without injecting messages back + +## Troubleshooting + +### MQTT Not Connecting + +- **Check WiFi** — the gateway node must have an active internet connection (WiFi or Ethernet). MQTT does not work over the LoRa radio link itself. +- **Verify credentials** — incorrect username or password will silently fail on most brokers. Double-check for trailing spaces. +- **Firewall** — port 1883 (MQTT) or 8883 (MQTT+TLS) must be open. Some networks block non-standard ports. +- **DNS resolution** — if using a custom broker hostname, verify the node can resolve it. Try the broker's IP address directly. + +### Messages Not Bridging + +- **Check uplink/downlink settings** — if only uplink is enabled, messages flow from mesh to MQTT but not back. Enable downlink on the receiving gateway. +- **Channel mismatch** — both gateways must share the same channel with the same PSK. A mismatch means messages are encrypted with different keys and appear as garbage. +- **Topic mismatch** — ensure both gateways use the same root topic. The default `msh` works for the public broker. + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — MQTT module configuration reference +- [Messages & Channels](messages-and-channels) — channel encryption and PSK setup +- [MQTT integration guide](https://meshtastic.org/docs/software/integrations/mqtt) — detailed MQTT documentation on meshtastic.org + +--- + diff --git a/docs/cs-rCZ/user/node-metrics.md b/docs/cs-rCZ/user/node-metrics.md new file mode 100644 index 000000000..33e4dbc65 --- /dev/null +++ b/docs/cs-rCZ/user/node-metrics.md @@ -0,0 +1,130 @@ +--- +title: Node Metrics +nav_order: 5 +last_updated: 2026-05-13 +description: Telemetry dashboards for each mesh node — device health, environment sensors, signal quality, power, traceroute, and position history. +aliases: + - metrics + - telemetry + - device-metrics + - signal +--- + +# Node Metrics + +The node detail screen provides comprehensive telemetry and metrics for each node on your mesh. + +## Metriky zařízení + +Basic operating information reported by each node: + +| Metrický | Popis | +| -------------- | ----------------------------------- | +| Battery Level | Current battery percentage | +| Napětí | Battery voltage reading | +| Využití kanálu | Percentage of airtime consumed | +| Airtime | Transmission time used by this node | +| Doba provozu | Time since last reboot | + +Device metrics are displayed as individual cards with trend sparklines showing battery level, voltage, channel utilization, airtime, and uptime over time. + +> 💡 **Tip:** Tap any metric card to expand it into a full chart with historical data points. Pinch to zoom the time axis. + +## Metriky prostředí + +Environmental sensor data (requires compatible hardware): + +| Metrický | Sensor Examples | +| ------------------------------------ | --------------------- | +| Teplota | BME280, BME680, SHT31 | +| Vlhkost | BME280, BME680, SHT31 | +| Barometrický tlak | BME280, BMP280 | +| Odpor plynu | BME680 | +| IAQ (Air Quality) | BME680 | + +Environment metrics are charted over time for easy trend analysis — temperature, humidity, and pressure each get their own line chart with the measurement unit displayed on the Y axis. + +> 💡 **Tip:** Environment metrics require a sensor connected to the remote node. Not all nodes report environmental data. See [Telemetry & Sensors](telemetry-and-sensors) for a full list of supported sensors. + +## Signal Metrics + +Radio signal quality information: + +| Metrický | Popis | +| --------- | ----------------------------------------------------------------------------- | +| SNR | Signal-to-Noise Ratio (higher is better) | +| RSSI | Received Signal Strength Indicator (closer to 0 is better) | +| Hop Count | Number of mesh hops for last message | + +### Signal Quality Reference + +| SNR Range | Quality | +| --------------------------------- | --------- | +| > 10 dB | Excellent | +| 0 to 10 dB | Silný | +| -10 to 0 dB | Slabý | +| < -10 dB | Poor | + +## Metriky napájení + +Power management telemetry (requires INA sensor or compatible hardware): + +| Metrický | Popis | +| ----------- | ----------------------- | +| Bus Voltage | Supply voltage | +| Proud | Power draw in milliamps | +| Napájení | Calculated wattage | + +## Traceroute + +Traceroute shows the path a message takes through the mesh: + +1. From the node detail screen, tap **Traceroute**. +2. The app sends a traceroute request to the target node. +3. Results show each hop with SNR/RSSI values. + +### Reading Traceroute Results + +``` +You → Node A (SNR: 8.5) → Node B (SNR: 5.2) → Target +``` + +Each hop represents a relay node that forwarded the message. + +## Protokol pozic + +Historical position data for nodes that share their location: + +- GPS coordinates +- Nadm. výška +- Speed (if moving) +- Timestamp for each position report + +## Informace o sousedech + +Shows which nodes a given node can directly hear, useful for understanding mesh topology. + +## Viewing Metrics + +1. Navigate to **Nodes**. +2. Tap the node you want to inspect. +3. Select the metric category from the detail tabs. + +![Node detail — local device](/assets/screenshots/nodes_detail_local.png) + +The position tab shows location data for nodes that share GPS: + +![Position inline content](/assets/screenshots/nodes_position.png) + +> ⚠️ **Note:** Metrics are only available when they have been reported by the remote node. Metrics update at intervals configured on each node's telemetry settings. + +## Related Topics + +- [Nodes](nodes) — node list, filtering, and sorting +- [Telemetry & Sensors](telemetry-and-sensors) — supported sensors and configuration +- [Signal Meter](signal-meter) — how signal quality is calculated from SNR and RSSI +- [Discovery](discovery) — traceroute details and neighbor info +- [Units & Locale](units-and-locale) — temperature, distance, and speed display formats + +--- + diff --git a/docs/cs-rCZ/user/nodes.md b/docs/cs-rCZ/user/nodes.md new file mode 100644 index 000000000..cd3736aff --- /dev/null +++ b/docs/cs-rCZ/user/nodes.md @@ -0,0 +1,152 @@ +--- +title: Uzly +nav_order: 4 +last_updated: 2026-05-13 +description: Browse, filter, and sort mesh nodes — view details, signal quality, roles, and quick actions. +aliases: + - node-list + - mesh-nodes + - peers +--- + +# Uzly + +The Nodes screen displays all devices visible on your mesh network. + +## Node List + +The node list shows every node your radio has heard, including: + +- **Node name** — user-configured long name +- **Short name** — 4-character identifier +- **Signal quality** — last heard signal strength +- **Last heard** — time since last communication +- **Distance** — estimated distance (if positions are shared) +- **Battery** — remote node battery level (if telemetry is enabled) + +### Node Status Indicators + +| Badge | Meaning | +| ---------- | ------------------------------------- | +| 🟢 Online | Node heard within the last 15 minutes | +| 🟡 Away | Node heard within the last 2 hours | +| 🔴 Offline | Node not heard for over 2 hours | +| ⭐ Favorite | Node marked as favorite by the user | + +### Node Roles + +Nodes can be configured with different roles that affect their mesh behavior: + +| Role | Popis | +| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Client | Standard end-user device | +| Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | +| Client Mute | Receives but doesn't retransmit | +| Client Hidden | Like Client Mute, plus hides from node list | +| Router | Prioritizes message forwarding; stays awake to relay | +| Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | +| ~~Router Client~~ | ⚠️ **Deprecated** (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | +| ~~Repeater~~ | ⚠️ **Deprecated** (removed in firmware 2.7.11) — no longer selectable; use Router instead | +| Tracker | Optimized for position reporting at regular intervals | +| Senzor | Optimized for telemetry reporting | +| TAK | Interoperates with TAK systems (sends/receives CoT) | +| TAK Tracker | TAK position reporting only | +| Lost & Found | Continuous position beacon for recovery | + +### Choosing a Role + +Most users should keep the default **Client** role. Consider a different role when: + +- **Router** — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don't use Router on battery-powered handheld devices. +- **Router Late** — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. +- **Client Base** — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. +- **Client Mute** — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only devices or to reduce congestion in dense areas. +- **Tracker** — An unattended device whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. +- **Sensor** — An unattended device reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. +- **TAK / TAK Tracker** — Only needed if interoperating with ATAK/WinTAK systems. See [TAK Integration](tak) for details. + +> 💡 **Tip:** The mesh works best when most nodes are **Client** or **Router**. Too many Mute nodes reduces mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. + +### Encryption Indicators + +Nodes display encryption status icons next to their name: + +| Icon | Meaning | +| ----------- | ------------------------------------------------------------------------------------------------------------------- | +| 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | +| 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | +| ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) | + +> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. + +## Quick Actions + +From the node list, you can: + +- **Tap** a node to view its detail page +- **Long-press** for quick actions: + - Send a direct message + - Zobrazit na mapě + - Vyžádat pozici + - Mark as favorite + - Traceroute + +## Filtering & Sorting + +### Text Search + +Type in the search field to filter nodes by name or short name. The filter updates in real time as you type. + +### Filter Toggles + +| Filtr | Popis | +| -------------------------- | ---------------------------------------------------------------------------------------------- | +| **Only online** | Show only nodes heard within the last 15 minutes | +| **Only direct** | Show only nodes with direct (non-relayed) connections | +| **Include unknown** | Show nodes that haven't sent user info yet | +| **Exclude infrastructure** | Hide infrastructure-role nodes (Router, Repeater, Router Late, Client Base) | +| **Exclude MQTT** | Hide nodes heard only via MQTT internet bridge | +| **Show ignored** | Show nodes you've previously dismissed or muted | + +### Sort Options + +| Sort | Popis | +| ------------------------------------------- | ------------------------------------------------------------------ | +| **Last heard** (default) | Most recently heard nodes first | +| **Alphabetical** | Sorted by node long name | +| **Distance** | Nearest nodes first (requires position sharing) | +| **Hops away** | Fewest relay hops first | +| **Channel** | Grouped by channel index | +| **Via MQTT** | Grouped by MQTT vs. radio-heard | +| **Favorites** | Favorited nodes first | + +## Node Detail + +Tapping a node opens the detail view with comprehensive information. See [Node Metrics](node-metrics) for full details on metrics and telemetry. + +![Node detail view](/assets/screenshots/nodes_node_list.png) + +The detail screen includes device info, position, and action buttons: + +![Node detail section](/assets/screenshots/nodes_detail_section.png) + +Inline status indicators show key metrics at a glance: + +| Indicator | Screenshot | +| ---------------- | -------------------------------------------------------- | +| Signal quality | ![Signal](/assets/screenshots/nodes_signal_info.png) | +| Battery level | ![Battery](/assets/screenshots/nodes_battery_info.png) | +| Hop count | ![Hops](/assets/screenshots/nodes_hops_info.png) | +| Naposledy slyšen | ![Last heard](/assets/screenshots/nodes_last_heard.png) | +| Vzdálenost | ![Distance](/assets/screenshots/nodes_distance_info.png) | + +## Related Topics + +- [Node Metrics](node-metrics) — detailed telemetry dashboards for each node +- [Messages & Channels](messages-and-channels) — send a direct message to a node +- [Map & Waypoints](map-and-waypoints) — view node positions geographically +- [Discovery](discovery) — traceroute and neighbor info for topology exploration +- [Signal Meter](signal-meter) — understand what the signal bars mean + +--- + diff --git a/docs/cs-rCZ/user/onboarding.md b/docs/cs-rCZ/user/onboarding.md new file mode 100644 index 000000000..3b910534e --- /dev/null +++ b/docs/cs-rCZ/user/onboarding.md @@ -0,0 +1,99 @@ +--- +title: Getting Started +nav_order: 1 +last_updated: 2026-05-13 +description: First-launch setup — permissions, onboarding flow, and next steps after connecting your radio. +aliases: + - first-launch + - setup + - intro +--- + +# Getting Started + +Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app. + +## First Launch + +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. + +### Welcome Screen + +The welcome screen introduces Meshtastic and its core capabilities: + +- Off-grid mesh communication +- No cellular or internet required +- End-to-end encrypted messaging + +Tap **Get Started** to proceed through the setup flow. + +![Welcome screen](/assets/screenshots/onboarding_welcome.png) + +## Permissions + +The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. + +### Bluetooth Permission + +Bluetooth is the primary connection method between your phone and Meshtastic radio: + +- **Bluetooth scanning** — discover nearby Meshtastic radios +- **Bluetooth connect** — establish and maintain connections with paired radios + +Grant both permissions when prompted. Without Bluetooth, you'll need to use USB or TCP connections instead. + +### Location Permission + +> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. + +Meshtastic also uses your location for: + +- Showing your position on the mesh map +- Calculating distances to other nodes +- Sharing your GPS coordinates with other mesh members (if enabled) + +Grant **"While using the app"** or **"Always"** depending on your preference: + +- **While using the app** — position updates only when the app is open +- **Always** — enables background position updates for always-on mesh presence + +If denied, Bluetooth scanning will not function and your node will not report a position. + +### Notifications Permission + +Notifications alert you to: + +- Incoming messages from channels and direct messages +- Connection status changes (connected, disconnected, reconnecting) +- Firmware update availability + +> 💡 **Tip:** You can fine-tune notification preferences later in Android system settings. The app creates separate notification channels for messages, connection events, and background service status. + +### Critical Alerts Permission + +On supported devices, the app may request permission for critical alerts: + +- These are high-priority notifications that can break through Do Not Disturb mode +- Useful for emergency mesh alerts or urgent messages +- You can **skip** this step if you don't need breakthrough notifications +- Configure or revoke later in Android notification settings + +## After Setup + +Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. + +> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. + +## What's Next? + +Once connected to a radio, explore: + +- [Connections](connections) — pair your first radio device +- [Messages & Channels](messages-and-channels) — send your first message +- [Nodes](nodes) — see who's on your mesh +- [Map & Waypoints](map-and-waypoints) — view node positions +- [Settings](settings-radio-user) — configure your radio and user profile + +New to Meshtastic? The [getting started guide](https://meshtastic.org/docs/getting-started) on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup. + +--- diff --git a/docs/cs-rCZ/user/settings-module-admin.md b/docs/cs-rCZ/user/settings-module-admin.md new file mode 100644 index 000000000..bb2020d66 --- /dev/null +++ b/docs/cs-rCZ/user/settings-module-admin.md @@ -0,0 +1,246 @@ +--- +title: Settings — Modules & Admin +nav_order: 8 +last_updated: 2026-05-13 +description: Configure optional feature modules (MQTT, telemetry, canned messages, TAK, and more) and perform device administration. +aliases: + - modules + - module-config + - administration +--- + +# Settings — Modules & Admin + +Configure optional feature modules and perform device administration. Modules extend Meshtastic with specialized capabilities — each can be independently enabled or disabled. + +> 💡 **Tip:** You only need to enable the modules you actually use. Disabling unused modules reduces airtime, saves battery, and simplifies your configuration. + +Module settings use a card-based layout with toggle switches, dropdowns, text fields, and sliders: + +![Toggle switch](/assets/screenshots/settings_switch.png) + +![Dropdown selector](/assets/screenshots/settings_dropdown.png) + +![Text field](/assets/screenshots/settings_text_field.png) + +![Settings card layout](/assets/screenshots/settings_titled_card.png) + +## Module Configuration + +### MQTT Module + +Bridges mesh messages to and from an MQTT broker for internet connectivity. This is how you extend your mesh beyond radio range or integrate with home automation systems. + +| Nastavení | Popis | +| ----------------- | ------------------------------------------------------------------------ | +| Povoleno | Toggle MQTT bridge | +| Server | MQTT broker address | +| Uživatelské jméno | Authentication username | +| Heslo | Authentication password | +| Encryption | Encrypt MQTT payloads | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON support removed from firmware; field is ignored | +| TLS | Use secure connection | +| Kořenové téma | Base MQTT topic path | +| Map Report | Publish position for public map | + +See [MQTT](mqtt) for a detailed usage guide including encryption, privacy, and broker setup. + +### Serial Module + +Enables serial port communication for external device integrations (GPS modules, sensors, or custom hardware). When enabled, the node's serial port can send and receive protobuf or text data, allowing external microcontrollers or computers to interact with the mesh. + +| Nastavení | Popis | +| ---------- | ------------------------------- | +| Povoleno | Activate serial communication | +| Echo | Echo received serial data back | +| Mode | Text, Protobuf, or NMEA output | +| RX/TX Pins | GPIO pins for serial connection | +| Baud Rate | Serial communication speed | + +### External Notification Module + +Controls buzzer, LED, or vibration alerts on your radio hardware. Useful for devices that need to physically signal when a message arrives — particularly helpful for unattended or outdoor installations. + +| Nastavení | Popis | +| -------------------------------- | --------------------------- | +| Povoleno | Activate notifications | +| Alert Message | Notify on incoming messages | +| Alert Message Buzzer | Use buzzer for messages | +| Alert Message Vibra | Use vibration for messages | +| Alert Bell | Notify on bell character | +| Output (GPIO) | Pin for notification output | +| Active | High or Low active | +| Duration (ms) | Notification length | +| Use I2S as Buzzer | Use I2S audio output | + +### Store & Forward Module + +Buffers messages for nodes that were temporarily offline, then replays them when those nodes reconnect. Essential for meshes where nodes go in and out of range regularly — ensures messages aren't lost during brief disconnections. + +| Nastavení | Popis | +| ------------------------------------------ | -------------------------- | +| Povoleno | Activate store and forward | +| Heartbeat (s) | Announcement interval | +| Records | Maximum stored messages | +| History Return (max) | Max messages to replay | +| History Return (window) | Time window for replay | + +> 💡 **Tip:** Store and Forward works best on nodes with ample memory (ESP32 with PSRAM). Router nodes are ideal candidates since they're typically always-on. + +### Range Test Module + +Automated range testing tool for evaluating link quality between nodes. When enabled, the node periodically transmits test messages with incrementing counters. A receiver node logs these messages, allowing you to walk or drive away and later analyze at what distance messages stopped arriving. + +| Nastavení | Popis | +| -------------------------------------- | --------------------------------- | +| Povoleno | Activate range testing | +| Sender Interval (s) | Time between test transmissions | +| Save CSV | Log received test data to SD card | + +### Telemetry Module + +Controls what telemetry data your node shares with the mesh. Telemetry includes device health (battery, uptime) and environmental sensor data (temperature, humidity, pressure). + +| Nastavení | Popis | +| ---------------------------- | --------------------------------------- | +| Device Metrics Interval | How often to report device metrics | +| Environment Metrics Interval | How often to report environment sensors | +| Air Quality Enabled | Report particulate sensor data | +| Power Metrics Enabled | Report power usage | + +See [Telemetry & Sensors](telemetry-and-sensors) for supported sensors and configuration recommendations. + +### Canned Message Module + +Pre-configured messages accessible from the device's physical buttons (for radios with rotary encoders, keypads, or similar input hardware). Define a list of quick-send messages that can be transmitted without a phone connected — ideal for field use. + +| Nastavení | Popis | +| ------------------ | ----------------------------------------------------------- | +| ~~Enabled~~ | ⚠️ **Deprecated** — current firmware may ignore this toggle | +| Zprávy | Newline-separated list of messages | +| Send Bell | Play bell sound on send | +| Rotary Encoder | Enable rotary encoder input | +| Up/Down/Press Pins | GPIO pin assignments for input | + +### Audio Module + +Codec2 audio support for low-bandwidth voice communication over the mesh. This is an **experimental** feature that encodes voice into very small data packets using the Codec2 codec. + +| Nastavení | Popis | +| --------------- | -------------------------------- | +| Povoleno | Activate audio module | +| Codec2 Rate | Audio quality/bandwidth tradeoff | +| I2S Word Select | GPIO pin for I2S WS | +| I2S Data In | GPIO pin for I2S DIN | +| I2S Data Out | GPIO pin for I2S DOUT | + +> ⚠️ **Note:** Audio requires specific hardware (I2S microphone and speaker). Voice quality is very low-bandwidth — think "understandable radio voice," not phone-call quality. + +### Remote Hardware Module + +GPIO control over the mesh network. Allows a remote node to read or write GPIO pins on another node — useful for activating relays, reading switches, or controlling external hardware from a distance. + +| Nastavení | Popis | +| -------------------- | --------------------------------------------------------------- | +| Povoleno | Activate remote GPIO access | +| Allow Undefined Pins | Allow access to any GPIO pin (security risk) | + +> ⚠️ **Warning:** Enabling "Allow Undefined Pins" gives remote nodes access to all GPIO pins, which could interfere with the radio's own hardware. Only enable on dedicated GPIO nodes. + +### Neighbor Info Module + +Broadcasts information about directly heard neighbors, enabling mesh topology mapping. Each enabled node periodically shares a list of the other nodes it can hear and their signal quality. + +| Nastavení | Popis | +| -------------------------------------- | ------------------------------------ | +| Povoleno | Activate neighbor broadcasting | +| Update Interval (s) | How often to broadcast neighbor list | + +See [Discovery](discovery) for how to use neighbor data for mesh topology exploration. + +### Ambient Lighting Module + +Controls onboard NeoPixel or other addressable RGB LEDs on supported hardware. Can be used for visual status indicators, notification lights, or decorative effects. + +| Nastavení | Popis | +| ------------------ | ---------------------------------------------------------- | +| Povoleno | Activate LED control | +| LED State | On, Off, or set specific color | +| Red / Green / Blue | Individual color channel values (0–255) | + +### Detection Sensor Module + +Turns your node into a motion or door sensor alert system. When a GPIO pin detects a state change (motion detected, door opened), the node broadcasts an alert message over the mesh. + +| Nastavení | Popis | +| ---------------------------------------- | ----------------------------------------------------------------------- | +| Povoleno | Activate detection sensor | +| Monitor Pin | GPIO pin connected to sensor | +| Detection Triggered High | Trigger when pin goes high (vs. low) | +| Minimum Broadcast (s) | Minimum time between alert broadcasts | +| State Broadcast (s) | Periodic state broadcast interval | +| Send Bell | Include bell character in alerts | +| Friendly Name | Custom name for this sensor | + +### Paxcounter Module + +People counter using WiFi and BLE probe requests. Counts nearby devices by passively listening for probe requests that phones and laptops emit when scanning for networks. Available only on ESP32 devices. + +| Nastavení | Popis | +| -------------------------------------- | -------------------------- | +| Povoleno | Activate people counting | +| Update Interval (s) | How often to report counts | + +> 💡 **Tip:** Paxcounter is useful for estimating foot traffic at trailheads, event venues, or other locations. Counts are approximate — one person may carry multiple devices. + +### TAK Module + +Team Awareness Kit integration for interoperability with ATAK and WinTAK. See [TAK Integration](tak) for detailed setup and usage. + +## Administrace + +### Vzdálená administrace + +Remotely configure nodes that share your admin key: + +1. Select the target node in the node list. +2. Navigate to **Settings** for that node. +3. Modify configuration. +4. Tap **Save** — changes are sent over the mesh. + +> ⚠️ **Requires:** Admin key configured on both your node and the target node. + +### Vyčistit databázi uzlů + +Removes stale nodes from your local database that haven't been heard in a configurable time window. + +### Factory Reset + +Resets all settings to factory defaults. **This cannot be undone.** + +### Restartovat + +Remotely reboot a connected or administered node. + +### Panel pro ladění + +View detailed diagnostic information: + +- Protocol buffers debug output +- Mesh packet log +- Connection state details + +### Troubleshooting Remote Admin + +- **"No response from target node"** — the target may be out of range, offline, or have a mismatched admin key. Verify the admin key matches on both nodes. +- **Changes not applying** — some settings require a reboot to take effect. Try the Reboot action after saving. +- **Can't see remote settings** — ensure your node has the admin key for the target node and that Admin Channel is enabled in Security Config. + +## Related Topics + +- [Settings — Radio & User](settings-radio-user) — core radio and user profile settings +- [Module configuration reference](https://meshtastic.org/docs/configuration/module) — detailed module docs on meshtastic.org +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/cs-rCZ/user/settings-radio-user.md b/docs/cs-rCZ/user/settings-radio-user.md new file mode 100644 index 000000000..7cfdb94c0 --- /dev/null +++ b/docs/cs-rCZ/user/settings-radio-user.md @@ -0,0 +1,173 @@ +--- +title: Settings — Radio & User +nav_order: 7 +last_updated: 2026-05-13 +description: Configure your radio hardware, LoRa presets, user profile, position sharing, power management, and security. +aliases: + - nastavení + - radio-config + - user-config + - lora +--- + +# Settings — Radio & User + +Configure your radio hardware and user identity parameters. + +## User Settings + +### User Profile + +| Nastavení | Popis | +| ----------------- | ------------------------------------------------------------------------------------- | +| Dlouhé jméno | Your display name (up to 39 characters) | +| Krátké jméno | 4-character abbreviated name | +| Licensed Operator | Enable if you hold an amateur radio license (enables higher power) | + +### Applying Changes + +After modifying settings, tap **Save** to write the configuration to your radio. The device may reboot to apply changes. + +## Radio Configuration + +### Nastavení zařízení + +| Nastavení | Popis | Výchozí | +| ------------------------------------------ | ----------------------------------------------------------------------- | -------- | +| Role | Node behavior (Client, Router, etc.) | Client | +| Režim opětovného vysílání | How the node retransmits messages | Vše | +| Node Info Broadcast (s) | Interval for broadcasting node info | 10800 | +| Double-tap Button | Action for double-tap button press | Disabled | + +### LoRa nastavení + +| Nastavení | Popis | Výchozí | +| ----------------- | ----------------------------------------------------------------------- | ----------------------------------------- | +| Region | Regulatory region for frequency bands | Unset (must configure) | +| Předvolba modemu | Speed/range tradeoff | LongFast | +| Hop Limit | Maximum retransmit hops | 3 | +| TX Power | Transmission power (dBm); 0 = max allowed for region | 0 (region max) | +| Frequency Offset | Fine-tune frequency (MHz) | 0 | +| Channel Bandwidth | Bandwidth setting | Default for preset | + +> ⚠️ **Important:** You **must** set your region before transmitting. Operating without the correct region may violate local radio regulations. See the [region configuration guide](https://meshtastic.org/docs/getting-started/initial-config) on meshtastic.org for details. + +### Modem Presets + +| Preset | Range | Rychlost | SNR Limit | Best For | +| ------------------ | ----------------------- | ------------------------- | ------------------------ | -------------------------------------------------------------------------------------------------------- | +| Short Turbo | ~1 km | 21.9 kbps | −5 dB | Dense urban with line-of-sight; data-heavy applications | +| Short Fast | ~3 km | 10.9 kbps | −7.5 dB | Urban neighborhoods; buildings within a few blocks | +| Short Slow | ~5 km | 5.5 kbps | −10 dB | Suburban short-range; moderate building density | +| Medium Fast | ~5 km | 5.5 kbps | −10 dB | Suburban areas; moderate building density | +| Medium Slow | ~8 km | 1.1 kbps | −12.5 dB | Suburban/rural; moderate range with slower speed | +| Long Turbo | ~10 km | 4.4 kbps | −10 dB | Similar range to Long Fast but with 500 kHz bandwidth; faster throughput | +| Long Fast | ~10 km | 1.1 kbps | −12.5 dB | **General use (default)** — balanced range and speed | +| Long Moderate | ~20 km | 0.34 kbps | −15 dB | Rural with some terrain; occasional use | +| Lite Fast | ~5 km | 5.5 kbps | −10 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Medium Fast | +| Lite Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Long Fast | +| Narrow Fast | ~5 km | 2.7 kbps | −10 dB | EU 868 MHz band (62.5 kHz BW); avoids interference with other devices | +| Narrow Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 868 MHz band (62.5 kHz BW); comparable to Long Fast | +| ~~Long Slow~~ | ~30 km | 0.18 kbps | −17.5 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | +| ~~Very Long Slow~~ | ~40+ km | 0.09 kbps | −20 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | + +#### Choosing a Modem Preset + +The modem preset controls the fundamental tradeoff between **range** and **data rate**: + +- **Slower presets** use more spreading, making signals decodable at weaker signal levels (lower SNR limit). This means longer range but fewer bytes per second. +- **Faster presets** pack more data per transmission but require a stronger signal to decode. + +**Practical guidance:** + +- **Urban mesh (many nodes, short distances):** Use **Long Fast** (default) or **Short Fast**. Higher speed means less airtime congestion when many nodes share the channel. +- **Rural/sparse mesh (few nodes, long distances):** Use **Long Moderate**. Range matters more than speed when nodes are far apart. +- **EU 866/868 MHz regulatory compliance:** Use **Lite Fast**, **Lite Slow**, **Narrow Fast**, or **Narrow Slow** — these are optimized for the EU SRD/868 MHz bands with narrower bandwidths. +- **Fixed infrastructure links:** Use **Short Turbo** or **Long Turbo** for dedicated point-to-point links with good antennas and line-of-sight. +- **Mixed environments:** Stick with **Long Fast** — it's the community default and ensures compatibility with others in your area. + +> ⚠️ **Important:** All nodes on the same channel **must** use the same modem preset. Nodes with mismatched presets cannot communicate even if they share the same frequency and encryption key. + +> 💡 **Tip:** The range estimates above assume flat terrain and modest antennas. Elevation advantage (hilltop, rooftop) dramatically increases effective range. A well-placed Router with Long Fast can often outperform a ground-level node with Long Slow. + +### Nastavení zobrazení + +| Nastavení | Popis | +| ------------------- | ------------------------------------------------------------------------------------ | +| Screen Timeout | Time before display sleeps | +| Display Units | Metric or Imperial | +| OLED Type | Auto, SSD1306, SH1106, SH1107 | +| Compass Orientation | Rotation offset for compass display (0°, 90°, 180°, 270°) | +| ~~Compass North~~ | ⚠️ **Deprecated** — replaced by Compass Orientation; still visible in older firmware | + +### Nastavení pozice + +| Nastavení | Popis | +| ----------------------------------------- | ---------------------------------- | +| GPS Enabled | Enable/disable GPS | +| GPS Update Interval | How often to acquire GPS fix | +| Position Broadcast (s) | How often to share position | +| Chytrá poloha | Enable movement-based broadcasting | +| Pevná poloha | Use a manually set position | + +### Nastavení napájení + +| Nastavení | Popis | +| --------------------------------------- | --------------------------------------- | +| Power Saving | Enable low-power sleep mode | +| Shutdown After (s) | Auto-shutdown idle timer | +| ADC Multiplier | Battery voltage calibration factor | +| Wait Bluetooth (s) | Time to wait for BLE connection at boot | +| Mesh SDS Timeout (s) | Super-deep-sleep timeout | + +### Nastavení sítě + +| Nastavení | Popis | +| ------------- | ---------------------------------------------------- | +| WiFi Enabled | Enable WiFi radio (ESP32 devices) | +| WiFi SSID | Network name to connect to | +| WiFi PSK | Network password | +| NTP Server | Time synchronization server | +| Syslog Server | Remote logging server | + +![IP address field](/assets/screenshots/settings_ipv4_field.png) + +### Nastavení bluetooth + +| Nastavení | Popis | +| ----------------- | ------------------------------------------------------------------------- | +| Bluetooth Enabled | Enable/disable BLE radio | +| Režim párování | Fixed PIN, Random PIN, or No PIN | +| Pevný PIN | PIN code for pairing (default: 123456) | + +### Nastavení zabezpečení + +| Nastavení | Popis | +| --------------------- | -------------------------------------------------------------------------- | +| Veřejný klíč | Your node's public key (read-only) | +| Administrátorský klíč | Key for remote administration | +| Soukromý klíč | Your node's private key (handle securely) | +| Admin Channel Enabled | Allow admin commands via channel | +| Debug Log | Output live debug logging over serial/bluetooth | +| Serial Enabled | Enable serial console access (moved from Device Config) | +| Řízený režim | Restrict non-admin channel changes | + +![Password field](/assets/screenshots/settings_password_field.png) + +Settings use standard preference controls — dropdowns, toggles, and sliders: + +| Control | Screenshot | +| -------- | ------------------------------------------------------ | +| Dropdown | ![Dropdown](/assets/screenshots/settings_dropdown.png) | +| Toggle | ![Toggle](/assets/screenshots/settings_switch.png) | +| Slider | ![Slider](/assets/screenshots/settings_slider.png) | + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — optional feature modules and device administration +- [Signal Meter](signal-meter) — how modem presets affect signal quality thresholds +- [LoRa configuration](https://meshtastic.org/docs/configuration/radio/lora) — detailed LoRa settings reference on meshtastic.org +- [Initial configuration](https://meshtastic.org/docs/getting-started/initial-config) — region setup guide on meshtastic.org + +--- + diff --git a/docs/cs-rCZ/user/signal-meter.md b/docs/cs-rCZ/user/signal-meter.md new file mode 100644 index 000000000..c6a0cc57d --- /dev/null +++ b/docs/cs-rCZ/user/signal-meter.md @@ -0,0 +1,81 @@ +--- +title: How the Meshtastic Signal Meter Works +nav_order: 15 +last_updated: 2026-05-13 +description: How the signal meter calculates quality from RSSI and SNR — LoRa spread spectrum, presets, and what the bars really mean. +aliases: + - signal + - signal-meter + - snr + - rssi +--- + +# How the Meshtastic Signal Meter Works + +The Meshtastic signal meter — the familiar bars or status color in the app — is calculated very differently than the "bars" on a traditional cell phone or Wi-Fi router. + +Most consumer devices simply measure how "loud" a signal is. However, because Meshtastic uses **LoRa (Long Range)** technology, its signal meter measures how **clear** the signal is, relative to the specific settings your mesh is using. + +--- + +## 1. The Two Metrics: "Loudness" vs. "Clarity" + +Every time the LoRa radio chip receives a message, it reports two measurements: + +- **RSSI (Received Signal Strength Indicator):** The **loudness** of the raw power hitting your antenna. +- **SNR (Signal-to-Noise Ratio):** The **clarity** of the signal compared to the background static. + +> **Tip — The Analogy:** Imagine you are trying to hear a friend talking to you. +> +> - **RSSI** is how loud their voice is. +> - **The Noise Floor** is the background noise in the room (air conditioning, other people talking, traffic). +> - **SNR** is how easily you can distinguish your friend's voice from the background noise. + +If your friend shouts at you at a deafening rock concert, the signal is incredibly loud (High RSSI), but you still can't understand them because the background noise is louder (Bad SNR). Conversely, if your friend whispers to you in a dead-silent library, the signal is very weak (Low RSSI), but you can understand them perfectly (Great SNR). + +--- + +## 2. The Magic of LoRa: Hearing "Below the Noise Floor" + +For standard radios (like FM or Wi-Fi), if the background noise is louder than the signal (a negative SNR), the receiver just hears static. + +LoRa is special. It uses **"Spread Spectrum"** modulation, which allows the radio to mathematically pull a signal out of the air even when it is buried deep _underneath_ the background noise. This is why you will frequently see **negative SNR numbers** in Meshtastic (e.g., -10 dB, which means the signal is 10 decibels weaker than the background static). + +Depending on which Meshtastic preset you are using (e.g., `LongFast` vs. `ShortFast`), the radio has a specific **SNR Limit** — the absolute maximum amount of noise it can tolerate before the message is completely lost to the static. + +--- + +## 3. How the Signal Meter Calculates Quality + +The Meshtastic apps take both RSSI and SNR and run them through a specific formula to assign your signal a quality rating (None, Bad, Fair, or Good). It specifically scales these values based on the physical limits of the radio preset you are using. + +Here is exactly how the app decides how many bars (or what color) to show you: + +| Level | Bars | Criteria | Meaning | +| ------ | ---- | ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | +| Silný | 3 | RSSI better than `-115 dBm` **AND** SNR better than `-7 dB` | Signal is both loud and clear — healthy connection. | +| Slabý | 2 | RSSI better than `-126 dBm` with good SNR, **OR** SNR better than `-15 dB` with good RSSI | Signal getting quieter or noisier, but still decodable. | +| Špatný | 1 | Falls between Fair and None thresholds | At the edge of range or experiencing interference. | +| Žádný | 0 | RSSI worse than `-126 dBm` **AND** SNR worse than `-15 dB` | Transmission completely buried in noise. | + +--- + +## 4. What This Means for You + +Because Meshtastic's meter acts as a **"Clarity Meter"**, it behaves differently than what most people expect: + +> **Tip — Don't panic over low RSSI:** You might see a seemingly terrible RSSI value like `-118 dBm`. On a cell phone, you would have zero bars. But if you have an SNR of `+2 dB`, Meshtastic will still show a strong signal! _The library is quiet, so the whisper is heard perfectly._ + +> **Warning — Watch out for local noise:** If you hook up a massive antenna and see a great RSSI (e.g., `-90 dBm`) but your signal meter is only showing **1 Bar (Bad)**, you have a problem. It means you have local interference — perhaps a cheap power supply, a noisy computer, or a nearby radio tower — creating so much static that it is drowning out your mesh. + +## Where Signal Information Appears + +In the app, signal data is shown in several places: + +- **Node list** — signal bars icon next to each node +- **Node detail** — SNR, RSSI, and signal quality in the device metrics section +- **Traceroute** — per-hop signal quality for each relay node +- **Signal metrics** — historical SNR and RSSI data in the metrics charts + +![Node entry showing SNR, RSSI values and colored signal bars](/assets/screenshots/nodes_signal_info.png) + diff --git a/docs/cs-rCZ/user/tak.md b/docs/cs-rCZ/user/tak.md new file mode 100644 index 000000000..792f08741 --- /dev/null +++ b/docs/cs-rCZ/user/tak.md @@ -0,0 +1,126 @@ +--- +title: TAK Integration +nav_order: 10 +last_updated: 2026-05-13 +description: Interoperate with ATAK and WinTAK — CoT position sharing, TAK roles, and plugin setup. +aliases: + - tak + - atak + - team-awareness-kit +--- + +# TAK Integration + +Meshtastic integrates with the Team Awareness Kit (TAK) ecosystem, enabling interoperability between Meshtastic mesh devices and TAK applications like ATAK and WinTAK. + +## Overview + +The TAK module allows Meshtastic nodes to: + +- Share position data in TAK-compatible CoT (Cursor on Target) format +- Appear as team members on TAK map displays +- Receive TAK PLI (Position Location Information) messages + +## Setup + +### Prerequisites + +- ATAK (Android Team Awareness Kit) or WinTAK installed +- Meshtastic ATAK Plugin installed +- TAK module enabled on your Meshtastic radio + +### Nastavení + +1. Navigate to **Settings → Module Config → TAK**. +2. Enable the TAK module. +3. Configure the TAK team/group settings: + +![Module toggle switch](/assets/screenshots/settings_switch.png) + +| Nastavení | Popis | +| --------- | -------------------------- | +| Povoleno | Activate TAK interop | +| Mode | TAK-compatible output mode | + +### ATAK Plugin Setup + +1. Install the Meshtastic ATAK Plugin from the plugin repository. +2. Open ATAK and enable the Meshtastic plugin. +3. The plugin bridges messages between ATAK and your mesh network. + +## TAK Roles + +Nodes configured with TAK-related roles behave differently from standard clients: + +| Role | Popis | +| --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **TAK** | Full TAK interoperability — sends and receives CoT data, chat messages, and PLI updates. Functions as a standard client plus TAK bridge. | +| **TAK Tracker** | Position-only TAK output — automatically broadcasts PLI at regular intervals without user interaction. Optimized for unattended position beacons (vehicles, equipment, waypoints). Does not relay chat messages. | + +> 💡 **Tip:** Use **TAK Tracker** for devices that only need to report position (e.g., a radio mounted in a vehicle). Use **TAK** for devices where users actively participate in TAK operations. + +### CoT (Cursor on Target) Format + +TAK messages use the Cursor on Target XML format — a military standard for sharing situational awareness data. Meshtastic converts its internal protobuf messages to CoT format when bridging to TAK systems, so no manual format conversion is needed. + +## TAK Identity + +When using TAK roles, your node broadcasts identity information that appears on TAK maps: + +| Nastavení | Popis | +| --------- | ---------------------------------------------------------------------------------------------------------------- | +| Team | Your team color on the TAK map (e.g., Blue, Red, Cyan, Green) | +| Role | Your operational role (Team Member, Team Lead, HQ, Medic, RTO, etc.) | +| Callsign | Your TAK callsign (defaults to your Meshtastic long name) | + +These settings appear in **Settings → Module Config → TAK** when the TAK module is enabled. + +> 💡 **Tip:** Team/role colors are the standard TAK affiliation colors. Coordinate with your TAK team to use consistent team assignments. + +## Wire Format (V1 / V2) + +Meshtastic supports two TAK wire formats: + +| Format | Compatibility | Features | +| ------------------------------- | --------------------------------------------------------------- | --------------------------------------------------------- | +| V1 (Legacy) | ATAK Plugin v1.x, older firmware | Basic CoT position sharing only | +| V2 (Current) | ATAK Plugin v2.x, firmware 2.3+ | Full CoT support including chat, routes, zstd compression | + +The app automatically selects V2 when both sides support it. No manual configuration needed — the TAK module negotiates format based on firmware capabilities. + +## Usage with ATAK + +Once configured: + +- Meshtastic nodes appear as markers on the ATAK map with callsign labels +- Chat messages can bridge between mesh and TAK networks +- Position updates flow bidirectionally between Meshtastic and TAK +- TAK Tracker nodes broadcast PLI automatically — their positions appear on ATAK maps without any ATAK-side configuration + +> ⚠️ **Note:** TAK integration requires specific node roles and module configuration. Standard client nodes don't automatically participate in TAK operations. + +## Troubleshooting + +| Problem | Cause | Solution | +| -------------------------------- | ------------------------------------- | ----------------------------------------------------------------------- | +| Node doesn't appear on ATAK map | TAK module disabled or wrong role | Verify TAK module is enabled and node role is TAK or TAK Tracker | +| Position updates are stale | GPS fix lost or interval too long | Check GPS status; reduce position broadcast interval in Position Config | +| ATAK plugin shows "disconnected" | BLE connection lost or plugin crashed | Reconnect Bluetooth in Meshtastic app, then restart ATAK plugin | +| Chat messages not bridging | V1 format doesn't support chat | Ensure both nodes run firmware 2.3+ for V2 wire format | +| CoT data not flowing | Channel mismatch | All TAK nodes must be on the same channel with matching encryption | + +## Security Considerations + +- TAK data shares your position and callsign information +- Ensure your channel encryption is configured when using TAK in sensitive environments +- The TAK module respects the same channel encryption as other Meshtastic messages + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — TAK module configuration +- [Nodes](nodes) — TAK and TAK Tracker roles in the node list +- [Map & Waypoints](map-and-waypoints) — node positions on the map +- [ATAK plugin guide](https://meshtastic.org/docs/software/integrations/atak-plugin) — detailed ATAK setup on meshtastic.org + +--- + diff --git a/docs/cs-rCZ/user/telemetry-and-sensors.md b/docs/cs-rCZ/user/telemetry-and-sensors.md new file mode 100644 index 000000000..64181c5fb --- /dev/null +++ b/docs/cs-rCZ/user/telemetry-and-sensors.md @@ -0,0 +1,118 @@ +--- +title: Telemetry & Sensors +nav_order: 9 +last_updated: 2026-05-13 +description: Sensor data on the mesh — supported environment, air quality, and power sensors, plus configuration and viewing guides. +aliases: + - sensors + - environment + - weather + - power-metrics +--- + +# Telemetry & Sensors + +Meshtastic nodes can collect and share sensor data across the mesh network. + +## Overview + +Telemetry allows nodes equipped with sensors to broadcast environmental, power, and device health information. This data is visible on the node detail screen and can be logged over time. + +## Device Telemetry + +All Meshtastic nodes report basic device telemetry: + +| Metrický | Popis | Typical Range | +| ------------------ | ------------------------------ | ------------------------------------------------------------------ | +| Battery Level | Charge percentage | 0–100% | +| Napětí | Battery voltage | 3.0–4.2V (LiPo) | +| Využití kanálu | % of airtime used locally | 0–100% | +| Air Utilization TX | % of airtime used by this node | 0–100% | +| Doba provozu | Seconds since last boot | Varies | + +## Environment Sensors + +Supported environmental sensors: + +### Temperature & Humidity + +| Senzor | Teplota | Vlhkost | Tlak | Poznámka | +| ------- | ------- | ------- | ---- | ----------------------- | +| BME280 | ✓ | ✓ | ✓ | Recommended all-in-one | +| BME680 | ✓ | ✓ | ✓ | Adds gas resistance/IAQ | +| SHT31 | ✓ | ✓ | — | High accuracy | +| MCP9808 | ✓ | — | — | Precision temperature | +| LPS22 | — | — | ✓ | Pressure only | + +### Air Quality + +| Senzor | Metrický | Poznámka | +| -------- | -------------------------------------------------- | -------------------------- | +| BME680 | Gas Resistance / IAQ | Volatile organic compounds | +| PMSA003I | PM1.0, PM2.5, PM10 | Particulate matter | +| SEN55 | PM, NOx, VOC, Temp, Humidity | Multi-sensor | + +### Light & UV + +| Senzor | Metrický | +| -------- | -------------------------------------- | +| OPT3001 | Ambient light (lux) | +| VEML7700 | Ambient light (lux) | +| LTR390 | UV index | + +## Metriky napájení + +Nodes with INA-series power sensors can report: + +| Metrický | Popis | +| ----------- | ----------------------------------------- | +| Bus Voltage | Supply rail voltage | +| Proud | Power consumption (mA) | +| Napájení | Calculated power (mW) | + +Useful for monitoring solar charging or battery health on remote nodes. + +## Configuring Telemetry + +1. Navigate to **Settings → Module Config → Telemetry**. +2. Set reporting intervals: + - **Device Metrics Interval** — how often to broadcast device metrics + - **Environment Metrics Interval** — how often to broadcast sensor data +3. Enable specific sensor types as needed. + +### Recommended Intervals + +| Use Case | Device (s) | Environment (s) | +| ------------------------------------------ | ----------------------------- | ---------------------------------- | +| Urban mesh (many nodes) | 3600 | 3600 | +| Rural mesh (few nodes) | 900 | 900 | +| Weather station | 900 | 300 | +| Battery conservation | 7200 | 7200 | + +> ⚠️ **Note:** Shorter intervals increase airtime usage and battery drain across the mesh. + +## Viewing Telemetry + +1. Navigate to **Nodes** and select a node. +2. Telemetry sections show on the detail screen: + - Device Metrics (always available) + - Environment Metrics (if sensors present) + - Power Metrics (if INA sensor present) +3. Historical graphs show trends over time. + +![Telemetry actions](/assets/screenshots/node-metrics_telemetric_actions.png) + +## Troubleshooting + +- **No environment data showing?** The remote node needs a physical sensor connected (e.g., BME280 on I2C). Device telemetry (battery, uptime) is always available, but environment metrics require hardware. +- **Stale readings?** Check the reporting interval — very long intervals (7200s+) mean data updates infrequently. Also verify the remote node is still online. +- **Sensor conflict on I2C bus?** Some sensors share I2C addresses. If you have multiple sensors on the same bus, check for address collisions in the radio's serial debug output. + +## Related Topics + +- [Node Metrics](node-metrics) — view telemetry data on the node detail screen +- [Settings — Modules & Admin](settings-module-admin) — telemetry module configuration +- [Units & Locale](units-and-locale) — temperature and pressure display units + +--- + diff --git a/docs/cs-rCZ/user/translate.md b/docs/cs-rCZ/user/translate.md new file mode 100644 index 000000000..ce2837991 --- /dev/null +++ b/docs/cs-rCZ/user/translate.md @@ -0,0 +1,97 @@ +--- +title: Translate the App +parent: User Guide +nav_order: 17 +last_updated: 2026-05-13 +aliases: + - translate + - crowdin + - localization +--- + +# Translate the App + +Contributing translations helps make Meshtastic accessible to a wider audience. The app uses [Crowdin](https://crowdin.com/) to manage community translations for both the user interface and in-app documentation. + +--- + +## What Gets Translated + +| Resource | Source Location | Poznámka | +| ----------------- | ------------------------------------- | ---------------------------------------------------------------------- | +| UI strings | `composeResources/values/strings.xml` | Buttons, labels, messages, and all user-visible text | +| User Guide pages | `docs/user/*.md` | In-app documentation shown in Help & Documentation | +| Fastlane metadata | `fastlane/metadata/android/en-US/` | App Store listing title, description, and changelogs | + +> **Note — Developer Guide pages are English-only.** Code-focused documentation targeting contributors is not translated. + +--- + +## Jak přispět + +1. **Visit the Crowdin project.** Open the [Meshtastic Android Crowdin project](https://crowdin.com/project/meshtastic-android) and sign in or create a free account. +2. **Choose your language.** Select an existing language or request a new one by opening a [GitHub issue](https://github.com/meshtastic/Meshtastic-Android/issues/new). +3. **Translate strings.** Crowdin shows the English source on the left and your translation on the right. Translate each string and save. +4. **Review context.** Many strings include screenshots or context comments — check these to understand where the text appears in the app. +5. **Submit.** Approved translations are automatically merged into the next release. + +> **Tip — Keep translations short.** UI strings often appear in buttons, chips, or narrow columns. If a translation is significantly longer than the English original, consider abbreviating where the meaning stays clear. + +--- + +## Adding a New Language + +If your language is not yet listed on Crowdin: + +1. Open an issue on [GitHub](https://github.com/meshtastic/Meshtastic-Android/issues/new) requesting the new locale. +2. A maintainer will add the language to Crowdin and configure `crowdin.yml`. +3. Once added, you can begin translating immediately. + +--- + +## How Translations Are Organized + +The Android app uses **Compose Multiplatform resources** for all user-visible strings: + +``` +core/resources/src/commonMain/composeResources/ +├── values/ ← English (default) +│ └── strings.xml +├── values-de/ ← German +│ └── strings.xml +├── values-fr/ ← French +│ └── strings.xml +└── ... +``` + +In-app documentation follows a similar pattern under `docs/`: + +``` +docs/ +├── user/ ← English source (default) +│ ├── onboarding.md +│ └── ... +├── fr/user/ ← French translations +│ ├── onboarding.md +│ └── ... +└── ... +``` + +The app automatically selects the correct locale based on your device's **Language & Region** settings. + +--- + +## Translation Guidelines + +- **Do not translate** technical terms like "LoRa", "MQTT", "BLE", "TAK", "SNR", or "RSSI" — these are universal. +- **Keep placeholders intact.** Strings like `%1$s` or `%d` are filled in at runtime. Do not remove or reorder them unless the grammar of your language requires it. +- **Match tone.** The app uses a friendly, direct voice. Avoid overly formal language. +- **Test if possible.** Switch your device language and open the app to see how translations look in context. + +--- + +## Questions? + +If you have questions about a specific string's context or need help getting started, open a discussion on the [Meshtastic GitHub Discussions](https://github.com/meshtastic/Meshtastic-Android/discussions) page. + +Děkujeme, že jste pomohli rozšířit dosah Meshtastic! diff --git a/docs/cs-rCZ/user/units-and-locale.md b/docs/cs-rCZ/user/units-and-locale.md new file mode 100644 index 000000000..9aa3d7bc3 --- /dev/null +++ b/docs/cs-rCZ/user/units-and-locale.md @@ -0,0 +1,118 @@ +--- +title: Units, Measurement & Locale +parent: User Guide +nav_order: 16 +last_updated: 2026-05-12 +--- + +# Units, Measurement & Locale + +The Meshtastic app automatically displays temperatures, distances, speeds, and times in the units your device is configured to use — no settings to change inside the app. + +--- + +## How It Works + +Meshtastic radios always transmit data in **metric units** (meters, °C, km/h, hPa, etc.). When the app receives this data, it uses the `MetricFormatter` utility to convert and display values in whatever unit system your device's locale specifies. + +On Android, your measurement preferences are determined by your system **Language & Region** settings. On Desktop (JVM), the app uses the JVM's default `Locale`. + +> **Tip — You never need to toggle units inside the app.** Change your system measurement preferences and every screen in Meshtastic updates automatically — node details, telemetry charts, weather, altitude, and more. + +--- + +## Teplota + +Temperature values from environment sensors are transmitted as **°C** and displayed based on your device's temperature unit preference. + +![Environment metrics with temperature](/assets/screenshots/nodes_environment_metrics.png) + +| Your Setting | You See | +| ------------ | ------- | +| Celsius | 22°C | +| Fahrenheit | 72°F | + +This affects all temperature displays throughout the app: node environment telemetry, soil temperature, dew point, and telemetry chart axes. + +## Distance & Altitude + +Distances between nodes and GPS altitudes are transmitted as **meters** and automatically scaled and converted. + +![Distance info display](/assets/screenshots/nodes_distance_info.png) + +| Your Setting | Small Distance | Large Distance | Nadm. výška | +| -------------------------------- | -------------- | ---------------------- | --------------------------- | +| Metrický | 350 m | 2.5 km | 1,200 m | +| Imperial (US) | 1,148 ft | 1.6 mi | 3,937 ft | + +The app uses natural scaling — short distances stay in meters or feet, while longer distances switch to kilometres or miles automatically. + +### Where these appear + +- **Node list** — distance and bearing to each node +- **Node detail** — altitude, distance from your position +- **Map** — waypoint distances, traceroute hop distances +- **Compass** — distance to selected node + +## Rychlost + +GPS ground speed is displayed in your locale's preferred speed unit. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Metrický | 12 km/h | +| Imperial (US) | 7 mph | + +## Vítr + +Wind speed and gust data from environment sensors are transmitted as **m/s** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Metrický | 5 m/s | +| Imperial (US) | 11 mph | + +Wind readings appear in the **Node Detail** environment section and the **Environment Telemetry** charts. + +## Rainfall + +Rainfall measurements (1-hour and 24-hour totals) are transmitted as **mm** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ---------------------- | +| Metrický | 12 mm | +| Imperial (US) | 0.5 in | + +## Units That Never Change + +Some units are international standards and are displayed the same way regardless of your locale: + +| Measurement | Unit | Why | +| -------------------------------- | ------------------------------ | ------------------------------------- | +| Barometrický tlak | hPa | International meteorological standard | +| Heading / bearing | ° (degrees) | Universal navigation convention | +| Radiace | μR/hr | Standard dosimetry unit | +| GPS coordinates | decimal degrees | Universal geographic standard | +| Humidity, battery, soil moisture | % | Universal | + +## Date & Time + +All timestamps throughout the app — last heard, message times, telemetry logs, chart axes — follow your device's date and time preferences. + +| Nastavení | What It Controls | Example | +| ---------------- | ---------------- | ------------------------------------------------ | +| **24-Hour Time** | Clock format | 14:30 vs 2:30 PM | +| **Date Format** | Date ordering | 09/05/2026 vs 05/09/2026 | + +The app also uses **relative time** where it makes sense — for example, "5 min ago" or "2 hours ago" in the node list — which is automatically localised into your device language. + +## Changing Your Measurement System (Android) + +On Android, your measurement system (metric vs imperial) is tied to your region setting: + +1. Open **Android Settings → System → Language & Region** +2. Change your **Region** or **Measurement units** preference +3. Return to Meshtastic — values update immediately + +> **Tip — The app uses `MetricFormatter` from `core:common`.** All measurement formatting is handled by a shared KMP utility that respects your platform's locale. Developers adding new measurement displays should use `MetricFormatter` rather than hard-coding unit conversions. + diff --git a/docs/de-rDE/index.md b/docs/de-rDE/index.md new file mode 100644 index 000000000..6a88b8405 --- /dev/null +++ b/docs/de-rDE/index.md @@ -0,0 +1,30 @@ +--- +title: Startseite +layout: default +nav_order: 0 +--- + +# Meshtastic Android App Documentation + +User and developer documentation for the Meshtastic Android, Desktop, and iOS applications powered by KMP (Kotlin Multiplatform). + +Use the sidebar navigation to browse the **User Guide** for app features and the **Developer Guide** for contributing to the project. + +--- + +## Quick Links + +| Guide | Beschreibung | +| --------------------------------------------------------------------- | -------------------------------------------------------------- | +| [Getting Started](user/onboarding) | Connect your first radio and send a message | +| [Messages & Channels](user/messages-and-channels) | Channel broadcasts, direct messages, reactions, and encryption | +| [Nodes](user/nodes) | Understanding the mesh network node list | +| [Signal Meter](user/signal-meter) | How the LoRa signal quality meter works | +| [Units & Locale](user/units-and-locale) | How temperatures, distances, and times adapt to your region | +| [Desktop App](user/desktop) | Linux, macOS, and Windows desktop usage | +| [Architecture](developer/architecture) | App architecture overview for contributors | +| [Contributing](developer/contributing) | Branch naming, PR workflow, and verification commands | + +--- + +> This documentation is served from the same markdown source that powers the in-app **Help & Documentation** browser. diff --git a/docs/de-rDE/user/connections.md b/docs/de-rDE/user/connections.md new file mode 100644 index 000000000..23b74b3c8 --- /dev/null +++ b/docs/de-rDE/user/connections.md @@ -0,0 +1,125 @@ +--- +title: Verbindungen +nav_order: 2 +last_updated: 2026-05-13 +description: Connect your phone or desktop to a Meshtastic radio via Bluetooth, USB, or TCP/IP. +aliases: + - bluetooth + - usb + - tcp + - pairing +--- + +# Verbindungen + +Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node. + +## Bluetooth (BLE) + +Bluetooth Low Energy is the default and most common connection method on Android. + +### Pairing a Device + +1. Ensure your Meshtastic radio is powered on and in pairing mode. +2. Open the app and navigate to **Connections**. +3. Tap **Scan for Devices** — nearby Meshtastic radios will appear. +4. Select your device from the list. +5. Accept the Bluetooth pairing prompt if shown. + +![Device list item](/assets/screenshots/connections_bluetooth_scan.png) + +You can filter devices by transport type using the filter chips at the top: + +![Transport filter chips](/assets/screenshots/connections_transport_filters.png) + +> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. + +### Connection Status + +| Icon | State | Beschreibung | +| ---- | ------------------- | ----------------------------- | +| 🟢 | Verbunden | Active radio link established | +| 🟡 | Wird verbunden | Handshake in progress | +| 🔴 | Verbindung getrennt | No active connection | +| ⚪ | Not configured | Kein Gerät ausgewählt | + +When connecting, a status indicator shows the current connection state: + +![Connecting status](/assets/screenshots/connections_connecting.png) + +If no devices are found, the app shows an empty state with instructions: + +![No devices found](/assets/screenshots/connections_empty_state.png) + +### Troubleshooting Bluetooth + +- **Device not found:** Toggle Bluetooth off/on, ensure location is enabled. +- **Connection drops:** Move closer to the radio; check for interference. +- **Pairing rejected:** Forget the device in Android Bluetooth settings and retry. + +## USB Serial + +USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable. + +### Einstellungen + +1. Connect your radio via USB cable to your device. +2. The app will prompt for USB permission — tap **Allow**. +3. The connection is established automatically. + +> ⚠️ **Note:** USB connections require OTG support on Android devices. + +## TCP/IP (WiFi) + +Some Meshtastic radios support WiFi connectivity, allowing TCP-based connections. + +### Einstellungen + +1. Connect your radio to a WiFi network via the radio's web interface or settings. +2. In the app, go to **Connections → TCP**. +3. Enter the radio's IP address and port (default: 4403). +4. Tap **Connect**. + +![WiFi scanning for devices](/assets/screenshots/connections_wifi_scanning.png) + +When a device is found, it appears in the connection list: + +![WiFi device found](/assets/screenshots/connections_wifi_device_found.png) + +A successful connection is confirmed with a status indicator: + +![WiFi connection success](/assets/screenshots/connections_wifi_success.png) + +### When to Use TCP + +- Radio is on the same local network +- Testing with a simulated radio +- Environments where Bluetooth has interference issues + +## Reconnection Behavior + +The app reconnects to the **last selected device** on startup. You can manually switch transports from the connections screen at any time. + +To disconnect from a radio, use the disconnect button on the connections screen: + +![Disconnect from radio](/assets/screenshots/connections_disconnect.png) + +## Desktop Connections + +On Desktop (Linux/macOS/Windows), the app supports: + +- **Bluetooth (BLE)** — via the Kable library; works on macOS, Linux, and Windows +- **USB Serial** — primary wired connection method +- **TCP/IP** — for network-connected radios + +See [Desktop App](desktop) for platform-specific details and keyboard shortcuts. + +## Related Topics + +- [Getting Started](onboarding) — first-launch setup and permissions +- [Settings — Radio & User](settings-radio-user) — Bluetooth and network configuration +- [Desktop App](desktop) — desktop-specific connection details +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — full list of compatible radios on meshtastic.org + +--- + diff --git a/docs/de-rDE/user/desktop.md b/docs/de-rDE/user/desktop.md new file mode 100644 index 000000000..4ee2f3418 --- /dev/null +++ b/docs/de-rDE/user/desktop.md @@ -0,0 +1,147 @@ +--- +title: Desktop App +nav_order: 14 +last_updated: 2026-05-13 +description: Install and use the Meshtastic Desktop app on Linux, macOS, and Windows — connections, feature parity, and keyboard shortcuts. +aliases: + - desktop + - linux + - macos + - windows + - jvm +--- + +# Desktop App + +The Meshtastic Desktop application provides the same mesh communication features on Linux, macOS, and Windows. + +## Übersicht + +The Desktop app shares its core codebase with the Android app through Kotlin Multiplatform (KMP). Most features work identically across platforms. + +## Installation + +### Linux + +- Download the `.deb` or `.AppImage` package from the releases page +- Or build from source using `./gradlew :desktopApp:run` + +### macOS + +- Download the `.dmg` package from releases +- Or build from source + +### Windows + +- Download the `.msi` installer from releases +- Or build from source + +## Connecting Your Radio + +### USB Serial (Primary) + +The most reliable connection method on Desktop: + +1. Connect your Meshtastic radio via USB cable. +2. The app should detect the serial port automatically. +3. If not detected, select the correct serial port from the connections menu. + +### TCP/IP + +For network-connected radios: + +1. Enter the radio's IP address and port (default: 4403). +2. Click **Connect**. + +### Bluetooth (BLE) + +Bluetooth Low Energy is supported on Desktop via the [Kable](https://github.com/JuulLabs/kable) library: + +1. Ensure your system has a Bluetooth adapter. +2. The app scans for nearby Meshtastic radios automatically. +3. Select your device from the connections screen. + +## Feature Parity + +| Funktion | Android | Desktop | Knoten | +| ---------------------------------------- | ------- | ------- | -------------------------- | +| Messaging | ✓ | ✓ | Full parity | +| Node List | ✓ | ✓ | Full parity | +| Karte | ✓ | ✓ | Full parity | +| Einstellungen | ✓ | ✓ | Full parity | +| Bluetooth (BLE) | ✓ | ✓ | Via Kable on desktop | +| Firmware Update OTA | ✓ | ✗ | Use web flasher | +| Benachrichtigungen | ✓ | ✓ | Native OS notifications | +| Widgets | ✓ | ✗ | Android-only | +| AI Assistant (Chirpy) | ✓\* | ✗ | Google flavor Android only | + +\*Chirpy AI requires Android 14+ on Google flavor builds with supported hardware. + +## UI Differences + +The Desktop app uses the same Compose Multiplatform UI with adaptations for larger screens and desktop interaction. + +### Tastaturkürzel + +| Tastaturkürzel | Action | +| ------------------- | --------------------------- | +| **⌘Q** / **Ctrl+Q** | Quit the application | +| **⌘,** / **Ctrl+,** | Einstellungen öffnen | +| **⌘1** / **Ctrl+1** | Switch to Conversations tab | +| **⌘2** / **Ctrl+2** | Switch to Nodes tab | +| **⌘3** / **Ctrl+3** | Switch to Map tab | +| **⌘4** / **Ctrl+4** | Switch to Connections tab | + +### Window & System Tray + +- **Window resizing** — responsive layout adapts to window dimensions +- **System tray** — minimize to system tray for background mesh operation +- **Tray menu** — right-click the tray icon to show window or quit +- **Mouse interaction** — hover states and standard desktop navigation + +### Notification Preferences + +The Desktop app provides in-app toggles for controlling which notifications are shown — messages, new nodes, and low battery alerts. Access these from **Settings → Notifications** within the app. + +## Built-in Documentation Browser + +The Desktop app includes a built-in documentation browser for quick access to help content without leaving the application. + +![Docs browser with table of contents](/assets/screenshots/docs-browser_toc.png) + +The browser supports full-text search across all documentation: + +![Searching the docs browser](/assets/screenshots/docs-browser_search.png) + +Individual doc pages render with full formatting: + +![A documentation page](/assets/screenshots/docs-browser_page.png) + +## Building from Source + +```bash +git clone https://github.com/meshtastic/Meshtastic-Android.git +cd Meshtastic-Android +git submodule update --init +./gradlew :desktopApp:run +``` + +Voraussetzungen: + +- JDK 21 +- No Android SDK required for desktop-only builds + +## Bekannte Einschränkungen + +- No OTA firmware updates (use web flasher) +- Some Android-specific features (widgets, specific notification channels) are unavailable +- Performance may vary on low-spec hardware running Compose Desktop +- BLE bonding is not yet supported on desktop (pairing works without bonding) + +## Related Topics + +- [Connections](connections) — connection methods overview +- [Firmware Updates](firmware) — use the [Web Flasher](https://flasher.meshtastic.org) for desktop firmware updates + +--- + diff --git a/docs/de-rDE/user/discovery.md b/docs/de-rDE/user/discovery.md new file mode 100644 index 000000000..a536fc436 --- /dev/null +++ b/docs/de-rDE/user/discovery.md @@ -0,0 +1,114 @@ +--- +title: Entdecken +nav_order: 12 +last_updated: 2026-05-13 +description: Explore your mesh network — traceroute paths, neighbor maps, and node discovery tools. +aliases: + - mesh-discovery + - local-discovery + - network-scan + - traceroute + - neighbor-info +--- + +# Entdecken + +Discovery tools help you understand **how** your mesh network is connected — which nodes can hear each other, what paths messages take, and where bottlenecks or weak links exist. + +> 💡 **Tip:** You don't need a dedicated "discovery mode" to start exploring your mesh. The tools below are available right now from the node list and node detail screens. + +--- + +## Traceroute + +Traceroute reveals the exact path a message takes from your node to any other node on the mesh. It's the single most useful tool for debugging connectivity problems. + +### Running a Traceroute + +1. Navigate to **Nodes** and tap the node you want to trace. +2. On the node detail screen, tap **Traceroute**. +3. The app sends a traceroute request and waits for the response. +4. Results display each hop in order, with signal quality at every step. + +### Reading the Results + +A traceroute result looks like this: + +``` +You → Node A (SNR: 8.5, RSSI: -95) → Node B (SNR: 5.2, RSSI: -108) → Target +``` + +Each hop represents a relay node that forwarded the message. The SNR and RSSI values at each hop tell you about the link quality on that specific segment. + +| What to look for | What it means | +| -------------------------------------------------------------------------- | --------------------------------------------------------------------------- | +| All hops show Good SNR (> 5 dB) | Healthy path — messages flow reliably | +| One hop shows Bad SNR (< 0 dB) | Weak link — this relay segment is fragile | +| Many hops (4+) | Long path — consider repositioning a node to shorten it | +| Different path on retry | Mesh is adapting — multiple routes exist (this is good!) | + +> 💡 **Tip:** Run traceroute several times over a few minutes. If the path changes, your mesh has redundant routes — a sign of a well-connected network. + +### Troubleshooting with Traceroute + +- **"No route found"** — The target node may be offline, out of range, or on a different channel. Check that both nodes share at least one channel with the same encryption key. +- **Traceroute times out** — The path may be too long (exceeds hop limit) or a relay node is congested. Try increasing the hop limit in **Settings → LoRa Config**. +- **Asymmetric paths** — A traceroute from A→B may take a different path than B→A. This is normal — radio propagation is not always symmetric. + +--- + +## Nachbarinformation + +The Neighbor Info module lets each node broadcast a list of the nodes it can **directly hear** (single-hop). When multiple nodes share their neighbor lists, you can piece together a topology map of the entire mesh. + +### Enabling Neighbor Info + +1. Navigate to **Settings → Module Config → Neighbor Info**. +2. Enable the module. +3. Set the broadcast interval (default: 900 seconds / 15 minutes). + +Once enabled, your node periodically broadcasts its neighbor table. Other nodes with Neighbor Info enabled do the same. + +### Viewing Neighbor Data + +- Open any node's detail screen and look for the **Neighbors** section. +- Each neighbor entry shows the node that was directly heard and its signal quality. +- Combine neighbor data from multiple nodes to understand the full mesh topology. + +> ⚠️ **Note:** Neighbor Info increases airtime usage because every enabled node periodically broadcasts its neighbor list. On busy meshes with many nodes, consider longer broadcast intervals (3600 seconds or more) to avoid congestion. + +--- + +## Node List as a Discovery Tool + +The node list itself is a powerful discovery tool when you use its filtering and sorting features effectively. + +### Finding New Nodes + +- Sort by **Last heard** to see the most recently active nodes at the top. +- Enable **Include unknown** to see nodes that have appeared on the mesh but haven't sent user info yet — these are often newly powered-on devices. + +### Assessing Connectivity + +- Sort by **Hops away** to see which nodes are directly reachable (0 hops) versus relayed. +- Sort by **Distance** to find nearby nodes and verify they're reachable. +- Use **Exclude MQTT** to focus on nodes reachable over radio (not via internet bridge). + +### Infrastructure Audit + +- Disable **Exclude infrastructure** to see Router, Repeater, Router Late, and Client Base nodes. +- Check their signal quality and last-heard times to verify your infrastructure nodes are healthy. + +See [Nodes](nodes) for full details on filtering and sorting options. + +--- + +## Tips for Mesh Exploration + +- **Start with traceroute** — it gives you immediate, actionable information about a specific path. +- **Enable Neighbor Info on key nodes** — especially routers and repeaters, to build a picture of the backbone. +- **Check the map** — node positions on the [Map](map-and-waypoints) combined with signal data help you understand why some links are strong and others are weak. +- **Compare signal over time** — use the [Signal Meter](signal-meter) guide to interpret SNR and RSSI values correctly. + +--- + diff --git a/docs/de-rDE/user/firmware.md b/docs/de-rDE/user/firmware.md new file mode 100644 index 000000000..887356185 --- /dev/null +++ b/docs/de-rDE/user/firmware.md @@ -0,0 +1,114 @@ +--- +title: Firmwareaktualisierungen +nav_order: 13 +last_updated: 2026-05-13 +description: Update your radio firmware over Bluetooth — OTA process, version channels, pre-flight checks, and recovery. +aliases: + - firmware + - update + - ota + - flash +--- + +# Firmwareaktualisierungen + +Keep your Meshtastic radio up to date with the latest firmware for new features, bug fixes, and security improvements. + +## Checking for Updates + +1. Navigate to **Settings → Firmware Update** or tap the firmware notification if shown. +2. The app checks for available firmware versions. +3. Available updates show the version number and changelog summary. + +## Update Methods + +### OTA (Over-The-Air) via Bluetooth + +The most common update method for Android users: + +1. Ensure your radio is connected via Bluetooth. +2. Navigate to the Firmware Update screen. +3. Select the desired firmware version. +4. Tap **Update** to begin the OTA process. +5. Wait for the update to complete — **do not disconnect** during the update. + +![Firmware checking for updates](/assets/screenshots/firmware_checking.png) + +> ⚠️ **Warning:** Interrupting a firmware update can brick your device. Ensure your radio has sufficient battery (>50% recommended) and maintain Bluetooth proximity during the entire process. + +![Firmware disclaimer](/assets/screenshots/firmware_disclaimer.png) + +### USB Flashing + +For recovery or when OTA is unavailable: + +- Use the [Meshtastic Web Flasher](https://flasher.meshtastic.org) +- Or the [Meshtastic CLI tool](https://meshtastic.org/docs/getting-started/flashing-firmware) on desktop + +## Version Channels + +| Kanal | Beschreibung | +| ------ | ------------------------------------------- | +| Stabil | Recommended for most users; tested releases | +| Alpha | Preview releases; may contain bugs | + +## Pre-Update Checklist + +Before updating: + +- [ ] Battery > 50% +- [ ] Stable Bluetooth connection +- [ ] Note your current settings (they may reset on major version changes) +- [ ] Check the release notes for breaking changes + +## Post-Update + +After a successful update: + +- The radio will reboot automatically +- Bluetooth connection will re-establish +- Verify your settings are intact +- Check the firmware version in **Settings → About** + +![Firmware update success](/assets/screenshots/firmware_success.png) + +## Fehlerbehebung + +### Update Stuck + +If the update appears frozen: + +- Wait at least 5 minutes before intervening +- If truly stuck, power-cycle the radio +- Attempt the update again + +![Firmware update error](/assets/screenshots/firmware_error.png) + +### Device Won't Boot After Update + +If your device fails to boot: + +1. Try connecting via USB to a computer +2. Use the web flasher in recovery/DFU mode +3. Flash a known-good firmware version +4. Check the Meshtastic Discord for device-specific recovery steps + +### Compatibility Warnings + +The app may show warnings when: + +- Connected radio firmware is below minimum supported version +- Major version mismatch between app and firmware +- Deprecated features need migration + +> ⚠️ **Important:** Always update the Meshtastic app before or alongside firmware updates to ensure compatibility. + +## Related Topics + +- [Connections](connections) — reconnecting after a firmware update +- [Flashing firmware guide](https://meshtastic.org/docs/getting-started/flashing-firmware) — full firmware flashing walkthrough on meshtastic.org +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — check firmware compatibility by device +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/de-rDE/user/map-and-waypoints.md b/docs/de-rDE/user/map-and-waypoints.md new file mode 100644 index 000000000..1191b5e06 --- /dev/null +++ b/docs/de-rDE/user/map-and-waypoints.md @@ -0,0 +1,116 @@ +--- +title: Map & Waypoints +nav_order: 6 +last_updated: 2026-05-13 +description: View node positions on the map, create and share waypoints, and manage position sharing and privacy. +aliases: + - map + - waypoints + - gps + - location +--- + +# Map & Waypoints + +The Map screen shows the geographic positions of nodes on your mesh, along with shared waypoints. + +## Map View + +The map displays: + +- **Node positions** — colored markers for each node reporting location +- **Waypoints** — shared points of interest +- **Your position** — your current GPS location + +### Node Markers + +Node markers on the map indicate: + +| Farbe | Meaning | +| ----- | ---------------------------------------------- | +| Grün | Online (heard recently) | +| Gelb | Away (heard within 2 hours) | +| Gray | Offline (stale position) | +| Blau | Ihr eigener Knoten | + +### Kartensteuerung + +- **Zoom** — pinch or use +/- buttons +- **Pan** — drag to explore +- **Center** — select the location button to center on your position +- **Node tap** — tap a node marker to view details + +The floating toolbar provides quick access to compass, layer switching, node filters, refresh, and location tracking. Tap the compass to reorient north-up, or tap the location button to center on your current position. + +![Map controls overlay](/assets/screenshots/map_controls_overlay.png) + +## Waypoints + +Waypoints are shared geographic points of interest that all mesh members can see. + +### Creating a Waypoint + +1. Long-press on the map at the desired location. +2. Enter a name and optional description. +3. Choose an icon/emoji for the waypoint. +4. Tap **Send** to share with the mesh. + +### Waypoint Properties + +| Property | Beschreibung | +| ------------ | ------------------------------------------------------- | +| Name | Short identifier (max 30 characters) | +| Beschreibung | Optional longer description | +| Icon | Visual marker emoji on the map | +| Gesperrt | If locked, only the creator can edit or delete | +| Expiration | Optional auto-remove time | + +### Waypoint Expiration + +Waypoints can be set to expire automatically: + +- **Never** (default) — waypoint remains until manually deleted +- **Timed** — waypoint is automatically removed after the specified duration (e.g., "remove after 2 hours"). Useful for temporary markers like rally points, hazards, or meeting locations. + +Expired waypoints are automatically hidden from the map so they don't clutter the display. The expiration countdown begins when the waypoint is created, not when other nodes receive it. + +### Managing Waypoints + +- Tap a waypoint on the map to view its details and coordinates +- Edit or delete waypoints you created +- **Locked waypoints** cannot be modified or deleted by other nodes — only the original creator can change them +- Unlocked waypoints can be edited by any mesh member + +## Position Sharing + +### Enabling Position Sharing + +Your node shares its GPS position based on: + +- **Fixed interval** — broadcast position at regular intervals +- **Smart position** — broadcast when movement exceeds a threshold +- **Manual** — only share when explicitly requested + +Configure position behavior in **Settings → Position**. + +### Privacy Considerations + +> 🔒 **Privacy:** Position data is broadcast to all nodes on your channel. If you don't want your location shared, disable GPS position in settings or use a fixed/fake position. + +## Map Sources + +The app supports multiple map tile sources: + +- OpenStreetMap (default) +- Satellite imagery (where available) +- Offline tiles (download map areas for offline use) + +## Related Topics + +- [Nodes](nodes) — view and filter your node list +- [Node Metrics](node-metrics) — signal quality and position history for individual nodes +- [Discovery](discovery) — traceroute and neighbor info for understanding mesh topology +- [Units & Locale](units-and-locale) — distance and coordinate display formats + +--- + diff --git a/docs/de-rDE/user/messages-and-channels.md b/docs/de-rDE/user/messages-and-channels.md new file mode 100644 index 000000000..1c31a91e9 --- /dev/null +++ b/docs/de-rDE/user/messages-and-channels.md @@ -0,0 +1,159 @@ +--- +title: Messages & Channels +nav_order: 3 +last_updated: 2026-05-13 +description: Send and receive messages, manage channels, configure encryption, and use quick chat, reactions, and message actions. +aliases: + - channels + - direct-messages + - messaging + - conversations +--- + +# Messages & Channels + +Meshtastic supports two communication modes: **channel broadcasts** and **direct messages**. + +## Kanäle + +Channels are shared communication groups. All nodes configured with the same channel key can read and send messages on that channel. + +### Default Channel + +Every Meshtastic device comes with a default **LongFast** channel. This is an unencrypted channel used for general mesh communication. + +### Kanalsicherheit + +Channels support multiple encryption levels: + +| Icon | Security Level | Beschreibung | +| ---- | ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------- | +| 🔒 | PSK (256-bit AES) | Fully encrypted with a strong pre-shared key. Only nodes with the matching key can read messages. | +| 🔐 | PSK (128-bit AES) | Encrypted with a shorter key. Secure for most uses but 256-bit is preferred for sensitive data. | +| 🔓 | Default / Open | Uses the well-known default key. **Any Meshtastic device** on the same preset can read these messages. | +| ⚠️ | Insecure + Position | Open channel that also broadcasts your GPS position. Use with caution in public meshes. | + +> 🔒 **Security Tip:** 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. + +### Adding a Channel + +1. Navigate to **Settings → Channels**. +2. Tap **Add Channel** or scan a QR code. +3. Configure the channel name and encryption key. +4. Share the channel URL/QR code with others who need access. + +Tapping a channel shows its details and sharing options. + +## Direktnachrichten + +Direct messages (DMs) are point-to-point encrypted communications between two specific nodes. + +### Sending a Direct Message + +1. Open the **Messages** tab. +2. Select a node from your contacts list or tap a node in the node list. +3. Type your message and tap **Send**. + +### Message States + +| State | Icon | Meaning | +| --------------------------------- | ---- | ----------------------------------------------------------------------------------------------------------------- | +| Queued | ⏳ | Message waiting to be sent | +| En route | ✓ | Delivered to the radio, awaiting acknowledgment | +| Zugestellt | ✓✓ | Acknowledgment received from recipient | +| Received | ✓ | Message received from the mesh (incoming) | +| S&F Routing | 🔗 | Store & Forward: message being routed through an S&F node | +| S&F Confirmed | 🔗 | Store & Forward: delivery confirmed via S&F node | +| Fehler | ✗ | Delivery failed after retries | + +### Delivery Errors + +When a message fails to deliver, the error indicator shows what went wrong: + +| Fehler | Meaning | What to Do | +| ------------------- | ---------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Keine Route | No path exists to the destination node | The recipient may be offline or out of mesh range. Try later or move closer. | +| Got NAK | The next-hop node refused to relay | The relay node may be congested. Wait and retry. | +| Zeitlimit erreicht | No acknowledgment within retry window | The recipient may be just out of range. Try increasing hop limit or moving to a better position. | +| Keine Schnittstelle | No radio interface available to send | Check that your radio is connected and the channel is configured. | +| Max Retransmit | All retry attempts exhausted | The mesh path is unreliable. Try a different channel or wait for conditions to improve. | +| Kein Kanal | The destination channel doesn't exist | Verify both nodes share the same channel configuration. | +| Too Large | Message exceeds maximum payload size | Shorten your message (max ~230 characters). | +| Keine Antwort | Node received message but didn't respond | The recipient's radio may be busy or in low-power sleep mode. | +| Duty Cycle Limit | Regional airtime limit reached | Your radio has used its allowed transmit time. Wait for the duty cycle window to reset (typically 1 hour in EU regions). | +| Ungültige Anfrage | Malformed or invalid message | This usually indicates a software bug. Try restarting the app. | + +> 💡 **Tip:** 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. + +## Message Features + +### Quick Chat + +Pre-configured messages for rapid communication: + +- Access via the Quick Chat button in the message input area +- Choose from built-in phrases or custom messages +- Customize quick chat messages in **Settings → Quick Chat** +- Useful when typing is impractical (gloves, small screen, urgent) + +![Quick chat option](/assets/screenshots/messages_quick_chat.png) + +The channel list shows each channel with its latest message preview. + +### Message Bubbles + +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. + +### Reactions + +React to messages with emoji: + +- **Long-press** a message to open the actions menu +- Tap **Add Reaction** to choose an emoji +- Reactions appear below the message bubble +- Multiple users can react to the same message +- React to your own messages or others' messages + +![Emoji reaction badges displayed beneath a message](/assets/screenshots/messages_reaction.png) + +> 💡 **Tip:** Reactions are lightweight — they use minimal mesh bandwidth compared to full text messages. + +### Message Actions + +Long-press any message to access: + +- **Copy** — copy message text to clipboard +- **Reply** — quote the message in your response +- **React** — add an emoji reaction +- **Delete** — remove a message you sent (local deletion) + +### Message Priority + +Messages are queued and transmitted based on priority: + +1. Emergency/alert messages (highest) +2. Direct messages +3. Channel broadcasts (lowest) + +### Message Limits + +- **Maximum length:** 237 bytes (approximately 230 characters for ASCII text) +- **Rate limiting:** The mesh enforces airtime fairness; heavy message volume may be throttled +- **Delivery:** Messages are retried automatically if no acknowledgment is received + +## Bewährte Praktiken + +- Use channels for group coordination +- Use direct messages for private person-to-person communication +- Keep messages short — mesh bandwidth is limited +- Configure encryption for sensitive communications + +## Related Topics + +- [Nodes](nodes) — tap a node to start a direct message +- [Settings — Radio & User](settings-radio-user) — configure channel encryption and presets +- [MQTT](mqtt) — bridge channel messages to the internet +- [Channel configuration](https://meshtastic.org/docs/configuration/radio/channels) — detailed channel settings on meshtastic.org + +--- + diff --git a/docs/de-rDE/user/mqtt.md b/docs/de-rDE/user/mqtt.md new file mode 100644 index 000000000..6e91d2665 --- /dev/null +++ b/docs/de-rDE/user/mqtt.md @@ -0,0 +1,137 @@ +--- +title: MQTT +nav_order: 11 +last_updated: 2026-05-13 +description: Bridge your mesh to the internet — MQTT broker setup, encryption layers, and map reporting. +aliases: + - mqtt + - internet-bridge + - broker +--- + +# MQTT + +MQTT bridges your Meshtastic mesh network to the internet, enabling long-range communication beyond radio range. + +## Übersicht + +The MQTT module connects your node to an MQTT broker, allowing: + +- Messages to reach nodes on different physical meshes via the internet +- Integration with home automation and monitoring systems +- Publishing node positions to the public Meshtastic map +- Custom data pipelines for logging and alerting + +## So funktioniert's + +``` +[Your Node] → Radio → [Gateway Node with WiFi] → MQTT Broker → [Remote Gateway] → Radio → [Remote Node] +``` + +A gateway node with internet access (WiFi or Ethernet) publishes mesh messages to an MQTT topic. Remote gateways subscribed to the same topic inject those messages into their local mesh. + +## Einstellungen + +### MQTT aktivieren + +1. Navigate to **Settings → Module Config → MQTT**. +2. Enable the MQTT module. +3. Configure the broker connection: + +![MQTT toggle switch](/assets/screenshots/settings_switch.png) + +| Einstellung | Beschreibung | Standardwert | +| --------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------- | +| Serveradresse | MQTT broker hostname | mqtt.meshtastic.org | +| Benutzername | Broker authentication | meshdev | +| Passwort | Broker authentication | large4cats | +| Hauptthema | Base topic for messages | msh | +| Verschlüsselung | Encrypt MQTT payload | Aktiviert | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON packet support has been removed from firmware; this field is ignored | Deaktiviert | +| TLS | Secure connection to broker | Deaktiviert | +| Map Reporting | Report position to public map | Deaktiviert | + +### Default Meshtastic Broker + +The community maintains a public broker at `mqtt.meshtastic.org`. This is intended for general use and testing. + +> 🔒 **Privacy:** Messages on the public broker are readable by anyone subscribed. Always use channel encryption for private communications. + +### Private Broker + +For better privacy and control, you can run your own MQTT broker: + +- Mosquitto (lightweight, open-source) +- HiveMQ +- EMQX + +Configure your node to point to your private broker with appropriate credentials. + +## Map Reporting + +When Map Reporting is enabled, your node publishes its position to the Meshtastic community map: + +- Visible at [meshmap.net](https://meshmap.net) and similar community map services +- Only position and node info are shared +- Disable this if you don't want your location publicly visible + +## Uplink vs Downlink + +| Direction | Beschreibung | +| ------------ | -------------------------------- | +| **Uplink** | Messages from mesh → MQTT broker | +| **Downlink** | Messages from MQTT broker → mesh | + +Configure per-channel which directions are active to control message flow and airtime usage. + +## Message Formats + +MQTT uses protobuf message format: + +| Format | Beschreibung | Use case | +| ------------ | ----------------------------------- | -------------------------- | +| **Protobuf** | Binary Meshtastic protobuf encoding | Node-to-node mesh bridging | + +> ⚠️ **Note:** JSON output support was removed from firmware. The `json_enabled` setting is still visible in the app for legacy compatibility but has no effect on current firmware versions. + +## Encryption & Privacy + +Understanding the layered encryption model: + +1. **Channel encryption** happens on the mesh _before_ MQTT. If your channel has a PSK, the MQTT payload is already encrypted — the broker and any subscribers see only the ciphertext. +2. **MQTT encryption** (the module setting) adds an additional encryption layer for transit to the broker. This protects metadata and routing information. +3. **TLS** encrypts the TCP connection to the broker itself, preventing network-level eavesdropping. + +> 🔒 **Important:** The default public channel has a well-known key. Messages on the default channel sent via MQTT are effectively **unencrypted** — anyone can decode them. Always use a custom PSK for private communications. + +## Bewährte Praktiken + +- Use channel-level encryption (PSK) on channels that bridge to MQTT +- Don't enable MQTT on nodes without internet access (it will buffer and waste memory) +- Use a private broker for sensitive deployments +- Be mindful of airtime when downlinking messages from busy MQTT topics — every downlinked message consumes radio airtime on your local mesh +- Consider enabling uplink-only if you only need to monitor your mesh remotely without injecting messages back + +## Fehlerbehebung + +### MQTT Not Connecting + +- **Check WiFi** — the gateway node must have an active internet connection (WiFi or Ethernet). MQTT does not work over the LoRa radio link itself. +- **Verify credentials** — incorrect username or password will silently fail on most brokers. Double-check for trailing spaces. +- **Firewall** — port 1883 (MQTT) or 8883 (MQTT+TLS) must be open. Some networks block non-standard ports. +- **DNS resolution** — if using a custom broker hostname, verify the node can resolve it. Try the broker's IP address directly. + +### Messages Not Bridging + +- **Check uplink/downlink settings** — if only uplink is enabled, messages flow from mesh to MQTT but not back. Enable downlink on the receiving gateway. +- **Channel mismatch** — both gateways must share the same channel with the same PSK. A mismatch means messages are encrypted with different keys and appear as garbage. +- **Topic mismatch** — ensure both gateways use the same root topic. The default `msh` works for the public broker. + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — MQTT module configuration reference +- [Messages & Channels](messages-and-channels) — channel encryption and PSK setup +- [MQTT integration guide](https://meshtastic.org/docs/software/integrations/mqtt) — detailed MQTT documentation on meshtastic.org + +--- + diff --git a/docs/de-rDE/user/node-metrics.md b/docs/de-rDE/user/node-metrics.md new file mode 100644 index 000000000..ea61bc628 --- /dev/null +++ b/docs/de-rDE/user/node-metrics.md @@ -0,0 +1,130 @@ +--- +title: Node Metrics +nav_order: 5 +last_updated: 2026-05-13 +description: Telemetry dashboards for each mesh node — device health, environment sensors, signal quality, power, traceroute, and position history. +aliases: + - metrics + - telemetry + - device-metrics + - signal +--- + +# Node Metrics + +The node detail screen provides comprehensive telemetry and metrics for each node on your mesh. + +## Gerätedaten + +Basic operating information reported by each node: + +| Metrisch | Beschreibung | +| --------------- | ----------------------------------- | +| Batterie Ladung | Current battery percentage | +| Spannung | Battery voltage reading | +| Kanalbelegung | Percentage of airtime consumed | +| Airtime | Transmission time used by this node | +| Laufzeit | Time since last reboot | + +Device metrics are displayed as individual cards with trend sparklines showing battery level, voltage, channel utilization, airtime, and uptime over time. + +> 💡 **Tip:** Tap any metric card to expand it into a full chart with historical data points. Pinch to zoom the time axis. + +## Umweltdaten + +Environmental sensor data (requires compatible hardware): + +| Metrisch | Sensor Examples | +| ------------------------------------ | --------------------- | +| Temperatur | BME280, BME680, SHT31 | +| Luftfeuchtigkeit | BME280, BME680, SHT31 | +| Luftdruck | BME280, BMP280 | +| Gaswiderstand | BME680 | +| IAQ (Air Quality) | BME680 | + +Environment metrics are charted over time for easy trend analysis — temperature, humidity, and pressure each get their own line chart with the measurement unit displayed on the Y axis. + +> 💡 **Tip:** Environment metrics require a sensor connected to the remote node. Not all nodes report environmental data. See [Telemetry & Sensors](telemetry-and-sensors) for a full list of supported sensors. + +## Signaldaten + +Radio signal quality information: + +| Metrisch | Beschreibung | +| ----------- | ----------------------------------------------------------------------------- | +| SNR | Signal-to-Noise Ratio (higher is better) | +| RSSI | Received Signal Strength Indicator (closer to 0 is better) | +| Sprungweite | Number of mesh hops for last message | + +### Signal Quality Reference + +| SNR Range | Quality | +| --------------------------------- | ------------------------ | +| > 10 dB | Excellent | +| 0 to 10 dB | Gut | +| -10 to 0 dB | Ordentliche Signalstärke | +| < -10 dB | Poor | + +## Energiedaten + +Power management telemetry (requires INA sensor or compatible hardware): + +| Metrisch | Beschreibung | +| ----------- | ----------------------- | +| Bus Voltage | Supply voltage | +| Stromstärke | Power draw in milliamps | +| Leistung | Calculated wattage | + +## Traceroute + +Traceroute shows the path a message takes through the mesh: + +1. From the node detail screen, tap **Traceroute**. +2. The app sends a traceroute request to the target node. +3. Results show each hop with SNR/RSSI values. + +### Reading Traceroute Results + +``` +You → Node A (SNR: 8.5) → Node B (SNR: 5.2) → Target +``` + +Each hop represents a relay node that forwarded the message. + +## Standortprotokoll + +Historical position data for nodes that share their location: + +- GPS coordinates +- Höhe +- Speed (if moving) +- Timestamp for each position report + +## Nachbarinformation + +Shows which nodes a given node can directly hear, useful for understanding mesh topology. + +## Viewing Metrics + +1. Navigate to **Nodes**. +2. Tap the node you want to inspect. +3. Select the metric category from the detail tabs. + +![Node detail — local device](/assets/screenshots/nodes_detail_local.png) + +The position tab shows location data for nodes that share GPS: + +![Position inline content](/assets/screenshots/nodes_position.png) + +> ⚠️ **Note:** Metrics are only available when they have been reported by the remote node. Metrics update at intervals configured on each node's telemetry settings. + +## Related Topics + +- [Nodes](nodes) — node list, filtering, and sorting +- [Telemetry & Sensors](telemetry-and-sensors) — supported sensors and configuration +- [Signal Meter](signal-meter) — how signal quality is calculated from SNR and RSSI +- [Discovery](discovery) — traceroute details and neighbor info +- [Units & Locale](units-and-locale) — temperature, distance, and speed display formats + +--- + diff --git a/docs/de-rDE/user/nodes.md b/docs/de-rDE/user/nodes.md new file mode 100644 index 000000000..9334a0414 --- /dev/null +++ b/docs/de-rDE/user/nodes.md @@ -0,0 +1,152 @@ +--- +title: Knoten +nav_order: 4 +last_updated: 2026-05-13 +description: Browse, filter, and sort mesh nodes — view details, signal quality, roles, and quick actions. +aliases: + - node-list + - mesh-nodes + - peers +--- + +# Knoten + +The Nodes screen displays all devices visible on your mesh network. + +## Node List + +The node list shows every node your radio has heard, including: + +- **Node name** — user-configured long name +- **Short name** — 4-character identifier +- **Signal quality** — last heard signal strength +- **Last heard** — time since last communication +- **Distance** — estimated distance (if positions are shared) +- **Battery** — remote node battery level (if telemetry is enabled) + +### Node Status Indicators + +| Badge | Meaning | +| ---------- | ------------------------------------- | +| 🟢 Online | Node heard within the last 15 minutes | +| 🟡 Away | Node heard within the last 2 hours | +| 🔴 Offline | Node not heard for over 2 hours | +| ⭐ Favorite | Node marked as favorite by the user | + +### Node Roles + +Nodes can be configured with different roles that affect their mesh behavior: + +| Rolle | Beschreibung | +| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Client | Standard end-user device | +| Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | +| Client Mute | Receives but doesn't retransmit | +| Client - Versteckt | Like Client Mute, plus hides from node list | +| Router | Prioritizes message forwarding; stays awake to relay | +| Router mit Verzögerung | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | +| ~~Router Client~~ | ⚠️ **Deprecated** (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | +| ~~Repeater~~ | ⚠️ **Deprecated** (removed in firmware 2.7.11) — no longer selectable; use Router instead | +| Tracker | Optimized for position reporting at regular intervals | +| Sensor | Optimized for telemetry reporting | +| TAK | Interoperates with TAK systems (sends/receives CoT) | +| TAK Tracker | TAK position reporting only | +| Lost & Found | Continuous position beacon for recovery | + +### Choosing a Role + +Most users should keep the default **Client** role. Consider a different role when: + +- **Router** — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don't use Router on battery-powered handheld devices. +- **Router Late** — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. +- **Client Base** — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. +- **Client Mute** — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only devices or to reduce congestion in dense areas. +- **Tracker** — An unattended device whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. +- **Sensor** — An unattended device reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. +- **TAK / TAK Tracker** — Only needed if interoperating with ATAK/WinTAK systems. See [TAK Integration](tak) for details. + +> 💡 **Tip:** The mesh works best when most nodes are **Client** or **Router**. Too many Mute nodes reduces mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. + +### Encryption Indicators + +Nodes display encryption status icons next to their name: + +| Icon | Meaning | +| ----------- | ------------------------------------------------------------------------------------------------------------------- | +| 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | +| 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | +| ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) | + +> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. + +## Quick Actions + +From the node list, you can: + +- **Tap** a node to view its detail page +- **Long-press** for quick actions: + - Send a direct message + - Auf der Karte anzeigen + - Position anfordern + - Mark as favorite + - Traceroute + +## Filtering & Sorting + +### Text Search + +Type in the search field to filter nodes by name or short name. The filter updates in real time as you type. + +### Filter Toggles + +| Filter | Beschreibung | +| -------------------------- | ---------------------------------------------------------------------------------------------- | +| **Only online** | Show only nodes heard within the last 15 minutes | +| **Only direct** | Show only nodes with direct (non-relayed) connections | +| **Include unknown** | Show nodes that haven't sent user info yet | +| **Exclude infrastructure** | Hide infrastructure-role nodes (Router, Repeater, Router Late, Client Base) | +| **Exclude MQTT** | Hide nodes heard only via MQTT internet bridge | +| **Show ignored** | Show nodes you've previously dismissed or muted | + +### Sort Options + +| Sort | Beschreibung | +| ------------------------------------------- | ------------------------------------------------------------------ | +| **Last heard** (default) | Most recently heard nodes first | +| **Alphabetical** | Sorted by node long name | +| **Distance** | Nearest nodes first (requires position sharing) | +| **Hops away** | Fewest relay hops first | +| **Channel** | Grouped by channel index | +| **Via MQTT** | Grouped by MQTT vs. radio-heard | +| **Favorites** | Favorited nodes first | + +## Node Detail + +Tapping a node opens the detail view with comprehensive information. See [Node Metrics](node-metrics) for full details on metrics and telemetry. + +![Node detail view](/assets/screenshots/nodes_node_list.png) + +The detail screen includes device info, position, and action buttons: + +![Node detail section](/assets/screenshots/nodes_detail_section.png) + +Inline status indicators show key metrics at a glance: + +| Indicator | Bildschirmfoto | +| -------------- | -------------------------------------------------------- | +| Signal quality | ![Signal](/assets/screenshots/nodes_signal_info.png) | +| Akkustand | ![Battery](/assets/screenshots/nodes_battery_info.png) | +| Hop count | ![Hops](/assets/screenshots/nodes_hops_info.png) | +| Zuletzt gehört | ![Last heard](/assets/screenshots/nodes_last_heard.png) | +| Distanz | ![Distance](/assets/screenshots/nodes_distance_info.png) | + +## Related Topics + +- [Node Metrics](node-metrics) — detailed telemetry dashboards for each node +- [Messages & Channels](messages-and-channels) — send a direct message to a node +- [Map & Waypoints](map-and-waypoints) — view node positions geographically +- [Discovery](discovery) — traceroute and neighbor info for topology exploration +- [Signal Meter](signal-meter) — understand what the signal bars mean + +--- + diff --git a/docs/de-rDE/user/onboarding.md b/docs/de-rDE/user/onboarding.md new file mode 100644 index 000000000..b4d990b7c --- /dev/null +++ b/docs/de-rDE/user/onboarding.md @@ -0,0 +1,99 @@ +--- +title: Erste Schritte +nav_order: 1 +last_updated: 2026-05-13 +description: First-launch setup — permissions, onboarding flow, and next steps after connecting your radio. +aliases: + - first-launch + - setup + - intro +--- + +# Erste Schritte + +Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app. + +## First Launch + +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. + +### Welcome Screen + +The welcome screen introduces Meshtastic and its core capabilities: + +- Off-grid mesh communication +- No cellular or internet required +- End-to-end encrypted messaging + +Tap **Get Started** to proceed through the setup flow. + +![Welcome screen](/assets/screenshots/onboarding_welcome.png) + +## Permissions + +The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. + +### Bluetooth Permission + +Bluetooth is the primary connection method between your phone and Meshtastic radio: + +- **Bluetooth scanning** — discover nearby Meshtastic radios +- **Bluetooth connect** — establish and maintain connections with paired radios + +Grant both permissions when prompted. Without Bluetooth, you'll need to use USB or TCP connections instead. + +### Location Permission + +> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. + +Meshtastic also uses your location for: + +- Showing your position on the mesh map +- Calculating distances to other nodes +- Sharing your GPS coordinates with other mesh members (if enabled) + +Grant **"While using the app"** or **"Always"** depending on your preference: + +- **While using the app** — position updates only when the app is open +- **Always** — enables background position updates for always-on mesh presence + +If denied, Bluetooth scanning will not function and your node will not report a position. + +### Notifications Permission + +Notifications alert you to: + +- Incoming messages from channels and direct messages +- Connection status changes (connected, disconnected, reconnecting) +- Firmware update availability + +> 💡 **Tip:** You can fine-tune notification preferences later in Android system settings. The app creates separate notification channels for messages, connection events, and background service status. + +### Critical Alerts Permission + +On supported devices, the app may request permission for critical alerts: + +- These are high-priority notifications that can break through Do Not Disturb mode +- Useful for emergency mesh alerts or urgent messages +- You can **skip** this step if you don't need breakthrough notifications +- Configure or revoke later in Android notification settings + +## After Setup + +Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. + +> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. + +## What's Next? + +Once connected to a radio, explore: + +- [Connections](connections) — pair your first radio device +- [Messages & Channels](messages-and-channels) — send your first message +- [Nodes](nodes) — see who's on your mesh +- [Map & Waypoints](map-and-waypoints) — view node positions +- [Settings](settings-radio-user) — configure your radio and user profile + +New to Meshtastic? The [getting started guide](https://meshtastic.org/docs/getting-started) on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup. + +--- diff --git a/docs/de-rDE/user/settings-module-admin.md b/docs/de-rDE/user/settings-module-admin.md new file mode 100644 index 000000000..96bbe3cf1 --- /dev/null +++ b/docs/de-rDE/user/settings-module-admin.md @@ -0,0 +1,246 @@ +--- +title: Settings — Modules & Admin +nav_order: 8 +last_updated: 2026-05-13 +description: Configure optional feature modules (MQTT, telemetry, canned messages, TAK, and more) and perform device administration. +aliases: + - modules + - module-config + - administration +--- + +# Settings — Modules & Admin + +Configure optional feature modules and perform device administration. Modules extend Meshtastic with specialized capabilities — each can be independently enabled or disabled. + +> 💡 **Tip:** You only need to enable the modules you actually use. Disabling unused modules reduces airtime, saves battery, and simplifies your configuration. + +Module settings use a card-based layout with toggle switches, dropdowns, text fields, and sliders: + +![Toggle switch](/assets/screenshots/settings_switch.png) + +![Dropdown selector](/assets/screenshots/settings_dropdown.png) + +![Text field](/assets/screenshots/settings_text_field.png) + +![Settings card layout](/assets/screenshots/settings_titled_card.png) + +## Moduleinstellungen + +### MQTT Module + +Bridges mesh messages to and from an MQTT broker for internet connectivity. This is how you extend your mesh beyond radio range or integrate with home automation systems. + +| Einstellung | Beschreibung | +| --------------- | ------------------------------------------------------------------------ | +| Aktiviert | Toggle MQTT bridge | +| Server | MQTT broker address | +| Benutzername | Authentication username | +| Passwort | Authentication password | +| Verschlüsselung | Encrypt MQTT payloads | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON support removed from firmware; field is ignored | +| TLS | Use secure connection | +| Hauptthema | Base MQTT topic path | +| Map Report | Publish position for public map | + +See [MQTT](mqtt) for a detailed usage guide including encryption, privacy, and broker setup. + +### Serial Module + +Enables serial port communication for external device integrations (GPS modules, sensors, or custom hardware). When enabled, the node's serial port can send and receive protobuf or text data, allowing external microcontrollers or computers to interact with the mesh. + +| Einstellung | Beschreibung | +| ------------- | ------------------------------- | +| Aktiviert | Activate serial communication | +| Echo | Echo received serial data back | +| Betriebsmodus | Text, Protobuf, or NMEA output | +| RX/TX Pins | GPIO pins for serial connection | +| Baudrate | Serial communication speed | + +### External Notification Module + +Controls buzzer, LED, or vibration alerts on your radio hardware. Useful for devices that need to physically signal when a message arrives — particularly helpful for unattended or outdoor installations. + +| Einstellung | Beschreibung | +| -------------------------------- | --------------------------- | +| Aktiviert | Activate notifications | +| Warnmeldung | Notify on incoming messages | +| Summer bei Warnmeldung | Use buzzer for messages | +| Alert Message Vibra | Use vibration for messages | +| Warnglocke | Notify on bell character | +| Output (GPIO) | Pin for notification output | +| Aktiv | High or Low active | +| Duration (ms) | Notification length | +| Use I2S as Buzzer | Use I2S audio output | + +### Store & Forward Module + +Buffers messages for nodes that were temporarily offline, then replays them when those nodes reconnect. Essential for meshes where nodes go in and out of range regularly — ensures messages aren't lost during brief disconnections. + +| Einstellung | Beschreibung | +| ------------------------------------------ | -------------------------- | +| Aktiviert | Activate store and forward | +| Heartbeat (s) | Announcement interval | +| Datensätze | Maximum stored messages | +| History Return (max) | Max messages to replay | +| History Return (window) | Time window for replay | + +> 💡 **Tip:** Store and Forward works best on nodes with ample memory (ESP32 with PSRAM). Router nodes are ideal candidates since they're typically always-on. + +### Range Test Module + +Automated range testing tool for evaluating link quality between nodes. When enabled, the node periodically transmits test messages with incrementing counters. A receiver node logs these messages, allowing you to walk or drive away and later analyze at what distance messages stopped arriving. + +| Einstellung | Beschreibung | +| -------------------------------------- | --------------------------------- | +| Aktiviert | Activate range testing | +| Sender Interval (s) | Time between test transmissions | +| Save CSV | Log received test data to SD card | + +### Telemetry Module + +Controls what telemetry data your node shares with the mesh. Telemetry includes device health (battery, uptime) and environmental sensor data (temperature, humidity, pressure). + +| Einstellung | Beschreibung | +| ---------------------------- | --------------------------------------- | +| Device Metrics Interval | How often to report device metrics | +| Environment Metrics Interval | How often to report environment sensors | +| Luftqualität aktiviert | Report particulate sensor data | +| Energiedaten aktiviert | Report power usage | + +See [Telemetry & Sensors](telemetry-and-sensors) for supported sensors and configuration recommendations. + +### Canned Message Module + +Pre-configured messages accessible from the device's physical buttons (for radios with rotary encoders, keypads, or similar input hardware). Define a list of quick-send messages that can be transmitted without a phone connected — ideal for field use. + +| Einstellung | Beschreibung | +| ------------------ | ----------------------------------------------------------- | +| ~~Enabled~~ | ⚠️ **Deprecated** — current firmware may ignore this toggle | +| Nachrichten | Newline-separated list of messages | +| Sende Glocke | Play bell sound on send | +| Rotary Encoder | Enable rotary encoder input | +| Up/Down/Press Pins | GPIO pin assignments for input | + +### Audio Module + +Codec2 audio support for low-bandwidth voice communication over the mesh. This is an **experimental** feature that encodes voice into very small data packets using the Codec2 codec. + +| Einstellung | Beschreibung | +| --------------- | -------------------------------- | +| Aktiviert | Activate audio module | +| Codec2 Rate | Audio quality/bandwidth tradeoff | +| I2S Wortauswahl | GPIO pin for I2S WS | +| I2S Data In | GPIO pin for I2S DIN | +| I2S Data Out | GPIO pin for I2S DOUT | + +> ⚠️ **Note:** Audio requires specific hardware (I2S microphone and speaker). Voice quality is very low-bandwidth — think "understandable radio voice," not phone-call quality. + +### Remote Hardware Module + +GPIO control over the mesh network. Allows a remote node to read or write GPIO pins on another node — useful for activating relays, reading switches, or controlling external hardware from a distance. + +| Einstellung | Beschreibung | +| -------------------- | --------------------------------------------------------------- | +| Aktiviert | Activate remote GPIO access | +| Allow Undefined Pins | Allow access to any GPIO pin (security risk) | + +> ⚠️ **Warning:** Enabling "Allow Undefined Pins" gives remote nodes access to all GPIO pins, which could interfere with the radio's own hardware. Only enable on dedicated GPIO nodes. + +### Neighbor Info Module + +Broadcasts information about directly heard neighbors, enabling mesh topology mapping. Each enabled node periodically shares a list of the other nodes it can hear and their signal quality. + +| Einstellung | Beschreibung | +| -------------------------------------- | ------------------------------------ | +| Aktiviert | Activate neighbor broadcasting | +| Update Interval (s) | How often to broadcast neighbor list | + +See [Discovery](discovery) for how to use neighbor data for mesh topology exploration. + +### Ambient Lighting Module + +Controls onboard NeoPixel or other addressable RGB LEDs on supported hardware. Can be used for visual status indicators, notification lights, or decorative effects. + +| Einstellung | Beschreibung | +| ------------------ | ---------------------------------------------------------- | +| Aktiviert | Activate LED control | +| LED Status | On, Off, or set specific color | +| Red / Green / Blue | Individual color channel values (0–255) | + +### Detection Sensor Module + +Turns your node into a motion or door sensor alert system. When a GPIO pin detects a state change (motion detected, door opened), the node broadcasts an alert message over the mesh. + +| Einstellung | Beschreibung | +| ---------------------------------------- | ----------------------------------------------------------------------- | +| Aktiviert | Activate detection sensor | +| GPIO Pin überwachen | GPIO pin connected to sensor | +| Erkennung Logik 1 | Trigger when pin goes high (vs. low) | +| Minimum Broadcast (s) | Minimum time between alert broadcasts | +| State Broadcast (s) | Periodic state broadcast interval | +| Sende Glocke | Include bell character in alerts | +| Anzeigename | Custom name for this sensor | + +### Paxcounter Module + +People counter using WiFi and BLE probe requests. Counts nearby devices by passively listening for probe requests that phones and laptops emit when scanning for networks. Available only on ESP32 devices. + +| Einstellung | Beschreibung | +| -------------------------------------- | -------------------------- | +| Aktiviert | Activate people counting | +| Update Interval (s) | How often to report counts | + +> 💡 **Tip:** Paxcounter is useful for estimating foot traffic at trailheads, event venues, or other locations. Counts are approximate — one person may carry multiple devices. + +### TAK Module + +Team Awareness Kit integration for interoperability with ATAK and WinTAK. See [TAK Integration](tak) for detailed setup and usage. + +## Einstellung + +### Ferneinstellung + +Remotely configure nodes that share your admin key: + +1. Select the target node in the node list. +2. Navigate to **Settings** for that node. +3. Modify configuration. +4. Tap **Save** — changes are sent over the mesh. + +> ⚠️ **Requires:** Admin key configured on both your node and the target node. + +### Knotendatenbank leeren + +Removes stale nodes from your local database that haven't been heard in a configurable time window. + +### Werkseinstellungen + +Resets all settings to factory defaults. **This cannot be undone.** + +### Neustart + +Remotely reboot a connected or administered node. + +### Debug-Ausgaben + +View detailed diagnostic information: + +- Protocol buffers debug output +- Mesh packet log +- Connection state details + +### Troubleshooting Remote Admin + +- **"No response from target node"** — the target may be out of range, offline, or have a mismatched admin key. Verify the admin key matches on both nodes. +- **Changes not applying** — some settings require a reboot to take effect. Try the Reboot action after saving. +- **Can't see remote settings** — ensure your node has the admin key for the target node and that Admin Channel is enabled in Security Config. + +## Related Topics + +- [Settings — Radio & User](settings-radio-user) — core radio and user profile settings +- [Module configuration reference](https://meshtastic.org/docs/configuration/module) — detailed module docs on meshtastic.org +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/de-rDE/user/settings-radio-user.md b/docs/de-rDE/user/settings-radio-user.md new file mode 100644 index 000000000..44246c7f9 --- /dev/null +++ b/docs/de-rDE/user/settings-radio-user.md @@ -0,0 +1,173 @@ +--- +title: Settings — Radio & User +nav_order: 7 +last_updated: 2026-05-13 +description: Configure your radio hardware, LoRa presets, user profile, position sharing, power management, and security. +aliases: + - Einstellungen + - radio-config + - user-config + - lora +--- + +# Settings — Radio & User + +Configure your radio hardware and user identity parameters. + +## Benutzereinstellungen + +### User Profile + +| Einstellung | Beschreibung | +| ----------------- | ------------------------------------------------------------------------------------- | +| Langer Name | Your display name (up to 39 characters) | +| Kurzname | 4-character abbreviated name | +| Licensed Operator | Enable if you hold an amateur radio license (enables higher power) | + +### Applying Changes + +After modifying settings, tap **Save** to write the configuration to your radio. The device may reboot to apply changes. + +## Funkgeräteeinstellung + +### Geräteeinstellungen + +| Einstellung | Beschreibung | Standardwert | +| ------------------------------------------ | ----------------------------------------------------------------------- | ------------ | +| Rolle | Node behavior (Client, Router, etc.) | Client | +| Weiterleitungsmodus | How the node retransmits messages | Alle | +| Node Info Broadcast (s) | Interval for broadcasting node info | 10800 | +| Double-tap Button | Action for double-tap button press | Deaktiviert | + +### LoRa Einstellungen + +| Einstellung | Beschreibung | Standardwert | +| ---------------------- | ----------------------------------------------------------------------- | ----------------------------------------- | +| Region | Regulatory region for frequency bands | Unset (must configure) | +| Modem Voreinstellungen | Speed/range tradeoff | LongFast | +| Sprungweite | Maximum retransmit hops | 3 | +| TX Power | Transmission power (dBm); 0 = max allowed for region | 0 (region max) | +| Frequenzversatz | Fine-tune frequency (MHz) | 0 | +| Channel Bandwidth | Bandwidth setting | Default for preset | + +> ⚠️ **Important:** You **must** set your region before transmitting. Operating without the correct region may violate local radio regulations. See the [region configuration guide](https://meshtastic.org/docs/getting-started/initial-config) on meshtastic.org for details. + +### Modem Presets + +| Preset | Bereich | Geschwindigkeit | SNR Limit | Best For | +| -------------------------------- | ----------------------- | ------------------------- | ------------------------ | -------------------------------------------------------------------------------------------------------- | +| SHORT_TURBO | ~1 km | 21.9 kbps | −5 dB | Dense urban with line-of-sight; data-heavy applications | +| Short Fast | ~3 km | 10.9 kbps | −7.5 dB | Urban neighborhoods; buildings within a few blocks | +| Short Slow | ~5 km | 5.5 kbps | −10 dB | Suburban short-range; moderate building density | +| MEDIUM_FAST | ~5 km | 5.5 kbps | −10 dB | Suburban areas; moderate building density | +| MEDIUM_SLOW | ~8 km | 1.1 kbps | −12.5 dB | Suburban/rural; moderate range with slower speed | +| Long Turbo | ~10 km | 4.4 kbps | −10 dB | Similar range to Long Fast but with 500 kHz bandwidth; faster throughput | +| Long Fast | ~10 km | 1.1 kbps | −12.5 dB | **General use (default)** — balanced range and speed | +| Long Moderate | ~20 km | 0,34 kbit/s | −15 dB | Rural with some terrain; occasional use | +| Lite Fast | ~5 km | 5.5 kbps | −10 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Medium Fast | +| Lite Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Long Fast | +| Narrow Fast | ~5 km | 2.7 kbps | −10 dB | EU 868 MHz band (62.5 kHz BW); avoids interference with other devices | +| Narrow Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 868 MHz band (62.5 kHz BW); comparable to Long Fast | +| ~~Long Slow~~ | ~30 km | 0,18 kbit/s | −17.5 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | +| ~~Very Long Slow~~ | ~40+ km | 0.09 kbps | −20 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | + +#### Choosing a Modem Preset + +The modem preset controls the fundamental tradeoff between **range** and **data rate**: + +- **Slower presets** use more spreading, making signals decodable at weaker signal levels (lower SNR limit). This means longer range but fewer bytes per second. +- **Faster presets** pack more data per transmission but require a stronger signal to decode. + +**Practical guidance:** + +- **Urban mesh (many nodes, short distances):** Use **Long Fast** (default) or **Short Fast**. Higher speed means less airtime congestion when many nodes share the channel. +- **Rural/sparse mesh (few nodes, long distances):** Use **Long Moderate**. Range matters more than speed when nodes are far apart. +- **EU 866/868 MHz regulatory compliance:** Use **Lite Fast**, **Lite Slow**, **Narrow Fast**, or **Narrow Slow** — these are optimized for the EU SRD/868 MHz bands with narrower bandwidths. +- **Fixed infrastructure links:** Use **Short Turbo** or **Long Turbo** for dedicated point-to-point links with good antennas and line-of-sight. +- **Mixed environments:** Stick with **Long Fast** — it's the community default and ensures compatibility with others in your area. + +> ⚠️ **Important:** All nodes on the same channel **must** use the same modem preset. Nodes with mismatched presets cannot communicate even if they share the same frequency and encryption key. + +> 💡 **Tip:** The range estimates above assume flat terrain and modest antennas. Elevation advantage (hilltop, rooftop) dramatically increases effective range. A well-placed Router with Long Fast can often outperform a ground-level node with Long Slow. + +### Anzeigeeinstellungen + +| Einstellung | Beschreibung | +| ------------------ | ------------------------------------------------------------------------------------ | +| Anzeigeabschaltung | Time before display sleeps | +| Anzeigeeinheiten | Metric or Imperial | +| OLED Typ | Auto, SSD1306, SH1106, SH1107 | +| Kompassausrichtung | Rotation offset for compass display (0°, 90°, 180°, 270°) | +| ~~Compass North~~ | ⚠️ **Deprecated** — replaced by Compass Orientation; still visible in older firmware | + +### Standorteinstellungen + +| Einstellung | Beschreibung | +| ----------------------------------------- | ---------------------------------- | +| GPS Enabled | Enable/disable GPS | +| GPS Aktualisierungsintervall | How often to acquire GPS fix | +| Position Broadcast (s) | How often to share position | +| Intelligente Position | Enable movement-based broadcasting | +| Fester Standort | Use a manually set position | + +### Energie Einstellungen + +| Einstellung | Beschreibung | +| --------------------------------------- | --------------------------------------- | +| Energiesparen | Enable low-power sleep mode | +| Shutdown After (s) | Auto-shutdown idle timer | +| ADC Multiplier | Battery voltage calibration factor | +| Wait Bluetooth (s) | Time to wait for BLE connection at boot | +| Mesh SDS Timeout (s) | Super-deep-sleep timeout | + +### Netzwerkeinstellungen + +| Einstellung | Beschreibung | +| -------------- | ---------------------------------------------------- | +| WLAN aktiviert | Enable WiFi radio (ESP32 devices) | +| WLAN SSID | Network name to connect to | +| WLAN PSK | Netzwerkpasswort | +| NTP Server | Time synchronization server | +| Syslog Server | Remote logging server | + +![IP address field](/assets/screenshots/settings_ipv4_field.png) + +### Bluetooth Einstellungen + +| Einstellung | Beschreibung | +| ----------------- | ------------------------------------------------------------------------- | +| Bluetooth Enabled | Enable/disable BLE radio | +| Kopplungsmodus | Fixed PIN, Random PIN, or No PIN | +| Feste PIN | PIN code for pairing (default: 123456) | + +### Sicherheitseinstellungen + +| Einstellung | Beschreibung | +| ----------------------------------------------- | -------------------------------------------------------------------------- | +| Öffentlicher Schlüssel | Your node's public key (read-only) | +| Administrativer Schlüssel | Key for remote administration | +| Privater Schlüssel | Your node's private key (handle securely) | +| Administrativer Kanal aktiviert | Allow admin commands via channel | +| Fehlersuchprotokolle (Debug) | Output live debug logging over serial/bluetooth | +| Serial Enabled | Enable serial console access (moved from Device Config) | +| Verwalteter Modus | Restrict non-admin channel changes | + +![Password field](/assets/screenshots/settings_password_field.png) + +Settings use standard preference controls — dropdowns, toggles, and sliders: + +| Control | Bildschirmfoto | +| -------- | ------------------------------------------------------ | +| Dropdown | ![Dropdown](/assets/screenshots/settings_dropdown.png) | +| Toggle | ![Toggle](/assets/screenshots/settings_switch.png) | +| Slider | ![Slider](/assets/screenshots/settings_slider.png) | + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — optional feature modules and device administration +- [Signal Meter](signal-meter) — how modem presets affect signal quality thresholds +- [LoRa configuration](https://meshtastic.org/docs/configuration/radio/lora) — detailed LoRa settings reference on meshtastic.org +- [Initial configuration](https://meshtastic.org/docs/getting-started/initial-config) — region setup guide on meshtastic.org + +--- + diff --git a/docs/de-rDE/user/signal-meter.md b/docs/de-rDE/user/signal-meter.md new file mode 100644 index 000000000..f2c11bcac --- /dev/null +++ b/docs/de-rDE/user/signal-meter.md @@ -0,0 +1,81 @@ +--- +title: How the Meshtastic Signal Meter Works +nav_order: 15 +last_updated: 2026-05-13 +description: How the signal meter calculates quality from RSSI and SNR — LoRa spread spectrum, presets, and what the bars really mean. +aliases: + - signal + - signal-meter + - snr + - rssi +--- + +# How the Meshtastic Signal Meter Works + +The Meshtastic signal meter — the familiar bars or status color in the app — is calculated very differently than the "bars" on a traditional cell phone or Wi-Fi router. + +Most consumer devices simply measure how "loud" a signal is. However, because Meshtastic uses **LoRa (Long Range)** technology, its signal meter measures how **clear** the signal is, relative to the specific settings your mesh is using. + +--- + +## 1. The Two Metrics: "Loudness" vs. "Clarity" + +Every time the LoRa radio chip receives a message, it reports two measurements: + +- **RSSI (Received Signal Strength Indicator):** The **loudness** of the raw power hitting your antenna. +- **SNR (Signal-to-Noise Ratio):** The **clarity** of the signal compared to the background static. + +> **Tip — The Analogy:** Imagine you are trying to hear a friend talking to you. +> +> - **RSSI** is how loud their voice is. +> - **The Noise Floor** is the background noise in the room (air conditioning, other people talking, traffic). +> - **SNR** is how easily you can distinguish your friend's voice from the background noise. + +If your friend shouts at you at a deafening rock concert, the signal is incredibly loud (High RSSI), but you still can't understand them because the background noise is louder (Bad SNR). Conversely, if your friend whispers to you in a dead-silent library, the signal is very weak (Low RSSI), but you can understand them perfectly (Great SNR). + +--- + +## 2. The Magic of LoRa: Hearing "Below the Noise Floor" + +For standard radios (like FM or Wi-Fi), if the background noise is louder than the signal (a negative SNR), the receiver just hears static. + +LoRa is special. It uses **"Spread Spectrum"** modulation, which allows the radio to mathematically pull a signal out of the air even when it is buried deep _underneath_ the background noise. This is why you will frequently see **negative SNR numbers** in Meshtastic (e.g., -10 dB, which means the signal is 10 decibels weaker than the background static). + +Depending on which Meshtastic preset you are using (e.g., `LongFast` vs. `ShortFast`), the radio has a specific **SNR Limit** — the absolute maximum amount of noise it can tolerate before the message is completely lost to the static. + +--- + +## 3. How the Signal Meter Calculates Quality + +The Meshtastic apps take both RSSI and SNR and run them through a specific formula to assign your signal a quality rating (None, Bad, Fair, or Good). It specifically scales these values based on the physical limits of the radio preset you are using. + +Here is exactly how the app decides how many bars (or what color) to show you: + +| Level | Bars | Criteria | Meaning | +| ------------------------ | ---- | ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | +| Gut | 3 | RSSI better than `-115 dBm` **AND** SNR better than `-7 dB` | Signal is both loud and clear — healthy connection. | +| Ordentliche Signalstärke | 2 | RSSI better than `-126 dBm` with good SNR, **OR** SNR better than `-15 dB` with good RSSI | Signal getting quieter or noisier, but still decodable. | +| Schlecht | 1 | Falls between Fair and None thresholds | At the edge of range or experiencing interference. | +| Keins | 0 | RSSI worse than `-126 dBm` **AND** SNR worse than `-15 dB` | Transmission completely buried in noise. | + +--- + +## 4. What This Means for You + +Because Meshtastic's meter acts as a **"Clarity Meter"**, it behaves differently than what most people expect: + +> **Tip — Don't panic over low RSSI:** You might see a seemingly terrible RSSI value like `-118 dBm`. On a cell phone, you would have zero bars. But if you have an SNR of `+2 dB`, Meshtastic will still show a strong signal! _The library is quiet, so the whisper is heard perfectly._ + +> **Warning — Watch out for local noise:** If you hook up a massive antenna and see a great RSSI (e.g., `-90 dBm`) but your signal meter is only showing **1 Bar (Bad)**, you have a problem. It means you have local interference — perhaps a cheap power supply, a noisy computer, or a nearby radio tower — creating so much static that it is drowning out your mesh. + +## Where Signal Information Appears + +In the app, signal data is shown in several places: + +- **Node list** — signal bars icon next to each node +- **Node detail** — SNR, RSSI, and signal quality in the device metrics section +- **Traceroute** — per-hop signal quality for each relay node +- **Signal metrics** — historical SNR and RSSI data in the metrics charts + +![Node entry showing SNR, RSSI values and colored signal bars](/assets/screenshots/nodes_signal_info.png) + diff --git a/docs/de-rDE/user/tak.md b/docs/de-rDE/user/tak.md new file mode 100644 index 000000000..ba83af255 --- /dev/null +++ b/docs/de-rDE/user/tak.md @@ -0,0 +1,126 @@ +--- +title: TAK Integration +nav_order: 10 +last_updated: 2026-05-13 +description: Interoperate with ATAK and WinTAK — CoT position sharing, TAK roles, and plugin setup. +aliases: + - tak + - atak + - team-awareness-kit +--- + +# TAK Integration + +Meshtastic integrates with the Team Awareness Kit (TAK) ecosystem, enabling interoperability between Meshtastic mesh devices and TAK applications like ATAK and WinTAK. + +## Übersicht + +The TAK module allows Meshtastic nodes to: + +- Share position data in TAK-compatible CoT (Cursor on Target) format +- Appear as team members on TAK map displays +- Receive TAK PLI (Position Location Information) messages + +## Einstellungen + +### Voraussetzungen + +- ATAK (Android Team Awareness Kit) or WinTAK installed +- Meshtastic ATAK Plugin installed +- TAK module enabled on your Meshtastic radio + +### Einstellungen + +1. Navigate to **Settings → Module Config → TAK**. +2. Enable the TAK module. +3. Configure the TAK team/group settings: + +![Module toggle switch](/assets/screenshots/settings_switch.png) + +| Einstellung | Beschreibung | +| ------------- | -------------------------- | +| Aktiviert | Activate TAK interop | +| Betriebsmodus | TAK-compatible output mode | + +### ATAK Plugin Setup + +1. Install the Meshtastic ATAK Plugin from the plugin repository. +2. Open ATAK and enable the Meshtastic plugin. +3. The plugin bridges messages between ATAK and your mesh network. + +## TAK Roles + +Nodes configured with TAK-related roles behave differently from standard clients: + +| Rolle | Beschreibung | +| --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **TAK** | Full TAK interoperability — sends and receives CoT data, chat messages, and PLI updates. Functions as a standard client plus TAK bridge. | +| **TAK Tracker** | Position-only TAK output — automatically broadcasts PLI at regular intervals without user interaction. Optimized for unattended position beacons (vehicles, equipment, waypoints). Does not relay chat messages. | + +> 💡 **Tip:** Use **TAK Tracker** for devices that only need to report position (e.g., a radio mounted in a vehicle). Use **TAK** for devices where users actively participate in TAK operations. + +### CoT (Cursor on Target) Format + +TAK messages use the Cursor on Target XML format — a military standard for sharing situational awareness data. Meshtastic converts its internal protobuf messages to CoT format when bridging to TAK systems, so no manual format conversion is needed. + +## TAK Identity + +When using TAK roles, your node broadcasts identity information that appears on TAK maps: + +| Einstellung | Beschreibung | +| ----------- | ---------------------------------------------------------------------------------------------------------------- | +| Team | Your team color on the TAK map (e.g., Blue, Red, Cyan, Green) | +| Rolle | Your operational role (Team Member, Team Lead, HQ, Medic, RTO, etc.) | +| Callsign | Your TAK callsign (defaults to your Meshtastic long name) | + +These settings appear in **Settings → Module Config → TAK** when the TAK module is enabled. + +> 💡 **Tip:** Team/role colors are the standard TAK affiliation colors. Coordinate with your TAK team to use consistent team assignments. + +## Wire Format (V1 / V2) + +Meshtastic supports two TAK wire formats: + +| Format | Kompatibilität | Merkmale | +| ------------------------------- | --------------------------------------------------------------- | --------------------------------------------------------- | +| V1 (Legacy) | ATAK Plugin v1.x, older firmware | Basic CoT position sharing only | +| V2 (Current) | ATAK Plugin v2.x, firmware 2.3+ | Full CoT support including chat, routes, zstd compression | + +The app automatically selects V2 when both sides support it. No manual configuration needed — the TAK module negotiates format based on firmware capabilities. + +## Usage with ATAK + +Once configured: + +- Meshtastic nodes appear as markers on the ATAK map with callsign labels +- Chat messages can bridge between mesh and TAK networks +- Position updates flow bidirectionally between Meshtastic and TAK +- TAK Tracker nodes broadcast PLI automatically — their positions appear on ATAK maps without any ATAK-side configuration + +> ⚠️ **Note:** TAK integration requires specific node roles and module configuration. Standard client nodes don't automatically participate in TAK operations. + +## Fehlerbehebung + +| Problem | Cause | Solution | +| -------------------------------- | ------------------------------------- | ----------------------------------------------------------------------- | +| Node doesn't appear on ATAK map | TAK module disabled or wrong role | Verify TAK module is enabled and node role is TAK or TAK Tracker | +| Position updates are stale | GPS fix lost or interval too long | Check GPS status; reduce position broadcast interval in Position Config | +| ATAK plugin shows "disconnected" | BLE connection lost or plugin crashed | Reconnect Bluetooth in Meshtastic app, then restart ATAK plugin | +| Chat messages not bridging | V1 format doesn't support chat | Ensure both nodes run firmware 2.3+ for V2 wire format | +| CoT data not flowing | Channel mismatch | All TAK nodes must be on the same channel with matching encryption | + +## Security Considerations + +- TAK data shares your position and callsign information +- Ensure your channel encryption is configured when using TAK in sensitive environments +- The TAK module respects the same channel encryption as other Meshtastic messages + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — TAK module configuration +- [Nodes](nodes) — TAK and TAK Tracker roles in the node list +- [Map & Waypoints](map-and-waypoints) — node positions on the map +- [ATAK plugin guide](https://meshtastic.org/docs/software/integrations/atak-plugin) — detailed ATAK setup on meshtastic.org + +--- + diff --git a/docs/de-rDE/user/telemetry-and-sensors.md b/docs/de-rDE/user/telemetry-and-sensors.md new file mode 100644 index 000000000..7656a745e --- /dev/null +++ b/docs/de-rDE/user/telemetry-and-sensors.md @@ -0,0 +1,118 @@ +--- +title: Telemetry & Sensors +nav_order: 9 +last_updated: 2026-05-13 +description: Sensor data on the mesh — supported environment, air quality, and power sensors, plus configuration and viewing guides. +aliases: + - sensors + - environment + - weather + - power-metrics +--- + +# Telemetry & Sensors + +Meshtastic nodes can collect and share sensor data across the mesh network. + +## Übersicht + +Telemetry allows nodes equipped with sensors to broadcast environmental, power, and device health information. This data is visible on the node detail screen and can be logged over time. + +## Gerätetelemetrie + +All Meshtastic nodes report basic device telemetry: + +| Metrisch | Beschreibung | Typical Range | +| ------------------ | ------------------------------ | ------------------------------------------------------------------ | +| Batterie Ladung | Charge percentage | 0–100% | +| Spannung | Battery voltage | 3.0–4.2V (LiPo) | +| Kanalbelegung | % of airtime used locally | 0–100% | +| Air Utilization TX | % of airtime used by this node | 0–100% | +| Laufzeit | Seconds since last boot | Varies | + +## Environment Sensors + +Supported environmental sensors: + +### Temperature & Humidity + +| Sensor | Temperatur | Luftfeuchtigkeit | Druck | Knoten | +| ------- | ---------- | ---------------- | ----- | ----------------------- | +| BME280 | ✓ | ✓ | ✓ | Recommended all-in-one | +| BME680 | ✓ | ✓ | ✓ | Adds gas resistance/IAQ | +| SHT31 | ✓ | ✓ | — | High accuracy | +| MCP9808 | ✓ | — | — | Precision temperature | +| LPS22 | — | — | ✓ | Pressure only | + +### Air Quality + +| Sensor | Metrisch | Knoten | +| -------- | -------------------------------------------------- | -------------------------- | +| BME680 | Gas Resistance / IAQ | Volatile organic compounds | +| PMSA003I | PM1.0, PM2.5, PM10 | Particulate matter | +| SEN55 | PM, NOx, VOC, Temp, Humidity | Multi-sensor | + +### Light & UV + +| Sensor | Metrisch | +| -------- | -------------------------------------- | +| OPT3001 | Ambient light (lux) | +| VEML7700 | Ambient light (lux) | +| LTR390 | UV index | + +## Energiedaten + +Nodes with INA-series power sensors can report: + +| Metrisch | Beschreibung | +| ----------- | ----------------------------------------- | +| Bus Voltage | Supply rail voltage | +| Stromstärke | Power consumption (mA) | +| Leistung | Calculated power (mW) | + +Useful for monitoring solar charging or battery health on remote nodes. + +## Configuring Telemetry + +1. Navigate to **Settings → Module Config → Telemetry**. +2. Set reporting intervals: + - **Device Metrics Interval** — how often to broadcast device metrics + - **Environment Metrics Interval** — how often to broadcast sensor data +3. Enable specific sensor types as needed. + +### Recommended Intervals + +| Use Case | Device (s) | Environment (s) | +| ------------------------------------------ | ----------------------------- | ---------------------------------- | +| Urban mesh (many nodes) | 3600 | 3600 | +| Rural mesh (few nodes) | 900 | 900 | +| Weather station | 900 | 300 | +| Battery conservation | 7200 | 7200 | + +> ⚠️ **Note:** Shorter intervals increase airtime usage and battery drain across the mesh. + +## Viewing Telemetry + +1. Navigate to **Nodes** and select a node. +2. Telemetry sections show on the detail screen: + - Device Metrics (always available) + - Environment Metrics (if sensors present) + - Power Metrics (if INA sensor present) +3. Historical graphs show trends over time. + +![Telemetry actions](/assets/screenshots/node-metrics_telemetric_actions.png) + +## Fehlerbehebung + +- **No environment data showing?** The remote node needs a physical sensor connected (e.g., BME280 on I2C). Device telemetry (battery, uptime) is always available, but environment metrics require hardware. +- **Stale readings?** Check the reporting interval — very long intervals (7200s+) mean data updates infrequently. Also verify the remote node is still online. +- **Sensor conflict on I2C bus?** Some sensors share I2C addresses. If you have multiple sensors on the same bus, check for address collisions in the radio's serial debug output. + +## Related Topics + +- [Node Metrics](node-metrics) — view telemetry data on the node detail screen +- [Settings — Modules & Admin](settings-module-admin) — telemetry module configuration +- [Units & Locale](units-and-locale) — temperature and pressure display units + +--- + diff --git a/docs/de-rDE/user/translate.md b/docs/de-rDE/user/translate.md new file mode 100644 index 000000000..8b03ee6b4 --- /dev/null +++ b/docs/de-rDE/user/translate.md @@ -0,0 +1,97 @@ +--- +title: Translate the App +parent: User Guide +nav_order: 17 +last_updated: 2026-05-13 +aliases: + - translate + - crowdin + - localization +--- + +# Translate the App + +Contributing translations helps make Meshtastic accessible to a wider audience. The app uses [Crowdin](https://crowdin.com/) to manage community translations for both the user interface and in-app documentation. + +--- + +## What Gets Translated + +| Resource | Source Location | Knoten | +| ----------------- | ------------------------------------- | ---------------------------------------------------------------------- | +| UI strings | `composeResources/values/strings.xml` | Buttons, labels, messages, and all user-visible text | +| User Guide pages | `docs/user/*.md` | In-app documentation shown in Help & Documentation | +| Fastlane metadata | `fastlane/metadata/android/en-US/` | App Store listing title, description, and changelogs | + +> **Note — Developer Guide pages are English-only.** Code-focused documentation targeting contributors is not translated. + +--- + +## Wie man beitragen kann + +1. **Visit the Crowdin project.** Open the [Meshtastic Android Crowdin project](https://crowdin.com/project/meshtastic-android) and sign in or create a free account. +2. **Choose your language.** Select an existing language or request a new one by opening a [GitHub issue](https://github.com/meshtastic/Meshtastic-Android/issues/new). +3. **Translate strings.** Crowdin shows the English source on the left and your translation on the right. Translate each string and save. +4. **Review context.** Many strings include screenshots or context comments — check these to understand where the text appears in the app. +5. **Submit.** Approved translations are automatically merged into the next release. + +> **Tip — Keep translations short.** UI strings often appear in buttons, chips, or narrow columns. If a translation is significantly longer than the English original, consider abbreviating where the meaning stays clear. + +--- + +## Adding a New Language + +If your language is not yet listed on Crowdin: + +1. Open an issue on [GitHub](https://github.com/meshtastic/Meshtastic-Android/issues/new) requesting the new locale. +2. A maintainer will add the language to Crowdin and configure `crowdin.yml`. +3. Once added, you can begin translating immediately. + +--- + +## How Translations Are Organized + +The Android app uses **Compose Multiplatform resources** for all user-visible strings: + +``` +core/resources/src/commonMain/composeResources/ +├── values/ ← English (default) +│ └── strings.xml +├── values-de/ ← German +│ └── strings.xml +├── values-fr/ ← French +│ └── strings.xml +└── ... +``` + +In-app documentation follows a similar pattern under `docs/`: + +``` +docs/ +├── user/ ← English source (default) +│ ├── onboarding.md +│ └── ... +├── fr/user/ ← French translations +│ ├── onboarding.md +│ └── ... +└── ... +``` + +The app automatically selects the correct locale based on your device's **Language & Region** settings. + +--- + +## Translation Guidelines + +- **Do not translate** technical terms like "LoRa", "MQTT", "BLE", "TAK", "SNR", or "RSSI" — these are universal. +- **Keep placeholders intact.** Strings like `%1$s` or `%d` are filled in at runtime. Do not remove or reorder them unless the grammar of your language requires it. +- **Match tone.** The app uses a friendly, direct voice. Avoid overly formal language. +- **Test if possible.** Switch your device language and open the app to see how translations look in context. + +--- + +## Questions? + +If you have questions about a specific string's context or need help getting started, open a discussion on the [Meshtastic GitHub Discussions](https://github.com/meshtastic/Meshtastic-Android/discussions) page. + +Vielen Dank, dass Sie dabei geholfen haben, die Reichweite von Meshtastic zu vergrößern! diff --git a/docs/de-rDE/user/units-and-locale.md b/docs/de-rDE/user/units-and-locale.md new file mode 100644 index 000000000..19c264371 --- /dev/null +++ b/docs/de-rDE/user/units-and-locale.md @@ -0,0 +1,118 @@ +--- +title: Units, Measurement & Locale +parent: User Guide +nav_order: 16 +last_updated: 2026-05-12 +--- + +# Units, Measurement & Locale + +The Meshtastic app automatically displays temperatures, distances, speeds, and times in the units your device is configured to use — no settings to change inside the app. + +--- + +## So funktioniert's + +Meshtastic radios always transmit data in **metric units** (meters, °C, km/h, hPa, etc.). When the app receives this data, it uses the `MetricFormatter` utility to convert and display values in whatever unit system your device's locale specifies. + +On Android, your measurement preferences are determined by your system **Language & Region** settings. On Desktop (JVM), the app uses the JVM's default `Locale`. + +> **Tip — You never need to toggle units inside the app.** Change your system measurement preferences and every screen in Meshtastic updates automatically — node details, telemetry charts, weather, altitude, and more. + +--- + +## Temperatur + +Temperature values from environment sensors are transmitted as **°C** and displayed based on your device's temperature unit preference. + +![Environment metrics with temperature](/assets/screenshots/nodes_environment_metrics.png) + +| Your Setting | You See | +| ------------ | ------- | +| Celsius | 22°C | +| Fahrenheit | 72°F | + +This affects all temperature displays throughout the app: node environment telemetry, soil temperature, dew point, and telemetry chart axes. + +## Distance & Altitude + +Distances between nodes and GPS altitudes are transmitted as **meters** and automatically scaled and converted. + +![Distance info display](/assets/screenshots/nodes_distance_info.png) + +| Your Setting | Small Distance | Large Distance | Höhe | +| -------------------------------- | -------------- | ---------------------- | -------- | +| Metrisch | 350 m | 2.5 km | 1,200 m | +| Imperial (US) | 1,148 ft | 1.6 mi | 3,937 ft | + +The app uses natural scaling — short distances stay in meters or feet, while longer distances switch to kilometres or miles automatically. + +### Where these appear + +- **Node list** — distance and bearing to each node +- **Node detail** — altitude, distance from your position +- **Map** — waypoint distances, traceroute hop distances +- **Compass** — distance to selected node + +## Geschwindigkeit + +GPS ground speed is displayed in your locale's preferred speed unit. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Metrisch | 12 km/h | +| Imperial (US) | 7 mph | + +## Wind + +Wind speed and gust data from environment sensors are transmitted as **m/s** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Metrisch | 5 m/s | +| Imperial (US) | 11 mph | + +Wind readings appear in the **Node Detail** environment section and the **Environment Telemetry** charts. + +## Rainfall + +Rainfall measurements (1-hour and 24-hour totals) are transmitted as **mm** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ---------------------- | +| Metrisch | 12 mm | +| Imperial (US) | 0.5 in | + +## Units That Never Change + +Some units are international standards and are displayed the same way regardless of your locale: + +| Measurement | Unit | Why | +| -------------------------------- | ------------------------------ | ------------------------------------- | +| Luftdruck | hPa | International meteorological standard | +| Heading / bearing | ° (degrees) | Universal navigation convention | +| Strahlung | μR/hr | Standard dosimetry unit | +| GPS coordinates | decimal degrees | Universal geographic standard | +| Humidity, battery, soil moisture | % | Universal | + +## Date & Time + +All timestamps throughout the app — last heard, message times, telemetry logs, chart axes — follow your device's date and time preferences. + +| Einstellung | What It Controls | Beispiel | +| ---------------- | ---------------- | ------------------------------------------------ | +| **24-Hour Time** | Clock format | 14:30 vs 2:30 PM | +| **Date Format** | Date ordering | 09/05/2026 vs 05/09/2026 | + +The app also uses **relative time** where it makes sense — for example, "5 min ago" or "2 hours ago" in the node list — which is automatically localised into your device language. + +## Changing Your Measurement System (Android) + +On Android, your measurement system (metric vs imperial) is tied to your region setting: + +1. Open **Android Settings → System → Language & Region** +2. Change your **Region** or **Measurement units** preference +3. Return to Meshtastic — values update immediately + +> **Tip — The app uses `MetricFormatter` from `core:common`.** All measurement formatting is handled by a shared KMP utility that respects your platform's locale. Developers adding new measurement displays should use `MetricFormatter` rather than hard-coding unit conversions. + diff --git a/docs/el-rGR/index.md b/docs/el-rGR/index.md new file mode 100644 index 000000000..dcc177600 --- /dev/null +++ b/docs/el-rGR/index.md @@ -0,0 +1,30 @@ +--- +title: Home +layout: default +nav_order: 0 +--- + +# Meshtastic Android App Documentation + +User and developer documentation for the Meshtastic Android, Desktop, and iOS applications powered by KMP (Kotlin Multiplatform). + +Use the sidebar navigation to browse the **User Guide** for app features and the **Developer Guide** for contributing to the project. + +--- + +## Quick Links + +| Guide | Περιγραφή | +| --------------------------------------------------------------------- | -------------------------------------------------------------- | +| [Getting Started](user/onboarding) | Connect your first radio and send a message | +| [Messages & Channels](user/messages-and-channels) | Channel broadcasts, direct messages, reactions, and encryption | +| [Nodes](user/nodes) | Understanding the mesh network node list | +| [Signal Meter](user/signal-meter) | How the LoRa signal quality meter works | +| [Units & Locale](user/units-and-locale) | How temperatures, distances, and times adapt to your region | +| [Desktop App](user/desktop) | Linux, macOS, and Windows desktop usage | +| [Architecture](developer/architecture) | App architecture overview for contributors | +| [Contributing](developer/contributing) | Branch naming, PR workflow, and verification commands | + +--- + +> This documentation is served from the same markdown source that powers the in-app **Help & Documentation** browser. diff --git a/docs/el-rGR/user/connections.md b/docs/el-rGR/user/connections.md new file mode 100644 index 000000000..ab545c880 --- /dev/null +++ b/docs/el-rGR/user/connections.md @@ -0,0 +1,125 @@ +--- +title: Connections +nav_order: 2 +last_updated: 2026-05-13 +description: Connect your phone or desktop to a Meshtastic radio via Bluetooth, USB, or TCP/IP. +aliases: + - bluetooth + - usb + - tcp + - pairing +--- + +# Connections + +Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node. + +## Bluetooth (BLE) + +Bluetooth Low Energy is the default and most common connection method on Android. + +### Pairing a Device + +1. Ensure your Meshtastic radio is powered on and in pairing mode. +2. Open the app and navigate to **Connections**. +3. Tap **Scan for Devices** — nearby Meshtastic radios will appear. +4. Select your device from the list. +5. Accept the Bluetooth pairing prompt if shown. + +![Device list item](/assets/screenshots/connections_bluetooth_scan.png) + +You can filter devices by transport type using the filter chips at the top: + +![Transport filter chips](/assets/screenshots/connections_transport_filters.png) + +> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. + +### Connection Status + +| Icon | State | Περιγραφή | +| ---- | -------------- | ----------------------------- | +| 🟢 | Connected | Active radio link established | +| 🟡 | Connecting | Handshake in progress | +| 🔴 | Αποσυνδεδεμένο | No active connection | +| ⚪ | Not configured | No device selected | + +When connecting, a status indicator shows the current connection state: + +![Connecting status](/assets/screenshots/connections_connecting.png) + +If no devices are found, the app shows an empty state with instructions: + +![No devices found](/assets/screenshots/connections_empty_state.png) + +### Troubleshooting Bluetooth + +- **Device not found:** Toggle Bluetooth off/on, ensure location is enabled. +- **Connection drops:** Move closer to the radio; check for interference. +- **Pairing rejected:** Forget the device in Android Bluetooth settings and retry. + +## USB Serial + +USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable. + +### Setup + +1. Connect your radio via USB cable to your device. +2. The app will prompt for USB permission — tap **Allow**. +3. The connection is established automatically. + +> ⚠️ **Note:** USB connections require OTG support on Android devices. + +## TCP/IP (WiFi) + +Some Meshtastic radios support WiFi connectivity, allowing TCP-based connections. + +### Configuration + +1. Connect your radio to a WiFi network via the radio's web interface or settings. +2. In the app, go to **Connections → TCP**. +3. Enter the radio's IP address and port (default: 4403). +4. Tap **Connect**. + +![WiFi scanning for devices](/assets/screenshots/connections_wifi_scanning.png) + +When a device is found, it appears in the connection list: + +![WiFi device found](/assets/screenshots/connections_wifi_device_found.png) + +A successful connection is confirmed with a status indicator: + +![WiFi connection success](/assets/screenshots/connections_wifi_success.png) + +### When to Use TCP + +- Radio is on the same local network +- Testing with a simulated radio +- Environments where Bluetooth has interference issues + +## Reconnection Behavior + +The app reconnects to the **last selected device** on startup. You can manually switch transports from the connections screen at any time. + +To disconnect from a radio, use the disconnect button on the connections screen: + +![Disconnect from radio](/assets/screenshots/connections_disconnect.png) + +## Desktop Connections + +On Desktop (Linux/macOS/Windows), the app supports: + +- **Bluetooth (BLE)** — via the Kable library; works on macOS, Linux, and Windows +- **USB Serial** — primary wired connection method +- **TCP/IP** — for network-connected radios + +See [Desktop App](desktop) for platform-specific details and keyboard shortcuts. + +## Related Topics + +- [Getting Started](onboarding) — first-launch setup and permissions +- [Settings — Radio & User](settings-radio-user) — Bluetooth and network configuration +- [Desktop App](desktop) — desktop-specific connection details +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — full list of compatible radios on meshtastic.org + +--- + diff --git a/docs/el-rGR/user/desktop.md b/docs/el-rGR/user/desktop.md new file mode 100644 index 000000000..a8835b285 --- /dev/null +++ b/docs/el-rGR/user/desktop.md @@ -0,0 +1,147 @@ +--- +title: Desktop App +nav_order: 14 +last_updated: 2026-05-13 +description: Install and use the Meshtastic Desktop app on Linux, macOS, and Windows — connections, feature parity, and keyboard shortcuts. +aliases: + - desktop + - linux + - macos + - windows + - jvm +--- + +# Desktop App + +The Meshtastic Desktop application provides the same mesh communication features on Linux, macOS, and Windows. + +## Overview + +The Desktop app shares its core codebase with the Android app through Kotlin Multiplatform (KMP). Most features work identically across platforms. + +## Installation + +### Linux + +- Download the `.deb` or `.AppImage` package from the releases page +- Or build from source using `./gradlew :desktopApp:run` + +### macOS + +- Download the `.dmg` package from releases +- Or build from source + +### Windows + +- Download the `.msi` installer from releases +- Or build from source + +## Connecting Your Radio + +### USB Serial (Primary) + +The most reliable connection method on Desktop: + +1. Connect your Meshtastic radio via USB cable. +2. The app should detect the serial port automatically. +3. If not detected, select the correct serial port from the connections menu. + +### TCP/IP + +For network-connected radios: + +1. Enter the radio's IP address and port (default: 4403). +2. Click **Connect**. + +### Bluetooth (BLE) + +Bluetooth Low Energy is supported on Desktop via the [Kable](https://github.com/JuulLabs/kable) library: + +1. Ensure your system has a Bluetooth adapter. +2. The app scans for nearby Meshtastic radios automatically. +3. Select your device from the connections screen. + +## Feature Parity + +| Feature | Android | Desktop | Notes | +| ---------------------------------------- | ------- | ------- | -------------------------- | +| Messaging | ✓ | ✓ | Full parity | +| Node List | ✓ | ✓ | Full parity | +| Χάρτης | ✓ | ✓ | Full parity | +| Ρυθμίσεις | ✓ | ✓ | Full parity | +| Bluetooth (BLE) | ✓ | ✓ | Via Kable on desktop | +| Firmware Update OTA | ✓ | ✗ | Use web flasher | +| Notifications | ✓ | ✓ | Native OS notifications | +| Widgets | ✓ | ✗ | Android-only | +| AI Assistant (Chirpy) | ✓\* | ✗ | Google flavor Android only | + +\*Chirpy AI requires Android 14+ on Google flavor builds with supported hardware. + +## UI Differences + +The Desktop app uses the same Compose Multiplatform UI with adaptations for larger screens and desktop interaction. + +### Keyboard Shortcuts + +| Shortcut | Action | +| ------------------- | --------------------------- | +| **⌘Q** / **Ctrl+Q** | Quit the application | +| **⌘,** / **Ctrl+,** | Open Settings | +| **⌘1** / **Ctrl+1** | Switch to Conversations tab | +| **⌘2** / **Ctrl+2** | Switch to Nodes tab | +| **⌘3** / **Ctrl+3** | Switch to Map tab | +| **⌘4** / **Ctrl+4** | Switch to Connections tab | + +### Window & System Tray + +- **Window resizing** — responsive layout adapts to window dimensions +- **System tray** — minimize to system tray for background mesh operation +- **Tray menu** — right-click the tray icon to show window or quit +- **Mouse interaction** — hover states and standard desktop navigation + +### Notification Preferences + +The Desktop app provides in-app toggles for controlling which notifications are shown — messages, new nodes, and low battery alerts. Access these from **Settings → Notifications** within the app. + +## Built-in Documentation Browser + +The Desktop app includes a built-in documentation browser for quick access to help content without leaving the application. + +![Docs browser with table of contents](/assets/screenshots/docs-browser_toc.png) + +The browser supports full-text search across all documentation: + +![Searching the docs browser](/assets/screenshots/docs-browser_search.png) + +Individual doc pages render with full formatting: + +![A documentation page](/assets/screenshots/docs-browser_page.png) + +## Building from Source + +```bash +git clone https://github.com/meshtastic/Meshtastic-Android.git +cd Meshtastic-Android +git submodule update --init +./gradlew :desktopApp:run +``` + +Requirements: + +- JDK 21 +- No Android SDK required for desktop-only builds + +## Known Limitations + +- No OTA firmware updates (use web flasher) +- Some Android-specific features (widgets, specific notification channels) are unavailable +- Performance may vary on low-spec hardware running Compose Desktop +- BLE bonding is not yet supported on desktop (pairing works without bonding) + +## Related Topics + +- [Connections](connections) — connection methods overview +- [Firmware Updates](firmware) — use the [Web Flasher](https://flasher.meshtastic.org) for desktop firmware updates + +--- + diff --git a/docs/el-rGR/user/discovery.md b/docs/el-rGR/user/discovery.md new file mode 100644 index 000000000..fe696299b --- /dev/null +++ b/docs/el-rGR/user/discovery.md @@ -0,0 +1,114 @@ +--- +title: Discovery +nav_order: 12 +last_updated: 2026-05-13 +description: Explore your mesh network — traceroute paths, neighbor maps, and node discovery tools. +aliases: + - mesh-discovery + - local-discovery + - network-scan + - traceroute + - neighbor-info +--- + +# Discovery + +Discovery tools help you understand **how** your mesh network is connected — which nodes can hear each other, what paths messages take, and where bottlenecks or weak links exist. + +> 💡 **Tip:** You don't need a dedicated "discovery mode" to start exploring your mesh. The tools below are available right now from the node list and node detail screens. + +--- + +## Traceroute + +Traceroute reveals the exact path a message takes from your node to any other node on the mesh. It's the single most useful tool for debugging connectivity problems. + +### Running a Traceroute + +1. Navigate to **Nodes** and tap the node you want to trace. +2. On the node detail screen, tap **Traceroute**. +3. The app sends a traceroute request and waits for the response. +4. Results display each hop in order, with signal quality at every step. + +### Reading the Results + +A traceroute result looks like this: + +``` +You → Node A (SNR: 8.5, RSSI: -95) → Node B (SNR: 5.2, RSSI: -108) → Target +``` + +Each hop represents a relay node that forwarded the message. The SNR and RSSI values at each hop tell you about the link quality on that specific segment. + +| What to look for | What it means | +| -------------------------------------------------------------------------- | --------------------------------------------------------------------------- | +| All hops show Good SNR (> 5 dB) | Healthy path — messages flow reliably | +| One hop shows Bad SNR (< 0 dB) | Weak link — this relay segment is fragile | +| Many hops (4+) | Long path — consider repositioning a node to shorten it | +| Different path on retry | Mesh is adapting — multiple routes exist (this is good!) | + +> 💡 **Tip:** Run traceroute several times over a few minutes. If the path changes, your mesh has redundant routes — a sign of a well-connected network. + +### Troubleshooting with Traceroute + +- **"No route found"** — The target node may be offline, out of range, or on a different channel. Check that both nodes share at least one channel with the same encryption key. +- **Traceroute times out** — The path may be too long (exceeds hop limit) or a relay node is congested. Try increasing the hop limit in **Settings → LoRa Config**. +- **Asymmetric paths** — A traceroute from A→B may take a different path than B→A. This is normal — radio propagation is not always symmetric. + +--- + +## Neighbor Info + +The Neighbor Info module lets each node broadcast a list of the nodes it can **directly hear** (single-hop). When multiple nodes share their neighbor lists, you can piece together a topology map of the entire mesh. + +### Enabling Neighbor Info + +1. Navigate to **Settings → Module Config → Neighbor Info**. +2. Enable the module. +3. Set the broadcast interval (default: 900 seconds / 15 minutes). + +Once enabled, your node periodically broadcasts its neighbor table. Other nodes with Neighbor Info enabled do the same. + +### Viewing Neighbor Data + +- Open any node's detail screen and look for the **Neighbors** section. +- Each neighbor entry shows the node that was directly heard and its signal quality. +- Combine neighbor data from multiple nodes to understand the full mesh topology. + +> ⚠️ **Note:** Neighbor Info increases airtime usage because every enabled node periodically broadcasts its neighbor list. On busy meshes with many nodes, consider longer broadcast intervals (3600 seconds or more) to avoid congestion. + +--- + +## Node List as a Discovery Tool + +The node list itself is a powerful discovery tool when you use its filtering and sorting features effectively. + +### Finding New Nodes + +- Sort by **Last heard** to see the most recently active nodes at the top. +- Enable **Include unknown** to see nodes that have appeared on the mesh but haven't sent user info yet — these are often newly powered-on devices. + +### Assessing Connectivity + +- Sort by **Hops away** to see which nodes are directly reachable (0 hops) versus relayed. +- Sort by **Distance** to find nearby nodes and verify they're reachable. +- Use **Exclude MQTT** to focus on nodes reachable over radio (not via internet bridge). + +### Infrastructure Audit + +- Disable **Exclude infrastructure** to see Router, Repeater, Router Late, and Client Base nodes. +- Check their signal quality and last-heard times to verify your infrastructure nodes are healthy. + +See [Nodes](nodes) for full details on filtering and sorting options. + +--- + +## Tips for Mesh Exploration + +- **Start with traceroute** — it gives you immediate, actionable information about a specific path. +- **Enable Neighbor Info on key nodes** — especially routers and repeaters, to build a picture of the backbone. +- **Check the map** — node positions on the [Map](map-and-waypoints) combined with signal data help you understand why some links are strong and others are weak. +- **Compare signal over time** — use the [Signal Meter](signal-meter) guide to interpret SNR and RSSI values correctly. + +--- + diff --git a/docs/el-rGR/user/firmware.md b/docs/el-rGR/user/firmware.md new file mode 100644 index 000000000..6aca7e903 --- /dev/null +++ b/docs/el-rGR/user/firmware.md @@ -0,0 +1,114 @@ +--- +title: Firmware Updates +nav_order: 13 +last_updated: 2026-05-13 +description: Update your radio firmware over Bluetooth — OTA process, version channels, pre-flight checks, and recovery. +aliases: + - firmware + - update + - ota + - flash +--- + +# Firmware Updates + +Keep your Meshtastic radio up to date with the latest firmware for new features, bug fixes, and security improvements. + +## Checking for Updates + +1. Navigate to **Settings → Firmware Update** or tap the firmware notification if shown. +2. The app checks for available firmware versions. +3. Available updates show the version number and changelog summary. + +## Update Methods + +### OTA (Over-The-Air) via Bluetooth + +The most common update method for Android users: + +1. Ensure your radio is connected via Bluetooth. +2. Navigate to the Firmware Update screen. +3. Select the desired firmware version. +4. Tap **Update** to begin the OTA process. +5. Wait for the update to complete — **do not disconnect** during the update. + +![Firmware checking for updates](/assets/screenshots/firmware_checking.png) + +> ⚠️ **Warning:** Interrupting a firmware update can brick your device. Ensure your radio has sufficient battery (>50% recommended) and maintain Bluetooth proximity during the entire process. + +![Firmware disclaimer](/assets/screenshots/firmware_disclaimer.png) + +### USB Flashing + +For recovery or when OTA is unavailable: + +- Use the [Meshtastic Web Flasher](https://flasher.meshtastic.org) +- Or the [Meshtastic CLI tool](https://meshtastic.org/docs/getting-started/flashing-firmware) on desktop + +## Version Channels + +| Κανάλι | Περιγραφή | +| ------ | ------------------------------------------- | +| Stable | Recommended for most users; tested releases | +| Alpha | Preview releases; may contain bugs | + +## Pre-Update Checklist + +Before updating: + +- [ ] Battery > 50% +- [ ] Stable Bluetooth connection +- [ ] Note your current settings (they may reset on major version changes) +- [ ] Check the release notes for breaking changes + +## Post-Update + +After a successful update: + +- The radio will reboot automatically +- Bluetooth connection will re-establish +- Verify your settings are intact +- Check the firmware version in **Settings → About** + +![Firmware update success](/assets/screenshots/firmware_success.png) + +## Troubleshooting + +### Update Stuck + +If the update appears frozen: + +- Wait at least 5 minutes before intervening +- If truly stuck, power-cycle the radio +- Attempt the update again + +![Firmware update error](/assets/screenshots/firmware_error.png) + +### Device Won't Boot After Update + +If your device fails to boot: + +1. Try connecting via USB to a computer +2. Use the web flasher in recovery/DFU mode +3. Flash a known-good firmware version +4. Check the Meshtastic Discord for device-specific recovery steps + +### Compatibility Warnings + +The app may show warnings when: + +- Connected radio firmware is below minimum supported version +- Major version mismatch between app and firmware +- Deprecated features need migration + +> ⚠️ **Important:** Always update the Meshtastic app before or alongside firmware updates to ensure compatibility. + +## Related Topics + +- [Connections](connections) — reconnecting after a firmware update +- [Flashing firmware guide](https://meshtastic.org/docs/getting-started/flashing-firmware) — full firmware flashing walkthrough on meshtastic.org +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — check firmware compatibility by device +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/el-rGR/user/map-and-waypoints.md b/docs/el-rGR/user/map-and-waypoints.md new file mode 100644 index 000000000..6b1e19162 --- /dev/null +++ b/docs/el-rGR/user/map-and-waypoints.md @@ -0,0 +1,116 @@ +--- +title: Map & Waypoints +nav_order: 6 +last_updated: 2026-05-13 +description: View node positions on the map, create and share waypoints, and manage position sharing and privacy. +aliases: + - map + - waypoints + - gps + - location +--- + +# Map & Waypoints + +The Map screen shows the geographic positions of nodes on your mesh, along with shared waypoints. + +## Map View + +The map displays: + +- **Node positions** — colored markers for each node reporting location +- **Waypoints** — shared points of interest +- **Your position** — your current GPS location + +### Node Markers + +Node markers on the map indicate: + +| Color | Meaning | +| ------- | ---------------------------------------------- | +| Πράσινο | Online (heard recently) | +| Yellow | Away (heard within 2 hours) | +| Gray | Offline (stale position) | +| Μπλε | Your own node | + +### Map Controls + +- **Zoom** — pinch or use +/- buttons +- **Pan** — drag to explore +- **Center** — select the location button to center on your position +- **Node tap** — tap a node marker to view details + +The floating toolbar provides quick access to compass, layer switching, node filters, refresh, and location tracking. Tap the compass to reorient north-up, or tap the location button to center on your current position. + +![Map controls overlay](/assets/screenshots/map_controls_overlay.png) + +## Waypoints + +Waypoints are shared geographic points of interest that all mesh members can see. + +### Creating a Waypoint + +1. Long-press on the map at the desired location. +2. Enter a name and optional description. +3. Choose an icon/emoji for the waypoint. +4. Tap **Send** to share with the mesh. + +### Waypoint Properties + +| Property | Περιγραφή | +| ---------- | ------------------------------------------------------- | +| Ονομα | Short identifier (max 30 characters) | +| Περιγραφή | Optional longer description | +| Icon | Visual marker emoji on the map | +| Κλειδωμένο | If locked, only the creator can edit or delete | +| Expiration | Optional auto-remove time | + +### Waypoint Expiration + +Waypoints can be set to expire automatically: + +- **Never** (default) — waypoint remains until manually deleted +- **Timed** — waypoint is automatically removed after the specified duration (e.g., "remove after 2 hours"). Useful for temporary markers like rally points, hazards, or meeting locations. + +Expired waypoints are automatically hidden from the map so they don't clutter the display. The expiration countdown begins when the waypoint is created, not when other nodes receive it. + +### Managing Waypoints + +- Tap a waypoint on the map to view its details and coordinates +- Edit or delete waypoints you created +- **Locked waypoints** cannot be modified or deleted by other nodes — only the original creator can change them +- Unlocked waypoints can be edited by any mesh member + +## Position Sharing + +### Enabling Position Sharing + +Your node shares its GPS position based on: + +- **Fixed interval** — broadcast position at regular intervals +- **Smart position** — broadcast when movement exceeds a threshold +- **Manual** — only share when explicitly requested + +Configure position behavior in **Settings → Position**. + +### Privacy Considerations + +> 🔒 **Privacy:** Position data is broadcast to all nodes on your channel. If you don't want your location shared, disable GPS position in settings or use a fixed/fake position. + +## Map Sources + +The app supports multiple map tile sources: + +- OpenStreetMap (default) +- Satellite imagery (where available) +- Offline tiles (download map areas for offline use) + +## Related Topics + +- [Nodes](nodes) — view and filter your node list +- [Node Metrics](node-metrics) — signal quality and position history for individual nodes +- [Discovery](discovery) — traceroute and neighbor info for understanding mesh topology +- [Units & Locale](units-and-locale) — distance and coordinate display formats + +--- + diff --git a/docs/el-rGR/user/messages-and-channels.md b/docs/el-rGR/user/messages-and-channels.md new file mode 100644 index 000000000..51afb5306 --- /dev/null +++ b/docs/el-rGR/user/messages-and-channels.md @@ -0,0 +1,159 @@ +--- +title: Messages & Channels +nav_order: 3 +last_updated: 2026-05-13 +description: Send and receive messages, manage channels, configure encryption, and use quick chat, reactions, and message actions. +aliases: + - channels + - direct-messages + - messaging + - conversations +--- + +# Messages & Channels + +Meshtastic supports two communication modes: **channel broadcasts** and **direct messages**. + +## Κανάλια + +Channels are shared communication groups. All nodes configured with the same channel key can read and send messages on that channel. + +### Default Channel + +Every Meshtastic device comes with a default **LongFast** channel. This is an unencrypted channel used for general mesh communication. + +### Channel Security + +Channels support multiple encryption levels: + +| Icon | Security Level | Περιγραφή | +| ---- | ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------- | +| 🔒 | PSK (256-bit AES) | Fully encrypted with a strong pre-shared key. Only nodes with the matching key can read messages. | +| 🔐 | PSK (128-bit AES) | Encrypted with a shorter key. Secure for most uses but 256-bit is preferred for sensitive data. | +| 🔓 | Default / Open | Uses the well-known default key. **Any Meshtastic device** on the same preset can read these messages. | +| ⚠️ | Insecure + Position | Open channel that also broadcasts your GPS position. Use with caution in public meshes. | + +> 🔒 **Security Tip:** 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. + +### Adding a Channel + +1. Navigate to **Settings → Channels**. +2. Tap **Add Channel** or scan a QR code. +3. Configure the channel name and encryption key. +4. Share the channel URL/QR code with others who need access. + +Tapping a channel shows its details and sharing options. + +## Direct Messages + +Direct messages (DMs) are point-to-point encrypted communications between two specific nodes. + +### Sending a Direct Message + +1. Open the **Messages** tab. +2. Select a node from your contacts list or tap a node in the node list. +3. Type your message and tap **Send**. + +### Message States + +| State | Icon | Meaning | +| --------------------------------- | ---- | ----------------------------------------------------------------------------------------------------------------- | +| Queued | ⏳ | Message waiting to be sent | +| En route | ✓ | Delivered to the radio, awaiting acknowledgment | +| Delivered | ✓✓ | Acknowledgment received from recipient | +| Received | ✓ | Message received from the mesh (incoming) | +| S&F Routing | 🔗 | Store & Forward: message being routed through an S&F node | +| S&F Confirmed | 🔗 | Store & Forward: delivery confirmed via S&F node | +| Σφάλμα | ✗ | Delivery failed after retries | + +### Delivery Errors + +When a message fails to deliver, the error indicator shows what went wrong: + +| Σφάλμα | Meaning | What to Do | +| ------------------- | ---------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| No Route | No path exists to the destination node | The recipient may be offline or out of mesh range. Try later or move closer. | +| Got NAK | The next-hop node refused to relay | The relay node may be congested. Wait and retry. | +| Λήξη χρονικού ορίου | No acknowledgment within retry window | The recipient may be just out of range. Try increasing hop limit or moving to a better position. | +| No Interface | No radio interface available to send | Check that your radio is connected and the channel is configured. | +| Max Retransmit | All retry attempts exhausted | The mesh path is unreliable. Try a different channel or wait for conditions to improve. | +| Kein Kanal | The destination channel doesn't exist | Verify both nodes share the same channel configuration. | +| Too Large | Message exceeds maximum payload size | Shorten your message (max ~230 characters). | +| No Response | Node received message but didn't respond | The recipient's radio may be busy or in low-power sleep mode. | +| Duty Cycle Limit | Regional airtime limit reached | Your radio has used its allowed transmit time. Wait for the duty cycle window to reset (typically 1 hour in EU regions). | +| Εσφαλμένο Αίτημα | Malformed or invalid message | This usually indicates a software bug. Try restarting the app. | + +> 💡 **Tip:** 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. + +## Message Features + +### Quick Chat + +Pre-configured messages for rapid communication: + +- Access via the Quick Chat button in the message input area +- Choose from built-in phrases or custom messages +- Customize quick chat messages in **Settings → Quick Chat** +- Useful when typing is impractical (gloves, small screen, urgent) + +![Quick chat option](/assets/screenshots/messages_quick_chat.png) + +The channel list shows each channel with its latest message preview. + +### Message Bubbles + +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. + +### Reactions + +React to messages with emoji: + +- **Long-press** a message to open the actions menu +- Tap **Add Reaction** to choose an emoji +- Reactions appear below the message bubble +- Multiple users can react to the same message +- React to your own messages or others' messages + +![Emoji reaction badges displayed beneath a message](/assets/screenshots/messages_reaction.png) + +> 💡 **Tip:** Reactions are lightweight — they use minimal mesh bandwidth compared to full text messages. + +### Message Actions + +Long-press any message to access: + +- **Copy** — copy message text to clipboard +- **Reply** — quote the message in your response +- **React** — add an emoji reaction +- **Delete** — remove a message you sent (local deletion) + +### Message Priority + +Messages are queued and transmitted based on priority: + +1. Emergency/alert messages (highest) +2. Direct messages +3. Channel broadcasts (lowest) + +### Message Limits + +- **Maximum length:** 237 bytes (approximately 230 characters for ASCII text) +- **Rate limiting:** The mesh enforces airtime fairness; heavy message volume may be throttled +- **Delivery:** Messages are retried automatically if no acknowledgment is received + +## Best Practices + +- Use channels for group coordination +- Use direct messages for private person-to-person communication +- Keep messages short — mesh bandwidth is limited +- Configure encryption for sensitive communications + +## Related Topics + +- [Nodes](nodes) — tap a node to start a direct message +- [Settings — Radio & User](settings-radio-user) — configure channel encryption and presets +- [MQTT](mqtt) — bridge channel messages to the internet +- [Channel configuration](https://meshtastic.org/docs/configuration/radio/channels) — detailed channel settings on meshtastic.org + +--- + diff --git a/docs/el-rGR/user/mqtt.md b/docs/el-rGR/user/mqtt.md new file mode 100644 index 000000000..9a044bed3 --- /dev/null +++ b/docs/el-rGR/user/mqtt.md @@ -0,0 +1,137 @@ +--- +title: MQTT +nav_order: 11 +last_updated: 2026-05-13 +description: Bridge your mesh to the internet — MQTT broker setup, encryption layers, and map reporting. +aliases: + - mqtt + - internet-bridge + - broker +--- + +# MQTT + +MQTT bridges your Meshtastic mesh network to the internet, enabling long-range communication beyond radio range. + +## Overview + +The MQTT module connects your node to an MQTT broker, allowing: + +- Messages to reach nodes on different physical meshes via the internet +- Integration with home automation and monitoring systems +- Publishing node positions to the public Meshtastic map +- Custom data pipelines for logging and alerting + +## How It Works + +``` +[Your Node] → Radio → [Gateway Node with WiFi] → MQTT Broker → [Remote Gateway] → Radio → [Remote Node] +``` + +A gateway node with internet access (WiFi or Ethernet) publishes mesh messages to an MQTT topic. Remote gateways subscribed to the same topic inject those messages into their local mesh. + +## Configuration + +### Enabling MQTT + +1. Navigate to **Settings → Module Config → MQTT**. +2. Enable the MQTT module. +3. Configure the broker connection: + +![MQTT toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | Περιγραφή | Default | +| ----------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------- | +| Server Address | MQTT broker hostname | mqtt.meshtastic.org | +| Όνομα χρήστη | Broker authentication | meshdev | +| Κωδικός πρόσβασης | Broker authentication | large4cats | +| Root Topic | Base topic for messages | msh | +| Encryption | Encrypt MQTT payload | Enabled | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON packet support has been removed from firmware; this field is ignored | Disabled | +| TLS | Secure connection to broker | Disabled | +| Map Reporting | Report position to public map | Disabled | + +### Default Meshtastic Broker + +The community maintains a public broker at `mqtt.meshtastic.org`. This is intended for general use and testing. + +> 🔒 **Privacy:** Messages on the public broker are readable by anyone subscribed. Always use channel encryption for private communications. + +### Private Broker + +For better privacy and control, you can run your own MQTT broker: + +- Mosquitto (lightweight, open-source) +- HiveMQ +- EMQX + +Configure your node to point to your private broker with appropriate credentials. + +## Map Reporting + +When Map Reporting is enabled, your node publishes its position to the Meshtastic community map: + +- Visible at [meshmap.net](https://meshmap.net) and similar community map services +- Only position and node info are shared +- Disable this if you don't want your location publicly visible + +## Uplink vs Downlink + +| Direction | Περιγραφή | +| ------------ | -------------------------------- | +| **Uplink** | Messages from mesh → MQTT broker | +| **Downlink** | Messages from MQTT broker → mesh | + +Configure per-channel which directions are active to control message flow and airtime usage. + +## Message Formats + +MQTT uses protobuf message format: + +| Format | Περιγραφή | Use case | +| ------------ | ----------------------------------- | -------------------------- | +| **Protobuf** | Binary Meshtastic protobuf encoding | Node-to-node mesh bridging | + +> ⚠️ **Note:** JSON output support was removed from firmware. The `json_enabled` setting is still visible in the app for legacy compatibility but has no effect on current firmware versions. + +## Encryption & Privacy + +Understanding the layered encryption model: + +1. **Channel encryption** happens on the mesh _before_ MQTT. If your channel has a PSK, the MQTT payload is already encrypted — the broker and any subscribers see only the ciphertext. +2. **MQTT encryption** (the module setting) adds an additional encryption layer for transit to the broker. This protects metadata and routing information. +3. **TLS** encrypts the TCP connection to the broker itself, preventing network-level eavesdropping. + +> 🔒 **Important:** The default public channel has a well-known key. Messages on the default channel sent via MQTT are effectively **unencrypted** — anyone can decode them. Always use a custom PSK for private communications. + +## Best Practices + +- Use channel-level encryption (PSK) on channels that bridge to MQTT +- Don't enable MQTT on nodes without internet access (it will buffer and waste memory) +- Use a private broker for sensitive deployments +- Be mindful of airtime when downlinking messages from busy MQTT topics — every downlinked message consumes radio airtime on your local mesh +- Consider enabling uplink-only if you only need to monitor your mesh remotely without injecting messages back + +## Troubleshooting + +### MQTT Not Connecting + +- **Check WiFi** — the gateway node must have an active internet connection (WiFi or Ethernet). MQTT does not work over the LoRa radio link itself. +- **Verify credentials** — incorrect username or password will silently fail on most brokers. Double-check for trailing spaces. +- **Firewall** — port 1883 (MQTT) or 8883 (MQTT+TLS) must be open. Some networks block non-standard ports. +- **DNS resolution** — if using a custom broker hostname, verify the node can resolve it. Try the broker's IP address directly. + +### Messages Not Bridging + +- **Check uplink/downlink settings** — if only uplink is enabled, messages flow from mesh to MQTT but not back. Enable downlink on the receiving gateway. +- **Channel mismatch** — both gateways must share the same channel with the same PSK. A mismatch means messages are encrypted with different keys and appear as garbage. +- **Topic mismatch** — ensure both gateways use the same root topic. The default `msh` works for the public broker. + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — MQTT module configuration reference +- [Messages & Channels](messages-and-channels) — channel encryption and PSK setup +- [MQTT integration guide](https://meshtastic.org/docs/software/integrations/mqtt) — detailed MQTT documentation on meshtastic.org + +--- + diff --git a/docs/el-rGR/user/node-metrics.md b/docs/el-rGR/user/node-metrics.md new file mode 100644 index 000000000..0edc97f2e --- /dev/null +++ b/docs/el-rGR/user/node-metrics.md @@ -0,0 +1,130 @@ +--- +title: Node Metrics +nav_order: 5 +last_updated: 2026-05-13 +description: Telemetry dashboards for each mesh node — device health, environment sensors, signal quality, power, traceroute, and position history. +aliases: + - metrics + - telemetry + - device-metrics + - signal +--- + +# Node Metrics + +The node detail screen provides comprehensive telemetry and metrics for each node on your mesh. + +## Device Metrics + +Basic operating information reported by each node: + +| Metric | Περιγραφή | +| ------------------- | ----------------------------------- | +| Battery Level | Current battery percentage | +| Τάση | Battery voltage reading | +| Channel Utilization | Percentage of airtime consumed | +| Airtime | Transmission time used by this node | +| Uptime | Time since last reboot | + +Device metrics are displayed as individual cards with trend sparklines showing battery level, voltage, channel utilization, airtime, and uptime over time. + +> 💡 **Tip:** Tap any metric card to expand it into a full chart with historical data points. Pinch to zoom the time axis. + +## Environment Metrics + +Environmental sensor data (requires compatible hardware): + +| Metric | Sensor Examples | +| ------------------------------------ | --------------------- | +| Θερμοκρασία | BME280, BME680, SHT31 | +| Υγρασία | BME280, BME680, SHT31 | +| Βαρομετρική Πίεση | BME280, BMP280 | +| Gas Resistance | BME680 | +| IAQ (Air Quality) | BME680 | + +Environment metrics are charted over time for easy trend analysis — temperature, humidity, and pressure each get their own line chart with the measurement unit displayed on the Y axis. + +> 💡 **Tip:** Environment metrics require a sensor connected to the remote node. Not all nodes report environmental data. See [Telemetry & Sensors](telemetry-and-sensors) for a full list of supported sensors. + +## Signal Metrics + +Radio signal quality information: + +| Metric | Περιγραφή | +| --------- | ----------------------------------------------------------------------------- | +| SNR | Signal-to-Noise Ratio (higher is better) | +| RSSI | Received Signal Strength Indicator (closer to 0 is better) | +| Hop Count | Number of mesh hops for last message | + +### Signal Quality Reference + +| SNR Range | Quality | +| --------------------------------- | --------- | +| > 10 dB | Excellent | +| 0 to 10 dB | Good | +| -10 to 0 dB | Fair | +| < -10 dB | Poor | + +## Power Metrics + +Power management telemetry (requires INA sensor or compatible hardware): + +| Metric | Περιγραφή | +| ----------- | ----------------------- | +| Bus Voltage | Supply voltage | +| Current | Power draw in milliamps | +| Power | Calculated wattage | + +## Traceroute + +Traceroute shows the path a message takes through the mesh: + +1. From the node detail screen, tap **Traceroute**. +2. The app sends a traceroute request to the target node. +3. Results show each hop with SNR/RSSI values. + +### Reading Traceroute Results + +``` +You → Node A (SNR: 8.5) → Node B (SNR: 5.2) → Target +``` + +Each hop represents a relay node that forwarded the message. + +## Αρχείο Καταγραφής Τοποθεσίας + +Historical position data for nodes that share their location: + +- GPS coordinates +- Altitude +- Speed (if moving) +- Timestamp for each position report + +## Neighbor Info + +Shows which nodes a given node can directly hear, useful for understanding mesh topology. + +## Viewing Metrics + +1. Navigate to **Nodes**. +2. Tap the node you want to inspect. +3. Select the metric category from the detail tabs. + +![Node detail — local device](/assets/screenshots/nodes_detail_local.png) + +The position tab shows location data for nodes that share GPS: + +![Position inline content](/assets/screenshots/nodes_position.png) + +> ⚠️ **Note:** Metrics are only available when they have been reported by the remote node. Metrics update at intervals configured on each node's telemetry settings. + +## Related Topics + +- [Nodes](nodes) — node list, filtering, and sorting +- [Telemetry & Sensors](telemetry-and-sensors) — supported sensors and configuration +- [Signal Meter](signal-meter) — how signal quality is calculated from SNR and RSSI +- [Discovery](discovery) — traceroute details and neighbor info +- [Units & Locale](units-and-locale) — temperature, distance, and speed display formats + +--- + diff --git a/docs/el-rGR/user/nodes.md b/docs/el-rGR/user/nodes.md new file mode 100644 index 000000000..522725a85 --- /dev/null +++ b/docs/el-rGR/user/nodes.md @@ -0,0 +1,152 @@ +--- +title: Nodes +nav_order: 4 +last_updated: 2026-05-13 +description: Browse, filter, and sort mesh nodes — view details, signal quality, roles, and quick actions. +aliases: + - node-list + - mesh-nodes + - peers +--- + +# Nodes + +The Nodes screen displays all devices visible on your mesh network. + +## Node List + +The node list shows every node your radio has heard, including: + +- **Node name** — user-configured long name +- **Short name** — 4-character identifier +- **Signal quality** — last heard signal strength +- **Last heard** — time since last communication +- **Distance** — estimated distance (if positions are shared) +- **Battery** — remote node battery level (if telemetry is enabled) + +### Node Status Indicators + +| Badge | Meaning | +| ---------- | ------------------------------------- | +| 🟢 Online | Node heard within the last 15 minutes | +| 🟡 Away | Node heard within the last 2 hours | +| 🔴 Offline | Node not heard for over 2 hours | +| ⭐ Favorite | Node marked as favorite by the user | + +### Node Roles + +Nodes can be configured with different roles that affect their mesh behavior: + +| Role | Περιγραφή | +| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Client | Standard end-user device | +| Πελάτης Βάση | Treats favorited-node traffic as Router Late priority; all other traffic as Client | +| Client Mute | Receives but doesn't retransmit | +| Client Hidden | Like Client Mute, plus hides from node list | +| Router | Prioritizes message forwarding; stays awake to relay | +| Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | +| ~~Router Client~~ | ⚠️ **Deprecated** (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | +| ~~Repeater~~ | ⚠️ **Deprecated** (removed in firmware 2.7.11) — no longer selectable; use Router instead | +| Tracker | Optimized for position reporting at regular intervals | +| Sensor | Optimized for telemetry reporting | +| TAK | Interoperates with TAK systems (sends/receives CoT) | +| TAK Tracker | TAK position reporting only | +| Lost & Found | Continuous position beacon for recovery | + +### Choosing a Role + +Most users should keep the default **Client** role. Consider a different role when: + +- **Router** — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don't use Router on battery-powered handheld devices. +- **Router Late** — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. +- **Client Base** — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. +- **Client Mute** — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only devices or to reduce congestion in dense areas. +- **Tracker** — An unattended device whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. +- **Sensor** — An unattended device reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. +- **TAK / TAK Tracker** — Only needed if interoperating with ATAK/WinTAK systems. See [TAK Integration](tak) for details. + +> 💡 **Tip:** The mesh works best when most nodes are **Client** or **Router**. Too many Mute nodes reduces mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. + +### Encryption Indicators + +Nodes display encryption status icons next to their name: + +| Icon | Meaning | +| ----------- | ------------------------------------------------------------------------------------------------------------------- | +| 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | +| 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | +| ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) | + +> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. + +## Quick Actions + +From the node list, you can: + +- **Tap** a node to view its detail page +- **Long-press** for quick actions: + - Send a direct message + - View on map + - Αίτηση θέσης + - Mark as favorite + - Traceroute + +## Filtering & Sorting + +### Text Search + +Type in the search field to filter nodes by name or short name. The filter updates in real time as you type. + +### Filter Toggles + +| Φίλτρο | Περιγραφή | +| -------------------------- | ---------------------------------------------------------------------------------------------- | +| **Only online** | Show only nodes heard within the last 15 minutes | +| **Only direct** | Show only nodes with direct (non-relayed) connections | +| **Include unknown** | Show nodes that haven't sent user info yet | +| **Exclude infrastructure** | Hide infrastructure-role nodes (Router, Repeater, Router Late, Client Base) | +| **Exclude MQTT** | Hide nodes heard only via MQTT internet bridge | +| **Show ignored** | Show nodes you've previously dismissed or muted | + +### Sort Options + +| Sort | Περιγραφή | +| ------------------------------------------- | ------------------------------------------------------------------ | +| **Last heard** (default) | Most recently heard nodes first | +| **Alphabetical** | Sorted by node long name | +| **Distance** | Nearest nodes first (requires position sharing) | +| **Hops away** | Fewest relay hops first | +| **Channel** | Grouped by channel index | +| **Via MQTT** | Grouped by MQTT vs. radio-heard | +| **Favorites** | Favorited nodes first | + +## Node Detail + +Tapping a node opens the detail view with comprehensive information. See [Node Metrics](node-metrics) for full details on metrics and telemetry. + +![Node detail view](/assets/screenshots/nodes_node_list.png) + +The detail screen includes device info, position, and action buttons: + +![Node detail section](/assets/screenshots/nodes_detail_section.png) + +Inline status indicators show key metrics at a glance: + +| Indicator | Screenshot | +| -------------- | -------------------------------------------------------- | +| Signal quality | ![Signal](/assets/screenshots/nodes_signal_info.png) | +| Battery level | ![Battery](/assets/screenshots/nodes_battery_info.png) | +| Hop count | ![Hops](/assets/screenshots/nodes_hops_info.png) | +| Last heard | ![Last heard](/assets/screenshots/nodes_last_heard.png) | +| Απόσταση | ![Distance](/assets/screenshots/nodes_distance_info.png) | + +## Related Topics + +- [Node Metrics](node-metrics) — detailed telemetry dashboards for each node +- [Messages & Channels](messages-and-channels) — send a direct message to a node +- [Map & Waypoints](map-and-waypoints) — view node positions geographically +- [Discovery](discovery) — traceroute and neighbor info for topology exploration +- [Signal Meter](signal-meter) — understand what the signal bars mean + +--- + diff --git a/docs/el-rGR/user/onboarding.md b/docs/el-rGR/user/onboarding.md new file mode 100644 index 000000000..3b910534e --- /dev/null +++ b/docs/el-rGR/user/onboarding.md @@ -0,0 +1,99 @@ +--- +title: Getting Started +nav_order: 1 +last_updated: 2026-05-13 +description: First-launch setup — permissions, onboarding flow, and next steps after connecting your radio. +aliases: + - first-launch + - setup + - intro +--- + +# Getting Started + +Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app. + +## First Launch + +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. + +### Welcome Screen + +The welcome screen introduces Meshtastic and its core capabilities: + +- Off-grid mesh communication +- No cellular or internet required +- End-to-end encrypted messaging + +Tap **Get Started** to proceed through the setup flow. + +![Welcome screen](/assets/screenshots/onboarding_welcome.png) + +## Permissions + +The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. + +### Bluetooth Permission + +Bluetooth is the primary connection method between your phone and Meshtastic radio: + +- **Bluetooth scanning** — discover nearby Meshtastic radios +- **Bluetooth connect** — establish and maintain connections with paired radios + +Grant both permissions when prompted. Without Bluetooth, you'll need to use USB or TCP connections instead. + +### Location Permission + +> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. + +Meshtastic also uses your location for: + +- Showing your position on the mesh map +- Calculating distances to other nodes +- Sharing your GPS coordinates with other mesh members (if enabled) + +Grant **"While using the app"** or **"Always"** depending on your preference: + +- **While using the app** — position updates only when the app is open +- **Always** — enables background position updates for always-on mesh presence + +If denied, Bluetooth scanning will not function and your node will not report a position. + +### Notifications Permission + +Notifications alert you to: + +- Incoming messages from channels and direct messages +- Connection status changes (connected, disconnected, reconnecting) +- Firmware update availability + +> 💡 **Tip:** You can fine-tune notification preferences later in Android system settings. The app creates separate notification channels for messages, connection events, and background service status. + +### Critical Alerts Permission + +On supported devices, the app may request permission for critical alerts: + +- These are high-priority notifications that can break through Do Not Disturb mode +- Useful for emergency mesh alerts or urgent messages +- You can **skip** this step if you don't need breakthrough notifications +- Configure or revoke later in Android notification settings + +## After Setup + +Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. + +> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. + +## What's Next? + +Once connected to a radio, explore: + +- [Connections](connections) — pair your first radio device +- [Messages & Channels](messages-and-channels) — send your first message +- [Nodes](nodes) — see who's on your mesh +- [Map & Waypoints](map-and-waypoints) — view node positions +- [Settings](settings-radio-user) — configure your radio and user profile + +New to Meshtastic? The [getting started guide](https://meshtastic.org/docs/getting-started) on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup. + +--- diff --git a/docs/el-rGR/user/settings-module-admin.md b/docs/el-rGR/user/settings-module-admin.md new file mode 100644 index 000000000..fa01de82b --- /dev/null +++ b/docs/el-rGR/user/settings-module-admin.md @@ -0,0 +1,246 @@ +--- +title: Settings — Modules & Admin +nav_order: 8 +last_updated: 2026-05-13 +description: Configure optional feature modules (MQTT, telemetry, canned messages, TAK, and more) and perform device administration. +aliases: + - modules + - module-config + - administration +--- + +# Settings — Modules & Admin + +Configure optional feature modules and perform device administration. Modules extend Meshtastic with specialized capabilities — each can be independently enabled or disabled. + +> 💡 **Tip:** You only need to enable the modules you actually use. Disabling unused modules reduces airtime, saves battery, and simplifies your configuration. + +Module settings use a card-based layout with toggle switches, dropdowns, text fields, and sliders: + +![Toggle switch](/assets/screenshots/settings_switch.png) + +![Dropdown selector](/assets/screenshots/settings_dropdown.png) + +![Text field](/assets/screenshots/settings_text_field.png) + +![Settings card layout](/assets/screenshots/settings_titled_card.png) + +## Module Configuration + +### MQTT Module + +Bridges mesh messages to and from an MQTT broker for internet connectivity. This is how you extend your mesh beyond radio range or integrate with home automation systems. + +| Setting | Περιγραφή | +| ----------------- | ------------------------------------------------------------------------ | +| Enabled | Toggle MQTT bridge | +| Server | MQTT broker address | +| Όνομα χρήστη | Authentication username | +| Κωδικός πρόσβασης | Authentication password | +| Encryption | Encrypt MQTT payloads | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON support removed from firmware; field is ignored | +| TLS | Use secure connection | +| Root Topic | Base MQTT topic path | +| Map Report | Publish position for public map | + +See [MQTT](mqtt) for a detailed usage guide including encryption, privacy, and broker setup. + +### Serial Module + +Enables serial port communication for external device integrations (GPS modules, sensors, or custom hardware). When enabled, the node's serial port can send and receive protobuf or text data, allowing external microcontrollers or computers to interact with the mesh. + +| Setting | Περιγραφή | +| ---------- | ------------------------------- | +| Enabled | Activate serial communication | +| Echo | Echo received serial data back | +| Mode | Text, Protobuf, or NMEA output | +| RX/TX Pins | GPIO pins for serial connection | +| Baud Rate | Serial communication speed | + +### External Notification Module + +Controls buzzer, LED, or vibration alerts on your radio hardware. Useful for devices that need to physically signal when a message arrives — particularly helpful for unattended or outdoor installations. + +| Setting | Περιγραφή | +| -------------------------------- | --------------------------- | +| Enabled | Activate notifications | +| Alert Message | Notify on incoming messages | +| Alert Message Buzzer | Use buzzer for messages | +| Alert Message Vibra | Use vibration for messages | +| Alert Bell | Notify on bell character | +| Output (GPIO) | Pin for notification output | +| Active | High or Low active | +| Duration (ms) | Notification length | +| Use I2S as Buzzer | Use I2S audio output | + +### Store & Forward Module + +Buffers messages for nodes that were temporarily offline, then replays them when those nodes reconnect. Essential for meshes where nodes go in and out of range regularly — ensures messages aren't lost during brief disconnections. + +| Setting | Περιγραφή | +| ------------------------------------------ | -------------------------- | +| Enabled | Activate store and forward | +| Heartbeat (s) | Announcement interval | +| Records | Maximum stored messages | +| History Return (max) | Max messages to replay | +| History Return (window) | Time window for replay | + +> 💡 **Tip:** Store and Forward works best on nodes with ample memory (ESP32 with PSRAM). Router nodes are ideal candidates since they're typically always-on. + +### Range Test Module + +Automated range testing tool for evaluating link quality between nodes. When enabled, the node periodically transmits test messages with incrementing counters. A receiver node logs these messages, allowing you to walk or drive away and later analyze at what distance messages stopped arriving. + +| Setting | Περιγραφή | +| -------------------------------------- | --------------------------------- | +| Enabled | Activate range testing | +| Sender Interval (s) | Time between test transmissions | +| Save CSV | Log received test data to SD card | + +### Telemetry Module + +Controls what telemetry data your node shares with the mesh. Telemetry includes device health (battery, uptime) and environmental sensor data (temperature, humidity, pressure). + +| Setting | Περιγραφή | +| ---------------------------- | --------------------------------------- | +| Device Metrics Interval | How often to report device metrics | +| Environment Metrics Interval | How often to report environment sensors | +| Air Quality Enabled | Report particulate sensor data | +| Power Metrics Enabled | Report power usage | + +See [Telemetry & Sensors](telemetry-and-sensors) for supported sensors and configuration recommendations. + +### Canned Message Module + +Pre-configured messages accessible from the device's physical buttons (for radios with rotary encoders, keypads, or similar input hardware). Define a list of quick-send messages that can be transmitted without a phone connected — ideal for field use. + +| Setting | Περιγραφή | +| ------------------ | ----------------------------------------------------------- | +| ~~Enabled~~ | ⚠️ **Deprecated** — current firmware may ignore this toggle | +| Μηνύματα | Newline-separated list of messages | +| Send Bell | Play bell sound on send | +| Rotary Encoder | Enable rotary encoder input | +| Up/Down/Press Pins | GPIO pin assignments for input | + +### Audio Module + +Codec2 audio support for low-bandwidth voice communication over the mesh. This is an **experimental** feature that encodes voice into very small data packets using the Codec2 codec. + +| Setting | Περιγραφή | +| --------------- | -------------------------------- | +| Enabled | Activate audio module | +| Codec2 Rate | Audio quality/bandwidth tradeoff | +| I2S Word Select | GPIO pin for I2S WS | +| I2S Data In | GPIO pin for I2S DIN | +| I2S Data Out | GPIO pin for I2S DOUT | + +> ⚠️ **Note:** Audio requires specific hardware (I2S microphone and speaker). Voice quality is very low-bandwidth — think "understandable radio voice," not phone-call quality. + +### Remote Hardware Module + +GPIO control over the mesh network. Allows a remote node to read or write GPIO pins on another node — useful for activating relays, reading switches, or controlling external hardware from a distance. + +| Setting | Περιγραφή | +| -------------------- | --------------------------------------------------------------- | +| Enabled | Activate remote GPIO access | +| Allow Undefined Pins | Allow access to any GPIO pin (security risk) | + +> ⚠️ **Warning:** Enabling "Allow Undefined Pins" gives remote nodes access to all GPIO pins, which could interfere with the radio's own hardware. Only enable on dedicated GPIO nodes. + +### Neighbor Info Module + +Broadcasts information about directly heard neighbors, enabling mesh topology mapping. Each enabled node periodically shares a list of the other nodes it can hear and their signal quality. + +| Setting | Περιγραφή | +| -------------------------------------- | ------------------------------------ | +| Enabled | Activate neighbor broadcasting | +| Update Interval (s) | How often to broadcast neighbor list | + +See [Discovery](discovery) for how to use neighbor data for mesh topology exploration. + +### Ambient Lighting Module + +Controls onboard NeoPixel or other addressable RGB LEDs on supported hardware. Can be used for visual status indicators, notification lights, or decorative effects. + +| Setting | Περιγραφή | +| ------------------ | ---------------------------------------------------------- | +| Enabled | Activate LED control | +| LED State | On, Off, or set specific color | +| Red / Green / Blue | Individual color channel values (0–255) | + +### Detection Sensor Module + +Turns your node into a motion or door sensor alert system. When a GPIO pin detects a state change (motion detected, door opened), the node broadcasts an alert message over the mesh. + +| Setting | Περιγραφή | +| ---------------------------------------- | ----------------------------------------------------------------------- | +| Enabled | Activate detection sensor | +| Monitor Pin | GPIO pin connected to sensor | +| Detection Triggered High | Trigger when pin goes high (vs. low) | +| Minimum Broadcast (s) | Minimum time between alert broadcasts | +| State Broadcast (s) | Periodic state broadcast interval | +| Send Bell | Include bell character in alerts | +| Friendly Name | Custom name for this sensor | + +### Paxcounter Module + +People counter using WiFi and BLE probe requests. Counts nearby devices by passively listening for probe requests that phones and laptops emit when scanning for networks. Available only on ESP32 devices. + +| Setting | Περιγραφή | +| -------------------------------------- | -------------------------- | +| Enabled | Activate people counting | +| Update Interval (s) | How often to report counts | + +> 💡 **Tip:** Paxcounter is useful for estimating foot traffic at trailheads, event venues, or other locations. Counts are approximate — one person may carry multiple devices. + +### TAK Module + +Team Awareness Kit integration for interoperability with ATAK and WinTAK. See [TAK Integration](tak) for detailed setup and usage. + +## Διαχείριση + +### Απομακρυσμένη Διαχείριση + +Remotely configure nodes that share your admin key: + +1. Select the target node in the node list. +2. Navigate to **Settings** for that node. +3. Modify configuration. +4. Tap **Save** — changes are sent over the mesh. + +> ⚠️ **Requires:** Admin key configured on both your node and the target node. + +### Clean Node Database + +Removes stale nodes from your local database that haven't been heard in a configurable time window. + +### Factory Reset + +Resets all settings to factory defaults. **This cannot be undone.** + +### Επανεκκίνηση + +Remotely reboot a connected or administered node. + +### Πίνακας αποσφαλμάτωσης + +View detailed diagnostic information: + +- Protocol buffers debug output +- Mesh packet log +- Connection state details + +### Troubleshooting Remote Admin + +- **"No response from target node"** — the target may be out of range, offline, or have a mismatched admin key. Verify the admin key matches on both nodes. +- **Changes not applying** — some settings require a reboot to take effect. Try the Reboot action after saving. +- **Can't see remote settings** — ensure your node has the admin key for the target node and that Admin Channel is enabled in Security Config. + +## Related Topics + +- [Settings — Radio & User](settings-radio-user) — core radio and user profile settings +- [Module configuration reference](https://meshtastic.org/docs/configuration/module) — detailed module docs on meshtastic.org +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/el-rGR/user/settings-radio-user.md b/docs/el-rGR/user/settings-radio-user.md new file mode 100644 index 000000000..d4174e3b5 --- /dev/null +++ b/docs/el-rGR/user/settings-radio-user.md @@ -0,0 +1,173 @@ +--- +title: Settings — Radio & User +nav_order: 7 +last_updated: 2026-05-13 +description: Configure your radio hardware, LoRa presets, user profile, position sharing, power management, and security. +aliases: + - ρυθμίσεις + - radio-config + - user-config + - lora +--- + +# Settings — Radio & User + +Configure your radio hardware and user identity parameters. + +## User Settings + +### User Profile + +| Setting | Περιγραφή | +| ----------------- | ------------------------------------------------------------------------------------- | +| Long Name | Your display name (up to 39 characters) | +| Short Name | 4-character abbreviated name | +| Licensed Operator | Enable if you hold an amateur radio license (enables higher power) | + +### Applying Changes + +After modifying settings, tap **Save** to write the configuration to your radio. The device may reboot to apply changes. + +## Radio Configuration + +### Device Config + +| Setting | Περιγραφή | Default | +| ------------------------------------------ | ----------------------------------------------------------------------- | -------- | +| Role | Node behavior (Client, Router, etc.) | Client | +| Rebroadcast Mode | How the node retransmits messages | All | +| Node Info Broadcast (s) | Interval for broadcasting node info | 10800 | +| Double-tap Button | Action for double-tap button press | Disabled | + +### LoRa Config + +| Setting | Περιγραφή | Default | +| ----------------- | ----------------------------------------------------------------------- | ----------------------------------------- | +| Περιφέρεια | Regulatory region for frequency bands | Unset (must configure) | +| Modem Preset | Speed/range tradeoff | LongFast | +| Hop Limit | Maximum retransmit hops | 3 | +| TX Power | Transmission power (dBm); 0 = max allowed for region | 0 (region max) | +| Frequency Offset | Fine-tune frequency (MHz) | 0 | +| Channel Bandwidth | Bandwidth setting | Default for preset | + +> ⚠️ **Important:** You **must** set your region before transmitting. Operating without the correct region may violate local radio regulations. See the [region configuration guide](https://meshtastic.org/docs/getting-started/initial-config) on meshtastic.org for details. + +### Modem Presets + +| Preset | Range | Speed | SNR Limit | Best For | +| ------------------ | ----------------------- | ------------------------- | ------------------------ | -------------------------------------------------------------------------------------------------------- | +| Short Turbo | ~1 km | 21.9 kbps | −5 dB | Dense urban with line-of-sight; data-heavy applications | +| Short Fast | ~3 km | 10.9 kbps | −7.5 dB | Urban neighborhoods; buildings within a few blocks | +| Short Slow | ~5 km | 5.5 kbps | −10 dB | Suburban short-range; moderate building density | +| Medium Fast | ~5 km | 5.5 kbps | −10 dB | Suburban areas; moderate building density | +| Medium Slow | ~8 km | 1.1 kbps | −12.5 dB | Suburban/rural; moderate range with slower speed | +| Long Turbo | ~10 km | 4.4 kbps | −10 dB | Similar range to Long Fast but with 500 kHz bandwidth; faster throughput | +| Long Fast | ~10 km | 1.1 kbps | −12.5 dB | **General use (default)** — balanced range and speed | +| Long Moderate | ~20 km | 0.34 kbps | −15 dB | Rural with some terrain; occasional use | +| Lite Fast | ~5 km | 5.5 kbps | −10 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Medium Fast | +| Lite Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Long Fast | +| Narrow Fast | ~5 km | 2.7 kbps | −10 dB | EU 868 MHz band (62.5 kHz BW); avoids interference with other devices | +| Narrow Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 868 MHz band (62.5 kHz BW); comparable to Long Fast | +| ~~Long Slow~~ | ~30 km | 0.18 kbps | −17.5 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | +| ~~Very Long Slow~~ | ~40+ km | 0.09 kbps | −20 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | + +#### Choosing a Modem Preset + +The modem preset controls the fundamental tradeoff between **range** and **data rate**: + +- **Slower presets** use more spreading, making signals decodable at weaker signal levels (lower SNR limit). This means longer range but fewer bytes per second. +- **Faster presets** pack more data per transmission but require a stronger signal to decode. + +**Practical guidance:** + +- **Urban mesh (many nodes, short distances):** Use **Long Fast** (default) or **Short Fast**. Higher speed means less airtime congestion when many nodes share the channel. +- **Rural/sparse mesh (few nodes, long distances):** Use **Long Moderate**. Range matters more than speed when nodes are far apart. +- **EU 866/868 MHz regulatory compliance:** Use **Lite Fast**, **Lite Slow**, **Narrow Fast**, or **Narrow Slow** — these are optimized for the EU SRD/868 MHz bands with narrower bandwidths. +- **Fixed infrastructure links:** Use **Short Turbo** or **Long Turbo** for dedicated point-to-point links with good antennas and line-of-sight. +- **Mixed environments:** Stick with **Long Fast** — it's the community default and ensures compatibility with others in your area. + +> ⚠️ **Important:** All nodes on the same channel **must** use the same modem preset. Nodes with mismatched presets cannot communicate even if they share the same frequency and encryption key. + +> 💡 **Tip:** The range estimates above assume flat terrain and modest antennas. Elevation advantage (hilltop, rooftop) dramatically increases effective range. A well-placed Router with Long Fast can often outperform a ground-level node with Long Slow. + +### Display Config + +| Setting | Περιγραφή | +| ------------------- | ------------------------------------------------------------------------------------ | +| Screen Timeout | Time before display sleeps | +| Display Units | Metric or Imperial | +| OLED Type | Auto, SSD1306, SH1106, SH1107 | +| Compass Orientation | Rotation offset for compass display (0°, 90°, 180°, 270°) | +| ~~Compass North~~ | ⚠️ **Deprecated** — replaced by Compass Orientation; still visible in older firmware | + +### Position Config + +| Setting | Περιγραφή | +| ----------------------------------------- | ---------------------------------- | +| GPS Enabled | Enable/disable GPS | +| GPS Update Interval | How often to acquire GPS fix | +| Position Broadcast (s) | How often to share position | +| Smart Position | Enable movement-based broadcasting | +| Fixed Position | Use a manually set position | + +### Power Config + +| Setting | Περιγραφή | +| --------------------------------------- | --------------------------------------- | +| Power Saving | Enable low-power sleep mode | +| Shutdown After (s) | Auto-shutdown idle timer | +| ADC Multiplier | Battery voltage calibration factor | +| Wait Bluetooth (s) | Time to wait for BLE connection at boot | +| Mesh SDS Timeout (s) | Super-deep-sleep timeout | + +### Network Config + +| Setting | Περιγραφή | +| ------------- | ---------------------------------------------------- | +| WiFi Enabled | Enable WiFi radio (ESP32 devices) | +| WiFi SSID | Network name to connect to | +| WiFi PSK | Network password | +| NTP Server | Time synchronization server | +| Syslog Server | Remote logging server | + +![IP address field](/assets/screenshots/settings_ipv4_field.png) + +### Ρυθμίσεις Bluetooth + +| Setting | Περιγραφή | +| ----------------- | ------------------------------------------------------------------------- | +| Bluetooth Enabled | Enable/disable BLE radio | +| Pairing Mode | Fixed PIN, Random PIN, or No PIN | +| Fixed PIN | PIN code for pairing (default: 123456) | + +### Security Config + +| Setting | Περιγραφή | +| --------------------- | -------------------------------------------------------------------------- | +| Δημόσιο Κλειδί | Your node's public key (read-only) | +| Admin Key | Key for remote administration | +| Ιδιωτικό Κλειδί | Your node's private key (handle securely) | +| Admin Channel Enabled | Allow admin commands via channel | +| Debug Log | Output live debug logging over serial/bluetooth | +| Serial Enabled | Enable serial console access (moved from Device Config) | +| Managed Mode | Restrict non-admin channel changes | + +![Password field](/assets/screenshots/settings_password_field.png) + +Settings use standard preference controls — dropdowns, toggles, and sliders: + +| Control | Screenshot | +| -------- | ------------------------------------------------------ | +| Dropdown | ![Dropdown](/assets/screenshots/settings_dropdown.png) | +| Toggle | ![Toggle](/assets/screenshots/settings_switch.png) | +| Slider | ![Slider](/assets/screenshots/settings_slider.png) | + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — optional feature modules and device administration +- [Signal Meter](signal-meter) — how modem presets affect signal quality thresholds +- [LoRa configuration](https://meshtastic.org/docs/configuration/radio/lora) — detailed LoRa settings reference on meshtastic.org +- [Initial configuration](https://meshtastic.org/docs/getting-started/initial-config) — region setup guide on meshtastic.org + +--- + diff --git a/docs/el-rGR/user/signal-meter.md b/docs/el-rGR/user/signal-meter.md new file mode 100644 index 000000000..d34246d0e --- /dev/null +++ b/docs/el-rGR/user/signal-meter.md @@ -0,0 +1,81 @@ +--- +title: How the Meshtastic Signal Meter Works +nav_order: 15 +last_updated: 2026-05-13 +description: How the signal meter calculates quality from RSSI and SNR — LoRa spread spectrum, presets, and what the bars really mean. +aliases: + - signal + - signal-meter + - snr + - rssi +--- + +# How the Meshtastic Signal Meter Works + +The Meshtastic signal meter — the familiar bars or status color in the app — is calculated very differently than the "bars" on a traditional cell phone or Wi-Fi router. + +Most consumer devices simply measure how "loud" a signal is. However, because Meshtastic uses **LoRa (Long Range)** technology, its signal meter measures how **clear** the signal is, relative to the specific settings your mesh is using. + +--- + +## 1. The Two Metrics: "Loudness" vs. "Clarity" + +Every time the LoRa radio chip receives a message, it reports two measurements: + +- **RSSI (Received Signal Strength Indicator):** The **loudness** of the raw power hitting your antenna. +- **SNR (Signal-to-Noise Ratio):** The **clarity** of the signal compared to the background static. + +> **Tip — The Analogy:** Imagine you are trying to hear a friend talking to you. +> +> - **RSSI** is how loud their voice is. +> - **The Noise Floor** is the background noise in the room (air conditioning, other people talking, traffic). +> - **SNR** is how easily you can distinguish your friend's voice from the background noise. + +If your friend shouts at you at a deafening rock concert, the signal is incredibly loud (High RSSI), but you still can't understand them because the background noise is louder (Bad SNR). Conversely, if your friend whispers to you in a dead-silent library, the signal is very weak (Low RSSI), but you can understand them perfectly (Great SNR). + +--- + +## 2. The Magic of LoRa: Hearing "Below the Noise Floor" + +For standard radios (like FM or Wi-Fi), if the background noise is louder than the signal (a negative SNR), the receiver just hears static. + +LoRa is special. It uses **"Spread Spectrum"** modulation, which allows the radio to mathematically pull a signal out of the air even when it is buried deep _underneath_ the background noise. This is why you will frequently see **negative SNR numbers** in Meshtastic (e.g., -10 dB, which means the signal is 10 decibels weaker than the background static). + +Depending on which Meshtastic preset you are using (e.g., `LongFast` vs. `ShortFast`), the radio has a specific **SNR Limit** — the absolute maximum amount of noise it can tolerate before the message is completely lost to the static. + +--- + +## 3. How the Signal Meter Calculates Quality + +The Meshtastic apps take both RSSI and SNR and run them through a specific formula to assign your signal a quality rating (None, Bad, Fair, or Good). It specifically scales these values based on the physical limits of the radio preset you are using. + +Here is exactly how the app decides how many bars (or what color) to show you: + +| Level | Bars | Criteria | Meaning | +| ----- | ---- | ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | +| Good | 3 | RSSI better than `-115 dBm` **AND** SNR better than `-7 dB` | Signal is both loud and clear — healthy connection. | +| Fair | 2 | RSSI better than `-126 dBm` with good SNR, **OR** SNR better than `-15 dB` with good RSSI | Signal getting quieter or noisier, but still decodable. | +| Bad | 1 | Falls between Fair and None thresholds | At the edge of range or experiencing interference. | +| None | 0 | RSSI worse than `-126 dBm` **AND** SNR worse than `-15 dB` | Transmission completely buried in noise. | + +--- + +## 4. What This Means for You + +Because Meshtastic's meter acts as a **"Clarity Meter"**, it behaves differently than what most people expect: + +> **Tip — Don't panic over low RSSI:** You might see a seemingly terrible RSSI value like `-118 dBm`. On a cell phone, you would have zero bars. But if you have an SNR of `+2 dB`, Meshtastic will still show a strong signal! _The library is quiet, so the whisper is heard perfectly._ + +> **Warning — Watch out for local noise:** If you hook up a massive antenna and see a great RSSI (e.g., `-90 dBm`) but your signal meter is only showing **1 Bar (Bad)**, you have a problem. It means you have local interference — perhaps a cheap power supply, a noisy computer, or a nearby radio tower — creating so much static that it is drowning out your mesh. + +## Where Signal Information Appears + +In the app, signal data is shown in several places: + +- **Node list** — signal bars icon next to each node +- **Node detail** — SNR, RSSI, and signal quality in the device metrics section +- **Traceroute** — per-hop signal quality for each relay node +- **Signal metrics** — historical SNR and RSSI data in the metrics charts + +![Node entry showing SNR, RSSI values and colored signal bars](/assets/screenshots/nodes_signal_info.png) + diff --git a/docs/el-rGR/user/tak.md b/docs/el-rGR/user/tak.md new file mode 100644 index 000000000..85d2dfd01 --- /dev/null +++ b/docs/el-rGR/user/tak.md @@ -0,0 +1,126 @@ +--- +title: TAK Integration +nav_order: 10 +last_updated: 2026-05-13 +description: Interoperate with ATAK and WinTAK — CoT position sharing, TAK roles, and plugin setup. +aliases: + - tak + - atak + - team-awareness-kit +--- + +# TAK Integration + +Meshtastic integrates with the Team Awareness Kit (TAK) ecosystem, enabling interoperability between Meshtastic mesh devices and TAK applications like ATAK and WinTAK. + +## Overview + +The TAK module allows Meshtastic nodes to: + +- Share position data in TAK-compatible CoT (Cursor on Target) format +- Appear as team members on TAK map displays +- Receive TAK PLI (Position Location Information) messages + +## Setup + +### Prerequisites + +- ATAK (Android Team Awareness Kit) or WinTAK installed +- Meshtastic ATAK Plugin installed +- TAK module enabled on your Meshtastic radio + +### Configuration + +1. Navigate to **Settings → Module Config → TAK**. +2. Enable the TAK module. +3. Configure the TAK team/group settings: + +![Module toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | Περιγραφή | +| ------- | -------------------------- | +| Enabled | Activate TAK interop | +| Mode | TAK-compatible output mode | + +### ATAK Plugin Setup + +1. Install the Meshtastic ATAK Plugin from the plugin repository. +2. Open ATAK and enable the Meshtastic plugin. +3. The plugin bridges messages between ATAK and your mesh network. + +## TAK Roles + +Nodes configured with TAK-related roles behave differently from standard clients: + +| Role | Περιγραφή | +| --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **TAK** | Full TAK interoperability — sends and receives CoT data, chat messages, and PLI updates. Functions as a standard client plus TAK bridge. | +| **TAK Tracker** | Position-only TAK output — automatically broadcasts PLI at regular intervals without user interaction. Optimized for unattended position beacons (vehicles, equipment, waypoints). Does not relay chat messages. | + +> 💡 **Tip:** Use **TAK Tracker** for devices that only need to report position (e.g., a radio mounted in a vehicle). Use **TAK** for devices where users actively participate in TAK operations. + +### CoT (Cursor on Target) Format + +TAK messages use the Cursor on Target XML format — a military standard for sharing situational awareness data. Meshtastic converts its internal protobuf messages to CoT format when bridging to TAK systems, so no manual format conversion is needed. + +## TAK Identity + +When using TAK roles, your node broadcasts identity information that appears on TAK maps: + +| Setting | Περιγραφή | +| -------- | ---------------------------------------------------------------------------------------------------------------- | +| Team | Your team color on the TAK map (e.g., Blue, Red, Cyan, Green) | +| Role | Your operational role (Team Member, Team Lead, HQ, Medic, RTO, etc.) | +| Callsign | Your TAK callsign (defaults to your Meshtastic long name) | + +These settings appear in **Settings → Module Config → TAK** when the TAK module is enabled. + +> 💡 **Tip:** Team/role colors are the standard TAK affiliation colors. Coordinate with your TAK team to use consistent team assignments. + +## Wire Format (V1 / V2) + +Meshtastic supports two TAK wire formats: + +| Format | Compatibility | Features | +| ------------------------------- | --------------------------------------------------------------- | --------------------------------------------------------- | +| V1 (Legacy) | ATAK Plugin v1.x, older firmware | Basic CoT position sharing only | +| V2 (Current) | ATAK Plugin v2.x, firmware 2.3+ | Full CoT support including chat, routes, zstd compression | + +The app automatically selects V2 when both sides support it. No manual configuration needed — the TAK module negotiates format based on firmware capabilities. + +## Usage with ATAK + +Once configured: + +- Meshtastic nodes appear as markers on the ATAK map with callsign labels +- Chat messages can bridge between mesh and TAK networks +- Position updates flow bidirectionally between Meshtastic and TAK +- TAK Tracker nodes broadcast PLI automatically — their positions appear on ATAK maps without any ATAK-side configuration + +> ⚠️ **Note:** TAK integration requires specific node roles and module configuration. Standard client nodes don't automatically participate in TAK operations. + +## Troubleshooting + +| Problem | Cause | Solution | +| -------------------------------- | ------------------------------------- | ----------------------------------------------------------------------- | +| Node doesn't appear on ATAK map | TAK module disabled or wrong role | Verify TAK module is enabled and node role is TAK or TAK Tracker | +| Position updates are stale | GPS fix lost or interval too long | Check GPS status; reduce position broadcast interval in Position Config | +| ATAK plugin shows "disconnected" | BLE connection lost or plugin crashed | Reconnect Bluetooth in Meshtastic app, then restart ATAK plugin | +| Chat messages not bridging | V1 format doesn't support chat | Ensure both nodes run firmware 2.3+ for V2 wire format | +| CoT data not flowing | Channel mismatch | All TAK nodes must be on the same channel with matching encryption | + +## Security Considerations + +- TAK data shares your position and callsign information +- Ensure your channel encryption is configured when using TAK in sensitive environments +- The TAK module respects the same channel encryption as other Meshtastic messages + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — TAK module configuration +- [Nodes](nodes) — TAK and TAK Tracker roles in the node list +- [Map & Waypoints](map-and-waypoints) — node positions on the map +- [ATAK plugin guide](https://meshtastic.org/docs/software/integrations/atak-plugin) — detailed ATAK setup on meshtastic.org + +--- + diff --git a/docs/el-rGR/user/telemetry-and-sensors.md b/docs/el-rGR/user/telemetry-and-sensors.md new file mode 100644 index 000000000..c112d632a --- /dev/null +++ b/docs/el-rGR/user/telemetry-and-sensors.md @@ -0,0 +1,118 @@ +--- +title: Telemetry & Sensors +nav_order: 9 +last_updated: 2026-05-13 +description: Sensor data on the mesh — supported environment, air quality, and power sensors, plus configuration and viewing guides. +aliases: + - sensors + - environment + - weather + - power-metrics +--- + +# Telemetry & Sensors + +Meshtastic nodes can collect and share sensor data across the mesh network. + +## Overview + +Telemetry allows nodes equipped with sensors to broadcast environmental, power, and device health information. This data is visible on the node detail screen and can be logged over time. + +## Device Telemetry + +All Meshtastic nodes report basic device telemetry: + +| Metric | Περιγραφή | Typical Range | +| ------------------- | ------------------------------ | ------------------------------------------------------------------ | +| Battery Level | Charge percentage | 0–100% | +| Τάση | Battery voltage | 3.0–4.2V (LiPo) | +| Channel Utilization | % of airtime used locally | 0–100% | +| Air Utilization TX | % of airtime used by this node | 0–100% | +| Uptime | Seconds since last boot | Varies | + +## Environment Sensors + +Supported environmental sensors: + +### Temperature & Humidity + +| Sensor | Θερμοκρασία | Υγρασία | Pressure | Notes | +| ------- | ----------- | ------- | -------- | ----------------------- | +| BME280 | ✓ | ✓ | ✓ | Recommended all-in-one | +| BME680 | ✓ | ✓ | ✓ | Adds gas resistance/IAQ | +| SHT31 | ✓ | ✓ | — | High accuracy | +| MCP9808 | ✓ | — | — | Precision temperature | +| LPS22 | — | — | ✓ | Pressure only | + +### Air Quality + +| Sensor | Metric | Notes | +| -------- | -------------------------------------------------- | -------------------------- | +| BME680 | Gas Resistance / IAQ | Volatile organic compounds | +| PMSA003I | PM1.0, PM2.5, PM10 | Particulate matter | +| SEN55 | PM, NOx, VOC, Temp, Humidity | Multi-sensor | + +### Light & UV + +| Sensor | Metric | +| -------- | -------------------------------------- | +| OPT3001 | Ambient light (lux) | +| VEML7700 | Ambient light (lux) | +| LTR390 | UV index | + +## Power Metrics + +Nodes with INA-series power sensors can report: + +| Metric | Περιγραφή | +| ----------- | ----------------------------------------- | +| Bus Voltage | Supply rail voltage | +| Current | Power consumption (mA) | +| Power | Calculated power (mW) | + +Useful for monitoring solar charging or battery health on remote nodes. + +## Configuring Telemetry + +1. Navigate to **Settings → Module Config → Telemetry**. +2. Set reporting intervals: + - **Device Metrics Interval** — how often to broadcast device metrics + - **Environment Metrics Interval** — how often to broadcast sensor data +3. Enable specific sensor types as needed. + +### Recommended Intervals + +| Use Case | Device (s) | Environment (s) | +| ------------------------------------------ | ----------------------------- | ---------------------------------- | +| Urban mesh (many nodes) | 3600 | 3600 | +| Rural mesh (few nodes) | 900 | 900 | +| Weather station | 900 | 300 | +| Battery conservation | 7200 | 7200 | + +> ⚠️ **Note:** Shorter intervals increase airtime usage and battery drain across the mesh. + +## Viewing Telemetry + +1. Navigate to **Nodes** and select a node. +2. Telemetry sections show on the detail screen: + - Device Metrics (always available) + - Environment Metrics (if sensors present) + - Power Metrics (if INA sensor present) +3. Historical graphs show trends over time. + +![Telemetry actions](/assets/screenshots/node-metrics_telemetric_actions.png) + +## Troubleshooting + +- **No environment data showing?** The remote node needs a physical sensor connected (e.g., BME280 on I2C). Device telemetry (battery, uptime) is always available, but environment metrics require hardware. +- **Stale readings?** Check the reporting interval — very long intervals (7200s+) mean data updates infrequently. Also verify the remote node is still online. +- **Sensor conflict on I2C bus?** Some sensors share I2C addresses. If you have multiple sensors on the same bus, check for address collisions in the radio's serial debug output. + +## Related Topics + +- [Node Metrics](node-metrics) — view telemetry data on the node detail screen +- [Settings — Modules & Admin](settings-module-admin) — telemetry module configuration +- [Units & Locale](units-and-locale) — temperature and pressure display units + +--- + diff --git a/docs/el-rGR/user/translate.md b/docs/el-rGR/user/translate.md new file mode 100644 index 000000000..b2ed79a34 --- /dev/null +++ b/docs/el-rGR/user/translate.md @@ -0,0 +1,97 @@ +--- +title: Translate the App +parent: User Guide +nav_order: 17 +last_updated: 2026-05-13 +aliases: + - translate + - crowdin + - localization +--- + +# Translate the App + +Contributing translations helps make Meshtastic accessible to a wider audience. The app uses [Crowdin](https://crowdin.com/) to manage community translations for both the user interface and in-app documentation. + +--- + +## What Gets Translated + +| Resource | Source Location | Notes | +| ----------------- | ------------------------------------- | ---------------------------------------------------------------------- | +| UI strings | `composeResources/values/strings.xml` | Buttons, labels, messages, and all user-visible text | +| User Guide pages | `docs/user/*.md` | In-app documentation shown in Help & Documentation | +| Fastlane metadata | `fastlane/metadata/android/en-US/` | App Store listing title, description, and changelogs | + +> **Note — Developer Guide pages are English-only.** Code-focused documentation targeting contributors is not translated. + +--- + +## How to Contribute + +1. **Visit the Crowdin project.** Open the [Meshtastic Android Crowdin project](https://crowdin.com/project/meshtastic-android) and sign in or create a free account. +2. **Choose your language.** Select an existing language or request a new one by opening a [GitHub issue](https://github.com/meshtastic/Meshtastic-Android/issues/new). +3. **Translate strings.** Crowdin shows the English source on the left and your translation on the right. Translate each string and save. +4. **Review context.** Many strings include screenshots or context comments — check these to understand where the text appears in the app. +5. **Submit.** Approved translations are automatically merged into the next release. + +> **Tip — Keep translations short.** UI strings often appear in buttons, chips, or narrow columns. If a translation is significantly longer than the English original, consider abbreviating where the meaning stays clear. + +--- + +## Adding a New Language + +If your language is not yet listed on Crowdin: + +1. Open an issue on [GitHub](https://github.com/meshtastic/Meshtastic-Android/issues/new) requesting the new locale. +2. A maintainer will add the language to Crowdin and configure `crowdin.yml`. +3. Once added, you can begin translating immediately. + +--- + +## How Translations Are Organized + +The Android app uses **Compose Multiplatform resources** for all user-visible strings: + +``` +core/resources/src/commonMain/composeResources/ +├── values/ ← English (default) +│ └── strings.xml +├── values-de/ ← German +│ └── strings.xml +├── values-fr/ ← French +│ └── strings.xml +└── ... +``` + +In-app documentation follows a similar pattern under `docs/`: + +``` +docs/ +├── user/ ← English source (default) +│ ├── onboarding.md +│ └── ... +├── fr/user/ ← French translations +│ ├── onboarding.md +│ └── ... +└── ... +``` + +The app automatically selects the correct locale based on your device's **Language & Region** settings. + +--- + +## Translation Guidelines + +- **Do not translate** technical terms like "LoRa", "MQTT", "BLE", "TAK", "SNR", or "RSSI" — these are universal. +- **Keep placeholders intact.** Strings like `%1$s` or `%d` are filled in at runtime. Do not remove or reorder them unless the grammar of your language requires it. +- **Match tone.** The app uses a friendly, direct voice. Avoid overly formal language. +- **Test if possible.** Switch your device language and open the app to see how translations look in context. + +--- + +## Questions? + +If you have questions about a specific string's context or need help getting started, open a discussion on the [Meshtastic GitHub Discussions](https://github.com/meshtastic/Meshtastic-Android/discussions) page. + +Thank you for helping expand the reach of Meshtastic! diff --git a/docs/el-rGR/user/units-and-locale.md b/docs/el-rGR/user/units-and-locale.md new file mode 100644 index 000000000..84c58202b --- /dev/null +++ b/docs/el-rGR/user/units-and-locale.md @@ -0,0 +1,118 @@ +--- +title: Units, Measurement & Locale +parent: User Guide +nav_order: 16 +last_updated: 2026-05-12 +--- + +# Units, Measurement & Locale + +The Meshtastic app automatically displays temperatures, distances, speeds, and times in the units your device is configured to use — no settings to change inside the app. + +--- + +## How It Works + +Meshtastic radios always transmit data in **metric units** (meters, °C, km/h, hPa, etc.). When the app receives this data, it uses the `MetricFormatter` utility to convert and display values in whatever unit system your device's locale specifies. + +On Android, your measurement preferences are determined by your system **Language & Region** settings. On Desktop (JVM), the app uses the JVM's default `Locale`. + +> **Tip — You never need to toggle units inside the app.** Change your system measurement preferences and every screen in Meshtastic updates automatically — node details, telemetry charts, weather, altitude, and more. + +--- + +## Θερμοκρασία + +Temperature values from environment sensors are transmitted as **°C** and displayed based on your device's temperature unit preference. + +![Environment metrics with temperature](/assets/screenshots/nodes_environment_metrics.png) + +| Your Setting | You See | +| ------------ | ------- | +| Celsius | 22°C | +| Fahrenheit | 72°F | + +This affects all temperature displays throughout the app: node environment telemetry, soil temperature, dew point, and telemetry chart axes. + +## Distance & Altitude + +Distances between nodes and GPS altitudes are transmitted as **meters** and automatically scaled and converted. + +![Distance info display](/assets/screenshots/nodes_distance_info.png) + +| Your Setting | Small Distance | Large Distance | Altitude | +| -------------------------------- | -------------- | ---------------------- | -------- | +| Metric | 350 m | 2.5 km | 1,200 m | +| Imperial (US) | 1,148 ft | 1.6 mi | 3,937 ft | + +The app uses natural scaling — short distances stay in meters or feet, while longer distances switch to kilometres or miles automatically. + +### Where these appear + +- **Node list** — distance and bearing to each node +- **Node detail** — altitude, distance from your position +- **Map** — waypoint distances, traceroute hop distances +- **Compass** — distance to selected node + +## Speed + +GPS ground speed is displayed in your locale's preferred speed unit. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Metric | 12 km/h | +| Imperial (US) | 7 mph | + +## Wind + +Wind speed and gust data from environment sensors are transmitted as **m/s** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Metric | 5 m/s | +| Imperial (US) | 11 mph | + +Wind readings appear in the **Node Detail** environment section and the **Environment Telemetry** charts. + +## Rainfall + +Rainfall measurements (1-hour and 24-hour totals) are transmitted as **mm** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ---------------------- | +| Metric | 12 mm | +| Imperial (US) | 0.5 in | + +## Units That Never Change + +Some units are international standards and are displayed the same way regardless of your locale: + +| Measurement | Unit | Why | +| -------------------------------- | ------------------------------ | ------------------------------------- | +| Barometric pressure | hPa | International meteorological standard | +| Heading / bearing | ° (degrees) | Universal navigation convention | +| Radiation | μR/hr | Standard dosimetry unit | +| GPS coordinates | decimal degrees | Universal geographic standard | +| Humidity, battery, soil moisture | % | Universal | + +## Date & Time + +All timestamps throughout the app — last heard, message times, telemetry logs, chart axes — follow your device's date and time preferences. + +| Setting | What It Controls | Example | +| ---------------- | ---------------- | ------------------------------------------------ | +| **24-Hour Time** | Clock format | 14:30 vs 2:30 PM | +| **Date Format** | Date ordering | 09/05/2026 vs 05/09/2026 | + +The app also uses **relative time** where it makes sense — for example, "5 min ago" or "2 hours ago" in the node list — which is automatically localised into your device language. + +## Changing Your Measurement System (Android) + +On Android, your measurement system (metric vs imperial) is tied to your region setting: + +1. Open **Android Settings → System → Language & Region** +2. Change your **Region** or **Measurement units** preference +3. Return to Meshtastic — values update immediately + +> **Tip — The app uses `MetricFormatter` from `core:common`.** All measurement formatting is handled by a shared KMP utility that respects your platform's locale. Developers adding new measurement displays should use `MetricFormatter` rather than hard-coding unit conversions. + diff --git a/docs/es-rES/index.md b/docs/es-rES/index.md new file mode 100644 index 000000000..94aac92d3 --- /dev/null +++ b/docs/es-rES/index.md @@ -0,0 +1,30 @@ +--- +title: Home +layout: default +nav_order: 0 +--- + +# Meshtastic Android App Documentation + +User and developer documentation for the Meshtastic Android, Desktop, and iOS applications powered by KMP (Kotlin Multiplatform). + +Use the sidebar navigation to browse the **User Guide** for app features and the **Developer Guide** for contributing to the project. + +--- + +## Quick Links + +| Guide | Descripción | +| --------------------------------------------------------------------- | -------------------------------------------------------------- | +| [Getting Started](user/onboarding) | Connect your first radio and send a message | +| [Messages & Channels](user/messages-and-channels) | Channel broadcasts, direct messages, reactions, and encryption | +| [Nodes](user/nodes) | Understanding the mesh network node list | +| [Signal Meter](user/signal-meter) | How the LoRa signal quality meter works | +| [Units & Locale](user/units-and-locale) | How temperatures, distances, and times adapt to your region | +| [Desktop App](user/desktop) | Linux, macOS, and Windows desktop usage | +| [Architecture](developer/architecture) | App architecture overview for contributors | +| [Contributing](developer/contributing) | Branch naming, PR workflow, and verification commands | + +--- + +> This documentation is served from the same markdown source that powers the in-app **Help & Documentation** browser. diff --git a/docs/es-rES/user/connections.md b/docs/es-rES/user/connections.md new file mode 100644 index 000000000..74da314e9 --- /dev/null +++ b/docs/es-rES/user/connections.md @@ -0,0 +1,125 @@ +--- +title: Conexiones +nav_order: 2 +last_updated: 2026-05-13 +description: Connect your phone or desktop to a Meshtastic radio via Bluetooth, USB, or TCP/IP. +aliases: + - bluetooth + - usb + - tcp + - pairing +--- + +# Conexiones + +Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node. + +## Bluetooth (BLE) + +Bluetooth Low Energy is the default and most common connection method on Android. + +### Pairing a Device + +1. Ensure your Meshtastic radio is powered on and in pairing mode. +2. Open the app and navigate to **Connections**. +3. Tap **Scan for Devices** — nearby Meshtastic radios will appear. +4. Select your device from the list. +5. Accept the Bluetooth pairing prompt if shown. + +![Device list item](/assets/screenshots/connections_bluetooth_scan.png) + +You can filter devices by transport type using the filter chips at the top: + +![Transport filter chips](/assets/screenshots/connections_transport_filters.png) + +> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. + +### Connection Status + +| Icon | State | Descripción | +| ---- | -------------- | ----------------------------- | +| 🟢 | Conectado | Active radio link established | +| 🟡 | Conectando | Handshake in progress | +| 🔴 | Desconectado | No active connection | +| ⚪ | Not configured | No device selected | + +When connecting, a status indicator shows the current connection state: + +![Connecting status](/assets/screenshots/connections_connecting.png) + +If no devices are found, the app shows an empty state with instructions: + +![No devices found](/assets/screenshots/connections_empty_state.png) + +### Troubleshooting Bluetooth + +- **Device not found:** Toggle Bluetooth off/on, ensure location is enabled. +- **Connection drops:** Move closer to the radio; check for interference. +- **Pairing rejected:** Forget the device in Android Bluetooth settings and retry. + +## USB Serial + +USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable. + +### Setup + +1. Connect your radio via USB cable to your device. +2. The app will prompt for USB permission — tap **Allow**. +3. The connection is established automatically. + +> ⚠️ **Note:** USB connections require OTG support on Android devices. + +## TCP/IP (WiFi) + +Some Meshtastic radios support WiFi connectivity, allowing TCP-based connections. + +### Configuración + +1. Connect your radio to a WiFi network via the radio's web interface or settings. +2. In the app, go to **Connections → TCP**. +3. Enter the radio's IP address and port (default: 4403). +4. Tap **Connect**. + +![WiFi scanning for devices](/assets/screenshots/connections_wifi_scanning.png) + +When a device is found, it appears in the connection list: + +![WiFi device found](/assets/screenshots/connections_wifi_device_found.png) + +A successful connection is confirmed with a status indicator: + +![WiFi connection success](/assets/screenshots/connections_wifi_success.png) + +### When to Use TCP + +- Radio is on the same local network +- Testing with a simulated radio +- Environments where Bluetooth has interference issues + +## Reconnection Behavior + +The app reconnects to the **last selected device** on startup. You can manually switch transports from the connections screen at any time. + +To disconnect from a radio, use the disconnect button on the connections screen: + +![Disconnect from radio](/assets/screenshots/connections_disconnect.png) + +## Desktop Connections + +On Desktop (Linux/macOS/Windows), the app supports: + +- **Bluetooth (BLE)** — via the Kable library; works on macOS, Linux, and Windows +- **USB Serial** — primary wired connection method +- **TCP/IP** — for network-connected radios + +See [Desktop App](desktop) for platform-specific details and keyboard shortcuts. + +## Related Topics + +- [Getting Started](onboarding) — first-launch setup and permissions +- [Settings — Radio & User](settings-radio-user) — Bluetooth and network configuration +- [Desktop App](desktop) — desktop-specific connection details +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — full list of compatible radios on meshtastic.org + +--- + diff --git a/docs/es-rES/user/desktop.md b/docs/es-rES/user/desktop.md new file mode 100644 index 000000000..522c09f34 --- /dev/null +++ b/docs/es-rES/user/desktop.md @@ -0,0 +1,147 @@ +--- +title: Desktop App +nav_order: 14 +last_updated: 2026-05-13 +description: Install and use the Meshtastic Desktop app on Linux, macOS, and Windows — connections, feature parity, and keyboard shortcuts. +aliases: + - desktop + - linux + - macos + - windows + - jvm +--- + +# Desktop App + +The Meshtastic Desktop application provides the same mesh communication features on Linux, macOS, and Windows. + +## Visión general + +The Desktop app shares its core codebase with the Android app through Kotlin Multiplatform (KMP). Most features work identically across platforms. + +## Installation + +### Linux + +- Download the `.deb` or `.AppImage` package from the releases page +- Or build from source using `./gradlew :desktopApp:run` + +### macOS + +- Download the `.dmg` package from releases +- Or build from source + +### Windows + +- Download the `.msi` installer from releases +- Or build from source + +## Connecting Your Radio + +### USB Serial (Primary) + +The most reliable connection method on Desktop: + +1. Connect your Meshtastic radio via USB cable. +2. The app should detect the serial port automatically. +3. If not detected, select the correct serial port from the connections menu. + +### TCP/IP + +For network-connected radios: + +1. Enter the radio's IP address and port (default: 4403). +2. Click **Connect**. + +### Bluetooth (BLE) + +Bluetooth Low Energy is supported on Desktop via the [Kable](https://github.com/JuulLabs/kable) library: + +1. Ensure your system has a Bluetooth adapter. +2. The app scans for nearby Meshtastic radios automatically. +3. Select your device from the connections screen. + +## Feature Parity + +| Feature | Android | Desktop | Notas | +| ---------------------------------------- | ------- | ------- | -------------------------- | +| Messaging | ✓ | ✓ | Full parity | +| Node List | ✓ | ✓ | Full parity | +| Mapa | ✓ | ✓ | Full parity | +| Ajustes | ✓ | ✓ | Full parity | +| Bluetooth (BLE) | ✓ | ✓ | Via Kable on desktop | +| Firmware Update OTA | ✓ | ✗ | Use web flasher | +| Notifications | ✓ | ✓ | Native OS notifications | +| Widgets | ✓ | ✗ | Android-only | +| AI Assistant (Chirpy) | ✓\* | ✗ | Google flavor Android only | + +\*Chirpy AI requires Android 14+ on Google flavor builds with supported hardware. + +## UI Differences + +The Desktop app uses the same Compose Multiplatform UI with adaptations for larger screens and desktop interaction. + +### Keyboard Shortcuts + +| Shortcut | Action | +| ------------------- | --------------------------- | +| **⌘Q** / **Ctrl+Q** | Quit the application | +| **⌘,** / **Ctrl+,** | Open Settings | +| **⌘1** / **Ctrl+1** | Switch to Conversations tab | +| **⌘2** / **Ctrl+2** | Switch to Nodes tab | +| **⌘3** / **Ctrl+3** | Switch to Map tab | +| **⌘4** / **Ctrl+4** | Switch to Connections tab | + +### Window & System Tray + +- **Window resizing** — responsive layout adapts to window dimensions +- **System tray** — minimize to system tray for background mesh operation +- **Tray menu** — right-click the tray icon to show window or quit +- **Mouse interaction** — hover states and standard desktop navigation + +### Notification Preferences + +The Desktop app provides in-app toggles for controlling which notifications are shown — messages, new nodes, and low battery alerts. Access these from **Settings → Notifications** within the app. + +## Built-in Documentation Browser + +The Desktop app includes a built-in documentation browser for quick access to help content without leaving the application. + +![Docs browser with table of contents](/assets/screenshots/docs-browser_toc.png) + +The browser supports full-text search across all documentation: + +![Searching the docs browser](/assets/screenshots/docs-browser_search.png) + +Individual doc pages render with full formatting: + +![A documentation page](/assets/screenshots/docs-browser_page.png) + +## Building from Source + +```bash +git clone https://github.com/meshtastic/Meshtastic-Android.git +cd Meshtastic-Android +git submodule update --init +./gradlew :desktopApp:run +``` + +Requirements: + +- JDK 21 +- No Android SDK required for desktop-only builds + +## Known Limitations + +- No OTA firmware updates (use web flasher) +- Some Android-specific features (widgets, specific notification channels) are unavailable +- Performance may vary on low-spec hardware running Compose Desktop +- BLE bonding is not yet supported on desktop (pairing works without bonding) + +## Related Topics + +- [Connections](connections) — connection methods overview +- [Firmware Updates](firmware) — use the [Web Flasher](https://flasher.meshtastic.org) for desktop firmware updates + +--- + diff --git a/docs/es-rES/user/discovery.md b/docs/es-rES/user/discovery.md new file mode 100644 index 000000000..469a2c684 --- /dev/null +++ b/docs/es-rES/user/discovery.md @@ -0,0 +1,114 @@ +--- +title: Discovery +nav_order: 12 +last_updated: 2026-05-13 +description: Explore your mesh network — traceroute paths, neighbor maps, and node discovery tools. +aliases: + - mesh-discovery + - local-discovery + - network-scan + - traceroute + - neighbor-info +--- + +# Discovery + +Discovery tools help you understand **how** your mesh network is connected — which nodes can hear each other, what paths messages take, and where bottlenecks or weak links exist. + +> 💡 **Tip:** You don't need a dedicated "discovery mode" to start exploring your mesh. The tools below are available right now from the node list and node detail screens. + +--- + +## Traceroute + +Traceroute reveals the exact path a message takes from your node to any other node on the mesh. It's the single most useful tool for debugging connectivity problems. + +### Running a Traceroute + +1. Navigate to **Nodes** and tap the node you want to trace. +2. On the node detail screen, tap **Traceroute**. +3. The app sends a traceroute request and waits for the response. +4. Results display each hop in order, with signal quality at every step. + +### Reading the Results + +A traceroute result looks like this: + +``` +You → Node A (SNR: 8.5, RSSI: -95) → Node B (SNR: 5.2, RSSI: -108) → Target +``` + +Each hop represents a relay node that forwarded the message. The SNR and RSSI values at each hop tell you about the link quality on that specific segment. + +| What to look for | What it means | +| -------------------------------------------------------------------------- | --------------------------------------------------------------------------- | +| All hops show Good SNR (> 5 dB) | Healthy path — messages flow reliably | +| One hop shows Bad SNR (< 0 dB) | Weak link — this relay segment is fragile | +| Many hops (4+) | Long path — consider repositioning a node to shorten it | +| Different path on retry | Mesh is adapting — multiple routes exist (this is good!) | + +> 💡 **Tip:** Run traceroute several times over a few minutes. If the path changes, your mesh has redundant routes — a sign of a well-connected network. + +### Troubleshooting with Traceroute + +- **"No route found"** — The target node may be offline, out of range, or on a different channel. Check that both nodes share at least one channel with the same encryption key. +- **Traceroute times out** — The path may be too long (exceeds hop limit) or a relay node is congested. Try increasing the hop limit in **Settings → LoRa Config**. +- **Asymmetric paths** — A traceroute from A→B may take a different path than B→A. This is normal — radio propagation is not always symmetric. + +--- + +## Información de Vecinos + +The Neighbor Info module lets each node broadcast a list of the nodes it can **directly hear** (single-hop). When multiple nodes share their neighbor lists, you can piece together a topology map of the entire mesh. + +### Enabling Neighbor Info + +1. Navigate to **Settings → Module Config → Neighbor Info**. +2. Enable the module. +3. Set the broadcast interval (default: 900 seconds / 15 minutes). + +Once enabled, your node periodically broadcasts its neighbor table. Other nodes with Neighbor Info enabled do the same. + +### Viewing Neighbor Data + +- Open any node's detail screen and look for the **Neighbors** section. +- Each neighbor entry shows the node that was directly heard and its signal quality. +- Combine neighbor data from multiple nodes to understand the full mesh topology. + +> ⚠️ **Note:** Neighbor Info increases airtime usage because every enabled node periodically broadcasts its neighbor list. On busy meshes with many nodes, consider longer broadcast intervals (3600 seconds or more) to avoid congestion. + +--- + +## Node List as a Discovery Tool + +The node list itself is a powerful discovery tool when you use its filtering and sorting features effectively. + +### Finding New Nodes + +- Sort by **Last heard** to see the most recently active nodes at the top. +- Enable **Include unknown** to see nodes that have appeared on the mesh but haven't sent user info yet — these are often newly powered-on devices. + +### Assessing Connectivity + +- Sort by **Hops away** to see which nodes are directly reachable (0 hops) versus relayed. +- Sort by **Distance** to find nearby nodes and verify they're reachable. +- Use **Exclude MQTT** to focus on nodes reachable over radio (not via internet bridge). + +### Infrastructure Audit + +- Disable **Exclude infrastructure** to see Router, Repeater, Router Late, and Client Base nodes. +- Check their signal quality and last-heard times to verify your infrastructure nodes are healthy. + +See [Nodes](nodes) for full details on filtering and sorting options. + +--- + +## Tips for Mesh Exploration + +- **Start with traceroute** — it gives you immediate, actionable information about a specific path. +- **Enable Neighbor Info on key nodes** — especially routers and repeaters, to build a picture of the backbone. +- **Check the map** — node positions on the [Map](map-and-waypoints) combined with signal data help you understand why some links are strong and others are weak. +- **Compare signal over time** — use the [Signal Meter](signal-meter) guide to interpret SNR and RSSI values correctly. + +--- + diff --git a/docs/es-rES/user/firmware.md b/docs/es-rES/user/firmware.md new file mode 100644 index 000000000..cedda2abc --- /dev/null +++ b/docs/es-rES/user/firmware.md @@ -0,0 +1,114 @@ +--- +title: Firmware Updates +nav_order: 13 +last_updated: 2026-05-13 +description: Update your radio firmware over Bluetooth — OTA process, version channels, pre-flight checks, and recovery. +aliases: + - firmware + - update + - ota + - flash +--- + +# Firmware Updates + +Keep your Meshtastic radio up to date with the latest firmware for new features, bug fixes, and security improvements. + +## Checking for Updates + +1. Navigate to **Settings → Firmware Update** or tap the firmware notification if shown. +2. The app checks for available firmware versions. +3. Available updates show the version number and changelog summary. + +## Update Methods + +### OTA (Over-The-Air) via Bluetooth + +The most common update method for Android users: + +1. Ensure your radio is connected via Bluetooth. +2. Navigate to the Firmware Update screen. +3. Select the desired firmware version. +4. Tap **Update** to begin the OTA process. +5. Wait for the update to complete — **do not disconnect** during the update. + +![Firmware checking for updates](/assets/screenshots/firmware_checking.png) + +> ⚠️ **Warning:** Interrupting a firmware update can brick your device. Ensure your radio has sufficient battery (>50% recommended) and maintain Bluetooth proximity during the entire process. + +![Firmware disclaimer](/assets/screenshots/firmware_disclaimer.png) + +### USB Flashing + +For recovery or when OTA is unavailable: + +- Use the [Meshtastic Web Flasher](https://flasher.meshtastic.org) +- Or the [Meshtastic CLI tool](https://meshtastic.org/docs/getting-started/flashing-firmware) on desktop + +## Version Channels + +| Canal | Descripción | +| ------- | ------------------------------------------- | +| Estable | Recommended for most users; tested releases | +| Alpha | Preview releases; may contain bugs | + +## Pre-Update Checklist + +Before updating: + +- [ ] Battery > 50% +- [ ] Stable Bluetooth connection +- [ ] Note your current settings (they may reset on major version changes) +- [ ] Check the release notes for breaking changes + +## Post-Update + +After a successful update: + +- The radio will reboot automatically +- Bluetooth connection will re-establish +- Verify your settings are intact +- Check the firmware version in **Settings → About** + +![Firmware update success](/assets/screenshots/firmware_success.png) + +## Troubleshooting + +### Update Stuck + +If the update appears frozen: + +- Wait at least 5 minutes before intervening +- If truly stuck, power-cycle the radio +- Attempt the update again + +![Firmware update error](/assets/screenshots/firmware_error.png) + +### Device Won't Boot After Update + +If your device fails to boot: + +1. Try connecting via USB to a computer +2. Use the web flasher in recovery/DFU mode +3. Flash a known-good firmware version +4. Check the Meshtastic Discord for device-specific recovery steps + +### Compatibility Warnings + +The app may show warnings when: + +- Connected radio firmware is below minimum supported version +- Major version mismatch between app and firmware +- Deprecated features need migration + +> ⚠️ **Important:** Always update the Meshtastic app before or alongside firmware updates to ensure compatibility. + +## Related Topics + +- [Connections](connections) — reconnecting after a firmware update +- [Flashing firmware guide](https://meshtastic.org/docs/getting-started/flashing-firmware) — full firmware flashing walkthrough on meshtastic.org +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — check firmware compatibility by device +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/es-rES/user/map-and-waypoints.md b/docs/es-rES/user/map-and-waypoints.md new file mode 100644 index 000000000..7c0f0802e --- /dev/null +++ b/docs/es-rES/user/map-and-waypoints.md @@ -0,0 +1,116 @@ +--- +title: Map & Waypoints +nav_order: 6 +last_updated: 2026-05-13 +description: View node positions on the map, create and share waypoints, and manage position sharing and privacy. +aliases: + - map + - waypoints + - gps + - location +--- + +# Map & Waypoints + +The Map screen shows the geographic positions of nodes on your mesh, along with shared waypoints. + +## Map View + +The map displays: + +- **Node positions** — colored markers for each node reporting location +- **Waypoints** — shared points of interest +- **Your position** — your current GPS location + +### Node Markers + +Node markers on the map indicate: + +| Color | Meaning | +| ------ | ---------------------------------------------- | +| Verde | Online (heard recently) | +| Yellow | Away (heard within 2 hours) | +| Gray | Offline (stale position) | +| Azul | Your own node | + +### Map Controls + +- **Zoom** — pinch or use +/- buttons +- **Pan** — drag to explore +- **Center** — select the location button to center on your position +- **Node tap** — tap a node marker to view details + +The floating toolbar provides quick access to compass, layer switching, node filters, refresh, and location tracking. Tap the compass to reorient north-up, or tap the location button to center on your current position. + +![Map controls overlay](/assets/screenshots/map_controls_overlay.png) + +## Waypoints + +Waypoints are shared geographic points of interest that all mesh members can see. + +### Creating a Waypoint + +1. Long-press on the map at the desired location. +2. Enter a name and optional description. +3. Choose an icon/emoji for the waypoint. +4. Tap **Send** to share with the mesh. + +### Waypoint Properties + +| Property | Descripción | +| ----------- | ------------------------------------------------------- | +| Nombre | Short identifier (max 30 characters) | +| Descripción | Optional longer description | +| Icon | Visual marker emoji on the map | +| Bloqueado | If locked, only the creator can edit or delete | +| Expiration | Optional auto-remove time | + +### Waypoint Expiration + +Waypoints can be set to expire automatically: + +- **Never** (default) — waypoint remains until manually deleted +- **Timed** — waypoint is automatically removed after the specified duration (e.g., "remove after 2 hours"). Useful for temporary markers like rally points, hazards, or meeting locations. + +Expired waypoints are automatically hidden from the map so they don't clutter the display. The expiration countdown begins when the waypoint is created, not when other nodes receive it. + +### Managing Waypoints + +- Tap a waypoint on the map to view its details and coordinates +- Edit or delete waypoints you created +- **Locked waypoints** cannot be modified or deleted by other nodes — only the original creator can change them +- Unlocked waypoints can be edited by any mesh member + +## Position Sharing + +### Enabling Position Sharing + +Your node shares its GPS position based on: + +- **Fixed interval** — broadcast position at regular intervals +- **Smart position** — broadcast when movement exceeds a threshold +- **Manual** — only share when explicitly requested + +Configure position behavior in **Settings → Position**. + +### Privacy Considerations + +> 🔒 **Privacy:** Position data is broadcast to all nodes on your channel. If you don't want your location shared, disable GPS position in settings or use a fixed/fake position. + +## Map Sources + +The app supports multiple map tile sources: + +- OpenStreetMap (default) +- Satellite imagery (where available) +- Offline tiles (download map areas for offline use) + +## Related Topics + +- [Nodes](nodes) — view and filter your node list +- [Node Metrics](node-metrics) — signal quality and position history for individual nodes +- [Discovery](discovery) — traceroute and neighbor info for understanding mesh topology +- [Units & Locale](units-and-locale) — distance and coordinate display formats + +--- + diff --git a/docs/es-rES/user/messages-and-channels.md b/docs/es-rES/user/messages-and-channels.md new file mode 100644 index 000000000..6a9b86074 --- /dev/null +++ b/docs/es-rES/user/messages-and-channels.md @@ -0,0 +1,159 @@ +--- +title: Messages & Channels +nav_order: 3 +last_updated: 2026-05-13 +description: Send and receive messages, manage channels, configure encryption, and use quick chat, reactions, and message actions. +aliases: + - channels + - direct-messages + - messaging + - conversations +--- + +# Messages & Channels + +Meshtastic supports two communication modes: **channel broadcasts** and **direct messages**. + +## Canales + +Channels are shared communication groups. All nodes configured with the same channel key can read and send messages on that channel. + +### Default Channel + +Every Meshtastic device comes with a default **LongFast** channel. This is an unencrypted channel used for general mesh communication. + +### Seguridad del canal + +Channels support multiple encryption levels: + +| Icon | Security Level | Descripción | +| ---- | ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------- | +| 🔒 | PSK (256-bit AES) | Fully encrypted with a strong pre-shared key. Only nodes with the matching key can read messages. | +| 🔐 | PSK (128-bit AES) | Encrypted with a shorter key. Secure for most uses but 256-bit is preferred for sensitive data. | +| 🔓 | Default / Open | Uses the well-known default key. **Any Meshtastic device** on the same preset can read these messages. | +| ⚠️ | Insecure + Position | Open channel that also broadcasts your GPS position. Use with caution in public meshes. | + +> 🔒 **Security Tip:** 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. + +### Adding a Channel + +1. Navigate to **Settings → Channels**. +2. Tap **Add Channel** or scan a QR code. +3. Configure the channel name and encryption key. +4. Share the channel URL/QR code with others who need access. + +Tapping a channel shows its details and sharing options. + +## Direct Messages + +Direct messages (DMs) are point-to-point encrypted communications between two specific nodes. + +### Sending a Direct Message + +1. Open the **Messages** tab. +2. Select a node from your contacts list or tap a node in the node list. +3. Type your message and tap **Send**. + +### Message States + +| State | Icon | Meaning | +| --------------------------------- | ---- | ----------------------------------------------------------------------------------------------------------------- | +| Queued | ⏳ | Message waiting to be sent | +| En route | ✓ | Delivered to the radio, awaiting acknowledgment | +| Delivered | ✓✓ | Acknowledgment received from recipient | +| Received | ✓ | Message received from the mesh (incoming) | +| S&F Routing | 🔗 | Store & Forward: message being routed through an S&F node | +| S&F Confirmed | 🔗 | Store & Forward: delivery confirmed via S&F node | +| Error | ✗ | Delivery failed after retries | + +### Delivery Errors + +When a message fails to deliver, the error indicator shows what went wrong: + +| Error | Meaning | What to Do | +| ----------------- | ---------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| No Route | No path exists to the destination node | The recipient may be offline or out of mesh range. Try later or move closer. | +| Got NAK | The next-hop node refused to relay | The relay node may be congested. Wait and retry. | +| Tiempo agotado | No acknowledgment within retry window | The recipient may be just out of range. Try increasing hop limit or moving to a better position. | +| Sin interfaz | No radio interface available to send | Check that your radio is connected and the channel is configured. | +| Max Retransmit | All retry attempts exhausted | The mesh path is unreliable. Try a different channel or wait for conditions to improve. | +| No hay canal | The destination channel doesn't exist | Verify both nodes share the same channel configuration. | +| Too Large | Message exceeds maximum payload size | Shorten your message (max ~230 characters). | +| No Response | Node received message but didn't respond | The recipient's radio may be busy or in low-power sleep mode. | +| Duty Cycle Limit | Regional airtime limit reached | Your radio has used its allowed transmit time. Wait for the duty cycle window to reset (typically 1 hour in EU regions). | +| Solicitud errónea | Malformed or invalid message | This usually indicates a software bug. Try restarting the app. | + +> 💡 **Tip:** 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. + +## Message Features + +### Quick Chat + +Pre-configured messages for rapid communication: + +- Access via the Quick Chat button in the message input area +- Choose from built-in phrases or custom messages +- Customize quick chat messages in **Settings → Quick Chat** +- Useful when typing is impractical (gloves, small screen, urgent) + +![Quick chat option](/assets/screenshots/messages_quick_chat.png) + +The channel list shows each channel with its latest message preview. + +### Message Bubbles + +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. + +### Reactions + +React to messages with emoji: + +- **Long-press** a message to open the actions menu +- Tap **Add Reaction** to choose an emoji +- Reactions appear below the message bubble +- Multiple users can react to the same message +- React to your own messages or others' messages + +![Emoji reaction badges displayed beneath a message](/assets/screenshots/messages_reaction.png) + +> 💡 **Tip:** Reactions are lightweight — they use minimal mesh bandwidth compared to full text messages. + +### Message Actions + +Long-press any message to access: + +- **Copy** — copy message text to clipboard +- **Reply** — quote the message in your response +- **React** — add an emoji reaction +- **Delete** — remove a message you sent (local deletion) + +### Message Priority + +Messages are queued and transmitted based on priority: + +1. Emergency/alert messages (highest) +2. Direct messages +3. Channel broadcasts (lowest) + +### Message Limits + +- **Maximum length:** 237 bytes (approximately 230 characters for ASCII text) +- **Rate limiting:** The mesh enforces airtime fairness; heavy message volume may be throttled +- **Delivery:** Messages are retried automatically if no acknowledgment is received + +## Best Practices + +- Use channels for group coordination +- Use direct messages for private person-to-person communication +- Keep messages short — mesh bandwidth is limited +- Configure encryption for sensitive communications + +## Related Topics + +- [Nodes](nodes) — tap a node to start a direct message +- [Settings — Radio & User](settings-radio-user) — configure channel encryption and presets +- [MQTT](mqtt) — bridge channel messages to the internet +- [Channel configuration](https://meshtastic.org/docs/configuration/radio/channels) — detailed channel settings on meshtastic.org + +--- + diff --git a/docs/es-rES/user/mqtt.md b/docs/es-rES/user/mqtt.md new file mode 100644 index 000000000..3bc91e795 --- /dev/null +++ b/docs/es-rES/user/mqtt.md @@ -0,0 +1,137 @@ +--- +title: MQTT +nav_order: 11 +last_updated: 2026-05-13 +description: Bridge your mesh to the internet — MQTT broker setup, encryption layers, and map reporting. +aliases: + - mqtt + - internet-bridge + - broker +--- + +# MQTT + +MQTT bridges your Meshtastic mesh network to the internet, enabling long-range communication beyond radio range. + +## Visión general + +The MQTT module connects your node to an MQTT broker, allowing: + +- Messages to reach nodes on different physical meshes via the internet +- Integration with home automation and monitoring systems +- Publishing node positions to the public Meshtastic map +- Custom data pipelines for logging and alerting + +## How It Works + +``` +[Your Node] → Radio → [Gateway Node with WiFi] → MQTT Broker → [Remote Gateway] → Radio → [Remote Node] +``` + +A gateway node with internet access (WiFi or Ethernet) publishes mesh messages to an MQTT topic. Remote gateways subscribed to the same topic inject those messages into their local mesh. + +## Configuración + +### Enabling MQTT + +1. Navigate to **Settings → Module Config → MQTT**. +2. Enable the MQTT module. +3. Configure the broker connection: + +![MQTT toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | Descripción | Por defecto | +| --------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------- | +| Server Address | MQTT broker hostname | mqtt.meshtastic.org | +| Usuario | Broker authentication | meshdev | +| Contraseña | Broker authentication | large4cats | +| Root Topic | Base topic for messages | msh | +| Cifrado | Encrypt MQTT payload | Habilitado | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON packet support has been removed from firmware; this field is ignored | Disabled | +| TLS | Secure connection to broker | Disabled | +| Map Reporting | Report position to public map | Disabled | + +### Default Meshtastic Broker + +The community maintains a public broker at `mqtt.meshtastic.org`. This is intended for general use and testing. + +> 🔒 **Privacy:** Messages on the public broker are readable by anyone subscribed. Always use channel encryption for private communications. + +### Private Broker + +For better privacy and control, you can run your own MQTT broker: + +- Mosquitto (lightweight, open-source) +- HiveMQ +- EMQX + +Configure your node to point to your private broker with appropriate credentials. + +## Map Reporting + +When Map Reporting is enabled, your node publishes its position to the Meshtastic community map: + +- Visible at [meshmap.net](https://meshmap.net) and similar community map services +- Only position and node info are shared +- Disable this if you don't want your location publicly visible + +## Uplink vs Downlink + +| Direction | Descripción | +| ------------ | -------------------------------- | +| **Uplink** | Messages from mesh → MQTT broker | +| **Downlink** | Messages from MQTT broker → mesh | + +Configure per-channel which directions are active to control message flow and airtime usage. + +## Message Formats + +MQTT uses protobuf message format: + +| Format | Descripción | Use case | +| ------------ | ----------------------------------- | -------------------------- | +| **Protobuf** | Binary Meshtastic protobuf encoding | Node-to-node mesh bridging | + +> ⚠️ **Note:** JSON output support was removed from firmware. The `json_enabled` setting is still visible in the app for legacy compatibility but has no effect on current firmware versions. + +## Encryption & Privacy + +Understanding the layered encryption model: + +1. **Channel encryption** happens on the mesh _before_ MQTT. If your channel has a PSK, the MQTT payload is already encrypted — the broker and any subscribers see only the ciphertext. +2. **MQTT encryption** (the module setting) adds an additional encryption layer for transit to the broker. This protects metadata and routing information. +3. **TLS** encrypts the TCP connection to the broker itself, preventing network-level eavesdropping. + +> 🔒 **Important:** The default public channel has a well-known key. Messages on the default channel sent via MQTT are effectively **unencrypted** — anyone can decode them. Always use a custom PSK for private communications. + +## Best Practices + +- Use channel-level encryption (PSK) on channels that bridge to MQTT +- Don't enable MQTT on nodes without internet access (it will buffer and waste memory) +- Use a private broker for sensitive deployments +- Be mindful of airtime when downlinking messages from busy MQTT topics — every downlinked message consumes radio airtime on your local mesh +- Consider enabling uplink-only if you only need to monitor your mesh remotely without injecting messages back + +## Troubleshooting + +### MQTT Not Connecting + +- **Check WiFi** — the gateway node must have an active internet connection (WiFi or Ethernet). MQTT does not work over the LoRa radio link itself. +- **Verify credentials** — incorrect username or password will silently fail on most brokers. Double-check for trailing spaces. +- **Firewall** — port 1883 (MQTT) or 8883 (MQTT+TLS) must be open. Some networks block non-standard ports. +- **DNS resolution** — if using a custom broker hostname, verify the node can resolve it. Try the broker's IP address directly. + +### Messages Not Bridging + +- **Check uplink/downlink settings** — if only uplink is enabled, messages flow from mesh to MQTT but not back. Enable downlink on the receiving gateway. +- **Channel mismatch** — both gateways must share the same channel with the same PSK. A mismatch means messages are encrypted with different keys and appear as garbage. +- **Topic mismatch** — ensure both gateways use the same root topic. The default `msh` works for the public broker. + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — MQTT module configuration reference +- [Messages & Channels](messages-and-channels) — channel encryption and PSK setup +- [MQTT integration guide](https://meshtastic.org/docs/software/integrations/mqtt) — detailed MQTT documentation on meshtastic.org + +--- + diff --git a/docs/es-rES/user/node-metrics.md b/docs/es-rES/user/node-metrics.md new file mode 100644 index 000000000..c9c2bff82 --- /dev/null +++ b/docs/es-rES/user/node-metrics.md @@ -0,0 +1,130 @@ +--- +title: Node Metrics +nav_order: 5 +last_updated: 2026-05-13 +description: Telemetry dashboards for each mesh node — device health, environment sensors, signal quality, power, traceroute, and position history. +aliases: + - metrics + - telemetry + - device-metrics + - signal +--- + +# Node Metrics + +The node detail screen provides comprehensive telemetry and metrics for each node on your mesh. + +## Métricas de Dispositivo + +Basic operating information reported by each node: + +| Métrico | Descripción | +| --------------------- | ----------------------------------- | +| Battery Level | Current battery percentage | +| Tensión | Battery voltage reading | +| Utilización del canal | Percentage of airtime consumed | +| Airtime | Transmission time used by this node | +| Tiempo encendido | Time since last reboot | + +Device metrics are displayed as individual cards with trend sparklines showing battery level, voltage, channel utilization, airtime, and uptime over time. + +> 💡 **Tip:** Tap any metric card to expand it into a full chart with historical data points. Pinch to zoom the time axis. + +## Métricas de Entorno + +Environmental sensor data (requires compatible hardware): + +| Métrico | Sensor Examples | +| ------------------------------------ | --------------------- | +| Temperatura: | BME280, BME680, SHT31 | +| Humedad | BME280, BME680, SHT31 | +| Presión Barométrica | BME280, BMP280 | +| Resistencia del Gas | BME680 | +| IAQ (Air Quality) | BME680 | + +Environment metrics are charted over time for easy trend analysis — temperature, humidity, and pressure each get their own line chart with the measurement unit displayed on the Y axis. + +> 💡 **Tip:** Environment metrics require a sensor connected to the remote node. Not all nodes report environmental data. See [Telemetry & Sensors](telemetry-and-sensors) for a full list of supported sensors. + +## Signal Metrics + +Radio signal quality information: + +| Métrico | Descripción | +| --------- | ----------------------------------------------------------------------------- | +| SNR | Signal-to-Noise Ratio (higher is better) | +| RSSI | Received Signal Strength Indicator (closer to 0 is better) | +| Hop Count | Number of mesh hops for last message | + +### Signal Quality Reference + +| SNR Range | Quality | +| --------------------------------- | --------- | +| > 10 dB | Excellent | +| 0 to 10 dB | Bien | +| -10 to 0 dB | Aceptable | +| < -10 dB | Poor | + +## Métricas de Energía + +Power management telemetry (requires INA sensor or compatible hardware): + +| Métrico | Descripción | +| ----------- | ----------------------- | +| Bus Voltage | Supply voltage | +| Intensidad | Power draw in milliamps | +| Consumo | Calculated wattage | + +## Traceroute + +Traceroute shows the path a message takes through the mesh: + +1. From the node detail screen, tap **Traceroute**. +2. The app sends a traceroute request to the target node. +3. Results show each hop with SNR/RSSI values. + +### Reading Traceroute Results + +``` +You → Node A (SNR: 8.5) → Node B (SNR: 5.2) → Target +``` + +Each hop represents a relay node that forwarded the message. + +## Registro de Posiciones + +Historical position data for nodes that share their location: + +- GPS coordinates +- Altitud +- Speed (if moving) +- Timestamp for each position report + +## Información de Vecinos + +Shows which nodes a given node can directly hear, useful for understanding mesh topology. + +## Viewing Metrics + +1. Navigate to **Nodes**. +2. Tap the node you want to inspect. +3. Select the metric category from the detail tabs. + +![Node detail — local device](/assets/screenshots/nodes_detail_local.png) + +The position tab shows location data for nodes that share GPS: + +![Position inline content](/assets/screenshots/nodes_position.png) + +> ⚠️ **Note:** Metrics are only available when they have been reported by the remote node. Metrics update at intervals configured on each node's telemetry settings. + +## Related Topics + +- [Nodes](nodes) — node list, filtering, and sorting +- [Telemetry & Sensors](telemetry-and-sensors) — supported sensors and configuration +- [Signal Meter](signal-meter) — how signal quality is calculated from SNR and RSSI +- [Discovery](discovery) — traceroute details and neighbor info +- [Units & Locale](units-and-locale) — temperature, distance, and speed display formats + +--- + diff --git a/docs/es-rES/user/nodes.md b/docs/es-rES/user/nodes.md new file mode 100644 index 000000000..a2b7209d3 --- /dev/null +++ b/docs/es-rES/user/nodes.md @@ -0,0 +1,152 @@ +--- +title: Nodos +nav_order: 4 +last_updated: 2026-05-13 +description: Browse, filter, and sort mesh nodes — view details, signal quality, roles, and quick actions. +aliases: + - node-list + - mesh-nodes + - peers +--- + +# Nodos + +The Nodes screen displays all devices visible on your mesh network. + +## Node List + +The node list shows every node your radio has heard, including: + +- **Node name** — user-configured long name +- **Short name** — 4-character identifier +- **Signal quality** — last heard signal strength +- **Last heard** — time since last communication +- **Distance** — estimated distance (if positions are shared) +- **Battery** — remote node battery level (if telemetry is enabled) + +### Node Status Indicators + +| Badge | Meaning | +| ---------- | ------------------------------------- | +| 🟢 Online | Node heard within the last 15 minutes | +| 🟡 Away | Node heard within the last 2 hours | +| 🔴 Offline | Node not heard for over 2 hours | +| ⭐ Favorite | Node marked as favorite by the user | + +### Node Roles + +Nodes can be configured with different roles that affect their mesh behavior: + +| Rol | Descripción | +| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Cliente | Standard end-user device | +| Base cliente | Treats favorited-node traffic as Router Late priority; all other traffic as Client | +| Cliente silenciado | Receives but doesn't retransmit | +| Cliente oculto | Like Client Mute, plus hides from node list | +| Router | Prioritizes message forwarding; stays awake to relay | +| Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | +| ~~Router Client~~ | ⚠️ **Deprecated** (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | +| ~~Repeater~~ | ⚠️ **Deprecated** (removed in firmware 2.7.11) — no longer selectable; use Router instead | +| Rastreador | Optimized for position reporting at regular intervals | +| Sensor | Optimized for telemetry reporting | +| TAK | Interoperates with TAK systems (sends/receives CoT) | +| Rastreador TAK | TAK position reporting only | +| Lost & Found | Continuous position beacon for recovery | + +### Choosing a Role + +Most users should keep the default **Client** role. Consider a different role when: + +- **Router** — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don't use Router on battery-powered handheld devices. +- **Router Late** — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. +- **Client Base** — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. +- **Client Mute** — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only devices or to reduce congestion in dense areas. +- **Tracker** — An unattended device whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. +- **Sensor** — An unattended device reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. +- **TAK / TAK Tracker** — Only needed if interoperating with ATAK/WinTAK systems. See [TAK Integration](tak) for details. + +> 💡 **Tip:** The mesh works best when most nodes are **Client** or **Router**. Too many Mute nodes reduces mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. + +### Encryption Indicators + +Nodes display encryption status icons next to their name: + +| Icon | Meaning | +| ----------- | ------------------------------------------------------------------------------------------------------------------- | +| 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | +| 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | +| ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) | + +> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. + +## Quick Actions + +From the node list, you can: + +- **Tap** a node to view its detail page +- **Long-press** for quick actions: + - Send a direct message + - Ver en el mapa + - Solicitar posición + - Mark as favorite + - Traceroute + +## Filtering & Sorting + +### Text Search + +Type in the search field to filter nodes by name or short name. The filter updates in real time as you type. + +### Filter Toggles + +| Filtro | Descripción | +| -------------------------- | ---------------------------------------------------------------------------------------------- | +| **Only online** | Show only nodes heard within the last 15 minutes | +| **Only direct** | Show only nodes with direct (non-relayed) connections | +| **Include unknown** | Show nodes that haven't sent user info yet | +| **Exclude infrastructure** | Hide infrastructure-role nodes (Router, Repeater, Router Late, Client Base) | +| **Exclude MQTT** | Hide nodes heard only via MQTT internet bridge | +| **Show ignored** | Show nodes you've previously dismissed or muted | + +### Sort Options + +| Sort | Descripción | +| ------------------------------------------- | ------------------------------------------------------------------ | +| **Last heard** (default) | Most recently heard nodes first | +| **Alphabetical** | Sorted by node long name | +| **Distance** | Nearest nodes first (requires position sharing) | +| **Hops away** | Fewest relay hops first | +| **Channel** | Grouped by channel index | +| **Via MQTT** | Grouped by MQTT vs. radio-heard | +| **Favorites** | Favorited nodes first | + +## Node Detail + +Tapping a node opens the detail view with comprehensive information. See [Node Metrics](node-metrics) for full details on metrics and telemetry. + +![Node detail view](/assets/screenshots/nodes_node_list.png) + +The detail screen includes device info, position, and action buttons: + +![Node detail section](/assets/screenshots/nodes_detail_section.png) + +Inline status indicators show key metrics at a glance: + +| Indicator | Screenshot | +| -------------- | -------------------------------------------------------- | +| Signal quality | ![Signal](/assets/screenshots/nodes_signal_info.png) | +| Battery level | ![Battery](/assets/screenshots/nodes_battery_info.png) | +| Hop count | ![Hops](/assets/screenshots/nodes_hops_info.png) | +| Última escucha | ![Last heard](/assets/screenshots/nodes_last_heard.png) | +| Distancia | ![Distance](/assets/screenshots/nodes_distance_info.png) | + +## Related Topics + +- [Node Metrics](node-metrics) — detailed telemetry dashboards for each node +- [Messages & Channels](messages-and-channels) — send a direct message to a node +- [Map & Waypoints](map-and-waypoints) — view node positions geographically +- [Discovery](discovery) — traceroute and neighbor info for topology exploration +- [Signal Meter](signal-meter) — understand what the signal bars mean + +--- + diff --git a/docs/es-rES/user/onboarding.md b/docs/es-rES/user/onboarding.md new file mode 100644 index 000000000..040821b5d --- /dev/null +++ b/docs/es-rES/user/onboarding.md @@ -0,0 +1,99 @@ +--- +title: Primeros Pasos +nav_order: 1 +last_updated: 2026-05-13 +description: First-launch setup — permissions, onboarding flow, and next steps after connecting your radio. +aliases: + - first-launch + - setup + - intro +--- + +# Primeros Pasos + +Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app. + +## First Launch + +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. + +### Welcome Screen + +The welcome screen introduces Meshtastic and its core capabilities: + +- Off-grid mesh communication +- No cellular or internet required +- End-to-end encrypted messaging + +Tap **Get Started** to proceed through the setup flow. + +![Welcome screen](/assets/screenshots/onboarding_welcome.png) + +## Permissions + +The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. + +### Bluetooth Permission + +Bluetooth is the primary connection method between your phone and Meshtastic radio: + +- **Bluetooth scanning** — discover nearby Meshtastic radios +- **Bluetooth connect** — establish and maintain connections with paired radios + +Grant both permissions when prompted. Without Bluetooth, you'll need to use USB or TCP connections instead. + +### Location Permission + +> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. + +Meshtastic also uses your location for: + +- Showing your position on the mesh map +- Calculating distances to other nodes +- Sharing your GPS coordinates with other mesh members (if enabled) + +Grant **"While using the app"** or **"Always"** depending on your preference: + +- **While using the app** — position updates only when the app is open +- **Always** — enables background position updates for always-on mesh presence + +If denied, Bluetooth scanning will not function and your node will not report a position. + +### Notifications Permission + +Notifications alert you to: + +- Incoming messages from channels and direct messages +- Connection status changes (connected, disconnected, reconnecting) +- Firmware update availability + +> 💡 **Tip:** You can fine-tune notification preferences later in Android system settings. The app creates separate notification channels for messages, connection events, and background service status. + +### Critical Alerts Permission + +On supported devices, the app may request permission for critical alerts: + +- These are high-priority notifications that can break through Do Not Disturb mode +- Useful for emergency mesh alerts or urgent messages +- You can **skip** this step if you don't need breakthrough notifications +- Configure or revoke later in Android notification settings + +## After Setup + +Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. + +> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. + +## What's Next? + +Once connected to a radio, explore: + +- [Connections](connections) — pair your first radio device +- [Messages & Channels](messages-and-channels) — send your first message +- [Nodes](nodes) — see who's on your mesh +- [Map & Waypoints](map-and-waypoints) — view node positions +- [Settings](settings-radio-user) — configure your radio and user profile + +New to Meshtastic? The [getting started guide](https://meshtastic.org/docs/getting-started) on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup. + +--- diff --git a/docs/es-rES/user/settings-module-admin.md b/docs/es-rES/user/settings-module-admin.md new file mode 100644 index 000000000..23f4c3a3f --- /dev/null +++ b/docs/es-rES/user/settings-module-admin.md @@ -0,0 +1,246 @@ +--- +title: Settings — Modules & Admin +nav_order: 8 +last_updated: 2026-05-13 +description: Configure optional feature modules (MQTT, telemetry, canned messages, TAK, and more) and perform device administration. +aliases: + - modules + - module-config + - administration +--- + +# Settings — Modules & Admin + +Configure optional feature modules and perform device administration. Modules extend Meshtastic with specialized capabilities — each can be independently enabled or disabled. + +> 💡 **Tip:** You only need to enable the modules you actually use. Disabling unused modules reduces airtime, saves battery, and simplifies your configuration. + +Module settings use a card-based layout with toggle switches, dropdowns, text fields, and sliders: + +![Toggle switch](/assets/screenshots/settings_switch.png) + +![Dropdown selector](/assets/screenshots/settings_dropdown.png) + +![Text field](/assets/screenshots/settings_text_field.png) + +![Settings card layout](/assets/screenshots/settings_titled_card.png) + +## Module Configuration + +### MQTT Module + +Bridges mesh messages to and from an MQTT broker for internet connectivity. This is how you extend your mesh beyond radio range or integrate with home automation systems. + +| Setting | Descripción | +| --------------- | ------------------------------------------------------------------------ | +| Habilitado | Toggle MQTT bridge | +| Servidor | MQTT broker address | +| Usuario | Authentication username | +| Contraseña | Authentication password | +| Cifrado | Encrypt MQTT payloads | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON support removed from firmware; field is ignored | +| TLS | Use secure connection | +| Root Topic | Base MQTT topic path | +| Map Report | Publish position for public map | + +See [MQTT](mqtt) for a detailed usage guide including encryption, privacy, and broker setup. + +### Serial Module + +Enables serial port communication for external device integrations (GPS modules, sensors, or custom hardware). When enabled, the node's serial port can send and receive protobuf or text data, allowing external microcontrollers or computers to interact with the mesh. + +| Setting | Descripción | +| ---------- | ------------------------------- | +| Habilitado | Activate serial communication | +| Echo | Echo received serial data back | +| Mode | Text, Protobuf, or NMEA output | +| RX/TX Pins | GPIO pins for serial connection | +| Baud Rate | Serial communication speed | + +### External Notification Module + +Controls buzzer, LED, or vibration alerts on your radio hardware. Useful for devices that need to physically signal when a message arrives — particularly helpful for unattended or outdoor installations. + +| Setting | Descripción | +| -------------------------------- | --------------------------- | +| Habilitado | Activate notifications | +| Alert Message | Notify on incoming messages | +| Alert Message Buzzer | Use buzzer for messages | +| Alert Message Vibra | Use vibration for messages | +| Alert Bell | Notify on bell character | +| Output (GPIO) | Pin for notification output | +| Active | High or Low active | +| Duration (ms) | Notification length | +| Use I2S as Buzzer | Use I2S audio output | + +### Store & Forward Module + +Buffers messages for nodes that were temporarily offline, then replays them when those nodes reconnect. Essential for meshes where nodes go in and out of range regularly — ensures messages aren't lost during brief disconnections. + +| Setting | Descripción | +| ------------------------------------------ | -------------------------- | +| Habilitado | Activate store and forward | +| Heartbeat (s) | Announcement interval | +| Registros | Maximum stored messages | +| History Return (max) | Max messages to replay | +| History Return (window) | Time window for replay | + +> 💡 **Tip:** Store and Forward works best on nodes with ample memory (ESP32 with PSRAM). Router nodes are ideal candidates since they're typically always-on. + +### Range Test Module + +Automated range testing tool for evaluating link quality between nodes. When enabled, the node periodically transmits test messages with incrementing counters. A receiver node logs these messages, allowing you to walk or drive away and later analyze at what distance messages stopped arriving. + +| Setting | Descripción | +| -------------------------------------- | --------------------------------- | +| Habilitado | Activate range testing | +| Sender Interval (s) | Time between test transmissions | +| Save CSV | Log received test data to SD card | + +### Telemetry Module + +Controls what telemetry data your node shares with the mesh. Telemetry includes device health (battery, uptime) and environmental sensor data (temperature, humidity, pressure). + +| Setting | Descripción | +| ---------------------------- | --------------------------------------- | +| Device Metrics Interval | How often to report device metrics | +| Environment Metrics Interval | How often to report environment sensors | +| Air Quality Enabled | Report particulate sensor data | +| Power Metrics Enabled | Report power usage | + +See [Telemetry & Sensors](telemetry-and-sensors) for supported sensors and configuration recommendations. + +### Canned Message Module + +Pre-configured messages accessible from the device's physical buttons (for radios with rotary encoders, keypads, or similar input hardware). Define a list of quick-send messages that can be transmitted without a phone connected — ideal for field use. + +| Setting | Descripción | +| ------------------ | ----------------------------------------------------------- | +| ~~Enabled~~ | ⚠️ **Deprecated** — current firmware may ignore this toggle | +| Mensajes | Newline-separated list of messages | +| Send Bell | Play bell sound on send | +| Rotary Encoder | Enable rotary encoder input | +| Up/Down/Press Pins | GPIO pin assignments for input | + +### Audio Module + +Codec2 audio support for low-bandwidth voice communication over the mesh. This is an **experimental** feature that encodes voice into very small data packets using the Codec2 codec. + +| Setting | Descripción | +| --------------- | -------------------------------- | +| Habilitado | Activate audio module | +| Codec2 Rate | Audio quality/bandwidth tradeoff | +| I2S Word Select | GPIO pin for I2S WS | +| I2S Data In | GPIO pin for I2S DIN | +| I2S Data Out | GPIO pin for I2S DOUT | + +> ⚠️ **Note:** Audio requires specific hardware (I2S microphone and speaker). Voice quality is very low-bandwidth — think "understandable radio voice," not phone-call quality. + +### Remote Hardware Module + +GPIO control over the mesh network. Allows a remote node to read or write GPIO pins on another node — useful for activating relays, reading switches, or controlling external hardware from a distance. + +| Setting | Descripción | +| -------------------- | --------------------------------------------------------------- | +| Habilitado | Activate remote GPIO access | +| Allow Undefined Pins | Allow access to any GPIO pin (security risk) | + +> ⚠️ **Warning:** Enabling "Allow Undefined Pins" gives remote nodes access to all GPIO pins, which could interfere with the radio's own hardware. Only enable on dedicated GPIO nodes. + +### Neighbor Info Module + +Broadcasts information about directly heard neighbors, enabling mesh topology mapping. Each enabled node periodically shares a list of the other nodes it can hear and their signal quality. + +| Setting | Descripción | +| -------------------------------------- | ------------------------------------ | +| Habilitado | Activate neighbor broadcasting | +| Update Interval (s) | How often to broadcast neighbor list | + +See [Discovery](discovery) for how to use neighbor data for mesh topology exploration. + +### Ambient Lighting Module + +Controls onboard NeoPixel or other addressable RGB LEDs on supported hardware. Can be used for visual status indicators, notification lights, or decorative effects. + +| Setting | Descripción | +| ------------------ | ---------------------------------------------------------- | +| Habilitado | Activate LED control | +| LED State | On, Off, or set specific color | +| Red / Green / Blue | Individual color channel values (0–255) | + +### Detection Sensor Module + +Turns your node into a motion or door sensor alert system. When a GPIO pin detects a state change (motion detected, door opened), the node broadcasts an alert message over the mesh. + +| Setting | Descripción | +| ---------------------------------------- | ----------------------------------------------------------------------- | +| Habilitado | Activate detection sensor | +| Monitor Pin | GPIO pin connected to sensor | +| Detection Triggered High | Trigger when pin goes high (vs. low) | +| Minimum Broadcast (s) | Minimum time between alert broadcasts | +| State Broadcast (s) | Periodic state broadcast interval | +| Send Bell | Include bell character in alerts | +| Friendly Name | Custom name for this sensor | + +### Paxcounter Module + +People counter using WiFi and BLE probe requests. Counts nearby devices by passively listening for probe requests that phones and laptops emit when scanning for networks. Available only on ESP32 devices. + +| Setting | Descripción | +| -------------------------------------- | -------------------------- | +| Habilitado | Activate people counting | +| Update Interval (s) | How often to report counts | + +> 💡 **Tip:** Paxcounter is useful for estimating foot traffic at trailheads, event venues, or other locations. Counts are approximate — one person may carry multiple devices. + +### TAK Module + +Team Awareness Kit integration for interoperability with ATAK and WinTAK. See [TAK Integration](tak) for detailed setup and usage. + +## Administración + +### Administración remota + +Remotely configure nodes that share your admin key: + +1. Select the target node in the node list. +2. Navigate to **Settings** for that node. +3. Modify configuration. +4. Tap **Save** — changes are sent over the mesh. + +> ⚠️ **Requires:** Admin key configured on both your node and the target node. + +### Limpiar nodos de la base de datos + +Removes stale nodes from your local database that haven't been heard in a configurable time window. + +### Factory Reset + +Resets all settings to factory defaults. **This cannot be undone.** + +### Reiniciar + +Remotely reboot a connected or administered node. + +### Panel de depuración + +View detailed diagnostic information: + +- Protocol buffers debug output +- Mesh packet log +- Connection state details + +### Troubleshooting Remote Admin + +- **"No response from target node"** — the target may be out of range, offline, or have a mismatched admin key. Verify the admin key matches on both nodes. +- **Changes not applying** — some settings require a reboot to take effect. Try the Reboot action after saving. +- **Can't see remote settings** — ensure your node has the admin key for the target node and that Admin Channel is enabled in Security Config. + +## Related Topics + +- [Settings — Radio & User](settings-radio-user) — core radio and user profile settings +- [Module configuration reference](https://meshtastic.org/docs/configuration/module) — detailed module docs on meshtastic.org +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/es-rES/user/settings-radio-user.md b/docs/es-rES/user/settings-radio-user.md new file mode 100644 index 000000000..d061d19cc --- /dev/null +++ b/docs/es-rES/user/settings-radio-user.md @@ -0,0 +1,173 @@ +--- +title: Settings — Radio & User +nav_order: 7 +last_updated: 2026-05-13 +description: Configure your radio hardware, LoRa presets, user profile, position sharing, power management, and security. +aliases: + - ajustes + - radio-config + - user-config + - lora +--- + +# Settings — Radio & User + +Configure your radio hardware and user identity parameters. + +## User Settings + +### User Profile + +| Setting | Descripción | +| ----------------- | ------------------------------------------------------------------------------------- | +| Nombre largo | Your display name (up to 39 characters) | +| Nombre Corto | 4-character abbreviated name | +| Licensed Operator | Enable if you hold an amateur radio license (enables higher power) | + +### Applying Changes + +After modifying settings, tap **Save** to write the configuration to your radio. The device may reboot to apply changes. + +## Radio Configuration + +### Configuración del dispositivo + +| Setting | Descripción | Por defecto | +| ------------------------------------------ | ----------------------------------------------------------------------- | ----------- | +| Rol | Node behavior (Client, Router, etc.) | Cliente | +| Modo de retransmisión | How the node retransmits messages | Todos | +| Node Info Broadcast (s) | Interval for broadcasting node info | 10800 | +| Double-tap Button | Action for double-tap button press | Disabled | + +### Configuración LoRa + +| Setting | Descripción | Por defecto | +| ---------------------------- | ----------------------------------------------------------------------- | ----------------------------------------- | +| Región | Regulatory region for frequency bands | Unset (must configure) | +| Modem predefinido | Speed/range tradeoff | LongFast | +| Límite de Saltos | Maximum retransmit hops | 3 | +| TX Power | Transmission power (dBm); 0 = max allowed for region | 0 (region max) | +| Desplazamiento de frecuencia | Fine-tune frequency (MHz) | 0 | +| Channel Bandwidth | Bandwidth setting | Default for preset | + +> ⚠️ **Important:** You **must** set your region before transmitting. Operating without the correct region may violate local radio regulations. See the [region configuration guide](https://meshtastic.org/docs/getting-started/initial-config) on meshtastic.org for details. + +### Modem Presets + +| Preset | Range | Velocidad | SNR Limit | Best For | +| ------------------ | ----------------------- | ------------------------- | ------------------------ | -------------------------------------------------------------------------------------------------------- | +| Short Turbo | ~1 km | 21.9 kbps | −5 dB | Dense urban with line-of-sight; data-heavy applications | +| Short Fast | ~3 km | 10.9 kbps | −7.5 dB | Urban neighborhoods; buildings within a few blocks | +| Short Slow | ~5 km | 5.5 kbps | −10 dB | Suburban short-range; moderate building density | +| Medium Fast | ~5 km | 5.5 kbps | −10 dB | Suburban areas; moderate building density | +| Medium Slow | ~8 km | 1.1 kbps | −12.5 dB | Suburban/rural; moderate range with slower speed | +| Long Turbo | ~10 km | 4.4 kbps | −10 dB | Similar range to Long Fast but with 500 kHz bandwidth; faster throughput | +| Long Fast | ~10 km | 1.1 kbps | −12.5 dB | **General use (default)** — balanced range and speed | +| Long Moderate | ~20 km | 0.34 kbps | −15 dB | Rural with some terrain; occasional use | +| Lite Fast | ~5 km | 5.5 kbps | −10 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Medium Fast | +| Lite Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Long Fast | +| Narrow Fast | ~5 km | 2.7 kbps | −10 dB | EU 868 MHz band (62.5 kHz BW); avoids interference with other devices | +| Narrow Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 868 MHz band (62.5 kHz BW); comparable to Long Fast | +| ~~Long Slow~~ | ~30 km | 0.18 kbps | −17.5 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | +| ~~Very Long Slow~~ | ~40+ km | 0.09 kbps | −20 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | + +#### Choosing a Modem Preset + +The modem preset controls the fundamental tradeoff between **range** and **data rate**: + +- **Slower presets** use more spreading, making signals decodable at weaker signal levels (lower SNR limit). This means longer range but fewer bytes per second. +- **Faster presets** pack more data per transmission but require a stronger signal to decode. + +**Practical guidance:** + +- **Urban mesh (many nodes, short distances):** Use **Long Fast** (default) or **Short Fast**. Higher speed means less airtime congestion when many nodes share the channel. +- **Rural/sparse mesh (few nodes, long distances):** Use **Long Moderate**. Range matters more than speed when nodes are far apart. +- **EU 866/868 MHz regulatory compliance:** Use **Lite Fast**, **Lite Slow**, **Narrow Fast**, or **Narrow Slow** — these are optimized for the EU SRD/868 MHz bands with narrower bandwidths. +- **Fixed infrastructure links:** Use **Short Turbo** or **Long Turbo** for dedicated point-to-point links with good antennas and line-of-sight. +- **Mixed environments:** Stick with **Long Fast** — it's the community default and ensures compatibility with others in your area. + +> ⚠️ **Important:** All nodes on the same channel **must** use the same modem preset. Nodes with mismatched presets cannot communicate even if they share the same frequency and encryption key. + +> 💡 **Tip:** The range estimates above assume flat terrain and modest antennas. Elevation advantage (hilltop, rooftop) dramatically increases effective range. A well-placed Router with Long Fast can often outperform a ground-level node with Long Slow. + +### Configuración de pantalla + +| Setting | Descripción | +| ------------------------------- | ------------------------------------------------------------------------------------ | +| Tiempo de espera de la pantalla | Time before display sleeps | +| Unidades de medidas | Metric or Imperial | +| Tipo de OLED | Auto, SSD1306, SH1106, SH1107 | +| Compass Orientation | Rotation offset for compass display (0°, 90°, 180°, 270°) | +| ~~Compass North~~ | ⚠️ **Deprecated** — replaced by Compass Orientation; still visible in older firmware | + +### Configuración de la posición + +| Setting | Descripción | +| ----------------------------------------- | ---------------------------------- | +| GPS Enabled | Enable/disable GPS | +| Intervalo de actualización GPS | How often to acquire GPS fix | +| Position Broadcast (s) | How often to share position | +| Ubicación inteligente | Enable movement-based broadcasting | +| Posición fija | Use a manually set position | + +### Configuración de elecenergía + +| Setting | Descripción | +| --------------------------------------- | --------------------------------------- | +| Power Saving | Enable low-power sleep mode | +| Shutdown After (s) | Auto-shutdown idle timer | +| ADC Multiplier | Battery voltage calibration factor | +| Wait Bluetooth (s) | Time to wait for BLE connection at boot | +| Mesh SDS Timeout (s) | Super-deep-sleep timeout | + +### Configuración de la red + +| Setting | Descripción | +| ------------- | ---------------------------------------------------- | +| WiFi Enabled | Enable WiFi radio (ESP32 devices) | +| WiFi SSID | Network name to connect to | +| WiFi PSK | Contraseña de red | +| Servidor NTP | Time synchronization server | +| Syslog Server | Remote logging server | + +![IP address field](/assets/screenshots/settings_ipv4_field.png) + +### Configuración Bluetooth + +| Setting | Descripción | +| ----------------- | ------------------------------------------------------------------------- | +| Bluetooth Enabled | Enable/disable BLE radio | +| Pairing Mode | Fixed PIN, Random PIN, or No PIN | +| Pin fijo | PIN code for pairing (default: 123456) | + +### Configuración de la seguridad + +| Setting | Descripción | +| --------------------------------- | -------------------------------------------------------------------------- | +| Clave Pública | Your node's public key (read-only) | +| Contraseña de administrador | Key for remote administration | +| Clave privada | Your node's private key (handle securely) | +| Admin Channel Enabled | Allow admin commands via channel | +| Debug Log | Output live debug logging over serial/bluetooth | +| Serial Enabled | Enable serial console access (moved from Device Config) | +| Modo "ya terminado de configurar" | Restrict non-admin channel changes | + +![Password field](/assets/screenshots/settings_password_field.png) + +Settings use standard preference controls — dropdowns, toggles, and sliders: + +| Control | Screenshot | +| -------- | ------------------------------------------------------ | +| Dropdown | ![Dropdown](/assets/screenshots/settings_dropdown.png) | +| Toggle | ![Toggle](/assets/screenshots/settings_switch.png) | +| Slider | ![Slider](/assets/screenshots/settings_slider.png) | + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — optional feature modules and device administration +- [Signal Meter](signal-meter) — how modem presets affect signal quality thresholds +- [LoRa configuration](https://meshtastic.org/docs/configuration/radio/lora) — detailed LoRa settings reference on meshtastic.org +- [Initial configuration](https://meshtastic.org/docs/getting-started/initial-config) — region setup guide on meshtastic.org + +--- + diff --git a/docs/es-rES/user/signal-meter.md b/docs/es-rES/user/signal-meter.md new file mode 100644 index 000000000..20724df71 --- /dev/null +++ b/docs/es-rES/user/signal-meter.md @@ -0,0 +1,81 @@ +--- +title: How the Meshtastic Signal Meter Works +nav_order: 15 +last_updated: 2026-05-13 +description: How the signal meter calculates quality from RSSI and SNR — LoRa spread spectrum, presets, and what the bars really mean. +aliases: + - signal + - signal-meter + - snr + - rssi +--- + +# How the Meshtastic Signal Meter Works + +The Meshtastic signal meter — the familiar bars or status color in the app — is calculated very differently than the "bars" on a traditional cell phone or Wi-Fi router. + +Most consumer devices simply measure how "loud" a signal is. However, because Meshtastic uses **LoRa (Long Range)** technology, its signal meter measures how **clear** the signal is, relative to the specific settings your mesh is using. + +--- + +## 1. The Two Metrics: "Loudness" vs. "Clarity" + +Every time the LoRa radio chip receives a message, it reports two measurements: + +- **RSSI (Received Signal Strength Indicator):** The **loudness** of the raw power hitting your antenna. +- **SNR (Signal-to-Noise Ratio):** The **clarity** of the signal compared to the background static. + +> **Tip — The Analogy:** Imagine you are trying to hear a friend talking to you. +> +> - **RSSI** is how loud their voice is. +> - **The Noise Floor** is the background noise in the room (air conditioning, other people talking, traffic). +> - **SNR** is how easily you can distinguish your friend's voice from the background noise. + +If your friend shouts at you at a deafening rock concert, the signal is incredibly loud (High RSSI), but you still can't understand them because the background noise is louder (Bad SNR). Conversely, if your friend whispers to you in a dead-silent library, the signal is very weak (Low RSSI), but you can understand them perfectly (Great SNR). + +--- + +## 2. The Magic of LoRa: Hearing "Below the Noise Floor" + +For standard radios (like FM or Wi-Fi), if the background noise is louder than the signal (a negative SNR), the receiver just hears static. + +LoRa is special. It uses **"Spread Spectrum"** modulation, which allows the radio to mathematically pull a signal out of the air even when it is buried deep _underneath_ the background noise. This is why you will frequently see **negative SNR numbers** in Meshtastic (e.g., -10 dB, which means the signal is 10 decibels weaker than the background static). + +Depending on which Meshtastic preset you are using (e.g., `LongFast` vs. `ShortFast`), the radio has a specific **SNR Limit** — the absolute maximum amount of noise it can tolerate before the message is completely lost to the static. + +--- + +## 3. How the Signal Meter Calculates Quality + +The Meshtastic apps take both RSSI and SNR and run them through a specific formula to assign your signal a quality rating (None, Bad, Fair, or Good). It specifically scales these values based on the physical limits of the radio preset you are using. + +Here is exactly how the app decides how many bars (or what color) to show you: + +| Level | Bars | Criteria | Meaning | +| --------- | ---- | ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | +| Bien | 3 | RSSI better than `-115 dBm` **AND** SNR better than `-7 dB` | Signal is both loud and clear — healthy connection. | +| Aceptable | 2 | RSSI better than `-126 dBm` with good SNR, **OR** SNR better than `-15 dB` with good RSSI | Signal getting quieter or noisier, but still decodable. | +| Mal | 1 | Falls between Fair and None thresholds | At the edge of range or experiencing interference. | +| Ninguna | 0 | RSSI worse than `-126 dBm` **AND** SNR worse than `-15 dB` | Transmission completely buried in noise. | + +--- + +## 4. What This Means for You + +Because Meshtastic's meter acts as a **"Clarity Meter"**, it behaves differently than what most people expect: + +> **Tip — Don't panic over low RSSI:** You might see a seemingly terrible RSSI value like `-118 dBm`. On a cell phone, you would have zero bars. But if you have an SNR of `+2 dB`, Meshtastic will still show a strong signal! _The library is quiet, so the whisper is heard perfectly._ + +> **Warning — Watch out for local noise:** If you hook up a massive antenna and see a great RSSI (e.g., `-90 dBm`) but your signal meter is only showing **1 Bar (Bad)**, you have a problem. It means you have local interference — perhaps a cheap power supply, a noisy computer, or a nearby radio tower — creating so much static that it is drowning out your mesh. + +## Where Signal Information Appears + +In the app, signal data is shown in several places: + +- **Node list** — signal bars icon next to each node +- **Node detail** — SNR, RSSI, and signal quality in the device metrics section +- **Traceroute** — per-hop signal quality for each relay node +- **Signal metrics** — historical SNR and RSSI data in the metrics charts + +![Node entry showing SNR, RSSI values and colored signal bars](/assets/screenshots/nodes_signal_info.png) + diff --git a/docs/es-rES/user/tak.md b/docs/es-rES/user/tak.md new file mode 100644 index 000000000..eb53bb641 --- /dev/null +++ b/docs/es-rES/user/tak.md @@ -0,0 +1,126 @@ +--- +title: TAK Integration +nav_order: 10 +last_updated: 2026-05-13 +description: Interoperate with ATAK and WinTAK — CoT position sharing, TAK roles, and plugin setup. +aliases: + - tak + - atak + - team-awareness-kit +--- + +# TAK Integration + +Meshtastic integrates with the Team Awareness Kit (TAK) ecosystem, enabling interoperability between Meshtastic mesh devices and TAK applications like ATAK and WinTAK. + +## Visión general + +The TAK module allows Meshtastic nodes to: + +- Share position data in TAK-compatible CoT (Cursor on Target) format +- Appear as team members on TAK map displays +- Receive TAK PLI (Position Location Information) messages + +## Setup + +### Prerequisites + +- ATAK (Android Team Awareness Kit) or WinTAK installed +- Meshtastic ATAK Plugin installed +- TAK module enabled on your Meshtastic radio + +### Configuración + +1. Navigate to **Settings → Module Config → TAK**. +2. Enable the TAK module. +3. Configure the TAK team/group settings: + +![Module toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | Descripción | +| ---------- | -------------------------- | +| Habilitado | Activate TAK interop | +| Mode | TAK-compatible output mode | + +### ATAK Plugin Setup + +1. Install the Meshtastic ATAK Plugin from the plugin repository. +2. Open ATAK and enable the Meshtastic plugin. +3. The plugin bridges messages between ATAK and your mesh network. + +## TAK Roles + +Nodes configured with TAK-related roles behave differently from standard clients: + +| Rol | Descripción | +| --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **TAK** | Full TAK interoperability — sends and receives CoT data, chat messages, and PLI updates. Functions as a standard client plus TAK bridge. | +| **TAK Tracker** | Position-only TAK output — automatically broadcasts PLI at regular intervals without user interaction. Optimized for unattended position beacons (vehicles, equipment, waypoints). Does not relay chat messages. | + +> 💡 **Tip:** Use **TAK Tracker** for devices that only need to report position (e.g., a radio mounted in a vehicle). Use **TAK** for devices where users actively participate in TAK operations. + +### CoT (Cursor on Target) Format + +TAK messages use the Cursor on Target XML format — a military standard for sharing situational awareness data. Meshtastic converts its internal protobuf messages to CoT format when bridging to TAK systems, so no manual format conversion is needed. + +## TAK Identity + +When using TAK roles, your node broadcasts identity information that appears on TAK maps: + +| Setting | Descripción | +| -------- | ---------------------------------------------------------------------------------------------------------------- | +| Team | Your team color on the TAK map (e.g., Blue, Red, Cyan, Green) | +| Rol | Your operational role (Team Member, Team Lead, HQ, Medic, RTO, etc.) | +| Callsign | Your TAK callsign (defaults to your Meshtastic long name) | + +These settings appear in **Settings → Module Config → TAK** when the TAK module is enabled. + +> 💡 **Tip:** Team/role colors are the standard TAK affiliation colors. Coordinate with your TAK team to use consistent team assignments. + +## Wire Format (V1 / V2) + +Meshtastic supports two TAK wire formats: + +| Format | Compatibility | Features | +| ------------------------------- | --------------------------------------------------------------- | --------------------------------------------------------- | +| V1 (Legacy) | ATAK Plugin v1.x, older firmware | Basic CoT position sharing only | +| V2 (Current) | ATAK Plugin v2.x, firmware 2.3+ | Full CoT support including chat, routes, zstd compression | + +The app automatically selects V2 when both sides support it. No manual configuration needed — the TAK module negotiates format based on firmware capabilities. + +## Usage with ATAK + +Once configured: + +- Meshtastic nodes appear as markers on the ATAK map with callsign labels +- Chat messages can bridge between mesh and TAK networks +- Position updates flow bidirectionally between Meshtastic and TAK +- TAK Tracker nodes broadcast PLI automatically — their positions appear on ATAK maps without any ATAK-side configuration + +> ⚠️ **Note:** TAK integration requires specific node roles and module configuration. Standard client nodes don't automatically participate in TAK operations. + +## Troubleshooting + +| Problem | Cause | Solution | +| -------------------------------- | ------------------------------------- | ----------------------------------------------------------------------- | +| Node doesn't appear on ATAK map | TAK module disabled or wrong role | Verify TAK module is enabled and node role is TAK or TAK Tracker | +| Position updates are stale | GPS fix lost or interval too long | Check GPS status; reduce position broadcast interval in Position Config | +| ATAK plugin shows "disconnected" | BLE connection lost or plugin crashed | Reconnect Bluetooth in Meshtastic app, then restart ATAK plugin | +| Chat messages not bridging | V1 format doesn't support chat | Ensure both nodes run firmware 2.3+ for V2 wire format | +| CoT data not flowing | Channel mismatch | All TAK nodes must be on the same channel with matching encryption | + +## Security Considerations + +- TAK data shares your position and callsign information +- Ensure your channel encryption is configured when using TAK in sensitive environments +- The TAK module respects the same channel encryption as other Meshtastic messages + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — TAK module configuration +- [Nodes](nodes) — TAK and TAK Tracker roles in the node list +- [Map & Waypoints](map-and-waypoints) — node positions on the map +- [ATAK plugin guide](https://meshtastic.org/docs/software/integrations/atak-plugin) — detailed ATAK setup on meshtastic.org + +--- + diff --git a/docs/es-rES/user/telemetry-and-sensors.md b/docs/es-rES/user/telemetry-and-sensors.md new file mode 100644 index 000000000..b538eafcc --- /dev/null +++ b/docs/es-rES/user/telemetry-and-sensors.md @@ -0,0 +1,118 @@ +--- +title: Telemetry & Sensors +nav_order: 9 +last_updated: 2026-05-13 +description: Sensor data on the mesh — supported environment, air quality, and power sensors, plus configuration and viewing guides. +aliases: + - sensors + - environment + - weather + - power-metrics +--- + +# Telemetry & Sensors + +Meshtastic nodes can collect and share sensor data across the mesh network. + +## Visión general + +Telemetry allows nodes equipped with sensors to broadcast environmental, power, and device health information. This data is visible on the node detail screen and can be logged over time. + +## Device Telemetry + +All Meshtastic nodes report basic device telemetry: + +| Métrico | Descripción | Typical Range | +| --------------------- | ------------------------------ | ------------------------------------------------------------------ | +| Battery Level | Charge percentage | 0–100% | +| Tensión | Battery voltage | 3.0–4.2V (LiPo) | +| Utilización del canal | % of airtime used locally | 0–100% | +| Air Utilization TX | % of airtime used by this node | 0–100% | +| Tiempo encendido | Seconds since last boot | Varies | + +## Environment Sensors + +Supported environmental sensors: + +### Temperature & Humidity + +| Sensor | Temperatura: | Humedad | Presión | Notas | +| ------- | ---------------------------- | ------- | ------- | ----------------------- | +| BME280 | ✓ | ✓ | ✓ | Recommended all-in-one | +| BME680 | ✓ | ✓ | ✓ | Adds gas resistance/IAQ | +| SHT31 | ✓ | ✓ | — | High accuracy | +| MCP9808 | ✓ | — | — | Precision temperature | +| LPS22 | — | — | ✓ | Pressure only | + +### Air Quality + +| Sensor | Métrico | Notas | +| -------- | -------------------------------------------------- | -------------------------- | +| BME680 | Gas Resistance / IAQ | Volatile organic compounds | +| PMSA003I | PM1.0, PM2.5, PM10 | Particulate matter | +| SEN55 | PM, NOx, VOC, Temp, Humidity | Multi-sensor | + +### Light & UV + +| Sensor | Métrico | +| -------- | -------------------------------------- | +| OPT3001 | Ambient light (lux) | +| VEML7700 | Ambient light (lux) | +| LTR390 | UV index | + +## Métricas de Energía + +Nodes with INA-series power sensors can report: + +| Métrico | Descripción | +| ----------- | ----------------------------------------- | +| Bus Voltage | Supply rail voltage | +| Intensidad | Power consumption (mA) | +| Consumo | Calculated power (mW) | + +Useful for monitoring solar charging or battery health on remote nodes. + +## Configuring Telemetry + +1. Navigate to **Settings → Module Config → Telemetry**. +2. Set reporting intervals: + - **Device Metrics Interval** — how often to broadcast device metrics + - **Environment Metrics Interval** — how often to broadcast sensor data +3. Enable specific sensor types as needed. + +### Recommended Intervals + +| Use Case | Device (s) | Environment (s) | +| ------------------------------------------ | ----------------------------- | ---------------------------------- | +| Urban mesh (many nodes) | 3600 | 3600 | +| Rural mesh (few nodes) | 900 | 900 | +| Weather station | 900 | 300 | +| Battery conservation | 7200 | 7200 | + +> ⚠️ **Note:** Shorter intervals increase airtime usage and battery drain across the mesh. + +## Viewing Telemetry + +1. Navigate to **Nodes** and select a node. +2. Telemetry sections show on the detail screen: + - Device Metrics (always available) + - Environment Metrics (if sensors present) + - Power Metrics (if INA sensor present) +3. Historical graphs show trends over time. + +![Telemetry actions](/assets/screenshots/node-metrics_telemetric_actions.png) + +## Troubleshooting + +- **No environment data showing?** The remote node needs a physical sensor connected (e.g., BME280 on I2C). Device telemetry (battery, uptime) is always available, but environment metrics require hardware. +- **Stale readings?** Check the reporting interval — very long intervals (7200s+) mean data updates infrequently. Also verify the remote node is still online. +- **Sensor conflict on I2C bus?** Some sensors share I2C addresses. If you have multiple sensors on the same bus, check for address collisions in the radio's serial debug output. + +## Related Topics + +- [Node Metrics](node-metrics) — view telemetry data on the node detail screen +- [Settings — Modules & Admin](settings-module-admin) — telemetry module configuration +- [Units & Locale](units-and-locale) — temperature and pressure display units + +--- + diff --git a/docs/es-rES/user/translate.md b/docs/es-rES/user/translate.md new file mode 100644 index 000000000..61d69b71d --- /dev/null +++ b/docs/es-rES/user/translate.md @@ -0,0 +1,97 @@ +--- +title: Translate the App +parent: User Guide +nav_order: 17 +last_updated: 2026-05-13 +aliases: + - translate + - crowdin + - localization +--- + +# Translate the App + +Contributing translations helps make Meshtastic accessible to a wider audience. The app uses [Crowdin](https://crowdin.com/) to manage community translations for both the user interface and in-app documentation. + +--- + +## What Gets Translated + +| Resource | Source Location | Notas | +| ----------------- | ------------------------------------- | ---------------------------------------------------------------------- | +| UI strings | `composeResources/values/strings.xml` | Buttons, labels, messages, and all user-visible text | +| User Guide pages | `docs/user/*.md` | In-app documentation shown in Help & Documentation | +| Fastlane metadata | `fastlane/metadata/android/en-US/` | App Store listing title, description, and changelogs | + +> **Note — Developer Guide pages are English-only.** Code-focused documentation targeting contributors is not translated. + +--- + +## How to Contribute + +1. **Visit the Crowdin project.** Open the [Meshtastic Android Crowdin project](https://crowdin.com/project/meshtastic-android) and sign in or create a free account. +2. **Choose your language.** Select an existing language or request a new one by opening a [GitHub issue](https://github.com/meshtastic/Meshtastic-Android/issues/new). +3. **Translate strings.** Crowdin shows the English source on the left and your translation on the right. Translate each string and save. +4. **Review context.** Many strings include screenshots or context comments — check these to understand where the text appears in the app. +5. **Submit.** Approved translations are automatically merged into the next release. + +> **Tip — Keep translations short.** UI strings often appear in buttons, chips, or narrow columns. If a translation is significantly longer than the English original, consider abbreviating where the meaning stays clear. + +--- + +## Adding a New Language + +If your language is not yet listed on Crowdin: + +1. Open an issue on [GitHub](https://github.com/meshtastic/Meshtastic-Android/issues/new) requesting the new locale. +2. A maintainer will add the language to Crowdin and configure `crowdin.yml`. +3. Once added, you can begin translating immediately. + +--- + +## How Translations Are Organized + +The Android app uses **Compose Multiplatform resources** for all user-visible strings: + +``` +core/resources/src/commonMain/composeResources/ +├── values/ ← English (default) +│ └── strings.xml +├── values-de/ ← German +│ └── strings.xml +├── values-fr/ ← French +│ └── strings.xml +└── ... +``` + +In-app documentation follows a similar pattern under `docs/`: + +``` +docs/ +├── user/ ← English source (default) +│ ├── onboarding.md +│ └── ... +├── fr/user/ ← French translations +│ ├── onboarding.md +│ └── ... +└── ... +``` + +The app automatically selects the correct locale based on your device's **Language & Region** settings. + +--- + +## Translation Guidelines + +- **Do not translate** technical terms like "LoRa", "MQTT", "BLE", "TAK", "SNR", or "RSSI" — these are universal. +- **Keep placeholders intact.** Strings like `%1$s` or `%d` are filled in at runtime. Do not remove or reorder them unless the grammar of your language requires it. +- **Match tone.** The app uses a friendly, direct voice. Avoid overly formal language. +- **Test if possible.** Switch your device language and open the app to see how translations look in context. + +--- + +## Questions? + +If you have questions about a specific string's context or need help getting started, open a discussion on the [Meshtastic GitHub Discussions](https://github.com/meshtastic/Meshtastic-Android/discussions) page. + +Thank you for helping expand the reach of Meshtastic! diff --git a/docs/es-rES/user/units-and-locale.md b/docs/es-rES/user/units-and-locale.md new file mode 100644 index 000000000..355fb1ac9 --- /dev/null +++ b/docs/es-rES/user/units-and-locale.md @@ -0,0 +1,118 @@ +--- +title: Units, Measurement & Locale +parent: User Guide +nav_order: 16 +last_updated: 2026-05-12 +--- + +# Units, Measurement & Locale + +The Meshtastic app automatically displays temperatures, distances, speeds, and times in the units your device is configured to use — no settings to change inside the app. + +--- + +## How It Works + +Meshtastic radios always transmit data in **metric units** (meters, °C, km/h, hPa, etc.). When the app receives this data, it uses the `MetricFormatter` utility to convert and display values in whatever unit system your device's locale specifies. + +On Android, your measurement preferences are determined by your system **Language & Region** settings. On Desktop (JVM), the app uses the JVM's default `Locale`. + +> **Tip — You never need to toggle units inside the app.** Change your system measurement preferences and every screen in Meshtastic updates automatically — node details, telemetry charts, weather, altitude, and more. + +--- + +## Temperatura: + +Temperature values from environment sensors are transmitted as **°C** and displayed based on your device's temperature unit preference. + +![Environment metrics with temperature](/assets/screenshots/nodes_environment_metrics.png) + +| Your Setting | You See | +| ------------ | ------- | +| Celsius | 22°C | +| Fahrenheit | 72°F | + +This affects all temperature displays throughout the app: node environment telemetry, soil temperature, dew point, and telemetry chart axes. + +## Distance & Altitude + +Distances between nodes and GPS altitudes are transmitted as **meters** and automatically scaled and converted. + +![Distance info display](/assets/screenshots/nodes_distance_info.png) + +| Your Setting | Small Distance | Large Distance | Altitud | +| -------------------------------- | -------------- | ---------------------- | -------- | +| Métrico | 350 m | 2.5 km | 1,200 m | +| Imperial (US) | 1,148 ft | 1.6 mi | 3,937 ft | + +The app uses natural scaling — short distances stay in meters or feet, while longer distances switch to kilometres or miles automatically. + +### Where these appear + +- **Node list** — distance and bearing to each node +- **Node detail** — altitude, distance from your position +- **Map** — waypoint distances, traceroute hop distances +- **Compass** — distance to selected node + +## Velocidad + +GPS ground speed is displayed in your locale's preferred speed unit. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Métrico | 12 km/h | +| Imperial (US) | 7 mph | + +## Viento + +Wind speed and gust data from environment sensors are transmitted as **m/s** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Métrico | 5 m/s | +| Imperial (US) | 11 mph | + +Wind readings appear in the **Node Detail** environment section and the **Environment Telemetry** charts. + +## Rainfall + +Rainfall measurements (1-hour and 24-hour totals) are transmitted as **mm** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ---------------------- | +| Métrico | 12 mm | +| Imperial (US) | 0.5 in | + +## Units That Never Change + +Some units are international standards and are displayed the same way regardless of your locale: + +| Measurement | Unit | Why | +| -------------------------------- | ------------------------------ | ------------------------------------- | +| Barometric pressure | hPa | International meteorological standard | +| Heading / bearing | ° (degrees) | Universal navigation convention | +| Radiación | μR/hr | Standard dosimetry unit | +| GPS coordinates | decimal degrees | Universal geographic standard | +| Humidity, battery, soil moisture | % | Universal | + +## Date & Time + +All timestamps throughout the app — last heard, message times, telemetry logs, chart axes — follow your device's date and time preferences. + +| Setting | What It Controls | Example | +| ---------------- | ---------------- | ------------------------------------------------ | +| **24-Hour Time** | Clock format | 14:30 vs 2:30 PM | +| **Date Format** | Date ordering | 09/05/2026 vs 05/09/2026 | + +The app also uses **relative time** where it makes sense — for example, "5 min ago" or "2 hours ago" in the node list — which is automatically localised into your device language. + +## Changing Your Measurement System (Android) + +On Android, your measurement system (metric vs imperial) is tied to your region setting: + +1. Open **Android Settings → System → Language & Region** +2. Change your **Region** or **Measurement units** preference +3. Return to Meshtastic — values update immediately + +> **Tip — The app uses `MetricFormatter` from `core:common`.** All measurement formatting is handled by a shared KMP utility that respects your platform's locale. Developers adding new measurement displays should use `MetricFormatter` rather than hard-coding unit conversions. + diff --git a/docs/et-rEE/index.md b/docs/et-rEE/index.md new file mode 100644 index 000000000..d751b9a5d --- /dev/null +++ b/docs/et-rEE/index.md @@ -0,0 +1,30 @@ +--- +title: Home +layout: default +nav_order: 0 +--- + +# Meshtastic Android App Documentation + +User and developer documentation for the Meshtastic Android, Desktop, and iOS applications powered by KMP (Kotlin Multiplatform). + +Use the sidebar navigation to browse the **User Guide** for app features and the **Developer Guide** for contributing to the project. + +--- + +## Quick Links + +| Guide | Kirjeldus | +| --------------------------------------------------------------------- | -------------------------------------------------------------- | +| [Getting Started](user/onboarding) | Connect your first radio and send a message | +| [Messages & Channels](user/messages-and-channels) | Channel broadcasts, direct messages, reactions, and encryption | +| [Nodes](user/nodes) | Understanding the mesh network node list | +| [Signal Meter](user/signal-meter) | How the LoRa signal quality meter works | +| [Units & Locale](user/units-and-locale) | How temperatures, distances, and times adapt to your region | +| [Desktop App](user/desktop) | Linux, macOS, and Windows desktop usage | +| [Architecture](developer/architecture) | App architecture overview for contributors | +| [Contributing](developer/contributing) | Branch naming, PR workflow, and verification commands | + +--- + +> This documentation is served from the same markdown source that powers the in-app **Help & Documentation** browser. diff --git a/docs/et-rEE/user/connections.md b/docs/et-rEE/user/connections.md new file mode 100644 index 000000000..17f765662 --- /dev/null +++ b/docs/et-rEE/user/connections.md @@ -0,0 +1,125 @@ +--- +title: Ühendus +nav_order: 2 +last_updated: 2026-05-13 +description: Connect your phone or desktop to a Meshtastic radio via Bluetooth, USB, or TCP/IP. +aliases: + - bluetooth + - usb + - tcp + - pairing +--- + +# Ühendus + +Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node. + +## Bluetooth (BLE) + +Bluetooth Low Energy is the default and most common connection method on Android. + +### Pairing a Device + +1. Ensure your Meshtastic radio is powered on and in pairing mode. +2. Open the app and navigate to **Connections**. +3. Tap **Scan for Devices** — nearby Meshtastic radios will appear. +4. Select your device from the list. +5. Accept the Bluetooth pairing prompt if shown. + +![Device list item](/assets/screenshots/connections_bluetooth_scan.png) + +You can filter devices by transport type using the filter chips at the top: + +![Transport filter chips](/assets/screenshots/connections_transport_filters.png) + +> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. + +### Connection Status + +| Icon | State | Kirjeldus | +| ---- | ---------------- | ----------------------------- | +| 🟢 | Ühendatud | Active radio link established | +| 🟡 | Ühendan | Handshake in progress | +| 🔴 | Ühendus katkenud | No active connection | +| ⚪ | Not configured | Seadet pole valitud | + +When connecting, a status indicator shows the current connection state: + +![Connecting status](/assets/screenshots/connections_connecting.png) + +If no devices are found, the app shows an empty state with instructions: + +![No devices found](/assets/screenshots/connections_empty_state.png) + +### Troubleshooting Bluetooth + +- **Device not found:** Toggle Bluetooth off/on, ensure location is enabled. +- **Connection drops:** Move closer to the radio; check for interference. +- **Pairing rejected:** Forget the device in Android Bluetooth settings and retry. + +## USB Serial + +USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable. + +### Setup + +1. Connect your radio via USB cable to your device. +2. The app will prompt for USB permission — tap **Allow**. +3. The connection is established automatically. + +> ⚠️ **Note:** USB connections require OTG support on Android devices. + +## TCP/IP (WiFi) + +Some Meshtastic radios support WiFi connectivity, allowing TCP-based connections. + +### Sätted + +1. Connect your radio to a WiFi network via the radio's web interface or settings. +2. In the app, go to **Connections → TCP**. +3. Enter the radio's IP address and port (default: 4403). +4. Tap **Connect**. + +![WiFi scanning for devices](/assets/screenshots/connections_wifi_scanning.png) + +When a device is found, it appears in the connection list: + +![WiFi device found](/assets/screenshots/connections_wifi_device_found.png) + +A successful connection is confirmed with a status indicator: + +![WiFi connection success](/assets/screenshots/connections_wifi_success.png) + +### When to Use TCP + +- Radio is on the same local network +- Testing with a simulated radio +- Environments where Bluetooth has interference issues + +## Reconnection Behavior + +The app reconnects to the **last selected device** on startup. You can manually switch transports from the connections screen at any time. + +To disconnect from a radio, use the disconnect button on the connections screen: + +![Disconnect from radio](/assets/screenshots/connections_disconnect.png) + +## Desktop Connections + +On Desktop (Linux/macOS/Windows), the app supports: + +- **Bluetooth (BLE)** — via the Kable library; works on macOS, Linux, and Windows +- **USB Serial** — primary wired connection method +- **TCP/IP** — for network-connected radios + +See [Desktop App](desktop) for platform-specific details and keyboard shortcuts. + +## Related Topics + +- [Getting Started](onboarding) — first-launch setup and permissions +- [Settings — Radio & User](settings-radio-user) — Bluetooth and network configuration +- [Desktop App](desktop) — desktop-specific connection details +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — full list of compatible radios on meshtastic.org + +--- + diff --git a/docs/et-rEE/user/desktop.md b/docs/et-rEE/user/desktop.md new file mode 100644 index 000000000..7a9c802b6 --- /dev/null +++ b/docs/et-rEE/user/desktop.md @@ -0,0 +1,147 @@ +--- +title: Desktop App +nav_order: 14 +last_updated: 2026-05-13 +description: Install and use the Meshtastic Desktop app on Linux, macOS, and Windows — connections, feature parity, and keyboard shortcuts. +aliases: + - desktop + - linux + - macos + - windows + - jvm +--- + +# Desktop App + +The Meshtastic Desktop application provides the same mesh communication features on Linux, macOS, and Windows. + +## Overview + +The Desktop app shares its core codebase with the Android app through Kotlin Multiplatform (KMP). Most features work identically across platforms. + +## Installation + +### Linux + +- Download the `.deb` or `.AppImage` package from the releases page +- Or build from source using `./gradlew :desktopApp:run` + +### macOS + +- Download the `.dmg` package from releases +- Or build from source + +### Windows + +- Download the `.msi` installer from releases +- Or build from source + +## Connecting Your Radio + +### USB Serial (Primary) + +The most reliable connection method on Desktop: + +1. Connect your Meshtastic radio via USB cable. +2. The app should detect the serial port automatically. +3. If not detected, select the correct serial port from the connections menu. + +### TCP/IP + +For network-connected radios: + +1. Enter the radio's IP address and port (default: 4403). +2. Click **Connect**. + +### Bluetooth (BLE) + +Bluetooth Low Energy is supported on Desktop via the [Kable](https://github.com/JuulLabs/kable) library: + +1. Ensure your system has a Bluetooth adapter. +2. The app scans for nearby Meshtastic radios automatically. +3. Select your device from the connections screen. + +## Feature Parity + +| Feature | Android | Desktop | Sõnumid | +| ---------------------------------------- | ------- | ------- | -------------------------- | +| Messaging | ✓ | ✓ | Full parity | +| Node List | ✓ | ✓ | Full parity | +| Kaart | ✓ | ✓ | Full parity | +| Sätted | ✓ | ✓ | Full parity | +| Bluetooth (BLE) | ✓ | ✓ | Via Kable on desktop | +| Firmware Update OTA | ✓ | ✗ | Use web flasher | +| Notifications | ✓ | ✓ | Native OS notifications | +| Widgets | ✓ | ✗ | Android-only | +| AI Assistant (Chirpy) | ✓\* | ✗ | Google flavor Android only | + +\*Chirpy AI requires Android 14+ on Google flavor builds with supported hardware. + +## UI Differences + +The Desktop app uses the same Compose Multiplatform UI with adaptations for larger screens and desktop interaction. + +### Keyboard Shortcuts + +| Shortcut | Action | +| ------------------- | --------------------------- | +| **⌘Q** / **Ctrl+Q** | Quit the application | +| **⌘,** / **Ctrl+,** | Open Settings | +| **⌘1** / **Ctrl+1** | Switch to Conversations tab | +| **⌘2** / **Ctrl+2** | Switch to Nodes tab | +| **⌘3** / **Ctrl+3** | Switch to Map tab | +| **⌘4** / **Ctrl+4** | Switch to Connections tab | + +### Window & System Tray + +- **Window resizing** — responsive layout adapts to window dimensions +- **System tray** — minimize to system tray for background mesh operation +- **Tray menu** — right-click the tray icon to show window or quit +- **Mouse interaction** — hover states and standard desktop navigation + +### Notification Preferences + +The Desktop app provides in-app toggles for controlling which notifications are shown — messages, new nodes, and low battery alerts. Access these from **Settings → Notifications** within the app. + +## Built-in Documentation Browser + +The Desktop app includes a built-in documentation browser for quick access to help content without leaving the application. + +![Docs browser with table of contents](/assets/screenshots/docs-browser_toc.png) + +The browser supports full-text search across all documentation: + +![Searching the docs browser](/assets/screenshots/docs-browser_search.png) + +Individual doc pages render with full formatting: + +![A documentation page](/assets/screenshots/docs-browser_page.png) + +## Building from Source + +```bash +git clone https://github.com/meshtastic/Meshtastic-Android.git +cd Meshtastic-Android +git submodule update --init +./gradlew :desktopApp:run +``` + +Requirements: + +- JDK 21 +- No Android SDK required for desktop-only builds + +## Known Limitations + +- No OTA firmware updates (use web flasher) +- Some Android-specific features (widgets, specific notification channels) are unavailable +- Performance may vary on low-spec hardware running Compose Desktop +- BLE bonding is not yet supported on desktop (pairing works without bonding) + +## Related Topics + +- [Connections](connections) — connection methods overview +- [Firmware Updates](firmware) — use the [Web Flasher](https://flasher.meshtastic.org) for desktop firmware updates + +--- + diff --git a/docs/et-rEE/user/discovery.md b/docs/et-rEE/user/discovery.md new file mode 100644 index 000000000..0860f6cc4 --- /dev/null +++ b/docs/et-rEE/user/discovery.md @@ -0,0 +1,114 @@ +--- +title: Avastamine +nav_order: 12 +last_updated: 2026-05-13 +description: Explore your mesh network — traceroute paths, neighbor maps, and node discovery tools. +aliases: + - mesh-discovery + - local-discovery + - network-scan + - traceroute + - neighbor-info +--- + +# Avastamine + +Discovery tools help you understand **how** your mesh network is connected — which nodes can hear each other, what paths messages take, and where bottlenecks or weak links exist. + +> 💡 **Tip:** You don't need a dedicated "discovery mode" to start exploring your mesh. The tools below are available right now from the node list and node detail screens. + +--- + +## Marsruudi + +Traceroute reveals the exact path a message takes from your node to any other node on the mesh. It's the single most useful tool for debugging connectivity problems. + +### Running a Traceroute + +1. Navigate to **Nodes** and tap the node you want to trace. +2. On the node detail screen, tap **Traceroute**. +3. The app sends a traceroute request and waits for the response. +4. Results display each hop in order, with signal quality at every step. + +### Reading the Results + +A traceroute result looks like this: + +``` +You → Node A (SNR: 8.5, RSSI: -95) → Node B (SNR: 5.2, RSSI: -108) → Target +``` + +Each hop represents a relay node that forwarded the message. The SNR and RSSI values at each hop tell you about the link quality on that specific segment. + +| What to look for | What it means | +| -------------------------------------------------------------------------- | --------------------------------------------------------------------------- | +| All hops show Good SNR (> 5 dB) | Healthy path — messages flow reliably | +| One hop shows Bad SNR (< 0 dB) | Weak link — this relay segment is fragile | +| Many hops (4+) | Long path — consider repositioning a node to shorten it | +| Different path on retry | Mesh is adapting — multiple routes exist (this is good!) | + +> 💡 **Tip:** Run traceroute several times over a few minutes. If the path changes, your mesh has redundant routes — a sign of a well-connected network. + +### Troubleshooting with Traceroute + +- **"No route found"** — The target node may be offline, out of range, or on a different channel. Check that both nodes share at least one channel with the same encryption key. +- **Traceroute times out** — The path may be too long (exceeds hop limit) or a relay node is congested. Try increasing the hop limit in **Settings → LoRa Config**. +- **Asymmetric paths** — A traceroute from A→B may take a different path than B→A. This is normal — radio propagation is not always symmetric. + +--- + +## Naabruse teave + +The Neighbor Info module lets each node broadcast a list of the nodes it can **directly hear** (single-hop). When multiple nodes share their neighbor lists, you can piece together a topology map of the entire mesh. + +### Enabling Neighbor Info + +1. Navigate to **Settings → Module Config → Neighbor Info**. +2. Enable the module. +3. Set the broadcast interval (default: 900 seconds / 15 minutes). + +Once enabled, your node periodically broadcasts its neighbor table. Other nodes with Neighbor Info enabled do the same. + +### Viewing Neighbor Data + +- Open any node's detail screen and look for the **Neighbors** section. +- Each neighbor entry shows the node that was directly heard and its signal quality. +- Combine neighbor data from multiple nodes to understand the full mesh topology. + +> ⚠️ **Note:** Neighbor Info increases airtime usage because every enabled node periodically broadcasts its neighbor list. On busy meshes with many nodes, consider longer broadcast intervals (3600 seconds or more) to avoid congestion. + +--- + +## Node List as a Discovery Tool + +The node list itself is a powerful discovery tool when you use its filtering and sorting features effectively. + +### Finding New Nodes + +- Sort by **Last heard** to see the most recently active nodes at the top. +- Enable **Include unknown** to see nodes that have appeared on the mesh but haven't sent user info yet — these are often newly powered-on devices. + +### Assessing Connectivity + +- Sort by **Hops away** to see which nodes are directly reachable (0 hops) versus relayed. +- Sort by **Distance** to find nearby nodes and verify they're reachable. +- Use **Exclude MQTT** to focus on nodes reachable over radio (not via internet bridge). + +### Infrastructure Audit + +- Disable **Exclude infrastructure** to see Router, Repeater, Router Late, and Client Base nodes. +- Check their signal quality and last-heard times to verify your infrastructure nodes are healthy. + +See [Nodes](nodes) for full details on filtering and sorting options. + +--- + +## Tips for Mesh Exploration + +- **Start with traceroute** — it gives you immediate, actionable information about a specific path. +- **Enable Neighbor Info on key nodes** — especially routers and repeaters, to build a picture of the backbone. +- **Check the map** — node positions on the [Map](map-and-waypoints) combined with signal data help you understand why some links are strong and others are weak. +- **Compare signal over time** — use the [Signal Meter](signal-meter) guide to interpret SNR and RSSI values correctly. + +--- + diff --git a/docs/et-rEE/user/firmware.md b/docs/et-rEE/user/firmware.md new file mode 100644 index 000000000..35ef057d5 --- /dev/null +++ b/docs/et-rEE/user/firmware.md @@ -0,0 +1,114 @@ +--- +title: Firmware Updates +nav_order: 13 +last_updated: 2026-05-13 +description: Update your radio firmware over Bluetooth — OTA process, version channels, pre-flight checks, and recovery. +aliases: + - firmware + - update + - ota + - flash +--- + +# Firmware Updates + +Keep your Meshtastic radio up to date with the latest firmware for new features, bug fixes, and security improvements. + +## Checking for Updates + +1. Navigate to **Settings → Firmware Update** or tap the firmware notification if shown. +2. The app checks for available firmware versions. +3. Available updates show the version number and changelog summary. + +## Update Methods + +### OTA (Over-The-Air) via Bluetooth + +The most common update method for Android users: + +1. Ensure your radio is connected via Bluetooth. +2. Navigate to the Firmware Update screen. +3. Select the desired firmware version. +4. Tap **Update** to begin the OTA process. +5. Wait for the update to complete — **do not disconnect** during the update. + +![Firmware checking for updates](/assets/screenshots/firmware_checking.png) + +> ⚠️ **Warning:** Interrupting a firmware update can brick your device. Ensure your radio has sufficient battery (>50% recommended) and maintain Bluetooth proximity during the entire process. + +![Firmware disclaimer](/assets/screenshots/firmware_disclaimer.png) + +### USB Flashing + +For recovery or when OTA is unavailable: + +- Use the [Meshtastic Web Flasher](https://flasher.meshtastic.org) +- Or the [Meshtastic CLI tool](https://meshtastic.org/docs/getting-started/flashing-firmware) on desktop + +## Version Channels + +| Kanal | Kirjeldus | +| --------- | ------------------------------------------- | +| Stabiilne | Recommended for most users; tested releases | +| Alfa | Preview releases; may contain bugs | + +## Pre-Update Checklist + +Before updating: + +- [ ] Battery > 50% +- [ ] Stable Bluetooth connection +- [ ] Note your current settings (they may reset on major version changes) +- [ ] Check the release notes for breaking changes + +## Post-Update + +After a successful update: + +- The radio will reboot automatically +- Bluetooth connection will re-establish +- Verify your settings are intact +- Check the firmware version in **Settings → About** + +![Firmware update success](/assets/screenshots/firmware_success.png) + +## Troubleshooting + +### Update Stuck + +If the update appears frozen: + +- Wait at least 5 minutes before intervening +- If truly stuck, power-cycle the radio +- Attempt the update again + +![Firmware update error](/assets/screenshots/firmware_error.png) + +### Device Won't Boot After Update + +If your device fails to boot: + +1. Try connecting via USB to a computer +2. Use the web flasher in recovery/DFU mode +3. Flash a known-good firmware version +4. Check the Meshtastic Discord for device-specific recovery steps + +### Compatibility Warnings + +The app may show warnings when: + +- Connected radio firmware is below minimum supported version +- Major version mismatch between app and firmware +- Deprecated features need migration + +> ⚠️ **Important:** Always update the Meshtastic app before or alongside firmware updates to ensure compatibility. + +## Related Topics + +- [Connections](connections) — reconnecting after a firmware update +- [Flashing firmware guide](https://meshtastic.org/docs/getting-started/flashing-firmware) — full firmware flashing walkthrough on meshtastic.org +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — check firmware compatibility by device +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/et-rEE/user/map-and-waypoints.md b/docs/et-rEE/user/map-and-waypoints.md new file mode 100644 index 000000000..6621230c7 --- /dev/null +++ b/docs/et-rEE/user/map-and-waypoints.md @@ -0,0 +1,116 @@ +--- +title: Map & Waypoints +nav_order: 6 +last_updated: 2026-05-13 +description: View node positions on the map, create and share waypoints, and manage position sharing and privacy. +aliases: + - map + - waypoints + - gps + - location +--- + +# Map & Waypoints + +The Map screen shows the geographic positions of nodes on your mesh, along with shared waypoints. + +## Map View + +The map displays: + +- **Node positions** — colored markers for each node reporting location +- **Waypoints** — shared points of interest +- **Your position** — your current GPS location + +### Node Markers + +Node markers on the map indicate: + +| Color | Meaning | +| -------- | ---------------------------------------------- | +| Roheline | Online (heard recently) | +| Kollane | Away (heard within 2 hours) | +| Gray | Offline (stale position) | +| Sinine | Your own node | + +### Map Controls + +- **Zoom** — pinch or use +/- buttons +- **Pan** — drag to explore +- **Center** — select the location button to center on your position +- **Node tap** — tap a node marker to view details + +The floating toolbar provides quick access to compass, layer switching, node filters, refresh, and location tracking. Tap the compass to reorient north-up, or tap the location button to center on your current position. + +![Map controls overlay](/assets/screenshots/map_controls_overlay.png) + +## Waypoints + +Waypoints are shared geographic points of interest that all mesh members can see. + +### Creating a Waypoint + +1. Long-press on the map at the desired location. +2. Enter a name and optional description. +3. Choose an icon/emoji for the waypoint. +4. Tap **Send** to share with the mesh. + +### Waypoint Properties + +| Property | Kirjeldus | +| ---------- | ------------------------------------------------------- | +| Nimi | Short identifier (max 30 characters) | +| Kirjeldus | Optional longer description | +| Icon | Visual marker emoji on the map | +| Lukustatud | If locked, only the creator can edit or delete | +| Expiration | Optional auto-remove time | + +### Waypoint Expiration + +Waypoints can be set to expire automatically: + +- **Never** (default) — waypoint remains until manually deleted +- **Timed** — waypoint is automatically removed after the specified duration (e.g., "remove after 2 hours"). Useful for temporary markers like rally points, hazards, or meeting locations. + +Expired waypoints are automatically hidden from the map so they don't clutter the display. The expiration countdown begins when the waypoint is created, not when other nodes receive it. + +### Managing Waypoints + +- Tap a waypoint on the map to view its details and coordinates +- Edit or delete waypoints you created +- **Locked waypoints** cannot be modified or deleted by other nodes — only the original creator can change them +- Unlocked waypoints can be edited by any mesh member + +## Position Sharing + +### Enabling Position Sharing + +Your node shares its GPS position based on: + +- **Fixed interval** — broadcast position at regular intervals +- **Smart position** — broadcast when movement exceeds a threshold +- **Manual** — only share when explicitly requested + +Configure position behavior in **Settings → Position**. + +### Privacy Considerations + +> 🔒 **Privacy:** Position data is broadcast to all nodes on your channel. If you don't want your location shared, disable GPS position in settings or use a fixed/fake position. + +## Map Sources + +The app supports multiple map tile sources: + +- OpenStreetMap (default) +- Satellite imagery (where available) +- Offline tiles (download map areas for offline use) + +## Related Topics + +- [Nodes](nodes) — view and filter your node list +- [Node Metrics](node-metrics) — signal quality and position history for individual nodes +- [Discovery](discovery) — traceroute and neighbor info for understanding mesh topology +- [Units & Locale](units-and-locale) — distance and coordinate display formats + +--- + diff --git a/docs/et-rEE/user/messages-and-channels.md b/docs/et-rEE/user/messages-and-channels.md new file mode 100644 index 000000000..e1f3d014e --- /dev/null +++ b/docs/et-rEE/user/messages-and-channels.md @@ -0,0 +1,159 @@ +--- +title: Messages & Channels +nav_order: 3 +last_updated: 2026-05-13 +description: Send and receive messages, manage channels, configure encryption, and use quick chat, reactions, and message actions. +aliases: + - channels + - direct-messages + - messaging + - conversations +--- + +# Messages & Channels + +Meshtastic supports two communication modes: **channel broadcasts** and **direct messages**. + +## Kanal + +Channels are shared communication groups. All nodes configured with the same channel key can read and send messages on that channel. + +### Default Channel + +Every Meshtastic device comes with a default **LongFast** channel. This is an unencrypted channel used for general mesh communication. + +### Kanali turvalisus + +Channels support multiple encryption levels: + +| Icon | Security Level | Kirjeldus | +| ---- | ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------- | +| 🔒 | PSK (256-bit AES) | Fully encrypted with a strong pre-shared key. Only nodes with the matching key can read messages. | +| 🔐 | PSK (128-bit AES) | Encrypted with a shorter key. Secure for most uses but 256-bit is preferred for sensitive data. | +| 🔓 | Default / Open | Uses the well-known default key. **Any Meshtastic device** on the same preset can read these messages. | +| ⚠️ | Insecure + Position | Open channel that also broadcasts your GPS position. Use with caution in public meshes. | + +> 🔒 **Security Tip:** 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. + +### Adding a Channel + +1. Navigate to **Settings → Channels**. +2. Tap **Add Channel** or scan a QR code. +3. Configure the channel name and encryption key. +4. Share the channel URL/QR code with others who need access. + +Tapping a channel shows its details and sharing options. + +## Direct Messages + +Direct messages (DMs) are point-to-point encrypted communications between two specific nodes. + +### Sending a Direct Message + +1. Open the **Messages** tab. +2. Select a node from your contacts list or tap a node in the node list. +3. Type your message and tap **Send**. + +### Message States + +| State | Icon | Meaning | +| --------------------------------- | ---- | ----------------------------------------------------------------------------------------------------------------- | +| Queued | ⏳ | Message waiting to be sent | +| En route | ✓ | Delivered to the radio, awaiting acknowledgment | +| Delivered | ✓✓ | Acknowledgment received from recipient | +| Received | ✓ | Message received from the mesh (incoming) | +| S&F Routing | 🔗 | Store & Forward: message being routed through an S&F node | +| S&F Confirmed | 🔗 | Store & Forward: delivery confirmed via S&F node | +| Tõrge | ✗ | Delivery failed after retries | + +### Delivery Errors + +When a message fails to deliver, the error indicator shows what went wrong: + +| Tõrge | Meaning | What to Do | +| ---------------- | ---------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| No Route | No path exists to the destination node | The recipient may be offline or out of mesh range. Try later or move closer. | +| Got NAK | The next-hop node refused to relay | The relay node may be congested. Wait and retry. | +| Aegunud | No acknowledgment within retry window | The recipient may be just out of range. Try increasing hop limit or moving to a better position. | +| Liidest pole | No radio interface available to send | Check that your radio is connected and the channel is configured. | +| Max Retransmit | All retry attempts exhausted | The mesh path is unreliable. Try a different channel or wait for conditions to improve. | +| Kanalit pole | The destination channel doesn't exist | Verify both nodes share the same channel configuration. | +| Too Large | Message exceeds maximum payload size | Shorten your message (max ~230 characters). | +| Vastust pole | Node received message but didn't respond | The recipient's radio may be busy or in low-power sleep mode. | +| Duty Cycle Limit | Regional airtime limit reached | Your radio has used its allowed transmit time. Wait for the duty cycle window to reset (typically 1 hour in EU regions). | +| Vigane päring | Malformed or invalid message | This usually indicates a software bug. Try restarting the app. | + +> 💡 **Tip:** 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. + +## Message Features + +### Quick Chat + +Pre-configured messages for rapid communication: + +- Access via the Quick Chat button in the message input area +- Choose from built-in phrases or custom messages +- Customize quick chat messages in **Settings → Quick Chat** +- Useful when typing is impractical (gloves, small screen, urgent) + +![Quick chat option](/assets/screenshots/messages_quick_chat.png) + +The channel list shows each channel with its latest message preview. + +### Message Bubbles + +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. + +### Reactions + +React to messages with emoji: + +- **Long-press** a message to open the actions menu +- Tap **Add Reaction** to choose an emoji +- Reactions appear below the message bubble +- Multiple users can react to the same message +- React to your own messages or others' messages + +![Emoji reaction badges displayed beneath a message](/assets/screenshots/messages_reaction.png) + +> 💡 **Tip:** Reactions are lightweight — they use minimal mesh bandwidth compared to full text messages. + +### Message Actions + +Long-press any message to access: + +- **Copy** — copy message text to clipboard +- **Reply** — quote the message in your response +- **React** — add an emoji reaction +- **Delete** — remove a message you sent (local deletion) + +### Message Priority + +Messages are queued and transmitted based on priority: + +1. Emergency/alert messages (highest) +2. Direct messages +3. Channel broadcasts (lowest) + +### Message Limits + +- **Maximum length:** 237 bytes (approximately 230 characters for ASCII text) +- **Rate limiting:** The mesh enforces airtime fairness; heavy message volume may be throttled +- **Delivery:** Messages are retried automatically if no acknowledgment is received + +## Best Practices + +- Use channels for group coordination +- Use direct messages for private person-to-person communication +- Keep messages short — mesh bandwidth is limited +- Configure encryption for sensitive communications + +## Related Topics + +- [Nodes](nodes) — tap a node to start a direct message +- [Settings — Radio & User](settings-radio-user) — configure channel encryption and presets +- [MQTT](mqtt) — bridge channel messages to the internet +- [Channel configuration](https://meshtastic.org/docs/configuration/radio/channels) — detailed channel settings on meshtastic.org + +--- + diff --git a/docs/et-rEE/user/mqtt.md b/docs/et-rEE/user/mqtt.md new file mode 100644 index 000000000..0f2e16849 --- /dev/null +++ b/docs/et-rEE/user/mqtt.md @@ -0,0 +1,137 @@ +--- +title: MQTT +nav_order: 11 +last_updated: 2026-05-13 +description: Bridge your mesh to the internet — MQTT broker setup, encryption layers, and map reporting. +aliases: + - mqtt + - internet-bridge + - broker +--- + +# MQTT + +MQTT bridges your Meshtastic mesh network to the internet, enabling long-range communication beyond radio range. + +## Overview + +The MQTT module connects your node to an MQTT broker, allowing: + +- Messages to reach nodes on different physical meshes via the internet +- Integration with home automation and monitoring systems +- Publishing node positions to the public Meshtastic map +- Custom data pipelines for logging and alerting + +## How It Works + +``` +[Your Node] → Radio → [Gateway Node with WiFi] → MQTT Broker → [Remote Gateway] → Radio → [Remote Node] +``` + +A gateway node with internet access (WiFi or Ethernet) publishes mesh messages to an MQTT topic. Remote gateways subscribed to the same topic inject those messages into their local mesh. + +## Sätted + +### Enabling MQTT + +1. Navigate to **Settings → Module Config → MQTT**. +2. Enable the MQTT module. +3. Configure the broker connection: + +![MQTT toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | Kirjeldus | Vaikimisi | +| --------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------- | +| Server Address | MQTT broker hostname | mqtt.meshtastic.org | +| Kasutajatunnus | Broker authentication | meshdev | +| Parool | Broker authentication | large4cats | +| Root Topic | Base topic for messages | msh | +| Encryption | Encrypt MQTT payload | Lubatud | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON packet support has been removed from firmware; this field is ignored | Disabled | +| TLS | Secure connection to broker | Disabled | +| Map Reporting | Report position to public map | Disabled | + +### Default Meshtastic Broker + +The community maintains a public broker at `mqtt.meshtastic.org`. This is intended for general use and testing. + +> 🔒 **Privacy:** Messages on the public broker are readable by anyone subscribed. Always use channel encryption for private communications. + +### Private Broker + +For better privacy and control, you can run your own MQTT broker: + +- Mosquitto (lightweight, open-source) +- HiveMQ +- EMQX + +Configure your node to point to your private broker with appropriate credentials. + +## Map Reporting + +When Map Reporting is enabled, your node publishes its position to the Meshtastic community map: + +- Visible at [meshmap.net](https://meshmap.net) and similar community map services +- Only position and node info are shared +- Disable this if you don't want your location publicly visible + +## Uplink vs Downlink + +| Direction | Kirjeldus | +| ------------ | -------------------------------- | +| **Uplink** | Messages from mesh → MQTT broker | +| **Downlink** | Messages from MQTT broker → mesh | + +Configure per-channel which directions are active to control message flow and airtime usage. + +## Message Formats + +MQTT uses protobuf message format: + +| Format | Kirjeldus | Use case | +| ------------ | ----------------------------------- | -------------------------- | +| **Protobuf** | Binary Meshtastic protobuf encoding | Node-to-node mesh bridging | + +> ⚠️ **Note:** JSON output support was removed from firmware. The `json_enabled` setting is still visible in the app for legacy compatibility but has no effect on current firmware versions. + +## Encryption & Privacy + +Understanding the layered encryption model: + +1. **Channel encryption** happens on the mesh _before_ MQTT. If your channel has a PSK, the MQTT payload is already encrypted — the broker and any subscribers see only the ciphertext. +2. **MQTT encryption** (the module setting) adds an additional encryption layer for transit to the broker. This protects metadata and routing information. +3. **TLS** encrypts the TCP connection to the broker itself, preventing network-level eavesdropping. + +> 🔒 **Important:** The default public channel has a well-known key. Messages on the default channel sent via MQTT are effectively **unencrypted** — anyone can decode them. Always use a custom PSK for private communications. + +## Best Practices + +- Use channel-level encryption (PSK) on channels that bridge to MQTT +- Don't enable MQTT on nodes without internet access (it will buffer and waste memory) +- Use a private broker for sensitive deployments +- Be mindful of airtime when downlinking messages from busy MQTT topics — every downlinked message consumes radio airtime on your local mesh +- Consider enabling uplink-only if you only need to monitor your mesh remotely without injecting messages back + +## Troubleshooting + +### MQTT Not Connecting + +- **Check WiFi** — the gateway node must have an active internet connection (WiFi or Ethernet). MQTT does not work over the LoRa radio link itself. +- **Verify credentials** — incorrect username or password will silently fail on most brokers. Double-check for trailing spaces. +- **Firewall** — port 1883 (MQTT) or 8883 (MQTT+TLS) must be open. Some networks block non-standard ports. +- **DNS resolution** — if using a custom broker hostname, verify the node can resolve it. Try the broker's IP address directly. + +### Messages Not Bridging + +- **Check uplink/downlink settings** — if only uplink is enabled, messages flow from mesh to MQTT but not back. Enable downlink on the receiving gateway. +- **Channel mismatch** — both gateways must share the same channel with the same PSK. A mismatch means messages are encrypted with different keys and appear as garbage. +- **Topic mismatch** — ensure both gateways use the same root topic. The default `msh` works for the public broker. + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — MQTT module configuration reference +- [Messages & Channels](messages-and-channels) — channel encryption and PSK setup +- [MQTT integration guide](https://meshtastic.org/docs/software/integrations/mqtt) — detailed MQTT documentation on meshtastic.org + +--- + diff --git a/docs/et-rEE/user/node-metrics.md b/docs/et-rEE/user/node-metrics.md new file mode 100644 index 000000000..28296aa89 --- /dev/null +++ b/docs/et-rEE/user/node-metrics.md @@ -0,0 +1,130 @@ +--- +title: Node Metrics +nav_order: 5 +last_updated: 2026-05-13 +description: Telemetry dashboards for each mesh node — device health, environment sensors, signal quality, power, traceroute, and position history. +aliases: + - metrics + - telemetry + - device-metrics + - signal +--- + +# Node Metrics + +The node detail screen provides comprehensive telemetry and metrics for each node on your mesh. + +## Seadme mõõdikud + +Basic operating information reported by each node: + +| Metric | Kirjeldus | +| -------------- | ----------------------------------- | +| Battery Level | Current battery percentage | +| Vool | Battery voltage reading | +| Kanali kasutus | Percentage of airtime consumed | +| Airtime | Transmission time used by this node | +| Töötamise aeg | Time since last reboot | + +Device metrics are displayed as individual cards with trend sparklines showing battery level, voltage, channel utilization, airtime, and uptime over time. + +> 💡 **Tip:** Tap any metric card to expand it into a full chart with historical data points. Pinch to zoom the time axis. + +## Keskkonnamõõdikud + +Environmental sensor data (requires compatible hardware): + +| Metric | Sensor Examples | +| ------------------------------------ | --------------------- | +| Temperatuur | BME280, BME680, SHT31 | +| Niiskus | BME280, BME680, SHT31 | +| Baromeetri rõhk | BME280, BMP280 | +| Gaasi surve | BME680 | +| IAQ (Air Quality) | BME680 | + +Environment metrics are charted over time for easy trend analysis — temperature, humidity, and pressure each get their own line chart with the measurement unit displayed on the Y axis. + +> 💡 **Tip:** Environment metrics require a sensor connected to the remote node. Not all nodes report environmental data. See [Telemetry & Sensors](telemetry-and-sensors) for a full list of supported sensors. + +## Signaali mõõdikud + +Radio signal quality information: + +| Metric | Kirjeldus | +| --------- | ----------------------------------------------------------------------------- | +| SNR | Signal-to-Noise Ratio (higher is better) | +| RSSI | Received Signal Strength Indicator (closer to 0 is better) | +| Hop Count | Number of mesh hops for last message | + +### Signal Quality Reference + +| SNR Range | Quality | +| --------------------------------- | --------- | +| > 10 dB | Excellent | +| 0 to 10 dB | Hea | +| -10 to 0 dB | Rahuldav | +| < -10 dB | Poor | + +## Võimsusnäitajad + +Power management telemetry (requires INA sensor or compatible hardware): + +| Metric | Kirjeldus | +| ----------- | ----------------------- | +| Bus Voltage | Supply voltage | +| Pinge | Power draw in milliamps | +| Toide | Calculated wattage | + +## Marsruudi + +Traceroute shows the path a message takes through the mesh: + +1. From the node detail screen, tap **Traceroute**. +2. The app sends a traceroute request to the target node. +3. Results show each hop with SNR/RSSI values. + +### Reading Traceroute Results + +``` +You → Node A (SNR: 8.5) → Node B (SNR: 5.2) → Target +``` + +Each hop represents a relay node that forwarded the message. + +## Asukoha logi + +Historical position data for nodes that share their location: + +- GPS coordinates +- Kõrgus +- Speed (if moving) +- Timestamp for each position report + +## Naabruse teave + +Shows which nodes a given node can directly hear, useful for understanding mesh topology. + +## Viewing Metrics + +1. Navigate to **Nodes**. +2. Tap the node you want to inspect. +3. Select the metric category from the detail tabs. + +![Node detail — local device](/assets/screenshots/nodes_detail_local.png) + +The position tab shows location data for nodes that share GPS: + +![Position inline content](/assets/screenshots/nodes_position.png) + +> ⚠️ **Note:** Metrics are only available when they have been reported by the remote node. Metrics update at intervals configured on each node's telemetry settings. + +## Related Topics + +- [Nodes](nodes) — node list, filtering, and sorting +- [Telemetry & Sensors](telemetry-and-sensors) — supported sensors and configuration +- [Signal Meter](signal-meter) — how signal quality is calculated from SNR and RSSI +- [Discovery](discovery) — traceroute details and neighbor info +- [Units & Locale](units-and-locale) — temperature, distance, and speed display formats + +--- + diff --git a/docs/et-rEE/user/nodes.md b/docs/et-rEE/user/nodes.md new file mode 100644 index 000000000..13aa6b1d1 --- /dev/null +++ b/docs/et-rEE/user/nodes.md @@ -0,0 +1,152 @@ +--- +title: Sõlmed +nav_order: 4 +last_updated: 2026-05-13 +description: Browse, filter, and sort mesh nodes — view details, signal quality, roles, and quick actions. +aliases: + - node-list + - mesh-nodes + - peers +--- + +# Sõlmed + +The Nodes screen displays all devices visible on your mesh network. + +## Node List + +The node list shows every node your radio has heard, including: + +- **Node name** — user-configured long name +- **Short name** — 4-character identifier +- **Signal quality** — last heard signal strength +- **Last heard** — time since last communication +- **Distance** — estimated distance (if positions are shared) +- **Battery** — remote node battery level (if telemetry is enabled) + +### Node Status Indicators + +| Badge | Meaning | +| ---------- | ------------------------------------- | +| 🟢 Online | Node heard within the last 15 minutes | +| 🟡 Away | Node heard within the last 2 hours | +| 🔴 Offline | Node not heard for over 2 hours | +| ⭐ Favorite | Node marked as favorite by the user | + +### Node Roles + +Nodes can be configured with different roles that affect their mesh behavior: + +| Roll | Kirjeldus | +| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Klient | Standard end-user device | +| Klient-baas | Treats favorited-node traffic as Router Late priority; all other traffic as Client | +| Vaikne klient | Receives but doesn't retransmit | +| Peidetud klient | Like Client Mute, plus hides from node list | +| Ruuter | Prioritizes message forwarding; stays awake to relay | +| Hiline ruuter | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | +| ~~Router Client~~ | ⚠️ **Deprecated** (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | +| ~~Repeater~~ | ⚠️ **Deprecated** (removed in firmware 2.7.11) — no longer selectable; use Router instead | +| Jälgitav | Optimized for position reporting at regular intervals | +| Andur | Optimized for telemetry reporting | +| TAK | Interoperates with TAK systems (sends/receives CoT) | +| Jälgitav TAK | TAK position reporting only | +| Lost & Found | Continuous position beacon for recovery | + +### Choosing a Role + +Most users should keep the default **Client** role. Consider a different role when: + +- **Router** — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don't use Router on battery-powered handheld devices. +- **Router Late** — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. +- **Client Base** — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. +- **Client Mute** — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only devices or to reduce congestion in dense areas. +- **Tracker** — An unattended device whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. +- **Sensor** — An unattended device reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. +- **TAK / TAK Tracker** — Only needed if interoperating with ATAK/WinTAK systems. See [TAK Integration](tak) for details. + +> 💡 **Tip:** The mesh works best when most nodes are **Client** or **Router**. Too many Mute nodes reduces mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. + +### Encryption Indicators + +Nodes display encryption status icons next to their name: + +| Icon | Meaning | +| ----------- | ------------------------------------------------------------------------------------------------------------------- | +| 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | +| 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | +| ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) | + +> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. + +## Quick Actions + +From the node list, you can: + +- **Tap** a node to view its detail page +- **Long-press** for quick actions: + - Send a direct message + - Vaata kaardil + - Küsi asukohta + - Mark as favorite + - Marsruudi + +## Filtering & Sorting + +### Text Search + +Type in the search field to filter nodes by name or short name. The filter updates in real time as you type. + +### Filter Toggles + +| Filtreeri | Kirjeldus | +| -------------------------- | ---------------------------------------------------------------------------------------------- | +| **Only online** | Show only nodes heard within the last 15 minutes | +| **Only direct** | Show only nodes with direct (non-relayed) connections | +| **Include unknown** | Show nodes that haven't sent user info yet | +| **Exclude infrastructure** | Hide infrastructure-role nodes (Router, Repeater, Router Late, Client Base) | +| **Exclude MQTT** | Hide nodes heard only via MQTT internet bridge | +| **Show ignored** | Show nodes you've previously dismissed or muted | + +### Sort Options + +| Sort | Kirjeldus | +| ------------------------------------------- | ------------------------------------------------------------------ | +| **Last heard** (default) | Most recently heard nodes first | +| **Alphabetical** | Sorted by node long name | +| **Distance** | Nearest nodes first (requires position sharing) | +| **Hops away** | Fewest relay hops first | +| **Channel** | Grouped by channel index | +| **Via MQTT** | Grouped by MQTT vs. radio-heard | +| **Favorites** | Favorited nodes first | + +## Node Detail + +Tapping a node opens the detail view with comprehensive information. See [Node Metrics](node-metrics) for full details on metrics and telemetry. + +![Node detail view](/assets/screenshots/nodes_node_list.png) + +The detail screen includes device info, position, and action buttons: + +![Node detail section](/assets/screenshots/nodes_detail_section.png) + +Inline status indicators show key metrics at a glance: + +| Indicator | Screenshot | +| --------------- | -------------------------------------------------------- | +| Signal quality | ![Signal](/assets/screenshots/nodes_signal_info.png) | +| Battery level | ![Battery](/assets/screenshots/nodes_battery_info.png) | +| Hop count | ![Hops](/assets/screenshots/nodes_hops_info.png) | +| Viimati kuuldud | ![Last heard](/assets/screenshots/nodes_last_heard.png) | +| Kaugus | ![Distance](/assets/screenshots/nodes_distance_info.png) | + +## Related Topics + +- [Node Metrics](node-metrics) — detailed telemetry dashboards for each node +- [Messages & Channels](messages-and-channels) — send a direct message to a node +- [Map & Waypoints](map-and-waypoints) — view node positions geographically +- [Discovery](discovery) — traceroute and neighbor info for topology exploration +- [Signal Meter](signal-meter) — understand what the signal bars mean + +--- + diff --git a/docs/et-rEE/user/onboarding.md b/docs/et-rEE/user/onboarding.md new file mode 100644 index 000000000..3b910534e --- /dev/null +++ b/docs/et-rEE/user/onboarding.md @@ -0,0 +1,99 @@ +--- +title: Getting Started +nav_order: 1 +last_updated: 2026-05-13 +description: First-launch setup — permissions, onboarding flow, and next steps after connecting your radio. +aliases: + - first-launch + - setup + - intro +--- + +# Getting Started + +Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app. + +## First Launch + +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. + +### Welcome Screen + +The welcome screen introduces Meshtastic and its core capabilities: + +- Off-grid mesh communication +- No cellular or internet required +- End-to-end encrypted messaging + +Tap **Get Started** to proceed through the setup flow. + +![Welcome screen](/assets/screenshots/onboarding_welcome.png) + +## Permissions + +The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. + +### Bluetooth Permission + +Bluetooth is the primary connection method between your phone and Meshtastic radio: + +- **Bluetooth scanning** — discover nearby Meshtastic radios +- **Bluetooth connect** — establish and maintain connections with paired radios + +Grant both permissions when prompted. Without Bluetooth, you'll need to use USB or TCP connections instead. + +### Location Permission + +> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. + +Meshtastic also uses your location for: + +- Showing your position on the mesh map +- Calculating distances to other nodes +- Sharing your GPS coordinates with other mesh members (if enabled) + +Grant **"While using the app"** or **"Always"** depending on your preference: + +- **While using the app** — position updates only when the app is open +- **Always** — enables background position updates for always-on mesh presence + +If denied, Bluetooth scanning will not function and your node will not report a position. + +### Notifications Permission + +Notifications alert you to: + +- Incoming messages from channels and direct messages +- Connection status changes (connected, disconnected, reconnecting) +- Firmware update availability + +> 💡 **Tip:** You can fine-tune notification preferences later in Android system settings. The app creates separate notification channels for messages, connection events, and background service status. + +### Critical Alerts Permission + +On supported devices, the app may request permission for critical alerts: + +- These are high-priority notifications that can break through Do Not Disturb mode +- Useful for emergency mesh alerts or urgent messages +- You can **skip** this step if you don't need breakthrough notifications +- Configure or revoke later in Android notification settings + +## After Setup + +Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. + +> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. + +## What's Next? + +Once connected to a radio, explore: + +- [Connections](connections) — pair your first radio device +- [Messages & Channels](messages-and-channels) — send your first message +- [Nodes](nodes) — see who's on your mesh +- [Map & Waypoints](map-and-waypoints) — view node positions +- [Settings](settings-radio-user) — configure your radio and user profile + +New to Meshtastic? The [getting started guide](https://meshtastic.org/docs/getting-started) on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup. + +--- diff --git a/docs/et-rEE/user/settings-module-admin.md b/docs/et-rEE/user/settings-module-admin.md new file mode 100644 index 000000000..7ee05661f --- /dev/null +++ b/docs/et-rEE/user/settings-module-admin.md @@ -0,0 +1,246 @@ +--- +title: Settings — Modules & Admin +nav_order: 8 +last_updated: 2026-05-13 +description: Configure optional feature modules (MQTT, telemetry, canned messages, TAK, and more) and perform device administration. +aliases: + - modules + - module-config + - administration +--- + +# Settings — Modules & Admin + +Configure optional feature modules and perform device administration. Modules extend Meshtastic with specialized capabilities — each can be independently enabled or disabled. + +> 💡 **Tip:** You only need to enable the modules you actually use. Disabling unused modules reduces airtime, saves battery, and simplifies your configuration. + +Module settings use a card-based layout with toggle switches, dropdowns, text fields, and sliders: + +![Toggle switch](/assets/screenshots/settings_switch.png) + +![Dropdown selector](/assets/screenshots/settings_dropdown.png) + +![Text field](/assets/screenshots/settings_text_field.png) + +![Settings card layout](/assets/screenshots/settings_titled_card.png) + +## Module Configuration + +### MQTT Module + +Bridges mesh messages to and from an MQTT broker for internet connectivity. This is how you extend your mesh beyond radio range or integrate with home automation systems. + +| Setting | Kirjeldus | +| --------------- | ------------------------------------------------------------------------ | +| Lubatud | Toggle MQTT bridge | +| Server | MQTT broker address | +| Kasutajatunnus | Authentication username | +| Parool | Authentication password | +| Encryption | Encrypt MQTT payloads | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON support removed from firmware; field is ignored | +| TLS | Use secure connection | +| Root Topic | Base MQTT topic path | +| Map Report | Publish position for public map | + +See [MQTT](mqtt) for a detailed usage guide including encryption, privacy, and broker setup. + +### Serial Module + +Enables serial port communication for external device integrations (GPS modules, sensors, or custom hardware). When enabled, the node's serial port can send and receive protobuf or text data, allowing external microcontrollers or computers to interact with the mesh. + +| Setting | Kirjeldus | +| ---------- | ------------------------------- | +| Lubatud | Activate serial communication | +| Echo | Echo received serial data back | +| Mode | Text, Protobuf, or NMEA output | +| RX/TX Pins | GPIO pins for serial connection | +| Baud Rate | Serial communication speed | + +### External Notification Module + +Controls buzzer, LED, or vibration alerts on your radio hardware. Useful for devices that need to physically signal when a message arrives — particularly helpful for unattended or outdoor installations. + +| Setting | Kirjeldus | +| -------------------------------- | --------------------------- | +| Lubatud | Activate notifications | +| Alert Message | Notify on incoming messages | +| Alert Message Buzzer | Use buzzer for messages | +| Alert Message Vibra | Use vibration for messages | +| Alert Bell | Notify on bell character | +| Output (GPIO) | Pin for notification output | +| Active | High or Low active | +| Duration (ms) | Notification length | +| Use I2S as Buzzer | Use I2S audio output | + +### Store & Forward Module + +Buffers messages for nodes that were temporarily offline, then replays them when those nodes reconnect. Essential for meshes where nodes go in and out of range regularly — ensures messages aren't lost during brief disconnections. + +| Setting | Kirjeldus | +| ------------------------------------------ | -------------------------- | +| Lubatud | Activate store and forward | +| Heartbeat (s) | Announcement interval | +| Records | Maximum stored messages | +| History Return (max) | Max messages to replay | +| History Return (window) | Time window for replay | + +> 💡 **Tip:** Store and Forward works best on nodes with ample memory (ESP32 with PSRAM). Router nodes are ideal candidates since they're typically always-on. + +### Range Test Module + +Automated range testing tool for evaluating link quality between nodes. When enabled, the node periodically transmits test messages with incrementing counters. A receiver node logs these messages, allowing you to walk or drive away and later analyze at what distance messages stopped arriving. + +| Setting | Kirjeldus | +| -------------------------------------- | --------------------------------- | +| Lubatud | Activate range testing | +| Sender Interval (s) | Time between test transmissions | +| Save CSV | Log received test data to SD card | + +### Telemetry Module + +Controls what telemetry data your node shares with the mesh. Telemetry includes device health (battery, uptime) and environmental sensor data (temperature, humidity, pressure). + +| Setting | Kirjeldus | +| ---------------------------- | --------------------------------------- | +| Device Metrics Interval | How often to report device metrics | +| Environment Metrics Interval | How often to report environment sensors | +| Air Quality Enabled | Report particulate sensor data | +| Power Metrics Enabled | Report power usage | + +See [Telemetry & Sensors](telemetry-and-sensors) for supported sensors and configuration recommendations. + +### Canned Message Module + +Pre-configured messages accessible from the device's physical buttons (for radios with rotary encoders, keypads, or similar input hardware). Define a list of quick-send messages that can be transmitted without a phone connected — ideal for field use. + +| Setting | Kirjeldus | +| ------------------ | ----------------------------------------------------------- | +| ~~Enabled~~ | ⚠️ **Deprecated** — current firmware may ignore this toggle | +| Sõnumid | Newline-separated list of messages | +| Send Bell | Play bell sound on send | +| Rotary Encoder | Enable rotary encoder input | +| Up/Down/Press Pins | GPIO pin assignments for input | + +### Audio Module + +Codec2 audio support for low-bandwidth voice communication over the mesh. This is an **experimental** feature that encodes voice into very small data packets using the Codec2 codec. + +| Setting | Kirjeldus | +| --------------- | -------------------------------- | +| Lubatud | Activate audio module | +| Codec2 Rate | Audio quality/bandwidth tradeoff | +| I2S Word Select | GPIO pin for I2S WS | +| I2S Data In | GPIO pin for I2S DIN | +| I2S Data Out | GPIO pin for I2S DOUT | + +> ⚠️ **Note:** Audio requires specific hardware (I2S microphone and speaker). Voice quality is very low-bandwidth — think "understandable radio voice," not phone-call quality. + +### Remote Hardware Module + +GPIO control over the mesh network. Allows a remote node to read or write GPIO pins on another node — useful for activating relays, reading switches, or controlling external hardware from a distance. + +| Setting | Kirjeldus | +| -------------------- | --------------------------------------------------------------- | +| Lubatud | Activate remote GPIO access | +| Allow Undefined Pins | Allow access to any GPIO pin (security risk) | + +> ⚠️ **Warning:** Enabling "Allow Undefined Pins" gives remote nodes access to all GPIO pins, which could interfere with the radio's own hardware. Only enable on dedicated GPIO nodes. + +### Neighbor Info Module + +Broadcasts information about directly heard neighbors, enabling mesh topology mapping. Each enabled node periodically shares a list of the other nodes it can hear and their signal quality. + +| Setting | Kirjeldus | +| -------------------------------------- | ------------------------------------ | +| Lubatud | Activate neighbor broadcasting | +| Update Interval (s) | How often to broadcast neighbor list | + +See [Discovery](discovery) for how to use neighbor data for mesh topology exploration. + +### Ambient Lighting Module + +Controls onboard NeoPixel or other addressable RGB LEDs on supported hardware. Can be used for visual status indicators, notification lights, or decorative effects. + +| Setting | Kirjeldus | +| ------------------ | ---------------------------------------------------------- | +| Lubatud | Activate LED control | +| LED State | On, Off, or set specific color | +| Red / Green / Blue | Individual color channel values (0–255) | + +### Detection Sensor Module + +Turns your node into a motion or door sensor alert system. When a GPIO pin detects a state change (motion detected, door opened), the node broadcasts an alert message over the mesh. + +| Setting | Kirjeldus | +| ---------------------------------------- | ----------------------------------------------------------------------- | +| Lubatud | Activate detection sensor | +| Monitor Pin | GPIO pin connected to sensor | +| Detection Triggered High | Trigger when pin goes high (vs. low) | +| Minimum Broadcast (s) | Minimum time between alert broadcasts | +| State Broadcast (s) | Periodic state broadcast interval | +| Send Bell | Include bell character in alerts | +| Friendly Name | Custom name for this sensor | + +### Paxcounter Module + +People counter using WiFi and BLE probe requests. Counts nearby devices by passively listening for probe requests that phones and laptops emit when scanning for networks. Available only on ESP32 devices. + +| Setting | Kirjeldus | +| -------------------------------------- | -------------------------- | +| Lubatud | Activate people counting | +| Update Interval (s) | How often to report counts | + +> 💡 **Tip:** Paxcounter is useful for estimating foot traffic at trailheads, event venues, or other locations. Counts are approximate — one person may carry multiple devices. + +### TAK Module + +Team Awareness Kit integration for interoperability with ATAK and WinTAK. See [TAK Integration](tak) for detailed setup and usage. + +## Haldus + +### Kaughaldus + +Remotely configure nodes that share your admin key: + +1. Select the target node in the node list. +2. Navigate to **Settings** for that node. +3. Modify configuration. +4. Tap **Save** — changes are sent over the mesh. + +> ⚠️ **Requires:** Admin key configured on both your node and the target node. + +### Tühjenda sõlmede andmebaas + +Removes stale nodes from your local database that haven't been heard in a configurable time window. + +### Factory Reset + +Resets all settings to factory defaults. **This cannot be undone.** + +### Taaskäivita + +Remotely reboot a connected or administered node. + +### Arendaja paneel + +View detailed diagnostic information: + +- Protocol buffers debug output +- Mesh packet log +- Connection state details + +### Troubleshooting Remote Admin + +- **"No response from target node"** — the target may be out of range, offline, or have a mismatched admin key. Verify the admin key matches on both nodes. +- **Changes not applying** — some settings require a reboot to take effect. Try the Reboot action after saving. +- **Can't see remote settings** — ensure your node has the admin key for the target node and that Admin Channel is enabled in Security Config. + +## Related Topics + +- [Settings — Radio & User](settings-radio-user) — core radio and user profile settings +- [Module configuration reference](https://meshtastic.org/docs/configuration/module) — detailed module docs on meshtastic.org +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/et-rEE/user/settings-radio-user.md b/docs/et-rEE/user/settings-radio-user.md new file mode 100644 index 000000000..7614d63d5 --- /dev/null +++ b/docs/et-rEE/user/settings-radio-user.md @@ -0,0 +1,173 @@ +--- +title: Settings — Radio & User +nav_order: 7 +last_updated: 2026-05-13 +description: Configure your radio hardware, LoRa presets, user profile, position sharing, power management, and security. +aliases: + - sätted + - radio-config + - user-config + - lora +--- + +# Settings — Radio & User + +Configure your radio hardware and user identity parameters. + +## User Settings + +### User Profile + +| Setting | Kirjeldus | +| ----------------- | ------------------------------------------------------------------------------------- | +| Täis nimi | Your display name (up to 39 characters) | +| Lühi nimi | 4-character abbreviated name | +| Licensed Operator | Enable if you hold an amateur radio license (enables higher power) | + +### Applying Changes + +After modifying settings, tap **Save** to write the configuration to your radio. The device may reboot to apply changes. + +## Radio Configuration + +### Seadme sätted + +| Setting | Kirjeldus | Vaikimisi | +| ------------------------------------------ | ----------------------------------------------------------------------- | --------- | +| Roll | Node behavior (Client, Router, etc.) | Klient | +| Kordusülekannete režiim | How the node retransmits messages | Kõik | +| Node Info Broadcast (s) | Interval for broadcasting node info | 10800 | +| Double-tap Button | Action for double-tap button press | Disabled | + +### LoRa sätted + +| Setting | Kirjeldus | Vaikimisi | +| ----------------- | ----------------------------------------------------------------------- | ----------------------------------------- | +| Regioon | Regulatory region for frequency bands | Unset (must configure) | +| Modemi vaikesäte | Speed/range tradeoff | LongFast | +| Hop Limit | Maximum retransmit hops | 3 | +| TX Power | Transmission power (dBm); 0 = max allowed for region | 0 (region max) | +| Frequency Offset | Fine-tune frequency (MHz) | 0 | +| Channel Bandwidth | Bandwidth setting | Default for preset | + +> ⚠️ **Important:** You **must** set your region before transmitting. Operating without the correct region may violate local radio regulations. See the [region configuration guide](https://meshtastic.org/docs/getting-started/initial-config) on meshtastic.org for details. + +### Modem Presets + +| Preset | Range | Kiirus | SNR Limit | Best For | +| ------------------ | ----------------------- | ------------------------- | ------------------------ | -------------------------------------------------------------------------------------------------------- | +| Short Turbo | ~1 km | 21.9 kbps | −5 dB | Dense urban with line-of-sight; data-heavy applications | +| Short Fast | ~3 km | 10.9 kbps | −7.5 dB | Urban neighborhoods; buildings within a few blocks | +| Short Slow | ~5 km | 5.5 kbps | −10 dB | Suburban short-range; moderate building density | +| Medium Fast | ~5 km | 5.5 kbps | −10 dB | Suburban areas; moderate building density | +| Medium Slow | ~8 km | 1.1 kbps | −12.5 dB | Suburban/rural; moderate range with slower speed | +| Long Turbo | ~10 km | 4.4 kbps | −10 dB | Similar range to Long Fast but with 500 kHz bandwidth; faster throughput | +| Long Fast | ~10 km | 1.1 kbps | −12.5 dB | **General use (default)** — balanced range and speed | +| Long Moderate | ~20 km | 0.34 kbps | −15 dB | Rural with some terrain; occasional use | +| Lite Fast | ~5 km | 5.5 kbps | −10 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Medium Fast | +| Lite Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Long Fast | +| Narrow Fast | ~5 km | 2.7 kbps | −10 dB | EU 868 MHz band (62.5 kHz BW); avoids interference with other devices | +| Narrow Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 868 MHz band (62.5 kHz BW); comparable to Long Fast | +| ~~Long Slow~~ | ~30 km | 0.18 kbps | −17.5 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | +| ~~Very Long Slow~~ | ~40+ km | 0.09 kbps | −20 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | + +#### Choosing a Modem Preset + +The modem preset controls the fundamental tradeoff between **range** and **data rate**: + +- **Slower presets** use more spreading, making signals decodable at weaker signal levels (lower SNR limit). This means longer range but fewer bytes per second. +- **Faster presets** pack more data per transmission but require a stronger signal to decode. + +**Practical guidance:** + +- **Urban mesh (many nodes, short distances):** Use **Long Fast** (default) or **Short Fast**. Higher speed means less airtime congestion when many nodes share the channel. +- **Rural/sparse mesh (few nodes, long distances):** Use **Long Moderate**. Range matters more than speed when nodes are far apart. +- **EU 866/868 MHz regulatory compliance:** Use **Lite Fast**, **Lite Slow**, **Narrow Fast**, or **Narrow Slow** — these are optimized for the EU SRD/868 MHz bands with narrower bandwidths. +- **Fixed infrastructure links:** Use **Short Turbo** or **Long Turbo** for dedicated point-to-point links with good antennas and line-of-sight. +- **Mixed environments:** Stick with **Long Fast** — it's the community default and ensures compatibility with others in your area. + +> ⚠️ **Important:** All nodes on the same channel **must** use the same modem preset. Nodes with mismatched presets cannot communicate even if they share the same frequency and encryption key. + +> 💡 **Tip:** The range estimates above assume flat terrain and modest antennas. Elevation advantage (hilltop, rooftop) dramatically increases effective range. A well-placed Router with Long Fast can often outperform a ground-level node with Long Slow. + +### Ekraani sätted + +| Setting | Kirjeldus | +| ------------------- | ------------------------------------------------------------------------------------ | +| Screen Timeout | Time before display sleeps | +| Display Units | Metric or Imperial | +| OLED Type | Auto, SSD1306, SH1106, SH1107 | +| Compass Orientation | Rotation offset for compass display (0°, 90°, 180°, 270°) | +| ~~Compass North~~ | ⚠️ **Deprecated** — replaced by Compass Orientation; still visible in older firmware | + +### Asukoha sätted + +| Setting | Kirjeldus | +| ----------------------------------------- | ---------------------------------- | +| GPS Enabled | Enable/disable GPS | +| GPS Update Interval | How often to acquire GPS fix | +| Position Broadcast (s) | How often to share position | +| Nutikas asukoht | Enable movement-based broadcasting | +| Määratud asukoht | Use a manually set position | + +### Toite sätted + +| Setting | Kirjeldus | +| --------------------------------------- | --------------------------------------- | +| Power Saving | Enable low-power sleep mode | +| Shutdown After (s) | Auto-shutdown idle timer | +| ADC Multiplier | Battery voltage calibration factor | +| Wait Bluetooth (s) | Time to wait for BLE connection at boot | +| Mesh SDS Timeout (s) | Super-deep-sleep timeout | + +### Võrgu sätted + +| Setting | Kirjeldus | +| ------------- | ---------------------------------------------------- | +| WiFi Enabled | Enable WiFi radio (ESP32 devices) | +| WiFi SSID | Network name to connect to | +| WiFi PSK | Network password | +| NTP Server | Time synchronization server | +| Syslog Server | Remote logging server | + +![IP address field](/assets/screenshots/settings_ipv4_field.png) + +### Sinihamba sätted + +| Setting | Kirjeldus | +| ----------------- | ------------------------------------------------------------------------- | +| Bluetooth Enabled | Enable/disable BLE radio | +| Pairing Mode | Fixed PIN, Random PIN, or No PIN | +| Fikseeritud PIN | PIN code for pairing (default: 123456) | + +### Turva sätted + +| Setting | Kirjeldus | +| --------------------- | -------------------------------------------------------------------------- | +| Avalik võti | Your node's public key (read-only) | +| Administraatori võti | Key for remote administration | +| Salajane võti | Your node's private key (handle securely) | +| Admin Channel Enabled | Allow admin commands via channel | +| Debug Log | Output live debug logging over serial/bluetooth | +| Serial Enabled | Enable serial console access (moved from Device Config) | +| Hallatud režiim | Restrict non-admin channel changes | + +![Password field](/assets/screenshots/settings_password_field.png) + +Settings use standard preference controls — dropdowns, toggles, and sliders: + +| Control | Screenshot | +| -------- | ------------------------------------------------------ | +| Dropdown | ![Dropdown](/assets/screenshots/settings_dropdown.png) | +| Toggle | ![Toggle](/assets/screenshots/settings_switch.png) | +| Slider | ![Slider](/assets/screenshots/settings_slider.png) | + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — optional feature modules and device administration +- [Signal Meter](signal-meter) — how modem presets affect signal quality thresholds +- [LoRa configuration](https://meshtastic.org/docs/configuration/radio/lora) — detailed LoRa settings reference on meshtastic.org +- [Initial configuration](https://meshtastic.org/docs/getting-started/initial-config) — region setup guide on meshtastic.org + +--- + diff --git a/docs/et-rEE/user/signal-meter.md b/docs/et-rEE/user/signal-meter.md new file mode 100644 index 000000000..12ad7a9d9 --- /dev/null +++ b/docs/et-rEE/user/signal-meter.md @@ -0,0 +1,81 @@ +--- +title: How the Meshtastic Signal Meter Works +nav_order: 15 +last_updated: 2026-05-13 +description: How the signal meter calculates quality from RSSI and SNR — LoRa spread spectrum, presets, and what the bars really mean. +aliases: + - signal + - signal-meter + - snr + - rssi +--- + +# How the Meshtastic Signal Meter Works + +The Meshtastic signal meter — the familiar bars or status color in the app — is calculated very differently than the "bars" on a traditional cell phone or Wi-Fi router. + +Most consumer devices simply measure how "loud" a signal is. However, because Meshtastic uses **LoRa (Long Range)** technology, its signal meter measures how **clear** the signal is, relative to the specific settings your mesh is using. + +--- + +## 1. The Two Metrics: "Loudness" vs. "Clarity" + +Every time the LoRa radio chip receives a message, it reports two measurements: + +- **RSSI (Received Signal Strength Indicator):** The **loudness** of the raw power hitting your antenna. +- **SNR (Signal-to-Noise Ratio):** The **clarity** of the signal compared to the background static. + +> **Tip — The Analogy:** Imagine you are trying to hear a friend talking to you. +> +> - **RSSI** is how loud their voice is. +> - **The Noise Floor** is the background noise in the room (air conditioning, other people talking, traffic). +> - **SNR** is how easily you can distinguish your friend's voice from the background noise. + +If your friend shouts at you at a deafening rock concert, the signal is incredibly loud (High RSSI), but you still can't understand them because the background noise is louder (Bad SNR). Conversely, if your friend whispers to you in a dead-silent library, the signal is very weak (Low RSSI), but you can understand them perfectly (Great SNR). + +--- + +## 2. The Magic of LoRa: Hearing "Below the Noise Floor" + +For standard radios (like FM or Wi-Fi), if the background noise is louder than the signal (a negative SNR), the receiver just hears static. + +LoRa is special. It uses **"Spread Spectrum"** modulation, which allows the radio to mathematically pull a signal out of the air even when it is buried deep _underneath_ the background noise. This is why you will frequently see **negative SNR numbers** in Meshtastic (e.g., -10 dB, which means the signal is 10 decibels weaker than the background static). + +Depending on which Meshtastic preset you are using (e.g., `LongFast` vs. `ShortFast`), the radio has a specific **SNR Limit** — the absolute maximum amount of noise it can tolerate before the message is completely lost to the static. + +--- + +## 3. How the Signal Meter Calculates Quality + +The Meshtastic apps take both RSSI and SNR and run them through a specific formula to assign your signal a quality rating (None, Bad, Fair, or Good). It specifically scales these values based on the physical limits of the radio preset you are using. + +Here is exactly how the app decides how many bars (or what color) to show you: + +| Level | Bars | Criteria | Meaning | +| -------- | ---- | ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | +| Hea | 3 | RSSI better than `-115 dBm` **AND** SNR better than `-7 dB` | Signal is both loud and clear — healthy connection. | +| Rahuldav | 2 | RSSI better than `-126 dBm` with good SNR, **OR** SNR better than `-15 dB` with good RSSI | Signal getting quieter or noisier, but still decodable. | +| Halb | 1 | Falls between Fair and None thresholds | At the edge of range or experiencing interference. | +| Puudub | 0 | RSSI worse than `-126 dBm` **AND** SNR worse than `-15 dB` | Transmission completely buried in noise. | + +--- + +## 4. What This Means for You + +Because Meshtastic's meter acts as a **"Clarity Meter"**, it behaves differently than what most people expect: + +> **Tip — Don't panic over low RSSI:** You might see a seemingly terrible RSSI value like `-118 dBm`. On a cell phone, you would have zero bars. But if you have an SNR of `+2 dB`, Meshtastic will still show a strong signal! _The library is quiet, so the whisper is heard perfectly._ + +> **Warning — Watch out for local noise:** If you hook up a massive antenna and see a great RSSI (e.g., `-90 dBm`) but your signal meter is only showing **1 Bar (Bad)**, you have a problem. It means you have local interference — perhaps a cheap power supply, a noisy computer, or a nearby radio tower — creating so much static that it is drowning out your mesh. + +## Where Signal Information Appears + +In the app, signal data is shown in several places: + +- **Node list** — signal bars icon next to each node +- **Node detail** — SNR, RSSI, and signal quality in the device metrics section +- **Traceroute** — per-hop signal quality for each relay node +- **Signal metrics** — historical SNR and RSSI data in the metrics charts + +![Node entry showing SNR, RSSI values and colored signal bars](/assets/screenshots/nodes_signal_info.png) + diff --git a/docs/et-rEE/user/tak.md b/docs/et-rEE/user/tak.md new file mode 100644 index 000000000..7b7fe56ff --- /dev/null +++ b/docs/et-rEE/user/tak.md @@ -0,0 +1,126 @@ +--- +title: TAK Integration +nav_order: 10 +last_updated: 2026-05-13 +description: Interoperate with ATAK and WinTAK — CoT position sharing, TAK roles, and plugin setup. +aliases: + - tak + - atak + - team-awareness-kit +--- + +# TAK Integration + +Meshtastic integrates with the Team Awareness Kit (TAK) ecosystem, enabling interoperability between Meshtastic mesh devices and TAK applications like ATAK and WinTAK. + +## Overview + +The TAK module allows Meshtastic nodes to: + +- Share position data in TAK-compatible CoT (Cursor on Target) format +- Appear as team members on TAK map displays +- Receive TAK PLI (Position Location Information) messages + +## Setup + +### Prerequisites + +- ATAK (Android Team Awareness Kit) or WinTAK installed +- Meshtastic ATAK Plugin installed +- TAK module enabled on your Meshtastic radio + +### Sätted + +1. Navigate to **Settings → Module Config → TAK**. +2. Enable the TAK module. +3. Configure the TAK team/group settings: + +![Module toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | Kirjeldus | +| ------- | -------------------------- | +| Lubatud | Activate TAK interop | +| Mode | TAK-compatible output mode | + +### ATAK Plugin Setup + +1. Install the Meshtastic ATAK Plugin from the plugin repository. +2. Open ATAK and enable the Meshtastic plugin. +3. The plugin bridges messages between ATAK and your mesh network. + +## TAK Roles + +Nodes configured with TAK-related roles behave differently from standard clients: + +| Roll | Kirjeldus | +| --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **TAK** | Full TAK interoperability — sends and receives CoT data, chat messages, and PLI updates. Functions as a standard client plus TAK bridge. | +| **TAK Tracker** | Position-only TAK output — automatically broadcasts PLI at regular intervals without user interaction. Optimized for unattended position beacons (vehicles, equipment, waypoints). Does not relay chat messages. | + +> 💡 **Tip:** Use **TAK Tracker** for devices that only need to report position (e.g., a radio mounted in a vehicle). Use **TAK** for devices where users actively participate in TAK operations. + +### CoT (Cursor on Target) Format + +TAK messages use the Cursor on Target XML format — a military standard for sharing situational awareness data. Meshtastic converts its internal protobuf messages to CoT format when bridging to TAK systems, so no manual format conversion is needed. + +## TAK Identity + +When using TAK roles, your node broadcasts identity information that appears on TAK maps: + +| Setting | Kirjeldus | +| -------- | ---------------------------------------------------------------------------------------------------------------- | +| Team | Your team color on the TAK map (e.g., Blue, Red, Cyan, Green) | +| Roll | Your operational role (Team Member, Team Lead, HQ, Medic, RTO, etc.) | +| Callsign | Your TAK callsign (defaults to your Meshtastic long name) | + +These settings appear in **Settings → Module Config → TAK** when the TAK module is enabled. + +> 💡 **Tip:** Team/role colors are the standard TAK affiliation colors. Coordinate with your TAK team to use consistent team assignments. + +## Wire Format (V1 / V2) + +Meshtastic supports two TAK wire formats: + +| Format | Compatibility | Features | +| ------------------------------- | --------------------------------------------------------------- | --------------------------------------------------------- | +| V1 (Legacy) | ATAK Plugin v1.x, older firmware | Basic CoT position sharing only | +| V2 (Current) | ATAK Plugin v2.x, firmware 2.3+ | Full CoT support including chat, routes, zstd compression | + +The app automatically selects V2 when both sides support it. No manual configuration needed — the TAK module negotiates format based on firmware capabilities. + +## Usage with ATAK + +Once configured: + +- Meshtastic nodes appear as markers on the ATAK map with callsign labels +- Chat messages can bridge between mesh and TAK networks +- Position updates flow bidirectionally between Meshtastic and TAK +- TAK Tracker nodes broadcast PLI automatically — their positions appear on ATAK maps without any ATAK-side configuration + +> ⚠️ **Note:** TAK integration requires specific node roles and module configuration. Standard client nodes don't automatically participate in TAK operations. + +## Troubleshooting + +| Problem | Cause | Solution | +| -------------------------------- | ------------------------------------- | ----------------------------------------------------------------------- | +| Node doesn't appear on ATAK map | TAK module disabled or wrong role | Verify TAK module is enabled and node role is TAK or TAK Tracker | +| Position updates are stale | GPS fix lost or interval too long | Check GPS status; reduce position broadcast interval in Position Config | +| ATAK plugin shows "disconnected" | BLE connection lost or plugin crashed | Reconnect Bluetooth in Meshtastic app, then restart ATAK plugin | +| Chat messages not bridging | V1 format doesn't support chat | Ensure both nodes run firmware 2.3+ for V2 wire format | +| CoT data not flowing | Channel mismatch | All TAK nodes must be on the same channel with matching encryption | + +## Security Considerations + +- TAK data shares your position and callsign information +- Ensure your channel encryption is configured when using TAK in sensitive environments +- The TAK module respects the same channel encryption as other Meshtastic messages + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — TAK module configuration +- [Nodes](nodes) — TAK and TAK Tracker roles in the node list +- [Map & Waypoints](map-and-waypoints) — node positions on the map +- [ATAK plugin guide](https://meshtastic.org/docs/software/integrations/atak-plugin) — detailed ATAK setup on meshtastic.org + +--- + diff --git a/docs/et-rEE/user/telemetry-and-sensors.md b/docs/et-rEE/user/telemetry-and-sensors.md new file mode 100644 index 000000000..e5391eafc --- /dev/null +++ b/docs/et-rEE/user/telemetry-and-sensors.md @@ -0,0 +1,118 @@ +--- +title: Telemetry & Sensors +nav_order: 9 +last_updated: 2026-05-13 +description: Sensor data on the mesh — supported environment, air quality, and power sensors, plus configuration and viewing guides. +aliases: + - sensors + - environment + - weather + - power-metrics +--- + +# Telemetry & Sensors + +Meshtastic nodes can collect and share sensor data across the mesh network. + +## Overview + +Telemetry allows nodes equipped with sensors to broadcast environmental, power, and device health information. This data is visible on the node detail screen and can be logged over time. + +## Device Telemetry + +All Meshtastic nodes report basic device telemetry: + +| Metric | Kirjeldus | Typical Range | +| ------------------ | ------------------------------ | ------------------------------------------------------------------ | +| Battery Level | Charge percentage | 0–100% | +| Vool | Battery voltage | 3.0–4.2V (LiPo) | +| Kanali kasutus | % of airtime used locally | 0–100% | +| Air Utilization TX | % of airtime used by this node | 0–100% | +| Töötamise aeg | Seconds since last boot | Varies | + +## Environment Sensors + +Supported environmental sensors: + +### Temperature & Humidity + +| Andur | Temperatuur | Niiskus | Õhurõhk | Sõnumid | +| ------- | ----------- | ------- | ------- | ----------------------- | +| BME280 | ✓ | ✓ | ✓ | Recommended all-in-one | +| BME680 | ✓ | ✓ | ✓ | Adds gas resistance/IAQ | +| SHT31 | ✓ | ✓ | — | High accuracy | +| MCP9808 | ✓ | — | — | Precision temperature | +| LPS22 | — | — | ✓ | Pressure only | + +### Air Quality + +| Andur | Metric | Sõnumid | +| -------- | -------------------------------------------------- | -------------------------- | +| BME680 | Gas Resistance / IAQ | Volatile organic compounds | +| PMSA003I | PM1.0, PM2.5, PM10 | Particulate matter | +| SEN55 | PM, NOx, VOC, Temp, Humidity | Multi-sensor | + +### Light & UV + +| Andur | Metric | +| -------- | -------------------------------------- | +| OPT3001 | Ambient light (lux) | +| VEML7700 | Ambient light (lux) | +| LTR390 | UV index | + +## Võimsusnäitajad + +Nodes with INA-series power sensors can report: + +| Metric | Kirjeldus | +| ----------- | ----------------------------------------- | +| Bus Voltage | Supply rail voltage | +| Pinge | Power consumption (mA) | +| Toide | Calculated power (mW) | + +Useful for monitoring solar charging or battery health on remote nodes. + +## Configuring Telemetry + +1. Navigate to **Settings → Module Config → Telemetry**. +2. Set reporting intervals: + - **Device Metrics Interval** — how often to broadcast device metrics + - **Environment Metrics Interval** — how often to broadcast sensor data +3. Enable specific sensor types as needed. + +### Recommended Intervals + +| Use Case | Device (s) | Environment (s) | +| ------------------------------------------ | ----------------------------- | ---------------------------------- | +| Urban mesh (many nodes) | 3600 | 3600 | +| Rural mesh (few nodes) | 900 | 900 | +| Weather station | 900 | 300 | +| Battery conservation | 7200 | 7200 | + +> ⚠️ **Note:** Shorter intervals increase airtime usage and battery drain across the mesh. + +## Viewing Telemetry + +1. Navigate to **Nodes** and select a node. +2. Telemetry sections show on the detail screen: + - Device Metrics (always available) + - Environment Metrics (if sensors present) + - Power Metrics (if INA sensor present) +3. Historical graphs show trends over time. + +![Telemetry actions](/assets/screenshots/node-metrics_telemetric_actions.png) + +## Troubleshooting + +- **No environment data showing?** The remote node needs a physical sensor connected (e.g., BME280 on I2C). Device telemetry (battery, uptime) is always available, but environment metrics require hardware. +- **Stale readings?** Check the reporting interval — very long intervals (7200s+) mean data updates infrequently. Also verify the remote node is still online. +- **Sensor conflict on I2C bus?** Some sensors share I2C addresses. If you have multiple sensors on the same bus, check for address collisions in the radio's serial debug output. + +## Related Topics + +- [Node Metrics](node-metrics) — view telemetry data on the node detail screen +- [Settings — Modules & Admin](settings-module-admin) — telemetry module configuration +- [Units & Locale](units-and-locale) — temperature and pressure display units + +--- + diff --git a/docs/et-rEE/user/translate.md b/docs/et-rEE/user/translate.md new file mode 100644 index 000000000..8820091ed --- /dev/null +++ b/docs/et-rEE/user/translate.md @@ -0,0 +1,97 @@ +--- +title: Translate the App +parent: User Guide +nav_order: 17 +last_updated: 2026-05-13 +aliases: + - translate + - crowdin + - localization +--- + +# Translate the App + +Contributing translations helps make Meshtastic accessible to a wider audience. The app uses [Crowdin](https://crowdin.com/) to manage community translations for both the user interface and in-app documentation. + +--- + +## What Gets Translated + +| Resource | Source Location | Sõnumid | +| ----------------- | ------------------------------------- | ---------------------------------------------------------------------- | +| UI strings | `composeResources/values/strings.xml` | Buttons, labels, messages, and all user-visible text | +| User Guide pages | `docs/user/*.md` | In-app documentation shown in Help & Documentation | +| Fastlane metadata | `fastlane/metadata/android/en-US/` | App Store listing title, description, and changelogs | + +> **Note — Developer Guide pages are English-only.** Code-focused documentation targeting contributors is not translated. + +--- + +## How to Contribute + +1. **Visit the Crowdin project.** Open the [Meshtastic Android Crowdin project](https://crowdin.com/project/meshtastic-android) and sign in or create a free account. +2. **Choose your language.** Select an existing language or request a new one by opening a [GitHub issue](https://github.com/meshtastic/Meshtastic-Android/issues/new). +3. **Translate strings.** Crowdin shows the English source on the left and your translation on the right. Translate each string and save. +4. **Review context.** Many strings include screenshots or context comments — check these to understand where the text appears in the app. +5. **Submit.** Approved translations are automatically merged into the next release. + +> **Tip — Keep translations short.** UI strings often appear in buttons, chips, or narrow columns. If a translation is significantly longer than the English original, consider abbreviating where the meaning stays clear. + +--- + +## Adding a New Language + +If your language is not yet listed on Crowdin: + +1. Open an issue on [GitHub](https://github.com/meshtastic/Meshtastic-Android/issues/new) requesting the new locale. +2. A maintainer will add the language to Crowdin and configure `crowdin.yml`. +3. Once added, you can begin translating immediately. + +--- + +## How Translations Are Organized + +The Android app uses **Compose Multiplatform resources** for all user-visible strings: + +``` +core/resources/src/commonMain/composeResources/ +├── values/ ← English (default) +│ └── strings.xml +├── values-de/ ← German +│ └── strings.xml +├── values-fr/ ← French +│ └── strings.xml +└── ... +``` + +In-app documentation follows a similar pattern under `docs/`: + +``` +docs/ +├── user/ ← English source (default) +│ ├── onboarding.md +│ └── ... +├── fr/user/ ← French translations +│ ├── onboarding.md +│ └── ... +└── ... +``` + +The app automatically selects the correct locale based on your device's **Language & Region** settings. + +--- + +## Translation Guidelines + +- **Do not translate** technical terms like "LoRa", "MQTT", "BLE", "TAK", "SNR", or "RSSI" — these are universal. +- **Keep placeholders intact.** Strings like `%1$s` or `%d` are filled in at runtime. Do not remove or reorder them unless the grammar of your language requires it. +- **Match tone.** The app uses a friendly, direct voice. Avoid overly formal language. +- **Test if possible.** Switch your device language and open the app to see how translations look in context. + +--- + +## Questions? + +If you have questions about a specific string's context or need help getting started, open a discussion on the [Meshtastic GitHub Discussions](https://github.com/meshtastic/Meshtastic-Android/discussions) page. + +Thank you for helping expand the reach of Meshtastic! diff --git a/docs/et-rEE/user/units-and-locale.md b/docs/et-rEE/user/units-and-locale.md new file mode 100644 index 000000000..5eec071ed --- /dev/null +++ b/docs/et-rEE/user/units-and-locale.md @@ -0,0 +1,118 @@ +--- +title: Units, Measurement & Locale +parent: User Guide +nav_order: 16 +last_updated: 2026-05-12 +--- + +# Units, Measurement & Locale + +The Meshtastic app automatically displays temperatures, distances, speeds, and times in the units your device is configured to use — no settings to change inside the app. + +--- + +## How It Works + +Meshtastic radios always transmit data in **metric units** (meters, °C, km/h, hPa, etc.). When the app receives this data, it uses the `MetricFormatter` utility to convert and display values in whatever unit system your device's locale specifies. + +On Android, your measurement preferences are determined by your system **Language & Region** settings. On Desktop (JVM), the app uses the JVM's default `Locale`. + +> **Tip — You never need to toggle units inside the app.** Change your system measurement preferences and every screen in Meshtastic updates automatically — node details, telemetry charts, weather, altitude, and more. + +--- + +## Temperatuur + +Temperature values from environment sensors are transmitted as **°C** and displayed based on your device's temperature unit preference. + +![Environment metrics with temperature](/assets/screenshots/nodes_environment_metrics.png) + +| Your Setting | You See | +| ------------ | ------- | +| Celsius | 22°C | +| Fahrenheit | 72°F | + +This affects all temperature displays throughout the app: node environment telemetry, soil temperature, dew point, and telemetry chart axes. + +## Distance & Altitude + +Distances between nodes and GPS altitudes are transmitted as **meters** and automatically scaled and converted. + +![Distance info display](/assets/screenshots/nodes_distance_info.png) + +| Your Setting | Small Distance | Large Distance | Kõrgus | +| -------------------------------- | -------------- | ---------------------- | -------- | +| Metric | 350 m | 2.5 km | 1,200 m | +| Imperial (US) | 1,148 ft | 1.6 mi | 3,937 ft | + +The app uses natural scaling — short distances stay in meters or feet, while longer distances switch to kilometres or miles automatically. + +### Where these appear + +- **Node list** — distance and bearing to each node +- **Node detail** — altitude, distance from your position +- **Map** — waypoint distances, traceroute hop distances +- **Compass** — distance to selected node + +## Kiirus + +GPS ground speed is displayed in your locale's preferred speed unit. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Metric | 12 km/h | +| Imperial (US) | 7 mph | + +## Tuul + +Wind speed and gust data from environment sensors are transmitted as **m/s** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Metric | 5 m/s | +| Imperial (US) | 11 mph | + +Wind readings appear in the **Node Detail** environment section and the **Environment Telemetry** charts. + +## Rainfall + +Rainfall measurements (1-hour and 24-hour totals) are transmitted as **mm** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ---------------------- | +| Metric | 12 mm | +| Imperial (US) | 0.5 in | + +## Units That Never Change + +Some units are international standards and are displayed the same way regardless of your locale: + +| Measurement | Unit | Why | +| -------------------------------- | ------------------------------ | ------------------------------------- | +| Barometric pressure | hPa | International meteorological standard | +| Heading / bearing | ° (degrees) | Universal navigation convention | +| Radiatsioon | μR/hr | Standard dosimetry unit | +| GPS coordinates | decimal degrees | Universal geographic standard | +| Humidity, battery, soil moisture | % | Universal | + +## Date & Time + +All timestamps throughout the app — last heard, message times, telemetry logs, chart axes — follow your device's date and time preferences. + +| Setting | What It Controls | Example | +| ---------------- | ---------------- | ------------------------------------------------ | +| **24-Hour Time** | Clock format | 14:30 vs 2:30 PM | +| **Date Format** | Date ordering | 09/05/2026 vs 05/09/2026 | + +The app also uses **relative time** where it makes sense — for example, "5 min ago" or "2 hours ago" in the node list — which is automatically localised into your device language. + +## Changing Your Measurement System (Android) + +On Android, your measurement system (metric vs imperial) is tied to your region setting: + +1. Open **Android Settings → System → Language & Region** +2. Change your **Region** or **Measurement units** preference +3. Return to Meshtastic — values update immediately + +> **Tip — The app uses `MetricFormatter` from `core:common`.** All measurement formatting is handled by a shared KMP utility that respects your platform's locale. Developers adding new measurement displays should use `MetricFormatter` rather than hard-coding unit conversions. + diff --git a/docs/fi-rFI/index.md b/docs/fi-rFI/index.md new file mode 100644 index 000000000..fbb78839d --- /dev/null +++ b/docs/fi-rFI/index.md @@ -0,0 +1,30 @@ +--- +title: Home +layout: default +nav_order: 0 +--- + +# Meshtastic Android App Documentation + +User and developer documentation for the Meshtastic Android, Desktop, and iOS applications powered by KMP (Kotlin Multiplatform). + +Use the sidebar navigation to browse the **User Guide** for app features and the **Developer Guide** for contributing to the project. + +--- + +## Quick Links + +| Guide | Kuvaus | +| --------------------------------------------------------------------- | -------------------------------------------------------------- | +| [Getting Started](user/onboarding) | Connect your first radio and send a message | +| [Messages & Channels](user/messages-and-channels) | Channel broadcasts, direct messages, reactions, and encryption | +| [Nodes](user/nodes) | Understanding the mesh network node list | +| [Signal Meter](user/signal-meter) | How the LoRa signal quality meter works | +| [Units & Locale](user/units-and-locale) | How temperatures, distances, and times adapt to your region | +| [Desktop App](user/desktop) | Linux, macOS, and Windows desktop usage | +| [Architecture](developer/architecture) | App architecture overview for contributors | +| [Contributing](developer/contributing) | Branch naming, PR workflow, and verification commands | + +--- + +> This documentation is served from the same markdown source that powers the in-app **Help & Documentation** browser. diff --git a/docs/fi-rFI/user/connections.md b/docs/fi-rFI/user/connections.md new file mode 100644 index 000000000..2b36e0756 --- /dev/null +++ b/docs/fi-rFI/user/connections.md @@ -0,0 +1,125 @@ +--- +title: Yhteydet +nav_order: 2 +last_updated: 2026-05-13 +description: Connect your phone or desktop to a Meshtastic radio via Bluetooth, USB, or TCP/IP. +aliases: + - bluetooth + - usb + - tcp + - pairing +--- + +# Yhteydet + +Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node. + +## Bluetooth (BLE) + +Bluetooth Low Energy is the default and most common connection method on Android. + +### Pairing a Device + +1. Ensure your Meshtastic radio is powered on and in pairing mode. +2. Open the app and navigate to **Connections**. +3. Tap **Scan for Devices** — nearby Meshtastic radios will appear. +4. Select your device from the list. +5. Accept the Bluetooth pairing prompt if shown. + +![Device list item](/assets/screenshots/connections_bluetooth_scan.png) + +You can filter devices by transport type using the filter chips at the top: + +![Transport filter chips](/assets/screenshots/connections_transport_filters.png) + +> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. + +### Connection Status + +| Icon | State | Kuvaus | +| ---- | -------------- | ----------------------------- | +| 🟢 | Yhdistetty | Active radio link established | +| 🟡 | Yhdistetään | Handshake in progress | +| 🔴 | Ei yhdistetty | No active connection | +| ⚪ | Not configured | Ei laitetta valittuna | + +When connecting, a status indicator shows the current connection state: + +![Connecting status](/assets/screenshots/connections_connecting.png) + +If no devices are found, the app shows an empty state with instructions: + +![No devices found](/assets/screenshots/connections_empty_state.png) + +### Troubleshooting Bluetooth + +- **Device not found:** Toggle Bluetooth off/on, ensure location is enabled. +- **Connection drops:** Move closer to the radio; check for interference. +- **Pairing rejected:** Forget the device in Android Bluetooth settings and retry. + +## USB Serial + +USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable. + +### Setup + +1. Connect your radio via USB cable to your device. +2. The app will prompt for USB permission — tap **Allow**. +3. The connection is established automatically. + +> ⚠️ **Note:** USB connections require OTG support on Android devices. + +## TCP/IP (WiFi) + +Some Meshtastic radios support WiFi connectivity, allowing TCP-based connections. + +### Asetukset + +1. Connect your radio to a WiFi network via the radio's web interface or settings. +2. In the app, go to **Connections → TCP**. +3. Enter the radio's IP address and port (default: 4403). +4. Tap **Connect**. + +![WiFi scanning for devices](/assets/screenshots/connections_wifi_scanning.png) + +When a device is found, it appears in the connection list: + +![WiFi device found](/assets/screenshots/connections_wifi_device_found.png) + +A successful connection is confirmed with a status indicator: + +![WiFi connection success](/assets/screenshots/connections_wifi_success.png) + +### When to Use TCP + +- Radio is on the same local network +- Testing with a simulated radio +- Environments where Bluetooth has interference issues + +## Reconnection Behavior + +The app reconnects to the **last selected device** on startup. You can manually switch transports from the connections screen at any time. + +To disconnect from a radio, use the disconnect button on the connections screen: + +![Disconnect from radio](/assets/screenshots/connections_disconnect.png) + +## Desktop Connections + +On Desktop (Linux/macOS/Windows), the app supports: + +- **Bluetooth (BLE)** — via the Kable library; works on macOS, Linux, and Windows +- **USB Serial** — primary wired connection method +- **TCP/IP** — for network-connected radios + +See [Desktop App](desktop) for platform-specific details and keyboard shortcuts. + +## Related Topics + +- [Getting Started](onboarding) — first-launch setup and permissions +- [Settings — Radio & User](settings-radio-user) — Bluetooth and network configuration +- [Desktop App](desktop) — desktop-specific connection details +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — full list of compatible radios on meshtastic.org + +--- + diff --git a/docs/fi-rFI/user/desktop.md b/docs/fi-rFI/user/desktop.md new file mode 100644 index 000000000..0a3a20578 --- /dev/null +++ b/docs/fi-rFI/user/desktop.md @@ -0,0 +1,147 @@ +--- +title: Desktop App +nav_order: 14 +last_updated: 2026-05-13 +description: Install and use the Meshtastic Desktop app on Linux, macOS, and Windows — connections, feature parity, and keyboard shortcuts. +aliases: + - desktop + - linux + - macos + - windows + - jvm +--- + +# Desktop App + +The Meshtastic Desktop application provides the same mesh communication features on Linux, macOS, and Windows. + +## Yleiskatsaus + +The Desktop app shares its core codebase with the Android app through Kotlin Multiplatform (KMP). Most features work identically across platforms. + +## Asennus + +### Linux + +- Download the `.deb` or `.AppImage` package from the releases page +- Or build from source using `./gradlew :desktopApp:run` + +### macOS + +- Download the `.dmg` package from releases +- Or build from source + +### Windows + +- Download the `.msi` installer from releases +- Or build from source + +## Connecting Your Radio + +### USB Serial (Primary) + +The most reliable connection method on Desktop: + +1. Connect your Meshtastic radio via USB cable. +2. The app should detect the serial port automatically. +3. If not detected, select the correct serial port from the connections menu. + +### TCP/IP + +For network-connected radios: + +1. Enter the radio's IP address and port (default: 4403). +2. Click **Connect**. + +### Bluetooth (BLE) + +Bluetooth Low Energy is supported on Desktop via the [Kable](https://github.com/JuulLabs/kable) library: + +1. Ensure your system has a Bluetooth adapter. +2. The app scans for nearby Meshtastic radios automatically. +3. Select your device from the connections screen. + +## Feature Parity + +| Feature | Android | Desktop | Viestit | +| ---------------------------------------- | ------- | ------- | -------------------------- | +| Messaging | ✓ | ✓ | Full parity | +| Node List | ✓ | ✓ | Full parity | +| Kartta | ✓ | ✓ | Full parity | +| Asetukset | ✓ | ✓ | Full parity | +| Bluetooth (BLE) | ✓ | ✓ | Via Kable on desktop | +| Firmware Update OTA | ✓ | ✗ | Use web flasher | +| Notifications | ✓ | ✓ | Native OS notifications | +| Widgets | ✓ | ✗ | Android-only | +| AI Assistant (Chirpy) | ✓\* | ✗ | Google flavor Android only | + +\*Chirpy AI requires Android 14+ on Google flavor builds with supported hardware. + +## UI Differences + +The Desktop app uses the same Compose Multiplatform UI with adaptations for larger screens and desktop interaction. + +### Keyboard Shortcuts + +| Shortcut | Action | +| ------------------- | --------------------------- | +| **⌘Q** / **Ctrl+Q** | Quit the application | +| **⌘,** / **Ctrl+,** | Open Settings | +| **⌘1** / **Ctrl+1** | Switch to Conversations tab | +| **⌘2** / **Ctrl+2** | Switch to Nodes tab | +| **⌘3** / **Ctrl+3** | Switch to Map tab | +| **⌘4** / **Ctrl+4** | Switch to Connections tab | + +### Window & System Tray + +- **Window resizing** — responsive layout adapts to window dimensions +- **System tray** — minimize to system tray for background mesh operation +- **Tray menu** — right-click the tray icon to show window or quit +- **Mouse interaction** — hover states and standard desktop navigation + +### Notification Preferences + +The Desktop app provides in-app toggles for controlling which notifications are shown — messages, new nodes, and low battery alerts. Access these from **Settings → Notifications** within the app. + +## Built-in Documentation Browser + +The Desktop app includes a built-in documentation browser for quick access to help content without leaving the application. + +![Docs browser with table of contents](/assets/screenshots/docs-browser_toc.png) + +The browser supports full-text search across all documentation: + +![Searching the docs browser](/assets/screenshots/docs-browser_search.png) + +Individual doc pages render with full formatting: + +![A documentation page](/assets/screenshots/docs-browser_page.png) + +## Building from Source + +```bash +git clone https://github.com/meshtastic/Meshtastic-Android.git +cd Meshtastic-Android +git submodule update --init +./gradlew :desktopApp:run +``` + +Requirements: + +- JDK 21 +- No Android SDK required for desktop-only builds + +## Known Limitations + +- No OTA firmware updates (use web flasher) +- Some Android-specific features (widgets, specific notification channels) are unavailable +- Performance may vary on low-spec hardware running Compose Desktop +- BLE bonding is not yet supported on desktop (pairing works without bonding) + +## Related Topics + +- [Connections](connections) — connection methods overview +- [Firmware Updates](firmware) — use the [Web Flasher](https://flasher.meshtastic.org) for desktop firmware updates + +--- + diff --git a/docs/fi-rFI/user/discovery.md b/docs/fi-rFI/user/discovery.md new file mode 100644 index 000000000..45ab0308b --- /dev/null +++ b/docs/fi-rFI/user/discovery.md @@ -0,0 +1,114 @@ +--- +title: Haku +nav_order: 12 +last_updated: 2026-05-13 +description: Explore your mesh network — traceroute paths, neighbor maps, and node discovery tools. +aliases: + - mesh-discovery + - local-discovery + - network-scan + - traceroute + - neighbor-info +--- + +# Haku + +Discovery tools help you understand **how** your mesh network is connected — which nodes can hear each other, what paths messages take, and where bottlenecks or weak links exist. + +> 💡 **Tip:** You don't need a dedicated "discovery mode" to start exploring your mesh. The tools below are available right now from the node list and node detail screens. + +--- + +## Reitinselvitys + +Traceroute reveals the exact path a message takes from your node to any other node on the mesh. It's the single most useful tool for debugging connectivity problems. + +### Running a Traceroute + +1. Navigate to **Nodes** and tap the node you want to trace. +2. On the node detail screen, tap **Traceroute**. +3. The app sends a traceroute request and waits for the response. +4. Results display each hop in order, with signal quality at every step. + +### Reading the Results + +A traceroute result looks like this: + +``` +You → Node A (SNR: 8.5, RSSI: -95) → Node B (SNR: 5.2, RSSI: -108) → Target +``` + +Each hop represents a relay node that forwarded the message. The SNR and RSSI values at each hop tell you about the link quality on that specific segment. + +| What to look for | What it means | +| -------------------------------------------------------------------------- | --------------------------------------------------------------------------- | +| All hops show Good SNR (> 5 dB) | Healthy path — messages flow reliably | +| One hop shows Bad SNR (< 0 dB) | Weak link — this relay segment is fragile | +| Many hops (4+) | Long path — consider repositioning a node to shorten it | +| Different path on retry | Mesh is adapting — multiple routes exist (this is good!) | + +> 💡 **Tip:** Run traceroute several times over a few minutes. If the path changes, your mesh has redundant routes — a sign of a well-connected network. + +### Troubleshooting with Traceroute + +- **"No route found"** — The target node may be offline, out of range, or on a different channel. Check that both nodes share at least one channel with the same encryption key. +- **Traceroute times out** — The path may be too long (exceeds hop limit) or a relay node is congested. Try increasing the hop limit in **Settings → LoRa Config**. +- **Asymmetric paths** — A traceroute from A→B may take a different path than B→A. This is normal — radio propagation is not always symmetric. + +--- + +## Naapuritieto + +The Neighbor Info module lets each node broadcast a list of the nodes it can **directly hear** (single-hop). When multiple nodes share their neighbor lists, you can piece together a topology map of the entire mesh. + +### Enabling Neighbor Info + +1. Navigate to **Settings → Module Config → Neighbor Info**. +2. Enable the module. +3. Set the broadcast interval (default: 900 seconds / 15 minutes). + +Once enabled, your node periodically broadcasts its neighbor table. Other nodes with Neighbor Info enabled do the same. + +### Viewing Neighbor Data + +- Open any node's detail screen and look for the **Neighbors** section. +- Each neighbor entry shows the node that was directly heard and its signal quality. +- Combine neighbor data from multiple nodes to understand the full mesh topology. + +> ⚠️ **Note:** Neighbor Info increases airtime usage because every enabled node periodically broadcasts its neighbor list. On busy meshes with many nodes, consider longer broadcast intervals (3600 seconds or more) to avoid congestion. + +--- + +## Node List as a Discovery Tool + +The node list itself is a powerful discovery tool when you use its filtering and sorting features effectively. + +### Finding New Nodes + +- Sort by **Last heard** to see the most recently active nodes at the top. +- Enable **Include unknown** to see nodes that have appeared on the mesh but haven't sent user info yet — these are often newly powered-on devices. + +### Assessing Connectivity + +- Sort by **Hops away** to see which nodes are directly reachable (0 hops) versus relayed. +- Sort by **Distance** to find nearby nodes and verify they're reachable. +- Use **Exclude MQTT** to focus on nodes reachable over radio (not via internet bridge). + +### Infrastructure Audit + +- Disable **Exclude infrastructure** to see Router, Repeater, Router Late, and Client Base nodes. +- Check their signal quality and last-heard times to verify your infrastructure nodes are healthy. + +See [Nodes](nodes) for full details on filtering and sorting options. + +--- + +## Tips for Mesh Exploration + +- **Start with traceroute** — it gives you immediate, actionable information about a specific path. +- **Enable Neighbor Info on key nodes** — especially routers and repeaters, to build a picture of the backbone. +- **Check the map** — node positions on the [Map](map-and-waypoints) combined with signal data help you understand why some links are strong and others are weak. +- **Compare signal over time** — use the [Signal Meter](signal-meter) guide to interpret SNR and RSSI values correctly. + +--- + diff --git a/docs/fi-rFI/user/firmware.md b/docs/fi-rFI/user/firmware.md new file mode 100644 index 000000000..03250a841 --- /dev/null +++ b/docs/fi-rFI/user/firmware.md @@ -0,0 +1,114 @@ +--- +title: Firmware Updates +nav_order: 13 +last_updated: 2026-05-13 +description: Update your radio firmware over Bluetooth — OTA process, version channels, pre-flight checks, and recovery. +aliases: + - firmware + - update + - ota + - flash +--- + +# Firmware Updates + +Keep your Meshtastic radio up to date with the latest firmware for new features, bug fixes, and security improvements. + +## Checking for Updates + +1. Navigate to **Settings → Firmware Update** or tap the firmware notification if shown. +2. The app checks for available firmware versions. +3. Available updates show the version number and changelog summary. + +## Update Methods + +### OTA (Over-The-Air) via Bluetooth + +The most common update method for Android users: + +1. Ensure your radio is connected via Bluetooth. +2. Navigate to the Firmware Update screen. +3. Select the desired firmware version. +4. Tap **Update** to begin the OTA process. +5. Wait for the update to complete — **do not disconnect** during the update. + +![Firmware checking for updates](/assets/screenshots/firmware_checking.png) + +> ⚠️ **Warning:** Interrupting a firmware update can brick your device. Ensure your radio has sufficient battery (>50% recommended) and maintain Bluetooth proximity during the entire process. + +![Firmware disclaimer](/assets/screenshots/firmware_disclaimer.png) + +### USB Flashing + +For recovery or when OTA is unavailable: + +- Use the [Meshtastic Web Flasher](https://flasher.meshtastic.org) +- Or the [Meshtastic CLI tool](https://meshtastic.org/docs/getting-started/flashing-firmware) on desktop + +## Version Channels + +| Kanava | Kuvaus | +| ------ | ------------------------------------------- | +| Vakaa | Recommended for most users; tested releases | +| Alpha | Preview releases; may contain bugs | + +## Pre-Update Checklist + +Before updating: + +- [ ] Battery > 50% +- [ ] Stable Bluetooth connection +- [ ] Note your current settings (they may reset on major version changes) +- [ ] Check the release notes for breaking changes + +## Post-Update + +After a successful update: + +- The radio will reboot automatically +- Bluetooth connection will re-establish +- Verify your settings are intact +- Check the firmware version in **Settings → About** + +![Firmware update success](/assets/screenshots/firmware_success.png) + +## Vianetsintä + +### Update Stuck + +If the update appears frozen: + +- Wait at least 5 minutes before intervening +- If truly stuck, power-cycle the radio +- Attempt the update again + +![Firmware update error](/assets/screenshots/firmware_error.png) + +### Device Won't Boot After Update + +If your device fails to boot: + +1. Try connecting via USB to a computer +2. Use the web flasher in recovery/DFU mode +3. Flash a known-good firmware version +4. Check the Meshtastic Discord for device-specific recovery steps + +### Compatibility Warnings + +The app may show warnings when: + +- Connected radio firmware is below minimum supported version +- Major version mismatch between app and firmware +- Deprecated features need migration + +> ⚠️ **Important:** Always update the Meshtastic app before or alongside firmware updates to ensure compatibility. + +## Related Topics + +- [Connections](connections) — reconnecting after a firmware update +- [Flashing firmware guide](https://meshtastic.org/docs/getting-started/flashing-firmware) — full firmware flashing walkthrough on meshtastic.org +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — check firmware compatibility by device +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/fi-rFI/user/map-and-waypoints.md b/docs/fi-rFI/user/map-and-waypoints.md new file mode 100644 index 000000000..36355bd2d --- /dev/null +++ b/docs/fi-rFI/user/map-and-waypoints.md @@ -0,0 +1,116 @@ +--- +title: Map & Waypoints +nav_order: 6 +last_updated: 2026-05-13 +description: View node positions on the map, create and share waypoints, and manage position sharing and privacy. +aliases: + - map + - waypoints + - gps + - location +--- + +# Map & Waypoints + +The Map screen shows the geographic positions of nodes on your mesh, along with shared waypoints. + +## Map View + +The map displays: + +- **Node positions** — colored markers for each node reporting location +- **Waypoints** — shared points of interest +- **Your position** — your current GPS location + +### Node Markers + +Node markers on the map indicate: + +| Color | Meaning | +| --------- | ---------------------------------------------- | +| Vihreä | Online (heard recently) | +| Keltainen | Away (heard within 2 hours) | +| Gray | Offline (stale position) | +| Sininen | Your own node | + +### Map Controls + +- **Zoom** — pinch or use +/- buttons +- **Pan** — drag to explore +- **Center** — select the location button to center on your position +- **Node tap** — tap a node marker to view details + +The floating toolbar provides quick access to compass, layer switching, node filters, refresh, and location tracking. Tap the compass to reorient north-up, or tap the location button to center on your current position. + +![Map controls overlay](/assets/screenshots/map_controls_overlay.png) + +## Waypoints + +Waypoints are shared geographic points of interest that all mesh members can see. + +### Creating a Waypoint + +1. Long-press on the map at the desired location. +2. Enter a name and optional description. +3. Choose an icon/emoji for the waypoint. +4. Tap **Send** to share with the mesh. + +### Waypoint Properties + +| Property | Kuvaus | +| ---------- | ------------------------------------------------------- | +| Nimi | Short identifier (max 30 characters) | +| Kuvaus | Optional longer description | +| Icon | Visual marker emoji on the map | +| Lukittu | If locked, only the creator can edit or delete | +| Expiration | Optional auto-remove time | + +### Waypoint Expiration + +Waypoints can be set to expire automatically: + +- **Never** (default) — waypoint remains until manually deleted +- **Timed** — waypoint is automatically removed after the specified duration (e.g., "remove after 2 hours"). Useful for temporary markers like rally points, hazards, or meeting locations. + +Expired waypoints are automatically hidden from the map so they don't clutter the display. The expiration countdown begins when the waypoint is created, not when other nodes receive it. + +### Managing Waypoints + +- Tap a waypoint on the map to view its details and coordinates +- Edit or delete waypoints you created +- **Locked waypoints** cannot be modified or deleted by other nodes — only the original creator can change them +- Unlocked waypoints can be edited by any mesh member + +## Position Sharing + +### Enabling Position Sharing + +Your node shares its GPS position based on: + +- **Fixed interval** — broadcast position at regular intervals +- **Smart position** — broadcast when movement exceeds a threshold +- **Manual** — only share when explicitly requested + +Configure position behavior in **Settings → Position**. + +### Privacy Considerations + +> 🔒 **Privacy:** Position data is broadcast to all nodes on your channel. If you don't want your location shared, disable GPS position in settings or use a fixed/fake position. + +## Map Sources + +The app supports multiple map tile sources: + +- OpenStreetMap (default) +- Satellite imagery (where available) +- Offline tiles (download map areas for offline use) + +## Related Topics + +- [Nodes](nodes) — view and filter your node list +- [Node Metrics](node-metrics) — signal quality and position history for individual nodes +- [Discovery](discovery) — traceroute and neighbor info for understanding mesh topology +- [Units & Locale](units-and-locale) — distance and coordinate display formats + +--- + diff --git a/docs/fi-rFI/user/messages-and-channels.md b/docs/fi-rFI/user/messages-and-channels.md new file mode 100644 index 000000000..df1c78bc1 --- /dev/null +++ b/docs/fi-rFI/user/messages-and-channels.md @@ -0,0 +1,159 @@ +--- +title: Messages & Channels +nav_order: 3 +last_updated: 2026-05-13 +description: Send and receive messages, manage channels, configure encryption, and use quick chat, reactions, and message actions. +aliases: + - channels + - direct-messages + - messaging + - conversations +--- + +# Messages & Channels + +Meshtastic supports two communication modes: **channel broadcasts** and **direct messages**. + +## Kanavat + +Channels are shared communication groups. All nodes configured with the same channel key can read and send messages on that channel. + +### Default Channel + +Every Meshtastic device comes with a default **LongFast** channel. This is an unencrypted channel used for general mesh communication. + +### Kanavan turvallisuus + +Channels support multiple encryption levels: + +| Icon | Security Level | Kuvaus | +| ---- | ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------- | +| 🔒 | PSK (256-bit AES) | Fully encrypted with a strong pre-shared key. Only nodes with the matching key can read messages. | +| 🔐 | PSK (128-bit AES) | Encrypted with a shorter key. Secure for most uses but 256-bit is preferred for sensitive data. | +| 🔓 | Default / Open | Uses the well-known default key. **Any Meshtastic device** on the same preset can read these messages. | +| ⚠️ | Insecure + Position | Open channel that also broadcasts your GPS position. Use with caution in public meshes. | + +> 🔒 **Security Tip:** 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. + +### Adding a Channel + +1. Navigate to **Settings → Channels**. +2. Tap **Add Channel** or scan a QR code. +3. Configure the channel name and encryption key. +4. Share the channel URL/QR code with others who need access. + +Tapping a channel shows its details and sharing options. + +## Yksityisviestit + +Direct messages (DMs) are point-to-point encrypted communications between two specific nodes. + +### Sending a Direct Message + +1. Open the **Messages** tab. +2. Select a node from your contacts list or tap a node in the node list. +3. Type your message and tap **Send**. + +### Message States + +| State | Icon | Meaning | +| --------------------------------- | ---- | ----------------------------------------------------------------------------------------------------------------- | +| Queued | ⏳ | Message waiting to be sent | +| En route | ✓ | Delivered to the radio, awaiting acknowledgment | +| Toimitettu | ✓✓ | Acknowledgment received from recipient | +| Received | ✓ | Message received from the mesh (incoming) | +| S&F Routing | 🔗 | Store & Forward: message being routed through an S&F node | +| S&F Confirmed | 🔗 | Store & Forward: delivery confirmed via S&F node | +| Virhe | ✗ | Delivery failed after retries | + +### Delivery Errors + +When a message fails to deliver, the error indicator shows what went wrong: + +| Virhe | Meaning | What to Do | +| ------------------- | ---------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| No Route | No path exists to the destination node | The recipient may be offline or out of mesh range. Try later or move closer. | +| Got NAK | The next-hop node refused to relay | The relay node may be congested. Wait and retry. | +| Aikakatkaisu | No acknowledgment within retry window | The recipient may be just out of range. Try increasing hop limit or moving to a better position. | +| Ei Käyttöliittymää | No radio interface available to send | Check that your radio is connected and the channel is configured. | +| Max Retransmit | All retry attempts exhausted | The mesh path is unreliable. Try a different channel or wait for conditions to improve. | +| Ei Kanavaa | The destination channel doesn't exist | Verify both nodes share the same channel configuration. | +| Too Large | Message exceeds maximum payload size | Shorten your message (max ~230 characters). | +| Ei vastausta | Node received message but didn't respond | The recipient's radio may be busy or in low-power sleep mode. | +| Duty Cycle Limit | Regional airtime limit reached | Your radio has used its allowed transmit time. Wait for the duty cycle window to reset (typically 1 hour in EU regions). | +| Virheellinen pyyntö | Malformed or invalid message | This usually indicates a software bug. Try restarting the app. | + +> 💡 **Tip:** 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. + +## Message Features + +### Quick Chat + +Pre-configured messages for rapid communication: + +- Access via the Quick Chat button in the message input area +- Choose from built-in phrases or custom messages +- Customize quick chat messages in **Settings → Quick Chat** +- Useful when typing is impractical (gloves, small screen, urgent) + +![Quick chat option](/assets/screenshots/messages_quick_chat.png) + +The channel list shows each channel with its latest message preview. + +### Message Bubbles + +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. + +### Reactions + +React to messages with emoji: + +- **Long-press** a message to open the actions menu +- Tap **Add Reaction** to choose an emoji +- Reactions appear below the message bubble +- Multiple users can react to the same message +- React to your own messages or others' messages + +![Emoji reaction badges displayed beneath a message](/assets/screenshots/messages_reaction.png) + +> 💡 **Tip:** Reactions are lightweight — they use minimal mesh bandwidth compared to full text messages. + +### Message Actions + +Long-press any message to access: + +- **Copy** — copy message text to clipboard +- **Reply** — quote the message in your response +- **React** — add an emoji reaction +- **Delete** — remove a message you sent (local deletion) + +### Message Priority + +Messages are queued and transmitted based on priority: + +1. Emergency/alert messages (highest) +2. Direct messages +3. Channel broadcasts (lowest) + +### Message Limits + +- **Maximum length:** 237 bytes (approximately 230 characters for ASCII text) +- **Rate limiting:** The mesh enforces airtime fairness; heavy message volume may be throttled +- **Delivery:** Messages are retried automatically if no acknowledgment is received + +## Best Practices + +- Use channels for group coordination +- Use direct messages for private person-to-person communication +- Keep messages short — mesh bandwidth is limited +- Configure encryption for sensitive communications + +## Related Topics + +- [Nodes](nodes) — tap a node to start a direct message +- [Settings — Radio & User](settings-radio-user) — configure channel encryption and presets +- [MQTT](mqtt) — bridge channel messages to the internet +- [Channel configuration](https://meshtastic.org/docs/configuration/radio/channels) — detailed channel settings on meshtastic.org + +--- + diff --git a/docs/fi-rFI/user/mqtt.md b/docs/fi-rFI/user/mqtt.md new file mode 100644 index 000000000..4818e7d3b --- /dev/null +++ b/docs/fi-rFI/user/mqtt.md @@ -0,0 +1,137 @@ +--- +title: MQTT +nav_order: 11 +last_updated: 2026-05-13 +description: Bridge your mesh to the internet — MQTT broker setup, encryption layers, and map reporting. +aliases: + - mqtt + - internet-bridge + - broker +--- + +# MQTT + +MQTT bridges your Meshtastic mesh network to the internet, enabling long-range communication beyond radio range. + +## Yleiskatsaus + +The MQTT module connects your node to an MQTT broker, allowing: + +- Messages to reach nodes on different physical meshes via the internet +- Integration with home automation and monitoring systems +- Publishing node positions to the public Meshtastic map +- Custom data pipelines for logging and alerting + +## How It Works + +``` +[Your Node] → Radio → [Gateway Node with WiFi] → MQTT Broker → [Remote Gateway] → Radio → [Remote Node] +``` + +A gateway node with internet access (WiFi or Ethernet) publishes mesh messages to an MQTT topic. Remote gateways subscribed to the same topic inject those messages into their local mesh. + +## Asetukset + +### Enabling MQTT + +1. Navigate to **Settings → Module Config → MQTT**. +2. Enable the MQTT module. +3. Configure the broker connection: + +![MQTT toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | Kuvaus | Oletus | +| --------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------- | +| Server Address | MQTT broker hostname | mqtt.meshtastic.org | +| Käyttäjänimi | Broker authentication | meshdev | +| Salasana | Broker authentication | large4cats | +| Root Topic | Base topic for messages | msh | +| Salaus | Encrypt MQTT payload | Käytössä | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON packet support has been removed from firmware; this field is ignored | Disabled | +| TLS | Secure connection to broker | Disabled | +| Map Reporting | Report position to public map | Disabled | + +### Default Meshtastic Broker + +The community maintains a public broker at `mqtt.meshtastic.org`. This is intended for general use and testing. + +> 🔒 **Privacy:** Messages on the public broker are readable by anyone subscribed. Always use channel encryption for private communications. + +### Private Broker + +For better privacy and control, you can run your own MQTT broker: + +- Mosquitto (lightweight, open-source) +- HiveMQ +- EMQX + +Configure your node to point to your private broker with appropriate credentials. + +## Map Reporting + +When Map Reporting is enabled, your node publishes its position to the Meshtastic community map: + +- Visible at [meshmap.net](https://meshmap.net) and similar community map services +- Only position and node info are shared +- Disable this if you don't want your location publicly visible + +## Uplink vs Downlink + +| Direction | Kuvaus | +| ------------ | -------------------------------- | +| **Uplink** | Messages from mesh → MQTT broker | +| **Downlink** | Messages from MQTT broker → mesh | + +Configure per-channel which directions are active to control message flow and airtime usage. + +## Message Formats + +MQTT uses protobuf message format: + +| Format | Kuvaus | Use case | +| ------------ | ----------------------------------- | -------------------------- | +| **Protobuf** | Binary Meshtastic protobuf encoding | Node-to-node mesh bridging | + +> ⚠️ **Note:** JSON output support was removed from firmware. The `json_enabled` setting is still visible in the app for legacy compatibility but has no effect on current firmware versions. + +## Encryption & Privacy + +Understanding the layered encryption model: + +1. **Channel encryption** happens on the mesh _before_ MQTT. If your channel has a PSK, the MQTT payload is already encrypted — the broker and any subscribers see only the ciphertext. +2. **MQTT encryption** (the module setting) adds an additional encryption layer for transit to the broker. This protects metadata and routing information. +3. **TLS** encrypts the TCP connection to the broker itself, preventing network-level eavesdropping. + +> 🔒 **Important:** The default public channel has a well-known key. Messages on the default channel sent via MQTT are effectively **unencrypted** — anyone can decode them. Always use a custom PSK for private communications. + +## Best Practices + +- Use channel-level encryption (PSK) on channels that bridge to MQTT +- Don't enable MQTT on nodes without internet access (it will buffer and waste memory) +- Use a private broker for sensitive deployments +- Be mindful of airtime when downlinking messages from busy MQTT topics — every downlinked message consumes radio airtime on your local mesh +- Consider enabling uplink-only if you only need to monitor your mesh remotely without injecting messages back + +## Vianetsintä + +### MQTT Not Connecting + +- **Check WiFi** — the gateway node must have an active internet connection (WiFi or Ethernet). MQTT does not work over the LoRa radio link itself. +- **Verify credentials** — incorrect username or password will silently fail on most brokers. Double-check for trailing spaces. +- **Firewall** — port 1883 (MQTT) or 8883 (MQTT+TLS) must be open. Some networks block non-standard ports. +- **DNS resolution** — if using a custom broker hostname, verify the node can resolve it. Try the broker's IP address directly. + +### Messages Not Bridging + +- **Check uplink/downlink settings** — if only uplink is enabled, messages flow from mesh to MQTT but not back. Enable downlink on the receiving gateway. +- **Channel mismatch** — both gateways must share the same channel with the same PSK. A mismatch means messages are encrypted with different keys and appear as garbage. +- **Topic mismatch** — ensure both gateways use the same root topic. The default `msh` works for the public broker. + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — MQTT module configuration reference +- [Messages & Channels](messages-and-channels) — channel encryption and PSK setup +- [MQTT integration guide](https://meshtastic.org/docs/software/integrations/mqtt) — detailed MQTT documentation on meshtastic.org + +--- + diff --git a/docs/fi-rFI/user/node-metrics.md b/docs/fi-rFI/user/node-metrics.md new file mode 100644 index 000000000..49b4f2842 --- /dev/null +++ b/docs/fi-rFI/user/node-metrics.md @@ -0,0 +1,130 @@ +--- +title: Node Metrics +nav_order: 5 +last_updated: 2026-05-13 +description: Telemetry dashboards for each mesh node — device health, environment sensors, signal quality, power, traceroute, and position history. +aliases: + - metrics + - telemetry + - device-metrics + - signal +--- + +# Node Metrics + +The node detail screen provides comprehensive telemetry and metrics for each node on your mesh. + +## Laitteen mittausloki + +Basic operating information reported by each node: + +| Metrijärjestelmä | Kuvaus | +| ---------------- | ----------------------------------- | +| Battery Level | Current battery percentage | +| Jännite | Battery voltage reading | +| Kanavan Käyttö | Percentage of airtime consumed | +| Airtime | Transmission time used by this node | +| Käyttöaika | Time since last reboot | + +Device metrics are displayed as individual cards with trend sparklines showing battery level, voltage, channel utilization, airtime, and uptime over time. + +> 💡 **Tip:** Tap any metric card to expand it into a full chart with historical data points. Pinch to zoom the time axis. + +## Ympäristöarvot + +Environmental sensor data (requires compatible hardware): + +| Metrijärjestelmä | Sensor Examples | +| ------------------------------------ | --------------------- | +| Lämpötila | BME280, BME680, SHT31 | +| Kosteus | BME280, BME680, SHT31 | +| Barometrinen paine | BME280, BMP280 | +| Kaasuvastus | BME680 | +| IAQ (Air Quality) | BME680 | + +Environment metrics are charted over time for easy trend analysis — temperature, humidity, and pressure each get their own line chart with the measurement unit displayed on the Y axis. + +> 💡 **Tip:** Environment metrics require a sensor connected to the remote node. Not all nodes report environmental data. See [Telemetry & Sensors](telemetry-and-sensors) for a full list of supported sensors. + +## Signaalin voimakkuudet + +Radio signal quality information: + +| Metrijärjestelmä | Kuvaus | +| ---------------- | ----------------------------------------------------------------------------- | +| SNR | Signal-to-Noise Ratio (higher is better) | +| RSSI | Received Signal Strength Indicator (closer to 0 is better) | +| Hop Count | Number of mesh hops for last message | + +### Signal Quality Reference + +| SNR Range | Quality | +| --------------------------------- | ----------- | +| > 10 dB | Excellent | +| 0 to 10 dB | Hyvä | +| -10 to 0 dB | Kohtalainen | +| < -10 dB | Poor | + +## Virranhallinnan arvot + +Power management telemetry (requires INA sensor or compatible hardware): + +| Metrijärjestelmä | Kuvaus | +| ---------------- | ----------------------- | +| Bus Voltage | Supply voltage | +| Virta | Power draw in milliamps | +| Virta | Calculated wattage | + +## Reitinselvitys + +Traceroute shows the path a message takes through the mesh: + +1. From the node detail screen, tap **Traceroute**. +2. The app sends a traceroute request to the target node. +3. Results show each hop with SNR/RSSI values. + +### Reading Traceroute Results + +``` +You → Node A (SNR: 8.5) → Node B (SNR: 5.2) → Target +``` + +Each hop represents a relay node that forwarded the message. + +## Sijainnin Loki + +Historical position data for nodes that share their location: + +- GPS coordinates +- Korkeus +- Speed (if moving) +- Timestamp for each position report + +## Naapuritieto + +Shows which nodes a given node can directly hear, useful for understanding mesh topology. + +## Viewing Metrics + +1. Navigate to **Nodes**. +2. Tap the node you want to inspect. +3. Select the metric category from the detail tabs. + +![Node detail — local device](/assets/screenshots/nodes_detail_local.png) + +The position tab shows location data for nodes that share GPS: + +![Position inline content](/assets/screenshots/nodes_position.png) + +> ⚠️ **Note:** Metrics are only available when they have been reported by the remote node. Metrics update at intervals configured on each node's telemetry settings. + +## Related Topics + +- [Nodes](nodes) — node list, filtering, and sorting +- [Telemetry & Sensors](telemetry-and-sensors) — supported sensors and configuration +- [Signal Meter](signal-meter) — how signal quality is calculated from SNR and RSSI +- [Discovery](discovery) — traceroute details and neighbor info +- [Units & Locale](units-and-locale) — temperature, distance, and speed display formats + +--- + diff --git a/docs/fi-rFI/user/nodes.md b/docs/fi-rFI/user/nodes.md new file mode 100644 index 000000000..f389094ea --- /dev/null +++ b/docs/fi-rFI/user/nodes.md @@ -0,0 +1,152 @@ +--- +title: Laitteet +nav_order: 4 +last_updated: 2026-05-13 +description: Browse, filter, and sort mesh nodes — view details, signal quality, roles, and quick actions. +aliases: + - node-list + - mesh-nodes + - peers +--- + +# Laitteet + +The Nodes screen displays all devices visible on your mesh network. + +## Node List + +The node list shows every node your radio has heard, including: + +- **Node name** — user-configured long name +- **Short name** — 4-character identifier +- **Signal quality** — last heard signal strength +- **Last heard** — time since last communication +- **Distance** — estimated distance (if positions are shared) +- **Battery** — remote node battery level (if telemetry is enabled) + +### Node Status Indicators + +| Badge | Meaning | +| ---------- | ------------------------------------- | +| 🟢 Online | Node heard within the last 15 minutes | +| 🟡 Away | Node heard within the last 2 hours | +| 🔴 Offline | Node not heard for over 2 hours | +| ⭐ Favorite | Node marked as favorite by the user | + +### Node Roles + +Nodes can be configured with different roles that affect their mesh behavior: + +| Rooli | Kuvaus | +| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Client | Standard end-user device | +| Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | +| Client Mute | Receives but doesn't retransmit | +| Client Hidden | Like Client Mute, plus hides from node list | +| Router | Prioritizes message forwarding; stays awake to relay | +| Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | +| ~~Router Client~~ | ⚠️ **Deprecated** (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | +| ~~Repeater~~ | ⚠️ **Deprecated** (removed in firmware 2.7.11) — no longer selectable; use Router instead | +| Tracker | Optimized for position reporting at regular intervals | +| Sensor | Optimized for telemetry reporting | +| TAK | Interoperates with TAK systems (sends/receives CoT) | +| TAK Tracker | TAK position reporting only | +| Lost & Found | Continuous position beacon for recovery | + +### Choosing a Role + +Most users should keep the default **Client** role. Consider a different role when: + +- **Router** — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don't use Router on battery-powered handheld devices. +- **Router Late** — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. +- **Client Base** — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. +- **Client Mute** — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only devices or to reduce congestion in dense areas. +- **Tracker** — An unattended device whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. +- **Sensor** — An unattended device reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. +- **TAK / TAK Tracker** — Only needed if interoperating with ATAK/WinTAK systems. See [TAK Integration](tak) for details. + +> 💡 **Tip:** The mesh works best when most nodes are **Client** or **Router**. Too many Mute nodes reduces mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. + +### Encryption Indicators + +Nodes display encryption status icons next to their name: + +| Icon | Meaning | +| ----------- | ------------------------------------------------------------------------------------------------------------------- | +| 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | +| 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | +| ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) | + +> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. + +## Quick Actions + +From the node list, you can: + +- **Tap** a node to view its detail page +- **Long-press** for quick actions: + - Send a direct message + - Näytä kartalla + - Pyydä sijaintia + - Mark as favorite + - Reitinselvitys + +## Filtering & Sorting + +### Text Search + +Type in the search field to filter nodes by name or short name. The filter updates in real time as you type. + +### Filter Toggles + +| Suodatus | Kuvaus | +| -------------------------- | ---------------------------------------------------------------------------------------------- | +| **Only online** | Show only nodes heard within the last 15 minutes | +| **Only direct** | Show only nodes with direct (non-relayed) connections | +| **Include unknown** | Show nodes that haven't sent user info yet | +| **Exclude infrastructure** | Hide infrastructure-role nodes (Router, Repeater, Router Late, Client Base) | +| **Exclude MQTT** | Hide nodes heard only via MQTT internet bridge | +| **Show ignored** | Show nodes you've previously dismissed or muted | + +### Sort Options + +| Sort | Kuvaus | +| ------------------------------------------- | ------------------------------------------------------------------ | +| **Last heard** (default) | Most recently heard nodes first | +| **Alphabetical** | Sorted by node long name | +| **Distance** | Nearest nodes first (requires position sharing) | +| **Hops away** | Fewest relay hops first | +| **Channel** | Grouped by channel index | +| **Via MQTT** | Grouped by MQTT vs. radio-heard | +| **Favorites** | Favorited nodes first | + +## Node Detail + +Tapping a node opens the detail view with comprehensive information. See [Node Metrics](node-metrics) for full details on metrics and telemetry. + +![Node detail view](/assets/screenshots/nodes_node_list.png) + +The detail screen includes device info, position, and action buttons: + +![Node detail section](/assets/screenshots/nodes_detail_section.png) + +Inline status indicators show key metrics at a glance: + +| Indicator | Screenshot | +| --------------- | -------------------------------------------------------- | +| Signal quality | ![Signal](/assets/screenshots/nodes_signal_info.png) | +| Akun varaus | ![Battery](/assets/screenshots/nodes_battery_info.png) | +| Hop count | ![Hops](/assets/screenshots/nodes_hops_info.png) | +| Viimeksi kuultu | ![Last heard](/assets/screenshots/nodes_last_heard.png) | +| Etäisyys | ![Distance](/assets/screenshots/nodes_distance_info.png) | + +## Related Topics + +- [Node Metrics](node-metrics) — detailed telemetry dashboards for each node +- [Messages & Channels](messages-and-channels) — send a direct message to a node +- [Map & Waypoints](map-and-waypoints) — view node positions geographically +- [Discovery](discovery) — traceroute and neighbor info for topology exploration +- [Signal Meter](signal-meter) — understand what the signal bars mean + +--- + diff --git a/docs/fi-rFI/user/onboarding.md b/docs/fi-rFI/user/onboarding.md new file mode 100644 index 000000000..3b910534e --- /dev/null +++ b/docs/fi-rFI/user/onboarding.md @@ -0,0 +1,99 @@ +--- +title: Getting Started +nav_order: 1 +last_updated: 2026-05-13 +description: First-launch setup — permissions, onboarding flow, and next steps after connecting your radio. +aliases: + - first-launch + - setup + - intro +--- + +# Getting Started + +Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app. + +## First Launch + +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. + +### Welcome Screen + +The welcome screen introduces Meshtastic and its core capabilities: + +- Off-grid mesh communication +- No cellular or internet required +- End-to-end encrypted messaging + +Tap **Get Started** to proceed through the setup flow. + +![Welcome screen](/assets/screenshots/onboarding_welcome.png) + +## Permissions + +The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. + +### Bluetooth Permission + +Bluetooth is the primary connection method between your phone and Meshtastic radio: + +- **Bluetooth scanning** — discover nearby Meshtastic radios +- **Bluetooth connect** — establish and maintain connections with paired radios + +Grant both permissions when prompted. Without Bluetooth, you'll need to use USB or TCP connections instead. + +### Location Permission + +> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. + +Meshtastic also uses your location for: + +- Showing your position on the mesh map +- Calculating distances to other nodes +- Sharing your GPS coordinates with other mesh members (if enabled) + +Grant **"While using the app"** or **"Always"** depending on your preference: + +- **While using the app** — position updates only when the app is open +- **Always** — enables background position updates for always-on mesh presence + +If denied, Bluetooth scanning will not function and your node will not report a position. + +### Notifications Permission + +Notifications alert you to: + +- Incoming messages from channels and direct messages +- Connection status changes (connected, disconnected, reconnecting) +- Firmware update availability + +> 💡 **Tip:** You can fine-tune notification preferences later in Android system settings. The app creates separate notification channels for messages, connection events, and background service status. + +### Critical Alerts Permission + +On supported devices, the app may request permission for critical alerts: + +- These are high-priority notifications that can break through Do Not Disturb mode +- Useful for emergency mesh alerts or urgent messages +- You can **skip** this step if you don't need breakthrough notifications +- Configure or revoke later in Android notification settings + +## After Setup + +Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. + +> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. + +## What's Next? + +Once connected to a radio, explore: + +- [Connections](connections) — pair your first radio device +- [Messages & Channels](messages-and-channels) — send your first message +- [Nodes](nodes) — see who's on your mesh +- [Map & Waypoints](map-and-waypoints) — view node positions +- [Settings](settings-radio-user) — configure your radio and user profile + +New to Meshtastic? The [getting started guide](https://meshtastic.org/docs/getting-started) on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup. + +--- diff --git a/docs/fi-rFI/user/settings-module-admin.md b/docs/fi-rFI/user/settings-module-admin.md new file mode 100644 index 000000000..e6a061430 --- /dev/null +++ b/docs/fi-rFI/user/settings-module-admin.md @@ -0,0 +1,246 @@ +--- +title: Settings — Modules & Admin +nav_order: 8 +last_updated: 2026-05-13 +description: Configure optional feature modules (MQTT, telemetry, canned messages, TAK, and more) and perform device administration. +aliases: + - modules + - module-config + - administration +--- + +# Settings — Modules & Admin + +Configure optional feature modules and perform device administration. Modules extend Meshtastic with specialized capabilities — each can be independently enabled or disabled. + +> 💡 **Tip:** You only need to enable the modules you actually use. Disabling unused modules reduces airtime, saves battery, and simplifies your configuration. + +Module settings use a card-based layout with toggle switches, dropdowns, text fields, and sliders: + +![Toggle switch](/assets/screenshots/settings_switch.png) + +![Dropdown selector](/assets/screenshots/settings_dropdown.png) + +![Text field](/assets/screenshots/settings_text_field.png) + +![Settings card layout](/assets/screenshots/settings_titled_card.png) + +## Module Configuration + +### MQTT Module + +Bridges mesh messages to and from an MQTT broker for internet connectivity. This is how you extend your mesh beyond radio range or integrate with home automation systems. + +| Setting | Kuvaus | +| --------------- | ------------------------------------------------------------------------ | +| Käytössä | Toggle MQTT bridge | +| Palvelin | MQTT broker address | +| Käyttäjänimi | Authentication username | +| Salasana | Authentication password | +| Salaus | Encrypt MQTT payloads | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON support removed from firmware; field is ignored | +| TLS | Use secure connection | +| Root Topic | Base MQTT topic path | +| Map Report | Publish position for public map | + +See [MQTT](mqtt) for a detailed usage guide including encryption, privacy, and broker setup. + +### Serial Module + +Enables serial port communication for external device integrations (GPS modules, sensors, or custom hardware). When enabled, the node's serial port can send and receive protobuf or text data, allowing external microcontrollers or computers to interact with the mesh. + +| Setting | Kuvaus | +| ----------------- | ------------------------------- | +| Käytössä | Activate serial communication | +| Toista | Echo received serial data back | +| Tila | Text, Protobuf, or NMEA output | +| RX/TX Pins | GPIO pins for serial connection | +| Baud-siirtonopeus | Serial communication speed | + +### External Notification Module + +Controls buzzer, LED, or vibration alerts on your radio hardware. Useful for devices that need to physically signal when a message arrives — particularly helpful for unattended or outdoor installations. + +| Setting | Kuvaus | +| -------------------------------- | --------------------------- | +| Käytössä | Activate notifications | +| Hälytysviesti | Notify on incoming messages | +| Hälytysviestin summeri | Use buzzer for messages | +| Alert Message Vibra | Use vibration for messages | +| Hälytysääni | Notify on bell character | +| Output (GPIO) | Pin for notification output | +| Käytössä | High or Low active | +| Duration (ms) | Notification length | +| Use I2S as Buzzer | Use I2S audio output | + +### Store & Forward Module + +Buffers messages for nodes that were temporarily offline, then replays them when those nodes reconnect. Essential for meshes where nodes go in and out of range regularly — ensures messages aren't lost during brief disconnections. + +| Setting | Kuvaus | +| ------------------------------------------ | -------------------------- | +| Käytössä | Activate store and forward | +| Heartbeat (s) | Announcement interval | +| Tiedot | Maximum stored messages | +| History Return (max) | Max messages to replay | +| History Return (window) | Time window for replay | + +> 💡 **Tip:** Store and Forward works best on nodes with ample memory (ESP32 with PSRAM). Router nodes are ideal candidates since they're typically always-on. + +### Range Test Module + +Automated range testing tool for evaluating link quality between nodes. When enabled, the node periodically transmits test messages with incrementing counters. A receiver node logs these messages, allowing you to walk or drive away and later analyze at what distance messages stopped arriving. + +| Setting | Kuvaus | +| -------------------------------------- | --------------------------------- | +| Käytössä | Activate range testing | +| Sender Interval (s) | Time between test transmissions | +| Save CSV | Log received test data to SD card | + +### Telemetry Module + +Controls what telemetry data your node shares with the mesh. Telemetry includes device health (battery, uptime) and environmental sensor data (temperature, humidity, pressure). + +| Setting | Kuvaus | +| ---------------------------- | --------------------------------------- | +| Device Metrics Interval | How often to report device metrics | +| Environment Metrics Interval | How often to report environment sensors | +| Ilmanlaatu käytössä | Report particulate sensor data | +| Power Metrics Enabled | Report power usage | + +See [Telemetry & Sensors](telemetry-and-sensors) for supported sensors and configuration recommendations. + +### Canned Message Module + +Pre-configured messages accessible from the device's physical buttons (for radios with rotary encoders, keypads, or similar input hardware). Define a list of quick-send messages that can be transmitted without a phone connected — ideal for field use. + +| Setting | Kuvaus | +| ------------------ | ----------------------------------------------------------- | +| ~~Enabled~~ | ⚠️ **Deprecated** — current firmware may ignore this toggle | +| Viestit | Newline-separated list of messages | +| Lähetä äänimerkki | Play bell sound on send | +| Rotary Encoder | Enable rotary encoder input | +| Up/Down/Press Pins | GPIO pin assignments for input | + +### Audio Module + +Codec2 audio support for low-bandwidth voice communication over the mesh. This is an **experimental** feature that encodes voice into very small data packets using the Codec2 codec. + +| Setting | Kuvaus | +| --------------- | -------------------------------- | +| Käytössä | Activate audio module | +| Codec2 Rate | Audio quality/bandwidth tradeoff | +| I2S Word Select | GPIO pin for I2S WS | +| I2S Data In | GPIO pin for I2S DIN | +| I2S Data Out | GPIO pin for I2S DOUT | + +> ⚠️ **Note:** Audio requires specific hardware (I2S microphone and speaker). Voice quality is very low-bandwidth — think "understandable radio voice," not phone-call quality. + +### Remote Hardware Module + +GPIO control over the mesh network. Allows a remote node to read or write GPIO pins on another node — useful for activating relays, reading switches, or controlling external hardware from a distance. + +| Setting | Kuvaus | +| -------------------- | --------------------------------------------------------------- | +| Käytössä | Activate remote GPIO access | +| Allow Undefined Pins | Allow access to any GPIO pin (security risk) | + +> ⚠️ **Warning:** Enabling "Allow Undefined Pins" gives remote nodes access to all GPIO pins, which could interfere with the radio's own hardware. Only enable on dedicated GPIO nodes. + +### Neighbor Info Module + +Broadcasts information about directly heard neighbors, enabling mesh topology mapping. Each enabled node periodically shares a list of the other nodes it can hear and their signal quality. + +| Setting | Kuvaus | +| -------------------------------------- | ------------------------------------ | +| Käytössä | Activate neighbor broadcasting | +| Update Interval (s) | How often to broadcast neighbor list | + +See [Discovery](discovery) for how to use neighbor data for mesh topology exploration. + +### Ambient Lighting Module + +Controls onboard NeoPixel or other addressable RGB LEDs on supported hardware. Can be used for visual status indicators, notification lights, or decorative effects. + +| Setting | Kuvaus | +| ------------------ | ---------------------------------------------------------- | +| Käytössä | Activate LED control | +| Ledin tila | On, Off, or set specific color | +| Red / Green / Blue | Individual color channel values (0–255) | + +### Detection Sensor Module + +Turns your node into a motion or door sensor alert system. When a GPIO pin detects a state change (motion detected, door opened), the node broadcasts an alert message over the mesh. + +| Setting | Kuvaus | +| ---------------------------------------- | ----------------------------------------------------------------------- | +| Käytössä | Activate detection sensor | +| Valvonta pinni | GPIO pin connected to sensor | +| Havaitsemisen tunnistus korkea | Trigger when pin goes high (vs. low) | +| Minimum Broadcast (s) | Minimum time between alert broadcasts | +| State Broadcast (s) | Periodic state broadcast interval | +| Lähetä äänimerkki | Include bell character in alerts | +| Käyttäjäystävälinen nimi | Custom name for this sensor | + +### Paxcounter Module + +People counter using WiFi and BLE probe requests. Counts nearby devices by passively listening for probe requests that phones and laptops emit when scanning for networks. Available only on ESP32 devices. + +| Setting | Kuvaus | +| -------------------------------------- | -------------------------- | +| Käytössä | Activate people counting | +| Update Interval (s) | How often to report counts | + +> 💡 **Tip:** Paxcounter is useful for estimating foot traffic at trailheads, event venues, or other locations. Counts are approximate — one person may carry multiple devices. + +### TAK Module + +Team Awareness Kit integration for interoperability with ATAK and WinTAK. See [TAK Integration](tak) for detailed setup and usage. + +## Ylläpito + +### Etähallinta + +Remotely configure nodes that share your admin key: + +1. Select the target node in the node list. +2. Navigate to **Settings** for that node. +3. Modify configuration. +4. Tap **Save** — changes are sent over the mesh. + +> ⚠️ **Requires:** Admin key configured on both your node and the target node. + +### Tyhjennä NodeDB-tietokanta + +Removes stale nodes from your local database that haven't been heard in a configurable time window. + +### Factory Reset + +Resets all settings to factory defaults. **This cannot be undone.** + +### Käynnistä uudelleen + +Remotely reboot a connected or administered node. + +### Vianetsintäpaneeli + +View detailed diagnostic information: + +- Protocol buffers debug output +- Mesh packet log +- Connection state details + +### Troubleshooting Remote Admin + +- **"No response from target node"** — the target may be out of range, offline, or have a mismatched admin key. Verify the admin key matches on both nodes. +- **Changes not applying** — some settings require a reboot to take effect. Try the Reboot action after saving. +- **Can't see remote settings** — ensure your node has the admin key for the target node and that Admin Channel is enabled in Security Config. + +## Related Topics + +- [Settings — Radio & User](settings-radio-user) — core radio and user profile settings +- [Module configuration reference](https://meshtastic.org/docs/configuration/module) — detailed module docs on meshtastic.org +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/fi-rFI/user/settings-radio-user.md b/docs/fi-rFI/user/settings-radio-user.md new file mode 100644 index 000000000..97fdec129 --- /dev/null +++ b/docs/fi-rFI/user/settings-radio-user.md @@ -0,0 +1,173 @@ +--- +title: Settings — Radio & User +nav_order: 7 +last_updated: 2026-05-13 +description: Configure your radio hardware, LoRa presets, user profile, position sharing, power management, and security. +aliases: + - asetukset + - radio-config + - user-config + - lora +--- + +# Settings — Radio & User + +Configure your radio hardware and user identity parameters. + +## Käyttäjäasetukset + +### User Profile + +| Setting | Kuvaus | +| ----------------- | ------------------------------------------------------------------------------------- | +| Pitkä nimi | Your display name (up to 39 characters) | +| Lyhytnimi | 4-character abbreviated name | +| Licensed Operator | Enable if you hold an amateur radio license (enables higher power) | + +### Applying Changes + +After modifying settings, tap **Save** to write the configuration to your radio. The device may reboot to apply changes. + +## Radio Configuration + +### Laitteen asetukset + +| Setting | Kuvaus | Oletus | +| ------------------------------------------ | ----------------------------------------------------------------------- | -------- | +| Rooli | Node behavior (Client, Router, etc.) | Client | +| Uudelleenlähetyksen tila | How the node retransmits messages | Kaikki | +| Node Info Broadcast (s) | Interval for broadcasting node info | 10800 | +| Double-tap Button | Action for double-tap button press | Disabled | + +### LoRa:n asetukset + +| Setting | Kuvaus | Oletus | +| ------------------ | ----------------------------------------------------------------------- | ----------------------------------------- | +| Alue | Regulatory region for frequency bands | Unset (must configure) | +| Modeemin esiasetus | Speed/range tradeoff | LongFast | +| Hyppyraja | Maximum retransmit hops | 3 | +| TX Power | Transmission power (dBm); 0 = max allowed for region | 0 (region max) | +| Taajuuspoikkeama | Fine-tune frequency (MHz) | 0 | +| Channel Bandwidth | Bandwidth setting | Default for preset | + +> ⚠️ **Important:** You **must** set your region before transmitting. Operating without the correct region may violate local radio regulations. See the [region configuration guide](https://meshtastic.org/docs/getting-started/initial-config) on meshtastic.org for details. + +### Modem Presets + +| Preset | Range | Nopeus | SNR Limit | Best For | +| ------------------ | ----------------------- | ------------------------- | ------------------------ | -------------------------------------------------------------------------------------------------------- | +| Short Turbo | ~1 km | 21.9 kbps | −5 dB | Dense urban with line-of-sight; data-heavy applications | +| Short Fast | ~3 km | 10.9 kbps | −7.5 dB | Urban neighborhoods; buildings within a few blocks | +| Short Slow | ~5 km | 5.5 kbps | −10 dB | Suburban short-range; moderate building density | +| Medium Fast | ~5 km | 5.5 kbps | −10 dB | Suburban areas; moderate building density | +| Medium Slow | ~8 km | 1.1 kbps | −12.5 dB | Suburban/rural; moderate range with slower speed | +| Long Turbo | ~10 km | 4.4 kbps | −10 dB | Similar range to Long Fast but with 500 kHz bandwidth; faster throughput | +| Long Fast | ~10 km | 1.1 kbps | −12.5 dB | **General use (default)** — balanced range and speed | +| Long Moderate | ~20 km | 0.34 kbps | −15 dB | Rural with some terrain; occasional use | +| Lite Fast | ~5 km | 5.5 kbps | −10 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Medium Fast | +| Lite Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Long Fast | +| Narrow Fast | ~5 km | 2.7 kbps | −10 dB | EU 868 MHz band (62.5 kHz BW); avoids interference with other devices | +| Narrow Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 868 MHz band (62.5 kHz BW); comparable to Long Fast | +| ~~Long Slow~~ | ~30 km | 0.18 kbps | −17.5 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | +| ~~Very Long Slow~~ | ~40+ km | 0.09 kbps | −20 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | + +#### Choosing a Modem Preset + +The modem preset controls the fundamental tradeoff between **range** and **data rate**: + +- **Slower presets** use more spreading, making signals decodable at weaker signal levels (lower SNR limit). This means longer range but fewer bytes per second. +- **Faster presets** pack more data per transmission but require a stronger signal to decode. + +**Practical guidance:** + +- **Urban mesh (many nodes, short distances):** Use **Long Fast** (default) or **Short Fast**. Higher speed means less airtime congestion when many nodes share the channel. +- **Rural/sparse mesh (few nodes, long distances):** Use **Long Moderate**. Range matters more than speed when nodes are far apart. +- **EU 866/868 MHz regulatory compliance:** Use **Lite Fast**, **Lite Slow**, **Narrow Fast**, or **Narrow Slow** — these are optimized for the EU SRD/868 MHz bands with narrower bandwidths. +- **Fixed infrastructure links:** Use **Short Turbo** or **Long Turbo** for dedicated point-to-point links with good antennas and line-of-sight. +- **Mixed environments:** Stick with **Long Fast** — it's the community default and ensures compatibility with others in your area. + +> ⚠️ **Important:** All nodes on the same channel **must** use the same modem preset. Nodes with mismatched presets cannot communicate even if they share the same frequency and encryption key. + +> 💡 **Tip:** The range estimates above assume flat terrain and modest antennas. Elevation advantage (hilltop, rooftop) dramatically increases effective range. A well-placed Router with Long Fast can often outperform a ground-level node with Long Slow. + +### Näytön asetukset + +| Setting | Kuvaus | +| ------------------- | ------------------------------------------------------------------------------------ | +| Näytön aikakatkaisu | Time before display sleeps | +| Näyttöyksiköt | Metric or Imperial | +| OLED-tyyppi | Auto, SSD1306, SH1106, SH1107 | +| Compass Orientation | Rotation offset for compass display (0°, 90°, 180°, 270°) | +| ~~Compass North~~ | ⚠️ **Deprecated** — replaced by Compass Orientation; still visible in older firmware | + +### Sijainnin asetukset + +| Setting | Kuvaus | +| ----------------------------------------- | ---------------------------------- | +| GPS Enabled | Enable/disable GPS | +| GPS-päivitysväli | How often to acquire GPS fix | +| Position Broadcast (s) | How often to share position | +| Älykäs sijainti | Enable movement-based broadcasting | +| Kiinteä sijainti | Use a manually set position | + +### Virran asetukset + +| Setting | Kuvaus | +| --------------------------------------- | --------------------------------------- | +| Power Saving | Enable low-power sleep mode | +| Shutdown After (s) | Auto-shutdown idle timer | +| ADC Multiplier | Battery voltage calibration factor | +| Wait Bluetooth (s) | Time to wait for BLE connection at boot | +| Mesh SDS Timeout (s) | Super-deep-sleep timeout | + +### Verkon asetukset + +| Setting | Kuvaus | +| ------------- | ---------------------------------------------------- | +| WiFi Enabled | Enable WiFi radio (ESP32 devices) | +| WiFi SSID | Network name to connect to | +| WiFi PSK | Verkon salasana | +| NTP-palvelin | Time synchronization server | +| Syslog Server | Remote logging server | + +![IP address field](/assets/screenshots/settings_ipv4_field.png) + +### Bluetooth asetukset + +| Setting | Kuvaus | +| ----------------- | ------------------------------------------------------------------------- | +| Bluetooth Enabled | Enable/disable BLE radio | +| Pairing Mode | Fixed PIN, Random PIN, or No PIN | +| Kiinteä PIN-koodi | PIN code for pairing (default: 123456) | + +### Turvallisuusasetukset + +| Setting | Kuvaus | +| --------------------- | -------------------------------------------------------------------------- | +| Julkinen avain | Your node's public key (read-only) | +| Ylläpitäjän avain | Key for remote administration | +| Yksityinen avain | Your node's private key (handle securely) | +| Admin Channel Enabled | Allow admin commands via channel | +| Debug Log | Output live debug logging over serial/bluetooth | +| Serial Enabled | Enable serial console access (moved from Device Config) | +| Hallintatila | Restrict non-admin channel changes | + +![Password field](/assets/screenshots/settings_password_field.png) + +Settings use standard preference controls — dropdowns, toggles, and sliders: + +| Control | Screenshot | +| -------- | ------------------------------------------------------ | +| Dropdown | ![Dropdown](/assets/screenshots/settings_dropdown.png) | +| Toggle | ![Toggle](/assets/screenshots/settings_switch.png) | +| Slider | ![Slider](/assets/screenshots/settings_slider.png) | + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — optional feature modules and device administration +- [Signal Meter](signal-meter) — how modem presets affect signal quality thresholds +- [LoRa configuration](https://meshtastic.org/docs/configuration/radio/lora) — detailed LoRa settings reference on meshtastic.org +- [Initial configuration](https://meshtastic.org/docs/getting-started/initial-config) — region setup guide on meshtastic.org + +--- + diff --git a/docs/fi-rFI/user/signal-meter.md b/docs/fi-rFI/user/signal-meter.md new file mode 100644 index 000000000..264c3ba07 --- /dev/null +++ b/docs/fi-rFI/user/signal-meter.md @@ -0,0 +1,81 @@ +--- +title: How the Meshtastic Signal Meter Works +nav_order: 15 +last_updated: 2026-05-13 +description: How the signal meter calculates quality from RSSI and SNR — LoRa spread spectrum, presets, and what the bars really mean. +aliases: + - signal + - signal-meter + - snr + - rssi +--- + +# How the Meshtastic Signal Meter Works + +The Meshtastic signal meter — the familiar bars or status color in the app — is calculated very differently than the "bars" on a traditional cell phone or Wi-Fi router. + +Most consumer devices simply measure how "loud" a signal is. However, because Meshtastic uses **LoRa (Long Range)** technology, its signal meter measures how **clear** the signal is, relative to the specific settings your mesh is using. + +--- + +## 1. The Two Metrics: "Loudness" vs. "Clarity" + +Every time the LoRa radio chip receives a message, it reports two measurements: + +- **RSSI (Received Signal Strength Indicator):** The **loudness** of the raw power hitting your antenna. +- **SNR (Signal-to-Noise Ratio):** The **clarity** of the signal compared to the background static. + +> **Tip — The Analogy:** Imagine you are trying to hear a friend talking to you. +> +> - **RSSI** is how loud their voice is. +> - **The Noise Floor** is the background noise in the room (air conditioning, other people talking, traffic). +> - **SNR** is how easily you can distinguish your friend's voice from the background noise. + +If your friend shouts at you at a deafening rock concert, the signal is incredibly loud (High RSSI), but you still can't understand them because the background noise is louder (Bad SNR). Conversely, if your friend whispers to you in a dead-silent library, the signal is very weak (Low RSSI), but you can understand them perfectly (Great SNR). + +--- + +## 2. The Magic of LoRa: Hearing "Below the Noise Floor" + +For standard radios (like FM or Wi-Fi), if the background noise is louder than the signal (a negative SNR), the receiver just hears static. + +LoRa is special. It uses **"Spread Spectrum"** modulation, which allows the radio to mathematically pull a signal out of the air even when it is buried deep _underneath_ the background noise. This is why you will frequently see **negative SNR numbers** in Meshtastic (e.g., -10 dB, which means the signal is 10 decibels weaker than the background static). + +Depending on which Meshtastic preset you are using (e.g., `LongFast` vs. `ShortFast`), the radio has a specific **SNR Limit** — the absolute maximum amount of noise it can tolerate before the message is completely lost to the static. + +--- + +## 3. How the Signal Meter Calculates Quality + +The Meshtastic apps take both RSSI and SNR and run them through a specific formula to assign your signal a quality rating (None, Bad, Fair, or Good). It specifically scales these values based on the physical limits of the radio preset you are using. + +Here is exactly how the app decides how many bars (or what color) to show you: + +| Level | Bars | Criteria | Meaning | +| ----------- | ---- | ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | +| Hyvä | 3 | RSSI better than `-115 dBm` **AND** SNR better than `-7 dB` | Signal is both loud and clear — healthy connection. | +| Kohtalainen | 2 | RSSI better than `-126 dBm` with good SNR, **OR** SNR better than `-15 dB` with good RSSI | Signal getting quieter or noisier, but still decodable. | +| Huono | 1 | Falls between Fair and None thresholds | At the edge of range or experiencing interference. | +| ei mitään | 0 | RSSI worse than `-126 dBm` **AND** SNR worse than `-15 dB` | Transmission completely buried in noise. | + +--- + +## 4. What This Means for You + +Because Meshtastic's meter acts as a **"Clarity Meter"**, it behaves differently than what most people expect: + +> **Tip — Don't panic over low RSSI:** You might see a seemingly terrible RSSI value like `-118 dBm`. On a cell phone, you would have zero bars. But if you have an SNR of `+2 dB`, Meshtastic will still show a strong signal! _The library is quiet, so the whisper is heard perfectly._ + +> **Warning — Watch out for local noise:** If you hook up a massive antenna and see a great RSSI (e.g., `-90 dBm`) but your signal meter is only showing **1 Bar (Bad)**, you have a problem. It means you have local interference — perhaps a cheap power supply, a noisy computer, or a nearby radio tower — creating so much static that it is drowning out your mesh. + +## Where Signal Information Appears + +In the app, signal data is shown in several places: + +- **Node list** — signal bars icon next to each node +- **Node detail** — SNR, RSSI, and signal quality in the device metrics section +- **Traceroute** — per-hop signal quality for each relay node +- **Signal metrics** — historical SNR and RSSI data in the metrics charts + +![Node entry showing SNR, RSSI values and colored signal bars](/assets/screenshots/nodes_signal_info.png) + diff --git a/docs/fi-rFI/user/tak.md b/docs/fi-rFI/user/tak.md new file mode 100644 index 000000000..33edc4961 --- /dev/null +++ b/docs/fi-rFI/user/tak.md @@ -0,0 +1,126 @@ +--- +title: TAK Integration +nav_order: 10 +last_updated: 2026-05-13 +description: Interoperate with ATAK and WinTAK — CoT position sharing, TAK roles, and plugin setup. +aliases: + - tak + - atak + - team-awareness-kit +--- + +# TAK Integration + +Meshtastic integrates with the Team Awareness Kit (TAK) ecosystem, enabling interoperability between Meshtastic mesh devices and TAK applications like ATAK and WinTAK. + +## Yleiskatsaus + +The TAK module allows Meshtastic nodes to: + +- Share position data in TAK-compatible CoT (Cursor on Target) format +- Appear as team members on TAK map displays +- Receive TAK PLI (Position Location Information) messages + +## Setup + +### Edellytykset + +- ATAK (Android Team Awareness Kit) or WinTAK installed +- Meshtastic ATAK Plugin installed +- TAK module enabled on your Meshtastic radio + +### Asetukset + +1. Navigate to **Settings → Module Config → TAK**. +2. Enable the TAK module. +3. Configure the TAK team/group settings: + +![Module toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | Kuvaus | +| -------- | -------------------------- | +| Käytössä | Activate TAK interop | +| Tila | TAK-compatible output mode | + +### ATAK Plugin Setup + +1. Install the Meshtastic ATAK Plugin from the plugin repository. +2. Open ATAK and enable the Meshtastic plugin. +3. The plugin bridges messages between ATAK and your mesh network. + +## TAK Roles + +Nodes configured with TAK-related roles behave differently from standard clients: + +| Rooli | Kuvaus | +| --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **TAK** | Full TAK interoperability — sends and receives CoT data, chat messages, and PLI updates. Functions as a standard client plus TAK bridge. | +| **TAK Tracker** | Position-only TAK output — automatically broadcasts PLI at regular intervals without user interaction. Optimized for unattended position beacons (vehicles, equipment, waypoints). Does not relay chat messages. | + +> 💡 **Tip:** Use **TAK Tracker** for devices that only need to report position (e.g., a radio mounted in a vehicle). Use **TAK** for devices where users actively participate in TAK operations. + +### CoT (Cursor on Target) Format + +TAK messages use the Cursor on Target XML format — a military standard for sharing situational awareness data. Meshtastic converts its internal protobuf messages to CoT format when bridging to TAK systems, so no manual format conversion is needed. + +## TAK Identity + +When using TAK roles, your node broadcasts identity information that appears on TAK maps: + +| Setting | Kuvaus | +| -------- | ---------------------------------------------------------------------------------------------------------------- | +| Team | Your team color on the TAK map (e.g., Blue, Red, Cyan, Green) | +| Rooli | Your operational role (Team Member, Team Lead, HQ, Medic, RTO, etc.) | +| Callsign | Your TAK callsign (defaults to your Meshtastic long name) | + +These settings appear in **Settings → Module Config → TAK** when the TAK module is enabled. + +> 💡 **Tip:** Team/role colors are the standard TAK affiliation colors. Coordinate with your TAK team to use consistent team assignments. + +## Wire Format (V1 / V2) + +Meshtastic supports two TAK wire formats: + +| Format | Compatibility | Ominaisuudet | +| ------------------------------- | --------------------------------------------------------------- | --------------------------------------------------------- | +| V1 (Legacy) | ATAK Plugin v1.x, older firmware | Basic CoT position sharing only | +| V2 (Current) | ATAK Plugin v2.x, firmware 2.3+ | Full CoT support including chat, routes, zstd compression | + +The app automatically selects V2 when both sides support it. No manual configuration needed — the TAK module negotiates format based on firmware capabilities. + +## Usage with ATAK + +Once configured: + +- Meshtastic nodes appear as markers on the ATAK map with callsign labels +- Chat messages can bridge between mesh and TAK networks +- Position updates flow bidirectionally between Meshtastic and TAK +- TAK Tracker nodes broadcast PLI automatically — their positions appear on ATAK maps without any ATAK-side configuration + +> ⚠️ **Note:** TAK integration requires specific node roles and module configuration. Standard client nodes don't automatically participate in TAK operations. + +## Vianetsintä + +| Problem | Cause | Solution | +| -------------------------------- | ------------------------------------- | ----------------------------------------------------------------------- | +| Node doesn't appear on ATAK map | TAK module disabled or wrong role | Verify TAK module is enabled and node role is TAK or TAK Tracker | +| Position updates are stale | GPS fix lost or interval too long | Check GPS status; reduce position broadcast interval in Position Config | +| ATAK plugin shows "disconnected" | BLE connection lost or plugin crashed | Reconnect Bluetooth in Meshtastic app, then restart ATAK plugin | +| Chat messages not bridging | V1 format doesn't support chat | Ensure both nodes run firmware 2.3+ for V2 wire format | +| CoT data not flowing | Channel mismatch | All TAK nodes must be on the same channel with matching encryption | + +## Security Considerations + +- TAK data shares your position and callsign information +- Ensure your channel encryption is configured when using TAK in sensitive environments +- The TAK module respects the same channel encryption as other Meshtastic messages + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — TAK module configuration +- [Nodes](nodes) — TAK and TAK Tracker roles in the node list +- [Map & Waypoints](map-and-waypoints) — node positions on the map +- [ATAK plugin guide](https://meshtastic.org/docs/software/integrations/atak-plugin) — detailed ATAK setup on meshtastic.org + +--- + diff --git a/docs/fi-rFI/user/telemetry-and-sensors.md b/docs/fi-rFI/user/telemetry-and-sensors.md new file mode 100644 index 000000000..c1410e4f1 --- /dev/null +++ b/docs/fi-rFI/user/telemetry-and-sensors.md @@ -0,0 +1,118 @@ +--- +title: Telemetry & Sensors +nav_order: 9 +last_updated: 2026-05-13 +description: Sensor data on the mesh — supported environment, air quality, and power sensors, plus configuration and viewing guides. +aliases: + - sensors + - environment + - weather + - power-metrics +--- + +# Telemetry & Sensors + +Meshtastic nodes can collect and share sensor data across the mesh network. + +## Yleiskatsaus + +Telemetry allows nodes equipped with sensors to broadcast environmental, power, and device health information. This data is visible on the node detail screen and can be logged over time. + +## Device Telemetry + +All Meshtastic nodes report basic device telemetry: + +| Metrijärjestelmä | Kuvaus | Typical Range | +| ------------------ | ------------------------------ | ------------------------------------------------------------------ | +| Battery Level | Charge percentage | 0–100% | +| Jännite | Battery voltage | 3.0–4.2V (LiPo) | +| Kanavan Käyttö | % of airtime used locally | 0–100% | +| Air Utilization TX | % of airtime used by this node | 0–100% | +| Käyttöaika | Seconds since last boot | Varies | + +## Environment Sensors + +Supported environmental sensors: + +### Temperature & Humidity + +| Sensor | Lämpötila | Kosteus | Ilmanpaine | Viestit | +| ------- | --------- | ------- | ---------- | ----------------------- | +| BME280 | ✓ | ✓ | ✓ | Recommended all-in-one | +| BME680 | ✓ | ✓ | ✓ | Adds gas resistance/IAQ | +| SHT31 | ✓ | ✓ | — | High accuracy | +| MCP9808 | ✓ | — | — | Precision temperature | +| LPS22 | — | — | ✓ | Pressure only | + +### Air Quality + +| Sensor | Metrijärjestelmä | Viestit | +| -------- | -------------------------------------------------- | -------------------------- | +| BME680 | Gas Resistance / IAQ | Volatile organic compounds | +| PMSA003I | PM1.0, PM2.5, PM10 | Particulate matter | +| SEN55 | PM, NOx, VOC, Temp, Humidity | Multi-sensor | + +### Light & UV + +| Sensor | Metrijärjestelmä | +| -------- | -------------------------------------- | +| OPT3001 | Ambient light (lux) | +| VEML7700 | Ambient light (lux) | +| LTR390 | UV index | + +## Virranhallinnan arvot + +Nodes with INA-series power sensors can report: + +| Metrijärjestelmä | Kuvaus | +| ---------------- | ----------------------------------------- | +| Bus Voltage | Supply rail voltage | +| Virta | Power consumption (mA) | +| Virta | Calculated power (mW) | + +Useful for monitoring solar charging or battery health on remote nodes. + +## Configuring Telemetry + +1. Navigate to **Settings → Module Config → Telemetry**. +2. Set reporting intervals: + - **Device Metrics Interval** — how often to broadcast device metrics + - **Environment Metrics Interval** — how often to broadcast sensor data +3. Enable specific sensor types as needed. + +### Recommended Intervals + +| Use Case | Device (s) | Environment (s) | +| ------------------------------------------ | ----------------------------- | ---------------------------------- | +| Urban mesh (many nodes) | 3600 | 3600 | +| Rural mesh (few nodes) | 900 | 900 | +| Weather station | 900 | 300 | +| Battery conservation | 7200 | 7200 | + +> ⚠️ **Note:** Shorter intervals increase airtime usage and battery drain across the mesh. + +## Viewing Telemetry + +1. Navigate to **Nodes** and select a node. +2. Telemetry sections show on the detail screen: + - Device Metrics (always available) + - Environment Metrics (if sensors present) + - Power Metrics (if INA sensor present) +3. Historical graphs show trends over time. + +![Telemetry actions](/assets/screenshots/node-metrics_telemetric_actions.png) + +## Vianetsintä + +- **No environment data showing?** The remote node needs a physical sensor connected (e.g., BME280 on I2C). Device telemetry (battery, uptime) is always available, but environment metrics require hardware. +- **Stale readings?** Check the reporting interval — very long intervals (7200s+) mean data updates infrequently. Also verify the remote node is still online. +- **Sensor conflict on I2C bus?** Some sensors share I2C addresses. If you have multiple sensors on the same bus, check for address collisions in the radio's serial debug output. + +## Related Topics + +- [Node Metrics](node-metrics) — view telemetry data on the node detail screen +- [Settings — Modules & Admin](settings-module-admin) — telemetry module configuration +- [Units & Locale](units-and-locale) — temperature and pressure display units + +--- + diff --git a/docs/fi-rFI/user/translate.md b/docs/fi-rFI/user/translate.md new file mode 100644 index 000000000..7ab9c7b2c --- /dev/null +++ b/docs/fi-rFI/user/translate.md @@ -0,0 +1,97 @@ +--- +title: Translate the App +parent: User Guide +nav_order: 17 +last_updated: 2026-05-13 +aliases: + - translate + - crowdin + - localization +--- + +# Translate the App + +Contributing translations helps make Meshtastic accessible to a wider audience. The app uses [Crowdin](https://crowdin.com/) to manage community translations for both the user interface and in-app documentation. + +--- + +## What Gets Translated + +| Resource | Source Location | Viestit | +| ----------------- | ------------------------------------- | ---------------------------------------------------------------------- | +| UI strings | `composeResources/values/strings.xml` | Buttons, labels, messages, and all user-visible text | +| User Guide pages | `docs/user/*.md` | In-app documentation shown in Help & Documentation | +| Fastlane metadata | `fastlane/metadata/android/en-US/` | App Store listing title, description, and changelogs | + +> **Note — Developer Guide pages are English-only.** Code-focused documentation targeting contributors is not translated. + +--- + +## How to Contribute + +1. **Visit the Crowdin project.** Open the [Meshtastic Android Crowdin project](https://crowdin.com/project/meshtastic-android) and sign in or create a free account. +2. **Choose your language.** Select an existing language or request a new one by opening a [GitHub issue](https://github.com/meshtastic/Meshtastic-Android/issues/new). +3. **Translate strings.** Crowdin shows the English source on the left and your translation on the right. Translate each string and save. +4. **Review context.** Many strings include screenshots or context comments — check these to understand where the text appears in the app. +5. **Submit.** Approved translations are automatically merged into the next release. + +> **Tip — Keep translations short.** UI strings often appear in buttons, chips, or narrow columns. If a translation is significantly longer than the English original, consider abbreviating where the meaning stays clear. + +--- + +## Adding a New Language + +If your language is not yet listed on Crowdin: + +1. Open an issue on [GitHub](https://github.com/meshtastic/Meshtastic-Android/issues/new) requesting the new locale. +2. A maintainer will add the language to Crowdin and configure `crowdin.yml`. +3. Once added, you can begin translating immediately. + +--- + +## How Translations Are Organized + +The Android app uses **Compose Multiplatform resources** for all user-visible strings: + +``` +core/resources/src/commonMain/composeResources/ +├── values/ ← English (default) +│ └── strings.xml +├── values-de/ ← German +│ └── strings.xml +├── values-fr/ ← French +│ └── strings.xml +└── ... +``` + +In-app documentation follows a similar pattern under `docs/`: + +``` +docs/ +├── user/ ← English source (default) +│ ├── onboarding.md +│ └── ... +├── fr/user/ ← French translations +│ ├── onboarding.md +│ └── ... +└── ... +``` + +The app automatically selects the correct locale based on your device's **Language & Region** settings. + +--- + +## Translation Guidelines + +- **Do not translate** technical terms like "LoRa", "MQTT", "BLE", "TAK", "SNR", or "RSSI" — these are universal. +- **Keep placeholders intact.** Strings like `%1$s` or `%d` are filled in at runtime. Do not remove or reorder them unless the grammar of your language requires it. +- **Match tone.** The app uses a friendly, direct voice. Avoid overly formal language. +- **Test if possible.** Switch your device language and open the app to see how translations look in context. + +--- + +## Questions? + +If you have questions about a specific string's context or need help getting started, open a discussion on the [Meshtastic GitHub Discussions](https://github.com/meshtastic/Meshtastic-Android/discussions) page. + +Thank you for helping expand the reach of Meshtastic! diff --git a/docs/fi-rFI/user/units-and-locale.md b/docs/fi-rFI/user/units-and-locale.md new file mode 100644 index 000000000..0ab36af44 --- /dev/null +++ b/docs/fi-rFI/user/units-and-locale.md @@ -0,0 +1,118 @@ +--- +title: Units, Measurement & Locale +parent: User Guide +nav_order: 16 +last_updated: 2026-05-12 +--- + +# Units, Measurement & Locale + +The Meshtastic app automatically displays temperatures, distances, speeds, and times in the units your device is configured to use — no settings to change inside the app. + +--- + +## How It Works + +Meshtastic radios always transmit data in **metric units** (meters, °C, km/h, hPa, etc.). When the app receives this data, it uses the `MetricFormatter` utility to convert and display values in whatever unit system your device's locale specifies. + +On Android, your measurement preferences are determined by your system **Language & Region** settings. On Desktop (JVM), the app uses the JVM's default `Locale`. + +> **Tip — You never need to toggle units inside the app.** Change your system measurement preferences and every screen in Meshtastic updates automatically — node details, telemetry charts, weather, altitude, and more. + +--- + +## Lämpötila + +Temperature values from environment sensors are transmitted as **°C** and displayed based on your device's temperature unit preference. + +![Environment metrics with temperature](/assets/screenshots/nodes_environment_metrics.png) + +| Your Setting | You See | +| ------------ | ------- | +| Celsius | 22°C | +| Fahrenheit | 72°F | + +This affects all temperature displays throughout the app: node environment telemetry, soil temperature, dew point, and telemetry chart axes. + +## Distance & Altitude + +Distances between nodes and GPS altitudes are transmitted as **meters** and automatically scaled and converted. + +![Distance info display](/assets/screenshots/nodes_distance_info.png) + +| Your Setting | Small Distance | Large Distance | Korkeus | +| -------------------------------- | -------------- | ---------------------- | -------- | +| Metrijärjestelmä | 350 m | 2.5 km | 1,200 m | +| Imperial (US) | 1,148 ft | 1.6 mi | 3,937 ft | + +The app uses natural scaling — short distances stay in meters or feet, while longer distances switch to kilometres or miles automatically. + +### Where these appear + +- **Node list** — distance and bearing to each node +- **Node detail** — altitude, distance from your position +- **Map** — waypoint distances, traceroute hop distances +- **Compass** — distance to selected node + +## Nopeus + +GPS ground speed is displayed in your locale's preferred speed unit. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Metrijärjestelmä | 12 km/h | +| Imperial (US) | 7 mph | + +## Tuuli + +Wind speed and gust data from environment sensors are transmitted as **m/s** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Metrijärjestelmä | 5 m/s | +| Imperial (US) | 11 mph | + +Wind readings appear in the **Node Detail** environment section and the **Environment Telemetry** charts. + +## Rainfall + +Rainfall measurements (1-hour and 24-hour totals) are transmitted as **mm** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ---------------------- | +| Metrijärjestelmä | 12 mm | +| Imperial (US) | 0.5 in | + +## Units That Never Change + +Some units are international standards and are displayed the same way regardless of your locale: + +| Measurement | Unit | Why | +| -------------------------------- | ------------------------------ | ------------------------------------- | +| Barometric pressure | hPa | International meteorological standard | +| Heading / bearing | ° (degrees) | Universal navigation convention | +| Säteily | μR/hr | Standard dosimetry unit | +| GPS coordinates | decimal degrees | Universal geographic standard | +| Humidity, battery, soil moisture | % | Universal | + +## Date & Time + +All timestamps throughout the app — last heard, message times, telemetry logs, chart axes — follow your device's date and time preferences. + +| Setting | What It Controls | Example | +| ---------------- | ---------------- | ------------------------------------------------ | +| **24-Hour Time** | Clock format | 14:30 vs 2:30 PM | +| **Date Format** | Date ordering | 09/05/2026 vs 05/09/2026 | + +The app also uses **relative time** where it makes sense — for example, "5 min ago" or "2 hours ago" in the node list — which is automatically localised into your device language. + +## Changing Your Measurement System (Android) + +On Android, your measurement system (metric vs imperial) is tied to your region setting: + +1. Open **Android Settings → System → Language & Region** +2. Change your **Region** or **Measurement units** preference +3. Return to Meshtastic — values update immediately + +> **Tip — The app uses `MetricFormatter` from `core:common`.** All measurement formatting is handled by a shared KMP utility that respects your platform's locale. Developers adding new measurement displays should use `MetricFormatter` rather than hard-coding unit conversions. + diff --git a/docs/fr-rFR/index.md b/docs/fr-rFR/index.md new file mode 100644 index 000000000..b38b80d74 --- /dev/null +++ b/docs/fr-rFR/index.md @@ -0,0 +1,30 @@ +--- +title: Home +layout: default +nav_order: 0 +--- + +# Meshtastic Android App Documentation + +User and developer documentation for the Meshtastic Android, Desktop, and iOS applications powered by KMP (Kotlin Multiplatform). + +Use the sidebar navigation to browse the **User Guide** for app features and the **Developer Guide** for contributing to the project. + +--- + +## Quick Links + +| Guide | Description | +| --------------------------------------------------------------------- | -------------------------------------------------------------- | +| [Getting Started](user/onboarding) | Connect your first radio and send a message | +| [Messages & Channels](user/messages-and-channels) | Channel broadcasts, direct messages, reactions, and encryption | +| [Nodes](user/nodes) | Understanding the mesh network node list | +| [Signal Meter](user/signal-meter) | How the LoRa signal quality meter works | +| [Units & Locale](user/units-and-locale) | How temperatures, distances, and times adapt to your region | +| [Desktop App](user/desktop) | Linux, macOS, and Windows desktop usage | +| [Architecture](developer/architecture) | App architecture overview for contributors | +| [Contributing](developer/contributing) | Branch naming, PR workflow, and verification commands | + +--- + +> This documentation is served from the same markdown source that powers the in-app **Help & Documentation** browser. diff --git a/docs/fr-rFR/user/connections.md b/docs/fr-rFR/user/connections.md new file mode 100644 index 000000000..f8df0ccc9 --- /dev/null +++ b/docs/fr-rFR/user/connections.md @@ -0,0 +1,125 @@ +--- +title: Connexions +nav_order: 2 +last_updated: 2026-05-13 +description: Connect your phone or desktop to a Meshtastic radio via Bluetooth, USB, or TCP/IP. +aliases: + - bluetooth + - usb + - tcp + - pairing +--- + +# Connexions + +Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node. + +## Bluetooth (BLE) + +Bluetooth Low Energy is the default and most common connection method on Android. + +### Pairing a Device + +1. Ensure your Meshtastic radio is powered on and in pairing mode. +2. Open the app and navigate to **Connections**. +3. Tap **Scan for Devices** — nearby Meshtastic radios will appear. +4. Select your device from the list. +5. Accept the Bluetooth pairing prompt if shown. + +![Device list item](/assets/screenshots/connections_bluetooth_scan.png) + +You can filter devices by transport type using the filter chips at the top: + +![Transport filter chips](/assets/screenshots/connections_transport_filters.png) + +> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. + +### Connection Status + +| Icon | State | Description | +| ---- | ------------------ | ----------------------------- | +| 🟢 | Connecté | Active radio link established | +| 🟡 | Connexion en cours | Handshake in progress | +| 🔴 | Déconnecté | No active connection | +| ⚪ | Not configured | Aucun appareil sélectionné | + +When connecting, a status indicator shows the current connection state: + +![Connecting status](/assets/screenshots/connections_connecting.png) + +If no devices are found, the app shows an empty state with instructions: + +![No devices found](/assets/screenshots/connections_empty_state.png) + +### Troubleshooting Bluetooth + +- **Device not found:** Toggle Bluetooth off/on, ensure location is enabled. +- **Connection drops:** Move closer to the radio; check for interference. +- **Pairing rejected:** Forget the device in Android Bluetooth settings and retry. + +## USB Serial + +USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable. + +### Setup + +1. Connect your radio via USB cable to your device. +2. The app will prompt for USB permission — tap **Allow**. +3. The connection is established automatically. + +> ⚠️ **Note:** USB connections require OTG support on Android devices. + +## TCP/IP (WiFi) + +Some Meshtastic radios support WiFi connectivity, allowing TCP-based connections. + +### Configuration + +1. Connect your radio to a WiFi network via the radio's web interface or settings. +2. In the app, go to **Connections → TCP**. +3. Enter the radio's IP address and port (default: 4403). +4. Tap **Connect**. + +![WiFi scanning for devices](/assets/screenshots/connections_wifi_scanning.png) + +When a device is found, it appears in the connection list: + +![WiFi device found](/assets/screenshots/connections_wifi_device_found.png) + +A successful connection is confirmed with a status indicator: + +![WiFi connection success](/assets/screenshots/connections_wifi_success.png) + +### When to Use TCP + +- Radio is on the same local network +- Testing with a simulated radio +- Environments where Bluetooth has interference issues + +## Reconnection Behavior + +The app reconnects to the **last selected device** on startup. You can manually switch transports from the connections screen at any time. + +To disconnect from a radio, use the disconnect button on the connections screen: + +![Disconnect from radio](/assets/screenshots/connections_disconnect.png) + +## Desktop Connections + +On Desktop (Linux/macOS/Windows), the app supports: + +- **Bluetooth (BLE)** — via the Kable library; works on macOS, Linux, and Windows +- **USB Serial** — primary wired connection method +- **TCP/IP** — for network-connected radios + +See [Desktop App](desktop) for platform-specific details and keyboard shortcuts. + +## Related Topics + +- [Getting Started](onboarding) — first-launch setup and permissions +- [Settings — Radio & User](settings-radio-user) — Bluetooth and network configuration +- [Desktop App](desktop) — desktop-specific connection details +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — full list of compatible radios on meshtastic.org + +--- + diff --git a/docs/fr-rFR/user/desktop.md b/docs/fr-rFR/user/desktop.md new file mode 100644 index 000000000..5763e63e9 --- /dev/null +++ b/docs/fr-rFR/user/desktop.md @@ -0,0 +1,147 @@ +--- +title: Desktop App +nav_order: 14 +last_updated: 2026-05-13 +description: Install and use the Meshtastic Desktop app on Linux, macOS, and Windows — connections, feature parity, and keyboard shortcuts. +aliases: + - desktop + - linux + - macos + - windows + - jvm +--- + +# Desktop App + +The Meshtastic Desktop application provides the same mesh communication features on Linux, macOS, and Windows. + +## Overview + +The Desktop app shares its core codebase with the Android app through Kotlin Multiplatform (KMP). Most features work identically across platforms. + +## Installation + +### Linux + +- Download the `.deb` or `.AppImage` package from the releases page +- Or build from source using `./gradlew :desktopApp:run` + +### macOS + +- Download the `.dmg` package from releases +- Or build from source + +### Windows + +- Download the `.msi` installer from releases +- Or build from source + +## Connecting Your Radio + +### USB Serial (Primary) + +The most reliable connection method on Desktop: + +1. Connect your Meshtastic radio via USB cable. +2. The app should detect the serial port automatically. +3. If not detected, select the correct serial port from the connections menu. + +### TCP/IP + +For network-connected radios: + +1. Enter the radio's IP address and port (default: 4403). +2. Click **Connect**. + +### Bluetooth (BLE) + +Bluetooth Low Energy is supported on Desktop via the [Kable](https://github.com/JuulLabs/kable) library: + +1. Ensure your system has a Bluetooth adapter. +2. The app scans for nearby Meshtastic radios automatically. +3. Select your device from the connections screen. + +## Feature Parity + +| Feature | Android | Desktop | Notes | +| ---------------------------------------- | ------- | ------- | -------------------------- | +| Messaging | ✓ | ✓ | Full parity | +| Node List | ✓ | ✓ | Full parity | +| Carte | ✓ | ✓ | Full parity | +| Réglages | ✓ | ✓ | Full parity | +| Bluetooth (BLE) | ✓ | ✓ | Via Kable on desktop | +| Firmware Update OTA | ✓ | ✗ | Use web flasher | +| Notifications | ✓ | ✓ | Native OS notifications | +| Widgets | ✓ | ✗ | Android-only | +| AI Assistant (Chirpy) | ✓\* | ✗ | Google flavor Android only | + +\*Chirpy AI requires Android 14+ on Google flavor builds with supported hardware. + +## UI Differences + +The Desktop app uses the same Compose Multiplatform UI with adaptations for larger screens and desktop interaction. + +### Keyboard Shortcuts + +| Shortcut | Action | +| ------------------- | --------------------------- | +| **⌘Q** / **Ctrl+Q** | Quit the application | +| **⌘,** / **Ctrl+,** | Open Settings | +| **⌘1** / **Ctrl+1** | Switch to Conversations tab | +| **⌘2** / **Ctrl+2** | Switch to Nodes tab | +| **⌘3** / **Ctrl+3** | Switch to Map tab | +| **⌘4** / **Ctrl+4** | Switch to Connections tab | + +### Window & System Tray + +- **Window resizing** — responsive layout adapts to window dimensions +- **System tray** — minimize to system tray for background mesh operation +- **Tray menu** — right-click the tray icon to show window or quit +- **Mouse interaction** — hover states and standard desktop navigation + +### Notification Preferences + +The Desktop app provides in-app toggles for controlling which notifications are shown — messages, new nodes, and low battery alerts. Access these from **Settings → Notifications** within the app. + +## Built-in Documentation Browser + +The Desktop app includes a built-in documentation browser for quick access to help content without leaving the application. + +![Docs browser with table of contents](/assets/screenshots/docs-browser_toc.png) + +The browser supports full-text search across all documentation: + +![Searching the docs browser](/assets/screenshots/docs-browser_search.png) + +Individual doc pages render with full formatting: + +![A documentation page](/assets/screenshots/docs-browser_page.png) + +## Building from Source + +```bash +git clone https://github.com/meshtastic/Meshtastic-Android.git +cd Meshtastic-Android +git submodule update --init +./gradlew :desktopApp:run +``` + +Requirements: + +- JDK 21 +- No Android SDK required for desktop-only builds + +## Known Limitations + +- No OTA firmware updates (use web flasher) +- Some Android-specific features (widgets, specific notification channels) are unavailable +- Performance may vary on low-spec hardware running Compose Desktop +- BLE bonding is not yet supported on desktop (pairing works without bonding) + +## Related Topics + +- [Connections](connections) — connection methods overview +- [Firmware Updates](firmware) — use the [Web Flasher](https://flasher.meshtastic.org) for desktop firmware updates + +--- + diff --git a/docs/fr-rFR/user/discovery.md b/docs/fr-rFR/user/discovery.md new file mode 100644 index 000000000..67d779927 --- /dev/null +++ b/docs/fr-rFR/user/discovery.md @@ -0,0 +1,114 @@ +--- +title: Découverte +nav_order: 12 +last_updated: 2026-05-13 +description: Explore your mesh network — traceroute paths, neighbor maps, and node discovery tools. +aliases: + - mesh-discovery + - local-discovery + - network-scan + - traceroute + - neighbor-info +--- + +# Découverte + +Discovery tools help you understand **how** your mesh network is connected — which nodes can hear each other, what paths messages take, and where bottlenecks or weak links exist. + +> 💡 **Tip:** You don't need a dedicated "discovery mode" to start exploring your mesh. The tools below are available right now from the node list and node detail screens. + +--- + +## Traceroute + +Traceroute reveals the exact path a message takes from your node to any other node on the mesh. It's the single most useful tool for debugging connectivity problems. + +### Running a Traceroute + +1. Navigate to **Nodes** and tap the node you want to trace. +2. On the node detail screen, tap **Traceroute**. +3. The app sends a traceroute request and waits for the response. +4. Results display each hop in order, with signal quality at every step. + +### Reading the Results + +A traceroute result looks like this: + +``` +You → Node A (SNR: 8.5, RSSI: -95) → Node B (SNR: 5.2, RSSI: -108) → Target +``` + +Each hop represents a relay node that forwarded the message. The SNR and RSSI values at each hop tell you about the link quality on that specific segment. + +| What to look for | What it means | +| -------------------------------------------------------------------------- | --------------------------------------------------------------------------- | +| All hops show Good SNR (> 5 dB) | Healthy path — messages flow reliably | +| One hop shows Bad SNR (< 0 dB) | Weak link — this relay segment is fragile | +| Many hops (4+) | Long path — consider repositioning a node to shorten it | +| Different path on retry | Mesh is adapting — multiple routes exist (this is good!) | + +> 💡 **Tip:** Run traceroute several times over a few minutes. If the path changes, your mesh has redundant routes — a sign of a well-connected network. + +### Troubleshooting with Traceroute + +- **"No route found"** — The target node may be offline, out of range, or on a different channel. Check that both nodes share at least one channel with the same encryption key. +- **Traceroute times out** — The path may be too long (exceeds hop limit) or a relay node is congested. Try increasing the hop limit in **Settings → LoRa Config**. +- **Asymmetric paths** — A traceroute from A→B may take a different path than B→A. This is normal — radio propagation is not always symmetric. + +--- + +## Informations sur les voisins + +The Neighbor Info module lets each node broadcast a list of the nodes it can **directly hear** (single-hop). When multiple nodes share their neighbor lists, you can piece together a topology map of the entire mesh. + +### Enabling Neighbor Info + +1. Navigate to **Settings → Module Config → Neighbor Info**. +2. Enable the module. +3. Set the broadcast interval (default: 900 seconds / 15 minutes). + +Once enabled, your node periodically broadcasts its neighbor table. Other nodes with Neighbor Info enabled do the same. + +### Viewing Neighbor Data + +- Open any node's detail screen and look for the **Neighbors** section. +- Each neighbor entry shows the node that was directly heard and its signal quality. +- Combine neighbor data from multiple nodes to understand the full mesh topology. + +> ⚠️ **Note:** Neighbor Info increases airtime usage because every enabled node periodically broadcasts its neighbor list. On busy meshes with many nodes, consider longer broadcast intervals (3600 seconds or more) to avoid congestion. + +--- + +## Node List as a Discovery Tool + +The node list itself is a powerful discovery tool when you use its filtering and sorting features effectively. + +### Finding New Nodes + +- Sort by **Last heard** to see the most recently active nodes at the top. +- Enable **Include unknown** to see nodes that have appeared on the mesh but haven't sent user info yet — these are often newly powered-on devices. + +### Assessing Connectivity + +- Sort by **Hops away** to see which nodes are directly reachable (0 hops) versus relayed. +- Sort by **Distance** to find nearby nodes and verify they're reachable. +- Use **Exclude MQTT** to focus on nodes reachable over radio (not via internet bridge). + +### Infrastructure Audit + +- Disable **Exclude infrastructure** to see Router, Repeater, Router Late, and Client Base nodes. +- Check their signal quality and last-heard times to verify your infrastructure nodes are healthy. + +See [Nodes](nodes) for full details on filtering and sorting options. + +--- + +## Tips for Mesh Exploration + +- **Start with traceroute** — it gives you immediate, actionable information about a specific path. +- **Enable Neighbor Info on key nodes** — especially routers and repeaters, to build a picture of the backbone. +- **Check the map** — node positions on the [Map](map-and-waypoints) combined with signal data help you understand why some links are strong and others are weak. +- **Compare signal over time** — use the [Signal Meter](signal-meter) guide to interpret SNR and RSSI values correctly. + +--- + diff --git a/docs/fr-rFR/user/firmware.md b/docs/fr-rFR/user/firmware.md new file mode 100644 index 000000000..4d29a308f --- /dev/null +++ b/docs/fr-rFR/user/firmware.md @@ -0,0 +1,114 @@ +--- +title: Firmware Updates +nav_order: 13 +last_updated: 2026-05-13 +description: Update your radio firmware over Bluetooth — OTA process, version channels, pre-flight checks, and recovery. +aliases: + - firmware + - update + - ota + - flash +--- + +# Firmware Updates + +Keep your Meshtastic radio up to date with the latest firmware for new features, bug fixes, and security improvements. + +## Checking for Updates + +1. Navigate to **Settings → Firmware Update** or tap the firmware notification if shown. +2. The app checks for available firmware versions. +3. Available updates show the version number and changelog summary. + +## Update Methods + +### OTA (Over-The-Air) via Bluetooth + +The most common update method for Android users: + +1. Ensure your radio is connected via Bluetooth. +2. Navigate to the Firmware Update screen. +3. Select the desired firmware version. +4. Tap **Update** to begin the OTA process. +5. Wait for the update to complete — **do not disconnect** during the update. + +![Firmware checking for updates](/assets/screenshots/firmware_checking.png) + +> ⚠️ **Warning:** Interrupting a firmware update can brick your device. Ensure your radio has sufficient battery (>50% recommended) and maintain Bluetooth proximity during the entire process. + +![Firmware disclaimer](/assets/screenshots/firmware_disclaimer.png) + +### USB Flashing + +For recovery or when OTA is unavailable: + +- Use the [Meshtastic Web Flasher](https://flasher.meshtastic.org) +- Or the [Meshtastic CLI tool](https://meshtastic.org/docs/getting-started/flashing-firmware) on desktop + +## Version Channels + +| Canal | Description | +| ------ | ------------------------------------------- | +| Stable | Recommended for most users; tested releases | +| Alpha | Preview releases; may contain bugs | + +## Pre-Update Checklist + +Before updating: + +- [ ] Battery > 50% +- [ ] Stable Bluetooth connection +- [ ] Note your current settings (they may reset on major version changes) +- [ ] Check the release notes for breaking changes + +## Post-Update + +After a successful update: + +- The radio will reboot automatically +- Bluetooth connection will re-establish +- Verify your settings are intact +- Check the firmware version in **Settings → About** + +![Firmware update success](/assets/screenshots/firmware_success.png) + +## Troubleshooting + +### Update Stuck + +If the update appears frozen: + +- Wait at least 5 minutes before intervening +- If truly stuck, power-cycle the radio +- Attempt the update again + +![Firmware update error](/assets/screenshots/firmware_error.png) + +### Device Won't Boot After Update + +If your device fails to boot: + +1. Try connecting via USB to a computer +2. Use the web flasher in recovery/DFU mode +3. Flash a known-good firmware version +4. Check the Meshtastic Discord for device-specific recovery steps + +### Compatibility Warnings + +The app may show warnings when: + +- Connected radio firmware is below minimum supported version +- Major version mismatch between app and firmware +- Deprecated features need migration + +> ⚠️ **Important:** Always update the Meshtastic app before or alongside firmware updates to ensure compatibility. + +## Related Topics + +- [Connections](connections) — reconnecting after a firmware update +- [Flashing firmware guide](https://meshtastic.org/docs/getting-started/flashing-firmware) — full firmware flashing walkthrough on meshtastic.org +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — check firmware compatibility by device +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/fr-rFR/user/map-and-waypoints.md b/docs/fr-rFR/user/map-and-waypoints.md new file mode 100644 index 000000000..cefdbebbd --- /dev/null +++ b/docs/fr-rFR/user/map-and-waypoints.md @@ -0,0 +1,116 @@ +--- +title: Map & Waypoints +nav_order: 6 +last_updated: 2026-05-13 +description: View node positions on the map, create and share waypoints, and manage position sharing and privacy. +aliases: + - map + - waypoints + - gps + - location +--- + +# Map & Waypoints + +The Map screen shows the geographic positions of nodes on your mesh, along with shared waypoints. + +## Map View + +The map displays: + +- **Node positions** — colored markers for each node reporting location +- **Waypoints** — shared points of interest +- **Your position** — your current GPS location + +### Node Markers + +Node markers on the map indicate: + +| Color | Meaning | +| ----- | ---------------------------------------------- | +| Vert | Online (heard recently) | +| Jaune | Away (heard within 2 hours) | +| Gray | Offline (stale position) | +| Bleu | Your own node | + +### Map Controls + +- **Zoom** — pinch or use +/- buttons +- **Pan** — drag to explore +- **Center** — select the location button to center on your position +- **Node tap** — tap a node marker to view details + +The floating toolbar provides quick access to compass, layer switching, node filters, refresh, and location tracking. Tap the compass to reorient north-up, or tap the location button to center on your current position. + +![Map controls overlay](/assets/screenshots/map_controls_overlay.png) + +## Waypoints + +Waypoints are shared geographic points of interest that all mesh members can see. + +### Creating a Waypoint + +1. Long-press on the map at the desired location. +2. Enter a name and optional description. +3. Choose an icon/emoji for the waypoint. +4. Tap **Send** to share with the mesh. + +### Waypoint Properties + +| Property | Description | +| ----------- | ------------------------------------------------------- | +| Nom | Short identifier (max 30 characters) | +| Description | Optional longer description | +| Icon | Visual marker emoji on the map | +| Verrouillé | If locked, only the creator can edit or delete | +| Expiration | Optional auto-remove time | + +### Waypoint Expiration + +Waypoints can be set to expire automatically: + +- **Never** (default) — waypoint remains until manually deleted +- **Timed** — waypoint is automatically removed after the specified duration (e.g., "remove after 2 hours"). Useful for temporary markers like rally points, hazards, or meeting locations. + +Expired waypoints are automatically hidden from the map so they don't clutter the display. The expiration countdown begins when the waypoint is created, not when other nodes receive it. + +### Managing Waypoints + +- Tap a waypoint on the map to view its details and coordinates +- Edit or delete waypoints you created +- **Locked waypoints** cannot be modified or deleted by other nodes — only the original creator can change them +- Unlocked waypoints can be edited by any mesh member + +## Position Sharing + +### Enabling Position Sharing + +Your node shares its GPS position based on: + +- **Fixed interval** — broadcast position at regular intervals +- **Smart position** — broadcast when movement exceeds a threshold +- **Manual** — only share when explicitly requested + +Configure position behavior in **Settings → Position**. + +### Privacy Considerations + +> 🔒 **Privacy:** Position data is broadcast to all nodes on your channel. If you don't want your location shared, disable GPS position in settings or use a fixed/fake position. + +## Map Sources + +The app supports multiple map tile sources: + +- OpenStreetMap (default) +- Satellite imagery (where available) +- Offline tiles (download map areas for offline use) + +## Related Topics + +- [Nodes](nodes) — view and filter your node list +- [Node Metrics](node-metrics) — signal quality and position history for individual nodes +- [Discovery](discovery) — traceroute and neighbor info for understanding mesh topology +- [Units & Locale](units-and-locale) — distance and coordinate display formats + +--- + diff --git a/docs/fr-rFR/user/messages-and-channels.md b/docs/fr-rFR/user/messages-and-channels.md new file mode 100644 index 000000000..77915486b --- /dev/null +++ b/docs/fr-rFR/user/messages-and-channels.md @@ -0,0 +1,159 @@ +--- +title: Messages & Channels +nav_order: 3 +last_updated: 2026-05-13 +description: Send and receive messages, manage channels, configure encryption, and use quick chat, reactions, and message actions. +aliases: + - channels + - direct-messages + - messaging + - conversations +--- + +# Messages & Channels + +Meshtastic supports two communication modes: **channel broadcasts** and **direct messages**. + +## Canaux + +Channels are shared communication groups. All nodes configured with the same channel key can read and send messages on that channel. + +### Default Channel + +Every Meshtastic device comes with a default **LongFast** channel. This is an unencrypted channel used for general mesh communication. + +### Sécurité du canal + +Channels support multiple encryption levels: + +| Icon | Security Level | Description | +| ---- | ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------- | +| 🔒 | PSK (256-bit AES) | Fully encrypted with a strong pre-shared key. Only nodes with the matching key can read messages. | +| 🔐 | PSK (128-bit AES) | Encrypted with a shorter key. Secure for most uses but 256-bit is preferred for sensitive data. | +| 🔓 | Default / Open | Uses the well-known default key. **Any Meshtastic device** on the same preset can read these messages. | +| ⚠️ | Insecure + Position | Open channel that also broadcasts your GPS position. Use with caution in public meshes. | + +> 🔒 **Security Tip:** 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. + +### Adding a Channel + +1. Navigate to **Settings → Channels**. +2. Tap **Add Channel** or scan a QR code. +3. Configure the channel name and encryption key. +4. Share the channel URL/QR code with others who need access. + +Tapping a channel shows its details and sharing options. + +## Messages directs + +Direct messages (DMs) are point-to-point encrypted communications between two specific nodes. + +### Sending a Direct Message + +1. Open the **Messages** tab. +2. Select a node from your contacts list or tap a node in the node list. +3. Type your message and tap **Send**. + +### Message States + +| State | Icon | Meaning | +| --------------------------------- | ---- | ----------------------------------------------------------------------------------------------------------------- | +| Queued | ⏳ | Message waiting to be sent | +| En route | ✓ | Delivered to the radio, awaiting acknowledgment | +| Distribué | ✓✓ | Acknowledgment received from recipient | +| Received | ✓ | Message received from the mesh (incoming) | +| S&F Routing | 🔗 | Store & Forward: message being routed through an S&F node | +| S&F Confirmed | 🔗 | Store & Forward: delivery confirmed via S&F node | +| Erreur | ✗ | Delivery failed after retries | + +### Delivery Errors + +When a message fails to deliver, the error indicator shows what went wrong: + +| Erreur | Meaning | What to Do | +| ------------------------------ | ---------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Pas de route | No path exists to the destination node | The recipient may be offline or out of mesh range. Try later or move closer. | +| Got NAK | The next-hop node refused to relay | The relay node may be congested. Wait and retry. | +| Délai d'expiration | No acknowledgment within retry window | The recipient may be just out of range. Try increasing hop limit or moving to a better position. | +| Pas d'interface | No radio interface available to send | Check that your radio is connected and the channel is configured. | +| Max Retransmit | All retry attempts exhausted | The mesh path is unreliable. Try a different channel or wait for conditions to improve. | +| Pas de canal ou d'autorisation | The destination channel doesn't exist | Verify both nodes share the same channel configuration. | +| Too Large | Message exceeds maximum payload size | Shorten your message (max ~230 characters). | +| Pas de réponse | Node received message but didn't respond | The recipient's radio may be busy or in low-power sleep mode. | +| Duty Cycle Limit | Regional airtime limit reached | Your radio has used its allowed transmit time. Wait for the duty cycle window to reset (typically 1 hour in EU regions). | +| Mauvaise requête | Malformed or invalid message | This usually indicates a software bug. Try restarting the app. | + +> 💡 **Tip:** 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. + +## Message Features + +### Quick Chat + +Pre-configured messages for rapid communication: + +- Access via the Quick Chat button in the message input area +- Choose from built-in phrases or custom messages +- Customize quick chat messages in **Settings → Quick Chat** +- Useful when typing is impractical (gloves, small screen, urgent) + +![Quick chat option](/assets/screenshots/messages_quick_chat.png) + +The channel list shows each channel with its latest message preview. + +### Message Bubbles + +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. + +### Reactions + +React to messages with emoji: + +- **Long-press** a message to open the actions menu +- Tap **Add Reaction** to choose an emoji +- Reactions appear below the message bubble +- Multiple users can react to the same message +- React to your own messages or others' messages + +![Emoji reaction badges displayed beneath a message](/assets/screenshots/messages_reaction.png) + +> 💡 **Tip:** Reactions are lightweight — they use minimal mesh bandwidth compared to full text messages. + +### Message Actions + +Long-press any message to access: + +- **Copy** — copy message text to clipboard +- **Reply** — quote the message in your response +- **React** — add an emoji reaction +- **Delete** — remove a message you sent (local deletion) + +### Message Priority + +Messages are queued and transmitted based on priority: + +1. Emergency/alert messages (highest) +2. Direct messages +3. Channel broadcasts (lowest) + +### Message Limits + +- **Maximum length:** 237 bytes (approximately 230 characters for ASCII text) +- **Rate limiting:** The mesh enforces airtime fairness; heavy message volume may be throttled +- **Delivery:** Messages are retried automatically if no acknowledgment is received + +## Best Practices + +- Use channels for group coordination +- Use direct messages for private person-to-person communication +- Keep messages short — mesh bandwidth is limited +- Configure encryption for sensitive communications + +## Related Topics + +- [Nodes](nodes) — tap a node to start a direct message +- [Settings — Radio & User](settings-radio-user) — configure channel encryption and presets +- [MQTT](mqtt) — bridge channel messages to the internet +- [Channel configuration](https://meshtastic.org/docs/configuration/radio/channels) — detailed channel settings on meshtastic.org + +--- + diff --git a/docs/fr-rFR/user/mqtt.md b/docs/fr-rFR/user/mqtt.md new file mode 100644 index 000000000..f3a6467b7 --- /dev/null +++ b/docs/fr-rFR/user/mqtt.md @@ -0,0 +1,137 @@ +--- +title: MQTT +nav_order: 11 +last_updated: 2026-05-13 +description: Bridge your mesh to the internet — MQTT broker setup, encryption layers, and map reporting. +aliases: + - mqtt + - internet-bridge + - broker +--- + +# MQTT + +MQTT bridges your Meshtastic mesh network to the internet, enabling long-range communication beyond radio range. + +## Overview + +The MQTT module connects your node to an MQTT broker, allowing: + +- Messages to reach nodes on different physical meshes via the internet +- Integration with home automation and monitoring systems +- Publishing node positions to the public Meshtastic map +- Custom data pipelines for logging and alerting + +## How It Works + +``` +[Your Node] → Radio → [Gateway Node with WiFi] → MQTT Broker → [Remote Gateway] → Radio → [Remote Node] +``` + +A gateway node with internet access (WiFi or Ethernet) publishes mesh messages to an MQTT topic. Remote gateways subscribed to the same topic inject those messages into their local mesh. + +## Configuration + +### Enabling MQTT + +1. Navigate to **Settings → Module Config → MQTT**. +2. Enable the MQTT module. +3. Configure the broker connection: + +![MQTT toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | Description | Par défaut | +| ----------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------- | +| Server Address | MQTT broker hostname | mqtt.meshtastic.org | +| Nom d'utilisateur | Broker authentication | meshdev | +| Mot de passe | Broker authentication | large4cats | +| Root Topic | Base topic for messages | msh | +| Chiffrement | Encrypt MQTT payload | Activé | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON packet support has been removed from firmware; this field is ignored | Désactivé | +| TLS | Secure connection to broker | Désactivé | +| Map Reporting | Report position to public map | Désactivé | + +### Default Meshtastic Broker + +The community maintains a public broker at `mqtt.meshtastic.org`. This is intended for general use and testing. + +> 🔒 **Privacy:** Messages on the public broker are readable by anyone subscribed. Always use channel encryption for private communications. + +### Private Broker + +For better privacy and control, you can run your own MQTT broker: + +- Mosquitto (lightweight, open-source) +- HiveMQ +- EMQX + +Configure your node to point to your private broker with appropriate credentials. + +## Map Reporting + +When Map Reporting is enabled, your node publishes its position to the Meshtastic community map: + +- Visible at [meshmap.net](https://meshmap.net) and similar community map services +- Only position and node info are shared +- Disable this if you don't want your location publicly visible + +## Uplink vs Downlink + +| Direction | Description | +| ------------ | -------------------------------- | +| **Uplink** | Messages from mesh → MQTT broker | +| **Downlink** | Messages from MQTT broker → mesh | + +Configure per-channel which directions are active to control message flow and airtime usage. + +## Message Formats + +MQTT uses protobuf message format: + +| Format | Description | Use case | +| ------------ | ----------------------------------- | -------------------------- | +| **Protobuf** | Binary Meshtastic protobuf encoding | Node-to-node mesh bridging | + +> ⚠️ **Note:** JSON output support was removed from firmware. The `json_enabled` setting is still visible in the app for legacy compatibility but has no effect on current firmware versions. + +## Encryption & Privacy + +Understanding the layered encryption model: + +1. **Channel encryption** happens on the mesh _before_ MQTT. If your channel has a PSK, the MQTT payload is already encrypted — the broker and any subscribers see only the ciphertext. +2. **MQTT encryption** (the module setting) adds an additional encryption layer for transit to the broker. This protects metadata and routing information. +3. **TLS** encrypts the TCP connection to the broker itself, preventing network-level eavesdropping. + +> 🔒 **Important:** The default public channel has a well-known key. Messages on the default channel sent via MQTT are effectively **unencrypted** — anyone can decode them. Always use a custom PSK for private communications. + +## Best Practices + +- Use channel-level encryption (PSK) on channels that bridge to MQTT +- Don't enable MQTT on nodes without internet access (it will buffer and waste memory) +- Use a private broker for sensitive deployments +- Be mindful of airtime when downlinking messages from busy MQTT topics — every downlinked message consumes radio airtime on your local mesh +- Consider enabling uplink-only if you only need to monitor your mesh remotely without injecting messages back + +## Troubleshooting + +### MQTT Not Connecting + +- **Check WiFi** — the gateway node must have an active internet connection (WiFi or Ethernet). MQTT does not work over the LoRa radio link itself. +- **Verify credentials** — incorrect username or password will silently fail on most brokers. Double-check for trailing spaces. +- **Firewall** — port 1883 (MQTT) or 8883 (MQTT+TLS) must be open. Some networks block non-standard ports. +- **DNS resolution** — if using a custom broker hostname, verify the node can resolve it. Try the broker's IP address directly. + +### Messages Not Bridging + +- **Check uplink/downlink settings** — if only uplink is enabled, messages flow from mesh to MQTT but not back. Enable downlink on the receiving gateway. +- **Channel mismatch** — both gateways must share the same channel with the same PSK. A mismatch means messages are encrypted with different keys and appear as garbage. +- **Topic mismatch** — ensure both gateways use the same root topic. The default `msh` works for the public broker. + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — MQTT module configuration reference +- [Messages & Channels](messages-and-channels) — channel encryption and PSK setup +- [MQTT integration guide](https://meshtastic.org/docs/software/integrations/mqtt) — detailed MQTT documentation on meshtastic.org + +--- + diff --git a/docs/fr-rFR/user/node-metrics.md b/docs/fr-rFR/user/node-metrics.md new file mode 100644 index 000000000..a8bbbbf21 --- /dev/null +++ b/docs/fr-rFR/user/node-metrics.md @@ -0,0 +1,130 @@ +--- +title: Node Metrics +nav_order: 5 +last_updated: 2026-05-13 +description: Telemetry dashboards for each mesh node — device health, environment sensors, signal quality, power, traceroute, and position history. +aliases: + - metrics + - telemetry + - device-metrics + - signal +--- + +# Node Metrics + +The node detail screen provides comprehensive telemetry and metrics for each node on your mesh. + +## Métriques de l’appareil + +Basic operating information reported by each node: + +| Metric | Description | +| ----------------------- | ----------------------------------- | +| Niveau de batterie | Current battery percentage | +| Tension | Battery voltage reading | +| Utilisation du canal | Percentage of airtime consumed | +| Temps d'émission | Transmission time used by this node | +| Durée de fonctionnement | Time since last reboot | + +Device metrics are displayed as individual cards with trend sparklines showing battery level, voltage, channel utilization, airtime, and uptime over time. + +> 💡 **Tip:** Tap any metric card to expand it into a full chart with historical data points. Pinch to zoom the time axis. + +## Métriques d'environnement + +Environmental sensor data (requires compatible hardware): + +| Metric | Sensor Examples | +| ------------------------------------ | --------------------- | +| Température | BME280, BME680, SHT31 | +| Humidité | BME280, BME680, SHT31 | +| Pression Barométrique | BME280, BMP280 | +| Résistance au gaz | BME680 | +| IAQ (Air Quality) | BME680 | + +Environment metrics are charted over time for easy trend analysis — temperature, humidity, and pressure each get their own line chart with the measurement unit displayed on the Y axis. + +> 💡 **Tip:** Environment metrics require a sensor connected to the remote node. Not all nodes report environmental data. See [Telemetry & Sensors](telemetry-and-sensors) for a full list of supported sensors. + +## Métriques de Signal + +Radio signal quality information: + +| Metric | Description | +| --------- | ----------------------------------------------------------------------------- | +| SNR | Signal-to-Noise Ratio (higher is better) | +| RSSI | Received Signal Strength Indicator (closer to 0 is better) | +| Hop Count | Number of mesh hops for last message | + +### Signal Quality Reference + +| SNR Range | Quality | +| --------------------------------- | --------- | +| > 10 dB | Excellent | +| 0 to 10 dB | Bon | +| -10 to 0 dB | Passable | +| < -10 dB | Poor | + +## Métriques d'alimentation + +Power management telemetry (requires INA sensor or compatible hardware): + +| Metric | Description | +| ------------ | ----------------------- | +| Bus Voltage | Supply voltage | +| Actif | Power draw in milliamps | +| Alimentation | Calculated wattage | + +## Traceroute + +Traceroute shows the path a message takes through the mesh: + +1. From the node detail screen, tap **Traceroute**. +2. The app sends a traceroute request to the target node. +3. Results show each hop with SNR/RSSI values. + +### Reading Traceroute Results + +``` +You → Node A (SNR: 8.5) → Node B (SNR: 5.2) → Target +``` + +Each hop represents a relay node that forwarded the message. + +## Journal des positions + +Historical position data for nodes that share their location: + +- GPS coordinates +- Altitude +- Speed (if moving) +- Timestamp for each position report + +## Informations sur les voisins + +Shows which nodes a given node can directly hear, useful for understanding mesh topology. + +## Viewing Metrics + +1. Navigate to **Nodes**. +2. Tap the node you want to inspect. +3. Select the metric category from the detail tabs. + +![Node detail — local device](/assets/screenshots/nodes_detail_local.png) + +The position tab shows location data for nodes that share GPS: + +![Position inline content](/assets/screenshots/nodes_position.png) + +> ⚠️ **Note:** Metrics are only available when they have been reported by the remote node. Metrics update at intervals configured on each node's telemetry settings. + +## Related Topics + +- [Nodes](nodes) — node list, filtering, and sorting +- [Telemetry & Sensors](telemetry-and-sensors) — supported sensors and configuration +- [Signal Meter](signal-meter) — how signal quality is calculated from SNR and RSSI +- [Discovery](discovery) — traceroute details and neighbor info +- [Units & Locale](units-and-locale) — temperature, distance, and speed display formats + +--- + diff --git a/docs/fr-rFR/user/nodes.md b/docs/fr-rFR/user/nodes.md new file mode 100644 index 000000000..6f1b811e5 --- /dev/null +++ b/docs/fr-rFR/user/nodes.md @@ -0,0 +1,152 @@ +--- +title: Nœuds +nav_order: 4 +last_updated: 2026-05-13 +description: Browse, filter, and sort mesh nodes — view details, signal quality, roles, and quick actions. +aliases: + - node-list + - mesh-nodes + - peers +--- + +# Nœuds + +The Nodes screen displays all devices visible on your mesh network. + +## Node List + +The node list shows every node your radio has heard, including: + +- **Node name** — user-configured long name +- **Short name** — 4-character identifier +- **Signal quality** — last heard signal strength +- **Last heard** — time since last communication +- **Distance** — estimated distance (if positions are shared) +- **Battery** — remote node battery level (if telemetry is enabled) + +### Node Status Indicators + +| Badge | Meaning | +| ---------- | ------------------------------------- | +| 🟢 Online | Node heard within the last 15 minutes | +| 🟡 Away | Node heard within the last 2 hours | +| 🔴 Offline | Node not heard for over 2 hours | +| ⭐ Favorite | Node marked as favorite by the user | + +### Node Roles + +Nodes can be configured with different roles that affect their mesh behavior: + +| Rôle | Description | +| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Client | Standard end-user device | +| Base Client | Treats favorited-node traffic as Router Late priority; all other traffic as Client | +| Client muet | Receives but doesn't retransmit | +| Client masqué | Like Client Mute, plus hides from node list | +| Routeur | Prioritizes message forwarding; stays awake to relay | +| Routeur avec retard | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | +| ~~Router Client~~ | ⚠️ **Deprecated** (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | +| ~~Repeater~~ | ⚠️ **Deprecated** (removed in firmware 2.7.11) — no longer selectable; use Router instead | +| Traqueur | Optimized for position reporting at regular intervals | +| Capteur | Optimized for telemetry reporting | +| TAK | Interoperates with TAK systems (sends/receives CoT) | +| Traqueur TAK | TAK position reporting only | +| Lost & Found | Continuous position beacon for recovery | + +### Choosing a Role + +Most users should keep the default **Client** role. Consider a different role when: + +- **Router** — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don't use Router on battery-powered handheld devices. +- **Router Late** — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. +- **Client Base** — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. +- **Client Mute** — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only devices or to reduce congestion in dense areas. +- **Tracker** — An unattended device whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. +- **Sensor** — An unattended device reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. +- **TAK / TAK Tracker** — Only needed if interoperating with ATAK/WinTAK systems. See [TAK Integration](tak) for details. + +> 💡 **Tip:** The mesh works best when most nodes are **Client** or **Router**. Too many Mute nodes reduces mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. + +### Encryption Indicators + +Nodes display encryption status icons next to their name: + +| Icon | Meaning | +| ----------- | ------------------------------------------------------------------------------------------------------------------- | +| 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | +| 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | +| ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) | + +> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. + +## Quick Actions + +From the node list, you can: + +- **Tap** a node to view its detail page +- **Long-press** for quick actions: + - Send a direct message + - Afficher sur la carte + - Demander la position + - Mark as favorite + - Traceroute + +## Filtering & Sorting + +### Text Search + +Type in the search field to filter nodes by name or short name. The filter updates in real time as you type. + +### Filter Toggles + +| Filtre | Description | +| -------------------------- | ---------------------------------------------------------------------------------------------- | +| **Only online** | Show only nodes heard within the last 15 minutes | +| **Only direct** | Show only nodes with direct (non-relayed) connections | +| **Include unknown** | Show nodes that haven't sent user info yet | +| **Exclude infrastructure** | Hide infrastructure-role nodes (Router, Repeater, Router Late, Client Base) | +| **Exclude MQTT** | Hide nodes heard only via MQTT internet bridge | +| **Show ignored** | Show nodes you've previously dismissed or muted | + +### Sort Options + +| Sort | Description | +| ------------------------------------------- | ------------------------------------------------------------------ | +| **Last heard** (default) | Most recently heard nodes first | +| **Alphabetical** | Sorted by node long name | +| **Distance** | Nearest nodes first (requires position sharing) | +| **Hops away** | Fewest relay hops first | +| **Channel** | Grouped by channel index | +| **Via MQTT** | Grouped by MQTT vs. radio-heard | +| **Favorites** | Favorited nodes first | + +## Node Detail + +Tapping a node opens the detail view with comprehensive information. See [Node Metrics](node-metrics) for full details on metrics and telemetry. + +![Node detail view](/assets/screenshots/nodes_node_list.png) + +The detail screen includes device info, position, and action buttons: + +![Node detail section](/assets/screenshots/nodes_detail_section.png) + +Inline status indicators show key metrics at a glance: + +| Indicator | Screenshot | +| ------------------ | -------------------------------------------------------- | +| Signal quality | ![Signal](/assets/screenshots/nodes_signal_info.png) | +| Niveau de batterie | ![Battery](/assets/screenshots/nodes_battery_info.png) | +| Hop count | ![Hops](/assets/screenshots/nodes_hops_info.png) | +| Dernière écoute | ![Last heard](/assets/screenshots/nodes_last_heard.png) | +| Distance | ![Distance](/assets/screenshots/nodes_distance_info.png) | + +## Related Topics + +- [Node Metrics](node-metrics) — detailed telemetry dashboards for each node +- [Messages & Channels](messages-and-channels) — send a direct message to a node +- [Map & Waypoints](map-and-waypoints) — view node positions geographically +- [Discovery](discovery) — traceroute and neighbor info for topology exploration +- [Signal Meter](signal-meter) — understand what the signal bars mean + +--- + diff --git a/docs/fr-rFR/user/onboarding.md b/docs/fr-rFR/user/onboarding.md new file mode 100644 index 000000000..3b910534e --- /dev/null +++ b/docs/fr-rFR/user/onboarding.md @@ -0,0 +1,99 @@ +--- +title: Getting Started +nav_order: 1 +last_updated: 2026-05-13 +description: First-launch setup — permissions, onboarding flow, and next steps after connecting your radio. +aliases: + - first-launch + - setup + - intro +--- + +# Getting Started + +Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app. + +## First Launch + +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. + +### Welcome Screen + +The welcome screen introduces Meshtastic and its core capabilities: + +- Off-grid mesh communication +- No cellular or internet required +- End-to-end encrypted messaging + +Tap **Get Started** to proceed through the setup flow. + +![Welcome screen](/assets/screenshots/onboarding_welcome.png) + +## Permissions + +The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. + +### Bluetooth Permission + +Bluetooth is the primary connection method between your phone and Meshtastic radio: + +- **Bluetooth scanning** — discover nearby Meshtastic radios +- **Bluetooth connect** — establish and maintain connections with paired radios + +Grant both permissions when prompted. Without Bluetooth, you'll need to use USB or TCP connections instead. + +### Location Permission + +> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. + +Meshtastic also uses your location for: + +- Showing your position on the mesh map +- Calculating distances to other nodes +- Sharing your GPS coordinates with other mesh members (if enabled) + +Grant **"While using the app"** or **"Always"** depending on your preference: + +- **While using the app** — position updates only when the app is open +- **Always** — enables background position updates for always-on mesh presence + +If denied, Bluetooth scanning will not function and your node will not report a position. + +### Notifications Permission + +Notifications alert you to: + +- Incoming messages from channels and direct messages +- Connection status changes (connected, disconnected, reconnecting) +- Firmware update availability + +> 💡 **Tip:** You can fine-tune notification preferences later in Android system settings. The app creates separate notification channels for messages, connection events, and background service status. + +### Critical Alerts Permission + +On supported devices, the app may request permission for critical alerts: + +- These are high-priority notifications that can break through Do Not Disturb mode +- Useful for emergency mesh alerts or urgent messages +- You can **skip** this step if you don't need breakthrough notifications +- Configure or revoke later in Android notification settings + +## After Setup + +Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. + +> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. + +## What's Next? + +Once connected to a radio, explore: + +- [Connections](connections) — pair your first radio device +- [Messages & Channels](messages-and-channels) — send your first message +- [Nodes](nodes) — see who's on your mesh +- [Map & Waypoints](map-and-waypoints) — view node positions +- [Settings](settings-radio-user) — configure your radio and user profile + +New to Meshtastic? The [getting started guide](https://meshtastic.org/docs/getting-started) on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup. + +--- diff --git a/docs/fr-rFR/user/settings-module-admin.md b/docs/fr-rFR/user/settings-module-admin.md new file mode 100644 index 000000000..56f458ea5 --- /dev/null +++ b/docs/fr-rFR/user/settings-module-admin.md @@ -0,0 +1,246 @@ +--- +title: Settings — Modules & Admin +nav_order: 8 +last_updated: 2026-05-13 +description: Configure optional feature modules (MQTT, telemetry, canned messages, TAK, and more) and perform device administration. +aliases: + - modules + - module-config + - administration +--- + +# Settings — Modules & Admin + +Configure optional feature modules and perform device administration. Modules extend Meshtastic with specialized capabilities — each can be independently enabled or disabled. + +> 💡 **Tip:** You only need to enable the modules you actually use. Disabling unused modules reduces airtime, saves battery, and simplifies your configuration. + +Module settings use a card-based layout with toggle switches, dropdowns, text fields, and sliders: + +![Toggle switch](/assets/screenshots/settings_switch.png) + +![Dropdown selector](/assets/screenshots/settings_dropdown.png) + +![Text field](/assets/screenshots/settings_text_field.png) + +![Settings card layout](/assets/screenshots/settings_titled_card.png) + +## Configuration du module + +### MQTT Module + +Bridges mesh messages to and from an MQTT broker for internet connectivity. This is how you extend your mesh beyond radio range or integrate with home automation systems. + +| Setting | Description | +| ----------------- | ------------------------------------------------------------------------ | +| Activé | Toggle MQTT bridge | +| Serveur | MQTT broker address | +| Nom d'utilisateur | Authentication username | +| Mot de passe | Authentication password | +| Chiffrement | Encrypt MQTT payloads | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON support removed from firmware; field is ignored | +| TLS | Use secure connection | +| Root Topic | Base MQTT topic path | +| Map Report | Publish position for public map | + +See [MQTT](mqtt) for a detailed usage guide including encryption, privacy, and broker setup. + +### Serial Module + +Enables serial port communication for external device integrations (GPS modules, sensors, or custom hardware). When enabled, the node's serial port can send and receive protobuf or text data, allowing external microcontrollers or computers to interact with the mesh. + +| Setting | Description | +| ---------------- | ------------------------------- | +| Activé | Activate serial communication | +| Écho | Echo received serial data back | +| Mode | Text, Protobuf, or NMEA output | +| RX/TX Pins | GPIO pins for serial connection | +| Vitesse en bauds | Serial communication speed | + +### External Notification Module + +Controls buzzer, LED, or vibration alerts on your radio hardware. Useful for devices that need to physically signal when a message arrives — particularly helpful for unattended or outdoor installations. + +| Setting | Description | +| -------------------------------- | --------------------------- | +| Activé | Activate notifications | +| Message d'alerte | Notify on incoming messages | +| Message d'alerte buzzer | Use buzzer for messages | +| Alert Message Vibra | Use vibration for messages | +| Bip d'alerte | Notify on bell character | +| Output (GPIO) | Pin for notification output | +| Actif | High or Low active | +| Duration (ms) | Notification length | +| Use I2S as Buzzer | Use I2S audio output | + +### Store & Forward Module + +Buffers messages for nodes that were temporarily offline, then replays them when those nodes reconnect. Essential for meshes where nodes go in and out of range regularly — ensures messages aren't lost during brief disconnections. + +| Setting | Description | +| ------------------------------------------ | -------------------------- | +| Activé | Activate store and forward | +| Heartbeat (s) | Announcement interval | +| Enregistrements | Maximum stored messages | +| History Return (max) | Max messages to replay | +| History Return (window) | Time window for replay | + +> 💡 **Tip:** Store and Forward works best on nodes with ample memory (ESP32 with PSRAM). Router nodes are ideal candidates since they're typically always-on. + +### Range Test Module + +Automated range testing tool for evaluating link quality between nodes. When enabled, the node periodically transmits test messages with incrementing counters. A receiver node logs these messages, allowing you to walk or drive away and later analyze at what distance messages stopped arriving. + +| Setting | Description | +| -------------------------------------- | --------------------------------- | +| Activé | Activate range testing | +| Sender Interval (s) | Time between test transmissions | +| Save CSV | Log received test data to SD card | + +### Telemetry Module + +Controls what telemetry data your node shares with the mesh. Telemetry includes device health (battery, uptime) and environmental sensor data (temperature, humidity, pressure). + +| Setting | Description | +| ---------------------------- | --------------------------------------- | +| Device Metrics Interval | How often to report device metrics | +| Environment Metrics Interval | How often to report environment sensors | +| Qualité de l'air activée | Report particulate sensor data | +| Power Metrics Enabled | Report power usage | + +See [Telemetry & Sensors](telemetry-and-sensors) for supported sensors and configuration recommendations. + +### Canned Message Module + +Pre-configured messages accessible from the device's physical buttons (for radios with rotary encoders, keypads, or similar input hardware). Define a list of quick-send messages that can be transmitted without a phone connected — ideal for field use. + +| Setting | Description | +| ------------------ | ----------------------------------------------------------- | +| ~~Enabled~~ | ⚠️ **Deprecated** — current firmware may ignore this toggle | +| Messages | Newline-separated list of messages | +| Envoyer un bip | Play bell sound on send | +| Rotary Encoder | Enable rotary encoder input | +| Up/Down/Press Pins | GPIO pin assignments for input | + +### Audio Module + +Codec2 audio support for low-bandwidth voice communication over the mesh. This is an **experimental** feature that encodes voice into very small data packets using the Codec2 codec. + +| Setting | Description | +| --------------- | -------------------------------- | +| Activé | Activate audio module | +| Codec2 Rate | Audio quality/bandwidth tradeoff | +| I2S Word Select | GPIO pin for I2S WS | +| I2S Data In | GPIO pin for I2S DIN | +| I2S Data Out | GPIO pin for I2S DOUT | + +> ⚠️ **Note:** Audio requires specific hardware (I2S microphone and speaker). Voice quality is very low-bandwidth — think "understandable radio voice," not phone-call quality. + +### Remote Hardware Module + +GPIO control over the mesh network. Allows a remote node to read or write GPIO pins on another node — useful for activating relays, reading switches, or controlling external hardware from a distance. + +| Setting | Description | +| -------------------- | --------------------------------------------------------------- | +| Activé | Activate remote GPIO access | +| Allow Undefined Pins | Allow access to any GPIO pin (security risk) | + +> ⚠️ **Warning:** Enabling "Allow Undefined Pins" gives remote nodes access to all GPIO pins, which could interfere with the radio's own hardware. Only enable on dedicated GPIO nodes. + +### Neighbor Info Module + +Broadcasts information about directly heard neighbors, enabling mesh topology mapping. Each enabled node periodically shares a list of the other nodes it can hear and their signal quality. + +| Setting | Description | +| -------------------------------------- | ------------------------------------ | +| Activé | Activate neighbor broadcasting | +| Update Interval (s) | How often to broadcast neighbor list | + +See [Discovery](discovery) for how to use neighbor data for mesh topology exploration. + +### Ambient Lighting Module + +Controls onboard NeoPixel or other addressable RGB LEDs on supported hardware. Can be used for visual status indicators, notification lights, or decorative effects. + +| Setting | Description | +| ------------------ | ---------------------------------------------------------- | +| Activé | Activate LED control | +| État des LED | On, Off, or set specific color | +| Red / Green / Blue | Individual color channel values (0–255) | + +### Detection Sensor Module + +Turns your node into a motion or door sensor alert system. When a GPIO pin detects a state change (motion detected, door opened), the node broadcasts an alert message over the mesh. + +| Setting | Description | +| ---------------------------------------- | ----------------------------------------------------------------------- | +| Activé | Activate detection sensor | +| Broche de monitoring | GPIO pin connected to sensor | +| Detection Triggered High | Trigger when pin goes high (vs. low) | +| Minimum Broadcast (s) | Minimum time between alert broadcasts | +| State Broadcast (s) | Periodic state broadcast interval | +| Envoyer un bip | Include bell character in alerts | +| Nom convivial | Custom name for this sensor | + +### Paxcounter Module + +People counter using WiFi and BLE probe requests. Counts nearby devices by passively listening for probe requests that phones and laptops emit when scanning for networks. Available only on ESP32 devices. + +| Setting | Description | +| -------------------------------------- | -------------------------- | +| Activé | Activate people counting | +| Update Interval (s) | How often to report counts | + +> 💡 **Tip:** Paxcounter is useful for estimating foot traffic at trailheads, event venues, or other locations. Counts are approximate — one person may carry multiple devices. + +### TAK Module + +Team Awareness Kit integration for interoperability with ATAK and WinTAK. See [TAK Integration](tak) for detailed setup and usage. + +## Administration + +### Administration à distance + +Remotely configure nodes that share your admin key: + +1. Select the target node in the node list. +2. Navigate to **Settings** for that node. +3. Modify configuration. +4. Tap **Save** — changes are sent over the mesh. + +> ⚠️ **Requires:** Admin key configured on both your node and the target node. + +### Nettoyer la base de données des nœuds + +Removes stale nodes from your local database that haven't been heard in a configurable time window. + +### Factory Reset + +Resets all settings to factory defaults. **This cannot be undone.** + +### Redémarrer + +Remotely reboot a connected or administered node. + +### Panneau de débogage + +View detailed diagnostic information: + +- Protocol buffers debug output +- Mesh packet log +- Connection state details + +### Troubleshooting Remote Admin + +- **"No response from target node"** — the target may be out of range, offline, or have a mismatched admin key. Verify the admin key matches on both nodes. +- **Changes not applying** — some settings require a reboot to take effect. Try the Reboot action after saving. +- **Can't see remote settings** — ensure your node has the admin key for the target node and that Admin Channel is enabled in Security Config. + +## Related Topics + +- [Settings — Radio & User](settings-radio-user) — core radio and user profile settings +- [Module configuration reference](https://meshtastic.org/docs/configuration/module) — detailed module docs on meshtastic.org +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/fr-rFR/user/settings-radio-user.md b/docs/fr-rFR/user/settings-radio-user.md new file mode 100644 index 000000000..1b5a663cf --- /dev/null +++ b/docs/fr-rFR/user/settings-radio-user.md @@ -0,0 +1,173 @@ +--- +title: Settings — Radio & User +nav_order: 7 +last_updated: 2026-05-13 +description: Configure your radio hardware, LoRa presets, user profile, position sharing, power management, and security. +aliases: + - paramètres + - radio-config + - user-config + - lora +--- + +# Settings — Radio & User + +Configure your radio hardware and user identity parameters. + +## Paramètres utilisateur + +### User Profile + +| Setting | Description | +| ----------------- | ------------------------------------------------------------------------------------- | +| Nom long | Your display name (up to 39 characters) | +| Nom court | 4-character abbreviated name | +| Licensed Operator | Enable if you hold an amateur radio license (enables higher power) | + +### Applying Changes + +After modifying settings, tap **Save** to write the configuration to your radio. The device may reboot to apply changes. + +## Configuration de la radio + +### Configuration de l'appareil + +| Setting | Description | Par défaut | +| ------------------------------------------ | ----------------------------------------------------------------------- | ---------- | +| Rôle | Node behavior (Client, Router, etc.) | Client | +| Mode de réémission | How the node retransmits messages | Tout | +| Node Info Broadcast (s) | Interval for broadcasting node info | 10800 | +| Double-tap Button | Action for double-tap button press | Désactivé | + +### Configuration LoRa + +| Setting | Description | Par défaut | +| --------------------- | ----------------------------------------------------------------------- | ----------------------------------------- | +| Région | Regulatory region for frequency bands | Unset (must configure) | +| Préréglage du modem | Speed/range tradeoff | LongFast | +| Limite de sauts | Maximum retransmit hops | 3 | +| TX Power | Transmission power (dBm); 0 = max allowed for region | 0 (region max) | +| Décalage de fréquence | Fine-tune frequency (MHz) | 0 | +| Channel Bandwidth | Bandwidth setting | Default for preset | + +> ⚠️ **Important:** You **must** set your region before transmitting. Operating without the correct region may violate local radio regulations. See the [region configuration guide](https://meshtastic.org/docs/getting-started/initial-config) on meshtastic.org for details. + +### Modem Presets + +| Preset | Range | Vitesse | SNR Limit | Best For | +| ------------------ | ----------------------- | ------------------------- | ------------------------ | -------------------------------------------------------------------------------------------------------- | +| Short Turbo | ~1 km | 21.9 kbps | −5 dB | Dense urban with line-of-sight; data-heavy applications | +| Short Fast | ~3 km | 10.9 kbps | −7.5 dB | Urban neighborhoods; buildings within a few blocks | +| Short Slow | ~5 km | 5.5 kbps | −10 dB | Suburban short-range; moderate building density | +| Medium Fast | ~5 km | 5.5 kbps | −10 dB | Suburban areas; moderate building density | +| Medium Slow | ~8 km | 1.1 kbps | −12.5 dB | Suburban/rural; moderate range with slower speed | +| Long Turbo | ~10 km | 4.4 kbps | −10 dB | Similar range to Long Fast but with 500 kHz bandwidth; faster throughput | +| Long Fast | ~10 km | 1.1 kbps | −12.5 dB | **General use (default)** — balanced range and speed | +| Long Moderate | ~20 km | 0.34 kbps | −15 dB | Rural with some terrain; occasional use | +| Lite Fast | ~5 km | 5.5 kbps | −10 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Medium Fast | +| Lite Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Long Fast | +| Narrow Fast | ~5 km | 2.7 kbps | −10 dB | EU 868 MHz band (62.5 kHz BW); avoids interference with other devices | +| Narrow Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 868 MHz band (62.5 kHz BW); comparable to Long Fast | +| ~~Long Slow~~ | ~30 km | 0.18 kbps | −17.5 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | +| ~~Very Long Slow~~ | ~40+ km | 0.09 kbps | −20 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | + +#### Choosing a Modem Preset + +The modem preset controls the fundamental tradeoff between **range** and **data rate**: + +- **Slower presets** use more spreading, making signals decodable at weaker signal levels (lower SNR limit). This means longer range but fewer bytes per second. +- **Faster presets** pack more data per transmission but require a stronger signal to decode. + +**Practical guidance:** + +- **Urban mesh (many nodes, short distances):** Use **Long Fast** (default) or **Short Fast**. Higher speed means less airtime congestion when many nodes share the channel. +- **Rural/sparse mesh (few nodes, long distances):** Use **Long Moderate**. Range matters more than speed when nodes are far apart. +- **EU 866/868 MHz regulatory compliance:** Use **Lite Fast**, **Lite Slow**, **Narrow Fast**, or **Narrow Slow** — these are optimized for the EU SRD/868 MHz bands with narrower bandwidths. +- **Fixed infrastructure links:** Use **Short Turbo** or **Long Turbo** for dedicated point-to-point links with good antennas and line-of-sight. +- **Mixed environments:** Stick with **Long Fast** — it's the community default and ensures compatibility with others in your area. + +> ⚠️ **Important:** All nodes on the same channel **must** use the same modem preset. Nodes with mismatched presets cannot communicate even if they share the same frequency and encryption key. + +> 💡 **Tip:** The range estimates above assume flat terrain and modest antennas. Elevation advantage (hilltop, rooftop) dramatically increases effective range. A well-placed Router with Long Fast can often outperform a ground-level node with Long Slow. + +### Configuration de l'écran + +| Setting | Description | +| ----------------------------- | ------------------------------------------------------------------------------------ | +| Délai d'extinction de l'écran | Time before display sleeps | +| Unités affichées | Metric or Imperial | +| Type d'OLED | Auto, SSD1306, SH1106, SH1107 | +| Compass Orientation | Rotation offset for compass display (0°, 90°, 180°, 270°) | +| ~~Compass North~~ | ⚠️ **Deprecated** — replaced by Compass Orientation; still visible in older firmware | + +### Configuration de la position + +| Setting | Description | +| ----------------------------------------- | ---------------------------------- | +| GPS Enabled | Enable/disable GPS | +| Intervalle de mise à jour GPS | How often to acquire GPS fix | +| Position Broadcast (s) | How often to share position | +| Position Intelligente | Enable movement-based broadcasting | +| Position fixe | Use a manually set position | + +### Configuration de l'alimentation + +| Setting | Description | +| --------------------------------------- | --------------------------------------- | +| Power Saving | Enable low-power sleep mode | +| Shutdown After (s) | Auto-shutdown idle timer | +| ADC Multiplier | Battery voltage calibration factor | +| Wait Bluetooth (s) | Time to wait for BLE connection at boot | +| Mesh SDS Timeout (s) | Super-deep-sleep timeout | + +### Configuration du réseau + +| Setting | Description | +| ------------- | ---------------------------------------------------- | +| WiFi Enabled | Enable WiFi radio (ESP32 devices) | +| WiFi SSID | Network name to connect to | +| WiFi PSK | Mot de passe du réseau | +| Serveur NTP | Time synchronization server | +| Syslog Server | Remote logging server | + +![IP address field](/assets/screenshots/settings_ipv4_field.png) + +### Configuration Bluetooth + +| Setting | Description | +| ----------------- | ------------------------------------------------------------------------- | +| Bluetooth Enabled | Enable/disable BLE radio | +| Mode d'appairage | Fixed PIN, Random PIN, or No PIN | +| Code PIN fixe | PIN code for pairing (default: 123456) | + +### Configuration de sécurité + +| Setting | Description | +| --------------------- | -------------------------------------------------------------------------- | +| Clé publique | Your node's public key (read-only) | +| Clé Admin | Key for remote administration | +| Clé privée | Your node's private key (handle securely) | +| Admin Channel Enabled | Allow admin commands via channel | +| Debug Log | Output live debug logging over serial/bluetooth | +| Serial Enabled | Enable serial console access (moved from Device Config) | +| Mode géré | Restrict non-admin channel changes | + +![Password field](/assets/screenshots/settings_password_field.png) + +Settings use standard preference controls — dropdowns, toggles, and sliders: + +| Control | Screenshot | +| -------- | ------------------------------------------------------ | +| Dropdown | ![Dropdown](/assets/screenshots/settings_dropdown.png) | +| Toggle | ![Toggle](/assets/screenshots/settings_switch.png) | +| Slider | ![Slider](/assets/screenshots/settings_slider.png) | + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — optional feature modules and device administration +- [Signal Meter](signal-meter) — how modem presets affect signal quality thresholds +- [LoRa configuration](https://meshtastic.org/docs/configuration/radio/lora) — detailed LoRa settings reference on meshtastic.org +- [Initial configuration](https://meshtastic.org/docs/getting-started/initial-config) — region setup guide on meshtastic.org + +--- + diff --git a/docs/fr-rFR/user/signal-meter.md b/docs/fr-rFR/user/signal-meter.md new file mode 100644 index 000000000..e0b83f0f9 --- /dev/null +++ b/docs/fr-rFR/user/signal-meter.md @@ -0,0 +1,81 @@ +--- +title: How the Meshtastic Signal Meter Works +nav_order: 15 +last_updated: 2026-05-13 +description: How the signal meter calculates quality from RSSI and SNR — LoRa spread spectrum, presets, and what the bars really mean. +aliases: + - signal + - signal-meter + - snr + - rssi +--- + +# How the Meshtastic Signal Meter Works + +The Meshtastic signal meter — the familiar bars or status color in the app — is calculated very differently than the "bars" on a traditional cell phone or Wi-Fi router. + +Most consumer devices simply measure how "loud" a signal is. However, because Meshtastic uses **LoRa (Long Range)** technology, its signal meter measures how **clear** the signal is, relative to the specific settings your mesh is using. + +--- + +## 1. The Two Metrics: "Loudness" vs. "Clarity" + +Every time the LoRa radio chip receives a message, it reports two measurements: + +- **RSSI (Received Signal Strength Indicator):** The **loudness** of the raw power hitting your antenna. +- **SNR (Signal-to-Noise Ratio):** The **clarity** of the signal compared to the background static. + +> **Tip — The Analogy:** Imagine you are trying to hear a friend talking to you. +> +> - **RSSI** is how loud their voice is. +> - **The Noise Floor** is the background noise in the room (air conditioning, other people talking, traffic). +> - **SNR** is how easily you can distinguish your friend's voice from the background noise. + +If your friend shouts at you at a deafening rock concert, the signal is incredibly loud (High RSSI), but you still can't understand them because the background noise is louder (Bad SNR). Conversely, if your friend whispers to you in a dead-silent library, the signal is very weak (Low RSSI), but you can understand them perfectly (Great SNR). + +--- + +## 2. The Magic of LoRa: Hearing "Below the Noise Floor" + +For standard radios (like FM or Wi-Fi), if the background noise is louder than the signal (a negative SNR), the receiver just hears static. + +LoRa is special. It uses **"Spread Spectrum"** modulation, which allows the radio to mathematically pull a signal out of the air even when it is buried deep _underneath_ the background noise. This is why you will frequently see **negative SNR numbers** in Meshtastic (e.g., -10 dB, which means the signal is 10 decibels weaker than the background static). + +Depending on which Meshtastic preset you are using (e.g., `LongFast` vs. `ShortFast`), the radio has a specific **SNR Limit** — the absolute maximum amount of noise it can tolerate before the message is completely lost to the static. + +--- + +## 3. How the Signal Meter Calculates Quality + +The Meshtastic apps take both RSSI and SNR and run them through a specific formula to assign your signal a quality rating (None, Bad, Fair, or Good). It specifically scales these values based on the physical limits of the radio preset you are using. + +Here is exactly how the app decides how many bars (or what color) to show you: + +| Level | Bars | Criteria | Meaning | +| -------- | ---- | ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | +| Bon | 3 | RSSI better than `-115 dBm` **AND** SNR better than `-7 dB` | Signal is both loud and clear — healthy connection. | +| Passable | 2 | RSSI better than `-126 dBm` with good SNR, **OR** SNR better than `-15 dB` with good RSSI | Signal getting quieter or noisier, but still decodable. | +| Mauvais | 1 | Falls between Fair and None thresholds | At the edge of range or experiencing interference. | +| Aucun | 0 | RSSI worse than `-126 dBm` **AND** SNR worse than `-15 dB` | Transmission completely buried in noise. | + +--- + +## 4. What This Means for You + +Because Meshtastic's meter acts as a **"Clarity Meter"**, it behaves differently than what most people expect: + +> **Tip — Don't panic over low RSSI:** You might see a seemingly terrible RSSI value like `-118 dBm`. On a cell phone, you would have zero bars. But if you have an SNR of `+2 dB`, Meshtastic will still show a strong signal! _The library is quiet, so the whisper is heard perfectly._ + +> **Warning — Watch out for local noise:** If you hook up a massive antenna and see a great RSSI (e.g., `-90 dBm`) but your signal meter is only showing **1 Bar (Bad)**, you have a problem. It means you have local interference — perhaps a cheap power supply, a noisy computer, or a nearby radio tower — creating so much static that it is drowning out your mesh. + +## Where Signal Information Appears + +In the app, signal data is shown in several places: + +- **Node list** — signal bars icon next to each node +- **Node detail** — SNR, RSSI, and signal quality in the device metrics section +- **Traceroute** — per-hop signal quality for each relay node +- **Signal metrics** — historical SNR and RSSI data in the metrics charts + +![Node entry showing SNR, RSSI values and colored signal bars](/assets/screenshots/nodes_signal_info.png) + diff --git a/docs/fr-rFR/user/tak.md b/docs/fr-rFR/user/tak.md new file mode 100644 index 000000000..8439d5925 --- /dev/null +++ b/docs/fr-rFR/user/tak.md @@ -0,0 +1,126 @@ +--- +title: TAK Integration +nav_order: 10 +last_updated: 2026-05-13 +description: Interoperate with ATAK and WinTAK — CoT position sharing, TAK roles, and plugin setup. +aliases: + - tak + - atak + - team-awareness-kit +--- + +# TAK Integration + +Meshtastic integrates with the Team Awareness Kit (TAK) ecosystem, enabling interoperability between Meshtastic mesh devices and TAK applications like ATAK and WinTAK. + +## Overview + +The TAK module allows Meshtastic nodes to: + +- Share position data in TAK-compatible CoT (Cursor on Target) format +- Appear as team members on TAK map displays +- Receive TAK PLI (Position Location Information) messages + +## Setup + +### Prerequisites + +- ATAK (Android Team Awareness Kit) or WinTAK installed +- Meshtastic ATAK Plugin installed +- TAK module enabled on your Meshtastic radio + +### Configuration + +1. Navigate to **Settings → Module Config → TAK**. +2. Enable the TAK module. +3. Configure the TAK team/group settings: + +![Module toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | Description | +| ------- | -------------------------- | +| Activé | Activate TAK interop | +| Mode | TAK-compatible output mode | + +### ATAK Plugin Setup + +1. Install the Meshtastic ATAK Plugin from the plugin repository. +2. Open ATAK and enable the Meshtastic plugin. +3. The plugin bridges messages between ATAK and your mesh network. + +## TAK Roles + +Nodes configured with TAK-related roles behave differently from standard clients: + +| Rôle | Description | +| --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **TAK** | Full TAK interoperability — sends and receives CoT data, chat messages, and PLI updates. Functions as a standard client plus TAK bridge. | +| **TAK Tracker** | Position-only TAK output — automatically broadcasts PLI at regular intervals without user interaction. Optimized for unattended position beacons (vehicles, equipment, waypoints). Does not relay chat messages. | + +> 💡 **Tip:** Use **TAK Tracker** for devices that only need to report position (e.g., a radio mounted in a vehicle). Use **TAK** for devices where users actively participate in TAK operations. + +### CoT (Cursor on Target) Format + +TAK messages use the Cursor on Target XML format — a military standard for sharing situational awareness data. Meshtastic converts its internal protobuf messages to CoT format when bridging to TAK systems, so no manual format conversion is needed. + +## TAK Identity + +When using TAK roles, your node broadcasts identity information that appears on TAK maps: + +| Setting | Description | +| -------- | ---------------------------------------------------------------------------------------------------------------- | +| Team | Your team color on the TAK map (e.g., Blue, Red, Cyan, Green) | +| Rôle | Your operational role (Team Member, Team Lead, HQ, Medic, RTO, etc.) | +| Callsign | Your TAK callsign (defaults to your Meshtastic long name) | + +These settings appear in **Settings → Module Config → TAK** when the TAK module is enabled. + +> 💡 **Tip:** Team/role colors are the standard TAK affiliation colors. Coordinate with your TAK team to use consistent team assignments. + +## Wire Format (V1 / V2) + +Meshtastic supports two TAK wire formats: + +| Format | Compatibility | Features | +| ------------------------------- | --------------------------------------------------------------- | --------------------------------------------------------- | +| V1 (Legacy) | ATAK Plugin v1.x, older firmware | Basic CoT position sharing only | +| V2 (Current) | ATAK Plugin v2.x, firmware 2.3+ | Full CoT support including chat, routes, zstd compression | + +The app automatically selects V2 when both sides support it. No manual configuration needed — the TAK module negotiates format based on firmware capabilities. + +## Usage with ATAK + +Once configured: + +- Meshtastic nodes appear as markers on the ATAK map with callsign labels +- Chat messages can bridge between mesh and TAK networks +- Position updates flow bidirectionally between Meshtastic and TAK +- TAK Tracker nodes broadcast PLI automatically — their positions appear on ATAK maps without any ATAK-side configuration + +> ⚠️ **Note:** TAK integration requires specific node roles and module configuration. Standard client nodes don't automatically participate in TAK operations. + +## Troubleshooting + +| Problem | Cause | Solution | +| -------------------------------- | ------------------------------------- | ----------------------------------------------------------------------- | +| Node doesn't appear on ATAK map | TAK module disabled or wrong role | Verify TAK module is enabled and node role is TAK or TAK Tracker | +| Position updates are stale | GPS fix lost or interval too long | Check GPS status; reduce position broadcast interval in Position Config | +| ATAK plugin shows "disconnected" | BLE connection lost or plugin crashed | Reconnect Bluetooth in Meshtastic app, then restart ATAK plugin | +| Chat messages not bridging | V1 format doesn't support chat | Ensure both nodes run firmware 2.3+ for V2 wire format | +| CoT data not flowing | Channel mismatch | All TAK nodes must be on the same channel with matching encryption | + +## Security Considerations + +- TAK data shares your position and callsign information +- Ensure your channel encryption is configured when using TAK in sensitive environments +- The TAK module respects the same channel encryption as other Meshtastic messages + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — TAK module configuration +- [Nodes](nodes) — TAK and TAK Tracker roles in the node list +- [Map & Waypoints](map-and-waypoints) — node positions on the map +- [ATAK plugin guide](https://meshtastic.org/docs/software/integrations/atak-plugin) — detailed ATAK setup on meshtastic.org + +--- + diff --git a/docs/fr-rFR/user/telemetry-and-sensors.md b/docs/fr-rFR/user/telemetry-and-sensors.md new file mode 100644 index 000000000..598d8661d --- /dev/null +++ b/docs/fr-rFR/user/telemetry-and-sensors.md @@ -0,0 +1,118 @@ +--- +title: Telemetry & Sensors +nav_order: 9 +last_updated: 2026-05-13 +description: Sensor data on the mesh — supported environment, air quality, and power sensors, plus configuration and viewing guides. +aliases: + - sensors + - environment + - weather + - power-metrics +--- + +# Telemetry & Sensors + +Meshtastic nodes can collect and share sensor data across the mesh network. + +## Overview + +Telemetry allows nodes equipped with sensors to broadcast environmental, power, and device health information. This data is visible on the node detail screen and can be logged over time. + +## Device Telemetry + +All Meshtastic nodes report basic device telemetry: + +| Metric | Description | Typical Range | +| ----------------------- | ------------------------------ | ------------------------------------------------------------------ | +| Niveau de batterie | Charge percentage | 0–100% | +| Tension | Battery voltage | 3.0–4.2V (LiPo) | +| Utilisation du canal | % of airtime used locally | 0–100% | +| Air Utilization TX | % of airtime used by this node | 0–100% | +| Durée de fonctionnement | Seconds since last boot | Varies | + +## Environment Sensors + +Supported environmental sensors: + +### Temperature & Humidity + +| Capteur | Température | Humidité | Pression | Notes | +| ------- | ----------- | -------- | -------- | ----------------------- | +| BME280 | ✓ | ✓ | ✓ | Recommended all-in-one | +| BME680 | ✓ | ✓ | ✓ | Adds gas resistance/IAQ | +| SHT31 | ✓ | ✓ | — | High accuracy | +| MCP9808 | ✓ | — | — | Precision temperature | +| LPS22 | — | — | ✓ | Pressure only | + +### Air Quality + +| Capteur | Metric | Notes | +| -------- | -------------------------------------------------- | -------------------------- | +| BME680 | Gas Resistance / IAQ | Volatile organic compounds | +| PMSA003I | PM1.0, PM2.5, PM10 | Particulate matter | +| SEN55 | PM, NOx, VOC, Temp, Humidity | Multi-sensor | + +### Light & UV + +| Capteur | Metric | +| -------- | -------------------------------------- | +| OPT3001 | Ambient light (lux) | +| VEML7700 | Ambient light (lux) | +| LTR390 | UV index | + +## Métriques d'alimentation + +Nodes with INA-series power sensors can report: + +| Metric | Description | +| ------------ | ----------------------------------------- | +| Bus Voltage | Supply rail voltage | +| Actif | Power consumption (mA) | +| Alimentation | Calculated power (mW) | + +Useful for monitoring solar charging or battery health on remote nodes. + +## Configuring Telemetry + +1. Navigate to **Settings → Module Config → Telemetry**. +2. Set reporting intervals: + - **Device Metrics Interval** — how often to broadcast device metrics + - **Environment Metrics Interval** — how often to broadcast sensor data +3. Enable specific sensor types as needed. + +### Recommended Intervals + +| Use Case | Device (s) | Environment (s) | +| ------------------------------------------ | ----------------------------- | ---------------------------------- | +| Urban mesh (many nodes) | 3600 | 3600 | +| Rural mesh (few nodes) | 900 | 900 | +| Weather station | 900 | 300 | +| Battery conservation | 7200 | 7200 | + +> ⚠️ **Note:** Shorter intervals increase airtime usage and battery drain across the mesh. + +## Viewing Telemetry + +1. Navigate to **Nodes** and select a node. +2. Telemetry sections show on the detail screen: + - Device Metrics (always available) + - Environment Metrics (if sensors present) + - Power Metrics (if INA sensor present) +3. Historical graphs show trends over time. + +![Telemetry actions](/assets/screenshots/node-metrics_telemetric_actions.png) + +## Troubleshooting + +- **No environment data showing?** The remote node needs a physical sensor connected (e.g., BME280 on I2C). Device telemetry (battery, uptime) is always available, but environment metrics require hardware. +- **Stale readings?** Check the reporting interval — very long intervals (7200s+) mean data updates infrequently. Also verify the remote node is still online. +- **Sensor conflict on I2C bus?** Some sensors share I2C addresses. If you have multiple sensors on the same bus, check for address collisions in the radio's serial debug output. + +## Related Topics + +- [Node Metrics](node-metrics) — view telemetry data on the node detail screen +- [Settings — Modules & Admin](settings-module-admin) — telemetry module configuration +- [Units & Locale](units-and-locale) — temperature and pressure display units + +--- + diff --git a/docs/fr-rFR/user/translate.md b/docs/fr-rFR/user/translate.md new file mode 100644 index 000000000..b2ed79a34 --- /dev/null +++ b/docs/fr-rFR/user/translate.md @@ -0,0 +1,97 @@ +--- +title: Translate the App +parent: User Guide +nav_order: 17 +last_updated: 2026-05-13 +aliases: + - translate + - crowdin + - localization +--- + +# Translate the App + +Contributing translations helps make Meshtastic accessible to a wider audience. The app uses [Crowdin](https://crowdin.com/) to manage community translations for both the user interface and in-app documentation. + +--- + +## What Gets Translated + +| Resource | Source Location | Notes | +| ----------------- | ------------------------------------- | ---------------------------------------------------------------------- | +| UI strings | `composeResources/values/strings.xml` | Buttons, labels, messages, and all user-visible text | +| User Guide pages | `docs/user/*.md` | In-app documentation shown in Help & Documentation | +| Fastlane metadata | `fastlane/metadata/android/en-US/` | App Store listing title, description, and changelogs | + +> **Note — Developer Guide pages are English-only.** Code-focused documentation targeting contributors is not translated. + +--- + +## How to Contribute + +1. **Visit the Crowdin project.** Open the [Meshtastic Android Crowdin project](https://crowdin.com/project/meshtastic-android) and sign in or create a free account. +2. **Choose your language.** Select an existing language or request a new one by opening a [GitHub issue](https://github.com/meshtastic/Meshtastic-Android/issues/new). +3. **Translate strings.** Crowdin shows the English source on the left and your translation on the right. Translate each string and save. +4. **Review context.** Many strings include screenshots or context comments — check these to understand where the text appears in the app. +5. **Submit.** Approved translations are automatically merged into the next release. + +> **Tip — Keep translations short.** UI strings often appear in buttons, chips, or narrow columns. If a translation is significantly longer than the English original, consider abbreviating where the meaning stays clear. + +--- + +## Adding a New Language + +If your language is not yet listed on Crowdin: + +1. Open an issue on [GitHub](https://github.com/meshtastic/Meshtastic-Android/issues/new) requesting the new locale. +2. A maintainer will add the language to Crowdin and configure `crowdin.yml`. +3. Once added, you can begin translating immediately. + +--- + +## How Translations Are Organized + +The Android app uses **Compose Multiplatform resources** for all user-visible strings: + +``` +core/resources/src/commonMain/composeResources/ +├── values/ ← English (default) +│ └── strings.xml +├── values-de/ ← German +│ └── strings.xml +├── values-fr/ ← French +│ └── strings.xml +└── ... +``` + +In-app documentation follows a similar pattern under `docs/`: + +``` +docs/ +├── user/ ← English source (default) +│ ├── onboarding.md +│ └── ... +├── fr/user/ ← French translations +│ ├── onboarding.md +│ └── ... +└── ... +``` + +The app automatically selects the correct locale based on your device's **Language & Region** settings. + +--- + +## Translation Guidelines + +- **Do not translate** technical terms like "LoRa", "MQTT", "BLE", "TAK", "SNR", or "RSSI" — these are universal. +- **Keep placeholders intact.** Strings like `%1$s` or `%d` are filled in at runtime. Do not remove or reorder them unless the grammar of your language requires it. +- **Match tone.** The app uses a friendly, direct voice. Avoid overly formal language. +- **Test if possible.** Switch your device language and open the app to see how translations look in context. + +--- + +## Questions? + +If you have questions about a specific string's context or need help getting started, open a discussion on the [Meshtastic GitHub Discussions](https://github.com/meshtastic/Meshtastic-Android/discussions) page. + +Thank you for helping expand the reach of Meshtastic! diff --git a/docs/fr-rFR/user/units-and-locale.md b/docs/fr-rFR/user/units-and-locale.md new file mode 100644 index 000000000..b0c7ce7a9 --- /dev/null +++ b/docs/fr-rFR/user/units-and-locale.md @@ -0,0 +1,118 @@ +--- +title: Units, Measurement & Locale +parent: User Guide +nav_order: 16 +last_updated: 2026-05-12 +--- + +# Units, Measurement & Locale + +The Meshtastic app automatically displays temperatures, distances, speeds, and times in the units your device is configured to use — no settings to change inside the app. + +--- + +## How It Works + +Meshtastic radios always transmit data in **metric units** (meters, °C, km/h, hPa, etc.). When the app receives this data, it uses the `MetricFormatter` utility to convert and display values in whatever unit system your device's locale specifies. + +On Android, your measurement preferences are determined by your system **Language & Region** settings. On Desktop (JVM), the app uses the JVM's default `Locale`. + +> **Tip — You never need to toggle units inside the app.** Change your system measurement preferences and every screen in Meshtastic updates automatically — node details, telemetry charts, weather, altitude, and more. + +--- + +## Température + +Temperature values from environment sensors are transmitted as **°C** and displayed based on your device's temperature unit preference. + +![Environment metrics with temperature](/assets/screenshots/nodes_environment_metrics.png) + +| Your Setting | You See | +| ------------ | ------- | +| Celsius | 22°C | +| Fahrenheit | 72°F | + +This affects all temperature displays throughout the app: node environment telemetry, soil temperature, dew point, and telemetry chart axes. + +## Distance & Altitude + +Distances between nodes and GPS altitudes are transmitted as **meters** and automatically scaled and converted. + +![Distance info display](/assets/screenshots/nodes_distance_info.png) + +| Your Setting | Small Distance | Large Distance | Altitude | +| -------------------------------- | -------------- | ---------------------- | -------- | +| Metric | 350 m | 2.5 km | 1,200 m | +| Imperial (US) | 1,148 ft | 1.6 mi | 3,937 ft | + +The app uses natural scaling — short distances stay in meters or feet, while longer distances switch to kilometres or miles automatically. + +### Where these appear + +- **Node list** — distance and bearing to each node +- **Node detail** — altitude, distance from your position +- **Map** — waypoint distances, traceroute hop distances +- **Compass** — distance to selected node + +## Vitesse + +GPS ground speed is displayed in your locale's preferred speed unit. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Metric | 12 km/h | +| Imperial (US) | 7 mph | + +## Vent + +Wind speed and gust data from environment sensors are transmitted as **m/s** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Metric | 5 m/s | +| Imperial (US) | 11 mph | + +Wind readings appear in the **Node Detail** environment section and the **Environment Telemetry** charts. + +## Rainfall + +Rainfall measurements (1-hour and 24-hour totals) are transmitted as **mm** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ---------------------- | +| Metric | 12 mm | +| Imperial (US) | 0.5 in | + +## Units That Never Change + +Some units are international standards and are displayed the same way regardless of your locale: + +| Measurement | Unit | Why | +| -------------------------------- | ------------------------------ | ------------------------------------- | +| Barometric pressure | hPa | International meteorological standard | +| Heading / bearing | ° (degrees) | Universal navigation convention | +| Radiation | μR/hr | Standard dosimetry unit | +| GPS coordinates | decimal degrees | Universal geographic standard | +| Humidity, battery, soil moisture | % | Universal | + +## Date & Time + +All timestamps throughout the app — last heard, message times, telemetry logs, chart axes — follow your device's date and time preferences. + +| Setting | What It Controls | Example | +| ---------------- | ---------------- | ------------------------------------------------ | +| **24-Hour Time** | Clock format | 14:30 vs 2:30 PM | +| **Date Format** | Date ordering | 09/05/2026 vs 05/09/2026 | + +The app also uses **relative time** where it makes sense — for example, "5 min ago" or "2 hours ago" in the node list — which is automatically localised into your device language. + +## Changing Your Measurement System (Android) + +On Android, your measurement system (metric vs imperial) is tied to your region setting: + +1. Open **Android Settings → System → Language & Region** +2. Change your **Region** or **Measurement units** preference +3. Return to Meshtastic — values update immediately + +> **Tip — The app uses `MetricFormatter` from `core:common`.** All measurement formatting is handled by a shared KMP utility that respects your platform's locale. Developers adding new measurement displays should use `MetricFormatter` rather than hard-coding unit conversions. + diff --git a/docs/ga-rIE/index.md b/docs/ga-rIE/index.md new file mode 100644 index 000000000..e53086c23 --- /dev/null +++ b/docs/ga-rIE/index.md @@ -0,0 +1,30 @@ +--- +title: Home +layout: default +nav_order: 0 +--- + +# Meshtastic Android App Documentation + +User and developer documentation for the Meshtastic Android, Desktop, and iOS applications powered by KMP (Kotlin Multiplatform). + +Use the sidebar navigation to browse the **User Guide** for app features and the **Developer Guide** for contributing to the project. + +--- + +## Quick Links + +| Guide | Cur síos | +| --------------------------------------------------------------------- | -------------------------------------------------------------- | +| [Getting Started](user/onboarding) | Connect your first radio and send a message | +| [Messages & Channels](user/messages-and-channels) | Channel broadcasts, direct messages, reactions, and encryption | +| [Nodes](user/nodes) | Understanding the mesh network node list | +| [Signal Meter](user/signal-meter) | How the LoRa signal quality meter works | +| [Units & Locale](user/units-and-locale) | How temperatures, distances, and times adapt to your region | +| [Desktop App](user/desktop) | Linux, macOS, and Windows desktop usage | +| [Architecture](developer/architecture) | App architecture overview for contributors | +| [Contributing](developer/contributing) | Branch naming, PR workflow, and verification commands | + +--- + +> This documentation is served from the same markdown source that powers the in-app **Help & Documentation** browser. diff --git a/docs/ga-rIE/user/connections.md b/docs/ga-rIE/user/connections.md new file mode 100644 index 000000000..f2b94131c --- /dev/null +++ b/docs/ga-rIE/user/connections.md @@ -0,0 +1,125 @@ +--- +title: Connections +nav_order: 2 +last_updated: 2026-05-13 +description: Connect your phone or desktop to a Meshtastic radio via Bluetooth, USB, or TCP/IP. +aliases: + - bluetooth + - usb + - tcp + - pairing +--- + +# Connections + +Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node. + +## Bluetooth (BLE) + +Bluetooth Low Energy is the default and most common connection method on Android. + +### Pairing a Device + +1. Ensure your Meshtastic radio is powered on and in pairing mode. +2. Open the app and navigate to **Connections**. +3. Tap **Scan for Devices** — nearby Meshtastic radios will appear. +4. Select your device from the list. +5. Accept the Bluetooth pairing prompt if shown. + +![Device list item](/assets/screenshots/connections_bluetooth_scan.png) + +You can filter devices by transport type using the filter chips at the top: + +![Transport filter chips](/assets/screenshots/connections_transport_filters.png) + +> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. + +### Connection Status + +| Icon | State | Cur síos | +| ---- | -------------- | ----------------------------- | +| 🟢 | Connected | Active radio link established | +| 🟡 | Connecting | Handshake in progress | +| 🔴 | Na ceangailte | No active connection | +| ⚪ | Not configured | No device selected | + +When connecting, a status indicator shows the current connection state: + +![Connecting status](/assets/screenshots/connections_connecting.png) + +If no devices are found, the app shows an empty state with instructions: + +![No devices found](/assets/screenshots/connections_empty_state.png) + +### Troubleshooting Bluetooth + +- **Device not found:** Toggle Bluetooth off/on, ensure location is enabled. +- **Connection drops:** Move closer to the radio; check for interference. +- **Pairing rejected:** Forget the device in Android Bluetooth settings and retry. + +## USB Serial + +USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable. + +### Setup + +1. Connect your radio via USB cable to your device. +2. The app will prompt for USB permission — tap **Allow**. +3. The connection is established automatically. + +> ⚠️ **Note:** USB connections require OTG support on Android devices. + +## TCP/IP (WiFi) + +Some Meshtastic radios support WiFi connectivity, allowing TCP-based connections. + +### Configuration + +1. Connect your radio to a WiFi network via the radio's web interface or settings. +2. In the app, go to **Connections → TCP**. +3. Enter the radio's IP address and port (default: 4403). +4. Tap **Connect**. + +![WiFi scanning for devices](/assets/screenshots/connections_wifi_scanning.png) + +When a device is found, it appears in the connection list: + +![WiFi device found](/assets/screenshots/connections_wifi_device_found.png) + +A successful connection is confirmed with a status indicator: + +![WiFi connection success](/assets/screenshots/connections_wifi_success.png) + +### When to Use TCP + +- Radio is on the same local network +- Testing with a simulated radio +- Environments where Bluetooth has interference issues + +## Reconnection Behavior + +The app reconnects to the **last selected device** on startup. You can manually switch transports from the connections screen at any time. + +To disconnect from a radio, use the disconnect button on the connections screen: + +![Disconnect from radio](/assets/screenshots/connections_disconnect.png) + +## Desktop Connections + +On Desktop (Linux/macOS/Windows), the app supports: + +- **Bluetooth (BLE)** — via the Kable library; works on macOS, Linux, and Windows +- **USB Serial** — primary wired connection method +- **TCP/IP** — for network-connected radios + +See [Desktop App](desktop) for platform-specific details and keyboard shortcuts. + +## Related Topics + +- [Getting Started](onboarding) — first-launch setup and permissions +- [Settings — Radio & User](settings-radio-user) — Bluetooth and network configuration +- [Desktop App](desktop) — desktop-specific connection details +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — full list of compatible radios on meshtastic.org + +--- + diff --git a/docs/ga-rIE/user/desktop.md b/docs/ga-rIE/user/desktop.md new file mode 100644 index 000000000..a688679eb --- /dev/null +++ b/docs/ga-rIE/user/desktop.md @@ -0,0 +1,147 @@ +--- +title: Desktop App +nav_order: 14 +last_updated: 2026-05-13 +description: Install and use the Meshtastic Desktop app on Linux, macOS, and Windows — connections, feature parity, and keyboard shortcuts. +aliases: + - desktop + - linux + - macos + - windows + - jvm +--- + +# Desktop App + +The Meshtastic Desktop application provides the same mesh communication features on Linux, macOS, and Windows. + +## Overview + +The Desktop app shares its core codebase with the Android app through Kotlin Multiplatform (KMP). Most features work identically across platforms. + +## Installation + +### Linux + +- Download the `.deb` or `.AppImage` package from the releases page +- Or build from source using `./gradlew :desktopApp:run` + +### macOS + +- Download the `.dmg` package from releases +- Or build from source + +### Windows + +- Download the `.msi` installer from releases +- Or build from source + +## Connecting Your Radio + +### USB Serial (Primary) + +The most reliable connection method on Desktop: + +1. Connect your Meshtastic radio via USB cable. +2. The app should detect the serial port automatically. +3. If not detected, select the correct serial port from the connections menu. + +### TCP/IP + +For network-connected radios: + +1. Enter the radio's IP address and port (default: 4403). +2. Click **Connect**. + +### Bluetooth (BLE) + +Bluetooth Low Energy is supported on Desktop via the [Kable](https://github.com/JuulLabs/kable) library: + +1. Ensure your system has a Bluetooth adapter. +2. The app scans for nearby Meshtastic radios automatically. +3. Select your device from the connections screen. + +## Feature Parity + +| Feature | Android | Desktop | Notes | +| ---------------------------------------- | ------- | ------- | -------------------------- | +| Messaging | ✓ | ✓ | Full parity | +| Node List | ✓ | ✓ | Full parity | +| Map | ✓ | ✓ | Full parity | +| Settings | ✓ | ✓ | Full parity | +| Bluetooth (BLE) | ✓ | ✓ | Via Kable on desktop | +| Firmware Update OTA | ✓ | ✗ | Use web flasher | +| Notifications | ✓ | ✓ | Native OS notifications | +| Widgets | ✓ | ✗ | Android-only | +| AI Assistant (Chirpy) | ✓\* | ✗ | Google flavor Android only | + +\*Chirpy AI requires Android 14+ on Google flavor builds with supported hardware. + +## UI Differences + +The Desktop app uses the same Compose Multiplatform UI with adaptations for larger screens and desktop interaction. + +### Keyboard Shortcuts + +| Shortcut | Action | +| ------------------- | --------------------------- | +| **⌘Q** / **Ctrl+Q** | Quit the application | +| **⌘,** / **Ctrl+,** | Open Settings | +| **⌘1** / **Ctrl+1** | Switch to Conversations tab | +| **⌘2** / **Ctrl+2** | Switch to Nodes tab | +| **⌘3** / **Ctrl+3** | Switch to Map tab | +| **⌘4** / **Ctrl+4** | Switch to Connections tab | + +### Window & System Tray + +- **Window resizing** — responsive layout adapts to window dimensions +- **System tray** — minimize to system tray for background mesh operation +- **Tray menu** — right-click the tray icon to show window or quit +- **Mouse interaction** — hover states and standard desktop navigation + +### Notification Preferences + +The Desktop app provides in-app toggles for controlling which notifications are shown — messages, new nodes, and low battery alerts. Access these from **Settings → Notifications** within the app. + +## Built-in Documentation Browser + +The Desktop app includes a built-in documentation browser for quick access to help content without leaving the application. + +![Docs browser with table of contents](/assets/screenshots/docs-browser_toc.png) + +The browser supports full-text search across all documentation: + +![Searching the docs browser](/assets/screenshots/docs-browser_search.png) + +Individual doc pages render with full formatting: + +![A documentation page](/assets/screenshots/docs-browser_page.png) + +## Building from Source + +```bash +git clone https://github.com/meshtastic/Meshtastic-Android.git +cd Meshtastic-Android +git submodule update --init +./gradlew :desktopApp:run +``` + +Requirements: + +- JDK 21 +- No Android SDK required for desktop-only builds + +## Known Limitations + +- No OTA firmware updates (use web flasher) +- Some Android-specific features (widgets, specific notification channels) are unavailable +- Performance may vary on low-spec hardware running Compose Desktop +- BLE bonding is not yet supported on desktop (pairing works without bonding) + +## Related Topics + +- [Connections](connections) — connection methods overview +- [Firmware Updates](firmware) — use the [Web Flasher](https://flasher.meshtastic.org) for desktop firmware updates + +--- + diff --git a/docs/ga-rIE/user/discovery.md b/docs/ga-rIE/user/discovery.md new file mode 100644 index 000000000..018179d60 --- /dev/null +++ b/docs/ga-rIE/user/discovery.md @@ -0,0 +1,114 @@ +--- +title: Discovery +nav_order: 12 +last_updated: 2026-05-13 +description: Explore your mesh network — traceroute paths, neighbor maps, and node discovery tools. +aliases: + - mesh-discovery + - local-discovery + - network-scan + - traceroute + - neighbor-info +--- + +# Discovery + +Discovery tools help you understand **how** your mesh network is connected — which nodes can hear each other, what paths messages take, and where bottlenecks or weak links exist. + +> 💡 **Tip:** You don't need a dedicated "discovery mode" to start exploring your mesh. The tools below are available right now from the node list and node detail screens. + +--- + +## Céim rianadóireachta + +Traceroute reveals the exact path a message takes from your node to any other node on the mesh. It's the single most useful tool for debugging connectivity problems. + +### Running a Traceroute + +1. Navigate to **Nodes** and tap the node you want to trace. +2. On the node detail screen, tap **Traceroute**. +3. The app sends a traceroute request and waits for the response. +4. Results display each hop in order, with signal quality at every step. + +### Reading the Results + +A traceroute result looks like this: + +``` +You → Node A (SNR: 8.5, RSSI: -95) → Node B (SNR: 5.2, RSSI: -108) → Target +``` + +Each hop represents a relay node that forwarded the message. The SNR and RSSI values at each hop tell you about the link quality on that specific segment. + +| What to look for | What it means | +| -------------------------------------------------------------------------- | --------------------------------------------------------------------------- | +| All hops show Good SNR (> 5 dB) | Healthy path — messages flow reliably | +| One hop shows Bad SNR (< 0 dB) | Weak link — this relay segment is fragile | +| Many hops (4+) | Long path — consider repositioning a node to shorten it | +| Different path on retry | Mesh is adapting — multiple routes exist (this is good!) | + +> 💡 **Tip:** Run traceroute several times over a few minutes. If the path changes, your mesh has redundant routes — a sign of a well-connected network. + +### Troubleshooting with Traceroute + +- **"No route found"** — The target node may be offline, out of range, or on a different channel. Check that both nodes share at least one channel with the same encryption key. +- **Traceroute times out** — The path may be too long (exceeds hop limit) or a relay node is congested. Try increasing the hop limit in **Settings → LoRa Config**. +- **Asymmetric paths** — A traceroute from A→B may take a different path than B→A. This is normal — radio propagation is not always symmetric. + +--- + +## Neighbor Info + +The Neighbor Info module lets each node broadcast a list of the nodes it can **directly hear** (single-hop). When multiple nodes share their neighbor lists, you can piece together a topology map of the entire mesh. + +### Enabling Neighbor Info + +1. Navigate to **Settings → Module Config → Neighbor Info**. +2. Enable the module. +3. Set the broadcast interval (default: 900 seconds / 15 minutes). + +Once enabled, your node periodically broadcasts its neighbor table. Other nodes with Neighbor Info enabled do the same. + +### Viewing Neighbor Data + +- Open any node's detail screen and look for the **Neighbors** section. +- Each neighbor entry shows the node that was directly heard and its signal quality. +- Combine neighbor data from multiple nodes to understand the full mesh topology. + +> ⚠️ **Note:** Neighbor Info increases airtime usage because every enabled node periodically broadcasts its neighbor list. On busy meshes with many nodes, consider longer broadcast intervals (3600 seconds or more) to avoid congestion. + +--- + +## Node List as a Discovery Tool + +The node list itself is a powerful discovery tool when you use its filtering and sorting features effectively. + +### Finding New Nodes + +- Sort by **Last heard** to see the most recently active nodes at the top. +- Enable **Include unknown** to see nodes that have appeared on the mesh but haven't sent user info yet — these are often newly powered-on devices. + +### Assessing Connectivity + +- Sort by **Hops away** to see which nodes are directly reachable (0 hops) versus relayed. +- Sort by **Distance** to find nearby nodes and verify they're reachable. +- Use **Exclude MQTT** to focus on nodes reachable over radio (not via internet bridge). + +### Infrastructure Audit + +- Disable **Exclude infrastructure** to see Router, Repeater, Router Late, and Client Base nodes. +- Check their signal quality and last-heard times to verify your infrastructure nodes are healthy. + +See [Nodes](nodes) for full details on filtering and sorting options. + +--- + +## Tips for Mesh Exploration + +- **Start with traceroute** — it gives you immediate, actionable information about a specific path. +- **Enable Neighbor Info on key nodes** — especially routers and repeaters, to build a picture of the backbone. +- **Check the map** — node positions on the [Map](map-and-waypoints) combined with signal data help you understand why some links are strong and others are weak. +- **Compare signal over time** — use the [Signal Meter](signal-meter) guide to interpret SNR and RSSI values correctly. + +--- + diff --git a/docs/ga-rIE/user/firmware.md b/docs/ga-rIE/user/firmware.md new file mode 100644 index 000000000..c770115f0 --- /dev/null +++ b/docs/ga-rIE/user/firmware.md @@ -0,0 +1,114 @@ +--- +title: Firmware Updates +nav_order: 13 +last_updated: 2026-05-13 +description: Update your radio firmware over Bluetooth — OTA process, version channels, pre-flight checks, and recovery. +aliases: + - firmware + - update + - ota + - flash +--- + +# Firmware Updates + +Keep your Meshtastic radio up to date with the latest firmware for new features, bug fixes, and security improvements. + +## Checking for Updates + +1. Navigate to **Settings → Firmware Update** or tap the firmware notification if shown. +2. The app checks for available firmware versions. +3. Available updates show the version number and changelog summary. + +## Update Methods + +### OTA (Over-The-Air) via Bluetooth + +The most common update method for Android users: + +1. Ensure your radio is connected via Bluetooth. +2. Navigate to the Firmware Update screen. +3. Select the desired firmware version. +4. Tap **Update** to begin the OTA process. +5. Wait for the update to complete — **do not disconnect** during the update. + +![Firmware checking for updates](/assets/screenshots/firmware_checking.png) + +> ⚠️ **Warning:** Interrupting a firmware update can brick your device. Ensure your radio has sufficient battery (>50% recommended) and maintain Bluetooth proximity during the entire process. + +![Firmware disclaimer](/assets/screenshots/firmware_disclaimer.png) + +### USB Flashing + +For recovery or when OTA is unavailable: + +- Use the [Meshtastic Web Flasher](https://flasher.meshtastic.org) +- Or the [Meshtastic CLI tool](https://meshtastic.org/docs/getting-started/flashing-firmware) on desktop + +## Version Channels + +| Cainéal | Cur síos | +| ------- | ------------------------------------------- | +| Stable | Recommended for most users; tested releases | +| Alpha | Preview releases; may contain bugs | + +## Pre-Update Checklist + +Before updating: + +- [ ] Battery > 50% +- [ ] Stable Bluetooth connection +- [ ] Note your current settings (they may reset on major version changes) +- [ ] Check the release notes for breaking changes + +## Post-Update + +After a successful update: + +- The radio will reboot automatically +- Bluetooth connection will re-establish +- Verify your settings are intact +- Check the firmware version in **Settings → About** + +![Firmware update success](/assets/screenshots/firmware_success.png) + +## Troubleshooting + +### Update Stuck + +If the update appears frozen: + +- Wait at least 5 minutes before intervening +- If truly stuck, power-cycle the radio +- Attempt the update again + +![Firmware update error](/assets/screenshots/firmware_error.png) + +### Device Won't Boot After Update + +If your device fails to boot: + +1. Try connecting via USB to a computer +2. Use the web flasher in recovery/DFU mode +3. Flash a known-good firmware version +4. Check the Meshtastic Discord for device-specific recovery steps + +### Compatibility Warnings + +The app may show warnings when: + +- Connected radio firmware is below minimum supported version +- Major version mismatch between app and firmware +- Deprecated features need migration + +> ⚠️ **Important:** Always update the Meshtastic app before or alongside firmware updates to ensure compatibility. + +## Related Topics + +- [Connections](connections) — reconnecting after a firmware update +- [Flashing firmware guide](https://meshtastic.org/docs/getting-started/flashing-firmware) — full firmware flashing walkthrough on meshtastic.org +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — check firmware compatibility by device +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/ga-rIE/user/map-and-waypoints.md b/docs/ga-rIE/user/map-and-waypoints.md new file mode 100644 index 000000000..f76aa28bd --- /dev/null +++ b/docs/ga-rIE/user/map-and-waypoints.md @@ -0,0 +1,116 @@ +--- +title: Map & Waypoints +nav_order: 6 +last_updated: 2026-05-13 +description: View node positions on the map, create and share waypoints, and manage position sharing and privacy. +aliases: + - map + - waypoints + - gps + - location +--- + +# Map & Waypoints + +The Map screen shows the geographic positions of nodes on your mesh, along with shared waypoints. + +## Map View + +The map displays: + +- **Node positions** — colored markers for each node reporting location +- **Waypoints** — shared points of interest +- **Your position** — your current GPS location + +### Node Markers + +Node markers on the map indicate: + +| Color | Meaning | +| ------ | ---------------------------------------------- | +| Green | Online (heard recently) | +| Yellow | Away (heard within 2 hours) | +| Gray | Offline (stale position) | +| Blue | Your own node | + +### Map Controls + +- **Zoom** — pinch or use +/- buttons +- **Pan** — drag to explore +- **Center** — select the location button to center on your position +- **Node tap** — tap a node marker to view details + +The floating toolbar provides quick access to compass, layer switching, node filters, refresh, and location tracking. Tap the compass to reorient north-up, or tap the location button to center on your current position. + +![Map controls overlay](/assets/screenshots/map_controls_overlay.png) + +## Waypoints + +Waypoints are shared geographic points of interest that all mesh members can see. + +### Creating a Waypoint + +1. Long-press on the map at the desired location. +2. Enter a name and optional description. +3. Choose an icon/emoji for the waypoint. +4. Tap **Send** to share with the mesh. + +### Waypoint Properties + +| Property | Cur síos | +| ---------- | ------------------------------------------------------- | +| Ainm | Short identifier (max 30 characters) | +| Cur síos | Optional longer description | +| Icon | Visual marker emoji on the map | +| Ceangailte | If locked, only the creator can edit or delete | +| Expiration | Optional auto-remove time | + +### Waypoint Expiration + +Waypoints can be set to expire automatically: + +- **Never** (default) — waypoint remains until manually deleted +- **Timed** — waypoint is automatically removed after the specified duration (e.g., "remove after 2 hours"). Useful for temporary markers like rally points, hazards, or meeting locations. + +Expired waypoints are automatically hidden from the map so they don't clutter the display. The expiration countdown begins when the waypoint is created, not when other nodes receive it. + +### Managing Waypoints + +- Tap a waypoint on the map to view its details and coordinates +- Edit or delete waypoints you created +- **Locked waypoints** cannot be modified or deleted by other nodes — only the original creator can change them +- Unlocked waypoints can be edited by any mesh member + +## Position Sharing + +### Enabling Position Sharing + +Your node shares its GPS position based on: + +- **Fixed interval** — broadcast position at regular intervals +- **Smart position** — broadcast when movement exceeds a threshold +- **Manual** — only share when explicitly requested + +Configure position behavior in **Settings → Position**. + +### Privacy Considerations + +> 🔒 **Privacy:** Position data is broadcast to all nodes on your channel. If you don't want your location shared, disable GPS position in settings or use a fixed/fake position. + +## Map Sources + +The app supports multiple map tile sources: + +- OpenStreetMap (default) +- Satellite imagery (where available) +- Offline tiles (download map areas for offline use) + +## Related Topics + +- [Nodes](nodes) — view and filter your node list +- [Node Metrics](node-metrics) — signal quality and position history for individual nodes +- [Discovery](discovery) — traceroute and neighbor info for understanding mesh topology +- [Units & Locale](units-and-locale) — distance and coordinate display formats + +--- + diff --git a/docs/ga-rIE/user/messages-and-channels.md b/docs/ga-rIE/user/messages-and-channels.md new file mode 100644 index 000000000..4b4ab36f9 --- /dev/null +++ b/docs/ga-rIE/user/messages-and-channels.md @@ -0,0 +1,159 @@ +--- +title: Messages & Channels +nav_order: 3 +last_updated: 2026-05-13 +description: Send and receive messages, manage channels, configure encryption, and use quick chat, reactions, and message actions. +aliases: + - channels + - direct-messages + - messaging + - conversations +--- + +# Messages & Channels + +Meshtastic supports two communication modes: **channel broadcasts** and **direct messages**. + +## Channels + +Channels are shared communication groups. All nodes configured with the same channel key can read and send messages on that channel. + +### Default Channel + +Every Meshtastic device comes with a default **LongFast** channel. This is an unencrypted channel used for general mesh communication. + +### Channel Security + +Channels support multiple encryption levels: + +| Icon | Security Level | Cur síos | +| ---- | ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------- | +| 🔒 | PSK (256-bit AES) | Fully encrypted with a strong pre-shared key. Only nodes with the matching key can read messages. | +| 🔐 | PSK (128-bit AES) | Encrypted with a shorter key. Secure for most uses but 256-bit is preferred for sensitive data. | +| 🔓 | Default / Open | Uses the well-known default key. **Any Meshtastic device** on the same preset can read these messages. | +| ⚠️ | Insecure + Position | Open channel that also broadcasts your GPS position. Use with caution in public meshes. | + +> 🔒 **Security Tip:** 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. + +### Adding a Channel + +1. Navigate to **Settings → Channels**. +2. Tap **Add Channel** or scan a QR code. +3. Configure the channel name and encryption key. +4. Share the channel URL/QR code with others who need access. + +Tapping a channel shows its details and sharing options. + +## Direct Messages + +Direct messages (DMs) are point-to-point encrypted communications between two specific nodes. + +### Sending a Direct Message + +1. Open the **Messages** tab. +2. Select a node from your contacts list or tap a node in the node list. +3. Type your message and tap **Send**. + +### Message States + +| State | Icon | Meaning | +| --------------------------------- | ---- | ----------------------------------------------------------------------------------------------------------------- | +| Queued | ⏳ | Message waiting to be sent | +| En route | ✓ | Delivered to the radio, awaiting acknowledgment | +| Delivered | ✓✓ | Acknowledgment received from recipient | +| Received | ✓ | Message received from the mesh (incoming) | +| S&F Routing | 🔗 | Store & Forward: message being routed through an S&F node | +| S&F Confirmed | 🔗 | Store & Forward: delivery confirmed via S&F node | +| Earráid | ✗ | Delivery failed after retries | + +### Delivery Errors + +When a message fails to deliver, the error indicator shows what went wrong: + +| Earráid | Meaning | What to Do | +| ----------------- | ---------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| No Route | No path exists to the destination node | The recipient may be offline or out of mesh range. Try later or move closer. | +| Got NAK | The next-hop node refused to relay | The relay node may be congested. Wait and retry. | +| Am tráth | No acknowledgment within retry window | The recipient may be just out of range. Try increasing hop limit or moving to a better position. | +| Gan anicéir | No radio interface available to send | Check that your radio is connected and the channel is configured. | +| Max Retransmit | All retry attempts exhausted | The mesh path is unreliable. Try a different channel or wait for conditions to improve. | +| Gan cainéal | The destination channel doesn't exist | Verify both nodes share the same channel configuration. | +| Too Large | Message exceeds maximum payload size | Shorten your message (max ~230 characters). | +| No Response | Node received message but didn't respond | The recipient's radio may be busy or in low-power sleep mode. | +| Duty Cycle Limit | Regional airtime limit reached | Your radio has used its allowed transmit time. Wait for the duty cycle window to reset (typically 1 hour in EU regions). | +| Iarratas Mícheart | Malformed or invalid message | This usually indicates a software bug. Try restarting the app. | + +> 💡 **Tip:** 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. + +## Message Features + +### Quick Chat + +Pre-configured messages for rapid communication: + +- Access via the Quick Chat button in the message input area +- Choose from built-in phrases or custom messages +- Customize quick chat messages in **Settings → Quick Chat** +- Useful when typing is impractical (gloves, small screen, urgent) + +![Quick chat option](/assets/screenshots/messages_quick_chat.png) + +The channel list shows each channel with its latest message preview. + +### Message Bubbles + +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. + +### Reactions + +React to messages with emoji: + +- **Long-press** a message to open the actions menu +- Tap **Add Reaction** to choose an emoji +- Reactions appear below the message bubble +- Multiple users can react to the same message +- React to your own messages or others' messages + +![Emoji reaction badges displayed beneath a message](/assets/screenshots/messages_reaction.png) + +> 💡 **Tip:** Reactions are lightweight — they use minimal mesh bandwidth compared to full text messages. + +### Message Actions + +Long-press any message to access: + +- **Copy** — copy message text to clipboard +- **Reply** — quote the message in your response +- **React** — add an emoji reaction +- **Delete** — remove a message you sent (local deletion) + +### Message Priority + +Messages are queued and transmitted based on priority: + +1. Emergency/alert messages (highest) +2. Direct messages +3. Channel broadcasts (lowest) + +### Message Limits + +- **Maximum length:** 237 bytes (approximately 230 characters for ASCII text) +- **Rate limiting:** The mesh enforces airtime fairness; heavy message volume may be throttled +- **Delivery:** Messages are retried automatically if no acknowledgment is received + +## Best Practices + +- Use channels for group coordination +- Use direct messages for private person-to-person communication +- Keep messages short — mesh bandwidth is limited +- Configure encryption for sensitive communications + +## Related Topics + +- [Nodes](nodes) — tap a node to start a direct message +- [Settings — Radio & User](settings-radio-user) — configure channel encryption and presets +- [MQTT](mqtt) — bridge channel messages to the internet +- [Channel configuration](https://meshtastic.org/docs/configuration/radio/channels) — detailed channel settings on meshtastic.org + +--- + diff --git a/docs/ga-rIE/user/mqtt.md b/docs/ga-rIE/user/mqtt.md new file mode 100644 index 000000000..588dad955 --- /dev/null +++ b/docs/ga-rIE/user/mqtt.md @@ -0,0 +1,137 @@ +--- +title: MQTT +nav_order: 11 +last_updated: 2026-05-13 +description: Bridge your mesh to the internet — MQTT broker setup, encryption layers, and map reporting. +aliases: + - mqtt + - internet-bridge + - broker +--- + +# MQTT + +MQTT bridges your Meshtastic mesh network to the internet, enabling long-range communication beyond radio range. + +## Overview + +The MQTT module connects your node to an MQTT broker, allowing: + +- Messages to reach nodes on different physical meshes via the internet +- Integration with home automation and monitoring systems +- Publishing node positions to the public Meshtastic map +- Custom data pipelines for logging and alerting + +## How It Works + +``` +[Your Node] → Radio → [Gateway Node with WiFi] → MQTT Broker → [Remote Gateway] → Radio → [Remote Node] +``` + +A gateway node with internet access (WiFi or Ethernet) publishes mesh messages to an MQTT topic. Remote gateways subscribed to the same topic inject those messages into their local mesh. + +## Configuration + +### Enabling MQTT + +1. Navigate to **Settings → Module Config → MQTT**. +2. Enable the MQTT module. +3. Configure the broker connection: + +![MQTT toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | Cur síos | Default | +| --------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------- | +| Server Address | MQTT broker hostname | mqtt.meshtastic.org | +| Username | Broker authentication | meshdev | +| Password | Broker authentication | large4cats | +| Root Topic | Base topic for messages | msh | +| Encryption | Encrypt MQTT payload | Enabled | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON packet support has been removed from firmware; this field is ignored | Disabled | +| TLS | Secure connection to broker | Disabled | +| Map Reporting | Report position to public map | Disabled | + +### Default Meshtastic Broker + +The community maintains a public broker at `mqtt.meshtastic.org`. This is intended for general use and testing. + +> 🔒 **Privacy:** Messages on the public broker are readable by anyone subscribed. Always use channel encryption for private communications. + +### Private Broker + +For better privacy and control, you can run your own MQTT broker: + +- Mosquitto (lightweight, open-source) +- HiveMQ +- EMQX + +Configure your node to point to your private broker with appropriate credentials. + +## Map Reporting + +When Map Reporting is enabled, your node publishes its position to the Meshtastic community map: + +- Visible at [meshmap.net](https://meshmap.net) and similar community map services +- Only position and node info are shared +- Disable this if you don't want your location publicly visible + +## Uplink vs Downlink + +| Direction | Cur síos | +| ------------ | -------------------------------- | +| **Uplink** | Messages from mesh → MQTT broker | +| **Downlink** | Messages from MQTT broker → mesh | + +Configure per-channel which directions are active to control message flow and airtime usage. + +## Message Formats + +MQTT uses protobuf message format: + +| Format | Cur síos | Use case | +| ------------ | ----------------------------------- | -------------------------- | +| **Protobuf** | Binary Meshtastic protobuf encoding | Node-to-node mesh bridging | + +> ⚠️ **Note:** JSON output support was removed from firmware. The `json_enabled` setting is still visible in the app for legacy compatibility but has no effect on current firmware versions. + +## Encryption & Privacy + +Understanding the layered encryption model: + +1. **Channel encryption** happens on the mesh _before_ MQTT. If your channel has a PSK, the MQTT payload is already encrypted — the broker and any subscribers see only the ciphertext. +2. **MQTT encryption** (the module setting) adds an additional encryption layer for transit to the broker. This protects metadata and routing information. +3. **TLS** encrypts the TCP connection to the broker itself, preventing network-level eavesdropping. + +> 🔒 **Important:** The default public channel has a well-known key. Messages on the default channel sent via MQTT are effectively **unencrypted** — anyone can decode them. Always use a custom PSK for private communications. + +## Best Practices + +- Use channel-level encryption (PSK) on channels that bridge to MQTT +- Don't enable MQTT on nodes without internet access (it will buffer and waste memory) +- Use a private broker for sensitive deployments +- Be mindful of airtime when downlinking messages from busy MQTT topics — every downlinked message consumes radio airtime on your local mesh +- Consider enabling uplink-only if you only need to monitor your mesh remotely without injecting messages back + +## Troubleshooting + +### MQTT Not Connecting + +- **Check WiFi** — the gateway node must have an active internet connection (WiFi or Ethernet). MQTT does not work over the LoRa radio link itself. +- **Verify credentials** — incorrect username or password will silently fail on most brokers. Double-check for trailing spaces. +- **Firewall** — port 1883 (MQTT) or 8883 (MQTT+TLS) must be open. Some networks block non-standard ports. +- **DNS resolution** — if using a custom broker hostname, verify the node can resolve it. Try the broker's IP address directly. + +### Messages Not Bridging + +- **Check uplink/downlink settings** — if only uplink is enabled, messages flow from mesh to MQTT but not back. Enable downlink on the receiving gateway. +- **Channel mismatch** — both gateways must share the same channel with the same PSK. A mismatch means messages are encrypted with different keys and appear as garbage. +- **Topic mismatch** — ensure both gateways use the same root topic. The default `msh` works for the public broker. + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — MQTT module configuration reference +- [Messages & Channels](messages-and-channels) — channel encryption and PSK setup +- [MQTT integration guide](https://meshtastic.org/docs/software/integrations/mqtt) — detailed MQTT documentation on meshtastic.org + +--- + diff --git a/docs/ga-rIE/user/node-metrics.md b/docs/ga-rIE/user/node-metrics.md new file mode 100644 index 000000000..a68bcb4ff --- /dev/null +++ b/docs/ga-rIE/user/node-metrics.md @@ -0,0 +1,130 @@ +--- +title: Node Metrics +nav_order: 5 +last_updated: 2026-05-13 +description: Telemetry dashboards for each mesh node — device health, environment sensors, signal quality, power, traceroute, and position history. +aliases: + - metrics + - telemetry + - device-metrics + - signal +--- + +# Node Metrics + +The node detail screen provides comprehensive telemetry and metrics for each node on your mesh. + +## Device Metrics + +Basic operating information reported by each node: + +| Metric | Cur síos | +| ------------- | ----------------------------------- | +| Battery Level | Current battery percentage | +| Voltage | Battery voltage reading | +| Úsáid cainéil | Percentage of airtime consumed | +| Airtime | Transmission time used by this node | +| Uptime | Time since last reboot | + +Device metrics are displayed as individual cards with trend sparklines showing battery level, voltage, channel utilization, airtime, and uptime over time. + +> 💡 **Tip:** Tap any metric card to expand it into a full chart with historical data points. Pinch to zoom the time axis. + +## Environment Metrics + +Environmental sensor data (requires compatible hardware): + +| Metric | Sensor Examples | +| ------------------------------------ | --------------------- | +| Teocht | BME280, BME680, SHT31 | +| Laige | BME280, BME680, SHT31 | +| Barometric Pressure | BME280, BMP280 | +| Gas Resistance | BME680 | +| IAQ (Air Quality) | BME680 | + +Environment metrics are charted over time for easy trend analysis — temperature, humidity, and pressure each get their own line chart with the measurement unit displayed on the Y axis. + +> 💡 **Tip:** Environment metrics require a sensor connected to the remote node. Not all nodes report environmental data. See [Telemetry & Sensors](telemetry-and-sensors) for a full list of supported sensors. + +## Signal Metrics + +Radio signal quality information: + +| Metric | Cur síos | +| --------- | ----------------------------------------------------------------------------- | +| SNR | Signal-to-Noise Ratio (higher is better) | +| RSSI | Received Signal Strength Indicator (closer to 0 is better) | +| Hop Count | Number of mesh hops for last message | + +### Signal Quality Reference + +| SNR Range | Quality | +| --------------------------------- | ------------- | +| > 10 dB | Excellent | +| 0 to 10 dB | Maith | +| -10 to 0 dB | Ceart go leor | +| < -10 dB | Poor | + +## Power Metrics + +Power management telemetry (requires INA sensor or compatible hardware): + +| Metric | Cur síos | +| ----------- | ----------------------- | +| Bus Voltage | Supply voltage | +| Current | Power draw in milliamps | +| Power | Calculated wattage | + +## Céim rianadóireachta + +Traceroute shows the path a message takes through the mesh: + +1. From the node detail screen, tap **Traceroute**. +2. The app sends a traceroute request to the target node. +3. Results show each hop with SNR/RSSI values. + +### Reading Traceroute Results + +``` +You → Node A (SNR: 8.5) → Node B (SNR: 5.2) → Target +``` + +Each hop represents a relay node that forwarded the message. + +## Lógáil Seirbhís + +Historical position data for nodes that share their location: + +- GPS coordinates +- Altitude +- Speed (if moving) +- Timestamp for each position report + +## Neighbor Info + +Shows which nodes a given node can directly hear, useful for understanding mesh topology. + +## Viewing Metrics + +1. Navigate to **Nodes**. +2. Tap the node you want to inspect. +3. Select the metric category from the detail tabs. + +![Node detail — local device](/assets/screenshots/nodes_detail_local.png) + +The position tab shows location data for nodes that share GPS: + +![Position inline content](/assets/screenshots/nodes_position.png) + +> ⚠️ **Note:** Metrics are only available when they have been reported by the remote node. Metrics update at intervals configured on each node's telemetry settings. + +## Related Topics + +- [Nodes](nodes) — node list, filtering, and sorting +- [Telemetry & Sensors](telemetry-and-sensors) — supported sensors and configuration +- [Signal Meter](signal-meter) — how signal quality is calculated from SNR and RSSI +- [Discovery](discovery) — traceroute details and neighbor info +- [Units & Locale](units-and-locale) — temperature, distance, and speed display formats + +--- + diff --git a/docs/ga-rIE/user/nodes.md b/docs/ga-rIE/user/nodes.md new file mode 100644 index 000000000..50b4b386f --- /dev/null +++ b/docs/ga-rIE/user/nodes.md @@ -0,0 +1,152 @@ +--- +title: Nodes +nav_order: 4 +last_updated: 2026-05-13 +description: Browse, filter, and sort mesh nodes — view details, signal quality, roles, and quick actions. +aliases: + - node-list + - mesh-nodes + - peers +--- + +# Nodes + +The Nodes screen displays all devices visible on your mesh network. + +## Node List + +The node list shows every node your radio has heard, including: + +- **Node name** — user-configured long name +- **Short name** — 4-character identifier +- **Signal quality** — last heard signal strength +- **Last heard** — time since last communication +- **Distance** — estimated distance (if positions are shared) +- **Battery** — remote node battery level (if telemetry is enabled) + +### Node Status Indicators + +| Badge | Meaning | +| ---------- | ------------------------------------- | +| 🟢 Online | Node heard within the last 15 minutes | +| 🟡 Away | Node heard within the last 2 hours | +| 🔴 Offline | Node not heard for over 2 hours | +| ⭐ Favorite | Node marked as favorite by the user | + +### Node Roles + +Nodes can be configured with different roles that affect their mesh behavior: + +| Role | Cur síos | +| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Client | Standard end-user device | +| Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | +| Client Mute | Receives but doesn't retransmit | +| Client Hidden | Like Client Mute, plus hides from node list | +| Router | Prioritizes message forwarding; stays awake to relay | +| Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | +| ~~Router Client~~ | ⚠️ **Deprecated** (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | +| ~~Repeater~~ | ⚠️ **Deprecated** (removed in firmware 2.7.11) — no longer selectable; use Router instead | +| Tracker | Optimized for position reporting at regular intervals | +| Sensor | Optimized for telemetry reporting | +| TAK | Interoperates with TAK systems (sends/receives CoT) | +| TAK Tracker | TAK position reporting only | +| Lost & Found | Continuous position beacon for recovery | + +### Choosing a Role + +Most users should keep the default **Client** role. Consider a different role when: + +- **Router** — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don't use Router on battery-powered handheld devices. +- **Router Late** — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. +- **Client Base** — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. +- **Client Mute** — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only devices or to reduce congestion in dense areas. +- **Tracker** — An unattended device whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. +- **Sensor** — An unattended device reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. +- **TAK / TAK Tracker** — Only needed if interoperating with ATAK/WinTAK systems. See [TAK Integration](tak) for details. + +> 💡 **Tip:** The mesh works best when most nodes are **Client** or **Router**. Too many Mute nodes reduces mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. + +### Encryption Indicators + +Nodes display encryption status icons next to their name: + +| Icon | Meaning | +| ----------- | ------------------------------------------------------------------------------------------------------------------- | +| 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | +| 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | +| ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) | + +> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. + +## Quick Actions + +From the node list, you can: + +- **Tap** a node to view its detail page +- **Long-press** for quick actions: + - Send a direct message + - View on map + - Iarr an suíomh + - Mark as favorite + - Céim rianadóireachta + +## Filtering & Sorting + +### Text Search + +Type in the search field to filter nodes by name or short name. The filter updates in real time as you type. + +### Filter Toggles + +| Scagaire | Cur síos | +| -------------------------- | ---------------------------------------------------------------------------------------------- | +| **Only online** | Show only nodes heard within the last 15 minutes | +| **Only direct** | Show only nodes with direct (non-relayed) connections | +| **Include unknown** | Show nodes that haven't sent user info yet | +| **Exclude infrastructure** | Hide infrastructure-role nodes (Router, Repeater, Router Late, Client Base) | +| **Exclude MQTT** | Hide nodes heard only via MQTT internet bridge | +| **Show ignored** | Show nodes you've previously dismissed or muted | + +### Sort Options + +| Sort | Cur síos | +| ------------------------------------------- | ------------------------------------------------------------------ | +| **Last heard** (default) | Most recently heard nodes first | +| **Alphabetical** | Sorted by node long name | +| **Distance** | Nearest nodes first (requires position sharing) | +| **Hops away** | Fewest relay hops first | +| **Channel** | Grouped by channel index | +| **Via MQTT** | Grouped by MQTT vs. radio-heard | +| **Favorites** | Favorited nodes first | + +## Node Detail + +Tapping a node opens the detail view with comprehensive information. See [Node Metrics](node-metrics) for full details on metrics and telemetry. + +![Node detail view](/assets/screenshots/nodes_node_list.png) + +The detail screen includes device info, position, and action buttons: + +![Node detail section](/assets/screenshots/nodes_detail_section.png) + +Inline status indicators show key metrics at a glance: + +| Indicator | Screenshot | +| ----------------- | -------------------------------------------------------- | +| Signal quality | ![Signal](/assets/screenshots/nodes_signal_info.png) | +| Battery level | ![Battery](/assets/screenshots/nodes_battery_info.png) | +| Hop count | ![Hops](/assets/screenshots/nodes_hops_info.png) | +| Deiridh chluinmhu | ![Last heard](/assets/screenshots/nodes_last_heard.png) | +| Sáth | ![Distance](/assets/screenshots/nodes_distance_info.png) | + +## Related Topics + +- [Node Metrics](node-metrics) — detailed telemetry dashboards for each node +- [Messages & Channels](messages-and-channels) — send a direct message to a node +- [Map & Waypoints](map-and-waypoints) — view node positions geographically +- [Discovery](discovery) — traceroute and neighbor info for topology exploration +- [Signal Meter](signal-meter) — understand what the signal bars mean + +--- + diff --git a/docs/ga-rIE/user/onboarding.md b/docs/ga-rIE/user/onboarding.md new file mode 100644 index 000000000..3b910534e --- /dev/null +++ b/docs/ga-rIE/user/onboarding.md @@ -0,0 +1,99 @@ +--- +title: Getting Started +nav_order: 1 +last_updated: 2026-05-13 +description: First-launch setup — permissions, onboarding flow, and next steps after connecting your radio. +aliases: + - first-launch + - setup + - intro +--- + +# Getting Started + +Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app. + +## First Launch + +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. + +### Welcome Screen + +The welcome screen introduces Meshtastic and its core capabilities: + +- Off-grid mesh communication +- No cellular or internet required +- End-to-end encrypted messaging + +Tap **Get Started** to proceed through the setup flow. + +![Welcome screen](/assets/screenshots/onboarding_welcome.png) + +## Permissions + +The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. + +### Bluetooth Permission + +Bluetooth is the primary connection method between your phone and Meshtastic radio: + +- **Bluetooth scanning** — discover nearby Meshtastic radios +- **Bluetooth connect** — establish and maintain connections with paired radios + +Grant both permissions when prompted. Without Bluetooth, you'll need to use USB or TCP connections instead. + +### Location Permission + +> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. + +Meshtastic also uses your location for: + +- Showing your position on the mesh map +- Calculating distances to other nodes +- Sharing your GPS coordinates with other mesh members (if enabled) + +Grant **"While using the app"** or **"Always"** depending on your preference: + +- **While using the app** — position updates only when the app is open +- **Always** — enables background position updates for always-on mesh presence + +If denied, Bluetooth scanning will not function and your node will not report a position. + +### Notifications Permission + +Notifications alert you to: + +- Incoming messages from channels and direct messages +- Connection status changes (connected, disconnected, reconnecting) +- Firmware update availability + +> 💡 **Tip:** You can fine-tune notification preferences later in Android system settings. The app creates separate notification channels for messages, connection events, and background service status. + +### Critical Alerts Permission + +On supported devices, the app may request permission for critical alerts: + +- These are high-priority notifications that can break through Do Not Disturb mode +- Useful for emergency mesh alerts or urgent messages +- You can **skip** this step if you don't need breakthrough notifications +- Configure or revoke later in Android notification settings + +## After Setup + +Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. + +> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. + +## What's Next? + +Once connected to a radio, explore: + +- [Connections](connections) — pair your first radio device +- [Messages & Channels](messages-and-channels) — send your first message +- [Nodes](nodes) — see who's on your mesh +- [Map & Waypoints](map-and-waypoints) — view node positions +- [Settings](settings-radio-user) — configure your radio and user profile + +New to Meshtastic? The [getting started guide](https://meshtastic.org/docs/getting-started) on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup. + +--- diff --git a/docs/ga-rIE/user/settings-module-admin.md b/docs/ga-rIE/user/settings-module-admin.md new file mode 100644 index 000000000..a6daa30df --- /dev/null +++ b/docs/ga-rIE/user/settings-module-admin.md @@ -0,0 +1,246 @@ +--- +title: Settings — Modules & Admin +nav_order: 8 +last_updated: 2026-05-13 +description: Configure optional feature modules (MQTT, telemetry, canned messages, TAK, and more) and perform device administration. +aliases: + - modules + - module-config + - administration +--- + +# Settings — Modules & Admin + +Configure optional feature modules and perform device administration. Modules extend Meshtastic with specialized capabilities — each can be independently enabled or disabled. + +> 💡 **Tip:** You only need to enable the modules you actually use. Disabling unused modules reduces airtime, saves battery, and simplifies your configuration. + +Module settings use a card-based layout with toggle switches, dropdowns, text fields, and sliders: + +![Toggle switch](/assets/screenshots/settings_switch.png) + +![Dropdown selector](/assets/screenshots/settings_dropdown.png) + +![Text field](/assets/screenshots/settings_text_field.png) + +![Settings card layout](/assets/screenshots/settings_titled_card.png) + +## Module Configuration + +### MQTT Module + +Bridges mesh messages to and from an MQTT broker for internet connectivity. This is how you extend your mesh beyond radio range or integrate with home automation systems. + +| Setting | Cur síos | +| --------------- | ------------------------------------------------------------------------ | +| Enabled | Toggle MQTT bridge | +| Server | MQTT broker address | +| Username | Authentication username | +| Password | Authentication password | +| Encryption | Encrypt MQTT payloads | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON support removed from firmware; field is ignored | +| TLS | Use secure connection | +| Root Topic | Base MQTT topic path | +| Map Report | Publish position for public map | + +See [MQTT](mqtt) for a detailed usage guide including encryption, privacy, and broker setup. + +### Serial Module + +Enables serial port communication for external device integrations (GPS modules, sensors, or custom hardware). When enabled, the node's serial port can send and receive protobuf or text data, allowing external microcontrollers or computers to interact with the mesh. + +| Setting | Cur síos | +| ---------- | ------------------------------- | +| Enabled | Activate serial communication | +| Echo | Echo received serial data back | +| Mode | Text, Protobuf, or NMEA output | +| RX/TX Pins | GPIO pins for serial connection | +| Baud Rate | Serial communication speed | + +### External Notification Module + +Controls buzzer, LED, or vibration alerts on your radio hardware. Useful for devices that need to physically signal when a message arrives — particularly helpful for unattended or outdoor installations. + +| Setting | Cur síos | +| -------------------------------- | --------------------------- | +| Enabled | Activate notifications | +| Alert Message | Notify on incoming messages | +| Alert Message Buzzer | Use buzzer for messages | +| Alert Message Vibra | Use vibration for messages | +| Alert Bell | Notify on bell character | +| Output (GPIO) | Pin for notification output | +| Active | High or Low active | +| Duration (ms) | Notification length | +| Use I2S as Buzzer | Use I2S audio output | + +### Store & Forward Module + +Buffers messages for nodes that were temporarily offline, then replays them when those nodes reconnect. Essential for meshes where nodes go in and out of range regularly — ensures messages aren't lost during brief disconnections. + +| Setting | Cur síos | +| ------------------------------------------ | -------------------------- | +| Enabled | Activate store and forward | +| Heartbeat (s) | Announcement interval | +| Records | Maximum stored messages | +| History Return (max) | Max messages to replay | +| History Return (window) | Time window for replay | + +> 💡 **Tip:** Store and Forward works best on nodes with ample memory (ESP32 with PSRAM). Router nodes are ideal candidates since they're typically always-on. + +### Range Test Module + +Automated range testing tool for evaluating link quality between nodes. When enabled, the node periodically transmits test messages with incrementing counters. A receiver node logs these messages, allowing you to walk or drive away and later analyze at what distance messages stopped arriving. + +| Setting | Cur síos | +| -------------------------------------- | --------------------------------- | +| Enabled | Activate range testing | +| Sender Interval (s) | Time between test transmissions | +| Save CSV | Log received test data to SD card | + +### Telemetry Module + +Controls what telemetry data your node shares with the mesh. Telemetry includes device health (battery, uptime) and environmental sensor data (temperature, humidity, pressure). + +| Setting | Cur síos | +| ---------------------------- | --------------------------------------- | +| Device Metrics Interval | How often to report device metrics | +| Environment Metrics Interval | How often to report environment sensors | +| Air Quality Enabled | Report particulate sensor data | +| Power Metrics Enabled | Report power usage | + +See [Telemetry & Sensors](telemetry-and-sensors) for supported sensors and configuration recommendations. + +### Canned Message Module + +Pre-configured messages accessible from the device's physical buttons (for radios with rotary encoders, keypads, or similar input hardware). Define a list of quick-send messages that can be transmitted without a phone connected — ideal for field use. + +| Setting | Cur síos | +| ------------------ | ----------------------------------------------------------- | +| ~~Enabled~~ | ⚠️ **Deprecated** — current firmware may ignore this toggle | +| Messages | Newline-separated list of messages | +| Send Bell | Play bell sound on send | +| Rotary Encoder | Enable rotary encoder input | +| Up/Down/Press Pins | GPIO pin assignments for input | + +### Audio Module + +Codec2 audio support for low-bandwidth voice communication over the mesh. This is an **experimental** feature that encodes voice into very small data packets using the Codec2 codec. + +| Setting | Cur síos | +| --------------- | -------------------------------- | +| Enabled | Activate audio module | +| Codec2 Rate | Audio quality/bandwidth tradeoff | +| I2S Word Select | GPIO pin for I2S WS | +| I2S Data In | GPIO pin for I2S DIN | +| I2S Data Out | GPIO pin for I2S DOUT | + +> ⚠️ **Note:** Audio requires specific hardware (I2S microphone and speaker). Voice quality is very low-bandwidth — think "understandable radio voice," not phone-call quality. + +### Remote Hardware Module + +GPIO control over the mesh network. Allows a remote node to read or write GPIO pins on another node — useful for activating relays, reading switches, or controlling external hardware from a distance. + +| Setting | Cur síos | +| -------------------- | --------------------------------------------------------------- | +| Enabled | Activate remote GPIO access | +| Allow Undefined Pins | Allow access to any GPIO pin (security risk) | + +> ⚠️ **Warning:** Enabling "Allow Undefined Pins" gives remote nodes access to all GPIO pins, which could interfere with the radio's own hardware. Only enable on dedicated GPIO nodes. + +### Neighbor Info Module + +Broadcasts information about directly heard neighbors, enabling mesh topology mapping. Each enabled node periodically shares a list of the other nodes it can hear and their signal quality. + +| Setting | Cur síos | +| -------------------------------------- | ------------------------------------ | +| Enabled | Activate neighbor broadcasting | +| Update Interval (s) | How often to broadcast neighbor list | + +See [Discovery](discovery) for how to use neighbor data for mesh topology exploration. + +### Ambient Lighting Module + +Controls onboard NeoPixel or other addressable RGB LEDs on supported hardware. Can be used for visual status indicators, notification lights, or decorative effects. + +| Setting | Cur síos | +| ------------------ | ---------------------------------------------------------- | +| Enabled | Activate LED control | +| LED State | On, Off, or set specific color | +| Red / Green / Blue | Individual color channel values (0–255) | + +### Detection Sensor Module + +Turns your node into a motion or door sensor alert system. When a GPIO pin detects a state change (motion detected, door opened), the node broadcasts an alert message over the mesh. + +| Setting | Cur síos | +| ---------------------------------------- | ----------------------------------------------------------------------- | +| Enabled | Activate detection sensor | +| Monitor Pin | GPIO pin connected to sensor | +| Detection Triggered High | Trigger when pin goes high (vs. low) | +| Minimum Broadcast (s) | Minimum time between alert broadcasts | +| State Broadcast (s) | Periodic state broadcast interval | +| Send Bell | Include bell character in alerts | +| Friendly Name | Custom name for this sensor | + +### Paxcounter Module + +People counter using WiFi and BLE probe requests. Counts nearby devices by passively listening for probe requests that phones and laptops emit when scanning for networks. Available only on ESP32 devices. + +| Setting | Cur síos | +| -------------------------------------- | -------------------------- | +| Enabled | Activate people counting | +| Update Interval (s) | How often to report counts | + +> 💡 **Tip:** Paxcounter is useful for estimating foot traffic at trailheads, event venues, or other locations. Counts are approximate — one person may carry multiple devices. + +### TAK Module + +Team Awareness Kit integration for interoperability with ATAK and WinTAK. See [TAK Integration](tak) for detailed setup and usage. + +## Rialachas + +### Rialú iargúlta + +Remotely configure nodes that share your admin key: + +1. Select the target node in the node list. +2. Navigate to **Settings** for that node. +3. Modify configuration. +4. Tap **Save** — changes are sent over the mesh. + +> ⚠️ **Requires:** Admin key configured on both your node and the target node. + +### Clean Node Database + +Removes stale nodes from your local database that haven't been heard in a configurable time window. + +### Factory Reset + +Resets all settings to factory defaults. **This cannot be undone.** + +### Athmhaoinigh + +Remotely reboot a connected or administered node. + +### Painéal Laige + +View detailed diagnostic information: + +- Protocol buffers debug output +- Mesh packet log +- Connection state details + +### Troubleshooting Remote Admin + +- **"No response from target node"** — the target may be out of range, offline, or have a mismatched admin key. Verify the admin key matches on both nodes. +- **Changes not applying** — some settings require a reboot to take effect. Try the Reboot action after saving. +- **Can't see remote settings** — ensure your node has the admin key for the target node and that Admin Channel is enabled in Security Config. + +## Related Topics + +- [Settings — Radio & User](settings-radio-user) — core radio and user profile settings +- [Module configuration reference](https://meshtastic.org/docs/configuration/module) — detailed module docs on meshtastic.org +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/ga-rIE/user/settings-radio-user.md b/docs/ga-rIE/user/settings-radio-user.md new file mode 100644 index 000000000..34c15a118 --- /dev/null +++ b/docs/ga-rIE/user/settings-radio-user.md @@ -0,0 +1,173 @@ +--- +title: Settings — Radio & User +nav_order: 7 +last_updated: 2026-05-13 +description: Configure your radio hardware, LoRa presets, user profile, position sharing, power management, and security. +aliases: + - settings + - radio-config + - user-config + - lora +--- + +# Settings — Radio & User + +Configure your radio hardware and user identity parameters. + +## User Settings + +### User Profile + +| Setting | Cur síos | +| ----------------- | ------------------------------------------------------------------------------------- | +| Long Name | Your display name (up to 39 characters) | +| Short Name | 4-character abbreviated name | +| Licensed Operator | Enable if you hold an amateur radio license (enables higher power) | + +### Applying Changes + +After modifying settings, tap **Save** to write the configuration to your radio. The device may reboot to apply changes. + +## Radio Configuration + +### Device Config + +| Setting | Cur síos | Default | +| ------------------------------------------ | ----------------------------------------------------------------------- | -------- | +| Role | Node behavior (Client, Router, etc.) | Client | +| Rebroadcast Mode | How the node retransmits messages | All | +| Node Info Broadcast (s) | Interval for broadcasting node info | 10800 | +| Double-tap Button | Action for double-tap button press | Disabled | + +### LoRa Config + +| Setting | Cur síos | Default | +| ----------------- | ----------------------------------------------------------------------- | ----------------------------------------- | +| Réigiún | Regulatory region for frequency bands | Unset (must configure) | +| Modem Preset | Speed/range tradeoff | LongFast | +| Hop Limit | Maximum retransmit hops | 3 | +| TX Power | Transmission power (dBm); 0 = max allowed for region | 0 (region max) | +| Frequency Offset | Fine-tune frequency (MHz) | 0 | +| Channel Bandwidth | Bandwidth setting | Default for preset | + +> ⚠️ **Important:** You **must** set your region before transmitting. Operating without the correct region may violate local radio regulations. See the [region configuration guide](https://meshtastic.org/docs/getting-started/initial-config) on meshtastic.org for details. + +### Modem Presets + +| Preset | Range | Speed | SNR Limit | Best For | +| ------------------ | ----------------------- | ------------------------- | ------------------------ | -------------------------------------------------------------------------------------------------------- | +| Short Turbo | ~1 km | 21.9 kbps | −5 dB | Dense urban with line-of-sight; data-heavy applications | +| Short Fast | ~3 km | 10.9 kbps | −7.5 dB | Urban neighborhoods; buildings within a few blocks | +| Short Slow | ~5 km | 5.5 kbps | −10 dB | Suburban short-range; moderate building density | +| Medium Fast | ~5 km | 5.5 kbps | −10 dB | Suburban areas; moderate building density | +| Medium Slow | ~8 km | 1.1 kbps | −12.5 dB | Suburban/rural; moderate range with slower speed | +| Long Turbo | ~10 km | 4.4 kbps | −10 dB | Similar range to Long Fast but with 500 kHz bandwidth; faster throughput | +| Long Fast | ~10 km | 1.1 kbps | −12.5 dB | **General use (default)** — balanced range and speed | +| Long Moderate | ~20 km | 0.34 kbps | −15 dB | Rural with some terrain; occasional use | +| Lite Fast | ~5 km | 5.5 kbps | −10 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Medium Fast | +| Lite Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Long Fast | +| Narrow Fast | ~5 km | 2.7 kbps | −10 dB | EU 868 MHz band (62.5 kHz BW); avoids interference with other devices | +| Narrow Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 868 MHz band (62.5 kHz BW); comparable to Long Fast | +| ~~Long Slow~~ | ~30 km | 0.18 kbps | −17.5 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | +| ~~Very Long Slow~~ | ~40+ km | 0.09 kbps | −20 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | + +#### Choosing a Modem Preset + +The modem preset controls the fundamental tradeoff between **range** and **data rate**: + +- **Slower presets** use more spreading, making signals decodable at weaker signal levels (lower SNR limit). This means longer range but fewer bytes per second. +- **Faster presets** pack more data per transmission but require a stronger signal to decode. + +**Practical guidance:** + +- **Urban mesh (many nodes, short distances):** Use **Long Fast** (default) or **Short Fast**. Higher speed means less airtime congestion when many nodes share the channel. +- **Rural/sparse mesh (few nodes, long distances):** Use **Long Moderate**. Range matters more than speed when nodes are far apart. +- **EU 866/868 MHz regulatory compliance:** Use **Lite Fast**, **Lite Slow**, **Narrow Fast**, or **Narrow Slow** — these are optimized for the EU SRD/868 MHz bands with narrower bandwidths. +- **Fixed infrastructure links:** Use **Short Turbo** or **Long Turbo** for dedicated point-to-point links with good antennas and line-of-sight. +- **Mixed environments:** Stick with **Long Fast** — it's the community default and ensures compatibility with others in your area. + +> ⚠️ **Important:** All nodes on the same channel **must** use the same modem preset. Nodes with mismatched presets cannot communicate even if they share the same frequency and encryption key. + +> 💡 **Tip:** The range estimates above assume flat terrain and modest antennas. Elevation advantage (hilltop, rooftop) dramatically increases effective range. A well-placed Router with Long Fast can often outperform a ground-level node with Long Slow. + +### Display Config + +| Setting | Cur síos | +| ------------------- | ------------------------------------------------------------------------------------ | +| Screen Timeout | Time before display sleeps | +| Display Units | Metric or Imperial | +| OLED Type | Auto, SSD1306, SH1106, SH1107 | +| Compass Orientation | Rotation offset for compass display (0°, 90°, 180°, 270°) | +| ~~Compass North~~ | ⚠️ **Deprecated** — replaced by Compass Orientation; still visible in older firmware | + +### Position Config + +| Setting | Cur síos | +| ----------------------------------------- | ---------------------------------- | +| GPS Enabled | Enable/disable GPS | +| GPS Update Interval | How often to acquire GPS fix | +| Position Broadcast (s) | How often to share position | +| Smart Position | Enable movement-based broadcasting | +| Fixed Position | Use a manually set position | + +### Power Config + +| Setting | Cur síos | +| --------------------------------------- | --------------------------------------- | +| Power Saving | Enable low-power sleep mode | +| Shutdown After (s) | Auto-shutdown idle timer | +| ADC Multiplier | Battery voltage calibration factor | +| Wait Bluetooth (s) | Time to wait for BLE connection at boot | +| Mesh SDS Timeout (s) | Super-deep-sleep timeout | + +### Network Config + +| Setting | Cur síos | +| ------------- | ---------------------------------------------------- | +| WiFi Enabled | Enable WiFi radio (ESP32 devices) | +| WiFi SSID | Network name to connect to | +| WiFi PSK | Network password | +| NTP Server | Time synchronization server | +| Syslog Server | Remote logging server | + +![IP address field](/assets/screenshots/settings_ipv4_field.png) + +### Bluetooth Config + +| Setting | Cur síos | +| ----------------- | ------------------------------------------------------------------------- | +| Bluetooth Enabled | Enable/disable BLE radio | +| Pairing Mode | Fixed PIN, Random PIN, or No PIN | +| Fixed PIN | PIN code for pairing (default: 123456) | + +### Security Config + +| Setting | Cur síos | +| --------------------- | -------------------------------------------------------------------------- | +| Public Key | Your node's public key (read-only) | +| Admin Key | Key for remote administration | +| Private Key | Your node's private key (handle securely) | +| Admin Channel Enabled | Allow admin commands via channel | +| Debug Log | Output live debug logging over serial/bluetooth | +| Serial Enabled | Enable serial console access (moved from Device Config) | +| Managed Mode | Restrict non-admin channel changes | + +![Password field](/assets/screenshots/settings_password_field.png) + +Settings use standard preference controls — dropdowns, toggles, and sliders: + +| Control | Screenshot | +| -------- | ------------------------------------------------------ | +| Dropdown | ![Dropdown](/assets/screenshots/settings_dropdown.png) | +| Toggle | ![Toggle](/assets/screenshots/settings_switch.png) | +| Slider | ![Slider](/assets/screenshots/settings_slider.png) | + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — optional feature modules and device administration +- [Signal Meter](signal-meter) — how modem presets affect signal quality thresholds +- [LoRa configuration](https://meshtastic.org/docs/configuration/radio/lora) — detailed LoRa settings reference on meshtastic.org +- [Initial configuration](https://meshtastic.org/docs/getting-started/initial-config) — region setup guide on meshtastic.org + +--- + diff --git a/docs/ga-rIE/user/signal-meter.md b/docs/ga-rIE/user/signal-meter.md new file mode 100644 index 000000000..5ecbac53c --- /dev/null +++ b/docs/ga-rIE/user/signal-meter.md @@ -0,0 +1,81 @@ +--- +title: How the Meshtastic Signal Meter Works +nav_order: 15 +last_updated: 2026-05-13 +description: How the signal meter calculates quality from RSSI and SNR — LoRa spread spectrum, presets, and what the bars really mean. +aliases: + - signal + - signal-meter + - snr + - rssi +--- + +# How the Meshtastic Signal Meter Works + +The Meshtastic signal meter — the familiar bars or status color in the app — is calculated very differently than the "bars" on a traditional cell phone or Wi-Fi router. + +Most consumer devices simply measure how "loud" a signal is. However, because Meshtastic uses **LoRa (Long Range)** technology, its signal meter measures how **clear** the signal is, relative to the specific settings your mesh is using. + +--- + +## 1. The Two Metrics: "Loudness" vs. "Clarity" + +Every time the LoRa radio chip receives a message, it reports two measurements: + +- **RSSI (Received Signal Strength Indicator):** The **loudness** of the raw power hitting your antenna. +- **SNR (Signal-to-Noise Ratio):** The **clarity** of the signal compared to the background static. + +> **Tip — The Analogy:** Imagine you are trying to hear a friend talking to you. +> +> - **RSSI** is how loud their voice is. +> - **The Noise Floor** is the background noise in the room (air conditioning, other people talking, traffic). +> - **SNR** is how easily you can distinguish your friend's voice from the background noise. + +If your friend shouts at you at a deafening rock concert, the signal is incredibly loud (High RSSI), but you still can't understand them because the background noise is louder (Bad SNR). Conversely, if your friend whispers to you in a dead-silent library, the signal is very weak (Low RSSI), but you can understand them perfectly (Great SNR). + +--- + +## 2. The Magic of LoRa: Hearing "Below the Noise Floor" + +For standard radios (like FM or Wi-Fi), if the background noise is louder than the signal (a negative SNR), the receiver just hears static. + +LoRa is special. It uses **"Spread Spectrum"** modulation, which allows the radio to mathematically pull a signal out of the air even when it is buried deep _underneath_ the background noise. This is why you will frequently see **negative SNR numbers** in Meshtastic (e.g., -10 dB, which means the signal is 10 decibels weaker than the background static). + +Depending on which Meshtastic preset you are using (e.g., `LongFast` vs. `ShortFast`), the radio has a specific **SNR Limit** — the absolute maximum amount of noise it can tolerate before the message is completely lost to the static. + +--- + +## 3. How the Signal Meter Calculates Quality + +The Meshtastic apps take both RSSI and SNR and run them through a specific formula to assign your signal a quality rating (None, Bad, Fair, or Good). It specifically scales these values based on the physical limits of the radio preset you are using. + +Here is exactly how the app decides how many bars (or what color) to show you: + +| Level | Bars | Criteria | Meaning | +| ---------------- | ---- | ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | +| Maith | 3 | RSSI better than `-115 dBm` **AND** SNR better than `-7 dB` | Signal is both loud and clear — healthy connection. | +| Ceart go leor | 2 | RSSI better than `-126 dBm` with good SNR, **OR** SNR better than `-15 dB` with good RSSI | Signal getting quieter or noisier, but still decodable. | +| Go dona | 1 | Falls between Fair and None thresholds | At the edge of range or experiencing interference. | +| Ní dhéanfaidh sé | 0 | RSSI worse than `-126 dBm` **AND** SNR worse than `-15 dB` | Transmission completely buried in noise. | + +--- + +## 4. What This Means for You + +Because Meshtastic's meter acts as a **"Clarity Meter"**, it behaves differently than what most people expect: + +> **Tip — Don't panic over low RSSI:** You might see a seemingly terrible RSSI value like `-118 dBm`. On a cell phone, you would have zero bars. But if you have an SNR of `+2 dB`, Meshtastic will still show a strong signal! _The library is quiet, so the whisper is heard perfectly._ + +> **Warning — Watch out for local noise:** If you hook up a massive antenna and see a great RSSI (e.g., `-90 dBm`) but your signal meter is only showing **1 Bar (Bad)**, you have a problem. It means you have local interference — perhaps a cheap power supply, a noisy computer, or a nearby radio tower — creating so much static that it is drowning out your mesh. + +## Where Signal Information Appears + +In the app, signal data is shown in several places: + +- **Node list** — signal bars icon next to each node +- **Node detail** — SNR, RSSI, and signal quality in the device metrics section +- **Traceroute** — per-hop signal quality for each relay node +- **Signal metrics** — historical SNR and RSSI data in the metrics charts + +![Node entry showing SNR, RSSI values and colored signal bars](/assets/screenshots/nodes_signal_info.png) + diff --git a/docs/ga-rIE/user/tak.md b/docs/ga-rIE/user/tak.md new file mode 100644 index 000000000..cb7f3556e --- /dev/null +++ b/docs/ga-rIE/user/tak.md @@ -0,0 +1,126 @@ +--- +title: TAK Integration +nav_order: 10 +last_updated: 2026-05-13 +description: Interoperate with ATAK and WinTAK — CoT position sharing, TAK roles, and plugin setup. +aliases: + - tak + - atak + - team-awareness-kit +--- + +# TAK Integration + +Meshtastic integrates with the Team Awareness Kit (TAK) ecosystem, enabling interoperability between Meshtastic mesh devices and TAK applications like ATAK and WinTAK. + +## Overview + +The TAK module allows Meshtastic nodes to: + +- Share position data in TAK-compatible CoT (Cursor on Target) format +- Appear as team members on TAK map displays +- Receive TAK PLI (Position Location Information) messages + +## Setup + +### Prerequisites + +- ATAK (Android Team Awareness Kit) or WinTAK installed +- Meshtastic ATAK Plugin installed +- TAK module enabled on your Meshtastic radio + +### Configuration + +1. Navigate to **Settings → Module Config → TAK**. +2. Enable the TAK module. +3. Configure the TAK team/group settings: + +![Module toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | Cur síos | +| ------- | -------------------------- | +| Enabled | Activate TAK interop | +| Mode | TAK-compatible output mode | + +### ATAK Plugin Setup + +1. Install the Meshtastic ATAK Plugin from the plugin repository. +2. Open ATAK and enable the Meshtastic plugin. +3. The plugin bridges messages between ATAK and your mesh network. + +## TAK Roles + +Nodes configured with TAK-related roles behave differently from standard clients: + +| Role | Cur síos | +| --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **TAK** | Full TAK interoperability — sends and receives CoT data, chat messages, and PLI updates. Functions as a standard client plus TAK bridge. | +| **TAK Tracker** | Position-only TAK output — automatically broadcasts PLI at regular intervals without user interaction. Optimized for unattended position beacons (vehicles, equipment, waypoints). Does not relay chat messages. | + +> 💡 **Tip:** Use **TAK Tracker** for devices that only need to report position (e.g., a radio mounted in a vehicle). Use **TAK** for devices where users actively participate in TAK operations. + +### CoT (Cursor on Target) Format + +TAK messages use the Cursor on Target XML format — a military standard for sharing situational awareness data. Meshtastic converts its internal protobuf messages to CoT format when bridging to TAK systems, so no manual format conversion is needed. + +## TAK Identity + +When using TAK roles, your node broadcasts identity information that appears on TAK maps: + +| Setting | Cur síos | +| -------- | ---------------------------------------------------------------------------------------------------------------- | +| Team | Your team color on the TAK map (e.g., Blue, Red, Cyan, Green) | +| Role | Your operational role (Team Member, Team Lead, HQ, Medic, RTO, etc.) | +| Callsign | Your TAK callsign (defaults to your Meshtastic long name) | + +These settings appear in **Settings → Module Config → TAK** when the TAK module is enabled. + +> 💡 **Tip:** Team/role colors are the standard TAK affiliation colors. Coordinate with your TAK team to use consistent team assignments. + +## Wire Format (V1 / V2) + +Meshtastic supports two TAK wire formats: + +| Format | Compatibility | Features | +| ------------------------------- | --------------------------------------------------------------- | --------------------------------------------------------- | +| V1 (Legacy) | ATAK Plugin v1.x, older firmware | Basic CoT position sharing only | +| V2 (Current) | ATAK Plugin v2.x, firmware 2.3+ | Full CoT support including chat, routes, zstd compression | + +The app automatically selects V2 when both sides support it. No manual configuration needed — the TAK module negotiates format based on firmware capabilities. + +## Usage with ATAK + +Once configured: + +- Meshtastic nodes appear as markers on the ATAK map with callsign labels +- Chat messages can bridge between mesh and TAK networks +- Position updates flow bidirectionally between Meshtastic and TAK +- TAK Tracker nodes broadcast PLI automatically — their positions appear on ATAK maps without any ATAK-side configuration + +> ⚠️ **Note:** TAK integration requires specific node roles and module configuration. Standard client nodes don't automatically participate in TAK operations. + +## Troubleshooting + +| Problem | Cause | Solution | +| -------------------------------- | ------------------------------------- | ----------------------------------------------------------------------- | +| Node doesn't appear on ATAK map | TAK module disabled or wrong role | Verify TAK module is enabled and node role is TAK or TAK Tracker | +| Position updates are stale | GPS fix lost or interval too long | Check GPS status; reduce position broadcast interval in Position Config | +| ATAK plugin shows "disconnected" | BLE connection lost or plugin crashed | Reconnect Bluetooth in Meshtastic app, then restart ATAK plugin | +| Chat messages not bridging | V1 format doesn't support chat | Ensure both nodes run firmware 2.3+ for V2 wire format | +| CoT data not flowing | Channel mismatch | All TAK nodes must be on the same channel with matching encryption | + +## Security Considerations + +- TAK data shares your position and callsign information +- Ensure your channel encryption is configured when using TAK in sensitive environments +- The TAK module respects the same channel encryption as other Meshtastic messages + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — TAK module configuration +- [Nodes](nodes) — TAK and TAK Tracker roles in the node list +- [Map & Waypoints](map-and-waypoints) — node positions on the map +- [ATAK plugin guide](https://meshtastic.org/docs/software/integrations/atak-plugin) — detailed ATAK setup on meshtastic.org + +--- + diff --git a/docs/ga-rIE/user/telemetry-and-sensors.md b/docs/ga-rIE/user/telemetry-and-sensors.md new file mode 100644 index 000000000..08eece8ca --- /dev/null +++ b/docs/ga-rIE/user/telemetry-and-sensors.md @@ -0,0 +1,118 @@ +--- +title: Telemetry & Sensors +nav_order: 9 +last_updated: 2026-05-13 +description: Sensor data on the mesh — supported environment, air quality, and power sensors, plus configuration and viewing guides. +aliases: + - sensors + - environment + - weather + - power-metrics +--- + +# Telemetry & Sensors + +Meshtastic nodes can collect and share sensor data across the mesh network. + +## Overview + +Telemetry allows nodes equipped with sensors to broadcast environmental, power, and device health information. This data is visible on the node detail screen and can be logged over time. + +## Device Telemetry + +All Meshtastic nodes report basic device telemetry: + +| Metric | Cur síos | Typical Range | +| ------------------ | ------------------------------ | ------------------------------------------------------------------ | +| Battery Level | Charge percentage | 0–100% | +| Voltage | Battery voltage | 3.0–4.2V (LiPo) | +| Úsáid cainéil | % of airtime used locally | 0–100% | +| Air Utilization TX | % of airtime used by this node | 0–100% | +| Uptime | Seconds since last boot | Varies | + +## Environment Sensors + +Supported environmental sensors: + +### Temperature & Humidity + +| Sensor | Teocht | Laige | Pressure | Notes | +| ------- | ------ | ----- | -------- | ----------------------- | +| BME280 | ✓ | ✓ | ✓ | Recommended all-in-one | +| BME680 | ✓ | ✓ | ✓ | Adds gas resistance/IAQ | +| SHT31 | ✓ | ✓ | — | High accuracy | +| MCP9808 | ✓ | — | — | Precision temperature | +| LPS22 | — | — | ✓ | Pressure only | + +### Air Quality + +| Sensor | Metric | Notes | +| -------- | -------------------------------------------------- | -------------------------- | +| BME680 | Gas Resistance / IAQ | Volatile organic compounds | +| PMSA003I | PM1.0, PM2.5, PM10 | Particulate matter | +| SEN55 | PM, NOx, VOC, Temp, Humidity | Multi-sensor | + +### Light & UV + +| Sensor | Metric | +| -------- | -------------------------------------- | +| OPT3001 | Ambient light (lux) | +| VEML7700 | Ambient light (lux) | +| LTR390 | UV index | + +## Power Metrics + +Nodes with INA-series power sensors can report: + +| Metric | Cur síos | +| ----------- | ----------------------------------------- | +| Bus Voltage | Supply rail voltage | +| Current | Power consumption (mA) | +| Power | Calculated power (mW) | + +Useful for monitoring solar charging or battery health on remote nodes. + +## Configuring Telemetry + +1. Navigate to **Settings → Module Config → Telemetry**. +2. Set reporting intervals: + - **Device Metrics Interval** — how often to broadcast device metrics + - **Environment Metrics Interval** — how often to broadcast sensor data +3. Enable specific sensor types as needed. + +### Recommended Intervals + +| Use Case | Device (s) | Environment (s) | +| ------------------------------------------ | ----------------------------- | ---------------------------------- | +| Urban mesh (many nodes) | 3600 | 3600 | +| Rural mesh (few nodes) | 900 | 900 | +| Weather station | 900 | 300 | +| Battery conservation | 7200 | 7200 | + +> ⚠️ **Note:** Shorter intervals increase airtime usage and battery drain across the mesh. + +## Viewing Telemetry + +1. Navigate to **Nodes** and select a node. +2. Telemetry sections show on the detail screen: + - Device Metrics (always available) + - Environment Metrics (if sensors present) + - Power Metrics (if INA sensor present) +3. Historical graphs show trends over time. + +![Telemetry actions](/assets/screenshots/node-metrics_telemetric_actions.png) + +## Troubleshooting + +- **No environment data showing?** The remote node needs a physical sensor connected (e.g., BME280 on I2C). Device telemetry (battery, uptime) is always available, but environment metrics require hardware. +- **Stale readings?** Check the reporting interval — very long intervals (7200s+) mean data updates infrequently. Also verify the remote node is still online. +- **Sensor conflict on I2C bus?** Some sensors share I2C addresses. If you have multiple sensors on the same bus, check for address collisions in the radio's serial debug output. + +## Related Topics + +- [Node Metrics](node-metrics) — view telemetry data on the node detail screen +- [Settings — Modules & Admin](settings-module-admin) — telemetry module configuration +- [Units & Locale](units-and-locale) — temperature and pressure display units + +--- + diff --git a/docs/ga-rIE/user/translate.md b/docs/ga-rIE/user/translate.md new file mode 100644 index 000000000..b2ed79a34 --- /dev/null +++ b/docs/ga-rIE/user/translate.md @@ -0,0 +1,97 @@ +--- +title: Translate the App +parent: User Guide +nav_order: 17 +last_updated: 2026-05-13 +aliases: + - translate + - crowdin + - localization +--- + +# Translate the App + +Contributing translations helps make Meshtastic accessible to a wider audience. The app uses [Crowdin](https://crowdin.com/) to manage community translations for both the user interface and in-app documentation. + +--- + +## What Gets Translated + +| Resource | Source Location | Notes | +| ----------------- | ------------------------------------- | ---------------------------------------------------------------------- | +| UI strings | `composeResources/values/strings.xml` | Buttons, labels, messages, and all user-visible text | +| User Guide pages | `docs/user/*.md` | In-app documentation shown in Help & Documentation | +| Fastlane metadata | `fastlane/metadata/android/en-US/` | App Store listing title, description, and changelogs | + +> **Note — Developer Guide pages are English-only.** Code-focused documentation targeting contributors is not translated. + +--- + +## How to Contribute + +1. **Visit the Crowdin project.** Open the [Meshtastic Android Crowdin project](https://crowdin.com/project/meshtastic-android) and sign in or create a free account. +2. **Choose your language.** Select an existing language or request a new one by opening a [GitHub issue](https://github.com/meshtastic/Meshtastic-Android/issues/new). +3. **Translate strings.** Crowdin shows the English source on the left and your translation on the right. Translate each string and save. +4. **Review context.** Many strings include screenshots or context comments — check these to understand where the text appears in the app. +5. **Submit.** Approved translations are automatically merged into the next release. + +> **Tip — Keep translations short.** UI strings often appear in buttons, chips, or narrow columns. If a translation is significantly longer than the English original, consider abbreviating where the meaning stays clear. + +--- + +## Adding a New Language + +If your language is not yet listed on Crowdin: + +1. Open an issue on [GitHub](https://github.com/meshtastic/Meshtastic-Android/issues/new) requesting the new locale. +2. A maintainer will add the language to Crowdin and configure `crowdin.yml`. +3. Once added, you can begin translating immediately. + +--- + +## How Translations Are Organized + +The Android app uses **Compose Multiplatform resources** for all user-visible strings: + +``` +core/resources/src/commonMain/composeResources/ +├── values/ ← English (default) +│ └── strings.xml +├── values-de/ ← German +│ └── strings.xml +├── values-fr/ ← French +│ └── strings.xml +└── ... +``` + +In-app documentation follows a similar pattern under `docs/`: + +``` +docs/ +├── user/ ← English source (default) +│ ├── onboarding.md +│ └── ... +├── fr/user/ ← French translations +│ ├── onboarding.md +│ └── ... +└── ... +``` + +The app automatically selects the correct locale based on your device's **Language & Region** settings. + +--- + +## Translation Guidelines + +- **Do not translate** technical terms like "LoRa", "MQTT", "BLE", "TAK", "SNR", or "RSSI" — these are universal. +- **Keep placeholders intact.** Strings like `%1$s` or `%d` are filled in at runtime. Do not remove or reorder them unless the grammar of your language requires it. +- **Match tone.** The app uses a friendly, direct voice. Avoid overly formal language. +- **Test if possible.** Switch your device language and open the app to see how translations look in context. + +--- + +## Questions? + +If you have questions about a specific string's context or need help getting started, open a discussion on the [Meshtastic GitHub Discussions](https://github.com/meshtastic/Meshtastic-Android/discussions) page. + +Thank you for helping expand the reach of Meshtastic! diff --git a/docs/ga-rIE/user/units-and-locale.md b/docs/ga-rIE/user/units-and-locale.md new file mode 100644 index 000000000..ccc096398 --- /dev/null +++ b/docs/ga-rIE/user/units-and-locale.md @@ -0,0 +1,118 @@ +--- +title: Units, Measurement & Locale +parent: User Guide +nav_order: 16 +last_updated: 2026-05-12 +--- + +# Units, Measurement & Locale + +The Meshtastic app automatically displays temperatures, distances, speeds, and times in the units your device is configured to use — no settings to change inside the app. + +--- + +## How It Works + +Meshtastic radios always transmit data in **metric units** (meters, °C, km/h, hPa, etc.). When the app receives this data, it uses the `MetricFormatter` utility to convert and display values in whatever unit system your device's locale specifies. + +On Android, your measurement preferences are determined by your system **Language & Region** settings. On Desktop (JVM), the app uses the JVM's default `Locale`. + +> **Tip — You never need to toggle units inside the app.** Change your system measurement preferences and every screen in Meshtastic updates automatically — node details, telemetry charts, weather, altitude, and more. + +--- + +## Teocht + +Temperature values from environment sensors are transmitted as **°C** and displayed based on your device's temperature unit preference. + +![Environment metrics with temperature](/assets/screenshots/nodes_environment_metrics.png) + +| Your Setting | You See | +| ------------ | ------- | +| Celsius | 22°C | +| Fahrenheit | 72°F | + +This affects all temperature displays throughout the app: node environment telemetry, soil temperature, dew point, and telemetry chart axes. + +## Distance & Altitude + +Distances between nodes and GPS altitudes are transmitted as **meters** and automatically scaled and converted. + +![Distance info display](/assets/screenshots/nodes_distance_info.png) + +| Your Setting | Small Distance | Large Distance | Altitude | +| -------------------------------- | -------------- | ---------------------- | -------- | +| Metric | 350 m | 2.5 km | 1,200 m | +| Imperial (US) | 1,148 ft | 1.6 mi | 3,937 ft | + +The app uses natural scaling — short distances stay in meters or feet, while longer distances switch to kilometres or miles automatically. + +### Where these appear + +- **Node list** — distance and bearing to each node +- **Node detail** — altitude, distance from your position +- **Map** — waypoint distances, traceroute hop distances +- **Compass** — distance to selected node + +## Speed + +GPS ground speed is displayed in your locale's preferred speed unit. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Metric | 12 km/h | +| Imperial (US) | 7 mph | + +## Wind + +Wind speed and gust data from environment sensors are transmitted as **m/s** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Metric | 5 m/s | +| Imperial (US) | 11 mph | + +Wind readings appear in the **Node Detail** environment section and the **Environment Telemetry** charts. + +## Rainfall + +Rainfall measurements (1-hour and 24-hour totals) are transmitted as **mm** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ---------------------- | +| Metric | 12 mm | +| Imperial (US) | 0.5 in | + +## Units That Never Change + +Some units are international standards and are displayed the same way regardless of your locale: + +| Measurement | Unit | Why | +| -------------------------------- | ------------------------------ | ------------------------------------- | +| Barometric pressure | hPa | International meteorological standard | +| Heading / bearing | ° (degrees) | Universal navigation convention | +| Radiation | μR/hr | Standard dosimetry unit | +| GPS coordinates | decimal degrees | Universal geographic standard | +| Humidity, battery, soil moisture | % | Universal | + +## Date & Time + +All timestamps throughout the app — last heard, message times, telemetry logs, chart axes — follow your device's date and time preferences. + +| Setting | What It Controls | Example | +| ---------------- | ---------------- | ------------------------------------------------ | +| **24-Hour Time** | Clock format | 14:30 vs 2:30 PM | +| **Date Format** | Date ordering | 09/05/2026 vs 05/09/2026 | + +The app also uses **relative time** where it makes sense — for example, "5 min ago" or "2 hours ago" in the node list — which is automatically localised into your device language. + +## Changing Your Measurement System (Android) + +On Android, your measurement system (metric vs imperial) is tied to your region setting: + +1. Open **Android Settings → System → Language & Region** +2. Change your **Region** or **Measurement units** preference +3. Return to Meshtastic — values update immediately + +> **Tip — The app uses `MetricFormatter` from `core:common`.** All measurement formatting is handled by a shared KMP utility that respects your platform's locale. Developers adding new measurement displays should use `MetricFormatter` rather than hard-coding unit conversions. + diff --git a/docs/gl-rES/index.md b/docs/gl-rES/index.md new file mode 100644 index 000000000..b1195bbe1 --- /dev/null +++ b/docs/gl-rES/index.md @@ -0,0 +1,30 @@ +--- +title: Home +layout: default +nav_order: 0 +--- + +# Meshtastic Android App Documentation + +User and developer documentation for the Meshtastic Android, Desktop, and iOS applications powered by KMP (Kotlin Multiplatform). + +Use the sidebar navigation to browse the **User Guide** for app features and the **Developer Guide** for contributing to the project. + +--- + +## Quick Links + +| Guide | Descrición | +| --------------------------------------------------------------------- | -------------------------------------------------------------- | +| [Getting Started](user/onboarding) | Connect your first radio and send a message | +| [Messages & Channels](user/messages-and-channels) | Channel broadcasts, direct messages, reactions, and encryption | +| [Nodes](user/nodes) | Understanding the mesh network node list | +| [Signal Meter](user/signal-meter) | How the LoRa signal quality meter works | +| [Units & Locale](user/units-and-locale) | How temperatures, distances, and times adapt to your region | +| [Desktop App](user/desktop) | Linux, macOS, and Windows desktop usage | +| [Architecture](developer/architecture) | App architecture overview for contributors | +| [Contributing](developer/contributing) | Branch naming, PR workflow, and verification commands | + +--- + +> This documentation is served from the same markdown source that powers the in-app **Help & Documentation** browser. diff --git a/docs/gl-rES/user/connections.md b/docs/gl-rES/user/connections.md new file mode 100644 index 000000000..09ef87f8b --- /dev/null +++ b/docs/gl-rES/user/connections.md @@ -0,0 +1,125 @@ +--- +title: Connections +nav_order: 2 +last_updated: 2026-05-13 +description: Connect your phone or desktop to a Meshtastic radio via Bluetooth, USB, or TCP/IP. +aliases: + - bluetooth + - usb + - tcp + - pairing +--- + +# Connections + +Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node. + +## Bluetooth (BLE) + +Bluetooth Low Energy is the default and most common connection method on Android. + +### Pairing a Device + +1. Ensure your Meshtastic radio is powered on and in pairing mode. +2. Open the app and navigate to **Connections**. +3. Tap **Scan for Devices** — nearby Meshtastic radios will appear. +4. Select your device from the list. +5. Accept the Bluetooth pairing prompt if shown. + +![Device list item](/assets/screenshots/connections_bluetooth_scan.png) + +You can filter devices by transport type using the filter chips at the top: + +![Transport filter chips](/assets/screenshots/connections_transport_filters.png) + +> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. + +### Connection Status + +| Icon | State | Descrición | +| ---- | -------------- | ----------------------------- | +| 🟢 | Connected | Active radio link established | +| 🟡 | Connecting | Handshake in progress | +| 🔴 | Desconectado | No active connection | +| ⚪ | Not configured | No device selected | + +When connecting, a status indicator shows the current connection state: + +![Connecting status](/assets/screenshots/connections_connecting.png) + +If no devices are found, the app shows an empty state with instructions: + +![No devices found](/assets/screenshots/connections_empty_state.png) + +### Troubleshooting Bluetooth + +- **Device not found:** Toggle Bluetooth off/on, ensure location is enabled. +- **Connection drops:** Move closer to the radio; check for interference. +- **Pairing rejected:** Forget the device in Android Bluetooth settings and retry. + +## USB Serial + +USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable. + +### Setup + +1. Connect your radio via USB cable to your device. +2. The app will prompt for USB permission — tap **Allow**. +3. The connection is established automatically. + +> ⚠️ **Note:** USB connections require OTG support on Android devices. + +## TCP/IP (WiFi) + +Some Meshtastic radios support WiFi connectivity, allowing TCP-based connections. + +### Configuration + +1. Connect your radio to a WiFi network via the radio's web interface or settings. +2. In the app, go to **Connections → TCP**. +3. Enter the radio's IP address and port (default: 4403). +4. Tap **Connect**. + +![WiFi scanning for devices](/assets/screenshots/connections_wifi_scanning.png) + +When a device is found, it appears in the connection list: + +![WiFi device found](/assets/screenshots/connections_wifi_device_found.png) + +A successful connection is confirmed with a status indicator: + +![WiFi connection success](/assets/screenshots/connections_wifi_success.png) + +### When to Use TCP + +- Radio is on the same local network +- Testing with a simulated radio +- Environments where Bluetooth has interference issues + +## Reconnection Behavior + +The app reconnects to the **last selected device** on startup. You can manually switch transports from the connections screen at any time. + +To disconnect from a radio, use the disconnect button on the connections screen: + +![Disconnect from radio](/assets/screenshots/connections_disconnect.png) + +## Desktop Connections + +On Desktop (Linux/macOS/Windows), the app supports: + +- **Bluetooth (BLE)** — via the Kable library; works on macOS, Linux, and Windows +- **USB Serial** — primary wired connection method +- **TCP/IP** — for network-connected radios + +See [Desktop App](desktop) for platform-specific details and keyboard shortcuts. + +## Related Topics + +- [Getting Started](onboarding) — first-launch setup and permissions +- [Settings — Radio & User](settings-radio-user) — Bluetooth and network configuration +- [Desktop App](desktop) — desktop-specific connection details +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — full list of compatible radios on meshtastic.org + +--- + diff --git a/docs/gl-rES/user/desktop.md b/docs/gl-rES/user/desktop.md new file mode 100644 index 000000000..a688679eb --- /dev/null +++ b/docs/gl-rES/user/desktop.md @@ -0,0 +1,147 @@ +--- +title: Desktop App +nav_order: 14 +last_updated: 2026-05-13 +description: Install and use the Meshtastic Desktop app on Linux, macOS, and Windows — connections, feature parity, and keyboard shortcuts. +aliases: + - desktop + - linux + - macos + - windows + - jvm +--- + +# Desktop App + +The Meshtastic Desktop application provides the same mesh communication features on Linux, macOS, and Windows. + +## Overview + +The Desktop app shares its core codebase with the Android app through Kotlin Multiplatform (KMP). Most features work identically across platforms. + +## Installation + +### Linux + +- Download the `.deb` or `.AppImage` package from the releases page +- Or build from source using `./gradlew :desktopApp:run` + +### macOS + +- Download the `.dmg` package from releases +- Or build from source + +### Windows + +- Download the `.msi` installer from releases +- Or build from source + +## Connecting Your Radio + +### USB Serial (Primary) + +The most reliable connection method on Desktop: + +1. Connect your Meshtastic radio via USB cable. +2. The app should detect the serial port automatically. +3. If not detected, select the correct serial port from the connections menu. + +### TCP/IP + +For network-connected radios: + +1. Enter the radio's IP address and port (default: 4403). +2. Click **Connect**. + +### Bluetooth (BLE) + +Bluetooth Low Energy is supported on Desktop via the [Kable](https://github.com/JuulLabs/kable) library: + +1. Ensure your system has a Bluetooth adapter. +2. The app scans for nearby Meshtastic radios automatically. +3. Select your device from the connections screen. + +## Feature Parity + +| Feature | Android | Desktop | Notes | +| ---------------------------------------- | ------- | ------- | -------------------------- | +| Messaging | ✓ | ✓ | Full parity | +| Node List | ✓ | ✓ | Full parity | +| Map | ✓ | ✓ | Full parity | +| Settings | ✓ | ✓ | Full parity | +| Bluetooth (BLE) | ✓ | ✓ | Via Kable on desktop | +| Firmware Update OTA | ✓ | ✗ | Use web flasher | +| Notifications | ✓ | ✓ | Native OS notifications | +| Widgets | ✓ | ✗ | Android-only | +| AI Assistant (Chirpy) | ✓\* | ✗ | Google flavor Android only | + +\*Chirpy AI requires Android 14+ on Google flavor builds with supported hardware. + +## UI Differences + +The Desktop app uses the same Compose Multiplatform UI with adaptations for larger screens and desktop interaction. + +### Keyboard Shortcuts + +| Shortcut | Action | +| ------------------- | --------------------------- | +| **⌘Q** / **Ctrl+Q** | Quit the application | +| **⌘,** / **Ctrl+,** | Open Settings | +| **⌘1** / **Ctrl+1** | Switch to Conversations tab | +| **⌘2** / **Ctrl+2** | Switch to Nodes tab | +| **⌘3** / **Ctrl+3** | Switch to Map tab | +| **⌘4** / **Ctrl+4** | Switch to Connections tab | + +### Window & System Tray + +- **Window resizing** — responsive layout adapts to window dimensions +- **System tray** — minimize to system tray for background mesh operation +- **Tray menu** — right-click the tray icon to show window or quit +- **Mouse interaction** — hover states and standard desktop navigation + +### Notification Preferences + +The Desktop app provides in-app toggles for controlling which notifications are shown — messages, new nodes, and low battery alerts. Access these from **Settings → Notifications** within the app. + +## Built-in Documentation Browser + +The Desktop app includes a built-in documentation browser for quick access to help content without leaving the application. + +![Docs browser with table of contents](/assets/screenshots/docs-browser_toc.png) + +The browser supports full-text search across all documentation: + +![Searching the docs browser](/assets/screenshots/docs-browser_search.png) + +Individual doc pages render with full formatting: + +![A documentation page](/assets/screenshots/docs-browser_page.png) + +## Building from Source + +```bash +git clone https://github.com/meshtastic/Meshtastic-Android.git +cd Meshtastic-Android +git submodule update --init +./gradlew :desktopApp:run +``` + +Requirements: + +- JDK 21 +- No Android SDK required for desktop-only builds + +## Known Limitations + +- No OTA firmware updates (use web flasher) +- Some Android-specific features (widgets, specific notification channels) are unavailable +- Performance may vary on low-spec hardware running Compose Desktop +- BLE bonding is not yet supported on desktop (pairing works without bonding) + +## Related Topics + +- [Connections](connections) — connection methods overview +- [Firmware Updates](firmware) — use the [Web Flasher](https://flasher.meshtastic.org) for desktop firmware updates + +--- + diff --git a/docs/gl-rES/user/discovery.md b/docs/gl-rES/user/discovery.md new file mode 100644 index 000000000..5a0bfd9b8 --- /dev/null +++ b/docs/gl-rES/user/discovery.md @@ -0,0 +1,114 @@ +--- +title: Discovery +nav_order: 12 +last_updated: 2026-05-13 +description: Explore your mesh network — traceroute paths, neighbor maps, and node discovery tools. +aliases: + - mesh-discovery + - local-discovery + - network-scan + - traceroute + - neighbor-info +--- + +# Discovery + +Discovery tools help you understand **how** your mesh network is connected — which nodes can hear each other, what paths messages take, and where bottlenecks or weak links exist. + +> 💡 **Tip:** You don't need a dedicated "discovery mode" to start exploring your mesh. The tools below are available right now from the node list and node detail screens. + +--- + +## Traza-ruta + +Traceroute reveals the exact path a message takes from your node to any other node on the mesh. It's the single most useful tool for debugging connectivity problems. + +### Running a Traceroute + +1. Navigate to **Nodes** and tap the node you want to trace. +2. On the node detail screen, tap **Traceroute**. +3. The app sends a traceroute request and waits for the response. +4. Results display each hop in order, with signal quality at every step. + +### Reading the Results + +A traceroute result looks like this: + +``` +You → Node A (SNR: 8.5, RSSI: -95) → Node B (SNR: 5.2, RSSI: -108) → Target +``` + +Each hop represents a relay node that forwarded the message. The SNR and RSSI values at each hop tell you about the link quality on that specific segment. + +| What to look for | What it means | +| -------------------------------------------------------------------------- | --------------------------------------------------------------------------- | +| All hops show Good SNR (> 5 dB) | Healthy path — messages flow reliably | +| One hop shows Bad SNR (< 0 dB) | Weak link — this relay segment is fragile | +| Many hops (4+) | Long path — consider repositioning a node to shorten it | +| Different path on retry | Mesh is adapting — multiple routes exist (this is good!) | + +> 💡 **Tip:** Run traceroute several times over a few minutes. If the path changes, your mesh has redundant routes — a sign of a well-connected network. + +### Troubleshooting with Traceroute + +- **"No route found"** — The target node may be offline, out of range, or on a different channel. Check that both nodes share at least one channel with the same encryption key. +- **Traceroute times out** — The path may be too long (exceeds hop limit) or a relay node is congested. Try increasing the hop limit in **Settings → LoRa Config**. +- **Asymmetric paths** — A traceroute from A→B may take a different path than B→A. This is normal — radio propagation is not always symmetric. + +--- + +## Neighbor Info + +The Neighbor Info module lets each node broadcast a list of the nodes it can **directly hear** (single-hop). When multiple nodes share their neighbor lists, you can piece together a topology map of the entire mesh. + +### Enabling Neighbor Info + +1. Navigate to **Settings → Module Config → Neighbor Info**. +2. Enable the module. +3. Set the broadcast interval (default: 900 seconds / 15 minutes). + +Once enabled, your node periodically broadcasts its neighbor table. Other nodes with Neighbor Info enabled do the same. + +### Viewing Neighbor Data + +- Open any node's detail screen and look for the **Neighbors** section. +- Each neighbor entry shows the node that was directly heard and its signal quality. +- Combine neighbor data from multiple nodes to understand the full mesh topology. + +> ⚠️ **Note:** Neighbor Info increases airtime usage because every enabled node periodically broadcasts its neighbor list. On busy meshes with many nodes, consider longer broadcast intervals (3600 seconds or more) to avoid congestion. + +--- + +## Node List as a Discovery Tool + +The node list itself is a powerful discovery tool when you use its filtering and sorting features effectively. + +### Finding New Nodes + +- Sort by **Last heard** to see the most recently active nodes at the top. +- Enable **Include unknown** to see nodes that have appeared on the mesh but haven't sent user info yet — these are often newly powered-on devices. + +### Assessing Connectivity + +- Sort by **Hops away** to see which nodes are directly reachable (0 hops) versus relayed. +- Sort by **Distance** to find nearby nodes and verify they're reachable. +- Use **Exclude MQTT** to focus on nodes reachable over radio (not via internet bridge). + +### Infrastructure Audit + +- Disable **Exclude infrastructure** to see Router, Repeater, Router Late, and Client Base nodes. +- Check their signal quality and last-heard times to verify your infrastructure nodes are healthy. + +See [Nodes](nodes) for full details on filtering and sorting options. + +--- + +## Tips for Mesh Exploration + +- **Start with traceroute** — it gives you immediate, actionable information about a specific path. +- **Enable Neighbor Info on key nodes** — especially routers and repeaters, to build a picture of the backbone. +- **Check the map** — node positions on the [Map](map-and-waypoints) combined with signal data help you understand why some links are strong and others are weak. +- **Compare signal over time** — use the [Signal Meter](signal-meter) guide to interpret SNR and RSSI values correctly. + +--- + diff --git a/docs/gl-rES/user/firmware.md b/docs/gl-rES/user/firmware.md new file mode 100644 index 000000000..98352def3 --- /dev/null +++ b/docs/gl-rES/user/firmware.md @@ -0,0 +1,114 @@ +--- +title: Firmware Updates +nav_order: 13 +last_updated: 2026-05-13 +description: Update your radio firmware over Bluetooth — OTA process, version channels, pre-flight checks, and recovery. +aliases: + - firmware + - update + - ota + - flash +--- + +# Firmware Updates + +Keep your Meshtastic radio up to date with the latest firmware for new features, bug fixes, and security improvements. + +## Checking for Updates + +1. Navigate to **Settings → Firmware Update** or tap the firmware notification if shown. +2. The app checks for available firmware versions. +3. Available updates show the version number and changelog summary. + +## Update Methods + +### OTA (Over-The-Air) via Bluetooth + +The most common update method for Android users: + +1. Ensure your radio is connected via Bluetooth. +2. Navigate to the Firmware Update screen. +3. Select the desired firmware version. +4. Tap **Update** to begin the OTA process. +5. Wait for the update to complete — **do not disconnect** during the update. + +![Firmware checking for updates](/assets/screenshots/firmware_checking.png) + +> ⚠️ **Warning:** Interrupting a firmware update can brick your device. Ensure your radio has sufficient battery (>50% recommended) and maintain Bluetooth proximity during the entire process. + +![Firmware disclaimer](/assets/screenshots/firmware_disclaimer.png) + +### USB Flashing + +For recovery or when OTA is unavailable: + +- Use the [Meshtastic Web Flasher](https://flasher.meshtastic.org) +- Or the [Meshtastic CLI tool](https://meshtastic.org/docs/getting-started/flashing-firmware) on desktop + +## Version Channels + +| Canle | Descrición | +| ------ | ------------------------------------------- | +| Stable | Recommended for most users; tested releases | +| Alpha | Preview releases; may contain bugs | + +## Pre-Update Checklist + +Before updating: + +- [ ] Battery > 50% +- [ ] Stable Bluetooth connection +- [ ] Note your current settings (they may reset on major version changes) +- [ ] Check the release notes for breaking changes + +## Post-Update + +After a successful update: + +- The radio will reboot automatically +- Bluetooth connection will re-establish +- Verify your settings are intact +- Check the firmware version in **Settings → About** + +![Firmware update success](/assets/screenshots/firmware_success.png) + +## Troubleshooting + +### Update Stuck + +If the update appears frozen: + +- Wait at least 5 minutes before intervening +- If truly stuck, power-cycle the radio +- Attempt the update again + +![Firmware update error](/assets/screenshots/firmware_error.png) + +### Device Won't Boot After Update + +If your device fails to boot: + +1. Try connecting via USB to a computer +2. Use the web flasher in recovery/DFU mode +3. Flash a known-good firmware version +4. Check the Meshtastic Discord for device-specific recovery steps + +### Compatibility Warnings + +The app may show warnings when: + +- Connected radio firmware is below minimum supported version +- Major version mismatch between app and firmware +- Deprecated features need migration + +> ⚠️ **Important:** Always update the Meshtastic app before or alongside firmware updates to ensure compatibility. + +## Related Topics + +- [Connections](connections) — reconnecting after a firmware update +- [Flashing firmware guide](https://meshtastic.org/docs/getting-started/flashing-firmware) — full firmware flashing walkthrough on meshtastic.org +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — check firmware compatibility by device +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/gl-rES/user/map-and-waypoints.md b/docs/gl-rES/user/map-and-waypoints.md new file mode 100644 index 000000000..4edb3dade --- /dev/null +++ b/docs/gl-rES/user/map-and-waypoints.md @@ -0,0 +1,116 @@ +--- +title: Map & Waypoints +nav_order: 6 +last_updated: 2026-05-13 +description: View node positions on the map, create and share waypoints, and manage position sharing and privacy. +aliases: + - map + - waypoints + - gps + - location +--- + +# Map & Waypoints + +The Map screen shows the geographic positions of nodes on your mesh, along with shared waypoints. + +## Map View + +The map displays: + +- **Node positions** — colored markers for each node reporting location +- **Waypoints** — shared points of interest +- **Your position** — your current GPS location + +### Node Markers + +Node markers on the map indicate: + +| Color | Meaning | +| ------ | ---------------------------------------------- | +| Green | Online (heard recently) | +| Yellow | Away (heard within 2 hours) | +| Gray | Offline (stale position) | +| Blue | Your own node | + +### Map Controls + +- **Zoom** — pinch or use +/- buttons +- **Pan** — drag to explore +- **Center** — select the location button to center on your position +- **Node tap** — tap a node marker to view details + +The floating toolbar provides quick access to compass, layer switching, node filters, refresh, and location tracking. Tap the compass to reorient north-up, or tap the location button to center on your current position. + +![Map controls overlay](/assets/screenshots/map_controls_overlay.png) + +## Waypoints + +Waypoints are shared geographic points of interest that all mesh members can see. + +### Creating a Waypoint + +1. Long-press on the map at the desired location. +2. Enter a name and optional description. +3. Choose an icon/emoji for the waypoint. +4. Tap **Send** to share with the mesh. + +### Waypoint Properties + +| Property | Descrición | +| ---------- | ------------------------------------------------------- | +| Nome | Short identifier (max 30 characters) | +| Descrición | Optional longer description | +| Icon | Visual marker emoji on the map | +| Bloqueado | If locked, only the creator can edit or delete | +| Expiration | Optional auto-remove time | + +### Waypoint Expiration + +Waypoints can be set to expire automatically: + +- **Never** (default) — waypoint remains until manually deleted +- **Timed** — waypoint is automatically removed after the specified duration (e.g., "remove after 2 hours"). Useful for temporary markers like rally points, hazards, or meeting locations. + +Expired waypoints are automatically hidden from the map so they don't clutter the display. The expiration countdown begins when the waypoint is created, not when other nodes receive it. + +### Managing Waypoints + +- Tap a waypoint on the map to view its details and coordinates +- Edit or delete waypoints you created +- **Locked waypoints** cannot be modified or deleted by other nodes — only the original creator can change them +- Unlocked waypoints can be edited by any mesh member + +## Position Sharing + +### Enabling Position Sharing + +Your node shares its GPS position based on: + +- **Fixed interval** — broadcast position at regular intervals +- **Smart position** — broadcast when movement exceeds a threshold +- **Manual** — only share when explicitly requested + +Configure position behavior in **Settings → Position**. + +### Privacy Considerations + +> 🔒 **Privacy:** Position data is broadcast to all nodes on your channel. If you don't want your location shared, disable GPS position in settings or use a fixed/fake position. + +## Map Sources + +The app supports multiple map tile sources: + +- OpenStreetMap (default) +- Satellite imagery (where available) +- Offline tiles (download map areas for offline use) + +## Related Topics + +- [Nodes](nodes) — view and filter your node list +- [Node Metrics](node-metrics) — signal quality and position history for individual nodes +- [Discovery](discovery) — traceroute and neighbor info for understanding mesh topology +- [Units & Locale](units-and-locale) — distance and coordinate display formats + +--- + diff --git a/docs/gl-rES/user/messages-and-channels.md b/docs/gl-rES/user/messages-and-channels.md new file mode 100644 index 000000000..925f2f460 --- /dev/null +++ b/docs/gl-rES/user/messages-and-channels.md @@ -0,0 +1,159 @@ +--- +title: Messages & Channels +nav_order: 3 +last_updated: 2026-05-13 +description: Send and receive messages, manage channels, configure encryption, and use quick chat, reactions, and message actions. +aliases: + - channels + - direct-messages + - messaging + - conversations +--- + +# Messages & Channels + +Meshtastic supports two communication modes: **channel broadcasts** and **direct messages**. + +## Channels + +Channels are shared communication groups. All nodes configured with the same channel key can read and send messages on that channel. + +### Default Channel + +Every Meshtastic device comes with a default **LongFast** channel. This is an unencrypted channel used for general mesh communication. + +### Channel Security + +Channels support multiple encryption levels: + +| Icon | Security Level | Descrición | +| ---- | ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------- | +| 🔒 | PSK (256-bit AES) | Fully encrypted with a strong pre-shared key. Only nodes with the matching key can read messages. | +| 🔐 | PSK (128-bit AES) | Encrypted with a shorter key. Secure for most uses but 256-bit is preferred for sensitive data. | +| 🔓 | Default / Open | Uses the well-known default key. **Any Meshtastic device** on the same preset can read these messages. | +| ⚠️ | Insecure + Position | Open channel that also broadcasts your GPS position. Use with caution in public meshes. | + +> 🔒 **Security Tip:** 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. + +### Adding a Channel + +1. Navigate to **Settings → Channels**. +2. Tap **Add Channel** or scan a QR code. +3. Configure the channel name and encryption key. +4. Share the channel URL/QR code with others who need access. + +Tapping a channel shows its details and sharing options. + +## Direct Messages + +Direct messages (DMs) are point-to-point encrypted communications between two specific nodes. + +### Sending a Direct Message + +1. Open the **Messages** tab. +2. Select a node from your contacts list or tap a node in the node list. +3. Type your message and tap **Send**. + +### Message States + +| State | Icon | Meaning | +| --------------------------------- | ---- | ----------------------------------------------------------------------------------------------------------------- | +| Queued | ⏳ | Message waiting to be sent | +| En route | ✓ | Delivered to the radio, awaiting acknowledgment | +| Delivered | ✓✓ | Acknowledgment received from recipient | +| Received | ✓ | Message received from the mesh (incoming) | +| S&F Routing | 🔗 | Store & Forward: message being routed through an S&F node | +| S&F Confirmed | 🔗 | Store & Forward: delivery confirmed via S&F node | +| Erro | ✗ | Delivery failed after retries | + +### Delivery Errors + +When a message fails to deliver, the error indicator shows what went wrong: + +| Erro | Meaning | What to Do | +| ---------------- | ---------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| No Route | No path exists to the destination node | The recipient may be offline or out of mesh range. Try later or move closer. | +| Got NAK | The next-hop node refused to relay | The relay node may be congested. Wait and retry. | +| Timeout | No acknowledgment within retry window | The recipient may be just out of range. Try increasing hop limit or moving to a better position. | +| No Interface | No radio interface available to send | Check that your radio is connected and the channel is configured. | +| Max Retransmit | All retry attempts exhausted | The mesh path is unreliable. Try a different channel or wait for conditions to improve. | +| No Channel | The destination channel doesn't exist | Verify both nodes share the same channel configuration. | +| Too Large | Message exceeds maximum payload size | Shorten your message (max ~230 characters). | +| No Response | Node received message but didn't respond | The recipient's radio may be busy or in low-power sleep mode. | +| Duty Cycle Limit | Regional airtime limit reached | Your radio has used its allowed transmit time. Wait for the duty cycle window to reset (typically 1 hour in EU regions). | +| Bad Request | Malformed or invalid message | This usually indicates a software bug. Try restarting the app. | + +> 💡 **Tip:** 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. + +## Message Features + +### Quick Chat + +Pre-configured messages for rapid communication: + +- Access via the Quick Chat button in the message input area +- Choose from built-in phrases or custom messages +- Customize quick chat messages in **Settings → Quick Chat** +- Useful when typing is impractical (gloves, small screen, urgent) + +![Quick chat option](/assets/screenshots/messages_quick_chat.png) + +The channel list shows each channel with its latest message preview. + +### Message Bubbles + +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. + +### Reactions + +React to messages with emoji: + +- **Long-press** a message to open the actions menu +- Tap **Add Reaction** to choose an emoji +- Reactions appear below the message bubble +- Multiple users can react to the same message +- React to your own messages or others' messages + +![Emoji reaction badges displayed beneath a message](/assets/screenshots/messages_reaction.png) + +> 💡 **Tip:** Reactions are lightweight — they use minimal mesh bandwidth compared to full text messages. + +### Message Actions + +Long-press any message to access: + +- **Copy** — copy message text to clipboard +- **Reply** — quote the message in your response +- **React** — add an emoji reaction +- **Delete** — remove a message you sent (local deletion) + +### Message Priority + +Messages are queued and transmitted based on priority: + +1. Emergency/alert messages (highest) +2. Direct messages +3. Channel broadcasts (lowest) + +### Message Limits + +- **Maximum length:** 237 bytes (approximately 230 characters for ASCII text) +- **Rate limiting:** The mesh enforces airtime fairness; heavy message volume may be throttled +- **Delivery:** Messages are retried automatically if no acknowledgment is received + +## Best Practices + +- Use channels for group coordination +- Use direct messages for private person-to-person communication +- Keep messages short — mesh bandwidth is limited +- Configure encryption for sensitive communications + +## Related Topics + +- [Nodes](nodes) — tap a node to start a direct message +- [Settings — Radio & User](settings-radio-user) — configure channel encryption and presets +- [MQTT](mqtt) — bridge channel messages to the internet +- [Channel configuration](https://meshtastic.org/docs/configuration/radio/channels) — detailed channel settings on meshtastic.org + +--- + diff --git a/docs/gl-rES/user/mqtt.md b/docs/gl-rES/user/mqtt.md new file mode 100644 index 000000000..706efec5d --- /dev/null +++ b/docs/gl-rES/user/mqtt.md @@ -0,0 +1,137 @@ +--- +title: MQTT +nav_order: 11 +last_updated: 2026-05-13 +description: Bridge your mesh to the internet — MQTT broker setup, encryption layers, and map reporting. +aliases: + - mqtt + - internet-bridge + - broker +--- + +# MQTT + +MQTT bridges your Meshtastic mesh network to the internet, enabling long-range communication beyond radio range. + +## Overview + +The MQTT module connects your node to an MQTT broker, allowing: + +- Messages to reach nodes on different physical meshes via the internet +- Integration with home automation and monitoring systems +- Publishing node positions to the public Meshtastic map +- Custom data pipelines for logging and alerting + +## How It Works + +``` +[Your Node] → Radio → [Gateway Node with WiFi] → MQTT Broker → [Remote Gateway] → Radio → [Remote Node] +``` + +A gateway node with internet access (WiFi or Ethernet) publishes mesh messages to an MQTT topic. Remote gateways subscribed to the same topic inject those messages into their local mesh. + +## Configuration + +### Enabling MQTT + +1. Navigate to **Settings → Module Config → MQTT**. +2. Enable the MQTT module. +3. Configure the broker connection: + +![MQTT toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | Descrición | Default | +| --------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------- | +| Server Address | MQTT broker hostname | mqtt.meshtastic.org | +| Username | Broker authentication | meshdev | +| Password | Broker authentication | large4cats | +| Root Topic | Base topic for messages | msh | +| Encryption | Encrypt MQTT payload | Enabled | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON packet support has been removed from firmware; this field is ignored | Disabled | +| TLS | Secure connection to broker | Disabled | +| Map Reporting | Report position to public map | Disabled | + +### Default Meshtastic Broker + +The community maintains a public broker at `mqtt.meshtastic.org`. This is intended for general use and testing. + +> 🔒 **Privacy:** Messages on the public broker are readable by anyone subscribed. Always use channel encryption for private communications. + +### Private Broker + +For better privacy and control, you can run your own MQTT broker: + +- Mosquitto (lightweight, open-source) +- HiveMQ +- EMQX + +Configure your node to point to your private broker with appropriate credentials. + +## Map Reporting + +When Map Reporting is enabled, your node publishes its position to the Meshtastic community map: + +- Visible at [meshmap.net](https://meshmap.net) and similar community map services +- Only position and node info are shared +- Disable this if you don't want your location publicly visible + +## Uplink vs Downlink + +| Direction | Descrición | +| ------------ | -------------------------------- | +| **Uplink** | Messages from mesh → MQTT broker | +| **Downlink** | Messages from MQTT broker → mesh | + +Configure per-channel which directions are active to control message flow and airtime usage. + +## Message Formats + +MQTT uses protobuf message format: + +| Format | Descrición | Use case | +| ------------ | ----------------------------------- | -------------------------- | +| **Protobuf** | Binary Meshtastic protobuf encoding | Node-to-node mesh bridging | + +> ⚠️ **Note:** JSON output support was removed from firmware. The `json_enabled` setting is still visible in the app for legacy compatibility but has no effect on current firmware versions. + +## Encryption & Privacy + +Understanding the layered encryption model: + +1. **Channel encryption** happens on the mesh _before_ MQTT. If your channel has a PSK, the MQTT payload is already encrypted — the broker and any subscribers see only the ciphertext. +2. **MQTT encryption** (the module setting) adds an additional encryption layer for transit to the broker. This protects metadata and routing information. +3. **TLS** encrypts the TCP connection to the broker itself, preventing network-level eavesdropping. + +> 🔒 **Important:** The default public channel has a well-known key. Messages on the default channel sent via MQTT are effectively **unencrypted** — anyone can decode them. Always use a custom PSK for private communications. + +## Best Practices + +- Use channel-level encryption (PSK) on channels that bridge to MQTT +- Don't enable MQTT on nodes without internet access (it will buffer and waste memory) +- Use a private broker for sensitive deployments +- Be mindful of airtime when downlinking messages from busy MQTT topics — every downlinked message consumes radio airtime on your local mesh +- Consider enabling uplink-only if you only need to monitor your mesh remotely without injecting messages back + +## Troubleshooting + +### MQTT Not Connecting + +- **Check WiFi** — the gateway node must have an active internet connection (WiFi or Ethernet). MQTT does not work over the LoRa radio link itself. +- **Verify credentials** — incorrect username or password will silently fail on most brokers. Double-check for trailing spaces. +- **Firewall** — port 1883 (MQTT) or 8883 (MQTT+TLS) must be open. Some networks block non-standard ports. +- **DNS resolution** — if using a custom broker hostname, verify the node can resolve it. Try the broker's IP address directly. + +### Messages Not Bridging + +- **Check uplink/downlink settings** — if only uplink is enabled, messages flow from mesh to MQTT but not back. Enable downlink on the receiving gateway. +- **Channel mismatch** — both gateways must share the same channel with the same PSK. A mismatch means messages are encrypted with different keys and appear as garbage. +- **Topic mismatch** — ensure both gateways use the same root topic. The default `msh` works for the public broker. + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — MQTT module configuration reference +- [Messages & Channels](messages-and-channels) — channel encryption and PSK setup +- [MQTT integration guide](https://meshtastic.org/docs/software/integrations/mqtt) — detailed MQTT documentation on meshtastic.org + +--- + diff --git a/docs/gl-rES/user/node-metrics.md b/docs/gl-rES/user/node-metrics.md new file mode 100644 index 000000000..02f434faa --- /dev/null +++ b/docs/gl-rES/user/node-metrics.md @@ -0,0 +1,130 @@ +--- +title: Node Metrics +nav_order: 5 +last_updated: 2026-05-13 +description: Telemetry dashboards for each mesh node — device health, environment sensors, signal quality, power, traceroute, and position history. +aliases: + - metrics + - telemetry + - device-metrics + - signal +--- + +# Node Metrics + +The node detail screen provides comprehensive telemetry and metrics for each node on your mesh. + +## Device Metrics + +Basic operating information reported by each node: + +| Metric | Descrición | +| ------------------- | ----------------------------------- | +| Battery Level | Current battery percentage | +| Voltage | Battery voltage reading | +| Channel Utilization | Percentage of airtime consumed | +| Airtime | Transmission time used by this node | +| Uptime | Time since last reboot | + +Device metrics are displayed as individual cards with trend sparklines showing battery level, voltage, channel utilization, airtime, and uptime over time. + +> 💡 **Tip:** Tap any metric card to expand it into a full chart with historical data points. Pinch to zoom the time axis. + +## Environment Metrics + +Environmental sensor data (requires compatible hardware): + +| Metric | Sensor Examples | +| ------------------------------------ | --------------------- | +| Temperature | BME280, BME680, SHT31 | +| Humidity | BME280, BME680, SHT31 | +| Barometric Pressure | BME280, BMP280 | +| Gas Resistance | BME680 | +| IAQ (Air Quality) | BME680 | + +Environment metrics are charted over time for easy trend analysis — temperature, humidity, and pressure each get their own line chart with the measurement unit displayed on the Y axis. + +> 💡 **Tip:** Environment metrics require a sensor connected to the remote node. Not all nodes report environmental data. See [Telemetry & Sensors](telemetry-and-sensors) for a full list of supported sensors. + +## Signal Metrics + +Radio signal quality information: + +| Metric | Descrición | +| --------- | ----------------------------------------------------------------------------- | +| SNR | Signal-to-Noise Ratio (higher is better) | +| RSSI | Received Signal Strength Indicator (closer to 0 is better) | +| Hop Count | Number of mesh hops for last message | + +### Signal Quality Reference + +| SNR Range | Quality | +| --------------------------------- | --------- | +| > 10 dB | Excellent | +| 0 to 10 dB | Good | +| -10 to 0 dB | Fair | +| < -10 dB | Poor | + +## Power Metrics + +Power management telemetry (requires INA sensor or compatible hardware): + +| Metric | Descrición | +| ----------- | ----------------------- | +| Bus Voltage | Supply voltage | +| Current | Power draw in milliamps | +| Power | Calculated wattage | + +## Traza-ruta + +Traceroute shows the path a message takes through the mesh: + +1. From the node detail screen, tap **Traceroute**. +2. The app sends a traceroute request to the target node. +3. Results show each hop with SNR/RSSI values. + +### Reading Traceroute Results + +``` +You → Node A (SNR: 8.5) → Node B (SNR: 5.2) → Target +``` + +Each hop represents a relay node that forwarded the message. + +## Position Log + +Historical position data for nodes that share their location: + +- GPS coordinates +- Altitude +- Speed (if moving) +- Timestamp for each position report + +## Neighbor Info + +Shows which nodes a given node can directly hear, useful for understanding mesh topology. + +## Viewing Metrics + +1. Navigate to **Nodes**. +2. Tap the node you want to inspect. +3. Select the metric category from the detail tabs. + +![Node detail — local device](/assets/screenshots/nodes_detail_local.png) + +The position tab shows location data for nodes that share GPS: + +![Position inline content](/assets/screenshots/nodes_position.png) + +> ⚠️ **Note:** Metrics are only available when they have been reported by the remote node. Metrics update at intervals configured on each node's telemetry settings. + +## Related Topics + +- [Nodes](nodes) — node list, filtering, and sorting +- [Telemetry & Sensors](telemetry-and-sensors) — supported sensors and configuration +- [Signal Meter](signal-meter) — how signal quality is calculated from SNR and RSSI +- [Discovery](discovery) — traceroute details and neighbor info +- [Units & Locale](units-and-locale) — temperature, distance, and speed display formats + +--- + diff --git a/docs/gl-rES/user/nodes.md b/docs/gl-rES/user/nodes.md new file mode 100644 index 000000000..7face2672 --- /dev/null +++ b/docs/gl-rES/user/nodes.md @@ -0,0 +1,152 @@ +--- +title: Nodes +nav_order: 4 +last_updated: 2026-05-13 +description: Browse, filter, and sort mesh nodes — view details, signal quality, roles, and quick actions. +aliases: + - node-list + - mesh-nodes + - peers +--- + +# Nodes + +The Nodes screen displays all devices visible on your mesh network. + +## Node List + +The node list shows every node your radio has heard, including: + +- **Node name** — user-configured long name +- **Short name** — 4-character identifier +- **Signal quality** — last heard signal strength +- **Last heard** — time since last communication +- **Distance** — estimated distance (if positions are shared) +- **Battery** — remote node battery level (if telemetry is enabled) + +### Node Status Indicators + +| Badge | Meaning | +| ---------- | ------------------------------------- | +| 🟢 Online | Node heard within the last 15 minutes | +| 🟡 Away | Node heard within the last 2 hours | +| 🔴 Offline | Node not heard for over 2 hours | +| ⭐ Favorite | Node marked as favorite by the user | + +### Node Roles + +Nodes can be configured with different roles that affect their mesh behavior: + +| Role | Descrición | +| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Cliente | Standard end-user device | +| Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | +| Client Mute | Receives but doesn't retransmit | +| Client Hidden | Like Client Mute, plus hides from node list | +| Router | Prioritizes message forwarding; stays awake to relay | +| Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | +| ~~Router Client~~ | ⚠️ **Deprecated** (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | +| ~~Repeater~~ | ⚠️ **Deprecated** (removed in firmware 2.7.11) — no longer selectable; use Router instead | +| Tracker | Optimized for position reporting at regular intervals | +| Sensor | Optimized for telemetry reporting | +| TAK | Interoperates with TAK systems (sends/receives CoT) | +| TAK Tracker | TAK position reporting only | +| Lost & Found | Continuous position beacon for recovery | + +### Choosing a Role + +Most users should keep the default **Client** role. Consider a different role when: + +- **Router** — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don't use Router on battery-powered handheld devices. +- **Router Late** — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. +- **Client Base** — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. +- **Client Mute** — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only devices or to reduce congestion in dense areas. +- **Tracker** — An unattended device whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. +- **Sensor** — An unattended device reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. +- **TAK / TAK Tracker** — Only needed if interoperating with ATAK/WinTAK systems. See [TAK Integration](tak) for details. + +> 💡 **Tip:** The mesh works best when most nodes are **Client** or **Router**. Too many Mute nodes reduces mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. + +### Encryption Indicators + +Nodes display encryption status icons next to their name: + +| Icon | Meaning | +| ----------- | ------------------------------------------------------------------------------------------------------------------- | +| 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | +| 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | +| ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) | + +> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. + +## Quick Actions + +From the node list, you can: + +- **Tap** a node to view its detail page +- **Long-press** for quick actions: + - Send a direct message + - View on map + - Solicitar posición + - Mark as favorite + - Traza-ruta + +## Filtering & Sorting + +### Text Search + +Type in the search field to filter nodes by name or short name. The filter updates in real time as you type. + +### Filter Toggles + +| Filtro | Descrición | +| -------------------------- | ---------------------------------------------------------------------------------------------- | +| **Only online** | Show only nodes heard within the last 15 minutes | +| **Only direct** | Show only nodes with direct (non-relayed) connections | +| **Include unknown** | Show nodes that haven't sent user info yet | +| **Exclude infrastructure** | Hide infrastructure-role nodes (Router, Repeater, Router Late, Client Base) | +| **Exclude MQTT** | Hide nodes heard only via MQTT internet bridge | +| **Show ignored** | Show nodes you've previously dismissed or muted | + +### Sort Options + +| Sort | Descrición | +| ------------------------------------------- | ------------------------------------------------------------------ | +| **Last heard** (default) | Most recently heard nodes first | +| **Alphabetical** | Sorted by node long name | +| **Distance** | Nearest nodes first (requires position sharing) | +| **Hops away** | Fewest relay hops first | +| **Channel** | Grouped by channel index | +| **Via MQTT** | Grouped by MQTT vs. radio-heard | +| **Favorites** | Favorited nodes first | + +## Node Detail + +Tapping a node opens the detail view with comprehensive information. See [Node Metrics](node-metrics) for full details on metrics and telemetry. + +![Node detail view](/assets/screenshots/nodes_node_list.png) + +The detail screen includes device info, position, and action buttons: + +![Node detail section](/assets/screenshots/nodes_detail_section.png) + +Inline status indicators show key metrics at a glance: + +| Indicator | Screenshot | +| -------------- | -------------------------------------------------------- | +| Signal quality | ![Signal](/assets/screenshots/nodes_signal_info.png) | +| Battery level | ![Battery](/assets/screenshots/nodes_battery_info.png) | +| Hop count | ![Hops](/assets/screenshots/nodes_hops_info.png) | +| Última escoita | ![Last heard](/assets/screenshots/nodes_last_heard.png) | +| Distancia | ![Distance](/assets/screenshots/nodes_distance_info.png) | + +## Related Topics + +- [Node Metrics](node-metrics) — detailed telemetry dashboards for each node +- [Messages & Channels](messages-and-channels) — send a direct message to a node +- [Map & Waypoints](map-and-waypoints) — view node positions geographically +- [Discovery](discovery) — traceroute and neighbor info for topology exploration +- [Signal Meter](signal-meter) — understand what the signal bars mean + +--- + diff --git a/docs/gl-rES/user/onboarding.md b/docs/gl-rES/user/onboarding.md new file mode 100644 index 000000000..3b910534e --- /dev/null +++ b/docs/gl-rES/user/onboarding.md @@ -0,0 +1,99 @@ +--- +title: Getting Started +nav_order: 1 +last_updated: 2026-05-13 +description: First-launch setup — permissions, onboarding flow, and next steps after connecting your radio. +aliases: + - first-launch + - setup + - intro +--- + +# Getting Started + +Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app. + +## First Launch + +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. + +### Welcome Screen + +The welcome screen introduces Meshtastic and its core capabilities: + +- Off-grid mesh communication +- No cellular or internet required +- End-to-end encrypted messaging + +Tap **Get Started** to proceed through the setup flow. + +![Welcome screen](/assets/screenshots/onboarding_welcome.png) + +## Permissions + +The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. + +### Bluetooth Permission + +Bluetooth is the primary connection method between your phone and Meshtastic radio: + +- **Bluetooth scanning** — discover nearby Meshtastic radios +- **Bluetooth connect** — establish and maintain connections with paired radios + +Grant both permissions when prompted. Without Bluetooth, you'll need to use USB or TCP connections instead. + +### Location Permission + +> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. + +Meshtastic also uses your location for: + +- Showing your position on the mesh map +- Calculating distances to other nodes +- Sharing your GPS coordinates with other mesh members (if enabled) + +Grant **"While using the app"** or **"Always"** depending on your preference: + +- **While using the app** — position updates only when the app is open +- **Always** — enables background position updates for always-on mesh presence + +If denied, Bluetooth scanning will not function and your node will not report a position. + +### Notifications Permission + +Notifications alert you to: + +- Incoming messages from channels and direct messages +- Connection status changes (connected, disconnected, reconnecting) +- Firmware update availability + +> 💡 **Tip:** You can fine-tune notification preferences later in Android system settings. The app creates separate notification channels for messages, connection events, and background service status. + +### Critical Alerts Permission + +On supported devices, the app may request permission for critical alerts: + +- These are high-priority notifications that can break through Do Not Disturb mode +- Useful for emergency mesh alerts or urgent messages +- You can **skip** this step if you don't need breakthrough notifications +- Configure or revoke later in Android notification settings + +## After Setup + +Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. + +> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. + +## What's Next? + +Once connected to a radio, explore: + +- [Connections](connections) — pair your first radio device +- [Messages & Channels](messages-and-channels) — send your first message +- [Nodes](nodes) — see who's on your mesh +- [Map & Waypoints](map-and-waypoints) — view node positions +- [Settings](settings-radio-user) — configure your radio and user profile + +New to Meshtastic? The [getting started guide](https://meshtastic.org/docs/getting-started) on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup. + +--- diff --git a/docs/gl-rES/user/settings-module-admin.md b/docs/gl-rES/user/settings-module-admin.md new file mode 100644 index 000000000..8db6dc95b --- /dev/null +++ b/docs/gl-rES/user/settings-module-admin.md @@ -0,0 +1,246 @@ +--- +title: Settings — Modules & Admin +nav_order: 8 +last_updated: 2026-05-13 +description: Configure optional feature modules (MQTT, telemetry, canned messages, TAK, and more) and perform device administration. +aliases: + - modules + - module-config + - administration +--- + +# Settings — Modules & Admin + +Configure optional feature modules and perform device administration. Modules extend Meshtastic with specialized capabilities — each can be independently enabled or disabled. + +> 💡 **Tip:** You only need to enable the modules you actually use. Disabling unused modules reduces airtime, saves battery, and simplifies your configuration. + +Module settings use a card-based layout with toggle switches, dropdowns, text fields, and sliders: + +![Toggle switch](/assets/screenshots/settings_switch.png) + +![Dropdown selector](/assets/screenshots/settings_dropdown.png) + +![Text field](/assets/screenshots/settings_text_field.png) + +![Settings card layout](/assets/screenshots/settings_titled_card.png) + +## Module Configuration + +### MQTT Module + +Bridges mesh messages to and from an MQTT broker for internet connectivity. This is how you extend your mesh beyond radio range or integrate with home automation systems. + +| Setting | Descrición | +| --------------- | ------------------------------------------------------------------------ | +| Enabled | Toggle MQTT bridge | +| Server | MQTT broker address | +| Username | Authentication username | +| Password | Authentication password | +| Encryption | Encrypt MQTT payloads | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON support removed from firmware; field is ignored | +| TLS | Use secure connection | +| Root Topic | Base MQTT topic path | +| Map Report | Publish position for public map | + +See [MQTT](mqtt) for a detailed usage guide including encryption, privacy, and broker setup. + +### Serial Module + +Enables serial port communication for external device integrations (GPS modules, sensors, or custom hardware). When enabled, the node's serial port can send and receive protobuf or text data, allowing external microcontrollers or computers to interact with the mesh. + +| Setting | Descrición | +| ---------- | ------------------------------- | +| Enabled | Activate serial communication | +| Echo | Echo received serial data back | +| Mode | Text, Protobuf, or NMEA output | +| RX/TX Pins | GPIO pins for serial connection | +| Baud Rate | Serial communication speed | + +### External Notification Module + +Controls buzzer, LED, or vibration alerts on your radio hardware. Useful for devices that need to physically signal when a message arrives — particularly helpful for unattended or outdoor installations. + +| Setting | Descrición | +| -------------------------------- | --------------------------- | +| Enabled | Activate notifications | +| Alert Message | Notify on incoming messages | +| Alert Message Buzzer | Use buzzer for messages | +| Alert Message Vibra | Use vibration for messages | +| Alert Bell | Notify on bell character | +| Output (GPIO) | Pin for notification output | +| Active | High or Low active | +| Duration (ms) | Notification length | +| Use I2S as Buzzer | Use I2S audio output | + +### Store & Forward Module + +Buffers messages for nodes that were temporarily offline, then replays them when those nodes reconnect. Essential for meshes where nodes go in and out of range regularly — ensures messages aren't lost during brief disconnections. + +| Setting | Descrición | +| ------------------------------------------ | -------------------------- | +| Enabled | Activate store and forward | +| Heartbeat (s) | Announcement interval | +| Records | Maximum stored messages | +| History Return (max) | Max messages to replay | +| History Return (window) | Time window for replay | + +> 💡 **Tip:** Store and Forward works best on nodes with ample memory (ESP32 with PSRAM). Router nodes are ideal candidates since they're typically always-on. + +### Range Test Module + +Automated range testing tool for evaluating link quality between nodes. When enabled, the node periodically transmits test messages with incrementing counters. A receiver node logs these messages, allowing you to walk or drive away and later analyze at what distance messages stopped arriving. + +| Setting | Descrición | +| -------------------------------------- | --------------------------------- | +| Enabled | Activate range testing | +| Sender Interval (s) | Time between test transmissions | +| Save CSV | Log received test data to SD card | + +### Telemetry Module + +Controls what telemetry data your node shares with the mesh. Telemetry includes device health (battery, uptime) and environmental sensor data (temperature, humidity, pressure). + +| Setting | Descrición | +| ---------------------------- | --------------------------------------- | +| Device Metrics Interval | How often to report device metrics | +| Environment Metrics Interval | How often to report environment sensors | +| Air Quality Enabled | Report particulate sensor data | +| Power Metrics Enabled | Report power usage | + +See [Telemetry & Sensors](telemetry-and-sensors) for supported sensors and configuration recommendations. + +### Canned Message Module + +Pre-configured messages accessible from the device's physical buttons (for radios with rotary encoders, keypads, or similar input hardware). Define a list of quick-send messages that can be transmitted without a phone connected — ideal for field use. + +| Setting | Descrición | +| ------------------ | ----------------------------------------------------------- | +| ~~Enabled~~ | ⚠️ **Deprecated** — current firmware may ignore this toggle | +| Messages | Newline-separated list of messages | +| Send Bell | Play bell sound on send | +| Rotary Encoder | Enable rotary encoder input | +| Up/Down/Press Pins | GPIO pin assignments for input | + +### Audio Module + +Codec2 audio support for low-bandwidth voice communication over the mesh. This is an **experimental** feature that encodes voice into very small data packets using the Codec2 codec. + +| Setting | Descrición | +| --------------- | -------------------------------- | +| Enabled | Activate audio module | +| Codec2 Rate | Audio quality/bandwidth tradeoff | +| I2S Word Select | GPIO pin for I2S WS | +| I2S Data In | GPIO pin for I2S DIN | +| I2S Data Out | GPIO pin for I2S DOUT | + +> ⚠️ **Note:** Audio requires specific hardware (I2S microphone and speaker). Voice quality is very low-bandwidth — think "understandable radio voice," not phone-call quality. + +### Remote Hardware Module + +GPIO control over the mesh network. Allows a remote node to read or write GPIO pins on another node — useful for activating relays, reading switches, or controlling external hardware from a distance. + +| Setting | Descrición | +| -------------------- | --------------------------------------------------------------- | +| Enabled | Activate remote GPIO access | +| Allow Undefined Pins | Allow access to any GPIO pin (security risk) | + +> ⚠️ **Warning:** Enabling "Allow Undefined Pins" gives remote nodes access to all GPIO pins, which could interfere with the radio's own hardware. Only enable on dedicated GPIO nodes. + +### Neighbor Info Module + +Broadcasts information about directly heard neighbors, enabling mesh topology mapping. Each enabled node periodically shares a list of the other nodes it can hear and their signal quality. + +| Setting | Descrición | +| -------------------------------------- | ------------------------------------ | +| Enabled | Activate neighbor broadcasting | +| Update Interval (s) | How often to broadcast neighbor list | + +See [Discovery](discovery) for how to use neighbor data for mesh topology exploration. + +### Ambient Lighting Module + +Controls onboard NeoPixel or other addressable RGB LEDs on supported hardware. Can be used for visual status indicators, notification lights, or decorative effects. + +| Setting | Descrición | +| ------------------ | ---------------------------------------------------------- | +| Enabled | Activate LED control | +| LED State | On, Off, or set specific color | +| Red / Green / Blue | Individual color channel values (0–255) | + +### Detection Sensor Module + +Turns your node into a motion or door sensor alert system. When a GPIO pin detects a state change (motion detected, door opened), the node broadcasts an alert message over the mesh. + +| Setting | Descrición | +| ---------------------------------------- | ----------------------------------------------------------------------- | +| Enabled | Activate detection sensor | +| Monitor Pin | GPIO pin connected to sensor | +| Detection Triggered High | Trigger when pin goes high (vs. low) | +| Minimum Broadcast (s) | Minimum time between alert broadcasts | +| State Broadcast (s) | Periodic state broadcast interval | +| Send Bell | Include bell character in alerts | +| Friendly Name | Custom name for this sensor | + +### Paxcounter Module + +People counter using WiFi and BLE probe requests. Counts nearby devices by passively listening for probe requests that phones and laptops emit when scanning for networks. Available only on ESP32 devices. + +| Setting | Descrición | +| -------------------------------------- | -------------------------- | +| Enabled | Activate people counting | +| Update Interval (s) | How often to report counts | + +> 💡 **Tip:** Paxcounter is useful for estimating foot traffic at trailheads, event venues, or other locations. Counts are approximate — one person may carry multiple devices. + +### TAK Module + +Team Awareness Kit integration for interoperability with ATAK and WinTAK. See [TAK Integration](tak) for detailed setup and usage. + +## Administration + +### Remote Administration + +Remotely configure nodes that share your admin key: + +1. Select the target node in the node list. +2. Navigate to **Settings** for that node. +3. Modify configuration. +4. Tap **Save** — changes are sent over the mesh. + +> ⚠️ **Requires:** Admin key configured on both your node and the target node. + +### Clean Node Database + +Removes stale nodes from your local database that haven't been heard in a configurable time window. + +### Factory Reset + +Resets all settings to factory defaults. **This cannot be undone.** + +### Reiniciar + +Remotely reboot a connected or administered node. + +### Panel de depuración + +View detailed diagnostic information: + +- Protocol buffers debug output +- Mesh packet log +- Connection state details + +### Troubleshooting Remote Admin + +- **"No response from target node"** — the target may be out of range, offline, or have a mismatched admin key. Verify the admin key matches on both nodes. +- **Changes not applying** — some settings require a reboot to take effect. Try the Reboot action after saving. +- **Can't see remote settings** — ensure your node has the admin key for the target node and that Admin Channel is enabled in Security Config. + +## Related Topics + +- [Settings — Radio & User](settings-radio-user) — core radio and user profile settings +- [Module configuration reference](https://meshtastic.org/docs/configuration/module) — detailed module docs on meshtastic.org +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/gl-rES/user/settings-radio-user.md b/docs/gl-rES/user/settings-radio-user.md new file mode 100644 index 000000000..b555f6b93 --- /dev/null +++ b/docs/gl-rES/user/settings-radio-user.md @@ -0,0 +1,173 @@ +--- +title: Settings — Radio & User +nav_order: 7 +last_updated: 2026-05-13 +description: Configure your radio hardware, LoRa presets, user profile, position sharing, power management, and security. +aliases: + - settings + - radio-config + - user-config + - lora +--- + +# Settings — Radio & User + +Configure your radio hardware and user identity parameters. + +## User Settings + +### User Profile + +| Setting | Descrición | +| ----------------- | ------------------------------------------------------------------------------------- | +| Long Name | Your display name (up to 39 characters) | +| Short Name | 4-character abbreviated name | +| Licensed Operator | Enable if you hold an amateur radio license (enables higher power) | + +### Applying Changes + +After modifying settings, tap **Save** to write the configuration to your radio. The device may reboot to apply changes. + +## Radio Configuration + +### Device Config + +| Setting | Descrición | Default | +| ------------------------------------------ | ----------------------------------------------------------------------- | -------- | +| Role | Node behavior (Client, Router, etc.) | Cliente | +| Rebroadcast Mode | How the node retransmits messages | All | +| Node Info Broadcast (s) | Interval for broadcasting node info | 10800 | +| Double-tap Button | Action for double-tap button press | Disabled | + +### LoRa Config + +| Setting | Descrición | Default | +| ----------------- | ----------------------------------------------------------------------- | ----------------------------------------- | +| Rexión | Regulatory region for frequency bands | Unset (must configure) | +| Modem Preset | Speed/range tradeoff | LongFast | +| Hop Limit | Maximum retransmit hops | 3 | +| TX Power | Transmission power (dBm); 0 = max allowed for region | 0 (region max) | +| Frequency Offset | Fine-tune frequency (MHz) | 0 | +| Channel Bandwidth | Bandwidth setting | Default for preset | + +> ⚠️ **Important:** You **must** set your region before transmitting. Operating without the correct region may violate local radio regulations. See the [region configuration guide](https://meshtastic.org/docs/getting-started/initial-config) on meshtastic.org for details. + +### Modem Presets + +| Preset | Range | Speed | SNR Limit | Best For | +| ------------------ | ----------------------- | ------------------------- | ------------------------ | -------------------------------------------------------------------------------------------------------- | +| Short Turbo | ~1 km | 21.9 kbps | −5 dB | Dense urban with line-of-sight; data-heavy applications | +| Short Fast | ~3 km | 10.9 kbps | −7.5 dB | Urban neighborhoods; buildings within a few blocks | +| Short Slow | ~5 km | 5.5 kbps | −10 dB | Suburban short-range; moderate building density | +| Medium Fast | ~5 km | 5.5 kbps | −10 dB | Suburban areas; moderate building density | +| Medium Slow | ~8 km | 1.1 kbps | −12.5 dB | Suburban/rural; moderate range with slower speed | +| Long Turbo | ~10 km | 4.4 kbps | −10 dB | Similar range to Long Fast but with 500 kHz bandwidth; faster throughput | +| Long Fast | ~10 km | 1.1 kbps | −12.5 dB | **General use (default)** — balanced range and speed | +| Long Moderate | ~20 km | 0.34 kbps | −15 dB | Rural with some terrain; occasional use | +| Lite Fast | ~5 km | 5.5 kbps | −10 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Medium Fast | +| Lite Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Long Fast | +| Narrow Fast | ~5 km | 2.7 kbps | −10 dB | EU 868 MHz band (62.5 kHz BW); avoids interference with other devices | +| Narrow Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 868 MHz band (62.5 kHz BW); comparable to Long Fast | +| ~~Long Slow~~ | ~30 km | 0.18 kbps | −17.5 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | +| ~~Very Long Slow~~ | ~40+ km | 0.09 kbps | −20 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | + +#### Choosing a Modem Preset + +The modem preset controls the fundamental tradeoff between **range** and **data rate**: + +- **Slower presets** use more spreading, making signals decodable at weaker signal levels (lower SNR limit). This means longer range but fewer bytes per second. +- **Faster presets** pack more data per transmission but require a stronger signal to decode. + +**Practical guidance:** + +- **Urban mesh (many nodes, short distances):** Use **Long Fast** (default) or **Short Fast**. Higher speed means less airtime congestion when many nodes share the channel. +- **Rural/sparse mesh (few nodes, long distances):** Use **Long Moderate**. Range matters more than speed when nodes are far apart. +- **EU 866/868 MHz regulatory compliance:** Use **Lite Fast**, **Lite Slow**, **Narrow Fast**, or **Narrow Slow** — these are optimized for the EU SRD/868 MHz bands with narrower bandwidths. +- **Fixed infrastructure links:** Use **Short Turbo** or **Long Turbo** for dedicated point-to-point links with good antennas and line-of-sight. +- **Mixed environments:** Stick with **Long Fast** — it's the community default and ensures compatibility with others in your area. + +> ⚠️ **Important:** All nodes on the same channel **must** use the same modem preset. Nodes with mismatched presets cannot communicate even if they share the same frequency and encryption key. + +> 💡 **Tip:** The range estimates above assume flat terrain and modest antennas. Elevation advantage (hilltop, rooftop) dramatically increases effective range. A well-placed Router with Long Fast can often outperform a ground-level node with Long Slow. + +### Display Config + +| Setting | Descrición | +| ------------------- | ------------------------------------------------------------------------------------ | +| Screen Timeout | Time before display sleeps | +| Display Units | Metric or Imperial | +| OLED Type | Auto, SSD1306, SH1106, SH1107 | +| Compass Orientation | Rotation offset for compass display (0°, 90°, 180°, 270°) | +| ~~Compass North~~ | ⚠️ **Deprecated** — replaced by Compass Orientation; still visible in older firmware | + +### Position Config + +| Setting | Descrición | +| ----------------------------------------- | ---------------------------------- | +| GPS Enabled | Enable/disable GPS | +| GPS Update Interval | How often to acquire GPS fix | +| Position Broadcast (s) | How often to share position | +| Smart Position | Enable movement-based broadcasting | +| Fixed Position | Use a manually set position | + +### Power Config + +| Setting | Descrición | +| --------------------------------------- | --------------------------------------- | +| Power Saving | Enable low-power sleep mode | +| Shutdown After (s) | Auto-shutdown idle timer | +| ADC Multiplier | Battery voltage calibration factor | +| Wait Bluetooth (s) | Time to wait for BLE connection at boot | +| Mesh SDS Timeout (s) | Super-deep-sleep timeout | + +### Network Config + +| Setting | Descrición | +| ------------- | ---------------------------------------------------- | +| WiFi Enabled | Enable WiFi radio (ESP32 devices) | +| WiFi SSID | Network name to connect to | +| WiFi PSK | Network password | +| NTP Server | Time synchronization server | +| Syslog Server | Remote logging server | + +![IP address field](/assets/screenshots/settings_ipv4_field.png) + +### Bluetooth Config + +| Setting | Descrición | +| ----------------- | ------------------------------------------------------------------------- | +| Bluetooth Enabled | Enable/disable BLE radio | +| Pairing Mode | Fixed PIN, Random PIN, or No PIN | +| Fixed PIN | PIN code for pairing (default: 123456) | + +### Security Config + +| Setting | Descrición | +| --------------------- | -------------------------------------------------------------------------- | +| Public Key | Your node's public key (read-only) | +| Admin Key | Key for remote administration | +| Private Key | Your node's private key (handle securely) | +| Admin Channel Enabled | Allow admin commands via channel | +| Debug Log | Output live debug logging over serial/bluetooth | +| Serial Enabled | Enable serial console access (moved from Device Config) | +| Managed Mode | Restrict non-admin channel changes | + +![Password field](/assets/screenshots/settings_password_field.png) + +Settings use standard preference controls — dropdowns, toggles, and sliders: + +| Control | Screenshot | +| -------- | ------------------------------------------------------ | +| Dropdown | ![Dropdown](/assets/screenshots/settings_dropdown.png) | +| Toggle | ![Toggle](/assets/screenshots/settings_switch.png) | +| Slider | ![Slider](/assets/screenshots/settings_slider.png) | + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — optional feature modules and device administration +- [Signal Meter](signal-meter) — how modem presets affect signal quality thresholds +- [LoRa configuration](https://meshtastic.org/docs/configuration/radio/lora) — detailed LoRa settings reference on meshtastic.org +- [Initial configuration](https://meshtastic.org/docs/getting-started/initial-config) — region setup guide on meshtastic.org + +--- + diff --git a/docs/gl-rES/user/signal-meter.md b/docs/gl-rES/user/signal-meter.md new file mode 100644 index 000000000..d34246d0e --- /dev/null +++ b/docs/gl-rES/user/signal-meter.md @@ -0,0 +1,81 @@ +--- +title: How the Meshtastic Signal Meter Works +nav_order: 15 +last_updated: 2026-05-13 +description: How the signal meter calculates quality from RSSI and SNR — LoRa spread spectrum, presets, and what the bars really mean. +aliases: + - signal + - signal-meter + - snr + - rssi +--- + +# How the Meshtastic Signal Meter Works + +The Meshtastic signal meter — the familiar bars or status color in the app — is calculated very differently than the "bars" on a traditional cell phone or Wi-Fi router. + +Most consumer devices simply measure how "loud" a signal is. However, because Meshtastic uses **LoRa (Long Range)** technology, its signal meter measures how **clear** the signal is, relative to the specific settings your mesh is using. + +--- + +## 1. The Two Metrics: "Loudness" vs. "Clarity" + +Every time the LoRa radio chip receives a message, it reports two measurements: + +- **RSSI (Received Signal Strength Indicator):** The **loudness** of the raw power hitting your antenna. +- **SNR (Signal-to-Noise Ratio):** The **clarity** of the signal compared to the background static. + +> **Tip — The Analogy:** Imagine you are trying to hear a friend talking to you. +> +> - **RSSI** is how loud their voice is. +> - **The Noise Floor** is the background noise in the room (air conditioning, other people talking, traffic). +> - **SNR** is how easily you can distinguish your friend's voice from the background noise. + +If your friend shouts at you at a deafening rock concert, the signal is incredibly loud (High RSSI), but you still can't understand them because the background noise is louder (Bad SNR). Conversely, if your friend whispers to you in a dead-silent library, the signal is very weak (Low RSSI), but you can understand them perfectly (Great SNR). + +--- + +## 2. The Magic of LoRa: Hearing "Below the Noise Floor" + +For standard radios (like FM or Wi-Fi), if the background noise is louder than the signal (a negative SNR), the receiver just hears static. + +LoRa is special. It uses **"Spread Spectrum"** modulation, which allows the radio to mathematically pull a signal out of the air even when it is buried deep _underneath_ the background noise. This is why you will frequently see **negative SNR numbers** in Meshtastic (e.g., -10 dB, which means the signal is 10 decibels weaker than the background static). + +Depending on which Meshtastic preset you are using (e.g., `LongFast` vs. `ShortFast`), the radio has a specific **SNR Limit** — the absolute maximum amount of noise it can tolerate before the message is completely lost to the static. + +--- + +## 3. How the Signal Meter Calculates Quality + +The Meshtastic apps take both RSSI and SNR and run them through a specific formula to assign your signal a quality rating (None, Bad, Fair, or Good). It specifically scales these values based on the physical limits of the radio preset you are using. + +Here is exactly how the app decides how many bars (or what color) to show you: + +| Level | Bars | Criteria | Meaning | +| ----- | ---- | ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | +| Good | 3 | RSSI better than `-115 dBm` **AND** SNR better than `-7 dB` | Signal is both loud and clear — healthy connection. | +| Fair | 2 | RSSI better than `-126 dBm` with good SNR, **OR** SNR better than `-15 dB` with good RSSI | Signal getting quieter or noisier, but still decodable. | +| Bad | 1 | Falls between Fair and None thresholds | At the edge of range or experiencing interference. | +| None | 0 | RSSI worse than `-126 dBm` **AND** SNR worse than `-15 dB` | Transmission completely buried in noise. | + +--- + +## 4. What This Means for You + +Because Meshtastic's meter acts as a **"Clarity Meter"**, it behaves differently than what most people expect: + +> **Tip — Don't panic over low RSSI:** You might see a seemingly terrible RSSI value like `-118 dBm`. On a cell phone, you would have zero bars. But if you have an SNR of `+2 dB`, Meshtastic will still show a strong signal! _The library is quiet, so the whisper is heard perfectly._ + +> **Warning — Watch out for local noise:** If you hook up a massive antenna and see a great RSSI (e.g., `-90 dBm`) but your signal meter is only showing **1 Bar (Bad)**, you have a problem. It means you have local interference — perhaps a cheap power supply, a noisy computer, or a nearby radio tower — creating so much static that it is drowning out your mesh. + +## Where Signal Information Appears + +In the app, signal data is shown in several places: + +- **Node list** — signal bars icon next to each node +- **Node detail** — SNR, RSSI, and signal quality in the device metrics section +- **Traceroute** — per-hop signal quality for each relay node +- **Signal metrics** — historical SNR and RSSI data in the metrics charts + +![Node entry showing SNR, RSSI values and colored signal bars](/assets/screenshots/nodes_signal_info.png) + diff --git a/docs/gl-rES/user/tak.md b/docs/gl-rES/user/tak.md new file mode 100644 index 000000000..1e81a2a78 --- /dev/null +++ b/docs/gl-rES/user/tak.md @@ -0,0 +1,126 @@ +--- +title: TAK Integration +nav_order: 10 +last_updated: 2026-05-13 +description: Interoperate with ATAK and WinTAK — CoT position sharing, TAK roles, and plugin setup. +aliases: + - tak + - atak + - team-awareness-kit +--- + +# TAK Integration + +Meshtastic integrates with the Team Awareness Kit (TAK) ecosystem, enabling interoperability between Meshtastic mesh devices and TAK applications like ATAK and WinTAK. + +## Overview + +The TAK module allows Meshtastic nodes to: + +- Share position data in TAK-compatible CoT (Cursor on Target) format +- Appear as team members on TAK map displays +- Receive TAK PLI (Position Location Information) messages + +## Setup + +### Prerequisites + +- ATAK (Android Team Awareness Kit) or WinTAK installed +- Meshtastic ATAK Plugin installed +- TAK module enabled on your Meshtastic radio + +### Configuration + +1. Navigate to **Settings → Module Config → TAK**. +2. Enable the TAK module. +3. Configure the TAK team/group settings: + +![Module toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | Descrición | +| ------- | -------------------------- | +| Enabled | Activate TAK interop | +| Mode | TAK-compatible output mode | + +### ATAK Plugin Setup + +1. Install the Meshtastic ATAK Plugin from the plugin repository. +2. Open ATAK and enable the Meshtastic plugin. +3. The plugin bridges messages between ATAK and your mesh network. + +## TAK Roles + +Nodes configured with TAK-related roles behave differently from standard clients: + +| Role | Descrición | +| --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **TAK** | Full TAK interoperability — sends and receives CoT data, chat messages, and PLI updates. Functions as a standard client plus TAK bridge. | +| **TAK Tracker** | Position-only TAK output — automatically broadcasts PLI at regular intervals without user interaction. Optimized for unattended position beacons (vehicles, equipment, waypoints). Does not relay chat messages. | + +> 💡 **Tip:** Use **TAK Tracker** for devices that only need to report position (e.g., a radio mounted in a vehicle). Use **TAK** for devices where users actively participate in TAK operations. + +### CoT (Cursor on Target) Format + +TAK messages use the Cursor on Target XML format — a military standard for sharing situational awareness data. Meshtastic converts its internal protobuf messages to CoT format when bridging to TAK systems, so no manual format conversion is needed. + +## TAK Identity + +When using TAK roles, your node broadcasts identity information that appears on TAK maps: + +| Setting | Descrición | +| -------- | ---------------------------------------------------------------------------------------------------------------- | +| Team | Your team color on the TAK map (e.g., Blue, Red, Cyan, Green) | +| Role | Your operational role (Team Member, Team Lead, HQ, Medic, RTO, etc.) | +| Callsign | Your TAK callsign (defaults to your Meshtastic long name) | + +These settings appear in **Settings → Module Config → TAK** when the TAK module is enabled. + +> 💡 **Tip:** Team/role colors are the standard TAK affiliation colors. Coordinate with your TAK team to use consistent team assignments. + +## Wire Format (V1 / V2) + +Meshtastic supports two TAK wire formats: + +| Format | Compatibility | Features | +| ------------------------------- | --------------------------------------------------------------- | --------------------------------------------------------- | +| V1 (Legacy) | ATAK Plugin v1.x, older firmware | Basic CoT position sharing only | +| V2 (Current) | ATAK Plugin v2.x, firmware 2.3+ | Full CoT support including chat, routes, zstd compression | + +The app automatically selects V2 when both sides support it. No manual configuration needed — the TAK module negotiates format based on firmware capabilities. + +## Usage with ATAK + +Once configured: + +- Meshtastic nodes appear as markers on the ATAK map with callsign labels +- Chat messages can bridge between mesh and TAK networks +- Position updates flow bidirectionally between Meshtastic and TAK +- TAK Tracker nodes broadcast PLI automatically — their positions appear on ATAK maps without any ATAK-side configuration + +> ⚠️ **Note:** TAK integration requires specific node roles and module configuration. Standard client nodes don't automatically participate in TAK operations. + +## Troubleshooting + +| Problem | Cause | Solution | +| -------------------------------- | ------------------------------------- | ----------------------------------------------------------------------- | +| Node doesn't appear on ATAK map | TAK module disabled or wrong role | Verify TAK module is enabled and node role is TAK or TAK Tracker | +| Position updates are stale | GPS fix lost or interval too long | Check GPS status; reduce position broadcast interval in Position Config | +| ATAK plugin shows "disconnected" | BLE connection lost or plugin crashed | Reconnect Bluetooth in Meshtastic app, then restart ATAK plugin | +| Chat messages not bridging | V1 format doesn't support chat | Ensure both nodes run firmware 2.3+ for V2 wire format | +| CoT data not flowing | Channel mismatch | All TAK nodes must be on the same channel with matching encryption | + +## Security Considerations + +- TAK data shares your position and callsign information +- Ensure your channel encryption is configured when using TAK in sensitive environments +- The TAK module respects the same channel encryption as other Meshtastic messages + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — TAK module configuration +- [Nodes](nodes) — TAK and TAK Tracker roles in the node list +- [Map & Waypoints](map-and-waypoints) — node positions on the map +- [ATAK plugin guide](https://meshtastic.org/docs/software/integrations/atak-plugin) — detailed ATAK setup on meshtastic.org + +--- + diff --git a/docs/gl-rES/user/telemetry-and-sensors.md b/docs/gl-rES/user/telemetry-and-sensors.md new file mode 100644 index 000000000..ffa24994d --- /dev/null +++ b/docs/gl-rES/user/telemetry-and-sensors.md @@ -0,0 +1,118 @@ +--- +title: Telemetry & Sensors +nav_order: 9 +last_updated: 2026-05-13 +description: Sensor data on the mesh — supported environment, air quality, and power sensors, plus configuration and viewing guides. +aliases: + - sensors + - environment + - weather + - power-metrics +--- + +# Telemetry & Sensors + +Meshtastic nodes can collect and share sensor data across the mesh network. + +## Overview + +Telemetry allows nodes equipped with sensors to broadcast environmental, power, and device health information. This data is visible on the node detail screen and can be logged over time. + +## Device Telemetry + +All Meshtastic nodes report basic device telemetry: + +| Metric | Descrición | Typical Range | +| ------------------- | ------------------------------ | ------------------------------------------------------------------ | +| Battery Level | Charge percentage | 0–100% | +| Voltage | Battery voltage | 3.0–4.2V (LiPo) | +| Channel Utilization | % of airtime used locally | 0–100% | +| Air Utilization TX | % of airtime used by this node | 0–100% | +| Uptime | Seconds since last boot | Varies | + +## Environment Sensors + +Supported environmental sensors: + +### Temperature & Humidity + +| Sensor | Temperature | Humidity | Pressure | Notes | +| ------- | ----------- | -------- | -------- | ----------------------- | +| BME280 | ✓ | ✓ | ✓ | Recommended all-in-one | +| BME680 | ✓ | ✓ | ✓ | Adds gas resistance/IAQ | +| SHT31 | ✓ | ✓ | — | High accuracy | +| MCP9808 | ✓ | — | — | Precision temperature | +| LPS22 | — | — | ✓ | Pressure only | + +### Air Quality + +| Sensor | Metric | Notes | +| -------- | -------------------------------------------------- | -------------------------- | +| BME680 | Gas Resistance / IAQ | Volatile organic compounds | +| PMSA003I | PM1.0, PM2.5, PM10 | Particulate matter | +| SEN55 | PM, NOx, VOC, Temp, Humidity | Multi-sensor | + +### Light & UV + +| Sensor | Metric | +| -------- | -------------------------------------- | +| OPT3001 | Ambient light (lux) | +| VEML7700 | Ambient light (lux) | +| LTR390 | UV index | + +## Power Metrics + +Nodes with INA-series power sensors can report: + +| Metric | Descrición | +| ----------- | ----------------------------------------- | +| Bus Voltage | Supply rail voltage | +| Current | Power consumption (mA) | +| Power | Calculated power (mW) | + +Useful for monitoring solar charging or battery health on remote nodes. + +## Configuring Telemetry + +1. Navigate to **Settings → Module Config → Telemetry**. +2. Set reporting intervals: + - **Device Metrics Interval** — how often to broadcast device metrics + - **Environment Metrics Interval** — how often to broadcast sensor data +3. Enable specific sensor types as needed. + +### Recommended Intervals + +| Use Case | Device (s) | Environment (s) | +| ------------------------------------------ | ----------------------------- | ---------------------------------- | +| Urban mesh (many nodes) | 3600 | 3600 | +| Rural mesh (few nodes) | 900 | 900 | +| Weather station | 900 | 300 | +| Battery conservation | 7200 | 7200 | + +> ⚠️ **Note:** Shorter intervals increase airtime usage and battery drain across the mesh. + +## Viewing Telemetry + +1. Navigate to **Nodes** and select a node. +2. Telemetry sections show on the detail screen: + - Device Metrics (always available) + - Environment Metrics (if sensors present) + - Power Metrics (if INA sensor present) +3. Historical graphs show trends over time. + +![Telemetry actions](/assets/screenshots/node-metrics_telemetric_actions.png) + +## Troubleshooting + +- **No environment data showing?** The remote node needs a physical sensor connected (e.g., BME280 on I2C). Device telemetry (battery, uptime) is always available, but environment metrics require hardware. +- **Stale readings?** Check the reporting interval — very long intervals (7200s+) mean data updates infrequently. Also verify the remote node is still online. +- **Sensor conflict on I2C bus?** Some sensors share I2C addresses. If you have multiple sensors on the same bus, check for address collisions in the radio's serial debug output. + +## Related Topics + +- [Node Metrics](node-metrics) — view telemetry data on the node detail screen +- [Settings — Modules & Admin](settings-module-admin) — telemetry module configuration +- [Units & Locale](units-and-locale) — temperature and pressure display units + +--- + diff --git a/docs/gl-rES/user/translate.md b/docs/gl-rES/user/translate.md new file mode 100644 index 000000000..b2ed79a34 --- /dev/null +++ b/docs/gl-rES/user/translate.md @@ -0,0 +1,97 @@ +--- +title: Translate the App +parent: User Guide +nav_order: 17 +last_updated: 2026-05-13 +aliases: + - translate + - crowdin + - localization +--- + +# Translate the App + +Contributing translations helps make Meshtastic accessible to a wider audience. The app uses [Crowdin](https://crowdin.com/) to manage community translations for both the user interface and in-app documentation. + +--- + +## What Gets Translated + +| Resource | Source Location | Notes | +| ----------------- | ------------------------------------- | ---------------------------------------------------------------------- | +| UI strings | `composeResources/values/strings.xml` | Buttons, labels, messages, and all user-visible text | +| User Guide pages | `docs/user/*.md` | In-app documentation shown in Help & Documentation | +| Fastlane metadata | `fastlane/metadata/android/en-US/` | App Store listing title, description, and changelogs | + +> **Note — Developer Guide pages are English-only.** Code-focused documentation targeting contributors is not translated. + +--- + +## How to Contribute + +1. **Visit the Crowdin project.** Open the [Meshtastic Android Crowdin project](https://crowdin.com/project/meshtastic-android) and sign in or create a free account. +2. **Choose your language.** Select an existing language or request a new one by opening a [GitHub issue](https://github.com/meshtastic/Meshtastic-Android/issues/new). +3. **Translate strings.** Crowdin shows the English source on the left and your translation on the right. Translate each string and save. +4. **Review context.** Many strings include screenshots or context comments — check these to understand where the text appears in the app. +5. **Submit.** Approved translations are automatically merged into the next release. + +> **Tip — Keep translations short.** UI strings often appear in buttons, chips, or narrow columns. If a translation is significantly longer than the English original, consider abbreviating where the meaning stays clear. + +--- + +## Adding a New Language + +If your language is not yet listed on Crowdin: + +1. Open an issue on [GitHub](https://github.com/meshtastic/Meshtastic-Android/issues/new) requesting the new locale. +2. A maintainer will add the language to Crowdin and configure `crowdin.yml`. +3. Once added, you can begin translating immediately. + +--- + +## How Translations Are Organized + +The Android app uses **Compose Multiplatform resources** for all user-visible strings: + +``` +core/resources/src/commonMain/composeResources/ +├── values/ ← English (default) +│ └── strings.xml +├── values-de/ ← German +│ └── strings.xml +├── values-fr/ ← French +│ └── strings.xml +└── ... +``` + +In-app documentation follows a similar pattern under `docs/`: + +``` +docs/ +├── user/ ← English source (default) +│ ├── onboarding.md +│ └── ... +├── fr/user/ ← French translations +│ ├── onboarding.md +│ └── ... +└── ... +``` + +The app automatically selects the correct locale based on your device's **Language & Region** settings. + +--- + +## Translation Guidelines + +- **Do not translate** technical terms like "LoRa", "MQTT", "BLE", "TAK", "SNR", or "RSSI" — these are universal. +- **Keep placeholders intact.** Strings like `%1$s` or `%d` are filled in at runtime. Do not remove or reorder them unless the grammar of your language requires it. +- **Match tone.** The app uses a friendly, direct voice. Avoid overly formal language. +- **Test if possible.** Switch your device language and open the app to see how translations look in context. + +--- + +## Questions? + +If you have questions about a specific string's context or need help getting started, open a discussion on the [Meshtastic GitHub Discussions](https://github.com/meshtastic/Meshtastic-Android/discussions) page. + +Thank you for helping expand the reach of Meshtastic! diff --git a/docs/gl-rES/user/units-and-locale.md b/docs/gl-rES/user/units-and-locale.md new file mode 100644 index 000000000..5f391111d --- /dev/null +++ b/docs/gl-rES/user/units-and-locale.md @@ -0,0 +1,118 @@ +--- +title: Units, Measurement & Locale +parent: User Guide +nav_order: 16 +last_updated: 2026-05-12 +--- + +# Units, Measurement & Locale + +The Meshtastic app automatically displays temperatures, distances, speeds, and times in the units your device is configured to use — no settings to change inside the app. + +--- + +## How It Works + +Meshtastic radios always transmit data in **metric units** (meters, °C, km/h, hPa, etc.). When the app receives this data, it uses the `MetricFormatter` utility to convert and display values in whatever unit system your device's locale specifies. + +On Android, your measurement preferences are determined by your system **Language & Region** settings. On Desktop (JVM), the app uses the JVM's default `Locale`. + +> **Tip — You never need to toggle units inside the app.** Change your system measurement preferences and every screen in Meshtastic updates automatically — node details, telemetry charts, weather, altitude, and more. + +--- + +## Temperature + +Temperature values from environment sensors are transmitted as **°C** and displayed based on your device's temperature unit preference. + +![Environment metrics with temperature](/assets/screenshots/nodes_environment_metrics.png) + +| Your Setting | You See | +| ------------ | ------- | +| Celsius | 22°C | +| Fahrenheit | 72°F | + +This affects all temperature displays throughout the app: node environment telemetry, soil temperature, dew point, and telemetry chart axes. + +## Distance & Altitude + +Distances between nodes and GPS altitudes are transmitted as **meters** and automatically scaled and converted. + +![Distance info display](/assets/screenshots/nodes_distance_info.png) + +| Your Setting | Small Distance | Large Distance | Altitude | +| -------------------------------- | -------------- | ---------------------- | -------- | +| Metric | 350 m | 2.5 km | 1,200 m | +| Imperial (US) | 1,148 ft | 1.6 mi | 3,937 ft | + +The app uses natural scaling — short distances stay in meters or feet, while longer distances switch to kilometres or miles automatically. + +### Where these appear + +- **Node list** — distance and bearing to each node +- **Node detail** — altitude, distance from your position +- **Map** — waypoint distances, traceroute hop distances +- **Compass** — distance to selected node + +## Speed + +GPS ground speed is displayed in your locale's preferred speed unit. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Metric | 12 km/h | +| Imperial (US) | 7 mph | + +## Wind + +Wind speed and gust data from environment sensors are transmitted as **m/s** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Metric | 5 m/s | +| Imperial (US) | 11 mph | + +Wind readings appear in the **Node Detail** environment section and the **Environment Telemetry** charts. + +## Rainfall + +Rainfall measurements (1-hour and 24-hour totals) are transmitted as **mm** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ---------------------- | +| Metric | 12 mm | +| Imperial (US) | 0.5 in | + +## Units That Never Change + +Some units are international standards and are displayed the same way regardless of your locale: + +| Measurement | Unit | Why | +| -------------------------------- | ------------------------------ | ------------------------------------- | +| Barometric pressure | hPa | International meteorological standard | +| Heading / bearing | ° (degrees) | Universal navigation convention | +| Radiation | μR/hr | Standard dosimetry unit | +| GPS coordinates | decimal degrees | Universal geographic standard | +| Humidity, battery, soil moisture | % | Universal | + +## Date & Time + +All timestamps throughout the app — last heard, message times, telemetry logs, chart axes — follow your device's date and time preferences. + +| Setting | What It Controls | Example | +| ---------------- | ---------------- | ------------------------------------------------ | +| **24-Hour Time** | Clock format | 14:30 vs 2:30 PM | +| **Date Format** | Date ordering | 09/05/2026 vs 05/09/2026 | + +The app also uses **relative time** where it makes sense — for example, "5 min ago" or "2 hours ago" in the node list — which is automatically localised into your device language. + +## Changing Your Measurement System (Android) + +On Android, your measurement system (metric vs imperial) is tied to your region setting: + +1. Open **Android Settings → System → Language & Region** +2. Change your **Region** or **Measurement units** preference +3. Return to Meshtastic — values update immediately + +> **Tip — The app uses `MetricFormatter` from `core:common`.** All measurement formatting is handled by a shared KMP utility that respects your platform's locale. Developers adding new measurement displays should use `MetricFormatter` rather than hard-coding unit conversions. + diff --git a/docs/hr-rHR/index.md b/docs/hr-rHR/index.md new file mode 100644 index 000000000..0cb3c90e2 --- /dev/null +++ b/docs/hr-rHR/index.md @@ -0,0 +1,30 @@ +--- +title: Home +layout: default +nav_order: 0 +--- + +# Meshtastic Android App Documentation + +User and developer documentation for the Meshtastic Android, Desktop, and iOS applications powered by KMP (Kotlin Multiplatform). + +Use the sidebar navigation to browse the **User Guide** for app features and the **Developer Guide** for contributing to the project. + +--- + +## Quick Links + +| Guide | Opis | +| --------------------------------------------------------------------- | -------------------------------------------------------------- | +| [Getting Started](user/onboarding) | Connect your first radio and send a message | +| [Messages & Channels](user/messages-and-channels) | Channel broadcasts, direct messages, reactions, and encryption | +| [Nodes](user/nodes) | Understanding the mesh network node list | +| [Signal Meter](user/signal-meter) | How the LoRa signal quality meter works | +| [Units & Locale](user/units-and-locale) | How temperatures, distances, and times adapt to your region | +| [Desktop App](user/desktop) | Linux, macOS, and Windows desktop usage | +| [Architecture](developer/architecture) | App architecture overview for contributors | +| [Contributing](developer/contributing) | Branch naming, PR workflow, and verification commands | + +--- + +> This documentation is served from the same markdown source that powers the in-app **Help & Documentation** browser. diff --git a/docs/hr-rHR/user/connections.md b/docs/hr-rHR/user/connections.md new file mode 100644 index 000000000..b7c3bd763 --- /dev/null +++ b/docs/hr-rHR/user/connections.md @@ -0,0 +1,125 @@ +--- +title: Connections +nav_order: 2 +last_updated: 2026-05-13 +description: Connect your phone or desktop to a Meshtastic radio via Bluetooth, USB, or TCP/IP. +aliases: + - bluetooth + - usb + - tcp + - pairing +--- + +# Connections + +Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node. + +## Bluetooth (BLE) + +Bluetooth Low Energy is the default and most common connection method on Android. + +### Pairing a Device + +1. Ensure your Meshtastic radio is powered on and in pairing mode. +2. Open the app and navigate to **Connections**. +3. Tap **Scan for Devices** — nearby Meshtastic radios will appear. +4. Select your device from the list. +5. Accept the Bluetooth pairing prompt if shown. + +![Device list item](/assets/screenshots/connections_bluetooth_scan.png) + +You can filter devices by transport type using the filter chips at the top: + +![Transport filter chips](/assets/screenshots/connections_transport_filters.png) + +> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. + +### Connection Status + +| Icon | State | Opis | +| ---- | -------------- | ----------------------------- | +| 🟢 | Connected | Active radio link established | +| 🟡 | Connecting | Handshake in progress | +| 🔴 | Odspojeno | No active connection | +| ⚪ | Not configured | No device selected | + +When connecting, a status indicator shows the current connection state: + +![Connecting status](/assets/screenshots/connections_connecting.png) + +If no devices are found, the app shows an empty state with instructions: + +![No devices found](/assets/screenshots/connections_empty_state.png) + +### Troubleshooting Bluetooth + +- **Device not found:** Toggle Bluetooth off/on, ensure location is enabled. +- **Connection drops:** Move closer to the radio; check for interference. +- **Pairing rejected:** Forget the device in Android Bluetooth settings and retry. + +## USB Serial + +USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable. + +### Setup + +1. Connect your radio via USB cable to your device. +2. The app will prompt for USB permission — tap **Allow**. +3. The connection is established automatically. + +> ⚠️ **Note:** USB connections require OTG support on Android devices. + +## TCP/IP (WiFi) + +Some Meshtastic radios support WiFi connectivity, allowing TCP-based connections. + +### Configuration + +1. Connect your radio to a WiFi network via the radio's web interface or settings. +2. In the app, go to **Connections → TCP**. +3. Enter the radio's IP address and port (default: 4403). +4. Tap **Connect**. + +![WiFi scanning for devices](/assets/screenshots/connections_wifi_scanning.png) + +When a device is found, it appears in the connection list: + +![WiFi device found](/assets/screenshots/connections_wifi_device_found.png) + +A successful connection is confirmed with a status indicator: + +![WiFi connection success](/assets/screenshots/connections_wifi_success.png) + +### When to Use TCP + +- Radio is on the same local network +- Testing with a simulated radio +- Environments where Bluetooth has interference issues + +## Reconnection Behavior + +The app reconnects to the **last selected device** on startup. You can manually switch transports from the connections screen at any time. + +To disconnect from a radio, use the disconnect button on the connections screen: + +![Disconnect from radio](/assets/screenshots/connections_disconnect.png) + +## Desktop Connections + +On Desktop (Linux/macOS/Windows), the app supports: + +- **Bluetooth (BLE)** — via the Kable library; works on macOS, Linux, and Windows +- **USB Serial** — primary wired connection method +- **TCP/IP** — for network-connected radios + +See [Desktop App](desktop) for platform-specific details and keyboard shortcuts. + +## Related Topics + +- [Getting Started](onboarding) — first-launch setup and permissions +- [Settings — Radio & User](settings-radio-user) — Bluetooth and network configuration +- [Desktop App](desktop) — desktop-specific connection details +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — full list of compatible radios on meshtastic.org + +--- + diff --git a/docs/hr-rHR/user/desktop.md b/docs/hr-rHR/user/desktop.md new file mode 100644 index 000000000..a688679eb --- /dev/null +++ b/docs/hr-rHR/user/desktop.md @@ -0,0 +1,147 @@ +--- +title: Desktop App +nav_order: 14 +last_updated: 2026-05-13 +description: Install and use the Meshtastic Desktop app on Linux, macOS, and Windows — connections, feature parity, and keyboard shortcuts. +aliases: + - desktop + - linux + - macos + - windows + - jvm +--- + +# Desktop App + +The Meshtastic Desktop application provides the same mesh communication features on Linux, macOS, and Windows. + +## Overview + +The Desktop app shares its core codebase with the Android app through Kotlin Multiplatform (KMP). Most features work identically across platforms. + +## Installation + +### Linux + +- Download the `.deb` or `.AppImage` package from the releases page +- Or build from source using `./gradlew :desktopApp:run` + +### macOS + +- Download the `.dmg` package from releases +- Or build from source + +### Windows + +- Download the `.msi` installer from releases +- Or build from source + +## Connecting Your Radio + +### USB Serial (Primary) + +The most reliable connection method on Desktop: + +1. Connect your Meshtastic radio via USB cable. +2. The app should detect the serial port automatically. +3. If not detected, select the correct serial port from the connections menu. + +### TCP/IP + +For network-connected radios: + +1. Enter the radio's IP address and port (default: 4403). +2. Click **Connect**. + +### Bluetooth (BLE) + +Bluetooth Low Energy is supported on Desktop via the [Kable](https://github.com/JuulLabs/kable) library: + +1. Ensure your system has a Bluetooth adapter. +2. The app scans for nearby Meshtastic radios automatically. +3. Select your device from the connections screen. + +## Feature Parity + +| Feature | Android | Desktop | Notes | +| ---------------------------------------- | ------- | ------- | -------------------------- | +| Messaging | ✓ | ✓ | Full parity | +| Node List | ✓ | ✓ | Full parity | +| Map | ✓ | ✓ | Full parity | +| Settings | ✓ | ✓ | Full parity | +| Bluetooth (BLE) | ✓ | ✓ | Via Kable on desktop | +| Firmware Update OTA | ✓ | ✗ | Use web flasher | +| Notifications | ✓ | ✓ | Native OS notifications | +| Widgets | ✓ | ✗ | Android-only | +| AI Assistant (Chirpy) | ✓\* | ✗ | Google flavor Android only | + +\*Chirpy AI requires Android 14+ on Google flavor builds with supported hardware. + +## UI Differences + +The Desktop app uses the same Compose Multiplatform UI with adaptations for larger screens and desktop interaction. + +### Keyboard Shortcuts + +| Shortcut | Action | +| ------------------- | --------------------------- | +| **⌘Q** / **Ctrl+Q** | Quit the application | +| **⌘,** / **Ctrl+,** | Open Settings | +| **⌘1** / **Ctrl+1** | Switch to Conversations tab | +| **⌘2** / **Ctrl+2** | Switch to Nodes tab | +| **⌘3** / **Ctrl+3** | Switch to Map tab | +| **⌘4** / **Ctrl+4** | Switch to Connections tab | + +### Window & System Tray + +- **Window resizing** — responsive layout adapts to window dimensions +- **System tray** — minimize to system tray for background mesh operation +- **Tray menu** — right-click the tray icon to show window or quit +- **Mouse interaction** — hover states and standard desktop navigation + +### Notification Preferences + +The Desktop app provides in-app toggles for controlling which notifications are shown — messages, new nodes, and low battery alerts. Access these from **Settings → Notifications** within the app. + +## Built-in Documentation Browser + +The Desktop app includes a built-in documentation browser for quick access to help content without leaving the application. + +![Docs browser with table of contents](/assets/screenshots/docs-browser_toc.png) + +The browser supports full-text search across all documentation: + +![Searching the docs browser](/assets/screenshots/docs-browser_search.png) + +Individual doc pages render with full formatting: + +![A documentation page](/assets/screenshots/docs-browser_page.png) + +## Building from Source + +```bash +git clone https://github.com/meshtastic/Meshtastic-Android.git +cd Meshtastic-Android +git submodule update --init +./gradlew :desktopApp:run +``` + +Requirements: + +- JDK 21 +- No Android SDK required for desktop-only builds + +## Known Limitations + +- No OTA firmware updates (use web flasher) +- Some Android-specific features (widgets, specific notification channels) are unavailable +- Performance may vary on low-spec hardware running Compose Desktop +- BLE bonding is not yet supported on desktop (pairing works without bonding) + +## Related Topics + +- [Connections](connections) — connection methods overview +- [Firmware Updates](firmware) — use the [Web Flasher](https://flasher.meshtastic.org) for desktop firmware updates + +--- + diff --git a/docs/hr-rHR/user/discovery.md b/docs/hr-rHR/user/discovery.md new file mode 100644 index 000000000..fe696299b --- /dev/null +++ b/docs/hr-rHR/user/discovery.md @@ -0,0 +1,114 @@ +--- +title: Discovery +nav_order: 12 +last_updated: 2026-05-13 +description: Explore your mesh network — traceroute paths, neighbor maps, and node discovery tools. +aliases: + - mesh-discovery + - local-discovery + - network-scan + - traceroute + - neighbor-info +--- + +# Discovery + +Discovery tools help you understand **how** your mesh network is connected — which nodes can hear each other, what paths messages take, and where bottlenecks or weak links exist. + +> 💡 **Tip:** You don't need a dedicated "discovery mode" to start exploring your mesh. The tools below are available right now from the node list and node detail screens. + +--- + +## Traceroute + +Traceroute reveals the exact path a message takes from your node to any other node on the mesh. It's the single most useful tool for debugging connectivity problems. + +### Running a Traceroute + +1. Navigate to **Nodes** and tap the node you want to trace. +2. On the node detail screen, tap **Traceroute**. +3. The app sends a traceroute request and waits for the response. +4. Results display each hop in order, with signal quality at every step. + +### Reading the Results + +A traceroute result looks like this: + +``` +You → Node A (SNR: 8.5, RSSI: -95) → Node B (SNR: 5.2, RSSI: -108) → Target +``` + +Each hop represents a relay node that forwarded the message. The SNR and RSSI values at each hop tell you about the link quality on that specific segment. + +| What to look for | What it means | +| -------------------------------------------------------------------------- | --------------------------------------------------------------------------- | +| All hops show Good SNR (> 5 dB) | Healthy path — messages flow reliably | +| One hop shows Bad SNR (< 0 dB) | Weak link — this relay segment is fragile | +| Many hops (4+) | Long path — consider repositioning a node to shorten it | +| Different path on retry | Mesh is adapting — multiple routes exist (this is good!) | + +> 💡 **Tip:** Run traceroute several times over a few minutes. If the path changes, your mesh has redundant routes — a sign of a well-connected network. + +### Troubleshooting with Traceroute + +- **"No route found"** — The target node may be offline, out of range, or on a different channel. Check that both nodes share at least one channel with the same encryption key. +- **Traceroute times out** — The path may be too long (exceeds hop limit) or a relay node is congested. Try increasing the hop limit in **Settings → LoRa Config**. +- **Asymmetric paths** — A traceroute from A→B may take a different path than B→A. This is normal — radio propagation is not always symmetric. + +--- + +## Neighbor Info + +The Neighbor Info module lets each node broadcast a list of the nodes it can **directly hear** (single-hop). When multiple nodes share their neighbor lists, you can piece together a topology map of the entire mesh. + +### Enabling Neighbor Info + +1. Navigate to **Settings → Module Config → Neighbor Info**. +2. Enable the module. +3. Set the broadcast interval (default: 900 seconds / 15 minutes). + +Once enabled, your node periodically broadcasts its neighbor table. Other nodes with Neighbor Info enabled do the same. + +### Viewing Neighbor Data + +- Open any node's detail screen and look for the **Neighbors** section. +- Each neighbor entry shows the node that was directly heard and its signal quality. +- Combine neighbor data from multiple nodes to understand the full mesh topology. + +> ⚠️ **Note:** Neighbor Info increases airtime usage because every enabled node periodically broadcasts its neighbor list. On busy meshes with many nodes, consider longer broadcast intervals (3600 seconds or more) to avoid congestion. + +--- + +## Node List as a Discovery Tool + +The node list itself is a powerful discovery tool when you use its filtering and sorting features effectively. + +### Finding New Nodes + +- Sort by **Last heard** to see the most recently active nodes at the top. +- Enable **Include unknown** to see nodes that have appeared on the mesh but haven't sent user info yet — these are often newly powered-on devices. + +### Assessing Connectivity + +- Sort by **Hops away** to see which nodes are directly reachable (0 hops) versus relayed. +- Sort by **Distance** to find nearby nodes and verify they're reachable. +- Use **Exclude MQTT** to focus on nodes reachable over radio (not via internet bridge). + +### Infrastructure Audit + +- Disable **Exclude infrastructure** to see Router, Repeater, Router Late, and Client Base nodes. +- Check their signal quality and last-heard times to verify your infrastructure nodes are healthy. + +See [Nodes](nodes) for full details on filtering and sorting options. + +--- + +## Tips for Mesh Exploration + +- **Start with traceroute** — it gives you immediate, actionable information about a specific path. +- **Enable Neighbor Info on key nodes** — especially routers and repeaters, to build a picture of the backbone. +- **Check the map** — node positions on the [Map](map-and-waypoints) combined with signal data help you understand why some links are strong and others are weak. +- **Compare signal over time** — use the [Signal Meter](signal-meter) guide to interpret SNR and RSSI values correctly. + +--- + diff --git a/docs/hr-rHR/user/firmware.md b/docs/hr-rHR/user/firmware.md new file mode 100644 index 000000000..28f6705bf --- /dev/null +++ b/docs/hr-rHR/user/firmware.md @@ -0,0 +1,114 @@ +--- +title: Firmware Updates +nav_order: 13 +last_updated: 2026-05-13 +description: Update your radio firmware over Bluetooth — OTA process, version channels, pre-flight checks, and recovery. +aliases: + - firmware + - update + - ota + - flash +--- + +# Firmware Updates + +Keep your Meshtastic radio up to date with the latest firmware for new features, bug fixes, and security improvements. + +## Checking for Updates + +1. Navigate to **Settings → Firmware Update** or tap the firmware notification if shown. +2. The app checks for available firmware versions. +3. Available updates show the version number and changelog summary. + +## Update Methods + +### OTA (Over-The-Air) via Bluetooth + +The most common update method for Android users: + +1. Ensure your radio is connected via Bluetooth. +2. Navigate to the Firmware Update screen. +3. Select the desired firmware version. +4. Tap **Update** to begin the OTA process. +5. Wait for the update to complete — **do not disconnect** during the update. + +![Firmware checking for updates](/assets/screenshots/firmware_checking.png) + +> ⚠️ **Warning:** Interrupting a firmware update can brick your device. Ensure your radio has sufficient battery (>50% recommended) and maintain Bluetooth proximity during the entire process. + +![Firmware disclaimer](/assets/screenshots/firmware_disclaimer.png) + +### USB Flashing + +For recovery or when OTA is unavailable: + +- Use the [Meshtastic Web Flasher](https://flasher.meshtastic.org) +- Or the [Meshtastic CLI tool](https://meshtastic.org/docs/getting-started/flashing-firmware) on desktop + +## Version Channels + +| Kanal | Opis | +| ------ | ------------------------------------------- | +| Stable | Recommended for most users; tested releases | +| Alpha | Preview releases; may contain bugs | + +## Pre-Update Checklist + +Before updating: + +- [ ] Battery > 50% +- [ ] Stable Bluetooth connection +- [ ] Note your current settings (they may reset on major version changes) +- [ ] Check the release notes for breaking changes + +## Post-Update + +After a successful update: + +- The radio will reboot automatically +- Bluetooth connection will re-establish +- Verify your settings are intact +- Check the firmware version in **Settings → About** + +![Firmware update success](/assets/screenshots/firmware_success.png) + +## Troubleshooting + +### Update Stuck + +If the update appears frozen: + +- Wait at least 5 minutes before intervening +- If truly stuck, power-cycle the radio +- Attempt the update again + +![Firmware update error](/assets/screenshots/firmware_error.png) + +### Device Won't Boot After Update + +If your device fails to boot: + +1. Try connecting via USB to a computer +2. Use the web flasher in recovery/DFU mode +3. Flash a known-good firmware version +4. Check the Meshtastic Discord for device-specific recovery steps + +### Compatibility Warnings + +The app may show warnings when: + +- Connected radio firmware is below minimum supported version +- Major version mismatch between app and firmware +- Deprecated features need migration + +> ⚠️ **Important:** Always update the Meshtastic app before or alongside firmware updates to ensure compatibility. + +## Related Topics + +- [Connections](connections) — reconnecting after a firmware update +- [Flashing firmware guide](https://meshtastic.org/docs/getting-started/flashing-firmware) — full firmware flashing walkthrough on meshtastic.org +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — check firmware compatibility by device +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/hr-rHR/user/map-and-waypoints.md b/docs/hr-rHR/user/map-and-waypoints.md new file mode 100644 index 000000000..964d1b31a --- /dev/null +++ b/docs/hr-rHR/user/map-and-waypoints.md @@ -0,0 +1,116 @@ +--- +title: Map & Waypoints +nav_order: 6 +last_updated: 2026-05-13 +description: View node positions on the map, create and share waypoints, and manage position sharing and privacy. +aliases: + - map + - waypoints + - gps + - location +--- + +# Map & Waypoints + +The Map screen shows the geographic positions of nodes on your mesh, along with shared waypoints. + +## Map View + +The map displays: + +- **Node positions** — colored markers for each node reporting location +- **Waypoints** — shared points of interest +- **Your position** — your current GPS location + +### Node Markers + +Node markers on the map indicate: + +| Color | Meaning | +| ------ | ---------------------------------------------- | +| Green | Online (heard recently) | +| Yellow | Away (heard within 2 hours) | +| Gray | Offline (stale position) | +| Blue | Your own node | + +### Map Controls + +- **Zoom** — pinch or use +/- buttons +- **Pan** — drag to explore +- **Center** — select the location button to center on your position +- **Node tap** — tap a node marker to view details + +The floating toolbar provides quick access to compass, layer switching, node filters, refresh, and location tracking. Tap the compass to reorient north-up, or tap the location button to center on your current position. + +![Map controls overlay](/assets/screenshots/map_controls_overlay.png) + +## Waypoints + +Waypoints are shared geographic points of interest that all mesh members can see. + +### Creating a Waypoint + +1. Long-press on the map at the desired location. +2. Enter a name and optional description. +3. Choose an icon/emoji for the waypoint. +4. Tap **Send** to share with the mesh. + +### Waypoint Properties + +| Property | Opis | +| ---------- | ------------------------------------------------------- | +| Ime | Short identifier (max 30 characters) | +| Opis | Optional longer description | +| Icon | Visual marker emoji on the map | +| Zaključano | If locked, only the creator can edit or delete | +| Expiration | Optional auto-remove time | + +### Waypoint Expiration + +Waypoints can be set to expire automatically: + +- **Never** (default) — waypoint remains until manually deleted +- **Timed** — waypoint is automatically removed after the specified duration (e.g., "remove after 2 hours"). Useful for temporary markers like rally points, hazards, or meeting locations. + +Expired waypoints are automatically hidden from the map so they don't clutter the display. The expiration countdown begins when the waypoint is created, not when other nodes receive it. + +### Managing Waypoints + +- Tap a waypoint on the map to view its details and coordinates +- Edit or delete waypoints you created +- **Locked waypoints** cannot be modified or deleted by other nodes — only the original creator can change them +- Unlocked waypoints can be edited by any mesh member + +## Position Sharing + +### Enabling Position Sharing + +Your node shares its GPS position based on: + +- **Fixed interval** — broadcast position at regular intervals +- **Smart position** — broadcast when movement exceeds a threshold +- **Manual** — only share when explicitly requested + +Configure position behavior in **Settings → Position**. + +### Privacy Considerations + +> 🔒 **Privacy:** Position data is broadcast to all nodes on your channel. If you don't want your location shared, disable GPS position in settings or use a fixed/fake position. + +## Map Sources + +The app supports multiple map tile sources: + +- OpenStreetMap (default) +- Satellite imagery (where available) +- Offline tiles (download map areas for offline use) + +## Related Topics + +- [Nodes](nodes) — view and filter your node list +- [Node Metrics](node-metrics) — signal quality and position history for individual nodes +- [Discovery](discovery) — traceroute and neighbor info for understanding mesh topology +- [Units & Locale](units-and-locale) — distance and coordinate display formats + +--- + diff --git a/docs/hr-rHR/user/messages-and-channels.md b/docs/hr-rHR/user/messages-and-channels.md new file mode 100644 index 000000000..89981caf9 --- /dev/null +++ b/docs/hr-rHR/user/messages-and-channels.md @@ -0,0 +1,159 @@ +--- +title: Messages & Channels +nav_order: 3 +last_updated: 2026-05-13 +description: Send and receive messages, manage channels, configure encryption, and use quick chat, reactions, and message actions. +aliases: + - channels + - direct-messages + - messaging + - conversations +--- + +# Messages & Channels + +Meshtastic supports two communication modes: **channel broadcasts** and **direct messages**. + +## Channels + +Channels are shared communication groups. All nodes configured with the same channel key can read and send messages on that channel. + +### Default Channel + +Every Meshtastic device comes with a default **LongFast** channel. This is an unencrypted channel used for general mesh communication. + +### Channel Security + +Channels support multiple encryption levels: + +| Icon | Security Level | Opis | +| ---- | ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------- | +| 🔒 | PSK (256-bit AES) | Fully encrypted with a strong pre-shared key. Only nodes with the matching key can read messages. | +| 🔐 | PSK (128-bit AES) | Encrypted with a shorter key. Secure for most uses but 256-bit is preferred for sensitive data. | +| 🔓 | Default / Open | Uses the well-known default key. **Any Meshtastic device** on the same preset can read these messages. | +| ⚠️ | Insecure + Position | Open channel that also broadcasts your GPS position. Use with caution in public meshes. | + +> 🔒 **Security Tip:** 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. + +### Adding a Channel + +1. Navigate to **Settings → Channels**. +2. Tap **Add Channel** or scan a QR code. +3. Configure the channel name and encryption key. +4. Share the channel URL/QR code with others who need access. + +Tapping a channel shows its details and sharing options. + +## Direct Messages + +Direct messages (DMs) are point-to-point encrypted communications between two specific nodes. + +### Sending a Direct Message + +1. Open the **Messages** tab. +2. Select a node from your contacts list or tap a node in the node list. +3. Type your message and tap **Send**. + +### Message States + +| State | Icon | Meaning | +| --------------------------------- | ---- | ----------------------------------------------------------------------------------------------------------------- | +| Queued | ⏳ | Message waiting to be sent | +| En route | ✓ | Delivered to the radio, awaiting acknowledgment | +| Delivered | ✓✓ | Acknowledgment received from recipient | +| Received | ✓ | Message received from the mesh (incoming) | +| S&F Routing | 🔗 | Store & Forward: message being routed through an S&F node | +| S&F Confirmed | 🔗 | Store & Forward: delivery confirmed via S&F node | +| Pogreška | ✗ | Delivery failed after retries | + +### Delivery Errors + +When a message fails to deliver, the error indicator shows what went wrong: + +| Pogreška | Meaning | What to Do | +| ---------------- | ---------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| No Route | No path exists to the destination node | The recipient may be offline or out of mesh range. Try later or move closer. | +| Got NAK | The next-hop node refused to relay | The relay node may be congested. Wait and retry. | +| Timeout | No acknowledgment within retry window | The recipient may be just out of range. Try increasing hop limit or moving to a better position. | +| No Interface | No radio interface available to send | Check that your radio is connected and the channel is configured. | +| Max Retransmit | All retry attempts exhausted | The mesh path is unreliable. Try a different channel or wait for conditions to improve. | +| No Channel | The destination channel doesn't exist | Verify both nodes share the same channel configuration. | +| Too Large | Message exceeds maximum payload size | Shorten your message (max ~230 characters). | +| No Response | Node received message but didn't respond | The recipient's radio may be busy or in low-power sleep mode. | +| Duty Cycle Limit | Regional airtime limit reached | Your radio has used its allowed transmit time. Wait for the duty cycle window to reset (typically 1 hour in EU regions). | +| Bad Request | Malformed or invalid message | This usually indicates a software bug. Try restarting the app. | + +> 💡 **Tip:** 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. + +## Message Features + +### Quick Chat + +Pre-configured messages for rapid communication: + +- Access via the Quick Chat button in the message input area +- Choose from built-in phrases or custom messages +- Customize quick chat messages in **Settings → Quick Chat** +- Useful when typing is impractical (gloves, small screen, urgent) + +![Quick chat option](/assets/screenshots/messages_quick_chat.png) + +The channel list shows each channel with its latest message preview. + +### Message Bubbles + +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. + +### Reactions + +React to messages with emoji: + +- **Long-press** a message to open the actions menu +- Tap **Add Reaction** to choose an emoji +- Reactions appear below the message bubble +- Multiple users can react to the same message +- React to your own messages or others' messages + +![Emoji reaction badges displayed beneath a message](/assets/screenshots/messages_reaction.png) + +> 💡 **Tip:** Reactions are lightweight — they use minimal mesh bandwidth compared to full text messages. + +### Message Actions + +Long-press any message to access: + +- **Copy** — copy message text to clipboard +- **Reply** — quote the message in your response +- **React** — add an emoji reaction +- **Delete** — remove a message you sent (local deletion) + +### Message Priority + +Messages are queued and transmitted based on priority: + +1. Emergency/alert messages (highest) +2. Direct messages +3. Channel broadcasts (lowest) + +### Message Limits + +- **Maximum length:** 237 bytes (approximately 230 characters for ASCII text) +- **Rate limiting:** The mesh enforces airtime fairness; heavy message volume may be throttled +- **Delivery:** Messages are retried automatically if no acknowledgment is received + +## Best Practices + +- Use channels for group coordination +- Use direct messages for private person-to-person communication +- Keep messages short — mesh bandwidth is limited +- Configure encryption for sensitive communications + +## Related Topics + +- [Nodes](nodes) — tap a node to start a direct message +- [Settings — Radio & User](settings-radio-user) — configure channel encryption and presets +- [MQTT](mqtt) — bridge channel messages to the internet +- [Channel configuration](https://meshtastic.org/docs/configuration/radio/channels) — detailed channel settings on meshtastic.org + +--- + diff --git a/docs/hr-rHR/user/mqtt.md b/docs/hr-rHR/user/mqtt.md new file mode 100644 index 000000000..742337e4f --- /dev/null +++ b/docs/hr-rHR/user/mqtt.md @@ -0,0 +1,137 @@ +--- +title: MQTT +nav_order: 11 +last_updated: 2026-05-13 +description: Bridge your mesh to the internet — MQTT broker setup, encryption layers, and map reporting. +aliases: + - mqtt + - internet-bridge + - broker +--- + +# MQTT + +MQTT bridges your Meshtastic mesh network to the internet, enabling long-range communication beyond radio range. + +## Overview + +The MQTT module connects your node to an MQTT broker, allowing: + +- Messages to reach nodes on different physical meshes via the internet +- Integration with home automation and monitoring systems +- Publishing node positions to the public Meshtastic map +- Custom data pipelines for logging and alerting + +## How It Works + +``` +[Your Node] → Radio → [Gateway Node with WiFi] → MQTT Broker → [Remote Gateway] → Radio → [Remote Node] +``` + +A gateway node with internet access (WiFi or Ethernet) publishes mesh messages to an MQTT topic. Remote gateways subscribed to the same topic inject those messages into their local mesh. + +## Configuration + +### Enabling MQTT + +1. Navigate to **Settings → Module Config → MQTT**. +2. Enable the MQTT module. +3. Configure the broker connection: + +![MQTT toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | Opis | Zadano | +| --------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------- | +| Server Address | MQTT broker hostname | mqtt.meshtastic.org | +| Username | Broker authentication | meshdev | +| Password | Broker authentication | large4cats | +| Root Topic | Base topic for messages | msh | +| Encryption | Encrypt MQTT payload | Enabled | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON packet support has been removed from firmware; this field is ignored | Disabled | +| TLS | Secure connection to broker | Disabled | +| Map Reporting | Report position to public map | Disabled | + +### Default Meshtastic Broker + +The community maintains a public broker at `mqtt.meshtastic.org`. This is intended for general use and testing. + +> 🔒 **Privacy:** Messages on the public broker are readable by anyone subscribed. Always use channel encryption for private communications. + +### Private Broker + +For better privacy and control, you can run your own MQTT broker: + +- Mosquitto (lightweight, open-source) +- HiveMQ +- EMQX + +Configure your node to point to your private broker with appropriate credentials. + +## Map Reporting + +When Map Reporting is enabled, your node publishes its position to the Meshtastic community map: + +- Visible at [meshmap.net](https://meshmap.net) and similar community map services +- Only position and node info are shared +- Disable this if you don't want your location publicly visible + +## Uplink vs Downlink + +| Direction | Opis | +| ------------ | -------------------------------- | +| **Uplink** | Messages from mesh → MQTT broker | +| **Downlink** | Messages from MQTT broker → mesh | + +Configure per-channel which directions are active to control message flow and airtime usage. + +## Message Formats + +MQTT uses protobuf message format: + +| Format | Opis | Use case | +| ------------ | ----------------------------------- | -------------------------- | +| **Protobuf** | Binary Meshtastic protobuf encoding | Node-to-node mesh bridging | + +> ⚠️ **Note:** JSON output support was removed from firmware. The `json_enabled` setting is still visible in the app for legacy compatibility but has no effect on current firmware versions. + +## Encryption & Privacy + +Understanding the layered encryption model: + +1. **Channel encryption** happens on the mesh _before_ MQTT. If your channel has a PSK, the MQTT payload is already encrypted — the broker and any subscribers see only the ciphertext. +2. **MQTT encryption** (the module setting) adds an additional encryption layer for transit to the broker. This protects metadata and routing information. +3. **TLS** encrypts the TCP connection to the broker itself, preventing network-level eavesdropping. + +> 🔒 **Important:** The default public channel has a well-known key. Messages on the default channel sent via MQTT are effectively **unencrypted** — anyone can decode them. Always use a custom PSK for private communications. + +## Best Practices + +- Use channel-level encryption (PSK) on channels that bridge to MQTT +- Don't enable MQTT on nodes without internet access (it will buffer and waste memory) +- Use a private broker for sensitive deployments +- Be mindful of airtime when downlinking messages from busy MQTT topics — every downlinked message consumes radio airtime on your local mesh +- Consider enabling uplink-only if you only need to monitor your mesh remotely without injecting messages back + +## Troubleshooting + +### MQTT Not Connecting + +- **Check WiFi** — the gateway node must have an active internet connection (WiFi or Ethernet). MQTT does not work over the LoRa radio link itself. +- **Verify credentials** — incorrect username or password will silently fail on most brokers. Double-check for trailing spaces. +- **Firewall** — port 1883 (MQTT) or 8883 (MQTT+TLS) must be open. Some networks block non-standard ports. +- **DNS resolution** — if using a custom broker hostname, verify the node can resolve it. Try the broker's IP address directly. + +### Messages Not Bridging + +- **Check uplink/downlink settings** — if only uplink is enabled, messages flow from mesh to MQTT but not back. Enable downlink on the receiving gateway. +- **Channel mismatch** — both gateways must share the same channel with the same PSK. A mismatch means messages are encrypted with different keys and appear as garbage. +- **Topic mismatch** — ensure both gateways use the same root topic. The default `msh` works for the public broker. + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — MQTT module configuration reference +- [Messages & Channels](messages-and-channels) — channel encryption and PSK setup +- [MQTT integration guide](https://meshtastic.org/docs/software/integrations/mqtt) — detailed MQTT documentation on meshtastic.org + +--- + diff --git a/docs/hr-rHR/user/node-metrics.md b/docs/hr-rHR/user/node-metrics.md new file mode 100644 index 000000000..a05c3d408 --- /dev/null +++ b/docs/hr-rHR/user/node-metrics.md @@ -0,0 +1,130 @@ +--- +title: Node Metrics +nav_order: 5 +last_updated: 2026-05-13 +description: Telemetry dashboards for each mesh node — device health, environment sensors, signal quality, power, traceroute, and position history. +aliases: + - metrics + - telemetry + - device-metrics + - signal +--- + +# Node Metrics + +The node detail screen provides comprehensive telemetry and metrics for each node on your mesh. + +## Device Metrics + +Basic operating information reported by each node: + +| Metric | Opis | +| ------------------- | ----------------------------------- | +| Battery Level | Current battery percentage | +| Voltage | Battery voltage reading | +| Channel Utilization | Percentage of airtime consumed | +| Airtime | Transmission time used by this node | +| Uptime | Time since last reboot | + +Device metrics are displayed as individual cards with trend sparklines showing battery level, voltage, channel utilization, airtime, and uptime over time. + +> 💡 **Tip:** Tap any metric card to expand it into a full chart with historical data points. Pinch to zoom the time axis. + +## Environment Metrics + +Environmental sensor data (requires compatible hardware): + +| Metric | Sensor Examples | +| ------------------------------------ | --------------------- | +| Temperature | BME280, BME680, SHT31 | +| Humidity | BME280, BME680, SHT31 | +| Barometric Pressure | BME280, BMP280 | +| Gas Resistance | BME680 | +| IAQ (Air Quality) | BME680 | + +Environment metrics are charted over time for easy trend analysis — temperature, humidity, and pressure each get their own line chart with the measurement unit displayed on the Y axis. + +> 💡 **Tip:** Environment metrics require a sensor connected to the remote node. Not all nodes report environmental data. See [Telemetry & Sensors](telemetry-and-sensors) for a full list of supported sensors. + +## Signal Metrics + +Radio signal quality information: + +| Metric | Opis | +| --------- | ----------------------------------------------------------------------------- | +| SNR | Signal-to-Noise Ratio (higher is better) | +| RSSI | Received Signal Strength Indicator (closer to 0 is better) | +| Hop Count | Number of mesh hops for last message | + +### Signal Quality Reference + +| SNR Range | Quality | +| --------------------------------- | --------- | +| > 10 dB | Excellent | +| 0 to 10 dB | Good | +| -10 to 0 dB | Fair | +| < -10 dB | Poor | + +## Power Metrics + +Power management telemetry (requires INA sensor or compatible hardware): + +| Metric | Opis | +| ----------- | ----------------------- | +| Bus Voltage | Supply voltage | +| Current | Power draw in milliamps | +| Power | Calculated wattage | + +## Traceroute + +Traceroute shows the path a message takes through the mesh: + +1. From the node detail screen, tap **Traceroute**. +2. The app sends a traceroute request to the target node. +3. Results show each hop with SNR/RSSI values. + +### Reading Traceroute Results + +``` +You → Node A (SNR: 8.5) → Node B (SNR: 5.2) → Target +``` + +Each hop represents a relay node that forwarded the message. + +## Position Log + +Historical position data for nodes that share their location: + +- GPS coordinates +- Altitude +- Speed (if moving) +- Timestamp for each position report + +## Neighbor Info + +Shows which nodes a given node can directly hear, useful for understanding mesh topology. + +## Viewing Metrics + +1. Navigate to **Nodes**. +2. Tap the node you want to inspect. +3. Select the metric category from the detail tabs. + +![Node detail — local device](/assets/screenshots/nodes_detail_local.png) + +The position tab shows location data for nodes that share GPS: + +![Position inline content](/assets/screenshots/nodes_position.png) + +> ⚠️ **Note:** Metrics are only available when they have been reported by the remote node. Metrics update at intervals configured on each node's telemetry settings. + +## Related Topics + +- [Nodes](nodes) — node list, filtering, and sorting +- [Telemetry & Sensors](telemetry-and-sensors) — supported sensors and configuration +- [Signal Meter](signal-meter) — how signal quality is calculated from SNR and RSSI +- [Discovery](discovery) — traceroute details and neighbor info +- [Units & Locale](units-and-locale) — temperature, distance, and speed display formats + +--- + diff --git a/docs/hr-rHR/user/nodes.md b/docs/hr-rHR/user/nodes.md new file mode 100644 index 000000000..cca4841b4 --- /dev/null +++ b/docs/hr-rHR/user/nodes.md @@ -0,0 +1,152 @@ +--- +title: Nodes +nav_order: 4 +last_updated: 2026-05-13 +description: Browse, filter, and sort mesh nodes — view details, signal quality, roles, and quick actions. +aliases: + - node-list + - mesh-nodes + - peers +--- + +# Nodes + +The Nodes screen displays all devices visible on your mesh network. + +## Node List + +The node list shows every node your radio has heard, including: + +- **Node name** — user-configured long name +- **Short name** — 4-character identifier +- **Signal quality** — last heard signal strength +- **Last heard** — time since last communication +- **Distance** — estimated distance (if positions are shared) +- **Battery** — remote node battery level (if telemetry is enabled) + +### Node Status Indicators + +| Badge | Meaning | +| ---------- | ------------------------------------- | +| 🟢 Online | Node heard within the last 15 minutes | +| 🟡 Away | Node heard within the last 2 hours | +| 🔴 Offline | Node not heard for over 2 hours | +| ⭐ Favorite | Node marked as favorite by the user | + +### Node Roles + +Nodes can be configured with different roles that affect their mesh behavior: + +| Role | Opis | +| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Client | Standard end-user device | +| Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | +| Client Mute | Receives but doesn't retransmit | +| Client Hidden | Like Client Mute, plus hides from node list | +| Router | Prioritizes message forwarding; stays awake to relay | +| Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | +| ~~Router Client~~ | ⚠️ **Deprecated** (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | +| ~~Repeater~~ | ⚠️ **Deprecated** (removed in firmware 2.7.11) — no longer selectable; use Router instead | +| Tracker | Optimized for position reporting at regular intervals | +| Sensor | Optimized for telemetry reporting | +| TAK | Interoperates with TAK systems (sends/receives CoT) | +| TAK Tracker | TAK position reporting only | +| Lost & Found | Continuous position beacon for recovery | + +### Choosing a Role + +Most users should keep the default **Client** role. Consider a different role when: + +- **Router** — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don't use Router on battery-powered handheld devices. +- **Router Late** — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. +- **Client Base** — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. +- **Client Mute** — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only devices or to reduce congestion in dense areas. +- **Tracker** — An unattended device whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. +- **Sensor** — An unattended device reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. +- **TAK / TAK Tracker** — Only needed if interoperating with ATAK/WinTAK systems. See [TAK Integration](tak) for details. + +> 💡 **Tip:** The mesh works best when most nodes are **Client** or **Router**. Too many Mute nodes reduces mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. + +### Encryption Indicators + +Nodes display encryption status icons next to their name: + +| Icon | Meaning | +| ----------- | ------------------------------------------------------------------------------------------------------------------- | +| 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | +| 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | +| ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) | + +> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. + +## Quick Actions + +From the node list, you can: + +- **Tap** a node to view its detail page +- **Long-press** for quick actions: + - Send a direct message + - View on map + - Zatraži poziciju + - Mark as favorite + - Traceroute + +## Filtering & Sorting + +### Text Search + +Type in the search field to filter nodes by name or short name. The filter updates in real time as you type. + +### Filter Toggles + +| Filtriraj | Opis | +| -------------------------- | ---------------------------------------------------------------------------------------------- | +| **Only online** | Show only nodes heard within the last 15 minutes | +| **Only direct** | Show only nodes with direct (non-relayed) connections | +| **Include unknown** | Show nodes that haven't sent user info yet | +| **Exclude infrastructure** | Hide infrastructure-role nodes (Router, Repeater, Router Late, Client Base) | +| **Exclude MQTT** | Hide nodes heard only via MQTT internet bridge | +| **Show ignored** | Show nodes you've previously dismissed or muted | + +### Sort Options + +| Sort | Opis | +| ------------------------------------------- | ------------------------------------------------------------------ | +| **Last heard** (default) | Most recently heard nodes first | +| **Alphabetical** | Sorted by node long name | +| **Distance** | Nearest nodes first (requires position sharing) | +| **Hops away** | Fewest relay hops first | +| **Channel** | Grouped by channel index | +| **Via MQTT** | Grouped by MQTT vs. radio-heard | +| **Favorites** | Favorited nodes first | + +## Node Detail + +Tapping a node opens the detail view with comprehensive information. See [Node Metrics](node-metrics) for full details on metrics and telemetry. + +![Node detail view](/assets/screenshots/nodes_node_list.png) + +The detail screen includes device info, position, and action buttons: + +![Node detail section](/assets/screenshots/nodes_detail_section.png) + +Inline status indicators show key metrics at a glance: + +| Indicator | Screenshot | +| -------------- | -------------------------------------------------------- | +| Signal quality | ![Signal](/assets/screenshots/nodes_signal_info.png) | +| Battery level | ![Battery](/assets/screenshots/nodes_battery_info.png) | +| Hop count | ![Hops](/assets/screenshots/nodes_hops_info.png) | +| Posljednje čuo | ![Last heard](/assets/screenshots/nodes_last_heard.png) | +| Udaljenost | ![Distance](/assets/screenshots/nodes_distance_info.png) | + +## Related Topics + +- [Node Metrics](node-metrics) — detailed telemetry dashboards for each node +- [Messages & Channels](messages-and-channels) — send a direct message to a node +- [Map & Waypoints](map-and-waypoints) — view node positions geographically +- [Discovery](discovery) — traceroute and neighbor info for topology exploration +- [Signal Meter](signal-meter) — understand what the signal bars mean + +--- + diff --git a/docs/hr-rHR/user/onboarding.md b/docs/hr-rHR/user/onboarding.md new file mode 100644 index 000000000..3b910534e --- /dev/null +++ b/docs/hr-rHR/user/onboarding.md @@ -0,0 +1,99 @@ +--- +title: Getting Started +nav_order: 1 +last_updated: 2026-05-13 +description: First-launch setup — permissions, onboarding flow, and next steps after connecting your radio. +aliases: + - first-launch + - setup + - intro +--- + +# Getting Started + +Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app. + +## First Launch + +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. + +### Welcome Screen + +The welcome screen introduces Meshtastic and its core capabilities: + +- Off-grid mesh communication +- No cellular or internet required +- End-to-end encrypted messaging + +Tap **Get Started** to proceed through the setup flow. + +![Welcome screen](/assets/screenshots/onboarding_welcome.png) + +## Permissions + +The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. + +### Bluetooth Permission + +Bluetooth is the primary connection method between your phone and Meshtastic radio: + +- **Bluetooth scanning** — discover nearby Meshtastic radios +- **Bluetooth connect** — establish and maintain connections with paired radios + +Grant both permissions when prompted. Without Bluetooth, you'll need to use USB or TCP connections instead. + +### Location Permission + +> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. + +Meshtastic also uses your location for: + +- Showing your position on the mesh map +- Calculating distances to other nodes +- Sharing your GPS coordinates with other mesh members (if enabled) + +Grant **"While using the app"** or **"Always"** depending on your preference: + +- **While using the app** — position updates only when the app is open +- **Always** — enables background position updates for always-on mesh presence + +If denied, Bluetooth scanning will not function and your node will not report a position. + +### Notifications Permission + +Notifications alert you to: + +- Incoming messages from channels and direct messages +- Connection status changes (connected, disconnected, reconnecting) +- Firmware update availability + +> 💡 **Tip:** You can fine-tune notification preferences later in Android system settings. The app creates separate notification channels for messages, connection events, and background service status. + +### Critical Alerts Permission + +On supported devices, the app may request permission for critical alerts: + +- These are high-priority notifications that can break through Do Not Disturb mode +- Useful for emergency mesh alerts or urgent messages +- You can **skip** this step if you don't need breakthrough notifications +- Configure or revoke later in Android notification settings + +## After Setup + +Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. + +> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. + +## What's Next? + +Once connected to a radio, explore: + +- [Connections](connections) — pair your first radio device +- [Messages & Channels](messages-and-channels) — send your first message +- [Nodes](nodes) — see who's on your mesh +- [Map & Waypoints](map-and-waypoints) — view node positions +- [Settings](settings-radio-user) — configure your radio and user profile + +New to Meshtastic? The [getting started guide](https://meshtastic.org/docs/getting-started) on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup. + +--- diff --git a/docs/hr-rHR/user/settings-module-admin.md b/docs/hr-rHR/user/settings-module-admin.md new file mode 100644 index 000000000..4178a1543 --- /dev/null +++ b/docs/hr-rHR/user/settings-module-admin.md @@ -0,0 +1,246 @@ +--- +title: Settings — Modules & Admin +nav_order: 8 +last_updated: 2026-05-13 +description: Configure optional feature modules (MQTT, telemetry, canned messages, TAK, and more) and perform device administration. +aliases: + - modules + - module-config + - administration +--- + +# Settings — Modules & Admin + +Configure optional feature modules and perform device administration. Modules extend Meshtastic with specialized capabilities — each can be independently enabled or disabled. + +> 💡 **Tip:** You only need to enable the modules you actually use. Disabling unused modules reduces airtime, saves battery, and simplifies your configuration. + +Module settings use a card-based layout with toggle switches, dropdowns, text fields, and sliders: + +![Toggle switch](/assets/screenshots/settings_switch.png) + +![Dropdown selector](/assets/screenshots/settings_dropdown.png) + +![Text field](/assets/screenshots/settings_text_field.png) + +![Settings card layout](/assets/screenshots/settings_titled_card.png) + +## Module Configuration + +### MQTT Module + +Bridges mesh messages to and from an MQTT broker for internet connectivity. This is how you extend your mesh beyond radio range or integrate with home automation systems. + +| Setting | Opis | +| --------------- | ------------------------------------------------------------------------ | +| Enabled | Toggle MQTT bridge | +| Server | MQTT broker address | +| Username | Authentication username | +| Password | Authentication password | +| Encryption | Encrypt MQTT payloads | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON support removed from firmware; field is ignored | +| TLS | Use secure connection | +| Root Topic | Base MQTT topic path | +| Map Report | Publish position for public map | + +See [MQTT](mqtt) for a detailed usage guide including encryption, privacy, and broker setup. + +### Serial Module + +Enables serial port communication for external device integrations (GPS modules, sensors, or custom hardware). When enabled, the node's serial port can send and receive protobuf or text data, allowing external microcontrollers or computers to interact with the mesh. + +| Setting | Opis | +| ---------- | ------------------------------- | +| Enabled | Activate serial communication | +| Echo | Echo received serial data back | +| Mode | Text, Protobuf, or NMEA output | +| RX/TX Pins | GPIO pins for serial connection | +| Baud Rate | Serial communication speed | + +### External Notification Module + +Controls buzzer, LED, or vibration alerts on your radio hardware. Useful for devices that need to physically signal when a message arrives — particularly helpful for unattended or outdoor installations. + +| Setting | Opis | +| -------------------------------- | --------------------------- | +| Enabled | Activate notifications | +| Alert Message | Notify on incoming messages | +| Alert Message Buzzer | Use buzzer for messages | +| Alert Message Vibra | Use vibration for messages | +| Alert Bell | Notify on bell character | +| Output (GPIO) | Pin for notification output | +| Active | High or Low active | +| Duration (ms) | Notification length | +| Use I2S as Buzzer | Use I2S audio output | + +### Store & Forward Module + +Buffers messages for nodes that were temporarily offline, then replays them when those nodes reconnect. Essential for meshes where nodes go in and out of range regularly — ensures messages aren't lost during brief disconnections. + +| Setting | Opis | +| ------------------------------------------ | -------------------------- | +| Enabled | Activate store and forward | +| Heartbeat (s) | Announcement interval | +| Records | Maximum stored messages | +| History Return (max) | Max messages to replay | +| History Return (window) | Time window for replay | + +> 💡 **Tip:** Store and Forward works best on nodes with ample memory (ESP32 with PSRAM). Router nodes are ideal candidates since they're typically always-on. + +### Range Test Module + +Automated range testing tool for evaluating link quality between nodes. When enabled, the node periodically transmits test messages with incrementing counters. A receiver node logs these messages, allowing you to walk or drive away and later analyze at what distance messages stopped arriving. + +| Setting | Opis | +| -------------------------------------- | --------------------------------- | +| Enabled | Activate range testing | +| Sender Interval (s) | Time between test transmissions | +| Save CSV | Log received test data to SD card | + +### Telemetry Module + +Controls what telemetry data your node shares with the mesh. Telemetry includes device health (battery, uptime) and environmental sensor data (temperature, humidity, pressure). + +| Setting | Opis | +| ---------------------------- | --------------------------------------- | +| Device Metrics Interval | How often to report device metrics | +| Environment Metrics Interval | How often to report environment sensors | +| Air Quality Enabled | Report particulate sensor data | +| Power Metrics Enabled | Report power usage | + +See [Telemetry & Sensors](telemetry-and-sensors) for supported sensors and configuration recommendations. + +### Canned Message Module + +Pre-configured messages accessible from the device's physical buttons (for radios with rotary encoders, keypads, or similar input hardware). Define a list of quick-send messages that can be transmitted without a phone connected — ideal for field use. + +| Setting | Opis | +| ------------------ | ----------------------------------------------------------- | +| ~~Enabled~~ | ⚠️ **Deprecated** — current firmware may ignore this toggle | +| Messages | Newline-separated list of messages | +| Send Bell | Play bell sound on send | +| Rotary Encoder | Enable rotary encoder input | +| Up/Down/Press Pins | GPIO pin assignments for input | + +### Audio Module + +Codec2 audio support for low-bandwidth voice communication over the mesh. This is an **experimental** feature that encodes voice into very small data packets using the Codec2 codec. + +| Setting | Opis | +| --------------- | -------------------------------- | +| Enabled | Activate audio module | +| Codec2 Rate | Audio quality/bandwidth tradeoff | +| I2S Word Select | GPIO pin for I2S WS | +| I2S Data In | GPIO pin for I2S DIN | +| I2S Data Out | GPIO pin for I2S DOUT | + +> ⚠️ **Note:** Audio requires specific hardware (I2S microphone and speaker). Voice quality is very low-bandwidth — think "understandable radio voice," not phone-call quality. + +### Remote Hardware Module + +GPIO control over the mesh network. Allows a remote node to read or write GPIO pins on another node — useful for activating relays, reading switches, or controlling external hardware from a distance. + +| Setting | Opis | +| -------------------- | --------------------------------------------------------------- | +| Enabled | Activate remote GPIO access | +| Allow Undefined Pins | Allow access to any GPIO pin (security risk) | + +> ⚠️ **Warning:** Enabling "Allow Undefined Pins" gives remote nodes access to all GPIO pins, which could interfere with the radio's own hardware. Only enable on dedicated GPIO nodes. + +### Neighbor Info Module + +Broadcasts information about directly heard neighbors, enabling mesh topology mapping. Each enabled node periodically shares a list of the other nodes it can hear and their signal quality. + +| Setting | Opis | +| -------------------------------------- | ------------------------------------ | +| Enabled | Activate neighbor broadcasting | +| Update Interval (s) | How often to broadcast neighbor list | + +See [Discovery](discovery) for how to use neighbor data for mesh topology exploration. + +### Ambient Lighting Module + +Controls onboard NeoPixel or other addressable RGB LEDs on supported hardware. Can be used for visual status indicators, notification lights, or decorative effects. + +| Setting | Opis | +| ------------------ | ---------------------------------------------------------- | +| Enabled | Activate LED control | +| LED State | On, Off, or set specific color | +| Red / Green / Blue | Individual color channel values (0–255) | + +### Detection Sensor Module + +Turns your node into a motion or door sensor alert system. When a GPIO pin detects a state change (motion detected, door opened), the node broadcasts an alert message over the mesh. + +| Setting | Opis | +| ---------------------------------------- | ----------------------------------------------------------------------- | +| Enabled | Activate detection sensor | +| Monitor Pin | GPIO pin connected to sensor | +| Detection Triggered High | Trigger when pin goes high (vs. low) | +| Minimum Broadcast (s) | Minimum time between alert broadcasts | +| State Broadcast (s) | Periodic state broadcast interval | +| Send Bell | Include bell character in alerts | +| Friendly Name | Custom name for this sensor | + +### Paxcounter Module + +People counter using WiFi and BLE probe requests. Counts nearby devices by passively listening for probe requests that phones and laptops emit when scanning for networks. Available only on ESP32 devices. + +| Setting | Opis | +| -------------------------------------- | -------------------------- | +| Enabled | Activate people counting | +| Update Interval (s) | How often to report counts | + +> 💡 **Tip:** Paxcounter is useful for estimating foot traffic at trailheads, event venues, or other locations. Counts are approximate — one person may carry multiple devices. + +### TAK Module + +Team Awareness Kit integration for interoperability with ATAK and WinTAK. See [TAK Integration](tak) for detailed setup and usage. + +## Administration + +### Remote Administration + +Remotely configure nodes that share your admin key: + +1. Select the target node in the node list. +2. Navigate to **Settings** for that node. +3. Modify configuration. +4. Tap **Save** — changes are sent over the mesh. + +> ⚠️ **Requires:** Admin key configured on both your node and the target node. + +### Clean Node Database + +Removes stale nodes from your local database that haven't been heard in a configurable time window. + +### Factory Reset + +Resets all settings to factory defaults. **This cannot be undone.** + +### Ponovno pokreni + +Remotely reboot a connected or administered node. + +### Otklanjanje pogrešaka + +View detailed diagnostic information: + +- Protocol buffers debug output +- Mesh packet log +- Connection state details + +### Troubleshooting Remote Admin + +- **"No response from target node"** — the target may be out of range, offline, or have a mismatched admin key. Verify the admin key matches on both nodes. +- **Changes not applying** — some settings require a reboot to take effect. Try the Reboot action after saving. +- **Can't see remote settings** — ensure your node has the admin key for the target node and that Admin Channel is enabled in Security Config. + +## Related Topics + +- [Settings — Radio & User](settings-radio-user) — core radio and user profile settings +- [Module configuration reference](https://meshtastic.org/docs/configuration/module) — detailed module docs on meshtastic.org +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/hr-rHR/user/settings-radio-user.md b/docs/hr-rHR/user/settings-radio-user.md new file mode 100644 index 000000000..7e59ec899 --- /dev/null +++ b/docs/hr-rHR/user/settings-radio-user.md @@ -0,0 +1,173 @@ +--- +title: Settings — Radio & User +nav_order: 7 +last_updated: 2026-05-13 +description: Configure your radio hardware, LoRa presets, user profile, position sharing, power management, and security. +aliases: + - settings + - radio-config + - user-config + - lora +--- + +# Settings — Radio & User + +Configure your radio hardware and user identity parameters. + +## User Settings + +### User Profile + +| Setting | Opis | +| ----------------- | ------------------------------------------------------------------------------------- | +| Long Name | Your display name (up to 39 characters) | +| Short Name | 4-character abbreviated name | +| Licensed Operator | Enable if you hold an amateur radio license (enables higher power) | + +### Applying Changes + +After modifying settings, tap **Save** to write the configuration to your radio. The device may reboot to apply changes. + +## Radio Configuration + +### Device Config + +| Setting | Opis | Zadano | +| ------------------------------------------ | ----------------------------------------------------------------------- | -------- | +| Role | Node behavior (Client, Router, etc.) | Client | +| Rebroadcast Mode | How the node retransmits messages | All | +| Node Info Broadcast (s) | Interval for broadcasting node info | 10800 | +| Double-tap Button | Action for double-tap button press | Disabled | + +### LoRa Config + +| Setting | Opis | Zadano | +| ----------------- | ----------------------------------------------------------------------- | ----------------------------------------- | +| Regija | Regulatory region for frequency bands | Unset (must configure) | +| Modem Preset | Speed/range tradeoff | LongFast | +| Hop Limit | Maximum retransmit hops | 3 | +| TX Power | Transmission power (dBm); 0 = max allowed for region | 0 (region max) | +| Frequency Offset | Fine-tune frequency (MHz) | 0 | +| Channel Bandwidth | Bandwidth setting | Default for preset | + +> ⚠️ **Important:** You **must** set your region before transmitting. Operating without the correct region may violate local radio regulations. See the [region configuration guide](https://meshtastic.org/docs/getting-started/initial-config) on meshtastic.org for details. + +### Modem Presets + +| Preset | Range | Speed | SNR Limit | Best For | +| ------------------ | ----------------------- | ------------------------- | ------------------------ | -------------------------------------------------------------------------------------------------------- | +| Short Turbo | ~1 km | 21.9 kbps | −5 dB | Dense urban with line-of-sight; data-heavy applications | +| Short Fast | ~3 km | 10.9 kbps | −7.5 dB | Urban neighborhoods; buildings within a few blocks | +| Short Slow | ~5 km | 5.5 kbps | −10 dB | Suburban short-range; moderate building density | +| Medium Fast | ~5 km | 5.5 kbps | −10 dB | Suburban areas; moderate building density | +| Medium Slow | ~8 km | 1.1 kbps | −12.5 dB | Suburban/rural; moderate range with slower speed | +| Long Turbo | ~10 km | 4.4 kbps | −10 dB | Similar range to Long Fast but with 500 kHz bandwidth; faster throughput | +| Long Fast | ~10 km | 1.1 kbps | −12.5 dB | **General use (default)** — balanced range and speed | +| Long Moderate | ~20 km | 0.34 kbps | −15 dB | Rural with some terrain; occasional use | +| Lite Fast | ~5 km | 5.5 kbps | −10 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Medium Fast | +| Lite Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Long Fast | +| Narrow Fast | ~5 km | 2.7 kbps | −10 dB | EU 868 MHz band (62.5 kHz BW); avoids interference with other devices | +| Narrow Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 868 MHz band (62.5 kHz BW); comparable to Long Fast | +| ~~Long Slow~~ | ~30 km | 0.18 kbps | −17.5 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | +| ~~Very Long Slow~~ | ~40+ km | 0.09 kbps | −20 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | + +#### Choosing a Modem Preset + +The modem preset controls the fundamental tradeoff between **range** and **data rate**: + +- **Slower presets** use more spreading, making signals decodable at weaker signal levels (lower SNR limit). This means longer range but fewer bytes per second. +- **Faster presets** pack more data per transmission but require a stronger signal to decode. + +**Practical guidance:** + +- **Urban mesh (many nodes, short distances):** Use **Long Fast** (default) or **Short Fast**. Higher speed means less airtime congestion when many nodes share the channel. +- **Rural/sparse mesh (few nodes, long distances):** Use **Long Moderate**. Range matters more than speed when nodes are far apart. +- **EU 866/868 MHz regulatory compliance:** Use **Lite Fast**, **Lite Slow**, **Narrow Fast**, or **Narrow Slow** — these are optimized for the EU SRD/868 MHz bands with narrower bandwidths. +- **Fixed infrastructure links:** Use **Short Turbo** or **Long Turbo** for dedicated point-to-point links with good antennas and line-of-sight. +- **Mixed environments:** Stick with **Long Fast** — it's the community default and ensures compatibility with others in your area. + +> ⚠️ **Important:** All nodes on the same channel **must** use the same modem preset. Nodes with mismatched presets cannot communicate even if they share the same frequency and encryption key. + +> 💡 **Tip:** The range estimates above assume flat terrain and modest antennas. Elevation advantage (hilltop, rooftop) dramatically increases effective range. A well-placed Router with Long Fast can often outperform a ground-level node with Long Slow. + +### Display Config + +| Setting | Opis | +| ------------------- | ------------------------------------------------------------------------------------ | +| Screen Timeout | Time before display sleeps | +| Display Units | Metric or Imperial | +| OLED Type | Auto, SSD1306, SH1106, SH1107 | +| Compass Orientation | Rotation offset for compass display (0°, 90°, 180°, 270°) | +| ~~Compass North~~ | ⚠️ **Deprecated** — replaced by Compass Orientation; still visible in older firmware | + +### Position Config + +| Setting | Opis | +| ----------------------------------------- | ---------------------------------- | +| GPS Enabled | Enable/disable GPS | +| GPS Update Interval | How often to acquire GPS fix | +| Position Broadcast (s) | How often to share position | +| Smart Position | Enable movement-based broadcasting | +| Fixed Position | Use a manually set position | + +### Power Config + +| Setting | Opis | +| --------------------------------------- | --------------------------------------- | +| Power Saving | Enable low-power sleep mode | +| Shutdown After (s) | Auto-shutdown idle timer | +| ADC Multiplier | Battery voltage calibration factor | +| Wait Bluetooth (s) | Time to wait for BLE connection at boot | +| Mesh SDS Timeout (s) | Super-deep-sleep timeout | + +### Network Config + +| Setting | Opis | +| ------------- | ---------------------------------------------------- | +| WiFi Enabled | Enable WiFi radio (ESP32 devices) | +| WiFi SSID | Network name to connect to | +| WiFi PSK | Network password | +| NTP Server | Time synchronization server | +| Syslog Server | Remote logging server | + +![IP address field](/assets/screenshots/settings_ipv4_field.png) + +### Postavke Bluetootha + +| Setting | Opis | +| ----------------- | ------------------------------------------------------------------------- | +| Bluetooth Enabled | Enable/disable BLE radio | +| Pairing Mode | Fixed PIN, Random PIN, or No PIN | +| Fixed PIN | PIN code for pairing (default: 123456) | + +### Security Config + +| Setting | Opis | +| --------------------- | -------------------------------------------------------------------------- | +| Public Key | Your node's public key (read-only) | +| Admin Key | Key for remote administration | +| Private Key | Your node's private key (handle securely) | +| Admin Channel Enabled | Allow admin commands via channel | +| Debug Log | Output live debug logging over serial/bluetooth | +| Serial Enabled | Enable serial console access (moved from Device Config) | +| Managed Mode | Restrict non-admin channel changes | + +![Password field](/assets/screenshots/settings_password_field.png) + +Settings use standard preference controls — dropdowns, toggles, and sliders: + +| Control | Screenshot | +| -------- | ------------------------------------------------------ | +| Dropdown | ![Dropdown](/assets/screenshots/settings_dropdown.png) | +| Toggle | ![Toggle](/assets/screenshots/settings_switch.png) | +| Slider | ![Slider](/assets/screenshots/settings_slider.png) | + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — optional feature modules and device administration +- [Signal Meter](signal-meter) — how modem presets affect signal quality thresholds +- [LoRa configuration](https://meshtastic.org/docs/configuration/radio/lora) — detailed LoRa settings reference on meshtastic.org +- [Initial configuration](https://meshtastic.org/docs/getting-started/initial-config) — region setup guide on meshtastic.org + +--- + diff --git a/docs/hr-rHR/user/signal-meter.md b/docs/hr-rHR/user/signal-meter.md new file mode 100644 index 000000000..d34246d0e --- /dev/null +++ b/docs/hr-rHR/user/signal-meter.md @@ -0,0 +1,81 @@ +--- +title: How the Meshtastic Signal Meter Works +nav_order: 15 +last_updated: 2026-05-13 +description: How the signal meter calculates quality from RSSI and SNR — LoRa spread spectrum, presets, and what the bars really mean. +aliases: + - signal + - signal-meter + - snr + - rssi +--- + +# How the Meshtastic Signal Meter Works + +The Meshtastic signal meter — the familiar bars or status color in the app — is calculated very differently than the "bars" on a traditional cell phone or Wi-Fi router. + +Most consumer devices simply measure how "loud" a signal is. However, because Meshtastic uses **LoRa (Long Range)** technology, its signal meter measures how **clear** the signal is, relative to the specific settings your mesh is using. + +--- + +## 1. The Two Metrics: "Loudness" vs. "Clarity" + +Every time the LoRa radio chip receives a message, it reports two measurements: + +- **RSSI (Received Signal Strength Indicator):** The **loudness** of the raw power hitting your antenna. +- **SNR (Signal-to-Noise Ratio):** The **clarity** of the signal compared to the background static. + +> **Tip — The Analogy:** Imagine you are trying to hear a friend talking to you. +> +> - **RSSI** is how loud their voice is. +> - **The Noise Floor** is the background noise in the room (air conditioning, other people talking, traffic). +> - **SNR** is how easily you can distinguish your friend's voice from the background noise. + +If your friend shouts at you at a deafening rock concert, the signal is incredibly loud (High RSSI), but you still can't understand them because the background noise is louder (Bad SNR). Conversely, if your friend whispers to you in a dead-silent library, the signal is very weak (Low RSSI), but you can understand them perfectly (Great SNR). + +--- + +## 2. The Magic of LoRa: Hearing "Below the Noise Floor" + +For standard radios (like FM or Wi-Fi), if the background noise is louder than the signal (a negative SNR), the receiver just hears static. + +LoRa is special. It uses **"Spread Spectrum"** modulation, which allows the radio to mathematically pull a signal out of the air even when it is buried deep _underneath_ the background noise. This is why you will frequently see **negative SNR numbers** in Meshtastic (e.g., -10 dB, which means the signal is 10 decibels weaker than the background static). + +Depending on which Meshtastic preset you are using (e.g., `LongFast` vs. `ShortFast`), the radio has a specific **SNR Limit** — the absolute maximum amount of noise it can tolerate before the message is completely lost to the static. + +--- + +## 3. How the Signal Meter Calculates Quality + +The Meshtastic apps take both RSSI and SNR and run them through a specific formula to assign your signal a quality rating (None, Bad, Fair, or Good). It specifically scales these values based on the physical limits of the radio preset you are using. + +Here is exactly how the app decides how many bars (or what color) to show you: + +| Level | Bars | Criteria | Meaning | +| ----- | ---- | ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | +| Good | 3 | RSSI better than `-115 dBm` **AND** SNR better than `-7 dB` | Signal is both loud and clear — healthy connection. | +| Fair | 2 | RSSI better than `-126 dBm` with good SNR, **OR** SNR better than `-15 dB` with good RSSI | Signal getting quieter or noisier, but still decodable. | +| Bad | 1 | Falls between Fair and None thresholds | At the edge of range or experiencing interference. | +| None | 0 | RSSI worse than `-126 dBm` **AND** SNR worse than `-15 dB` | Transmission completely buried in noise. | + +--- + +## 4. What This Means for You + +Because Meshtastic's meter acts as a **"Clarity Meter"**, it behaves differently than what most people expect: + +> **Tip — Don't panic over low RSSI:** You might see a seemingly terrible RSSI value like `-118 dBm`. On a cell phone, you would have zero bars. But if you have an SNR of `+2 dB`, Meshtastic will still show a strong signal! _The library is quiet, so the whisper is heard perfectly._ + +> **Warning — Watch out for local noise:** If you hook up a massive antenna and see a great RSSI (e.g., `-90 dBm`) but your signal meter is only showing **1 Bar (Bad)**, you have a problem. It means you have local interference — perhaps a cheap power supply, a noisy computer, or a nearby radio tower — creating so much static that it is drowning out your mesh. + +## Where Signal Information Appears + +In the app, signal data is shown in several places: + +- **Node list** — signal bars icon next to each node +- **Node detail** — SNR, RSSI, and signal quality in the device metrics section +- **Traceroute** — per-hop signal quality for each relay node +- **Signal metrics** — historical SNR and RSSI data in the metrics charts + +![Node entry showing SNR, RSSI values and colored signal bars](/assets/screenshots/nodes_signal_info.png) + diff --git a/docs/hr-rHR/user/tak.md b/docs/hr-rHR/user/tak.md new file mode 100644 index 000000000..f7736efe0 --- /dev/null +++ b/docs/hr-rHR/user/tak.md @@ -0,0 +1,126 @@ +--- +title: TAK Integration +nav_order: 10 +last_updated: 2026-05-13 +description: Interoperate with ATAK and WinTAK — CoT position sharing, TAK roles, and plugin setup. +aliases: + - tak + - atak + - team-awareness-kit +--- + +# TAK Integration + +Meshtastic integrates with the Team Awareness Kit (TAK) ecosystem, enabling interoperability between Meshtastic mesh devices and TAK applications like ATAK and WinTAK. + +## Overview + +The TAK module allows Meshtastic nodes to: + +- Share position data in TAK-compatible CoT (Cursor on Target) format +- Appear as team members on TAK map displays +- Receive TAK PLI (Position Location Information) messages + +## Setup + +### Prerequisites + +- ATAK (Android Team Awareness Kit) or WinTAK installed +- Meshtastic ATAK Plugin installed +- TAK module enabled on your Meshtastic radio + +### Configuration + +1. Navigate to **Settings → Module Config → TAK**. +2. Enable the TAK module. +3. Configure the TAK team/group settings: + +![Module toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | Opis | +| ------- | -------------------------- | +| Enabled | Activate TAK interop | +| Mode | TAK-compatible output mode | + +### ATAK Plugin Setup + +1. Install the Meshtastic ATAK Plugin from the plugin repository. +2. Open ATAK and enable the Meshtastic plugin. +3. The plugin bridges messages between ATAK and your mesh network. + +## TAK Roles + +Nodes configured with TAK-related roles behave differently from standard clients: + +| Role | Opis | +| --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **TAK** | Full TAK interoperability — sends and receives CoT data, chat messages, and PLI updates. Functions as a standard client plus TAK bridge. | +| **TAK Tracker** | Position-only TAK output — automatically broadcasts PLI at regular intervals without user interaction. Optimized for unattended position beacons (vehicles, equipment, waypoints). Does not relay chat messages. | + +> 💡 **Tip:** Use **TAK Tracker** for devices that only need to report position (e.g., a radio mounted in a vehicle). Use **TAK** for devices where users actively participate in TAK operations. + +### CoT (Cursor on Target) Format + +TAK messages use the Cursor on Target XML format — a military standard for sharing situational awareness data. Meshtastic converts its internal protobuf messages to CoT format when bridging to TAK systems, so no manual format conversion is needed. + +## TAK Identity + +When using TAK roles, your node broadcasts identity information that appears on TAK maps: + +| Setting | Opis | +| -------- | ---------------------------------------------------------------------------------------------------------------- | +| Team | Your team color on the TAK map (e.g., Blue, Red, Cyan, Green) | +| Role | Your operational role (Team Member, Team Lead, HQ, Medic, RTO, etc.) | +| Callsign | Your TAK callsign (defaults to your Meshtastic long name) | + +These settings appear in **Settings → Module Config → TAK** when the TAK module is enabled. + +> 💡 **Tip:** Team/role colors are the standard TAK affiliation colors. Coordinate with your TAK team to use consistent team assignments. + +## Wire Format (V1 / V2) + +Meshtastic supports two TAK wire formats: + +| Format | Compatibility | Features | +| ------------------------------- | --------------------------------------------------------------- | --------------------------------------------------------- | +| V1 (Legacy) | ATAK Plugin v1.x, older firmware | Basic CoT position sharing only | +| V2 (Current) | ATAK Plugin v2.x, firmware 2.3+ | Full CoT support including chat, routes, zstd compression | + +The app automatically selects V2 when both sides support it. No manual configuration needed — the TAK module negotiates format based on firmware capabilities. + +## Usage with ATAK + +Once configured: + +- Meshtastic nodes appear as markers on the ATAK map with callsign labels +- Chat messages can bridge between mesh and TAK networks +- Position updates flow bidirectionally between Meshtastic and TAK +- TAK Tracker nodes broadcast PLI automatically — their positions appear on ATAK maps without any ATAK-side configuration + +> ⚠️ **Note:** TAK integration requires specific node roles and module configuration. Standard client nodes don't automatically participate in TAK operations. + +## Troubleshooting + +| Problem | Cause | Solution | +| -------------------------------- | ------------------------------------- | ----------------------------------------------------------------------- | +| Node doesn't appear on ATAK map | TAK module disabled or wrong role | Verify TAK module is enabled and node role is TAK or TAK Tracker | +| Position updates are stale | GPS fix lost or interval too long | Check GPS status; reduce position broadcast interval in Position Config | +| ATAK plugin shows "disconnected" | BLE connection lost or plugin crashed | Reconnect Bluetooth in Meshtastic app, then restart ATAK plugin | +| Chat messages not bridging | V1 format doesn't support chat | Ensure both nodes run firmware 2.3+ for V2 wire format | +| CoT data not flowing | Channel mismatch | All TAK nodes must be on the same channel with matching encryption | + +## Security Considerations + +- TAK data shares your position and callsign information +- Ensure your channel encryption is configured when using TAK in sensitive environments +- The TAK module respects the same channel encryption as other Meshtastic messages + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — TAK module configuration +- [Nodes](nodes) — TAK and TAK Tracker roles in the node list +- [Map & Waypoints](map-and-waypoints) — node positions on the map +- [ATAK plugin guide](https://meshtastic.org/docs/software/integrations/atak-plugin) — detailed ATAK setup on meshtastic.org + +--- + diff --git a/docs/hr-rHR/user/telemetry-and-sensors.md b/docs/hr-rHR/user/telemetry-and-sensors.md new file mode 100644 index 000000000..07aa1c1c4 --- /dev/null +++ b/docs/hr-rHR/user/telemetry-and-sensors.md @@ -0,0 +1,118 @@ +--- +title: Telemetry & Sensors +nav_order: 9 +last_updated: 2026-05-13 +description: Sensor data on the mesh — supported environment, air quality, and power sensors, plus configuration and viewing guides. +aliases: + - sensors + - environment + - weather + - power-metrics +--- + +# Telemetry & Sensors + +Meshtastic nodes can collect and share sensor data across the mesh network. + +## Overview + +Telemetry allows nodes equipped with sensors to broadcast environmental, power, and device health information. This data is visible on the node detail screen and can be logged over time. + +## Device Telemetry + +All Meshtastic nodes report basic device telemetry: + +| Metric | Opis | Typical Range | +| ------------------- | ------------------------------ | ------------------------------------------------------------------ | +| Battery Level | Charge percentage | 0–100% | +| Voltage | Battery voltage | 3.0–4.2V (LiPo) | +| Channel Utilization | % of airtime used locally | 0–100% | +| Air Utilization TX | % of airtime used by this node | 0–100% | +| Uptime | Seconds since last boot | Varies | + +## Environment Sensors + +Supported environmental sensors: + +### Temperature & Humidity + +| Sensor | Temperature | Humidity | Pressure | Notes | +| ------- | ----------- | -------- | -------- | ----------------------- | +| BME280 | ✓ | ✓ | ✓ | Recommended all-in-one | +| BME680 | ✓ | ✓ | ✓ | Adds gas resistance/IAQ | +| SHT31 | ✓ | ✓ | — | High accuracy | +| MCP9808 | ✓ | — | — | Precision temperature | +| LPS22 | — | — | ✓ | Pressure only | + +### Air Quality + +| Sensor | Metric | Notes | +| -------- | -------------------------------------------------- | -------------------------- | +| BME680 | Gas Resistance / IAQ | Volatile organic compounds | +| PMSA003I | PM1.0, PM2.5, PM10 | Particulate matter | +| SEN55 | PM, NOx, VOC, Temp, Humidity | Multi-sensor | + +### Light & UV + +| Sensor | Metric | +| -------- | -------------------------------------- | +| OPT3001 | Ambient light (lux) | +| VEML7700 | Ambient light (lux) | +| LTR390 | UV index | + +## Power Metrics + +Nodes with INA-series power sensors can report: + +| Metric | Opis | +| ----------- | ----------------------------------------- | +| Bus Voltage | Supply rail voltage | +| Current | Power consumption (mA) | +| Power | Calculated power (mW) | + +Useful for monitoring solar charging or battery health on remote nodes. + +## Configuring Telemetry + +1. Navigate to **Settings → Module Config → Telemetry**. +2. Set reporting intervals: + - **Device Metrics Interval** — how often to broadcast device metrics + - **Environment Metrics Interval** — how often to broadcast sensor data +3. Enable specific sensor types as needed. + +### Recommended Intervals + +| Use Case | Device (s) | Environment (s) | +| ------------------------------------------ | ----------------------------- | ---------------------------------- | +| Urban mesh (many nodes) | 3600 | 3600 | +| Rural mesh (few nodes) | 900 | 900 | +| Weather station | 900 | 300 | +| Battery conservation | 7200 | 7200 | + +> ⚠️ **Note:** Shorter intervals increase airtime usage and battery drain across the mesh. + +## Viewing Telemetry + +1. Navigate to **Nodes** and select a node. +2. Telemetry sections show on the detail screen: + - Device Metrics (always available) + - Environment Metrics (if sensors present) + - Power Metrics (if INA sensor present) +3. Historical graphs show trends over time. + +![Telemetry actions](/assets/screenshots/node-metrics_telemetric_actions.png) + +## Troubleshooting + +- **No environment data showing?** The remote node needs a physical sensor connected (e.g., BME280 on I2C). Device telemetry (battery, uptime) is always available, but environment metrics require hardware. +- **Stale readings?** Check the reporting interval — very long intervals (7200s+) mean data updates infrequently. Also verify the remote node is still online. +- **Sensor conflict on I2C bus?** Some sensors share I2C addresses. If you have multiple sensors on the same bus, check for address collisions in the radio's serial debug output. + +## Related Topics + +- [Node Metrics](node-metrics) — view telemetry data on the node detail screen +- [Settings — Modules & Admin](settings-module-admin) — telemetry module configuration +- [Units & Locale](units-and-locale) — temperature and pressure display units + +--- + diff --git a/docs/hr-rHR/user/translate.md b/docs/hr-rHR/user/translate.md new file mode 100644 index 000000000..b2ed79a34 --- /dev/null +++ b/docs/hr-rHR/user/translate.md @@ -0,0 +1,97 @@ +--- +title: Translate the App +parent: User Guide +nav_order: 17 +last_updated: 2026-05-13 +aliases: + - translate + - crowdin + - localization +--- + +# Translate the App + +Contributing translations helps make Meshtastic accessible to a wider audience. The app uses [Crowdin](https://crowdin.com/) to manage community translations for both the user interface and in-app documentation. + +--- + +## What Gets Translated + +| Resource | Source Location | Notes | +| ----------------- | ------------------------------------- | ---------------------------------------------------------------------- | +| UI strings | `composeResources/values/strings.xml` | Buttons, labels, messages, and all user-visible text | +| User Guide pages | `docs/user/*.md` | In-app documentation shown in Help & Documentation | +| Fastlane metadata | `fastlane/metadata/android/en-US/` | App Store listing title, description, and changelogs | + +> **Note — Developer Guide pages are English-only.** Code-focused documentation targeting contributors is not translated. + +--- + +## How to Contribute + +1. **Visit the Crowdin project.** Open the [Meshtastic Android Crowdin project](https://crowdin.com/project/meshtastic-android) and sign in or create a free account. +2. **Choose your language.** Select an existing language or request a new one by opening a [GitHub issue](https://github.com/meshtastic/Meshtastic-Android/issues/new). +3. **Translate strings.** Crowdin shows the English source on the left and your translation on the right. Translate each string and save. +4. **Review context.** Many strings include screenshots or context comments — check these to understand where the text appears in the app. +5. **Submit.** Approved translations are automatically merged into the next release. + +> **Tip — Keep translations short.** UI strings often appear in buttons, chips, or narrow columns. If a translation is significantly longer than the English original, consider abbreviating where the meaning stays clear. + +--- + +## Adding a New Language + +If your language is not yet listed on Crowdin: + +1. Open an issue on [GitHub](https://github.com/meshtastic/Meshtastic-Android/issues/new) requesting the new locale. +2. A maintainer will add the language to Crowdin and configure `crowdin.yml`. +3. Once added, you can begin translating immediately. + +--- + +## How Translations Are Organized + +The Android app uses **Compose Multiplatform resources** for all user-visible strings: + +``` +core/resources/src/commonMain/composeResources/ +├── values/ ← English (default) +│ └── strings.xml +├── values-de/ ← German +│ └── strings.xml +├── values-fr/ ← French +│ └── strings.xml +└── ... +``` + +In-app documentation follows a similar pattern under `docs/`: + +``` +docs/ +├── user/ ← English source (default) +│ ├── onboarding.md +│ └── ... +├── fr/user/ ← French translations +│ ├── onboarding.md +│ └── ... +└── ... +``` + +The app automatically selects the correct locale based on your device's **Language & Region** settings. + +--- + +## Translation Guidelines + +- **Do not translate** technical terms like "LoRa", "MQTT", "BLE", "TAK", "SNR", or "RSSI" — these are universal. +- **Keep placeholders intact.** Strings like `%1$s` or `%d` are filled in at runtime. Do not remove or reorder them unless the grammar of your language requires it. +- **Match tone.** The app uses a friendly, direct voice. Avoid overly formal language. +- **Test if possible.** Switch your device language and open the app to see how translations look in context. + +--- + +## Questions? + +If you have questions about a specific string's context or need help getting started, open a discussion on the [Meshtastic GitHub Discussions](https://github.com/meshtastic/Meshtastic-Android/discussions) page. + +Thank you for helping expand the reach of Meshtastic! diff --git a/docs/hr-rHR/user/units-and-locale.md b/docs/hr-rHR/user/units-and-locale.md new file mode 100644 index 000000000..5f391111d --- /dev/null +++ b/docs/hr-rHR/user/units-and-locale.md @@ -0,0 +1,118 @@ +--- +title: Units, Measurement & Locale +parent: User Guide +nav_order: 16 +last_updated: 2026-05-12 +--- + +# Units, Measurement & Locale + +The Meshtastic app automatically displays temperatures, distances, speeds, and times in the units your device is configured to use — no settings to change inside the app. + +--- + +## How It Works + +Meshtastic radios always transmit data in **metric units** (meters, °C, km/h, hPa, etc.). When the app receives this data, it uses the `MetricFormatter` utility to convert and display values in whatever unit system your device's locale specifies. + +On Android, your measurement preferences are determined by your system **Language & Region** settings. On Desktop (JVM), the app uses the JVM's default `Locale`. + +> **Tip — You never need to toggle units inside the app.** Change your system measurement preferences and every screen in Meshtastic updates automatically — node details, telemetry charts, weather, altitude, and more. + +--- + +## Temperature + +Temperature values from environment sensors are transmitted as **°C** and displayed based on your device's temperature unit preference. + +![Environment metrics with temperature](/assets/screenshots/nodes_environment_metrics.png) + +| Your Setting | You See | +| ------------ | ------- | +| Celsius | 22°C | +| Fahrenheit | 72°F | + +This affects all temperature displays throughout the app: node environment telemetry, soil temperature, dew point, and telemetry chart axes. + +## Distance & Altitude + +Distances between nodes and GPS altitudes are transmitted as **meters** and automatically scaled and converted. + +![Distance info display](/assets/screenshots/nodes_distance_info.png) + +| Your Setting | Small Distance | Large Distance | Altitude | +| -------------------------------- | -------------- | ---------------------- | -------- | +| Metric | 350 m | 2.5 km | 1,200 m | +| Imperial (US) | 1,148 ft | 1.6 mi | 3,937 ft | + +The app uses natural scaling — short distances stay in meters or feet, while longer distances switch to kilometres or miles automatically. + +### Where these appear + +- **Node list** — distance and bearing to each node +- **Node detail** — altitude, distance from your position +- **Map** — waypoint distances, traceroute hop distances +- **Compass** — distance to selected node + +## Speed + +GPS ground speed is displayed in your locale's preferred speed unit. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Metric | 12 km/h | +| Imperial (US) | 7 mph | + +## Wind + +Wind speed and gust data from environment sensors are transmitted as **m/s** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Metric | 5 m/s | +| Imperial (US) | 11 mph | + +Wind readings appear in the **Node Detail** environment section and the **Environment Telemetry** charts. + +## Rainfall + +Rainfall measurements (1-hour and 24-hour totals) are transmitted as **mm** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ---------------------- | +| Metric | 12 mm | +| Imperial (US) | 0.5 in | + +## Units That Never Change + +Some units are international standards and are displayed the same way regardless of your locale: + +| Measurement | Unit | Why | +| -------------------------------- | ------------------------------ | ------------------------------------- | +| Barometric pressure | hPa | International meteorological standard | +| Heading / bearing | ° (degrees) | Universal navigation convention | +| Radiation | μR/hr | Standard dosimetry unit | +| GPS coordinates | decimal degrees | Universal geographic standard | +| Humidity, battery, soil moisture | % | Universal | + +## Date & Time + +All timestamps throughout the app — last heard, message times, telemetry logs, chart axes — follow your device's date and time preferences. + +| Setting | What It Controls | Example | +| ---------------- | ---------------- | ------------------------------------------------ | +| **24-Hour Time** | Clock format | 14:30 vs 2:30 PM | +| **Date Format** | Date ordering | 09/05/2026 vs 05/09/2026 | + +The app also uses **relative time** where it makes sense — for example, "5 min ago" or "2 hours ago" in the node list — which is automatically localised into your device language. + +## Changing Your Measurement System (Android) + +On Android, your measurement system (metric vs imperial) is tied to your region setting: + +1. Open **Android Settings → System → Language & Region** +2. Change your **Region** or **Measurement units** preference +3. Return to Meshtastic — values update immediately + +> **Tip — The app uses `MetricFormatter` from `core:common`.** All measurement formatting is handled by a shared KMP utility that respects your platform's locale. Developers adding new measurement displays should use `MetricFormatter` rather than hard-coding unit conversions. + diff --git a/docs/ht-rHT/index.md b/docs/ht-rHT/index.md new file mode 100644 index 000000000..a9c75570d --- /dev/null +++ b/docs/ht-rHT/index.md @@ -0,0 +1,30 @@ +--- +title: Home +layout: default +nav_order: 0 +--- + +# Meshtastic Android App Documentation + +User and developer documentation for the Meshtastic Android, Desktop, and iOS applications powered by KMP (Kotlin Multiplatform). + +Use the sidebar navigation to browse the **User Guide** for app features and the **Developer Guide** for contributing to the project. + +--- + +## Quick Links + +| Guide | Deskripsyon | +| --------------------------------------------------------------------- | -------------------------------------------------------------- | +| [Getting Started](user/onboarding) | Connect your first radio and send a message | +| [Messages & Channels](user/messages-and-channels) | Channel broadcasts, direct messages, reactions, and encryption | +| [Nodes](user/nodes) | Understanding the mesh network node list | +| [Signal Meter](user/signal-meter) | How the LoRa signal quality meter works | +| [Units & Locale](user/units-and-locale) | How temperatures, distances, and times adapt to your region | +| [Desktop App](user/desktop) | Linux, macOS, and Windows desktop usage | +| [Architecture](developer/architecture) | App architecture overview for contributors | +| [Contributing](developer/contributing) | Branch naming, PR workflow, and verification commands | + +--- + +> This documentation is served from the same markdown source that powers the in-app **Help & Documentation** browser. diff --git a/docs/ht-rHT/user/connections.md b/docs/ht-rHT/user/connections.md new file mode 100644 index 000000000..6c093f52c --- /dev/null +++ b/docs/ht-rHT/user/connections.md @@ -0,0 +1,125 @@ +--- +title: Connections +nav_order: 2 +last_updated: 2026-05-13 +description: Connect your phone or desktop to a Meshtastic radio via Bluetooth, USB, or TCP/IP. +aliases: + - bluetooth + - usb + - tcp + - pairing +--- + +# Connections + +Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node. + +## Bluetooth (BLE) + +Bluetooth Low Energy is the default and most common connection method on Android. + +### Pairing a Device + +1. Ensure your Meshtastic radio is powered on and in pairing mode. +2. Open the app and navigate to **Connections**. +3. Tap **Scan for Devices** — nearby Meshtastic radios will appear. +4. Select your device from the list. +5. Accept the Bluetooth pairing prompt if shown. + +![Device list item](/assets/screenshots/connections_bluetooth_scan.png) + +You can filter devices by transport type using the filter chips at the top: + +![Transport filter chips](/assets/screenshots/connections_transport_filters.png) + +> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. + +### Connection Status + +| Icon | State | Deskripsyon | +| ---- | -------------- | ----------------------------- | +| 🟢 | Connected | Active radio link established | +| 🟡 | Connecting | Handshake in progress | +| 🔴 | Dekonekte | No active connection | +| ⚪ | Not configured | No device selected | + +When connecting, a status indicator shows the current connection state: + +![Connecting status](/assets/screenshots/connections_connecting.png) + +If no devices are found, the app shows an empty state with instructions: + +![No devices found](/assets/screenshots/connections_empty_state.png) + +### Troubleshooting Bluetooth + +- **Device not found:** Toggle Bluetooth off/on, ensure location is enabled. +- **Connection drops:** Move closer to the radio; check for interference. +- **Pairing rejected:** Forget the device in Android Bluetooth settings and retry. + +## USB Serial + +USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable. + +### Setup + +1. Connect your radio via USB cable to your device. +2. The app will prompt for USB permission — tap **Allow**. +3. The connection is established automatically. + +> ⚠️ **Note:** USB connections require OTG support on Android devices. + +## TCP/IP (WiFi) + +Some Meshtastic radios support WiFi connectivity, allowing TCP-based connections. + +### Configuration + +1. Connect your radio to a WiFi network via the radio's web interface or settings. +2. In the app, go to **Connections → TCP**. +3. Enter the radio's IP address and port (default: 4403). +4. Tap **Connect**. + +![WiFi scanning for devices](/assets/screenshots/connections_wifi_scanning.png) + +When a device is found, it appears in the connection list: + +![WiFi device found](/assets/screenshots/connections_wifi_device_found.png) + +A successful connection is confirmed with a status indicator: + +![WiFi connection success](/assets/screenshots/connections_wifi_success.png) + +### When to Use TCP + +- Radio is on the same local network +- Testing with a simulated radio +- Environments where Bluetooth has interference issues + +## Reconnection Behavior + +The app reconnects to the **last selected device** on startup. You can manually switch transports from the connections screen at any time. + +To disconnect from a radio, use the disconnect button on the connections screen: + +![Disconnect from radio](/assets/screenshots/connections_disconnect.png) + +## Desktop Connections + +On Desktop (Linux/macOS/Windows), the app supports: + +- **Bluetooth (BLE)** — via the Kable library; works on macOS, Linux, and Windows +- **USB Serial** — primary wired connection method +- **TCP/IP** — for network-connected radios + +See [Desktop App](desktop) for platform-specific details and keyboard shortcuts. + +## Related Topics + +- [Getting Started](onboarding) — first-launch setup and permissions +- [Settings — Radio & User](settings-radio-user) — Bluetooth and network configuration +- [Desktop App](desktop) — desktop-specific connection details +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — full list of compatible radios on meshtastic.org + +--- + diff --git a/docs/ht-rHT/user/desktop.md b/docs/ht-rHT/user/desktop.md new file mode 100644 index 000000000..a688679eb --- /dev/null +++ b/docs/ht-rHT/user/desktop.md @@ -0,0 +1,147 @@ +--- +title: Desktop App +nav_order: 14 +last_updated: 2026-05-13 +description: Install and use the Meshtastic Desktop app on Linux, macOS, and Windows — connections, feature parity, and keyboard shortcuts. +aliases: + - desktop + - linux + - macos + - windows + - jvm +--- + +# Desktop App + +The Meshtastic Desktop application provides the same mesh communication features on Linux, macOS, and Windows. + +## Overview + +The Desktop app shares its core codebase with the Android app through Kotlin Multiplatform (KMP). Most features work identically across platforms. + +## Installation + +### Linux + +- Download the `.deb` or `.AppImage` package from the releases page +- Or build from source using `./gradlew :desktopApp:run` + +### macOS + +- Download the `.dmg` package from releases +- Or build from source + +### Windows + +- Download the `.msi` installer from releases +- Or build from source + +## Connecting Your Radio + +### USB Serial (Primary) + +The most reliable connection method on Desktop: + +1. Connect your Meshtastic radio via USB cable. +2. The app should detect the serial port automatically. +3. If not detected, select the correct serial port from the connections menu. + +### TCP/IP + +For network-connected radios: + +1. Enter the radio's IP address and port (default: 4403). +2. Click **Connect**. + +### Bluetooth (BLE) + +Bluetooth Low Energy is supported on Desktop via the [Kable](https://github.com/JuulLabs/kable) library: + +1. Ensure your system has a Bluetooth adapter. +2. The app scans for nearby Meshtastic radios automatically. +3. Select your device from the connections screen. + +## Feature Parity + +| Feature | Android | Desktop | Notes | +| ---------------------------------------- | ------- | ------- | -------------------------- | +| Messaging | ✓ | ✓ | Full parity | +| Node List | ✓ | ✓ | Full parity | +| Map | ✓ | ✓ | Full parity | +| Settings | ✓ | ✓ | Full parity | +| Bluetooth (BLE) | ✓ | ✓ | Via Kable on desktop | +| Firmware Update OTA | ✓ | ✗ | Use web flasher | +| Notifications | ✓ | ✓ | Native OS notifications | +| Widgets | ✓ | ✗ | Android-only | +| AI Assistant (Chirpy) | ✓\* | ✗ | Google flavor Android only | + +\*Chirpy AI requires Android 14+ on Google flavor builds with supported hardware. + +## UI Differences + +The Desktop app uses the same Compose Multiplatform UI with adaptations for larger screens and desktop interaction. + +### Keyboard Shortcuts + +| Shortcut | Action | +| ------------------- | --------------------------- | +| **⌘Q** / **Ctrl+Q** | Quit the application | +| **⌘,** / **Ctrl+,** | Open Settings | +| **⌘1** / **Ctrl+1** | Switch to Conversations tab | +| **⌘2** / **Ctrl+2** | Switch to Nodes tab | +| **⌘3** / **Ctrl+3** | Switch to Map tab | +| **⌘4** / **Ctrl+4** | Switch to Connections tab | + +### Window & System Tray + +- **Window resizing** — responsive layout adapts to window dimensions +- **System tray** — minimize to system tray for background mesh operation +- **Tray menu** — right-click the tray icon to show window or quit +- **Mouse interaction** — hover states and standard desktop navigation + +### Notification Preferences + +The Desktop app provides in-app toggles for controlling which notifications are shown — messages, new nodes, and low battery alerts. Access these from **Settings → Notifications** within the app. + +## Built-in Documentation Browser + +The Desktop app includes a built-in documentation browser for quick access to help content without leaving the application. + +![Docs browser with table of contents](/assets/screenshots/docs-browser_toc.png) + +The browser supports full-text search across all documentation: + +![Searching the docs browser](/assets/screenshots/docs-browser_search.png) + +Individual doc pages render with full formatting: + +![A documentation page](/assets/screenshots/docs-browser_page.png) + +## Building from Source + +```bash +git clone https://github.com/meshtastic/Meshtastic-Android.git +cd Meshtastic-Android +git submodule update --init +./gradlew :desktopApp:run +``` + +Requirements: + +- JDK 21 +- No Android SDK required for desktop-only builds + +## Known Limitations + +- No OTA firmware updates (use web flasher) +- Some Android-specific features (widgets, specific notification channels) are unavailable +- Performance may vary on low-spec hardware running Compose Desktop +- BLE bonding is not yet supported on desktop (pairing works without bonding) + +## Related Topics + +- [Connections](connections) — connection methods overview +- [Firmware Updates](firmware) — use the [Web Flasher](https://flasher.meshtastic.org) for desktop firmware updates + +--- + diff --git a/docs/ht-rHT/user/discovery.md b/docs/ht-rHT/user/discovery.md new file mode 100644 index 000000000..fe696299b --- /dev/null +++ b/docs/ht-rHT/user/discovery.md @@ -0,0 +1,114 @@ +--- +title: Discovery +nav_order: 12 +last_updated: 2026-05-13 +description: Explore your mesh network — traceroute paths, neighbor maps, and node discovery tools. +aliases: + - mesh-discovery + - local-discovery + - network-scan + - traceroute + - neighbor-info +--- + +# Discovery + +Discovery tools help you understand **how** your mesh network is connected — which nodes can hear each other, what paths messages take, and where bottlenecks or weak links exist. + +> 💡 **Tip:** You don't need a dedicated "discovery mode" to start exploring your mesh. The tools below are available right now from the node list and node detail screens. + +--- + +## Traceroute + +Traceroute reveals the exact path a message takes from your node to any other node on the mesh. It's the single most useful tool for debugging connectivity problems. + +### Running a Traceroute + +1. Navigate to **Nodes** and tap the node you want to trace. +2. On the node detail screen, tap **Traceroute**. +3. The app sends a traceroute request and waits for the response. +4. Results display each hop in order, with signal quality at every step. + +### Reading the Results + +A traceroute result looks like this: + +``` +You → Node A (SNR: 8.5, RSSI: -95) → Node B (SNR: 5.2, RSSI: -108) → Target +``` + +Each hop represents a relay node that forwarded the message. The SNR and RSSI values at each hop tell you about the link quality on that specific segment. + +| What to look for | What it means | +| -------------------------------------------------------------------------- | --------------------------------------------------------------------------- | +| All hops show Good SNR (> 5 dB) | Healthy path — messages flow reliably | +| One hop shows Bad SNR (< 0 dB) | Weak link — this relay segment is fragile | +| Many hops (4+) | Long path — consider repositioning a node to shorten it | +| Different path on retry | Mesh is adapting — multiple routes exist (this is good!) | + +> 💡 **Tip:** Run traceroute several times over a few minutes. If the path changes, your mesh has redundant routes — a sign of a well-connected network. + +### Troubleshooting with Traceroute + +- **"No route found"** — The target node may be offline, out of range, or on a different channel. Check that both nodes share at least one channel with the same encryption key. +- **Traceroute times out** — The path may be too long (exceeds hop limit) or a relay node is congested. Try increasing the hop limit in **Settings → LoRa Config**. +- **Asymmetric paths** — A traceroute from A→B may take a different path than B→A. This is normal — radio propagation is not always symmetric. + +--- + +## Neighbor Info + +The Neighbor Info module lets each node broadcast a list of the nodes it can **directly hear** (single-hop). When multiple nodes share their neighbor lists, you can piece together a topology map of the entire mesh. + +### Enabling Neighbor Info + +1. Navigate to **Settings → Module Config → Neighbor Info**. +2. Enable the module. +3. Set the broadcast interval (default: 900 seconds / 15 minutes). + +Once enabled, your node periodically broadcasts its neighbor table. Other nodes with Neighbor Info enabled do the same. + +### Viewing Neighbor Data + +- Open any node's detail screen and look for the **Neighbors** section. +- Each neighbor entry shows the node that was directly heard and its signal quality. +- Combine neighbor data from multiple nodes to understand the full mesh topology. + +> ⚠️ **Note:** Neighbor Info increases airtime usage because every enabled node periodically broadcasts its neighbor list. On busy meshes with many nodes, consider longer broadcast intervals (3600 seconds or more) to avoid congestion. + +--- + +## Node List as a Discovery Tool + +The node list itself is a powerful discovery tool when you use its filtering and sorting features effectively. + +### Finding New Nodes + +- Sort by **Last heard** to see the most recently active nodes at the top. +- Enable **Include unknown** to see nodes that have appeared on the mesh but haven't sent user info yet — these are often newly powered-on devices. + +### Assessing Connectivity + +- Sort by **Hops away** to see which nodes are directly reachable (0 hops) versus relayed. +- Sort by **Distance** to find nearby nodes and verify they're reachable. +- Use **Exclude MQTT** to focus on nodes reachable over radio (not via internet bridge). + +### Infrastructure Audit + +- Disable **Exclude infrastructure** to see Router, Repeater, Router Late, and Client Base nodes. +- Check their signal quality and last-heard times to verify your infrastructure nodes are healthy. + +See [Nodes](nodes) for full details on filtering and sorting options. + +--- + +## Tips for Mesh Exploration + +- **Start with traceroute** — it gives you immediate, actionable information about a specific path. +- **Enable Neighbor Info on key nodes** — especially routers and repeaters, to build a picture of the backbone. +- **Check the map** — node positions on the [Map](map-and-waypoints) combined with signal data help you understand why some links are strong and others are weak. +- **Compare signal over time** — use the [Signal Meter](signal-meter) guide to interpret SNR and RSSI values correctly. + +--- + diff --git a/docs/ht-rHT/user/firmware.md b/docs/ht-rHT/user/firmware.md new file mode 100644 index 000000000..613df9f53 --- /dev/null +++ b/docs/ht-rHT/user/firmware.md @@ -0,0 +1,114 @@ +--- +title: Firmware Updates +nav_order: 13 +last_updated: 2026-05-13 +description: Update your radio firmware over Bluetooth — OTA process, version channels, pre-flight checks, and recovery. +aliases: + - firmware + - update + - ota + - flash +--- + +# Firmware Updates + +Keep your Meshtastic radio up to date with the latest firmware for new features, bug fixes, and security improvements. + +## Checking for Updates + +1. Navigate to **Settings → Firmware Update** or tap the firmware notification if shown. +2. The app checks for available firmware versions. +3. Available updates show the version number and changelog summary. + +## Update Methods + +### OTA (Over-The-Air) via Bluetooth + +The most common update method for Android users: + +1. Ensure your radio is connected via Bluetooth. +2. Navigate to the Firmware Update screen. +3. Select the desired firmware version. +4. Tap **Update** to begin the OTA process. +5. Wait for the update to complete — **do not disconnect** during the update. + +![Firmware checking for updates](/assets/screenshots/firmware_checking.png) + +> ⚠️ **Warning:** Interrupting a firmware update can brick your device. Ensure your radio has sufficient battery (>50% recommended) and maintain Bluetooth proximity during the entire process. + +![Firmware disclaimer](/assets/screenshots/firmware_disclaimer.png) + +### USB Flashing + +For recovery or when OTA is unavailable: + +- Use the [Meshtastic Web Flasher](https://flasher.meshtastic.org) +- Or the [Meshtastic CLI tool](https://meshtastic.org/docs/getting-started/flashing-firmware) on desktop + +## Version Channels + +| kanal | Deskripsyon | +| ------ | ------------------------------------------- | +| Stable | Recommended for most users; tested releases | +| Alpha | Preview releases; may contain bugs | + +## Pre-Update Checklist + +Before updating: + +- [ ] Battery > 50% +- [ ] Stable Bluetooth connection +- [ ] Note your current settings (they may reset on major version changes) +- [ ] Check the release notes for breaking changes + +## Post-Update + +After a successful update: + +- The radio will reboot automatically +- Bluetooth connection will re-establish +- Verify your settings are intact +- Check the firmware version in **Settings → About** + +![Firmware update success](/assets/screenshots/firmware_success.png) + +## Troubleshooting + +### Update Stuck + +If the update appears frozen: + +- Wait at least 5 minutes before intervening +- If truly stuck, power-cycle the radio +- Attempt the update again + +![Firmware update error](/assets/screenshots/firmware_error.png) + +### Device Won't Boot After Update + +If your device fails to boot: + +1. Try connecting via USB to a computer +2. Use the web flasher in recovery/DFU mode +3. Flash a known-good firmware version +4. Check the Meshtastic Discord for device-specific recovery steps + +### Compatibility Warnings + +The app may show warnings when: + +- Connected radio firmware is below minimum supported version +- Major version mismatch between app and firmware +- Deprecated features need migration + +> ⚠️ **Important:** Always update the Meshtastic app before or alongside firmware updates to ensure compatibility. + +## Related Topics + +- [Connections](connections) — reconnecting after a firmware update +- [Flashing firmware guide](https://meshtastic.org/docs/getting-started/flashing-firmware) — full firmware flashing walkthrough on meshtastic.org +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — check firmware compatibility by device +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/ht-rHT/user/map-and-waypoints.md b/docs/ht-rHT/user/map-and-waypoints.md new file mode 100644 index 000000000..7d0ee6841 --- /dev/null +++ b/docs/ht-rHT/user/map-and-waypoints.md @@ -0,0 +1,116 @@ +--- +title: Map & Waypoints +nav_order: 6 +last_updated: 2026-05-13 +description: View node positions on the map, create and share waypoints, and manage position sharing and privacy. +aliases: + - map + - waypoints + - gps + - location +--- + +# Map & Waypoints + +The Map screen shows the geographic positions of nodes on your mesh, along with shared waypoints. + +## Map View + +The map displays: + +- **Node positions** — colored markers for each node reporting location +- **Waypoints** — shared points of interest +- **Your position** — your current GPS location + +### Node Markers + +Node markers on the map indicate: + +| Color | Meaning | +| ------ | ---------------------------------------------- | +| Green | Online (heard recently) | +| Yellow | Away (heard within 2 hours) | +| Gray | Offline (stale position) | +| Blue | Your own node | + +### Map Controls + +- **Zoom** — pinch or use +/- buttons +- **Pan** — drag to explore +- **Center** — select the location button to center on your position +- **Node tap** — tap a node marker to view details + +The floating toolbar provides quick access to compass, layer switching, node filters, refresh, and location tracking. Tap the compass to reorient north-up, or tap the location button to center on your current position. + +![Map controls overlay](/assets/screenshots/map_controls_overlay.png) + +## Waypoints + +Waypoints are shared geographic points of interest that all mesh members can see. + +### Creating a Waypoint + +1. Long-press on the map at the desired location. +2. Enter a name and optional description. +3. Choose an icon/emoji for the waypoint. +4. Tap **Send** to share with the mesh. + +### Waypoint Properties + +| Property | Deskripsyon | +| ----------- | ------------------------------------------------------- | +| Non | Short identifier (max 30 characters) | +| Deskripsyon | Optional longer description | +| Icon | Visual marker emoji on the map | +| Loken | If locked, only the creator can edit or delete | +| Expiration | Optional auto-remove time | + +### Waypoint Expiration + +Waypoints can be set to expire automatically: + +- **Never** (default) — waypoint remains until manually deleted +- **Timed** — waypoint is automatically removed after the specified duration (e.g., "remove after 2 hours"). Useful for temporary markers like rally points, hazards, or meeting locations. + +Expired waypoints are automatically hidden from the map so they don't clutter the display. The expiration countdown begins when the waypoint is created, not when other nodes receive it. + +### Managing Waypoints + +- Tap a waypoint on the map to view its details and coordinates +- Edit or delete waypoints you created +- **Locked waypoints** cannot be modified or deleted by other nodes — only the original creator can change them +- Unlocked waypoints can be edited by any mesh member + +## Position Sharing + +### Enabling Position Sharing + +Your node shares its GPS position based on: + +- **Fixed interval** — broadcast position at regular intervals +- **Smart position** — broadcast when movement exceeds a threshold +- **Manual** — only share when explicitly requested + +Configure position behavior in **Settings → Position**. + +### Privacy Considerations + +> 🔒 **Privacy:** Position data is broadcast to all nodes on your channel. If you don't want your location shared, disable GPS position in settings or use a fixed/fake position. + +## Map Sources + +The app supports multiple map tile sources: + +- OpenStreetMap (default) +- Satellite imagery (where available) +- Offline tiles (download map areas for offline use) + +## Related Topics + +- [Nodes](nodes) — view and filter your node list +- [Node Metrics](node-metrics) — signal quality and position history for individual nodes +- [Discovery](discovery) — traceroute and neighbor info for understanding mesh topology +- [Units & Locale](units-and-locale) — distance and coordinate display formats + +--- + diff --git a/docs/ht-rHT/user/messages-and-channels.md b/docs/ht-rHT/user/messages-and-channels.md new file mode 100644 index 000000000..0017c5ca3 --- /dev/null +++ b/docs/ht-rHT/user/messages-and-channels.md @@ -0,0 +1,159 @@ +--- +title: Messages & Channels +nav_order: 3 +last_updated: 2026-05-13 +description: Send and receive messages, manage channels, configure encryption, and use quick chat, reactions, and message actions. +aliases: + - channels + - direct-messages + - messaging + - conversations +--- + +# Messages & Channels + +Meshtastic supports two communication modes: **channel broadcasts** and **direct messages**. + +## Channels + +Channels are shared communication groups. All nodes configured with the same channel key can read and send messages on that channel. + +### Default Channel + +Every Meshtastic device comes with a default **LongFast** channel. This is an unencrypted channel used for general mesh communication. + +### Channel Security + +Channels support multiple encryption levels: + +| Icon | Security Level | Deskripsyon | +| ---- | ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------- | +| 🔒 | PSK (256-bit AES) | Fully encrypted with a strong pre-shared key. Only nodes with the matching key can read messages. | +| 🔐 | PSK (128-bit AES) | Encrypted with a shorter key. Secure for most uses but 256-bit is preferred for sensitive data. | +| 🔓 | Default / Open | Uses the well-known default key. **Any Meshtastic device** on the same preset can read these messages. | +| ⚠️ | Insecure + Position | Open channel that also broadcasts your GPS position. Use with caution in public meshes. | + +> 🔒 **Security Tip:** 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. + +### Adding a Channel + +1. Navigate to **Settings → Channels**. +2. Tap **Add Channel** or scan a QR code. +3. Configure the channel name and encryption key. +4. Share the channel URL/QR code with others who need access. + +Tapping a channel shows its details and sharing options. + +## Direct Messages + +Direct messages (DMs) are point-to-point encrypted communications between two specific nodes. + +### Sending a Direct Message + +1. Open the **Messages** tab. +2. Select a node from your contacts list or tap a node in the node list. +3. Type your message and tap **Send**. + +### Message States + +| State | Icon | Meaning | +| --------------------------------- | ---- | ----------------------------------------------------------------------------------------------------------------- | +| Queued | ⏳ | Message waiting to be sent | +| En route | ✓ | Delivered to the radio, awaiting acknowledgment | +| Delivered | ✓✓ | Acknowledgment received from recipient | +| Received | ✓ | Message received from the mesh (incoming) | +| S&F Routing | 🔗 | Store & Forward: message being routed through an S&F node | +| S&F Confirmed | 🔗 | Store & Forward: delivery confirmed via S&F node | +| Erè | ✗ | Delivery failed after retries | + +### Delivery Errors + +When a message fails to deliver, the error indicator shows what went wrong: + +| Erè | Meaning | What to Do | +| ---------------- | ---------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| No Route | No path exists to the destination node | The recipient may be offline or out of mesh range. Try later or move closer. | +| Got NAK | The next-hop node refused to relay | The relay node may be congested. Wait and retry. | +| Tan pase | No acknowledgment within retry window | The recipient may be just out of range. Try increasing hop limit or moving to a better position. | +| Pa gen entèfas | No radio interface available to send | Check that your radio is connected and the channel is configured. | +| Max Retransmit | All retry attempts exhausted | The mesh path is unreliable. Try a different channel or wait for conditions to improve. | +| Pa gen kanal | The destination channel doesn't exist | Verify both nodes share the same channel configuration. | +| Too Large | Message exceeds maximum payload size | Shorten your message (max ~230 characters). | +| No Response | Node received message but didn't respond | The recipient's radio may be busy or in low-power sleep mode. | +| Duty Cycle Limit | Regional airtime limit reached | Your radio has used its allowed transmit time. Wait for the duty cycle window to reset (typically 1 hour in EU regions). | +| Demann move | Malformed or invalid message | This usually indicates a software bug. Try restarting the app. | + +> 💡 **Tip:** 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. + +## Message Features + +### Quick Chat + +Pre-configured messages for rapid communication: + +- Access via the Quick Chat button in the message input area +- Choose from built-in phrases or custom messages +- Customize quick chat messages in **Settings → Quick Chat** +- Useful when typing is impractical (gloves, small screen, urgent) + +![Quick chat option](/assets/screenshots/messages_quick_chat.png) + +The channel list shows each channel with its latest message preview. + +### Message Bubbles + +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. + +### Reactions + +React to messages with emoji: + +- **Long-press** a message to open the actions menu +- Tap **Add Reaction** to choose an emoji +- Reactions appear below the message bubble +- Multiple users can react to the same message +- React to your own messages or others' messages + +![Emoji reaction badges displayed beneath a message](/assets/screenshots/messages_reaction.png) + +> 💡 **Tip:** Reactions are lightweight — they use minimal mesh bandwidth compared to full text messages. + +### Message Actions + +Long-press any message to access: + +- **Copy** — copy message text to clipboard +- **Reply** — quote the message in your response +- **React** — add an emoji reaction +- **Delete** — remove a message you sent (local deletion) + +### Message Priority + +Messages are queued and transmitted based on priority: + +1. Emergency/alert messages (highest) +2. Direct messages +3. Channel broadcasts (lowest) + +### Message Limits + +- **Maximum length:** 237 bytes (approximately 230 characters for ASCII text) +- **Rate limiting:** The mesh enforces airtime fairness; heavy message volume may be throttled +- **Delivery:** Messages are retried automatically if no acknowledgment is received + +## Best Practices + +- Use channels for group coordination +- Use direct messages for private person-to-person communication +- Keep messages short — mesh bandwidth is limited +- Configure encryption for sensitive communications + +## Related Topics + +- [Nodes](nodes) — tap a node to start a direct message +- [Settings — Radio & User](settings-radio-user) — configure channel encryption and presets +- [MQTT](mqtt) — bridge channel messages to the internet +- [Channel configuration](https://meshtastic.org/docs/configuration/radio/channels) — detailed channel settings on meshtastic.org + +--- + diff --git a/docs/ht-rHT/user/mqtt.md b/docs/ht-rHT/user/mqtt.md new file mode 100644 index 000000000..f06047a8a --- /dev/null +++ b/docs/ht-rHT/user/mqtt.md @@ -0,0 +1,137 @@ +--- +title: MQTT +nav_order: 11 +last_updated: 2026-05-13 +description: Bridge your mesh to the internet — MQTT broker setup, encryption layers, and map reporting. +aliases: + - mqtt + - internet-bridge + - broker +--- + +# MQTT + +MQTT bridges your Meshtastic mesh network to the internet, enabling long-range communication beyond radio range. + +## Overview + +The MQTT module connects your node to an MQTT broker, allowing: + +- Messages to reach nodes on different physical meshes via the internet +- Integration with home automation and monitoring systems +- Publishing node positions to the public Meshtastic map +- Custom data pipelines for logging and alerting + +## How It Works + +``` +[Your Node] → Radio → [Gateway Node with WiFi] → MQTT Broker → [Remote Gateway] → Radio → [Remote Node] +``` + +A gateway node with internet access (WiFi or Ethernet) publishes mesh messages to an MQTT topic. Remote gateways subscribed to the same topic inject those messages into their local mesh. + +## Configuration + +### Enabling MQTT + +1. Navigate to **Settings → Module Config → MQTT**. +2. Enable the MQTT module. +3. Configure the broker connection: + +![MQTT toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | Deskripsyon | Default | +| --------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------- | +| Server Address | MQTT broker hostname | mqtt.meshtastic.org | +| Username | Broker authentication | meshdev | +| Password | Broker authentication | large4cats | +| Root Topic | Base topic for messages | msh | +| Encryption | Encrypt MQTT payload | Enabled | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON packet support has been removed from firmware; this field is ignored | Disabled | +| TLS | Secure connection to broker | Disabled | +| Map Reporting | Report position to public map | Disabled | + +### Default Meshtastic Broker + +The community maintains a public broker at `mqtt.meshtastic.org`. This is intended for general use and testing. + +> 🔒 **Privacy:** Messages on the public broker are readable by anyone subscribed. Always use channel encryption for private communications. + +### Private Broker + +For better privacy and control, you can run your own MQTT broker: + +- Mosquitto (lightweight, open-source) +- HiveMQ +- EMQX + +Configure your node to point to your private broker with appropriate credentials. + +## Map Reporting + +When Map Reporting is enabled, your node publishes its position to the Meshtastic community map: + +- Visible at [meshmap.net](https://meshmap.net) and similar community map services +- Only position and node info are shared +- Disable this if you don't want your location publicly visible + +## Uplink vs Downlink + +| Direction | Deskripsyon | +| ------------ | -------------------------------- | +| **Uplink** | Messages from mesh → MQTT broker | +| **Downlink** | Messages from MQTT broker → mesh | + +Configure per-channel which directions are active to control message flow and airtime usage. + +## Message Formats + +MQTT uses protobuf message format: + +| Format | Deskripsyon | Use case | +| ------------ | ----------------------------------- | -------------------------- | +| **Protobuf** | Binary Meshtastic protobuf encoding | Node-to-node mesh bridging | + +> ⚠️ **Note:** JSON output support was removed from firmware. The `json_enabled` setting is still visible in the app for legacy compatibility but has no effect on current firmware versions. + +## Encryption & Privacy + +Understanding the layered encryption model: + +1. **Channel encryption** happens on the mesh _before_ MQTT. If your channel has a PSK, the MQTT payload is already encrypted — the broker and any subscribers see only the ciphertext. +2. **MQTT encryption** (the module setting) adds an additional encryption layer for transit to the broker. This protects metadata and routing information. +3. **TLS** encrypts the TCP connection to the broker itself, preventing network-level eavesdropping. + +> 🔒 **Important:** The default public channel has a well-known key. Messages on the default channel sent via MQTT are effectively **unencrypted** — anyone can decode them. Always use a custom PSK for private communications. + +## Best Practices + +- Use channel-level encryption (PSK) on channels that bridge to MQTT +- Don't enable MQTT on nodes without internet access (it will buffer and waste memory) +- Use a private broker for sensitive deployments +- Be mindful of airtime when downlinking messages from busy MQTT topics — every downlinked message consumes radio airtime on your local mesh +- Consider enabling uplink-only if you only need to monitor your mesh remotely without injecting messages back + +## Troubleshooting + +### MQTT Not Connecting + +- **Check WiFi** — the gateway node must have an active internet connection (WiFi or Ethernet). MQTT does not work over the LoRa radio link itself. +- **Verify credentials** — incorrect username or password will silently fail on most brokers. Double-check for trailing spaces. +- **Firewall** — port 1883 (MQTT) or 8883 (MQTT+TLS) must be open. Some networks block non-standard ports. +- **DNS resolution** — if using a custom broker hostname, verify the node can resolve it. Try the broker's IP address directly. + +### Messages Not Bridging + +- **Check uplink/downlink settings** — if only uplink is enabled, messages flow from mesh to MQTT but not back. Enable downlink on the receiving gateway. +- **Channel mismatch** — both gateways must share the same channel with the same PSK. A mismatch means messages are encrypted with different keys and appear as garbage. +- **Topic mismatch** — ensure both gateways use the same root topic. The default `msh` works for the public broker. + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — MQTT module configuration reference +- [Messages & Channels](messages-and-channels) — channel encryption and PSK setup +- [MQTT integration guide](https://meshtastic.org/docs/software/integrations/mqtt) — detailed MQTT documentation on meshtastic.org + +--- + diff --git a/docs/ht-rHT/user/node-metrics.md b/docs/ht-rHT/user/node-metrics.md new file mode 100644 index 000000000..3f0548000 --- /dev/null +++ b/docs/ht-rHT/user/node-metrics.md @@ -0,0 +1,130 @@ +--- +title: Node Metrics +nav_order: 5 +last_updated: 2026-05-13 +description: Telemetry dashboards for each mesh node — device health, environment sensors, signal quality, power, traceroute, and position history. +aliases: + - metrics + - telemetry + - device-metrics + - signal +--- + +# Node Metrics + +The node detail screen provides comprehensive telemetry and metrics for each node on your mesh. + +## Device Metrics + +Basic operating information reported by each node: + +| Metric | Deskripsyon | +| ----------------- | ----------------------------------- | +| Battery Level | Current battery percentage | +| Voltage | Battery voltage reading | +| Itilizasyon Kanal | Percentage of airtime consumed | +| Airtime | Transmission time used by this node | +| Uptime | Time since last reboot | + +Device metrics are displayed as individual cards with trend sparklines showing battery level, voltage, channel utilization, airtime, and uptime over time. + +> 💡 **Tip:** Tap any metric card to expand it into a full chart with historical data points. Pinch to zoom the time axis. + +## Environment Metrics + +Environmental sensor data (requires compatible hardware): + +| Metric | Sensor Examples | +| ------------------------------------ | --------------------- | +| Tanperati | BME280, BME680, SHT31 | +| Imidite | BME280, BME680, SHT31 | +| Barometric Pressure | BME280, BMP280 | +| Gas Resistance | BME680 | +| IAQ (Air Quality) | BME680 | + +Environment metrics are charted over time for easy trend analysis — temperature, humidity, and pressure each get their own line chart with the measurement unit displayed on the Y axis. + +> 💡 **Tip:** Environment metrics require a sensor connected to the remote node. Not all nodes report environmental data. See [Telemetry & Sensors](telemetry-and-sensors) for a full list of supported sensors. + +## Signal Metrics + +Radio signal quality information: + +| Metric | Deskripsyon | +| --------- | ----------------------------------------------------------------------------- | +| SNR | Signal-to-Noise Ratio (higher is better) | +| RSSI | Received Signal Strength Indicator (closer to 0 is better) | +| Hop Count | Number of mesh hops for last message | + +### Signal Quality Reference + +| SNR Range | Quality | +| --------------------------------- | --------- | +| > 10 dB | Excellent | +| 0 to 10 dB | Bon | +| -10 to 0 dB | Mwayen | +| < -10 dB | Poor | + +## Power Metrics + +Power management telemetry (requires INA sensor or compatible hardware): + +| Metric | Deskripsyon | +| ----------- | ----------------------- | +| Bus Voltage | Supply voltage | +| Current | Power draw in milliamps | +| Power | Calculated wattage | + +## Traceroute + +Traceroute shows the path a message takes through the mesh: + +1. From the node detail screen, tap **Traceroute**. +2. The app sends a traceroute request to the target node. +3. Results show each hop with SNR/RSSI values. + +### Reading Traceroute Results + +``` +You → Node A (SNR: 8.5) → Node B (SNR: 5.2) → Target +``` + +Each hop represents a relay node that forwarded the message. + +## Jounal Pozisyon + +Historical position data for nodes that share their location: + +- GPS coordinates +- Altitude +- Speed (if moving) +- Timestamp for each position report + +## Neighbor Info + +Shows which nodes a given node can directly hear, useful for understanding mesh topology. + +## Viewing Metrics + +1. Navigate to **Nodes**. +2. Tap the node you want to inspect. +3. Select the metric category from the detail tabs. + +![Node detail — local device](/assets/screenshots/nodes_detail_local.png) + +The position tab shows location data for nodes that share GPS: + +![Position inline content](/assets/screenshots/nodes_position.png) + +> ⚠️ **Note:** Metrics are only available when they have been reported by the remote node. Metrics update at intervals configured on each node's telemetry settings. + +## Related Topics + +- [Nodes](nodes) — node list, filtering, and sorting +- [Telemetry & Sensors](telemetry-and-sensors) — supported sensors and configuration +- [Signal Meter](signal-meter) — how signal quality is calculated from SNR and RSSI +- [Discovery](discovery) — traceroute details and neighbor info +- [Units & Locale](units-and-locale) — temperature, distance, and speed display formats + +--- + diff --git a/docs/ht-rHT/user/nodes.md b/docs/ht-rHT/user/nodes.md new file mode 100644 index 000000000..42717af76 --- /dev/null +++ b/docs/ht-rHT/user/nodes.md @@ -0,0 +1,152 @@ +--- +title: Nodes +nav_order: 4 +last_updated: 2026-05-13 +description: Browse, filter, and sort mesh nodes — view details, signal quality, roles, and quick actions. +aliases: + - node-list + - mesh-nodes + - peers +--- + +# Nodes + +The Nodes screen displays all devices visible on your mesh network. + +## Node List + +The node list shows every node your radio has heard, including: + +- **Node name** — user-configured long name +- **Short name** — 4-character identifier +- **Signal quality** — last heard signal strength +- **Last heard** — time since last communication +- **Distance** — estimated distance (if positions are shared) +- **Battery** — remote node battery level (if telemetry is enabled) + +### Node Status Indicators + +| Badge | Meaning | +| ---------- | ------------------------------------- | +| 🟢 Online | Node heard within the last 15 minutes | +| 🟡 Away | Node heard within the last 2 hours | +| 🔴 Offline | Node not heard for over 2 hours | +| ⭐ Favorite | Node marked as favorite by the user | + +### Node Roles + +Nodes can be configured with different roles that affect their mesh behavior: + +| Role | Deskripsyon | +| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Client | Standard end-user device | +| Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | +| Client Mute | Receives but doesn't retransmit | +| Client Hidden | Like Client Mute, plus hides from node list | +| Router | Prioritizes message forwarding; stays awake to relay | +| Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | +| ~~Router Client~~ | ⚠️ **Deprecated** (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | +| ~~Repeater~~ | ⚠️ **Deprecated** (removed in firmware 2.7.11) — no longer selectable; use Router instead | +| Tracker | Optimized for position reporting at regular intervals | +| Sensor | Optimized for telemetry reporting | +| TAK | Interoperates with TAK systems (sends/receives CoT) | +| TAK Tracker | TAK position reporting only | +| Lost & Found | Continuous position beacon for recovery | + +### Choosing a Role + +Most users should keep the default **Client** role. Consider a different role when: + +- **Router** — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don't use Router on battery-powered handheld devices. +- **Router Late** — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. +- **Client Base** — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. +- **Client Mute** — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only devices or to reduce congestion in dense areas. +- **Tracker** — An unattended device whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. +- **Sensor** — An unattended device reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. +- **TAK / TAK Tracker** — Only needed if interoperating with ATAK/WinTAK systems. See [TAK Integration](tak) for details. + +> 💡 **Tip:** The mesh works best when most nodes are **Client** or **Router**. Too many Mute nodes reduces mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. + +### Encryption Indicators + +Nodes display encryption status icons next to their name: + +| Icon | Meaning | +| ----------- | ------------------------------------------------------------------------------------------------------------------- | +| 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | +| 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | +| ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) | + +> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. + +## Quick Actions + +From the node list, you can: + +- **Tap** a node to view its detail page +- **Long-press** for quick actions: + - Send a direct message + - View on map + - Mande pozisyon + - Mark as favorite + - Traceroute + +## Filtering & Sorting + +### Text Search + +Type in the search field to filter nodes by name or short name. The filter updates in real time as you type. + +### Filter Toggles + +| Filtre | Deskripsyon | +| -------------------------- | ---------------------------------------------------------------------------------------------- | +| **Only online** | Show only nodes heard within the last 15 minutes | +| **Only direct** | Show only nodes with direct (non-relayed) connections | +| **Include unknown** | Show nodes that haven't sent user info yet | +| **Exclude infrastructure** | Hide infrastructure-role nodes (Router, Repeater, Router Late, Client Base) | +| **Exclude MQTT** | Hide nodes heard only via MQTT internet bridge | +| **Show ignored** | Show nodes you've previously dismissed or muted | + +### Sort Options + +| Sort | Deskripsyon | +| ------------------------------------------- | ------------------------------------------------------------------ | +| **Last heard** (default) | Most recently heard nodes first | +| **Alphabetical** | Sorted by node long name | +| **Distance** | Nearest nodes first (requires position sharing) | +| **Hops away** | Fewest relay hops first | +| **Channel** | Grouped by channel index | +| **Via MQTT** | Grouped by MQTT vs. radio-heard | +| **Favorites** | Favorited nodes first | + +## Node Detail + +Tapping a node opens the detail view with comprehensive information. See [Node Metrics](node-metrics) for full details on metrics and telemetry. + +![Node detail view](/assets/screenshots/nodes_node_list.png) + +The detail screen includes device info, position, and action buttons: + +![Node detail section](/assets/screenshots/nodes_detail_section.png) + +Inline status indicators show key metrics at a glance: + +| Indicator | Screenshot | +| ------------------ | -------------------------------------------------------- | +| Signal quality | ![Signal](/assets/screenshots/nodes_signal_info.png) | +| Battery level | ![Battery](/assets/screenshots/nodes_battery_info.png) | +| Hop count | ![Hops](/assets/screenshots/nodes_hops_info.png) | +| Dènye fwa li tande | ![Last heard](/assets/screenshots/nodes_last_heard.png) | +| Distans | ![Distance](/assets/screenshots/nodes_distance_info.png) | + +## Related Topics + +- [Node Metrics](node-metrics) — detailed telemetry dashboards for each node +- [Messages & Channels](messages-and-channels) — send a direct message to a node +- [Map & Waypoints](map-and-waypoints) — view node positions geographically +- [Discovery](discovery) — traceroute and neighbor info for topology exploration +- [Signal Meter](signal-meter) — understand what the signal bars mean + +--- + diff --git a/docs/ht-rHT/user/onboarding.md b/docs/ht-rHT/user/onboarding.md new file mode 100644 index 000000000..3b910534e --- /dev/null +++ b/docs/ht-rHT/user/onboarding.md @@ -0,0 +1,99 @@ +--- +title: Getting Started +nav_order: 1 +last_updated: 2026-05-13 +description: First-launch setup — permissions, onboarding flow, and next steps after connecting your radio. +aliases: + - first-launch + - setup + - intro +--- + +# Getting Started + +Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app. + +## First Launch + +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. + +### Welcome Screen + +The welcome screen introduces Meshtastic and its core capabilities: + +- Off-grid mesh communication +- No cellular or internet required +- End-to-end encrypted messaging + +Tap **Get Started** to proceed through the setup flow. + +![Welcome screen](/assets/screenshots/onboarding_welcome.png) + +## Permissions + +The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. + +### Bluetooth Permission + +Bluetooth is the primary connection method between your phone and Meshtastic radio: + +- **Bluetooth scanning** — discover nearby Meshtastic radios +- **Bluetooth connect** — establish and maintain connections with paired radios + +Grant both permissions when prompted. Without Bluetooth, you'll need to use USB or TCP connections instead. + +### Location Permission + +> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. + +Meshtastic also uses your location for: + +- Showing your position on the mesh map +- Calculating distances to other nodes +- Sharing your GPS coordinates with other mesh members (if enabled) + +Grant **"While using the app"** or **"Always"** depending on your preference: + +- **While using the app** — position updates only when the app is open +- **Always** — enables background position updates for always-on mesh presence + +If denied, Bluetooth scanning will not function and your node will not report a position. + +### Notifications Permission + +Notifications alert you to: + +- Incoming messages from channels and direct messages +- Connection status changes (connected, disconnected, reconnecting) +- Firmware update availability + +> 💡 **Tip:** You can fine-tune notification preferences later in Android system settings. The app creates separate notification channels for messages, connection events, and background service status. + +### Critical Alerts Permission + +On supported devices, the app may request permission for critical alerts: + +- These are high-priority notifications that can break through Do Not Disturb mode +- Useful for emergency mesh alerts or urgent messages +- You can **skip** this step if you don't need breakthrough notifications +- Configure or revoke later in Android notification settings + +## After Setup + +Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. + +> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. + +## What's Next? + +Once connected to a radio, explore: + +- [Connections](connections) — pair your first radio device +- [Messages & Channels](messages-and-channels) — send your first message +- [Nodes](nodes) — see who's on your mesh +- [Map & Waypoints](map-and-waypoints) — view node positions +- [Settings](settings-radio-user) — configure your radio and user profile + +New to Meshtastic? The [getting started guide](https://meshtastic.org/docs/getting-started) on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup. + +--- diff --git a/docs/ht-rHT/user/settings-module-admin.md b/docs/ht-rHT/user/settings-module-admin.md new file mode 100644 index 000000000..be4aa853e --- /dev/null +++ b/docs/ht-rHT/user/settings-module-admin.md @@ -0,0 +1,246 @@ +--- +title: Settings — Modules & Admin +nav_order: 8 +last_updated: 2026-05-13 +description: Configure optional feature modules (MQTT, telemetry, canned messages, TAK, and more) and perform device administration. +aliases: + - modules + - module-config + - administration +--- + +# Settings — Modules & Admin + +Configure optional feature modules and perform device administration. Modules extend Meshtastic with specialized capabilities — each can be independently enabled or disabled. + +> 💡 **Tip:** You only need to enable the modules you actually use. Disabling unused modules reduces airtime, saves battery, and simplifies your configuration. + +Module settings use a card-based layout with toggle switches, dropdowns, text fields, and sliders: + +![Toggle switch](/assets/screenshots/settings_switch.png) + +![Dropdown selector](/assets/screenshots/settings_dropdown.png) + +![Text field](/assets/screenshots/settings_text_field.png) + +![Settings card layout](/assets/screenshots/settings_titled_card.png) + +## Module Configuration + +### MQTT Module + +Bridges mesh messages to and from an MQTT broker for internet connectivity. This is how you extend your mesh beyond radio range or integrate with home automation systems. + +| Setting | Deskripsyon | +| --------------- | ------------------------------------------------------------------------ | +| Enabled | Toggle MQTT bridge | +| Server | MQTT broker address | +| Username | Authentication username | +| Password | Authentication password | +| Encryption | Encrypt MQTT payloads | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON support removed from firmware; field is ignored | +| TLS | Use secure connection | +| Root Topic | Base MQTT topic path | +| Map Report | Publish position for public map | + +See [MQTT](mqtt) for a detailed usage guide including encryption, privacy, and broker setup. + +### Serial Module + +Enables serial port communication for external device integrations (GPS modules, sensors, or custom hardware). When enabled, the node's serial port can send and receive protobuf or text data, allowing external microcontrollers or computers to interact with the mesh. + +| Setting | Deskripsyon | +| ---------- | ------------------------------- | +| Enabled | Activate serial communication | +| Echo | Echo received serial data back | +| Mode | Text, Protobuf, or NMEA output | +| RX/TX Pins | GPIO pins for serial connection | +| Baud Rate | Serial communication speed | + +### External Notification Module + +Controls buzzer, LED, or vibration alerts on your radio hardware. Useful for devices that need to physically signal when a message arrives — particularly helpful for unattended or outdoor installations. + +| Setting | Deskripsyon | +| -------------------------------- | --------------------------- | +| Enabled | Activate notifications | +| Alert Message | Notify on incoming messages | +| Alert Message Buzzer | Use buzzer for messages | +| Alert Message Vibra | Use vibration for messages | +| Alert Bell | Notify on bell character | +| Output (GPIO) | Pin for notification output | +| Active | High or Low active | +| Duration (ms) | Notification length | +| Use I2S as Buzzer | Use I2S audio output | + +### Store & Forward Module + +Buffers messages for nodes that were temporarily offline, then replays them when those nodes reconnect. Essential for meshes where nodes go in and out of range regularly — ensures messages aren't lost during brief disconnections. + +| Setting | Deskripsyon | +| ------------------------------------------ | -------------------------- | +| Enabled | Activate store and forward | +| Heartbeat (s) | Announcement interval | +| Records | Maximum stored messages | +| History Return (max) | Max messages to replay | +| History Return (window) | Time window for replay | + +> 💡 **Tip:** Store and Forward works best on nodes with ample memory (ESP32 with PSRAM). Router nodes are ideal candidates since they're typically always-on. + +### Range Test Module + +Automated range testing tool for evaluating link quality between nodes. When enabled, the node periodically transmits test messages with incrementing counters. A receiver node logs these messages, allowing you to walk or drive away and later analyze at what distance messages stopped arriving. + +| Setting | Deskripsyon | +| -------------------------------------- | --------------------------------- | +| Enabled | Activate range testing | +| Sender Interval (s) | Time between test transmissions | +| Save CSV | Log received test data to SD card | + +### Telemetry Module + +Controls what telemetry data your node shares with the mesh. Telemetry includes device health (battery, uptime) and environmental sensor data (temperature, humidity, pressure). + +| Setting | Deskripsyon | +| ---------------------------- | --------------------------------------- | +| Device Metrics Interval | How often to report device metrics | +| Environment Metrics Interval | How often to report environment sensors | +| Air Quality Enabled | Report particulate sensor data | +| Power Metrics Enabled | Report power usage | + +See [Telemetry & Sensors](telemetry-and-sensors) for supported sensors and configuration recommendations. + +### Canned Message Module + +Pre-configured messages accessible from the device's physical buttons (for radios with rotary encoders, keypads, or similar input hardware). Define a list of quick-send messages that can be transmitted without a phone connected — ideal for field use. + +| Setting | Deskripsyon | +| ------------------ | ----------------------------------------------------------- | +| ~~Enabled~~ | ⚠️ **Deprecated** — current firmware may ignore this toggle | +| Messages | Newline-separated list of messages | +| Send Bell | Play bell sound on send | +| Rotary Encoder | Enable rotary encoder input | +| Up/Down/Press Pins | GPIO pin assignments for input | + +### Audio Module + +Codec2 audio support for low-bandwidth voice communication over the mesh. This is an **experimental** feature that encodes voice into very small data packets using the Codec2 codec. + +| Setting | Deskripsyon | +| --------------- | -------------------------------- | +| Enabled | Activate audio module | +| Codec2 Rate | Audio quality/bandwidth tradeoff | +| I2S Word Select | GPIO pin for I2S WS | +| I2S Data In | GPIO pin for I2S DIN | +| I2S Data Out | GPIO pin for I2S DOUT | + +> ⚠️ **Note:** Audio requires specific hardware (I2S microphone and speaker). Voice quality is very low-bandwidth — think "understandable radio voice," not phone-call quality. + +### Remote Hardware Module + +GPIO control over the mesh network. Allows a remote node to read or write GPIO pins on another node — useful for activating relays, reading switches, or controlling external hardware from a distance. + +| Setting | Deskripsyon | +| -------------------- | --------------------------------------------------------------- | +| Enabled | Activate remote GPIO access | +| Allow Undefined Pins | Allow access to any GPIO pin (security risk) | + +> ⚠️ **Warning:** Enabling "Allow Undefined Pins" gives remote nodes access to all GPIO pins, which could interfere with the radio's own hardware. Only enable on dedicated GPIO nodes. + +### Neighbor Info Module + +Broadcasts information about directly heard neighbors, enabling mesh topology mapping. Each enabled node periodically shares a list of the other nodes it can hear and their signal quality. + +| Setting | Deskripsyon | +| -------------------------------------- | ------------------------------------ | +| Enabled | Activate neighbor broadcasting | +| Update Interval (s) | How often to broadcast neighbor list | + +See [Discovery](discovery) for how to use neighbor data for mesh topology exploration. + +### Ambient Lighting Module + +Controls onboard NeoPixel or other addressable RGB LEDs on supported hardware. Can be used for visual status indicators, notification lights, or decorative effects. + +| Setting | Deskripsyon | +| ------------------ | ---------------------------------------------------------- | +| Enabled | Activate LED control | +| LED State | On, Off, or set specific color | +| Red / Green / Blue | Individual color channel values (0–255) | + +### Detection Sensor Module + +Turns your node into a motion or door sensor alert system. When a GPIO pin detects a state change (motion detected, door opened), the node broadcasts an alert message over the mesh. + +| Setting | Deskripsyon | +| ---------------------------------------- | ----------------------------------------------------------------------- | +| Enabled | Activate detection sensor | +| Monitor Pin | GPIO pin connected to sensor | +| Detection Triggered High | Trigger when pin goes high (vs. low) | +| Minimum Broadcast (s) | Minimum time between alert broadcasts | +| State Broadcast (s) | Periodic state broadcast interval | +| Send Bell | Include bell character in alerts | +| Friendly Name | Custom name for this sensor | + +### Paxcounter Module + +People counter using WiFi and BLE probe requests. Counts nearby devices by passively listening for probe requests that phones and laptops emit when scanning for networks. Available only on ESP32 devices. + +| Setting | Deskripsyon | +| -------------------------------------- | -------------------------- | +| Enabled | Activate people counting | +| Update Interval (s) | How often to report counts | + +> 💡 **Tip:** Paxcounter is useful for estimating foot traffic at trailheads, event venues, or other locations. Counts are approximate — one person may carry multiple devices. + +### TAK Module + +Team Awareness Kit integration for interoperability with ATAK and WinTAK. See [TAK Integration](tak) for detailed setup and usage. + +## Administrasyon + +### Administrasyon Remote + +Remotely configure nodes that share your admin key: + +1. Select the target node in the node list. +2. Navigate to **Settings** for that node. +3. Modify configuration. +4. Tap **Save** — changes are sent over the mesh. + +> ⚠️ **Requires:** Admin key configured on both your node and the target node. + +### Clean Node Database + +Removes stale nodes from your local database that haven't been heard in a configurable time window. + +### Factory Reset + +Resets all settings to factory defaults. **This cannot be undone.** + +### Rekòmanse + +Remotely reboot a connected or administered node. + +### Panno Debug + +View detailed diagnostic information: + +- Protocol buffers debug output +- Mesh packet log +- Connection state details + +### Troubleshooting Remote Admin + +- **"No response from target node"** — the target may be out of range, offline, or have a mismatched admin key. Verify the admin key matches on both nodes. +- **Changes not applying** — some settings require a reboot to take effect. Try the Reboot action after saving. +- **Can't see remote settings** — ensure your node has the admin key for the target node and that Admin Channel is enabled in Security Config. + +## Related Topics + +- [Settings — Radio & User](settings-radio-user) — core radio and user profile settings +- [Module configuration reference](https://meshtastic.org/docs/configuration/module) — detailed module docs on meshtastic.org +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/ht-rHT/user/settings-radio-user.md b/docs/ht-rHT/user/settings-radio-user.md new file mode 100644 index 000000000..a331b7753 --- /dev/null +++ b/docs/ht-rHT/user/settings-radio-user.md @@ -0,0 +1,173 @@ +--- +title: Settings — Radio & User +nav_order: 7 +last_updated: 2026-05-13 +description: Configure your radio hardware, LoRa presets, user profile, position sharing, power management, and security. +aliases: + - settings + - radio-config + - user-config + - lora +--- + +# Settings — Radio & User + +Configure your radio hardware and user identity parameters. + +## User Settings + +### User Profile + +| Setting | Deskripsyon | +| ----------------- | ------------------------------------------------------------------------------------- | +| Long Name | Your display name (up to 39 characters) | +| Short Name | 4-character abbreviated name | +| Licensed Operator | Enable if you hold an amateur radio license (enables higher power) | + +### Applying Changes + +After modifying settings, tap **Save** to write the configuration to your radio. The device may reboot to apply changes. + +## Radio Configuration + +### Device Config + +| Setting | Deskripsyon | Default | +| ------------------------------------------ | ----------------------------------------------------------------------- | -------- | +| Role | Node behavior (Client, Router, etc.) | Client | +| Rebroadcast Mode | How the node retransmits messages | All | +| Node Info Broadcast (s) | Interval for broadcasting node info | 10800 | +| Double-tap Button | Action for double-tap button press | Disabled | + +### LoRa Config + +| Setting | Deskripsyon | Default | +| ----------------- | ----------------------------------------------------------------------- | ----------------------------------------- | +| Rejyon | Regulatory region for frequency bands | Unset (must configure) | +| Modem Preset | Speed/range tradeoff | LongFast | +| Hop Limit | Maximum retransmit hops | 3 | +| TX Power | Transmission power (dBm); 0 = max allowed for region | 0 (region max) | +| Frequency Offset | Fine-tune frequency (MHz) | 0 | +| Channel Bandwidth | Bandwidth setting | Default for preset | + +> ⚠️ **Important:** You **must** set your region before transmitting. Operating without the correct region may violate local radio regulations. See the [region configuration guide](https://meshtastic.org/docs/getting-started/initial-config) on meshtastic.org for details. + +### Modem Presets + +| Preset | Range | Speed | SNR Limit | Best For | +| ------------------ | ----------------------- | ------------------------- | ------------------------ | -------------------------------------------------------------------------------------------------------- | +| Short Turbo | ~1 km | 21.9 kbps | −5 dB | Dense urban with line-of-sight; data-heavy applications | +| Short Fast | ~3 km | 10.9 kbps | −7.5 dB | Urban neighborhoods; buildings within a few blocks | +| Short Slow | ~5 km | 5.5 kbps | −10 dB | Suburban short-range; moderate building density | +| Medium Fast | ~5 km | 5.5 kbps | −10 dB | Suburban areas; moderate building density | +| Medium Slow | ~8 km | 1.1 kbps | −12.5 dB | Suburban/rural; moderate range with slower speed | +| Long Turbo | ~10 km | 4.4 kbps | −10 dB | Similar range to Long Fast but with 500 kHz bandwidth; faster throughput | +| Long Fast | ~10 km | 1.1 kbps | −12.5 dB | **General use (default)** — balanced range and speed | +| Long Moderate | ~20 km | 0.34 kbps | −15 dB | Rural with some terrain; occasional use | +| Lite Fast | ~5 km | 5.5 kbps | −10 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Medium Fast | +| Lite Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Long Fast | +| Narrow Fast | ~5 km | 2.7 kbps | −10 dB | EU 868 MHz band (62.5 kHz BW); avoids interference with other devices | +| Narrow Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 868 MHz band (62.5 kHz BW); comparable to Long Fast | +| ~~Long Slow~~ | ~30 km | 0.18 kbps | −17.5 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | +| ~~Very Long Slow~~ | ~40+ km | 0.09 kbps | −20 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | + +#### Choosing a Modem Preset + +The modem preset controls the fundamental tradeoff between **range** and **data rate**: + +- **Slower presets** use more spreading, making signals decodable at weaker signal levels (lower SNR limit). This means longer range but fewer bytes per second. +- **Faster presets** pack more data per transmission but require a stronger signal to decode. + +**Practical guidance:** + +- **Urban mesh (many nodes, short distances):** Use **Long Fast** (default) or **Short Fast**. Higher speed means less airtime congestion when many nodes share the channel. +- **Rural/sparse mesh (few nodes, long distances):** Use **Long Moderate**. Range matters more than speed when nodes are far apart. +- **EU 866/868 MHz regulatory compliance:** Use **Lite Fast**, **Lite Slow**, **Narrow Fast**, or **Narrow Slow** — these are optimized for the EU SRD/868 MHz bands with narrower bandwidths. +- **Fixed infrastructure links:** Use **Short Turbo** or **Long Turbo** for dedicated point-to-point links with good antennas and line-of-sight. +- **Mixed environments:** Stick with **Long Fast** — it's the community default and ensures compatibility with others in your area. + +> ⚠️ **Important:** All nodes on the same channel **must** use the same modem preset. Nodes with mismatched presets cannot communicate even if they share the same frequency and encryption key. + +> 💡 **Tip:** The range estimates above assume flat terrain and modest antennas. Elevation advantage (hilltop, rooftop) dramatically increases effective range. A well-placed Router with Long Fast can often outperform a ground-level node with Long Slow. + +### Display Config + +| Setting | Deskripsyon | +| ------------------- | ------------------------------------------------------------------------------------ | +| Screen Timeout | Time before display sleeps | +| Display Units | Metric or Imperial | +| OLED Type | Auto, SSD1306, SH1106, SH1107 | +| Compass Orientation | Rotation offset for compass display (0°, 90°, 180°, 270°) | +| ~~Compass North~~ | ⚠️ **Deprecated** — replaced by Compass Orientation; still visible in older firmware | + +### Position Config + +| Setting | Deskripsyon | +| ----------------------------------------- | ---------------------------------- | +| GPS Enabled | Enable/disable GPS | +| GPS Update Interval | How often to acquire GPS fix | +| Position Broadcast (s) | How often to share position | +| Smart Position | Enable movement-based broadcasting | +| Fixed Position | Use a manually set position | + +### Power Config + +| Setting | Deskripsyon | +| --------------------------------------- | --------------------------------------- | +| Power Saving | Enable low-power sleep mode | +| Shutdown After (s) | Auto-shutdown idle timer | +| ADC Multiplier | Battery voltage calibration factor | +| Wait Bluetooth (s) | Time to wait for BLE connection at boot | +| Mesh SDS Timeout (s) | Super-deep-sleep timeout | + +### Network Config + +| Setting | Deskripsyon | +| ------------- | ---------------------------------------------------- | +| WiFi Enabled | Enable WiFi radio (ESP32 devices) | +| WiFi SSID | Network name to connect to | +| WiFi PSK | Network password | +| NTP Server | Time synchronization server | +| Syslog Server | Remote logging server | + +![IP address field](/assets/screenshots/settings_ipv4_field.png) + +### Bluetooth Config + +| Setting | Deskripsyon | +| ----------------- | ------------------------------------------------------------------------- | +| Bluetooth Enabled | Enable/disable BLE radio | +| Pairing Mode | Fixed PIN, Random PIN, or No PIN | +| Fixed PIN | PIN code for pairing (default: 123456) | + +### Security Config + +| Setting | Deskripsyon | +| --------------------- | -------------------------------------------------------------------------- | +| Public Key | Your node's public key (read-only) | +| Admin Key | Key for remote administration | +| Private Key | Your node's private key (handle securely) | +| Admin Channel Enabled | Allow admin commands via channel | +| Debug Log | Output live debug logging over serial/bluetooth | +| Serial Enabled | Enable serial console access (moved from Device Config) | +| Managed Mode | Restrict non-admin channel changes | + +![Password field](/assets/screenshots/settings_password_field.png) + +Settings use standard preference controls — dropdowns, toggles, and sliders: + +| Control | Screenshot | +| -------- | ------------------------------------------------------ | +| Dropdown | ![Dropdown](/assets/screenshots/settings_dropdown.png) | +| Toggle | ![Toggle](/assets/screenshots/settings_switch.png) | +| Slider | ![Slider](/assets/screenshots/settings_slider.png) | + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — optional feature modules and device administration +- [Signal Meter](signal-meter) — how modem presets affect signal quality thresholds +- [LoRa configuration](https://meshtastic.org/docs/configuration/radio/lora) — detailed LoRa settings reference on meshtastic.org +- [Initial configuration](https://meshtastic.org/docs/getting-started/initial-config) — region setup guide on meshtastic.org + +--- + diff --git a/docs/ht-rHT/user/signal-meter.md b/docs/ht-rHT/user/signal-meter.md new file mode 100644 index 000000000..e5ec164a7 --- /dev/null +++ b/docs/ht-rHT/user/signal-meter.md @@ -0,0 +1,81 @@ +--- +title: How the Meshtastic Signal Meter Works +nav_order: 15 +last_updated: 2026-05-13 +description: How the signal meter calculates quality from RSSI and SNR — LoRa spread spectrum, presets, and what the bars really mean. +aliases: + - signal + - signal-meter + - snr + - rssi +--- + +# How the Meshtastic Signal Meter Works + +The Meshtastic signal meter — the familiar bars or status color in the app — is calculated very differently than the "bars" on a traditional cell phone or Wi-Fi router. + +Most consumer devices simply measure how "loud" a signal is. However, because Meshtastic uses **LoRa (Long Range)** technology, its signal meter measures how **clear** the signal is, relative to the specific settings your mesh is using. + +--- + +## 1. The Two Metrics: "Loudness" vs. "Clarity" + +Every time the LoRa radio chip receives a message, it reports two measurements: + +- **RSSI (Received Signal Strength Indicator):** The **loudness** of the raw power hitting your antenna. +- **SNR (Signal-to-Noise Ratio):** The **clarity** of the signal compared to the background static. + +> **Tip — The Analogy:** Imagine you are trying to hear a friend talking to you. +> +> - **RSSI** is how loud their voice is. +> - **The Noise Floor** is the background noise in the room (air conditioning, other people talking, traffic). +> - **SNR** is how easily you can distinguish your friend's voice from the background noise. + +If your friend shouts at you at a deafening rock concert, the signal is incredibly loud (High RSSI), but you still can't understand them because the background noise is louder (Bad SNR). Conversely, if your friend whispers to you in a dead-silent library, the signal is very weak (Low RSSI), but you can understand them perfectly (Great SNR). + +--- + +## 2. The Magic of LoRa: Hearing "Below the Noise Floor" + +For standard radios (like FM or Wi-Fi), if the background noise is louder than the signal (a negative SNR), the receiver just hears static. + +LoRa is special. It uses **"Spread Spectrum"** modulation, which allows the radio to mathematically pull a signal out of the air even when it is buried deep _underneath_ the background noise. This is why you will frequently see **negative SNR numbers** in Meshtastic (e.g., -10 dB, which means the signal is 10 decibels weaker than the background static). + +Depending on which Meshtastic preset you are using (e.g., `LongFast` vs. `ShortFast`), the radio has a specific **SNR Limit** — the absolute maximum amount of noise it can tolerate before the message is completely lost to the static. + +--- + +## 3. How the Signal Meter Calculates Quality + +The Meshtastic apps take both RSSI and SNR and run them through a specific formula to assign your signal a quality rating (None, Bad, Fair, or Good). It specifically scales these values based on the physical limits of the radio preset you are using. + +Here is exactly how the app decides how many bars (or what color) to show you: + +| Level | Bars | Criteria | Meaning | +| ------ | ---- | ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | +| Bon | 3 | RSSI better than `-115 dBm` **AND** SNR better than `-7 dB` | Signal is both loud and clear — healthy connection. | +| Mwayen | 2 | RSSI better than `-126 dBm` with good SNR, **OR** SNR better than `-15 dB` with good RSSI | Signal getting quieter or noisier, but still decodable. | +| Move | 1 | Falls between Fair and None thresholds | At the edge of range or experiencing interference. | +| Pa gen | 0 | RSSI worse than `-126 dBm` **AND** SNR worse than `-15 dB` | Transmission completely buried in noise. | + +--- + +## 4. What This Means for You + +Because Meshtastic's meter acts as a **"Clarity Meter"**, it behaves differently than what most people expect: + +> **Tip — Don't panic over low RSSI:** You might see a seemingly terrible RSSI value like `-118 dBm`. On a cell phone, you would have zero bars. But if you have an SNR of `+2 dB`, Meshtastic will still show a strong signal! _The library is quiet, so the whisper is heard perfectly._ + +> **Warning — Watch out for local noise:** If you hook up a massive antenna and see a great RSSI (e.g., `-90 dBm`) but your signal meter is only showing **1 Bar (Bad)**, you have a problem. It means you have local interference — perhaps a cheap power supply, a noisy computer, or a nearby radio tower — creating so much static that it is drowning out your mesh. + +## Where Signal Information Appears + +In the app, signal data is shown in several places: + +- **Node list** — signal bars icon next to each node +- **Node detail** — SNR, RSSI, and signal quality in the device metrics section +- **Traceroute** — per-hop signal quality for each relay node +- **Signal metrics** — historical SNR and RSSI data in the metrics charts + +![Node entry showing SNR, RSSI values and colored signal bars](/assets/screenshots/nodes_signal_info.png) + diff --git a/docs/ht-rHT/user/tak.md b/docs/ht-rHT/user/tak.md new file mode 100644 index 000000000..3c62b4549 --- /dev/null +++ b/docs/ht-rHT/user/tak.md @@ -0,0 +1,126 @@ +--- +title: TAK Integration +nav_order: 10 +last_updated: 2026-05-13 +description: Interoperate with ATAK and WinTAK — CoT position sharing, TAK roles, and plugin setup. +aliases: + - tak + - atak + - team-awareness-kit +--- + +# TAK Integration + +Meshtastic integrates with the Team Awareness Kit (TAK) ecosystem, enabling interoperability between Meshtastic mesh devices and TAK applications like ATAK and WinTAK. + +## Overview + +The TAK module allows Meshtastic nodes to: + +- Share position data in TAK-compatible CoT (Cursor on Target) format +- Appear as team members on TAK map displays +- Receive TAK PLI (Position Location Information) messages + +## Setup + +### Prerequisites + +- ATAK (Android Team Awareness Kit) or WinTAK installed +- Meshtastic ATAK Plugin installed +- TAK module enabled on your Meshtastic radio + +### Configuration + +1. Navigate to **Settings → Module Config → TAK**. +2. Enable the TAK module. +3. Configure the TAK team/group settings: + +![Module toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | Deskripsyon | +| ------- | -------------------------- | +| Enabled | Activate TAK interop | +| Mode | TAK-compatible output mode | + +### ATAK Plugin Setup + +1. Install the Meshtastic ATAK Plugin from the plugin repository. +2. Open ATAK and enable the Meshtastic plugin. +3. The plugin bridges messages between ATAK and your mesh network. + +## TAK Roles + +Nodes configured with TAK-related roles behave differently from standard clients: + +| Role | Deskripsyon | +| --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **TAK** | Full TAK interoperability — sends and receives CoT data, chat messages, and PLI updates. Functions as a standard client plus TAK bridge. | +| **TAK Tracker** | Position-only TAK output — automatically broadcasts PLI at regular intervals without user interaction. Optimized for unattended position beacons (vehicles, equipment, waypoints). Does not relay chat messages. | + +> 💡 **Tip:** Use **TAK Tracker** for devices that only need to report position (e.g., a radio mounted in a vehicle). Use **TAK** for devices where users actively participate in TAK operations. + +### CoT (Cursor on Target) Format + +TAK messages use the Cursor on Target XML format — a military standard for sharing situational awareness data. Meshtastic converts its internal protobuf messages to CoT format when bridging to TAK systems, so no manual format conversion is needed. + +## TAK Identity + +When using TAK roles, your node broadcasts identity information that appears on TAK maps: + +| Setting | Deskripsyon | +| -------- | ---------------------------------------------------------------------------------------------------------------- | +| Team | Your team color on the TAK map (e.g., Blue, Red, Cyan, Green) | +| Role | Your operational role (Team Member, Team Lead, HQ, Medic, RTO, etc.) | +| Callsign | Your TAK callsign (defaults to your Meshtastic long name) | + +These settings appear in **Settings → Module Config → TAK** when the TAK module is enabled. + +> 💡 **Tip:** Team/role colors are the standard TAK affiliation colors. Coordinate with your TAK team to use consistent team assignments. + +## Wire Format (V1 / V2) + +Meshtastic supports two TAK wire formats: + +| Format | Compatibility | Features | +| ------------------------------- | --------------------------------------------------------------- | --------------------------------------------------------- | +| V1 (Legacy) | ATAK Plugin v1.x, older firmware | Basic CoT position sharing only | +| V2 (Current) | ATAK Plugin v2.x, firmware 2.3+ | Full CoT support including chat, routes, zstd compression | + +The app automatically selects V2 when both sides support it. No manual configuration needed — the TAK module negotiates format based on firmware capabilities. + +## Usage with ATAK + +Once configured: + +- Meshtastic nodes appear as markers on the ATAK map with callsign labels +- Chat messages can bridge between mesh and TAK networks +- Position updates flow bidirectionally between Meshtastic and TAK +- TAK Tracker nodes broadcast PLI automatically — their positions appear on ATAK maps without any ATAK-side configuration + +> ⚠️ **Note:** TAK integration requires specific node roles and module configuration. Standard client nodes don't automatically participate in TAK operations. + +## Troubleshooting + +| Problem | Cause | Solution | +| -------------------------------- | ------------------------------------- | ----------------------------------------------------------------------- | +| Node doesn't appear on ATAK map | TAK module disabled or wrong role | Verify TAK module is enabled and node role is TAK or TAK Tracker | +| Position updates are stale | GPS fix lost or interval too long | Check GPS status; reduce position broadcast interval in Position Config | +| ATAK plugin shows "disconnected" | BLE connection lost or plugin crashed | Reconnect Bluetooth in Meshtastic app, then restart ATAK plugin | +| Chat messages not bridging | V1 format doesn't support chat | Ensure both nodes run firmware 2.3+ for V2 wire format | +| CoT data not flowing | Channel mismatch | All TAK nodes must be on the same channel with matching encryption | + +## Security Considerations + +- TAK data shares your position and callsign information +- Ensure your channel encryption is configured when using TAK in sensitive environments +- The TAK module respects the same channel encryption as other Meshtastic messages + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — TAK module configuration +- [Nodes](nodes) — TAK and TAK Tracker roles in the node list +- [Map & Waypoints](map-and-waypoints) — node positions on the map +- [ATAK plugin guide](https://meshtastic.org/docs/software/integrations/atak-plugin) — detailed ATAK setup on meshtastic.org + +--- + diff --git a/docs/ht-rHT/user/telemetry-and-sensors.md b/docs/ht-rHT/user/telemetry-and-sensors.md new file mode 100644 index 000000000..436965dcb --- /dev/null +++ b/docs/ht-rHT/user/telemetry-and-sensors.md @@ -0,0 +1,118 @@ +--- +title: Telemetry & Sensors +nav_order: 9 +last_updated: 2026-05-13 +description: Sensor data on the mesh — supported environment, air quality, and power sensors, plus configuration and viewing guides. +aliases: + - sensors + - environment + - weather + - power-metrics +--- + +# Telemetry & Sensors + +Meshtastic nodes can collect and share sensor data across the mesh network. + +## Overview + +Telemetry allows nodes equipped with sensors to broadcast environmental, power, and device health information. This data is visible on the node detail screen and can be logged over time. + +## Device Telemetry + +All Meshtastic nodes report basic device telemetry: + +| Metric | Deskripsyon | Typical Range | +| ------------------ | ------------------------------ | ------------------------------------------------------------------ | +| Battery Level | Charge percentage | 0–100% | +| Voltage | Battery voltage | 3.0–4.2V (LiPo) | +| Itilizasyon Kanal | % of airtime used locally | 0–100% | +| Air Utilization TX | % of airtime used by this node | 0–100% | +| Uptime | Seconds since last boot | Varies | + +## Environment Sensors + +Supported environmental sensors: + +### Temperature & Humidity + +| Sensor | Tanperati | Imidite | Pressure | Notes | +| ------- | --------- | ------- | -------- | ----------------------- | +| BME280 | ✓ | ✓ | ✓ | Recommended all-in-one | +| BME680 | ✓ | ✓ | ✓ | Adds gas resistance/IAQ | +| SHT31 | ✓ | ✓ | — | High accuracy | +| MCP9808 | ✓ | — | — | Precision temperature | +| LPS22 | — | — | ✓ | Pressure only | + +### Air Quality + +| Sensor | Metric | Notes | +| -------- | -------------------------------------------------- | -------------------------- | +| BME680 | Gas Resistance / IAQ | Volatile organic compounds | +| PMSA003I | PM1.0, PM2.5, PM10 | Particulate matter | +| SEN55 | PM, NOx, VOC, Temp, Humidity | Multi-sensor | + +### Light & UV + +| Sensor | Metric | +| -------- | -------------------------------------- | +| OPT3001 | Ambient light (lux) | +| VEML7700 | Ambient light (lux) | +| LTR390 | UV index | + +## Power Metrics + +Nodes with INA-series power sensors can report: + +| Metric | Deskripsyon | +| ----------- | ----------------------------------------- | +| Bus Voltage | Supply rail voltage | +| Current | Power consumption (mA) | +| Power | Calculated power (mW) | + +Useful for monitoring solar charging or battery health on remote nodes. + +## Configuring Telemetry + +1. Navigate to **Settings → Module Config → Telemetry**. +2. Set reporting intervals: + - **Device Metrics Interval** — how often to broadcast device metrics + - **Environment Metrics Interval** — how often to broadcast sensor data +3. Enable specific sensor types as needed. + +### Recommended Intervals + +| Use Case | Device (s) | Environment (s) | +| ------------------------------------------ | ----------------------------- | ---------------------------------- | +| Urban mesh (many nodes) | 3600 | 3600 | +| Rural mesh (few nodes) | 900 | 900 | +| Weather station | 900 | 300 | +| Battery conservation | 7200 | 7200 | + +> ⚠️ **Note:** Shorter intervals increase airtime usage and battery drain across the mesh. + +## Viewing Telemetry + +1. Navigate to **Nodes** and select a node. +2. Telemetry sections show on the detail screen: + - Device Metrics (always available) + - Environment Metrics (if sensors present) + - Power Metrics (if INA sensor present) +3. Historical graphs show trends over time. + +![Telemetry actions](/assets/screenshots/node-metrics_telemetric_actions.png) + +## Troubleshooting + +- **No environment data showing?** The remote node needs a physical sensor connected (e.g., BME280 on I2C). Device telemetry (battery, uptime) is always available, but environment metrics require hardware. +- **Stale readings?** Check the reporting interval — very long intervals (7200s+) mean data updates infrequently. Also verify the remote node is still online. +- **Sensor conflict on I2C bus?** Some sensors share I2C addresses. If you have multiple sensors on the same bus, check for address collisions in the radio's serial debug output. + +## Related Topics + +- [Node Metrics](node-metrics) — view telemetry data on the node detail screen +- [Settings — Modules & Admin](settings-module-admin) — telemetry module configuration +- [Units & Locale](units-and-locale) — temperature and pressure display units + +--- + diff --git a/docs/ht-rHT/user/translate.md b/docs/ht-rHT/user/translate.md new file mode 100644 index 000000000..b2ed79a34 --- /dev/null +++ b/docs/ht-rHT/user/translate.md @@ -0,0 +1,97 @@ +--- +title: Translate the App +parent: User Guide +nav_order: 17 +last_updated: 2026-05-13 +aliases: + - translate + - crowdin + - localization +--- + +# Translate the App + +Contributing translations helps make Meshtastic accessible to a wider audience. The app uses [Crowdin](https://crowdin.com/) to manage community translations for both the user interface and in-app documentation. + +--- + +## What Gets Translated + +| Resource | Source Location | Notes | +| ----------------- | ------------------------------------- | ---------------------------------------------------------------------- | +| UI strings | `composeResources/values/strings.xml` | Buttons, labels, messages, and all user-visible text | +| User Guide pages | `docs/user/*.md` | In-app documentation shown in Help & Documentation | +| Fastlane metadata | `fastlane/metadata/android/en-US/` | App Store listing title, description, and changelogs | + +> **Note — Developer Guide pages are English-only.** Code-focused documentation targeting contributors is not translated. + +--- + +## How to Contribute + +1. **Visit the Crowdin project.** Open the [Meshtastic Android Crowdin project](https://crowdin.com/project/meshtastic-android) and sign in or create a free account. +2. **Choose your language.** Select an existing language or request a new one by opening a [GitHub issue](https://github.com/meshtastic/Meshtastic-Android/issues/new). +3. **Translate strings.** Crowdin shows the English source on the left and your translation on the right. Translate each string and save. +4. **Review context.** Many strings include screenshots or context comments — check these to understand where the text appears in the app. +5. **Submit.** Approved translations are automatically merged into the next release. + +> **Tip — Keep translations short.** UI strings often appear in buttons, chips, or narrow columns. If a translation is significantly longer than the English original, consider abbreviating where the meaning stays clear. + +--- + +## Adding a New Language + +If your language is not yet listed on Crowdin: + +1. Open an issue on [GitHub](https://github.com/meshtastic/Meshtastic-Android/issues/new) requesting the new locale. +2. A maintainer will add the language to Crowdin and configure `crowdin.yml`. +3. Once added, you can begin translating immediately. + +--- + +## How Translations Are Organized + +The Android app uses **Compose Multiplatform resources** for all user-visible strings: + +``` +core/resources/src/commonMain/composeResources/ +├── values/ ← English (default) +│ └── strings.xml +├── values-de/ ← German +│ └── strings.xml +├── values-fr/ ← French +│ └── strings.xml +└── ... +``` + +In-app documentation follows a similar pattern under `docs/`: + +``` +docs/ +├── user/ ← English source (default) +│ ├── onboarding.md +│ └── ... +├── fr/user/ ← French translations +│ ├── onboarding.md +│ └── ... +└── ... +``` + +The app automatically selects the correct locale based on your device's **Language & Region** settings. + +--- + +## Translation Guidelines + +- **Do not translate** technical terms like "LoRa", "MQTT", "BLE", "TAK", "SNR", or "RSSI" — these are universal. +- **Keep placeholders intact.** Strings like `%1$s` or `%d` are filled in at runtime. Do not remove or reorder them unless the grammar of your language requires it. +- **Match tone.** The app uses a friendly, direct voice. Avoid overly formal language. +- **Test if possible.** Switch your device language and open the app to see how translations look in context. + +--- + +## Questions? + +If you have questions about a specific string's context or need help getting started, open a discussion on the [Meshtastic GitHub Discussions](https://github.com/meshtastic/Meshtastic-Android/discussions) page. + +Thank you for helping expand the reach of Meshtastic! diff --git a/docs/ht-rHT/user/units-and-locale.md b/docs/ht-rHT/user/units-and-locale.md new file mode 100644 index 000000000..74b74eb6b --- /dev/null +++ b/docs/ht-rHT/user/units-and-locale.md @@ -0,0 +1,118 @@ +--- +title: Units, Measurement & Locale +parent: User Guide +nav_order: 16 +last_updated: 2026-05-12 +--- + +# Units, Measurement & Locale + +The Meshtastic app automatically displays temperatures, distances, speeds, and times in the units your device is configured to use — no settings to change inside the app. + +--- + +## How It Works + +Meshtastic radios always transmit data in **metric units** (meters, °C, km/h, hPa, etc.). When the app receives this data, it uses the `MetricFormatter` utility to convert and display values in whatever unit system your device's locale specifies. + +On Android, your measurement preferences are determined by your system **Language & Region** settings. On Desktop (JVM), the app uses the JVM's default `Locale`. + +> **Tip — You never need to toggle units inside the app.** Change your system measurement preferences and every screen in Meshtastic updates automatically — node details, telemetry charts, weather, altitude, and more. + +--- + +## Tanperati + +Temperature values from environment sensors are transmitted as **°C** and displayed based on your device's temperature unit preference. + +![Environment metrics with temperature](/assets/screenshots/nodes_environment_metrics.png) + +| Your Setting | You See | +| ------------ | ------- | +| Celsius | 22°C | +| Fahrenheit | 72°F | + +This affects all temperature displays throughout the app: node environment telemetry, soil temperature, dew point, and telemetry chart axes. + +## Distance & Altitude + +Distances between nodes and GPS altitudes are transmitted as **meters** and automatically scaled and converted. + +![Distance info display](/assets/screenshots/nodes_distance_info.png) + +| Your Setting | Small Distance | Large Distance | Altitude | +| -------------------------------- | -------------- | ---------------------- | -------- | +| Metric | 350 m | 2.5 km | 1,200 m | +| Imperial (US) | 1,148 ft | 1.6 mi | 3,937 ft | + +The app uses natural scaling — short distances stay in meters or feet, while longer distances switch to kilometres or miles automatically. + +### Where these appear + +- **Node list** — distance and bearing to each node +- **Node detail** — altitude, distance from your position +- **Map** — waypoint distances, traceroute hop distances +- **Compass** — distance to selected node + +## Speed + +GPS ground speed is displayed in your locale's preferred speed unit. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Metric | 12 km/h | +| Imperial (US) | 7 mph | + +## Wind + +Wind speed and gust data from environment sensors are transmitted as **m/s** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Metric | 5 m/s | +| Imperial (US) | 11 mph | + +Wind readings appear in the **Node Detail** environment section and the **Environment Telemetry** charts. + +## Rainfall + +Rainfall measurements (1-hour and 24-hour totals) are transmitted as **mm** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ---------------------- | +| Metric | 12 mm | +| Imperial (US) | 0.5 in | + +## Units That Never Change + +Some units are international standards and are displayed the same way regardless of your locale: + +| Measurement | Unit | Why | +| -------------------------------- | ------------------------------ | ------------------------------------- | +| Barometric pressure | hPa | International meteorological standard | +| Heading / bearing | ° (degrees) | Universal navigation convention | +| Radiation | μR/hr | Standard dosimetry unit | +| GPS coordinates | decimal degrees | Universal geographic standard | +| Humidity, battery, soil moisture | % | Universal | + +## Date & Time + +All timestamps throughout the app — last heard, message times, telemetry logs, chart axes — follow your device's date and time preferences. + +| Setting | What It Controls | Example | +| ---------------- | ---------------- | ------------------------------------------------ | +| **24-Hour Time** | Clock format | 14:30 vs 2:30 PM | +| **Date Format** | Date ordering | 09/05/2026 vs 05/09/2026 | + +The app also uses **relative time** where it makes sense — for example, "5 min ago" or "2 hours ago" in the node list — which is automatically localised into your device language. + +## Changing Your Measurement System (Android) + +On Android, your measurement system (metric vs imperial) is tied to your region setting: + +1. Open **Android Settings → System → Language & Region** +2. Change your **Region** or **Measurement units** preference +3. Return to Meshtastic — values update immediately + +> **Tip — The app uses `MetricFormatter` from `core:common`.** All measurement formatting is handled by a shared KMP utility that respects your platform's locale. Developers adding new measurement displays should use `MetricFormatter` rather than hard-coding unit conversions. + diff --git a/docs/hu-rHU/index.md b/docs/hu-rHU/index.md new file mode 100644 index 000000000..646924c27 --- /dev/null +++ b/docs/hu-rHU/index.md @@ -0,0 +1,30 @@ +--- +title: Home +layout: default +nav_order: 0 +--- + +# Meshtastic Android App Documentation + +User and developer documentation for the Meshtastic Android, Desktop, and iOS applications powered by KMP (Kotlin Multiplatform). + +Use the sidebar navigation to browse the **User Guide** for app features and the **Developer Guide** for contributing to the project. + +--- + +## Quick Links + +| Guide | Leírás | +| --------------------------------------------------------------------- | -------------------------------------------------------------- | +| [Getting Started](user/onboarding) | Connect your first radio and send a message | +| [Messages & Channels](user/messages-and-channels) | Channel broadcasts, direct messages, reactions, and encryption | +| [Nodes](user/nodes) | Understanding the mesh network node list | +| [Signal Meter](user/signal-meter) | How the LoRa signal quality meter works | +| [Units & Locale](user/units-and-locale) | How temperatures, distances, and times adapt to your region | +| [Desktop App](user/desktop) | Linux, macOS, and Windows desktop usage | +| [Architecture](developer/architecture) | App architecture overview for contributors | +| [Contributing](developer/contributing) | Branch naming, PR workflow, and verification commands | + +--- + +> This documentation is served from the same markdown source that powers the in-app **Help & Documentation** browser. diff --git a/docs/hu-rHU/user/connections.md b/docs/hu-rHU/user/connections.md new file mode 100644 index 000000000..9f0d50917 --- /dev/null +++ b/docs/hu-rHU/user/connections.md @@ -0,0 +1,125 @@ +--- +title: Connections +nav_order: 2 +last_updated: 2026-05-13 +description: Connect your phone or desktop to a Meshtastic radio via Bluetooth, USB, or TCP/IP. +aliases: + - bluetooth + - usb + - tcp + - pairing +--- + +# Connections + +Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node. + +## Bluetooth (BLE) + +Bluetooth Low Energy is the default and most common connection method on Android. + +### Pairing a Device + +1. Ensure your Meshtastic radio is powered on and in pairing mode. +2. Open the app and navigate to **Connections**. +3. Tap **Scan for Devices** — nearby Meshtastic radios will appear. +4. Select your device from the list. +5. Accept the Bluetooth pairing prompt if shown. + +![Device list item](/assets/screenshots/connections_bluetooth_scan.png) + +You can filter devices by transport type using the filter chips at the top: + +![Transport filter chips](/assets/screenshots/connections_transport_filters.png) + +> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. + +### Connection Status + +| Icon | State | Leírás | +| ---- | -------------- | ----------------------------- | +| 🟢 | Csatlakoztatva | Active radio link established | +| 🟡 | Csatlakozás… | Handshake in progress | +| 🔴 | Szétkapcsolva | No active connection | +| ⚪ | Not configured | No device selected | + +When connecting, a status indicator shows the current connection state: + +![Connecting status](/assets/screenshots/connections_connecting.png) + +If no devices are found, the app shows an empty state with instructions: + +![No devices found](/assets/screenshots/connections_empty_state.png) + +### Troubleshooting Bluetooth + +- **Device not found:** Toggle Bluetooth off/on, ensure location is enabled. +- **Connection drops:** Move closer to the radio; check for interference. +- **Pairing rejected:** Forget the device in Android Bluetooth settings and retry. + +## USB Serial + +USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable. + +### Setup + +1. Connect your radio via USB cable to your device. +2. The app will prompt for USB permission — tap **Allow**. +3. The connection is established automatically. + +> ⚠️ **Note:** USB connections require OTG support on Android devices. + +## TCP/IP (WiFi) + +Some Meshtastic radios support WiFi connectivity, allowing TCP-based connections. + +### Configuration + +1. Connect your radio to a WiFi network via the radio's web interface or settings. +2. In the app, go to **Connections → TCP**. +3. Enter the radio's IP address and port (default: 4403). +4. Tap **Connect**. + +![WiFi scanning for devices](/assets/screenshots/connections_wifi_scanning.png) + +When a device is found, it appears in the connection list: + +![WiFi device found](/assets/screenshots/connections_wifi_device_found.png) + +A successful connection is confirmed with a status indicator: + +![WiFi connection success](/assets/screenshots/connections_wifi_success.png) + +### When to Use TCP + +- Radio is on the same local network +- Testing with a simulated radio +- Environments where Bluetooth has interference issues + +## Reconnection Behavior + +The app reconnects to the **last selected device** on startup. You can manually switch transports from the connections screen at any time. + +To disconnect from a radio, use the disconnect button on the connections screen: + +![Disconnect from radio](/assets/screenshots/connections_disconnect.png) + +## Desktop Connections + +On Desktop (Linux/macOS/Windows), the app supports: + +- **Bluetooth (BLE)** — via the Kable library; works on macOS, Linux, and Windows +- **USB Serial** — primary wired connection method +- **TCP/IP** — for network-connected radios + +See [Desktop App](desktop) for platform-specific details and keyboard shortcuts. + +## Related Topics + +- [Getting Started](onboarding) — first-launch setup and permissions +- [Settings — Radio & User](settings-radio-user) — Bluetooth and network configuration +- [Desktop App](desktop) — desktop-specific connection details +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — full list of compatible radios on meshtastic.org + +--- + diff --git a/docs/hu-rHU/user/desktop.md b/docs/hu-rHU/user/desktop.md new file mode 100644 index 000000000..d252f9b71 --- /dev/null +++ b/docs/hu-rHU/user/desktop.md @@ -0,0 +1,147 @@ +--- +title: Desktop App +nav_order: 14 +last_updated: 2026-05-13 +description: Install and use the Meshtastic Desktop app on Linux, macOS, and Windows — connections, feature parity, and keyboard shortcuts. +aliases: + - desktop + - linux + - macos + - windows + - jvm +--- + +# Desktop App + +The Meshtastic Desktop application provides the same mesh communication features on Linux, macOS, and Windows. + +## Overview + +The Desktop app shares its core codebase with the Android app through Kotlin Multiplatform (KMP). Most features work identically across platforms. + +## Installation + +### Linux + +- Download the `.deb` or `.AppImage` package from the releases page +- Or build from source using `./gradlew :desktopApp:run` + +### macOS + +- Download the `.dmg` package from releases +- Or build from source + +### Windows + +- Download the `.msi` installer from releases +- Or build from source + +## Connecting Your Radio + +### USB Serial (Primary) + +The most reliable connection method on Desktop: + +1. Connect your Meshtastic radio via USB cable. +2. The app should detect the serial port automatically. +3. If not detected, select the correct serial port from the connections menu. + +### TCP/IP + +For network-connected radios: + +1. Enter the radio's IP address and port (default: 4403). +2. Click **Connect**. + +### Bluetooth (BLE) + +Bluetooth Low Energy is supported on Desktop via the [Kable](https://github.com/JuulLabs/kable) library: + +1. Ensure your system has a Bluetooth adapter. +2. The app scans for nearby Meshtastic radios automatically. +3. Select your device from the connections screen. + +## Feature Parity + +| Feature | Android | Desktop | Jegyzetek | +| ---------------------------------------- | ------- | ------- | -------------------------- | +| Messaging | ✓ | ✓ | Full parity | +| Node List | ✓ | ✓ | Full parity | +| Térkép | ✓ | ✓ | Full parity | +| Beállítások | ✓ | ✓ | Full parity | +| Bluetooth (BLE) | ✓ | ✓ | Via Kable on desktop | +| Firmware Update OTA | ✓ | ✗ | Use web flasher | +| Notifications | ✓ | ✓ | Native OS notifications | +| Widgets | ✓ | ✗ | Android-only | +| AI Assistant (Chirpy) | ✓\* | ✗ | Google flavor Android only | + +\*Chirpy AI requires Android 14+ on Google flavor builds with supported hardware. + +## UI Differences + +The Desktop app uses the same Compose Multiplatform UI with adaptations for larger screens and desktop interaction. + +### Keyboard Shortcuts + +| Shortcut | Action | +| ------------------- | --------------------------- | +| **⌘Q** / **Ctrl+Q** | Quit the application | +| **⌘,** / **Ctrl+,** | Open Settings | +| **⌘1** / **Ctrl+1** | Switch to Conversations tab | +| **⌘2** / **Ctrl+2** | Switch to Nodes tab | +| **⌘3** / **Ctrl+3** | Switch to Map tab | +| **⌘4** / **Ctrl+4** | Switch to Connections tab | + +### Window & System Tray + +- **Window resizing** — responsive layout adapts to window dimensions +- **System tray** — minimize to system tray for background mesh operation +- **Tray menu** — right-click the tray icon to show window or quit +- **Mouse interaction** — hover states and standard desktop navigation + +### Notification Preferences + +The Desktop app provides in-app toggles for controlling which notifications are shown — messages, new nodes, and low battery alerts. Access these from **Settings → Notifications** within the app. + +## Built-in Documentation Browser + +The Desktop app includes a built-in documentation browser for quick access to help content without leaving the application. + +![Docs browser with table of contents](/assets/screenshots/docs-browser_toc.png) + +The browser supports full-text search across all documentation: + +![Searching the docs browser](/assets/screenshots/docs-browser_search.png) + +Individual doc pages render with full formatting: + +![A documentation page](/assets/screenshots/docs-browser_page.png) + +## Building from Source + +```bash +git clone https://github.com/meshtastic/Meshtastic-Android.git +cd Meshtastic-Android +git submodule update --init +./gradlew :desktopApp:run +``` + +Requirements: + +- JDK 21 +- No Android SDK required for desktop-only builds + +## Known Limitations + +- No OTA firmware updates (use web flasher) +- Some Android-specific features (widgets, specific notification channels) are unavailable +- Performance may vary on low-spec hardware running Compose Desktop +- BLE bonding is not yet supported on desktop (pairing works without bonding) + +## Related Topics + +- [Connections](connections) — connection methods overview +- [Firmware Updates](firmware) — use the [Web Flasher](https://flasher.meshtastic.org) for desktop firmware updates + +--- + diff --git a/docs/hu-rHU/user/discovery.md b/docs/hu-rHU/user/discovery.md new file mode 100644 index 000000000..ec0dc1822 --- /dev/null +++ b/docs/hu-rHU/user/discovery.md @@ -0,0 +1,114 @@ +--- +title: Discovery +nav_order: 12 +last_updated: 2026-05-13 +description: Explore your mesh network — traceroute paths, neighbor maps, and node discovery tools. +aliases: + - mesh-discovery + - local-discovery + - network-scan + - traceroute + - neighbor-info +--- + +# Discovery + +Discovery tools help you understand **how** your mesh network is connected — which nodes can hear each other, what paths messages take, and where bottlenecks or weak links exist. + +> 💡 **Tip:** You don't need a dedicated "discovery mode" to start exploring your mesh. The tools below are available right now from the node list and node detail screens. + +--- + +## Traceroute + +Traceroute reveals the exact path a message takes from your node to any other node on the mesh. It's the single most useful tool for debugging connectivity problems. + +### Running a Traceroute + +1. Navigate to **Nodes** and tap the node you want to trace. +2. On the node detail screen, tap **Traceroute**. +3. The app sends a traceroute request and waits for the response. +4. Results display each hop in order, with signal quality at every step. + +### Reading the Results + +A traceroute result looks like this: + +``` +You → Node A (SNR: 8.5, RSSI: -95) → Node B (SNR: 5.2, RSSI: -108) → Target +``` + +Each hop represents a relay node that forwarded the message. The SNR and RSSI values at each hop tell you about the link quality on that specific segment. + +| What to look for | What it means | +| -------------------------------------------------------------------------- | --------------------------------------------------------------------------- | +| All hops show Good SNR (> 5 dB) | Healthy path — messages flow reliably | +| One hop shows Bad SNR (< 0 dB) | Weak link — this relay segment is fragile | +| Many hops (4+) | Long path — consider repositioning a node to shorten it | +| Different path on retry | Mesh is adapting — multiple routes exist (this is good!) | + +> 💡 **Tip:** Run traceroute several times over a few minutes. If the path changes, your mesh has redundant routes — a sign of a well-connected network. + +### Troubleshooting with Traceroute + +- **"No route found"** — The target node may be offline, out of range, or on a different channel. Check that both nodes share at least one channel with the same encryption key. +- **Traceroute times out** — The path may be too long (exceeds hop limit) or a relay node is congested. Try increasing the hop limit in **Settings → LoRa Config**. +- **Asymmetric paths** — A traceroute from A→B may take a different path than B→A. This is normal — radio propagation is not always symmetric. + +--- + +## Szomszéd-információ + +The Neighbor Info module lets each node broadcast a list of the nodes it can **directly hear** (single-hop). When multiple nodes share their neighbor lists, you can piece together a topology map of the entire mesh. + +### Enabling Neighbor Info + +1. Navigate to **Settings → Module Config → Neighbor Info**. +2. Enable the module. +3. Set the broadcast interval (default: 900 seconds / 15 minutes). + +Once enabled, your node periodically broadcasts its neighbor table. Other nodes with Neighbor Info enabled do the same. + +### Viewing Neighbor Data + +- Open any node's detail screen and look for the **Neighbors** section. +- Each neighbor entry shows the node that was directly heard and its signal quality. +- Combine neighbor data from multiple nodes to understand the full mesh topology. + +> ⚠️ **Note:** Neighbor Info increases airtime usage because every enabled node periodically broadcasts its neighbor list. On busy meshes with many nodes, consider longer broadcast intervals (3600 seconds or more) to avoid congestion. + +--- + +## Node List as a Discovery Tool + +The node list itself is a powerful discovery tool when you use its filtering and sorting features effectively. + +### Finding New Nodes + +- Sort by **Last heard** to see the most recently active nodes at the top. +- Enable **Include unknown** to see nodes that have appeared on the mesh but haven't sent user info yet — these are often newly powered-on devices. + +### Assessing Connectivity + +- Sort by **Hops away** to see which nodes are directly reachable (0 hops) versus relayed. +- Sort by **Distance** to find nearby nodes and verify they're reachable. +- Use **Exclude MQTT** to focus on nodes reachable over radio (not via internet bridge). + +### Infrastructure Audit + +- Disable **Exclude infrastructure** to see Router, Repeater, Router Late, and Client Base nodes. +- Check their signal quality and last-heard times to verify your infrastructure nodes are healthy. + +See [Nodes](nodes) for full details on filtering and sorting options. + +--- + +## Tips for Mesh Exploration + +- **Start with traceroute** — it gives you immediate, actionable information about a specific path. +- **Enable Neighbor Info on key nodes** — especially routers and repeaters, to build a picture of the backbone. +- **Check the map** — node positions on the [Map](map-and-waypoints) combined with signal data help you understand why some links are strong and others are weak. +- **Compare signal over time** — use the [Signal Meter](signal-meter) guide to interpret SNR and RSSI values correctly. + +--- + diff --git a/docs/hu-rHU/user/firmware.md b/docs/hu-rHU/user/firmware.md new file mode 100644 index 000000000..4b8b24cc4 --- /dev/null +++ b/docs/hu-rHU/user/firmware.md @@ -0,0 +1,114 @@ +--- +title: Firmware Updates +nav_order: 13 +last_updated: 2026-05-13 +description: Update your radio firmware over Bluetooth — OTA process, version channels, pre-flight checks, and recovery. +aliases: + - firmware + - update + - ota + - flash +--- + +# Firmware Updates + +Keep your Meshtastic radio up to date with the latest firmware for new features, bug fixes, and security improvements. + +## Checking for Updates + +1. Navigate to **Settings → Firmware Update** or tap the firmware notification if shown. +2. The app checks for available firmware versions. +3. Available updates show the version number and changelog summary. + +## Update Methods + +### OTA (Over-The-Air) via Bluetooth + +The most common update method for Android users: + +1. Ensure your radio is connected via Bluetooth. +2. Navigate to the Firmware Update screen. +3. Select the desired firmware version. +4. Tap **Update** to begin the OTA process. +5. Wait for the update to complete — **do not disconnect** during the update. + +![Firmware checking for updates](/assets/screenshots/firmware_checking.png) + +> ⚠️ **Warning:** Interrupting a firmware update can brick your device. Ensure your radio has sufficient battery (>50% recommended) and maintain Bluetooth proximity during the entire process. + +![Firmware disclaimer](/assets/screenshots/firmware_disclaimer.png) + +### USB Flashing + +For recovery or when OTA is unavailable: + +- Use the [Meshtastic Web Flasher](https://flasher.meshtastic.org) +- Or the [Meshtastic CLI tool](https://meshtastic.org/docs/getting-started/flashing-firmware) on desktop + +## Version Channels + +| Csatorna | Leírás | +| -------- | ------------------------------------------- | +| Stable | Recommended for most users; tested releases | +| Alpha | Preview releases; may contain bugs | + +## Pre-Update Checklist + +Before updating: + +- [ ] Battery > 50% +- [ ] Stable Bluetooth connection +- [ ] Note your current settings (they may reset on major version changes) +- [ ] Check the release notes for breaking changes + +## Post-Update + +After a successful update: + +- The radio will reboot automatically +- Bluetooth connection will re-establish +- Verify your settings are intact +- Check the firmware version in **Settings → About** + +![Firmware update success](/assets/screenshots/firmware_success.png) + +## Troubleshooting + +### Update Stuck + +If the update appears frozen: + +- Wait at least 5 minutes before intervening +- If truly stuck, power-cycle the radio +- Attempt the update again + +![Firmware update error](/assets/screenshots/firmware_error.png) + +### Device Won't Boot After Update + +If your device fails to boot: + +1. Try connecting via USB to a computer +2. Use the web flasher in recovery/DFU mode +3. Flash a known-good firmware version +4. Check the Meshtastic Discord for device-specific recovery steps + +### Compatibility Warnings + +The app may show warnings when: + +- Connected radio firmware is below minimum supported version +- Major version mismatch between app and firmware +- Deprecated features need migration + +> ⚠️ **Important:** Always update the Meshtastic app before or alongside firmware updates to ensure compatibility. + +## Related Topics + +- [Connections](connections) — reconnecting after a firmware update +- [Flashing firmware guide](https://meshtastic.org/docs/getting-started/flashing-firmware) — full firmware flashing walkthrough on meshtastic.org +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — check firmware compatibility by device +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/hu-rHU/user/map-and-waypoints.md b/docs/hu-rHU/user/map-and-waypoints.md new file mode 100644 index 000000000..99fae4acd --- /dev/null +++ b/docs/hu-rHU/user/map-and-waypoints.md @@ -0,0 +1,116 @@ +--- +title: Map & Waypoints +nav_order: 6 +last_updated: 2026-05-13 +description: View node positions on the map, create and share waypoints, and manage position sharing and privacy. +aliases: + - map + - waypoints + - gps + - location +--- + +# Map & Waypoints + +The Map screen shows the geographic positions of nodes on your mesh, along with shared waypoints. + +## Map View + +The map displays: + +- **Node positions** — colored markers for each node reporting location +- **Waypoints** — shared points of interest +- **Your position** — your current GPS location + +### Node Markers + +Node markers on the map indicate: + +| Color | Meaning | +| ------ | ---------------------------------------------- | +| Zöld | Online (heard recently) | +| Yellow | Away (heard within 2 hours) | +| Gray | Offline (stale position) | +| Kék | Your own node | + +### Map Controls + +- **Zoom** — pinch or use +/- buttons +- **Pan** — drag to explore +- **Center** — select the location button to center on your position +- **Node tap** — tap a node marker to view details + +The floating toolbar provides quick access to compass, layer switching, node filters, refresh, and location tracking. Tap the compass to reorient north-up, or tap the location button to center on your current position. + +![Map controls overlay](/assets/screenshots/map_controls_overlay.png) + +## Waypoints + +Waypoints are shared geographic points of interest that all mesh members can see. + +### Creating a Waypoint + +1. Long-press on the map at the desired location. +2. Enter a name and optional description. +3. Choose an icon/emoji for the waypoint. +4. Tap **Send** to share with the mesh. + +### Waypoint Properties + +| Property | Leírás | +| ---------- | ------------------------------------------------------- | +| Név | Short identifier (max 30 characters) | +| Leírás | Optional longer description | +| Icon | Visual marker emoji on the map | +| Zárolt | If locked, only the creator can edit or delete | +| Expiration | Optional auto-remove time | + +### Waypoint Expiration + +Waypoints can be set to expire automatically: + +- **Never** (default) — waypoint remains until manually deleted +- **Timed** — waypoint is automatically removed after the specified duration (e.g., "remove after 2 hours"). Useful for temporary markers like rally points, hazards, or meeting locations. + +Expired waypoints are automatically hidden from the map so they don't clutter the display. The expiration countdown begins when the waypoint is created, not when other nodes receive it. + +### Managing Waypoints + +- Tap a waypoint on the map to view its details and coordinates +- Edit or delete waypoints you created +- **Locked waypoints** cannot be modified or deleted by other nodes — only the original creator can change them +- Unlocked waypoints can be edited by any mesh member + +## Position Sharing + +### Enabling Position Sharing + +Your node shares its GPS position based on: + +- **Fixed interval** — broadcast position at regular intervals +- **Smart position** — broadcast when movement exceeds a threshold +- **Manual** — only share when explicitly requested + +Configure position behavior in **Settings → Position**. + +### Privacy Considerations + +> 🔒 **Privacy:** Position data is broadcast to all nodes on your channel. If you don't want your location shared, disable GPS position in settings or use a fixed/fake position. + +## Map Sources + +The app supports multiple map tile sources: + +- OpenStreetMap (default) +- Satellite imagery (where available) +- Offline tiles (download map areas for offline use) + +## Related Topics + +- [Nodes](nodes) — view and filter your node list +- [Node Metrics](node-metrics) — signal quality and position history for individual nodes +- [Discovery](discovery) — traceroute and neighbor info for understanding mesh topology +- [Units & Locale](units-and-locale) — distance and coordinate display formats + +--- + diff --git a/docs/hu-rHU/user/messages-and-channels.md b/docs/hu-rHU/user/messages-and-channels.md new file mode 100644 index 000000000..6b0ac38a1 --- /dev/null +++ b/docs/hu-rHU/user/messages-and-channels.md @@ -0,0 +1,159 @@ +--- +title: Messages & Channels +nav_order: 3 +last_updated: 2026-05-13 +description: Send and receive messages, manage channels, configure encryption, and use quick chat, reactions, and message actions. +aliases: + - channels + - direct-messages + - messaging + - conversations +--- + +# Messages & Channels + +Meshtastic supports two communication modes: **channel broadcasts** and **direct messages**. + +## Csatornák + +Channels are shared communication groups. All nodes configured with the same channel key can read and send messages on that channel. + +### Default Channel + +Every Meshtastic device comes with a default **LongFast** channel. This is an unencrypted channel used for general mesh communication. + +### Csatorna biztonság + +Channels support multiple encryption levels: + +| Icon | Security Level | Leírás | +| ---- | ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------- | +| 🔒 | PSK (256-bit AES) | Fully encrypted with a strong pre-shared key. Only nodes with the matching key can read messages. | +| 🔐 | PSK (128-bit AES) | Encrypted with a shorter key. Secure for most uses but 256-bit is preferred for sensitive data. | +| 🔓 | Default / Open | Uses the well-known default key. **Any Meshtastic device** on the same preset can read these messages. | +| ⚠️ | Insecure + Position | Open channel that also broadcasts your GPS position. Use with caution in public meshes. | + +> 🔒 **Security Tip:** 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. + +### Adding a Channel + +1. Navigate to **Settings → Channels**. +2. Tap **Add Channel** or scan a QR code. +3. Configure the channel name and encryption key. +4. Share the channel URL/QR code with others who need access. + +Tapping a channel shows its details and sharing options. + +## Direct Messages + +Direct messages (DMs) are point-to-point encrypted communications between two specific nodes. + +### Sending a Direct Message + +1. Open the **Messages** tab. +2. Select a node from your contacts list or tap a node in the node list. +3. Type your message and tap **Send**. + +### Message States + +| State | Icon | Meaning | +| --------------------------------- | ---- | ----------------------------------------------------------------------------------------------------------------- | +| Queued | ⏳ | Message waiting to be sent | +| En route | ✓ | Delivered to the radio, awaiting acknowledgment | +| Delivered | ✓✓ | Acknowledgment received from recipient | +| Received | ✓ | Message received from the mesh (incoming) | +| S&F Routing | 🔗 | Store & Forward: message being routed through an S&F node | +| S&F Confirmed | 🔗 | Store & Forward: delivery confirmed via S&F node | +| Hiba | ✗ | Delivery failed after retries | + +### Delivery Errors + +When a message fails to deliver, the error indicator shows what went wrong: + +| Hiba | Meaning | What to Do | +| ---------------- | ---------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| No Route | No path exists to the destination node | The recipient may be offline or out of mesh range. Try later or move closer. | +| Got NAK | The next-hop node refused to relay | The relay node may be congested. Wait and retry. | +| Időtúllépés | No acknowledgment within retry window | The recipient may be just out of range. Try increasing hop limit or moving to a better position. | +| Nincs Interfész | No radio interface available to send | Check that your radio is connected and the channel is configured. | +| Max Retransmit | All retry attempts exhausted | The mesh path is unreliable. Try a different channel or wait for conditions to improve. | +| Nincs Csatorna | The destination channel doesn't exist | Verify both nodes share the same channel configuration. | +| Too Large | Message exceeds maximum payload size | Shorten your message (max ~230 characters). | +| No Response | Node received message but didn't respond | The recipient's radio may be busy or in low-power sleep mode. | +| Duty Cycle Limit | Regional airtime limit reached | Your radio has used its allowed transmit time. Wait for the duty cycle window to reset (typically 1 hour in EU regions). | +| Hibás kérés | Malformed or invalid message | This usually indicates a software bug. Try restarting the app. | + +> 💡 **Tip:** 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. + +## Message Features + +### Quick Chat + +Pre-configured messages for rapid communication: + +- Access via the Quick Chat button in the message input area +- Choose from built-in phrases or custom messages +- Customize quick chat messages in **Settings → Quick Chat** +- Useful when typing is impractical (gloves, small screen, urgent) + +![Quick chat option](/assets/screenshots/messages_quick_chat.png) + +The channel list shows each channel with its latest message preview. + +### Message Bubbles + +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. + +### Reactions + +React to messages with emoji: + +- **Long-press** a message to open the actions menu +- Tap **Add Reaction** to choose an emoji +- Reactions appear below the message bubble +- Multiple users can react to the same message +- React to your own messages or others' messages + +![Emoji reaction badges displayed beneath a message](/assets/screenshots/messages_reaction.png) + +> 💡 **Tip:** Reactions are lightweight — they use minimal mesh bandwidth compared to full text messages. + +### Message Actions + +Long-press any message to access: + +- **Copy** — copy message text to clipboard +- **Reply** — quote the message in your response +- **React** — add an emoji reaction +- **Delete** — remove a message you sent (local deletion) + +### Message Priority + +Messages are queued and transmitted based on priority: + +1. Emergency/alert messages (highest) +2. Direct messages +3. Channel broadcasts (lowest) + +### Message Limits + +- **Maximum length:** 237 bytes (approximately 230 characters for ASCII text) +- **Rate limiting:** The mesh enforces airtime fairness; heavy message volume may be throttled +- **Delivery:** Messages are retried automatically if no acknowledgment is received + +## Best Practices + +- Use channels for group coordination +- Use direct messages for private person-to-person communication +- Keep messages short — mesh bandwidth is limited +- Configure encryption for sensitive communications + +## Related Topics + +- [Nodes](nodes) — tap a node to start a direct message +- [Settings — Radio & User](settings-radio-user) — configure channel encryption and presets +- [MQTT](mqtt) — bridge channel messages to the internet +- [Channel configuration](https://meshtastic.org/docs/configuration/radio/channels) — detailed channel settings on meshtastic.org + +--- + diff --git a/docs/hu-rHU/user/mqtt.md b/docs/hu-rHU/user/mqtt.md new file mode 100644 index 000000000..8c46e8cd5 --- /dev/null +++ b/docs/hu-rHU/user/mqtt.md @@ -0,0 +1,137 @@ +--- +title: MQTT +nav_order: 11 +last_updated: 2026-05-13 +description: Bridge your mesh to the internet — MQTT broker setup, encryption layers, and map reporting. +aliases: + - mqtt + - internet-bridge + - broker +--- + +# MQTT + +MQTT bridges your Meshtastic mesh network to the internet, enabling long-range communication beyond radio range. + +## Overview + +The MQTT module connects your node to an MQTT broker, allowing: + +- Messages to reach nodes on different physical meshes via the internet +- Integration with home automation and monitoring systems +- Publishing node positions to the public Meshtastic map +- Custom data pipelines for logging and alerting + +## How It Works + +``` +[Your Node] → Radio → [Gateway Node with WiFi] → MQTT Broker → [Remote Gateway] → Radio → [Remote Node] +``` + +A gateway node with internet access (WiFi or Ethernet) publishes mesh messages to an MQTT topic. Remote gateways subscribed to the same topic inject those messages into their local mesh. + +## Configuration + +### Enabling MQTT + +1. Navigate to **Settings → Module Config → MQTT**. +2. Enable the MQTT module. +3. Configure the broker connection: + +![MQTT toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | Leírás | Alapértelmezett | +| --------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------- | +| Server Address | MQTT broker hostname | mqtt.meshtastic.org | +| Felhasználónév | Broker authentication | meshdev | +| Jelszó | Broker authentication | large4cats | +| Root Topic | Base topic for messages | msh | +| Encryption | Encrypt MQTT payload | Engedélyezve | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON packet support has been removed from firmware; this field is ignored | Disabled | +| TLS | Secure connection to broker | Disabled | +| Map Reporting | Report position to public map | Disabled | + +### Default Meshtastic Broker + +The community maintains a public broker at `mqtt.meshtastic.org`. This is intended for general use and testing. + +> 🔒 **Privacy:** Messages on the public broker are readable by anyone subscribed. Always use channel encryption for private communications. + +### Private Broker + +For better privacy and control, you can run your own MQTT broker: + +- Mosquitto (lightweight, open-source) +- HiveMQ +- EMQX + +Configure your node to point to your private broker with appropriate credentials. + +## Map Reporting + +When Map Reporting is enabled, your node publishes its position to the Meshtastic community map: + +- Visible at [meshmap.net](https://meshmap.net) and similar community map services +- Only position and node info are shared +- Disable this if you don't want your location publicly visible + +## Uplink vs Downlink + +| Direction | Leírás | +| ------------ | -------------------------------- | +| **Uplink** | Messages from mesh → MQTT broker | +| **Downlink** | Messages from MQTT broker → mesh | + +Configure per-channel which directions are active to control message flow and airtime usage. + +## Message Formats + +MQTT uses protobuf message format: + +| Format | Leírás | Use case | +| ------------ | ----------------------------------- | -------------------------- | +| **Protobuf** | Binary Meshtastic protobuf encoding | Node-to-node mesh bridging | + +> ⚠️ **Note:** JSON output support was removed from firmware. The `json_enabled` setting is still visible in the app for legacy compatibility but has no effect on current firmware versions. + +## Encryption & Privacy + +Understanding the layered encryption model: + +1. **Channel encryption** happens on the mesh _before_ MQTT. If your channel has a PSK, the MQTT payload is already encrypted — the broker and any subscribers see only the ciphertext. +2. **MQTT encryption** (the module setting) adds an additional encryption layer for transit to the broker. This protects metadata and routing information. +3. **TLS** encrypts the TCP connection to the broker itself, preventing network-level eavesdropping. + +> 🔒 **Important:** The default public channel has a well-known key. Messages on the default channel sent via MQTT are effectively **unencrypted** — anyone can decode them. Always use a custom PSK for private communications. + +## Best Practices + +- Use channel-level encryption (PSK) on channels that bridge to MQTT +- Don't enable MQTT on nodes without internet access (it will buffer and waste memory) +- Use a private broker for sensitive deployments +- Be mindful of airtime when downlinking messages from busy MQTT topics — every downlinked message consumes radio airtime on your local mesh +- Consider enabling uplink-only if you only need to monitor your mesh remotely without injecting messages back + +## Troubleshooting + +### MQTT Not Connecting + +- **Check WiFi** — the gateway node must have an active internet connection (WiFi or Ethernet). MQTT does not work over the LoRa radio link itself. +- **Verify credentials** — incorrect username or password will silently fail on most brokers. Double-check for trailing spaces. +- **Firewall** — port 1883 (MQTT) or 8883 (MQTT+TLS) must be open. Some networks block non-standard ports. +- **DNS resolution** — if using a custom broker hostname, verify the node can resolve it. Try the broker's IP address directly. + +### Messages Not Bridging + +- **Check uplink/downlink settings** — if only uplink is enabled, messages flow from mesh to MQTT but not back. Enable downlink on the receiving gateway. +- **Channel mismatch** — both gateways must share the same channel with the same PSK. A mismatch means messages are encrypted with different keys and appear as garbage. +- **Topic mismatch** — ensure both gateways use the same root topic. The default `msh` works for the public broker. + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — MQTT module configuration reference +- [Messages & Channels](messages-and-channels) — channel encryption and PSK setup +- [MQTT integration guide](https://meshtastic.org/docs/software/integrations/mqtt) — detailed MQTT documentation on meshtastic.org + +--- + diff --git a/docs/hu-rHU/user/node-metrics.md b/docs/hu-rHU/user/node-metrics.md new file mode 100644 index 000000000..a16668b4f --- /dev/null +++ b/docs/hu-rHU/user/node-metrics.md @@ -0,0 +1,130 @@ +--- +title: Node Metrics +nav_order: 5 +last_updated: 2026-05-13 +description: Telemetry dashboards for each mesh node — device health, environment sensors, signal quality, power, traceroute, and position history. +aliases: + - metrics + - telemetry + - device-metrics + - signal +--- + +# Node Metrics + +The node detail screen provides comprehensive telemetry and metrics for each node on your mesh. + +## Eszközmetrikák + +Basic operating information reported by each node: + +| Metric | Leírás | +| ----------------- | ----------------------------------- | +| Battery Level | Current battery percentage | +| Feszültség | Battery voltage reading | +| Csatornahasználat | Percentage of airtime consumed | +| Airtime | Transmission time used by this node | +| Működési idő | Time since last reboot | + +Device metrics are displayed as individual cards with trend sparklines showing battery level, voltage, channel utilization, airtime, and uptime over time. + +> 💡 **Tip:** Tap any metric card to expand it into a full chart with historical data points. Pinch to zoom the time axis. + +## Környezeti metrikák + +Environmental sensor data (requires compatible hardware): + +| Metric | Sensor Examples | +| ------------------------------------ | --------------------- | +| Hőmérséklet | BME280, BME680, SHT31 | +| Páratartalom | BME280, BME680, SHT31 | +| Légnyomás | BME280, BMP280 | +| Gázellenállás | BME680 | +| IAQ (Air Quality) | BME680 | + +Environment metrics are charted over time for easy trend analysis — temperature, humidity, and pressure each get their own line chart with the measurement unit displayed on the Y axis. + +> 💡 **Tip:** Environment metrics require a sensor connected to the remote node. Not all nodes report environmental data. See [Telemetry & Sensors](telemetry-and-sensors) for a full list of supported sensors. + +## Signal Metrics + +Radio signal quality information: + +| Metric | Leírás | +| --------- | ----------------------------------------------------------------------------- | +| SNR | Signal-to-Noise Ratio (higher is better) | +| RSSI | Received Signal Strength Indicator (closer to 0 is better) | +| Hop Count | Number of mesh hops for last message | + +### Signal Quality Reference + +| SNR Range | Quality | +| --------------------------------- | --------- | +| > 10 dB | Excellent | +| 0 to 10 dB | Jó | +| -10 to 0 dB | Megfelelő | +| < -10 dB | Poor | + +## Tápellátási metrikák + +Power management telemetry (requires INA sensor or compatible hardware): + +| Metric | Leírás | +| ----------- | ----------------------- | +| Bus Voltage | Supply voltage | +| Áramerősség | Power draw in milliamps | +| Energia | Calculated wattage | + +## Traceroute + +Traceroute shows the path a message takes through the mesh: + +1. From the node detail screen, tap **Traceroute**. +2. The app sends a traceroute request to the target node. +3. Results show each hop with SNR/RSSI values. + +### Reading Traceroute Results + +``` +You → Node A (SNR: 8.5) → Node B (SNR: 5.2) → Target +``` + +Each hop represents a relay node that forwarded the message. + +## Pozíciónapló + +Historical position data for nodes that share their location: + +- GPS coordinates +- Magasság +- Speed (if moving) +- Timestamp for each position report + +## Szomszéd-információ + +Shows which nodes a given node can directly hear, useful for understanding mesh topology. + +## Viewing Metrics + +1. Navigate to **Nodes**. +2. Tap the node you want to inspect. +3. Select the metric category from the detail tabs. + +![Node detail — local device](/assets/screenshots/nodes_detail_local.png) + +The position tab shows location data for nodes that share GPS: + +![Position inline content](/assets/screenshots/nodes_position.png) + +> ⚠️ **Note:** Metrics are only available when they have been reported by the remote node. Metrics update at intervals configured on each node's telemetry settings. + +## Related Topics + +- [Nodes](nodes) — node list, filtering, and sorting +- [Telemetry & Sensors](telemetry-and-sensors) — supported sensors and configuration +- [Signal Meter](signal-meter) — how signal quality is calculated from SNR and RSSI +- [Discovery](discovery) — traceroute details and neighbor info +- [Units & Locale](units-and-locale) — temperature, distance, and speed display formats + +--- + diff --git a/docs/hu-rHU/user/nodes.md b/docs/hu-rHU/user/nodes.md new file mode 100644 index 000000000..135cc5b66 --- /dev/null +++ b/docs/hu-rHU/user/nodes.md @@ -0,0 +1,152 @@ +--- +title: Csomópontok +nav_order: 4 +last_updated: 2026-05-13 +description: Browse, filter, and sort mesh nodes — view details, signal quality, roles, and quick actions. +aliases: + - node-list + - mesh-nodes + - peers +--- + +# Csomópontok + +The Nodes screen displays all devices visible on your mesh network. + +## Node List + +The node list shows every node your radio has heard, including: + +- **Node name** — user-configured long name +- **Short name** — 4-character identifier +- **Signal quality** — last heard signal strength +- **Last heard** — time since last communication +- **Distance** — estimated distance (if positions are shared) +- **Battery** — remote node battery level (if telemetry is enabled) + +### Node Status Indicators + +| Badge | Meaning | +| ---------- | ------------------------------------- | +| 🟢 Online | Node heard within the last 15 minutes | +| 🟡 Away | Node heard within the last 2 hours | +| 🔴 Offline | Node not heard for over 2 hours | +| ⭐ Favorite | Node marked as favorite by the user | + +### Node Roles + +Nodes can be configured with different roles that affect their mesh behavior: + +| Szerepkör | Leírás | +| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Kliens | Standard end-user device | +| Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | +| Néma Kliens | Receives but doesn't retransmit | +| Rejtett Kliens | Like Client Mute, plus hides from node list | +| Router | Prioritizes message forwarding; stays awake to relay | +| Késő Router | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | +| ~~Router Client~~ | ⚠️ **Deprecated** (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | +| ~~Repeater~~ | ⚠️ **Deprecated** (removed in firmware 2.7.11) — no longer selectable; use Router instead | +| Tracker | Optimized for position reporting at regular intervals | +| Szenzor | Optimized for telemetry reporting | +| TAK | Interoperates with TAK systems (sends/receives CoT) | +| TAK Tracker | TAK position reporting only | +| Lost & Found | Continuous position beacon for recovery | + +### Choosing a Role + +Most users should keep the default **Client** role. Consider a different role when: + +- **Router** — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don't use Router on battery-powered handheld devices. +- **Router Late** — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. +- **Client Base** — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. +- **Client Mute** — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only devices or to reduce congestion in dense areas. +- **Tracker** — An unattended device whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. +- **Sensor** — An unattended device reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. +- **TAK / TAK Tracker** — Only needed if interoperating with ATAK/WinTAK systems. See [TAK Integration](tak) for details. + +> 💡 **Tip:** The mesh works best when most nodes are **Client** or **Router**. Too many Mute nodes reduces mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. + +### Encryption Indicators + +Nodes display encryption status icons next to their name: + +| Icon | Meaning | +| ----------- | ------------------------------------------------------------------------------------------------------------------- | +| 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | +| 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | +| ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) | + +> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. + +## Quick Actions + +From the node list, you can: + +- **Tap** a node to view its detail page +- **Long-press** for quick actions: + - Send a direct message + - Megtekintés térképen + - Pozíció kérése + - Mark as favorite + - Traceroute + +## Filtering & Sorting + +### Text Search + +Type in the search field to filter nodes by name or short name. The filter updates in real time as you type. + +### Filter Toggles + +| Filter | Leírás | +| -------------------------- | ---------------------------------------------------------------------------------------------- | +| **Only online** | Show only nodes heard within the last 15 minutes | +| **Only direct** | Show only nodes with direct (non-relayed) connections | +| **Include unknown** | Show nodes that haven't sent user info yet | +| **Exclude infrastructure** | Hide infrastructure-role nodes (Router, Repeater, Router Late, Client Base) | +| **Exclude MQTT** | Hide nodes heard only via MQTT internet bridge | +| **Show ignored** | Show nodes you've previously dismissed or muted | + +### Sort Options + +| Sort | Leírás | +| ------------------------------------------- | ------------------------------------------------------------------ | +| **Last heard** (default) | Most recently heard nodes first | +| **Alphabetical** | Sorted by node long name | +| **Distance** | Nearest nodes first (requires position sharing) | +| **Hops away** | Fewest relay hops first | +| **Channel** | Grouped by channel index | +| **Via MQTT** | Grouped by MQTT vs. radio-heard | +| **Favorites** | Favorited nodes first | + +## Node Detail + +Tapping a node opens the detail view with comprehensive information. See [Node Metrics](node-metrics) for full details on metrics and telemetry. + +![Node detail view](/assets/screenshots/nodes_node_list.png) + +The detail screen includes device info, position, and action buttons: + +![Node detail section](/assets/screenshots/nodes_detail_section.png) + +Inline status indicators show key metrics at a glance: + +| Indicator | Screenshot | +| ---------------- | -------------------------------------------------------- | +| Signal quality | ![Signal](/assets/screenshots/nodes_signal_info.png) | +| Battery level | ![Battery](/assets/screenshots/nodes_battery_info.png) | +| Hop count | ![Hops](/assets/screenshots/nodes_hops_info.png) | +| Utoljára hallott | ![Last heard](/assets/screenshots/nodes_last_heard.png) | +| Távolság | ![Distance](/assets/screenshots/nodes_distance_info.png) | + +## Related Topics + +- [Node Metrics](node-metrics) — detailed telemetry dashboards for each node +- [Messages & Channels](messages-and-channels) — send a direct message to a node +- [Map & Waypoints](map-and-waypoints) — view node positions geographically +- [Discovery](discovery) — traceroute and neighbor info for topology exploration +- [Signal Meter](signal-meter) — understand what the signal bars mean + +--- + diff --git a/docs/hu-rHU/user/onboarding.md b/docs/hu-rHU/user/onboarding.md new file mode 100644 index 000000000..3b910534e --- /dev/null +++ b/docs/hu-rHU/user/onboarding.md @@ -0,0 +1,99 @@ +--- +title: Getting Started +nav_order: 1 +last_updated: 2026-05-13 +description: First-launch setup — permissions, onboarding flow, and next steps after connecting your radio. +aliases: + - first-launch + - setup + - intro +--- + +# Getting Started + +Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app. + +## First Launch + +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. + +### Welcome Screen + +The welcome screen introduces Meshtastic and its core capabilities: + +- Off-grid mesh communication +- No cellular or internet required +- End-to-end encrypted messaging + +Tap **Get Started** to proceed through the setup flow. + +![Welcome screen](/assets/screenshots/onboarding_welcome.png) + +## Permissions + +The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. + +### Bluetooth Permission + +Bluetooth is the primary connection method between your phone and Meshtastic radio: + +- **Bluetooth scanning** — discover nearby Meshtastic radios +- **Bluetooth connect** — establish and maintain connections with paired radios + +Grant both permissions when prompted. Without Bluetooth, you'll need to use USB or TCP connections instead. + +### Location Permission + +> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. + +Meshtastic also uses your location for: + +- Showing your position on the mesh map +- Calculating distances to other nodes +- Sharing your GPS coordinates with other mesh members (if enabled) + +Grant **"While using the app"** or **"Always"** depending on your preference: + +- **While using the app** — position updates only when the app is open +- **Always** — enables background position updates for always-on mesh presence + +If denied, Bluetooth scanning will not function and your node will not report a position. + +### Notifications Permission + +Notifications alert you to: + +- Incoming messages from channels and direct messages +- Connection status changes (connected, disconnected, reconnecting) +- Firmware update availability + +> 💡 **Tip:** You can fine-tune notification preferences later in Android system settings. The app creates separate notification channels for messages, connection events, and background service status. + +### Critical Alerts Permission + +On supported devices, the app may request permission for critical alerts: + +- These are high-priority notifications that can break through Do Not Disturb mode +- Useful for emergency mesh alerts or urgent messages +- You can **skip** this step if you don't need breakthrough notifications +- Configure or revoke later in Android notification settings + +## After Setup + +Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. + +> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. + +## What's Next? + +Once connected to a radio, explore: + +- [Connections](connections) — pair your first radio device +- [Messages & Channels](messages-and-channels) — send your first message +- [Nodes](nodes) — see who's on your mesh +- [Map & Waypoints](map-and-waypoints) — view node positions +- [Settings](settings-radio-user) — configure your radio and user profile + +New to Meshtastic? The [getting started guide](https://meshtastic.org/docs/getting-started) on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup. + +--- diff --git a/docs/hu-rHU/user/settings-module-admin.md b/docs/hu-rHU/user/settings-module-admin.md new file mode 100644 index 000000000..ce2bbd6aa --- /dev/null +++ b/docs/hu-rHU/user/settings-module-admin.md @@ -0,0 +1,246 @@ +--- +title: Settings — Modules & Admin +nav_order: 8 +last_updated: 2026-05-13 +description: Configure optional feature modules (MQTT, telemetry, canned messages, TAK, and more) and perform device administration. +aliases: + - modules + - module-config + - administration +--- + +# Settings — Modules & Admin + +Configure optional feature modules and perform device administration. Modules extend Meshtastic with specialized capabilities — each can be independently enabled or disabled. + +> 💡 **Tip:** You only need to enable the modules you actually use. Disabling unused modules reduces airtime, saves battery, and simplifies your configuration. + +Module settings use a card-based layout with toggle switches, dropdowns, text fields, and sliders: + +![Toggle switch](/assets/screenshots/settings_switch.png) + +![Dropdown selector](/assets/screenshots/settings_dropdown.png) + +![Text field](/assets/screenshots/settings_text_field.png) + +![Settings card layout](/assets/screenshots/settings_titled_card.png) + +## Module Configuration + +### MQTT Module + +Bridges mesh messages to and from an MQTT broker for internet connectivity. This is how you extend your mesh beyond radio range or integrate with home automation systems. + +| Setting | Leírás | +| --------------- | ------------------------------------------------------------------------ | +| Engedélyezve | Toggle MQTT bridge | +| Szerver | MQTT broker address | +| Felhasználónév | Authentication username | +| Jelszó | Authentication password | +| Encryption | Encrypt MQTT payloads | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON support removed from firmware; field is ignored | +| TLS | Use secure connection | +| Root Topic | Base MQTT topic path | +| Map Report | Publish position for public map | + +See [MQTT](mqtt) for a detailed usage guide including encryption, privacy, and broker setup. + +### Serial Module + +Enables serial port communication for external device integrations (GPS modules, sensors, or custom hardware). When enabled, the node's serial port can send and receive protobuf or text data, allowing external microcontrollers or computers to interact with the mesh. + +| Setting | Leírás | +| ------------ | ------------------------------- | +| Engedélyezve | Activate serial communication | +| Echo | Echo received serial data back | +| Mode | Text, Protobuf, or NMEA output | +| RX/TX Pins | GPIO pins for serial connection | +| Baud Rate | Serial communication speed | + +### External Notification Module + +Controls buzzer, LED, or vibration alerts on your radio hardware. Useful for devices that need to physically signal when a message arrives — particularly helpful for unattended or outdoor installations. + +| Setting | Leírás | +| -------------------------------- | --------------------------- | +| Engedélyezve | Activate notifications | +| Alert Message | Notify on incoming messages | +| Alert Message Buzzer | Use buzzer for messages | +| Alert Message Vibra | Use vibration for messages | +| Alert Bell | Notify on bell character | +| Output (GPIO) | Pin for notification output | +| Active | High or Low active | +| Duration (ms) | Notification length | +| Use I2S as Buzzer | Use I2S audio output | + +### Store & Forward Module + +Buffers messages for nodes that were temporarily offline, then replays them when those nodes reconnect. Essential for meshes where nodes go in and out of range regularly — ensures messages aren't lost during brief disconnections. + +| Setting | Leírás | +| ------------------------------------------ | -------------------------- | +| Engedélyezve | Activate store and forward | +| Heartbeat (s) | Announcement interval | +| Bejegyzések | Maximum stored messages | +| History Return (max) | Max messages to replay | +| History Return (window) | Time window for replay | + +> 💡 **Tip:** Store and Forward works best on nodes with ample memory (ESP32 with PSRAM). Router nodes are ideal candidates since they're typically always-on. + +### Range Test Module + +Automated range testing tool for evaluating link quality between nodes. When enabled, the node periodically transmits test messages with incrementing counters. A receiver node logs these messages, allowing you to walk or drive away and later analyze at what distance messages stopped arriving. + +| Setting | Leírás | +| -------------------------------------- | --------------------------------- | +| Engedélyezve | Activate range testing | +| Sender Interval (s) | Time between test transmissions | +| Save CSV | Log received test data to SD card | + +### Telemetry Module + +Controls what telemetry data your node shares with the mesh. Telemetry includes device health (battery, uptime) and environmental sensor data (temperature, humidity, pressure). + +| Setting | Leírás | +| ---------------------------- | --------------------------------------- | +| Device Metrics Interval | How often to report device metrics | +| Environment Metrics Interval | How often to report environment sensors | +| Air Quality Enabled | Report particulate sensor data | +| Power Metrics Enabled | Report power usage | + +See [Telemetry & Sensors](telemetry-and-sensors) for supported sensors and configuration recommendations. + +### Canned Message Module + +Pre-configured messages accessible from the device's physical buttons (for radios with rotary encoders, keypads, or similar input hardware). Define a list of quick-send messages that can be transmitted without a phone connected — ideal for field use. + +| Setting | Leírás | +| ------------------ | ----------------------------------------------------------- | +| ~~Enabled~~ | ⚠️ **Deprecated** — current firmware may ignore this toggle | +| Üzenetek | Newline-separated list of messages | +| Send Bell | Play bell sound on send | +| Rotary Encoder | Enable rotary encoder input | +| Up/Down/Press Pins | GPIO pin assignments for input | + +### Audio Module + +Codec2 audio support for low-bandwidth voice communication over the mesh. This is an **experimental** feature that encodes voice into very small data packets using the Codec2 codec. + +| Setting | Leírás | +| --------------- | -------------------------------- | +| Engedélyezve | Activate audio module | +| Codec2 Rate | Audio quality/bandwidth tradeoff | +| I2S Word Select | GPIO pin for I2S WS | +| I2S Data In | GPIO pin for I2S DIN | +| I2S Data Out | GPIO pin for I2S DOUT | + +> ⚠️ **Note:** Audio requires specific hardware (I2S microphone and speaker). Voice quality is very low-bandwidth — think "understandable radio voice," not phone-call quality. + +### Remote Hardware Module + +GPIO control over the mesh network. Allows a remote node to read or write GPIO pins on another node — useful for activating relays, reading switches, or controlling external hardware from a distance. + +| Setting | Leírás | +| -------------------- | --------------------------------------------------------------- | +| Engedélyezve | Activate remote GPIO access | +| Allow Undefined Pins | Allow access to any GPIO pin (security risk) | + +> ⚠️ **Warning:** Enabling "Allow Undefined Pins" gives remote nodes access to all GPIO pins, which could interfere with the radio's own hardware. Only enable on dedicated GPIO nodes. + +### Neighbor Info Module + +Broadcasts information about directly heard neighbors, enabling mesh topology mapping. Each enabled node periodically shares a list of the other nodes it can hear and their signal quality. + +| Setting | Leírás | +| -------------------------------------- | ------------------------------------ | +| Engedélyezve | Activate neighbor broadcasting | +| Update Interval (s) | How often to broadcast neighbor list | + +See [Discovery](discovery) for how to use neighbor data for mesh topology exploration. + +### Ambient Lighting Module + +Controls onboard NeoPixel or other addressable RGB LEDs on supported hardware. Can be used for visual status indicators, notification lights, or decorative effects. + +| Setting | Leírás | +| ------------------ | ---------------------------------------------------------- | +| Engedélyezve | Activate LED control | +| LED State | On, Off, or set specific color | +| Red / Green / Blue | Individual color channel values (0–255) | + +### Detection Sensor Module + +Turns your node into a motion or door sensor alert system. When a GPIO pin detects a state change (motion detected, door opened), the node broadcasts an alert message over the mesh. + +| Setting | Leírás | +| ---------------------------------------- | ----------------------------------------------------------------------- | +| Engedélyezve | Activate detection sensor | +| Monitor Pin | GPIO pin connected to sensor | +| Detection Triggered High | Trigger when pin goes high (vs. low) | +| Minimum Broadcast (s) | Minimum time between alert broadcasts | +| State Broadcast (s) | Periodic state broadcast interval | +| Send Bell | Include bell character in alerts | +| Friendly Name | Custom name for this sensor | + +### Paxcounter Module + +People counter using WiFi and BLE probe requests. Counts nearby devices by passively listening for probe requests that phones and laptops emit when scanning for networks. Available only on ESP32 devices. + +| Setting | Leírás | +| -------------------------------------- | -------------------------- | +| Engedélyezve | Activate people counting | +| Update Interval (s) | How often to report counts | + +> 💡 **Tip:** Paxcounter is useful for estimating foot traffic at trailheads, event venues, or other locations. Counts are approximate — one person may carry multiple devices. + +### TAK Module + +Team Awareness Kit integration for interoperability with ATAK and WinTAK. See [TAK Integration](tak) for detailed setup and usage. + +## Adminisztráció + +### Távoli Adminisztráció + +Remotely configure nodes that share your admin key: + +1. Select the target node in the node list. +2. Navigate to **Settings** for that node. +3. Modify configuration. +4. Tap **Save** — changes are sent over the mesh. + +> ⚠️ **Requires:** Admin key configured on both your node and the target node. + +### Csomópont-adatbázis tisztítása + +Removes stale nodes from your local database that haven't been heard in a configurable time window. + +### Factory Reset + +Resets all settings to factory defaults. **This cannot be undone.** + +### Újraindítás + +Remotely reboot a connected or administered node. + +### Hibakereső panel + +View detailed diagnostic information: + +- Protocol buffers debug output +- Mesh packet log +- Connection state details + +### Troubleshooting Remote Admin + +- **"No response from target node"** — the target may be out of range, offline, or have a mismatched admin key. Verify the admin key matches on both nodes. +- **Changes not applying** — some settings require a reboot to take effect. Try the Reboot action after saving. +- **Can't see remote settings** — ensure your node has the admin key for the target node and that Admin Channel is enabled in Security Config. + +## Related Topics + +- [Settings — Radio & User](settings-radio-user) — core radio and user profile settings +- [Module configuration reference](https://meshtastic.org/docs/configuration/module) — detailed module docs on meshtastic.org +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/hu-rHU/user/settings-radio-user.md b/docs/hu-rHU/user/settings-radio-user.md new file mode 100644 index 000000000..f5039fa44 --- /dev/null +++ b/docs/hu-rHU/user/settings-radio-user.md @@ -0,0 +1,173 @@ +--- +title: Settings — Radio & User +nav_order: 7 +last_updated: 2026-05-13 +description: Configure your radio hardware, LoRa presets, user profile, position sharing, power management, and security. +aliases: + - beállítások + - radio-config + - user-config + - lora +--- + +# Settings — Radio & User + +Configure your radio hardware and user identity parameters. + +## User Settings + +### User Profile + +| Setting | Leírás | +| ----------------- | ------------------------------------------------------------------------------------- | +| Hosszú név | Your display name (up to 39 characters) | +| Rövid név | 4-character abbreviated name | +| Licensed Operator | Enable if you hold an amateur radio license (enables higher power) | + +### Applying Changes + +After modifying settings, tap **Save** to write the configuration to your radio. The device may reboot to apply changes. + +## Radio Configuration + +### Eszközbeállítások + +| Setting | Leírás | Alapértelmezett | +| ------------------------------------------ | ----------------------------------------------------------------------- | --------------- | +| Szerepkör | Node behavior (Client, Router, etc.) | Kliens | +| Újrasugárzási mód | How the node retransmits messages | Összes | +| Node Info Broadcast (s) | Interval for broadcasting node info | 10800 | +| Double-tap Button | Action for double-tap button press | Disabled | + +### LoRa beállítások + +| Setting | Leírás | Alapértelmezett | +| ------------------ | ----------------------------------------------------------------------- | ----------------------------------------- | +| Régió | Regulatory region for frequency bands | Unset (must configure) | +| Modem-előbeállítás | Speed/range tradeoff | LongFast | +| Hop Limit | Maximum retransmit hops | 3 | +| TX Power | Transmission power (dBm); 0 = max allowed for region | 0 (region max) | +| Frequency Offset | Fine-tune frequency (MHz) | 0 | +| Channel Bandwidth | Bandwidth setting | Default for preset | + +> ⚠️ **Important:** You **must** set your region before transmitting. Operating without the correct region may violate local radio regulations. See the [region configuration guide](https://meshtastic.org/docs/getting-started/initial-config) on meshtastic.org for details. + +### Modem Presets + +| Preset | Range | Sebesség | SNR Limit | Best For | +| ------------------ | ----------------------- | ------------------------- | ------------------------ | -------------------------------------------------------------------------------------------------------- | +| Short Turbo | ~1 km | 21.9 kbps | −5 dB | Dense urban with line-of-sight; data-heavy applications | +| Short Fast | ~3 km | 10.9 kbps | −7.5 dB | Urban neighborhoods; buildings within a few blocks | +| Short Slow | ~5 km | 5.5 kbps | −10 dB | Suburban short-range; moderate building density | +| Medium Fast | ~5 km | 5.5 kbps | −10 dB | Suburban areas; moderate building density | +| Medium Slow | ~8 km | 1.1 kbps | −12.5 dB | Suburban/rural; moderate range with slower speed | +| Long Turbo | ~10 km | 4.4 kbps | −10 dB | Similar range to Long Fast but with 500 kHz bandwidth; faster throughput | +| Long Fast | ~10 km | 1.1 kbps | −12.5 dB | **General use (default)** — balanced range and speed | +| Long Moderate | ~20 km | 0.34 kbps | −15 dB | Rural with some terrain; occasional use | +| Lite Fast | ~5 km | 5.5 kbps | −10 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Medium Fast | +| Lite Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Long Fast | +| Narrow Fast | ~5 km | 2.7 kbps | −10 dB | EU 868 MHz band (62.5 kHz BW); avoids interference with other devices | +| Narrow Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 868 MHz band (62.5 kHz BW); comparable to Long Fast | +| ~~Long Slow~~ | ~30 km | 0.18 kbps | −17.5 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | +| ~~Very Long Slow~~ | ~40+ km | 0.09 kbps | −20 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | + +#### Choosing a Modem Preset + +The modem preset controls the fundamental tradeoff between **range** and **data rate**: + +- **Slower presets** use more spreading, making signals decodable at weaker signal levels (lower SNR limit). This means longer range but fewer bytes per second. +- **Faster presets** pack more data per transmission but require a stronger signal to decode. + +**Practical guidance:** + +- **Urban mesh (many nodes, short distances):** Use **Long Fast** (default) or **Short Fast**. Higher speed means less airtime congestion when many nodes share the channel. +- **Rural/sparse mesh (few nodes, long distances):** Use **Long Moderate**. Range matters more than speed when nodes are far apart. +- **EU 866/868 MHz regulatory compliance:** Use **Lite Fast**, **Lite Slow**, **Narrow Fast**, or **Narrow Slow** — these are optimized for the EU SRD/868 MHz bands with narrower bandwidths. +- **Fixed infrastructure links:** Use **Short Turbo** or **Long Turbo** for dedicated point-to-point links with good antennas and line-of-sight. +- **Mixed environments:** Stick with **Long Fast** — it's the community default and ensures compatibility with others in your area. + +> ⚠️ **Important:** All nodes on the same channel **must** use the same modem preset. Nodes with mismatched presets cannot communicate even if they share the same frequency and encryption key. + +> 💡 **Tip:** The range estimates above assume flat terrain and modest antennas. Elevation advantage (hilltop, rooftop) dramatically increases effective range. A well-placed Router with Long Fast can often outperform a ground-level node with Long Slow. + +### Kijelző beállítások + +| Setting | Leírás | +| ------------------- | ------------------------------------------------------------------------------------ | +| Screen Timeout | Time before display sleeps | +| Display Units | Metric or Imperial | +| OLED Type | Auto, SSD1306, SH1106, SH1107 | +| Compass Orientation | Rotation offset for compass display (0°, 90°, 180°, 270°) | +| ~~Compass North~~ | ⚠️ **Deprecated** — replaced by Compass Orientation; still visible in older firmware | + +### Pozíció beállítások + +| Setting | Leírás | +| ----------------------------------------- | ---------------------------------- | +| GPS Enabled | Enable/disable GPS | +| GPS Update Interval | How often to acquire GPS fix | +| Position Broadcast (s) | How often to share position | +| Intelligens pozíció | Enable movement-based broadcasting | +| Rögzített pozíció | Use a manually set position | + +### Energia-beállítások + +| Setting | Leírás | +| --------------------------------------- | --------------------------------------- | +| Power Saving | Enable low-power sleep mode | +| Shutdown After (s) | Auto-shutdown idle timer | +| ADC Multiplier | Battery voltage calibration factor | +| Wait Bluetooth (s) | Time to wait for BLE connection at boot | +| Mesh SDS Timeout (s) | Super-deep-sleep timeout | + +### Hálózati beállítások + +| Setting | Leírás | +| ------------- | ---------------------------------------------------- | +| WiFi Enabled | Enable WiFi radio (ESP32 devices) | +| WiFi SSID | Network name to connect to | +| WiFi PSK | Network password | +| NTP Server | Time synchronization server | +| Syslog Server | Remote logging server | + +![IP address field](/assets/screenshots/settings_ipv4_field.png) + +### Bluetooth beállítások + +| Setting | Leírás | +| ----------------- | ------------------------------------------------------------------------- | +| Bluetooth Enabled | Enable/disable BLE radio | +| Pairing Mode | Fixed PIN, Random PIN, or No PIN | +| Rögzített PIN | PIN code for pairing (default: 123456) | + +### Biztonsági beállítások + +| Setting | Leírás | +| --------------------- | -------------------------------------------------------------------------- | +| Nyilvános kulcs | Your node's public key (read-only) | +| Admin kulcs | Key for remote administration | +| Privát kulcs | Your node's private key (handle securely) | +| Admin Channel Enabled | Allow admin commands via channel | +| Debug Log | Output live debug logging over serial/bluetooth | +| Serial Enabled | Enable serial console access (moved from Device Config) | +| Felügyelt mód | Restrict non-admin channel changes | + +![Password field](/assets/screenshots/settings_password_field.png) + +Settings use standard preference controls — dropdowns, toggles, and sliders: + +| Control | Screenshot | +| -------- | ------------------------------------------------------ | +| Dropdown | ![Dropdown](/assets/screenshots/settings_dropdown.png) | +| Toggle | ![Toggle](/assets/screenshots/settings_switch.png) | +| Slider | ![Slider](/assets/screenshots/settings_slider.png) | + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — optional feature modules and device administration +- [Signal Meter](signal-meter) — how modem presets affect signal quality thresholds +- [LoRa configuration](https://meshtastic.org/docs/configuration/radio/lora) — detailed LoRa settings reference on meshtastic.org +- [Initial configuration](https://meshtastic.org/docs/getting-started/initial-config) — region setup guide on meshtastic.org + +--- + diff --git a/docs/hu-rHU/user/signal-meter.md b/docs/hu-rHU/user/signal-meter.md new file mode 100644 index 000000000..7e7efabdd --- /dev/null +++ b/docs/hu-rHU/user/signal-meter.md @@ -0,0 +1,81 @@ +--- +title: How the Meshtastic Signal Meter Works +nav_order: 15 +last_updated: 2026-05-13 +description: How the signal meter calculates quality from RSSI and SNR — LoRa spread spectrum, presets, and what the bars really mean. +aliases: + - signal + - signal-meter + - snr + - rssi +--- + +# How the Meshtastic Signal Meter Works + +The Meshtastic signal meter — the familiar bars or status color in the app — is calculated very differently than the "bars" on a traditional cell phone or Wi-Fi router. + +Most consumer devices simply measure how "loud" a signal is. However, because Meshtastic uses **LoRa (Long Range)** technology, its signal meter measures how **clear** the signal is, relative to the specific settings your mesh is using. + +--- + +## 1. The Two Metrics: "Loudness" vs. "Clarity" + +Every time the LoRa radio chip receives a message, it reports two measurements: + +- **RSSI (Received Signal Strength Indicator):** The **loudness** of the raw power hitting your antenna. +- **SNR (Signal-to-Noise Ratio):** The **clarity** of the signal compared to the background static. + +> **Tip — The Analogy:** Imagine you are trying to hear a friend talking to you. +> +> - **RSSI** is how loud their voice is. +> - **The Noise Floor** is the background noise in the room (air conditioning, other people talking, traffic). +> - **SNR** is how easily you can distinguish your friend's voice from the background noise. + +If your friend shouts at you at a deafening rock concert, the signal is incredibly loud (High RSSI), but you still can't understand them because the background noise is louder (Bad SNR). Conversely, if your friend whispers to you in a dead-silent library, the signal is very weak (Low RSSI), but you can understand them perfectly (Great SNR). + +--- + +## 2. The Magic of LoRa: Hearing "Below the Noise Floor" + +For standard radios (like FM or Wi-Fi), if the background noise is louder than the signal (a negative SNR), the receiver just hears static. + +LoRa is special. It uses **"Spread Spectrum"** modulation, which allows the radio to mathematically pull a signal out of the air even when it is buried deep _underneath_ the background noise. This is why you will frequently see **negative SNR numbers** in Meshtastic (e.g., -10 dB, which means the signal is 10 decibels weaker than the background static). + +Depending on which Meshtastic preset you are using (e.g., `LongFast` vs. `ShortFast`), the radio has a specific **SNR Limit** — the absolute maximum amount of noise it can tolerate before the message is completely lost to the static. + +--- + +## 3. How the Signal Meter Calculates Quality + +The Meshtastic apps take both RSSI and SNR and run them through a specific formula to assign your signal a quality rating (None, Bad, Fair, or Good). It specifically scales these values based on the physical limits of the radio preset you are using. + +Here is exactly how the app decides how many bars (or what color) to show you: + +| Level | Bars | Criteria | Meaning | +| --------- | ---- | ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | +| Jó | 3 | RSSI better than `-115 dBm` **AND** SNR better than `-7 dB` | Signal is both loud and clear — healthy connection. | +| Megfelelő | 2 | RSSI better than `-126 dBm` with good SNR, **OR** SNR better than `-15 dB` with good RSSI | Signal getting quieter or noisier, but still decodable. | +| Rossz | 1 | Falls between Fair and None thresholds | At the edge of range or experiencing interference. | +| Semmi | 0 | RSSI worse than `-126 dBm` **AND** SNR worse than `-15 dB` | Transmission completely buried in noise. | + +--- + +## 4. What This Means for You + +Because Meshtastic's meter acts as a **"Clarity Meter"**, it behaves differently than what most people expect: + +> **Tip — Don't panic over low RSSI:** You might see a seemingly terrible RSSI value like `-118 dBm`. On a cell phone, you would have zero bars. But if you have an SNR of `+2 dB`, Meshtastic will still show a strong signal! _The library is quiet, so the whisper is heard perfectly._ + +> **Warning — Watch out for local noise:** If you hook up a massive antenna and see a great RSSI (e.g., `-90 dBm`) but your signal meter is only showing **1 Bar (Bad)**, you have a problem. It means you have local interference — perhaps a cheap power supply, a noisy computer, or a nearby radio tower — creating so much static that it is drowning out your mesh. + +## Where Signal Information Appears + +In the app, signal data is shown in several places: + +- **Node list** — signal bars icon next to each node +- **Node detail** — SNR, RSSI, and signal quality in the device metrics section +- **Traceroute** — per-hop signal quality for each relay node +- **Signal metrics** — historical SNR and RSSI data in the metrics charts + +![Node entry showing SNR, RSSI values and colored signal bars](/assets/screenshots/nodes_signal_info.png) + diff --git a/docs/hu-rHU/user/tak.md b/docs/hu-rHU/user/tak.md new file mode 100644 index 000000000..87e710f4f --- /dev/null +++ b/docs/hu-rHU/user/tak.md @@ -0,0 +1,126 @@ +--- +title: TAK Integration +nav_order: 10 +last_updated: 2026-05-13 +description: Interoperate with ATAK and WinTAK — CoT position sharing, TAK roles, and plugin setup. +aliases: + - tak + - atak + - team-awareness-kit +--- + +# TAK Integration + +Meshtastic integrates with the Team Awareness Kit (TAK) ecosystem, enabling interoperability between Meshtastic mesh devices and TAK applications like ATAK and WinTAK. + +## Overview + +The TAK module allows Meshtastic nodes to: + +- Share position data in TAK-compatible CoT (Cursor on Target) format +- Appear as team members on TAK map displays +- Receive TAK PLI (Position Location Information) messages + +## Setup + +### Prerequisites + +- ATAK (Android Team Awareness Kit) or WinTAK installed +- Meshtastic ATAK Plugin installed +- TAK module enabled on your Meshtastic radio + +### Configuration + +1. Navigate to **Settings → Module Config → TAK**. +2. Enable the TAK module. +3. Configure the TAK team/group settings: + +![Module toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | Leírás | +| ------------ | -------------------------- | +| Engedélyezve | Activate TAK interop | +| Mode | TAK-compatible output mode | + +### ATAK Plugin Setup + +1. Install the Meshtastic ATAK Plugin from the plugin repository. +2. Open ATAK and enable the Meshtastic plugin. +3. The plugin bridges messages between ATAK and your mesh network. + +## TAK Roles + +Nodes configured with TAK-related roles behave differently from standard clients: + +| Szerepkör | Leírás | +| --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **TAK** | Full TAK interoperability — sends and receives CoT data, chat messages, and PLI updates. Functions as a standard client plus TAK bridge. | +| **TAK Tracker** | Position-only TAK output — automatically broadcasts PLI at regular intervals without user interaction. Optimized for unattended position beacons (vehicles, equipment, waypoints). Does not relay chat messages. | + +> 💡 **Tip:** Use **TAK Tracker** for devices that only need to report position (e.g., a radio mounted in a vehicle). Use **TAK** for devices where users actively participate in TAK operations. + +### CoT (Cursor on Target) Format + +TAK messages use the Cursor on Target XML format — a military standard for sharing situational awareness data. Meshtastic converts its internal protobuf messages to CoT format when bridging to TAK systems, so no manual format conversion is needed. + +## TAK Identity + +When using TAK roles, your node broadcasts identity information that appears on TAK maps: + +| Setting | Leírás | +| --------- | ---------------------------------------------------------------------------------------------------------------- | +| Team | Your team color on the TAK map (e.g., Blue, Red, Cyan, Green) | +| Szerepkör | Your operational role (Team Member, Team Lead, HQ, Medic, RTO, etc.) | +| Callsign | Your TAK callsign (defaults to your Meshtastic long name) | + +These settings appear in **Settings → Module Config → TAK** when the TAK module is enabled. + +> 💡 **Tip:** Team/role colors are the standard TAK affiliation colors. Coordinate with your TAK team to use consistent team assignments. + +## Wire Format (V1 / V2) + +Meshtastic supports two TAK wire formats: + +| Format | Compatibility | Features | +| ------------------------------- | --------------------------------------------------------------- | --------------------------------------------------------- | +| V1 (Legacy) | ATAK Plugin v1.x, older firmware | Basic CoT position sharing only | +| V2 (Current) | ATAK Plugin v2.x, firmware 2.3+ | Full CoT support including chat, routes, zstd compression | + +The app automatically selects V2 when both sides support it. No manual configuration needed — the TAK module negotiates format based on firmware capabilities. + +## Usage with ATAK + +Once configured: + +- Meshtastic nodes appear as markers on the ATAK map with callsign labels +- Chat messages can bridge between mesh and TAK networks +- Position updates flow bidirectionally between Meshtastic and TAK +- TAK Tracker nodes broadcast PLI automatically — their positions appear on ATAK maps without any ATAK-side configuration + +> ⚠️ **Note:** TAK integration requires specific node roles and module configuration. Standard client nodes don't automatically participate in TAK operations. + +## Troubleshooting + +| Problem | Cause | Solution | +| -------------------------------- | ------------------------------------- | ----------------------------------------------------------------------- | +| Node doesn't appear on ATAK map | TAK module disabled or wrong role | Verify TAK module is enabled and node role is TAK or TAK Tracker | +| Position updates are stale | GPS fix lost or interval too long | Check GPS status; reduce position broadcast interval in Position Config | +| ATAK plugin shows "disconnected" | BLE connection lost or plugin crashed | Reconnect Bluetooth in Meshtastic app, then restart ATAK plugin | +| Chat messages not bridging | V1 format doesn't support chat | Ensure both nodes run firmware 2.3+ for V2 wire format | +| CoT data not flowing | Channel mismatch | All TAK nodes must be on the same channel with matching encryption | + +## Security Considerations + +- TAK data shares your position and callsign information +- Ensure your channel encryption is configured when using TAK in sensitive environments +- The TAK module respects the same channel encryption as other Meshtastic messages + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — TAK module configuration +- [Nodes](nodes) — TAK and TAK Tracker roles in the node list +- [Map & Waypoints](map-and-waypoints) — node positions on the map +- [ATAK plugin guide](https://meshtastic.org/docs/software/integrations/atak-plugin) — detailed ATAK setup on meshtastic.org + +--- + diff --git a/docs/hu-rHU/user/telemetry-and-sensors.md b/docs/hu-rHU/user/telemetry-and-sensors.md new file mode 100644 index 000000000..8885aa6d2 --- /dev/null +++ b/docs/hu-rHU/user/telemetry-and-sensors.md @@ -0,0 +1,118 @@ +--- +title: Telemetry & Sensors +nav_order: 9 +last_updated: 2026-05-13 +description: Sensor data on the mesh — supported environment, air quality, and power sensors, plus configuration and viewing guides. +aliases: + - sensors + - environment + - weather + - power-metrics +--- + +# Telemetry & Sensors + +Meshtastic nodes can collect and share sensor data across the mesh network. + +## Overview + +Telemetry allows nodes equipped with sensors to broadcast environmental, power, and device health information. This data is visible on the node detail screen and can be logged over time. + +## Device Telemetry + +All Meshtastic nodes report basic device telemetry: + +| Metric | Leírás | Typical Range | +| ------------------ | ------------------------------ | ------------------------------------------------------------------ | +| Battery Level | Charge percentage | 0–100% | +| Feszültség | Battery voltage | 3.0–4.2V (LiPo) | +| Csatornahasználat | % of airtime used locally | 0–100% | +| Air Utilization TX | % of airtime used by this node | 0–100% | +| Működési idő | Seconds since last boot | Varies | + +## Environment Sensors + +Supported environmental sensors: + +### Temperature & Humidity + +| Szenzor | Hőmérséklet | Páratartalom | Nyomás | Jegyzetek | +| ------- | ----------- | ------------ | ------ | ----------------------- | +| BME280 | ✓ | ✓ | ✓ | Recommended all-in-one | +| BME680 | ✓ | ✓ | ✓ | Adds gas resistance/IAQ | +| SHT31 | ✓ | ✓ | — | High accuracy | +| MCP9808 | ✓ | — | — | Precision temperature | +| LPS22 | — | — | ✓ | Pressure only | + +### Air Quality + +| Szenzor | Metric | Jegyzetek | +| -------- | -------------------------------------------------- | -------------------------- | +| BME680 | Gas Resistance / IAQ | Volatile organic compounds | +| PMSA003I | PM1.0, PM2.5, PM10 | Particulate matter | +| SEN55 | PM, NOx, VOC, Temp, Humidity | Multi-sensor | + +### Light & UV + +| Szenzor | Metric | +| -------- | -------------------------------------- | +| OPT3001 | Ambient light (lux) | +| VEML7700 | Ambient light (lux) | +| LTR390 | UV index | + +## Tápellátási metrikák + +Nodes with INA-series power sensors can report: + +| Metric | Leírás | +| ----------- | ----------------------------------------- | +| Bus Voltage | Supply rail voltage | +| Áramerősség | Power consumption (mA) | +| Energia | Calculated power (mW) | + +Useful for monitoring solar charging or battery health on remote nodes. + +## Configuring Telemetry + +1. Navigate to **Settings → Module Config → Telemetry**. +2. Set reporting intervals: + - **Device Metrics Interval** — how often to broadcast device metrics + - **Environment Metrics Interval** — how often to broadcast sensor data +3. Enable specific sensor types as needed. + +### Recommended Intervals + +| Use Case | Device (s) | Environment (s) | +| ------------------------------------------ | ----------------------------- | ---------------------------------- | +| Urban mesh (many nodes) | 3600 | 3600 | +| Rural mesh (few nodes) | 900 | 900 | +| Weather station | 900 | 300 | +| Battery conservation | 7200 | 7200 | + +> ⚠️ **Note:** Shorter intervals increase airtime usage and battery drain across the mesh. + +## Viewing Telemetry + +1. Navigate to **Nodes** and select a node. +2. Telemetry sections show on the detail screen: + - Device Metrics (always available) + - Environment Metrics (if sensors present) + - Power Metrics (if INA sensor present) +3. Historical graphs show trends over time. + +![Telemetry actions](/assets/screenshots/node-metrics_telemetric_actions.png) + +## Troubleshooting + +- **No environment data showing?** The remote node needs a physical sensor connected (e.g., BME280 on I2C). Device telemetry (battery, uptime) is always available, but environment metrics require hardware. +- **Stale readings?** Check the reporting interval — very long intervals (7200s+) mean data updates infrequently. Also verify the remote node is still online. +- **Sensor conflict on I2C bus?** Some sensors share I2C addresses. If you have multiple sensors on the same bus, check for address collisions in the radio's serial debug output. + +## Related Topics + +- [Node Metrics](node-metrics) — view telemetry data on the node detail screen +- [Settings — Modules & Admin](settings-module-admin) — telemetry module configuration +- [Units & Locale](units-and-locale) — temperature and pressure display units + +--- + diff --git a/docs/hu-rHU/user/translate.md b/docs/hu-rHU/user/translate.md new file mode 100644 index 000000000..806570d55 --- /dev/null +++ b/docs/hu-rHU/user/translate.md @@ -0,0 +1,97 @@ +--- +title: Translate the App +parent: User Guide +nav_order: 17 +last_updated: 2026-05-13 +aliases: + - translate + - crowdin + - localization +--- + +# Translate the App + +Contributing translations helps make Meshtastic accessible to a wider audience. The app uses [Crowdin](https://crowdin.com/) to manage community translations for both the user interface and in-app documentation. + +--- + +## What Gets Translated + +| Resource | Source Location | Jegyzetek | +| ----------------- | ------------------------------------- | ---------------------------------------------------------------------- | +| UI strings | `composeResources/values/strings.xml` | Buttons, labels, messages, and all user-visible text | +| User Guide pages | `docs/user/*.md` | In-app documentation shown in Help & Documentation | +| Fastlane metadata | `fastlane/metadata/android/en-US/` | App Store listing title, description, and changelogs | + +> **Note — Developer Guide pages are English-only.** Code-focused documentation targeting contributors is not translated. + +--- + +## How to Contribute + +1. **Visit the Crowdin project.** Open the [Meshtastic Android Crowdin project](https://crowdin.com/project/meshtastic-android) and sign in or create a free account. +2. **Choose your language.** Select an existing language or request a new one by opening a [GitHub issue](https://github.com/meshtastic/Meshtastic-Android/issues/new). +3. **Translate strings.** Crowdin shows the English source on the left and your translation on the right. Translate each string and save. +4. **Review context.** Many strings include screenshots or context comments — check these to understand where the text appears in the app. +5. **Submit.** Approved translations are automatically merged into the next release. + +> **Tip — Keep translations short.** UI strings often appear in buttons, chips, or narrow columns. If a translation is significantly longer than the English original, consider abbreviating where the meaning stays clear. + +--- + +## Adding a New Language + +If your language is not yet listed on Crowdin: + +1. Open an issue on [GitHub](https://github.com/meshtastic/Meshtastic-Android/issues/new) requesting the new locale. +2. A maintainer will add the language to Crowdin and configure `crowdin.yml`. +3. Once added, you can begin translating immediately. + +--- + +## How Translations Are Organized + +The Android app uses **Compose Multiplatform resources** for all user-visible strings: + +``` +core/resources/src/commonMain/composeResources/ +├── values/ ← English (default) +│ └── strings.xml +├── values-de/ ← German +│ └── strings.xml +├── values-fr/ ← French +│ └── strings.xml +└── ... +``` + +In-app documentation follows a similar pattern under `docs/`: + +``` +docs/ +├── user/ ← English source (default) +│ ├── onboarding.md +│ └── ... +├── fr/user/ ← French translations +│ ├── onboarding.md +│ └── ... +└── ... +``` + +The app automatically selects the correct locale based on your device's **Language & Region** settings. + +--- + +## Translation Guidelines + +- **Do not translate** technical terms like "LoRa", "MQTT", "BLE", "TAK", "SNR", or "RSSI" — these are universal. +- **Keep placeholders intact.** Strings like `%1$s` or `%d` are filled in at runtime. Do not remove or reorder them unless the grammar of your language requires it. +- **Match tone.** The app uses a friendly, direct voice. Avoid overly formal language. +- **Test if possible.** Switch your device language and open the app to see how translations look in context. + +--- + +## Questions? + +If you have questions about a specific string's context or need help getting started, open a discussion on the [Meshtastic GitHub Discussions](https://github.com/meshtastic/Meshtastic-Android/discussions) page. + +Thank you for helping expand the reach of Meshtastic! diff --git a/docs/hu-rHU/user/units-and-locale.md b/docs/hu-rHU/user/units-and-locale.md new file mode 100644 index 000000000..d897d57e5 --- /dev/null +++ b/docs/hu-rHU/user/units-and-locale.md @@ -0,0 +1,118 @@ +--- +title: Units, Measurement & Locale +parent: User Guide +nav_order: 16 +last_updated: 2026-05-12 +--- + +# Units, Measurement & Locale + +The Meshtastic app automatically displays temperatures, distances, speeds, and times in the units your device is configured to use — no settings to change inside the app. + +--- + +## How It Works + +Meshtastic radios always transmit data in **metric units** (meters, °C, km/h, hPa, etc.). When the app receives this data, it uses the `MetricFormatter` utility to convert and display values in whatever unit system your device's locale specifies. + +On Android, your measurement preferences are determined by your system **Language & Region** settings. On Desktop (JVM), the app uses the JVM's default `Locale`. + +> **Tip — You never need to toggle units inside the app.** Change your system measurement preferences and every screen in Meshtastic updates automatically — node details, telemetry charts, weather, altitude, and more. + +--- + +## Hőmérséklet + +Temperature values from environment sensors are transmitted as **°C** and displayed based on your device's temperature unit preference. + +![Environment metrics with temperature](/assets/screenshots/nodes_environment_metrics.png) + +| Your Setting | You See | +| ------------ | ------- | +| Celsius | 22°C | +| Fahrenheit | 72°F | + +This affects all temperature displays throughout the app: node environment telemetry, soil temperature, dew point, and telemetry chart axes. + +## Distance & Altitude + +Distances between nodes and GPS altitudes are transmitted as **meters** and automatically scaled and converted. + +![Distance info display](/assets/screenshots/nodes_distance_info.png) + +| Your Setting | Small Distance | Large Distance | Magasság | +| -------------------------------- | -------------- | ---------------------- | -------- | +| Metric | 350 m | 2.5 km | 1,200 m | +| Imperial (US) | 1,148 ft | 1.6 mi | 3,937 ft | + +The app uses natural scaling — short distances stay in meters or feet, while longer distances switch to kilometres or miles automatically. + +### Where these appear + +- **Node list** — distance and bearing to each node +- **Node detail** — altitude, distance from your position +- **Map** — waypoint distances, traceroute hop distances +- **Compass** — distance to selected node + +## Sebesség + +GPS ground speed is displayed in your locale's preferred speed unit. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Metric | 12 km/h | +| Imperial (US) | 7 mph | + +## Szél + +Wind speed and gust data from environment sensors are transmitted as **m/s** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Metric | 5 m/s | +| Imperial (US) | 11 mph | + +Wind readings appear in the **Node Detail** environment section and the **Environment Telemetry** charts. + +## Rainfall + +Rainfall measurements (1-hour and 24-hour totals) are transmitted as **mm** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ---------------------- | +| Metric | 12 mm | +| Imperial (US) | 0.5 in | + +## Units That Never Change + +Some units are international standards and are displayed the same way regardless of your locale: + +| Measurement | Unit | Why | +| -------------------------------- | ------------------------------ | ------------------------------------- | +| Barometric pressure | hPa | International meteorological standard | +| Heading / bearing | ° (degrees) | Universal navigation convention | +| Sugárzás | μR/hr | Standard dosimetry unit | +| GPS coordinates | decimal degrees | Universal geographic standard | +| Humidity, battery, soil moisture | % | Universal | + +## Date & Time + +All timestamps throughout the app — last heard, message times, telemetry logs, chart axes — follow your device's date and time preferences. + +| Setting | What It Controls | Example | +| ---------------- | ---------------- | ------------------------------------------------ | +| **24-Hour Time** | Clock format | 14:30 vs 2:30 PM | +| **Date Format** | Date ordering | 09/05/2026 vs 05/09/2026 | + +The app also uses **relative time** where it makes sense — for example, "5 min ago" or "2 hours ago" in the node list — which is automatically localised into your device language. + +## Changing Your Measurement System (Android) + +On Android, your measurement system (metric vs imperial) is tied to your region setting: + +1. Open **Android Settings → System → Language & Region** +2. Change your **Region** or **Measurement units** preference +3. Return to Meshtastic — values update immediately + +> **Tip — The app uses `MetricFormatter` from `core:common`.** All measurement formatting is handled by a shared KMP utility that respects your platform's locale. Developers adding new measurement displays should use `MetricFormatter` rather than hard-coding unit conversions. + diff --git a/docs/is-rIS/index.md b/docs/is-rIS/index.md new file mode 100644 index 000000000..39c7824f2 --- /dev/null +++ b/docs/is-rIS/index.md @@ -0,0 +1,30 @@ +--- +title: Home +layout: default +nav_order: 0 +--- + +# Meshtastic Android App Documentation + +User and developer documentation for the Meshtastic Android, Desktop, and iOS applications powered by KMP (Kotlin Multiplatform). + +Use the sidebar navigation to browse the **User Guide** for app features and the **Developer Guide** for contributing to the project. + +--- + +## Quick Links + +| Guide | Lýsing | +| --------------------------------------------------------------------- | -------------------------------------------------------------- | +| [Getting Started](user/onboarding) | Connect your first radio and send a message | +| [Messages & Channels](user/messages-and-channels) | Channel broadcasts, direct messages, reactions, and encryption | +| [Nodes](user/nodes) | Understanding the mesh network node list | +| [Signal Meter](user/signal-meter) | How the LoRa signal quality meter works | +| [Units & Locale](user/units-and-locale) | How temperatures, distances, and times adapt to your region | +| [Desktop App](user/desktop) | Linux, macOS, and Windows desktop usage | +| [Architecture](developer/architecture) | App architecture overview for contributors | +| [Contributing](developer/contributing) | Branch naming, PR workflow, and verification commands | + +--- + +> This documentation is served from the same markdown source that powers the in-app **Help & Documentation** browser. diff --git a/docs/is-rIS/user/connections.md b/docs/is-rIS/user/connections.md new file mode 100644 index 000000000..36d1c28ce --- /dev/null +++ b/docs/is-rIS/user/connections.md @@ -0,0 +1,125 @@ +--- +title: Connections +nav_order: 2 +last_updated: 2026-05-13 +description: Connect your phone or desktop to a Meshtastic radio via Bluetooth, USB, or TCP/IP. +aliases: + - bluetooth + - usb + - tcp + - pairing +--- + +# Connections + +Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node. + +## Bluetooth (BLE) + +Bluetooth Low Energy is the default and most common connection method on Android. + +### Pairing a Device + +1. Ensure your Meshtastic radio is powered on and in pairing mode. +2. Open the app and navigate to **Connections**. +3. Tap **Scan for Devices** — nearby Meshtastic radios will appear. +4. Select your device from the list. +5. Accept the Bluetooth pairing prompt if shown. + +![Device list item](/assets/screenshots/connections_bluetooth_scan.png) + +You can filter devices by transport type using the filter chips at the top: + +![Transport filter chips](/assets/screenshots/connections_transport_filters.png) + +> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. + +### Connection Status + +| Icon | State | Lýsing | +| ---- | -------------- | ----------------------------- | +| 🟢 | Connected | Active radio link established | +| 🟡 | Connecting | Handshake in progress | +| 🔴 | Aftengd | No active connection | +| ⚪ | Not configured | No device selected | + +When connecting, a status indicator shows the current connection state: + +![Connecting status](/assets/screenshots/connections_connecting.png) + +If no devices are found, the app shows an empty state with instructions: + +![No devices found](/assets/screenshots/connections_empty_state.png) + +### Troubleshooting Bluetooth + +- **Device not found:** Toggle Bluetooth off/on, ensure location is enabled. +- **Connection drops:** Move closer to the radio; check for interference. +- **Pairing rejected:** Forget the device in Android Bluetooth settings and retry. + +## USB Serial + +USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable. + +### Setup + +1. Connect your radio via USB cable to your device. +2. The app will prompt for USB permission — tap **Allow**. +3. The connection is established automatically. + +> ⚠️ **Note:** USB connections require OTG support on Android devices. + +## TCP/IP (WiFi) + +Some Meshtastic radios support WiFi connectivity, allowing TCP-based connections. + +### Configuration + +1. Connect your radio to a WiFi network via the radio's web interface or settings. +2. In the app, go to **Connections → TCP**. +3. Enter the radio's IP address and port (default: 4403). +4. Tap **Connect**. + +![WiFi scanning for devices](/assets/screenshots/connections_wifi_scanning.png) + +When a device is found, it appears in the connection list: + +![WiFi device found](/assets/screenshots/connections_wifi_device_found.png) + +A successful connection is confirmed with a status indicator: + +![WiFi connection success](/assets/screenshots/connections_wifi_success.png) + +### When to Use TCP + +- Radio is on the same local network +- Testing with a simulated radio +- Environments where Bluetooth has interference issues + +## Reconnection Behavior + +The app reconnects to the **last selected device** on startup. You can manually switch transports from the connections screen at any time. + +To disconnect from a radio, use the disconnect button on the connections screen: + +![Disconnect from radio](/assets/screenshots/connections_disconnect.png) + +## Desktop Connections + +On Desktop (Linux/macOS/Windows), the app supports: + +- **Bluetooth (BLE)** — via the Kable library; works on macOS, Linux, and Windows +- **USB Serial** — primary wired connection method +- **TCP/IP** — for network-connected radios + +See [Desktop App](desktop) for platform-specific details and keyboard shortcuts. + +## Related Topics + +- [Getting Started](onboarding) — first-launch setup and permissions +- [Settings — Radio & User](settings-radio-user) — Bluetooth and network configuration +- [Desktop App](desktop) — desktop-specific connection details +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — full list of compatible radios on meshtastic.org + +--- + diff --git a/docs/is-rIS/user/desktop.md b/docs/is-rIS/user/desktop.md new file mode 100644 index 000000000..a688679eb --- /dev/null +++ b/docs/is-rIS/user/desktop.md @@ -0,0 +1,147 @@ +--- +title: Desktop App +nav_order: 14 +last_updated: 2026-05-13 +description: Install and use the Meshtastic Desktop app on Linux, macOS, and Windows — connections, feature parity, and keyboard shortcuts. +aliases: + - desktop + - linux + - macos + - windows + - jvm +--- + +# Desktop App + +The Meshtastic Desktop application provides the same mesh communication features on Linux, macOS, and Windows. + +## Overview + +The Desktop app shares its core codebase with the Android app through Kotlin Multiplatform (KMP). Most features work identically across platforms. + +## Installation + +### Linux + +- Download the `.deb` or `.AppImage` package from the releases page +- Or build from source using `./gradlew :desktopApp:run` + +### macOS + +- Download the `.dmg` package from releases +- Or build from source + +### Windows + +- Download the `.msi` installer from releases +- Or build from source + +## Connecting Your Radio + +### USB Serial (Primary) + +The most reliable connection method on Desktop: + +1. Connect your Meshtastic radio via USB cable. +2. The app should detect the serial port automatically. +3. If not detected, select the correct serial port from the connections menu. + +### TCP/IP + +For network-connected radios: + +1. Enter the radio's IP address and port (default: 4403). +2. Click **Connect**. + +### Bluetooth (BLE) + +Bluetooth Low Energy is supported on Desktop via the [Kable](https://github.com/JuulLabs/kable) library: + +1. Ensure your system has a Bluetooth adapter. +2. The app scans for nearby Meshtastic radios automatically. +3. Select your device from the connections screen. + +## Feature Parity + +| Feature | Android | Desktop | Notes | +| ---------------------------------------- | ------- | ------- | -------------------------- | +| Messaging | ✓ | ✓ | Full parity | +| Node List | ✓ | ✓ | Full parity | +| Map | ✓ | ✓ | Full parity | +| Settings | ✓ | ✓ | Full parity | +| Bluetooth (BLE) | ✓ | ✓ | Via Kable on desktop | +| Firmware Update OTA | ✓ | ✗ | Use web flasher | +| Notifications | ✓ | ✓ | Native OS notifications | +| Widgets | ✓ | ✗ | Android-only | +| AI Assistant (Chirpy) | ✓\* | ✗ | Google flavor Android only | + +\*Chirpy AI requires Android 14+ on Google flavor builds with supported hardware. + +## UI Differences + +The Desktop app uses the same Compose Multiplatform UI with adaptations for larger screens and desktop interaction. + +### Keyboard Shortcuts + +| Shortcut | Action | +| ------------------- | --------------------------- | +| **⌘Q** / **Ctrl+Q** | Quit the application | +| **⌘,** / **Ctrl+,** | Open Settings | +| **⌘1** / **Ctrl+1** | Switch to Conversations tab | +| **⌘2** / **Ctrl+2** | Switch to Nodes tab | +| **⌘3** / **Ctrl+3** | Switch to Map tab | +| **⌘4** / **Ctrl+4** | Switch to Connections tab | + +### Window & System Tray + +- **Window resizing** — responsive layout adapts to window dimensions +- **System tray** — minimize to system tray for background mesh operation +- **Tray menu** — right-click the tray icon to show window or quit +- **Mouse interaction** — hover states and standard desktop navigation + +### Notification Preferences + +The Desktop app provides in-app toggles for controlling which notifications are shown — messages, new nodes, and low battery alerts. Access these from **Settings → Notifications** within the app. + +## Built-in Documentation Browser + +The Desktop app includes a built-in documentation browser for quick access to help content without leaving the application. + +![Docs browser with table of contents](/assets/screenshots/docs-browser_toc.png) + +The browser supports full-text search across all documentation: + +![Searching the docs browser](/assets/screenshots/docs-browser_search.png) + +Individual doc pages render with full formatting: + +![A documentation page](/assets/screenshots/docs-browser_page.png) + +## Building from Source + +```bash +git clone https://github.com/meshtastic/Meshtastic-Android.git +cd Meshtastic-Android +git submodule update --init +./gradlew :desktopApp:run +``` + +Requirements: + +- JDK 21 +- No Android SDK required for desktop-only builds + +## Known Limitations + +- No OTA firmware updates (use web flasher) +- Some Android-specific features (widgets, specific notification channels) are unavailable +- Performance may vary on low-spec hardware running Compose Desktop +- BLE bonding is not yet supported on desktop (pairing works without bonding) + +## Related Topics + +- [Connections](connections) — connection methods overview +- [Firmware Updates](firmware) — use the [Web Flasher](https://flasher.meshtastic.org) for desktop firmware updates + +--- + diff --git a/docs/is-rIS/user/discovery.md b/docs/is-rIS/user/discovery.md new file mode 100644 index 000000000..354687f69 --- /dev/null +++ b/docs/is-rIS/user/discovery.md @@ -0,0 +1,114 @@ +--- +title: Discovery +nav_order: 12 +last_updated: 2026-05-13 +description: Explore your mesh network — traceroute paths, neighbor maps, and node discovery tools. +aliases: + - mesh-discovery + - local-discovery + - network-scan + - traceroute + - neighbor-info +--- + +# Discovery + +Discovery tools help you understand **how** your mesh network is connected — which nodes can hear each other, what paths messages take, and where bottlenecks or weak links exist. + +> 💡 **Tip:** You don't need a dedicated "discovery mode" to start exploring your mesh. The tools below are available right now from the node list and node detail screens. + +--- + +## Ferilkönnun + +Traceroute reveals the exact path a message takes from your node to any other node on the mesh. It's the single most useful tool for debugging connectivity problems. + +### Running a Traceroute + +1. Navigate to **Nodes** and tap the node you want to trace. +2. On the node detail screen, tap **Traceroute**. +3. The app sends a traceroute request and waits for the response. +4. Results display each hop in order, with signal quality at every step. + +### Reading the Results + +A traceroute result looks like this: + +``` +You → Node A (SNR: 8.5, RSSI: -95) → Node B (SNR: 5.2, RSSI: -108) → Target +``` + +Each hop represents a relay node that forwarded the message. The SNR and RSSI values at each hop tell you about the link quality on that specific segment. + +| What to look for | What it means | +| -------------------------------------------------------------------------- | --------------------------------------------------------------------------- | +| All hops show Good SNR (> 5 dB) | Healthy path — messages flow reliably | +| One hop shows Bad SNR (< 0 dB) | Weak link — this relay segment is fragile | +| Many hops (4+) | Long path — consider repositioning a node to shorten it | +| Different path on retry | Mesh is adapting — multiple routes exist (this is good!) | + +> 💡 **Tip:** Run traceroute several times over a few minutes. If the path changes, your mesh has redundant routes — a sign of a well-connected network. + +### Troubleshooting with Traceroute + +- **"No route found"** — The target node may be offline, out of range, or on a different channel. Check that both nodes share at least one channel with the same encryption key. +- **Traceroute times out** — The path may be too long (exceeds hop limit) or a relay node is congested. Try increasing the hop limit in **Settings → LoRa Config**. +- **Asymmetric paths** — A traceroute from A→B may take a different path than B→A. This is normal — radio propagation is not always symmetric. + +--- + +## Neighbor Info + +The Neighbor Info module lets each node broadcast a list of the nodes it can **directly hear** (single-hop). When multiple nodes share their neighbor lists, you can piece together a topology map of the entire mesh. + +### Enabling Neighbor Info + +1. Navigate to **Settings → Module Config → Neighbor Info**. +2. Enable the module. +3. Set the broadcast interval (default: 900 seconds / 15 minutes). + +Once enabled, your node periodically broadcasts its neighbor table. Other nodes with Neighbor Info enabled do the same. + +### Viewing Neighbor Data + +- Open any node's detail screen and look for the **Neighbors** section. +- Each neighbor entry shows the node that was directly heard and its signal quality. +- Combine neighbor data from multiple nodes to understand the full mesh topology. + +> ⚠️ **Note:** Neighbor Info increases airtime usage because every enabled node periodically broadcasts its neighbor list. On busy meshes with many nodes, consider longer broadcast intervals (3600 seconds or more) to avoid congestion. + +--- + +## Node List as a Discovery Tool + +The node list itself is a powerful discovery tool when you use its filtering and sorting features effectively. + +### Finding New Nodes + +- Sort by **Last heard** to see the most recently active nodes at the top. +- Enable **Include unknown** to see nodes that have appeared on the mesh but haven't sent user info yet — these are often newly powered-on devices. + +### Assessing Connectivity + +- Sort by **Hops away** to see which nodes are directly reachable (0 hops) versus relayed. +- Sort by **Distance** to find nearby nodes and verify they're reachable. +- Use **Exclude MQTT** to focus on nodes reachable over radio (not via internet bridge). + +### Infrastructure Audit + +- Disable **Exclude infrastructure** to see Router, Repeater, Router Late, and Client Base nodes. +- Check their signal quality and last-heard times to verify your infrastructure nodes are healthy. + +See [Nodes](nodes) for full details on filtering and sorting options. + +--- + +## Tips for Mesh Exploration + +- **Start with traceroute** — it gives you immediate, actionable information about a specific path. +- **Enable Neighbor Info on key nodes** — especially routers and repeaters, to build a picture of the backbone. +- **Check the map** — node positions on the [Map](map-and-waypoints) combined with signal data help you understand why some links are strong and others are weak. +- **Compare signal over time** — use the [Signal Meter](signal-meter) guide to interpret SNR and RSSI values correctly. + +--- + diff --git a/docs/is-rIS/user/firmware.md b/docs/is-rIS/user/firmware.md new file mode 100644 index 000000000..cb5973377 --- /dev/null +++ b/docs/is-rIS/user/firmware.md @@ -0,0 +1,114 @@ +--- +title: Firmware Updates +nav_order: 13 +last_updated: 2026-05-13 +description: Update your radio firmware over Bluetooth — OTA process, version channels, pre-flight checks, and recovery. +aliases: + - firmware + - update + - ota + - flash +--- + +# Firmware Updates + +Keep your Meshtastic radio up to date with the latest firmware for new features, bug fixes, and security improvements. + +## Checking for Updates + +1. Navigate to **Settings → Firmware Update** or tap the firmware notification if shown. +2. The app checks for available firmware versions. +3. Available updates show the version number and changelog summary. + +## Update Methods + +### OTA (Over-The-Air) via Bluetooth + +The most common update method for Android users: + +1. Ensure your radio is connected via Bluetooth. +2. Navigate to the Firmware Update screen. +3. Select the desired firmware version. +4. Tap **Update** to begin the OTA process. +5. Wait for the update to complete — **do not disconnect** during the update. + +![Firmware checking for updates](/assets/screenshots/firmware_checking.png) + +> ⚠️ **Warning:** Interrupting a firmware update can brick your device. Ensure your radio has sufficient battery (>50% recommended) and maintain Bluetooth proximity during the entire process. + +![Firmware disclaimer](/assets/screenshots/firmware_disclaimer.png) + +### USB Flashing + +For recovery or when OTA is unavailable: + +- Use the [Meshtastic Web Flasher](https://flasher.meshtastic.org) +- Or the [Meshtastic CLI tool](https://meshtastic.org/docs/getting-started/flashing-firmware) on desktop + +## Version Channels + +| Channel | Lýsing | +| ------- | ------------------------------------------- | +| Stable | Recommended for most users; tested releases | +| Alpha | Preview releases; may contain bugs | + +## Pre-Update Checklist + +Before updating: + +- [ ] Battery > 50% +- [ ] Stable Bluetooth connection +- [ ] Note your current settings (they may reset on major version changes) +- [ ] Check the release notes for breaking changes + +## Post-Update + +After a successful update: + +- The radio will reboot automatically +- Bluetooth connection will re-establish +- Verify your settings are intact +- Check the firmware version in **Settings → About** + +![Firmware update success](/assets/screenshots/firmware_success.png) + +## Troubleshooting + +### Update Stuck + +If the update appears frozen: + +- Wait at least 5 minutes before intervening +- If truly stuck, power-cycle the radio +- Attempt the update again + +![Firmware update error](/assets/screenshots/firmware_error.png) + +### Device Won't Boot After Update + +If your device fails to boot: + +1. Try connecting via USB to a computer +2. Use the web flasher in recovery/DFU mode +3. Flash a known-good firmware version +4. Check the Meshtastic Discord for device-specific recovery steps + +### Compatibility Warnings + +The app may show warnings when: + +- Connected radio firmware is below minimum supported version +- Major version mismatch between app and firmware +- Deprecated features need migration + +> ⚠️ **Important:** Always update the Meshtastic app before or alongside firmware updates to ensure compatibility. + +## Related Topics + +- [Connections](connections) — reconnecting after a firmware update +- [Flashing firmware guide](https://meshtastic.org/docs/getting-started/flashing-firmware) — full firmware flashing walkthrough on meshtastic.org +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — check firmware compatibility by device +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/is-rIS/user/map-and-waypoints.md b/docs/is-rIS/user/map-and-waypoints.md new file mode 100644 index 000000000..0f1553fc7 --- /dev/null +++ b/docs/is-rIS/user/map-and-waypoints.md @@ -0,0 +1,116 @@ +--- +title: Map & Waypoints +nav_order: 6 +last_updated: 2026-05-13 +description: View node positions on the map, create and share waypoints, and manage position sharing and privacy. +aliases: + - map + - waypoints + - gps + - location +--- + +# Map & Waypoints + +The Map screen shows the geographic positions of nodes on your mesh, along with shared waypoints. + +## Map View + +The map displays: + +- **Node positions** — colored markers for each node reporting location +- **Waypoints** — shared points of interest +- **Your position** — your current GPS location + +### Node Markers + +Node markers on the map indicate: + +| Color | Meaning | +| ------ | ---------------------------------------------- | +| Green | Online (heard recently) | +| Yellow | Away (heard within 2 hours) | +| Gray | Offline (stale position) | +| Blue | Your own node | + +### Map Controls + +- **Zoom** — pinch or use +/- buttons +- **Pan** — drag to explore +- **Center** — select the location button to center on your position +- **Node tap** — tap a node marker to view details + +The floating toolbar provides quick access to compass, layer switching, node filters, refresh, and location tracking. Tap the compass to reorient north-up, or tap the location button to center on your current position. + +![Map controls overlay](/assets/screenshots/map_controls_overlay.png) + +## Waypoints + +Waypoints are shared geographic points of interest that all mesh members can see. + +### Creating a Waypoint + +1. Long-press on the map at the desired location. +2. Enter a name and optional description. +3. Choose an icon/emoji for the waypoint. +4. Tap **Send** to share with the mesh. + +### Waypoint Properties + +| Property | Lýsing | +| ---------- | ------------------------------------------------------- | +| Heiti | Short identifier (max 30 characters) | +| Lýsing | Optional longer description | +| Icon | Visual marker emoji on the map | +| Læst | If locked, only the creator can edit or delete | +| Expiration | Optional auto-remove time | + +### Waypoint Expiration + +Waypoints can be set to expire automatically: + +- **Never** (default) — waypoint remains until manually deleted +- **Timed** — waypoint is automatically removed after the specified duration (e.g., "remove after 2 hours"). Useful for temporary markers like rally points, hazards, or meeting locations. + +Expired waypoints are automatically hidden from the map so they don't clutter the display. The expiration countdown begins when the waypoint is created, not when other nodes receive it. + +### Managing Waypoints + +- Tap a waypoint on the map to view its details and coordinates +- Edit or delete waypoints you created +- **Locked waypoints** cannot be modified or deleted by other nodes — only the original creator can change them +- Unlocked waypoints can be edited by any mesh member + +## Position Sharing + +### Enabling Position Sharing + +Your node shares its GPS position based on: + +- **Fixed interval** — broadcast position at regular intervals +- **Smart position** — broadcast when movement exceeds a threshold +- **Manual** — only share when explicitly requested + +Configure position behavior in **Settings → Position**. + +### Privacy Considerations + +> 🔒 **Privacy:** Position data is broadcast to all nodes on your channel. If you don't want your location shared, disable GPS position in settings or use a fixed/fake position. + +## Map Sources + +The app supports multiple map tile sources: + +- OpenStreetMap (default) +- Satellite imagery (where available) +- Offline tiles (download map areas for offline use) + +## Related Topics + +- [Nodes](nodes) — view and filter your node list +- [Node Metrics](node-metrics) — signal quality and position history for individual nodes +- [Discovery](discovery) — traceroute and neighbor info for understanding mesh topology +- [Units & Locale](units-and-locale) — distance and coordinate display formats + +--- + diff --git a/docs/is-rIS/user/messages-and-channels.md b/docs/is-rIS/user/messages-and-channels.md new file mode 100644 index 000000000..d5ee7d8f1 --- /dev/null +++ b/docs/is-rIS/user/messages-and-channels.md @@ -0,0 +1,159 @@ +--- +title: Messages & Channels +nav_order: 3 +last_updated: 2026-05-13 +description: Send and receive messages, manage channels, configure encryption, and use quick chat, reactions, and message actions. +aliases: + - channels + - direct-messages + - messaging + - conversations +--- + +# Messages & Channels + +Meshtastic supports two communication modes: **channel broadcasts** and **direct messages**. + +## Channels + +Channels are shared communication groups. All nodes configured with the same channel key can read and send messages on that channel. + +### Default Channel + +Every Meshtastic device comes with a default **LongFast** channel. This is an unencrypted channel used for general mesh communication. + +### Channel Security + +Channels support multiple encryption levels: + +| Icon | Security Level | Lýsing | +| ---- | ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------- | +| 🔒 | PSK (256-bit AES) | Fully encrypted with a strong pre-shared key. Only nodes with the matching key can read messages. | +| 🔐 | PSK (128-bit AES) | Encrypted with a shorter key. Secure for most uses but 256-bit is preferred for sensitive data. | +| 🔓 | Default / Open | Uses the well-known default key. **Any Meshtastic device** on the same preset can read these messages. | +| ⚠️ | Insecure + Position | Open channel that also broadcasts your GPS position. Use with caution in public meshes. | + +> 🔒 **Security Tip:** 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. + +### Adding a Channel + +1. Navigate to **Settings → Channels**. +2. Tap **Add Channel** or scan a QR code. +3. Configure the channel name and encryption key. +4. Share the channel URL/QR code with others who need access. + +Tapping a channel shows its details and sharing options. + +## Direct Messages + +Direct messages (DMs) are point-to-point encrypted communications between two specific nodes. + +### Sending a Direct Message + +1. Open the **Messages** tab. +2. Select a node from your contacts list or tap a node in the node list. +3. Type your message and tap **Send**. + +### Message States + +| State | Icon | Meaning | +| --------------------------------- | ---- | ----------------------------------------------------------------------------------------------------------------- | +| Queued | ⏳ | Message waiting to be sent | +| En route | ✓ | Delivered to the radio, awaiting acknowledgment | +| Delivered | ✓✓ | Acknowledgment received from recipient | +| Received | ✓ | Message received from the mesh (incoming) | +| S&F Routing | 🔗 | Store & Forward: message being routed through an S&F node | +| S&F Confirmed | 🔗 | Store & Forward: delivery confirmed via S&F node | +| Error | ✗ | Delivery failed after retries | + +### Delivery Errors + +When a message fails to deliver, the error indicator shows what went wrong: + +| Error | Meaning | What to Do | +| ---------------- | ---------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| No Route | No path exists to the destination node | The recipient may be offline or out of mesh range. Try later or move closer. | +| Got NAK | The next-hop node refused to relay | The relay node may be congested. Wait and retry. | +| Timeout | No acknowledgment within retry window | The recipient may be just out of range. Try increasing hop limit or moving to a better position. | +| No Interface | No radio interface available to send | Check that your radio is connected and the channel is configured. | +| Max Retransmit | All retry attempts exhausted | The mesh path is unreliable. Try a different channel or wait for conditions to improve. | +| No Channel | The destination channel doesn't exist | Verify both nodes share the same channel configuration. | +| Too Large | Message exceeds maximum payload size | Shorten your message (max ~230 characters). | +| No Response | Node received message but didn't respond | The recipient's radio may be busy or in low-power sleep mode. | +| Duty Cycle Limit | Regional airtime limit reached | Your radio has used its allowed transmit time. Wait for the duty cycle window to reset (typically 1 hour in EU regions). | +| Bad Request | Malformed or invalid message | This usually indicates a software bug. Try restarting the app. | + +> 💡 **Tip:** 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. + +## Message Features + +### Quick Chat + +Pre-configured messages for rapid communication: + +- Access via the Quick Chat button in the message input area +- Choose from built-in phrases or custom messages +- Customize quick chat messages in **Settings → Quick Chat** +- Useful when typing is impractical (gloves, small screen, urgent) + +![Quick chat option](/assets/screenshots/messages_quick_chat.png) + +The channel list shows each channel with its latest message preview. + +### Message Bubbles + +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. + +### Reactions + +React to messages with emoji: + +- **Long-press** a message to open the actions menu +- Tap **Add Reaction** to choose an emoji +- Reactions appear below the message bubble +- Multiple users can react to the same message +- React to your own messages or others' messages + +![Emoji reaction badges displayed beneath a message](/assets/screenshots/messages_reaction.png) + +> 💡 **Tip:** Reactions are lightweight — they use minimal mesh bandwidth compared to full text messages. + +### Message Actions + +Long-press any message to access: + +- **Copy** — copy message text to clipboard +- **Reply** — quote the message in your response +- **React** — add an emoji reaction +- **Delete** — remove a message you sent (local deletion) + +### Message Priority + +Messages are queued and transmitted based on priority: + +1. Emergency/alert messages (highest) +2. Direct messages +3. Channel broadcasts (lowest) + +### Message Limits + +- **Maximum length:** 237 bytes (approximately 230 characters for ASCII text) +- **Rate limiting:** The mesh enforces airtime fairness; heavy message volume may be throttled +- **Delivery:** Messages are retried automatically if no acknowledgment is received + +## Best Practices + +- Use channels for group coordination +- Use direct messages for private person-to-person communication +- Keep messages short — mesh bandwidth is limited +- Configure encryption for sensitive communications + +## Related Topics + +- [Nodes](nodes) — tap a node to start a direct message +- [Settings — Radio & User](settings-radio-user) — configure channel encryption and presets +- [MQTT](mqtt) — bridge channel messages to the internet +- [Channel configuration](https://meshtastic.org/docs/configuration/radio/channels) — detailed channel settings on meshtastic.org + +--- + diff --git a/docs/is-rIS/user/mqtt.md b/docs/is-rIS/user/mqtt.md new file mode 100644 index 000000000..bbdf5507f --- /dev/null +++ b/docs/is-rIS/user/mqtt.md @@ -0,0 +1,137 @@ +--- +title: MQTT +nav_order: 11 +last_updated: 2026-05-13 +description: Bridge your mesh to the internet — MQTT broker setup, encryption layers, and map reporting. +aliases: + - mqtt + - internet-bridge + - broker +--- + +# MQTT + +MQTT bridges your Meshtastic mesh network to the internet, enabling long-range communication beyond radio range. + +## Overview + +The MQTT module connects your node to an MQTT broker, allowing: + +- Messages to reach nodes on different physical meshes via the internet +- Integration with home automation and monitoring systems +- Publishing node positions to the public Meshtastic map +- Custom data pipelines for logging and alerting + +## How It Works + +``` +[Your Node] → Radio → [Gateway Node with WiFi] → MQTT Broker → [Remote Gateway] → Radio → [Remote Node] +``` + +A gateway node with internet access (WiFi or Ethernet) publishes mesh messages to an MQTT topic. Remote gateways subscribed to the same topic inject those messages into their local mesh. + +## Configuration + +### Enabling MQTT + +1. Navigate to **Settings → Module Config → MQTT**. +2. Enable the MQTT module. +3. Configure the broker connection: + +![MQTT toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | Lýsing | Default | +| --------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------- | +| Server Address | MQTT broker hostname | mqtt.meshtastic.org | +| Username | Broker authentication | meshdev | +| Password | Broker authentication | large4cats | +| Root Topic | Base topic for messages | msh | +| Encryption | Encrypt MQTT payload | Enabled | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON packet support has been removed from firmware; this field is ignored | Disabled | +| TLS | Secure connection to broker | Disabled | +| Map Reporting | Report position to public map | Disabled | + +### Default Meshtastic Broker + +The community maintains a public broker at `mqtt.meshtastic.org`. This is intended for general use and testing. + +> 🔒 **Privacy:** Messages on the public broker are readable by anyone subscribed. Always use channel encryption for private communications. + +### Private Broker + +For better privacy and control, you can run your own MQTT broker: + +- Mosquitto (lightweight, open-source) +- HiveMQ +- EMQX + +Configure your node to point to your private broker with appropriate credentials. + +## Map Reporting + +When Map Reporting is enabled, your node publishes its position to the Meshtastic community map: + +- Visible at [meshmap.net](https://meshmap.net) and similar community map services +- Only position and node info are shared +- Disable this if you don't want your location publicly visible + +## Uplink vs Downlink + +| Direction | Lýsing | +| ------------ | -------------------------------- | +| **Uplink** | Messages from mesh → MQTT broker | +| **Downlink** | Messages from MQTT broker → mesh | + +Configure per-channel which directions are active to control message flow and airtime usage. + +## Message Formats + +MQTT uses protobuf message format: + +| Format | Lýsing | Use case | +| ------------ | ----------------------------------- | -------------------------- | +| **Protobuf** | Binary Meshtastic protobuf encoding | Node-to-node mesh bridging | + +> ⚠️ **Note:** JSON output support was removed from firmware. The `json_enabled` setting is still visible in the app for legacy compatibility but has no effect on current firmware versions. + +## Encryption & Privacy + +Understanding the layered encryption model: + +1. **Channel encryption** happens on the mesh _before_ MQTT. If your channel has a PSK, the MQTT payload is already encrypted — the broker and any subscribers see only the ciphertext. +2. **MQTT encryption** (the module setting) adds an additional encryption layer for transit to the broker. This protects metadata and routing information. +3. **TLS** encrypts the TCP connection to the broker itself, preventing network-level eavesdropping. + +> 🔒 **Important:** The default public channel has a well-known key. Messages on the default channel sent via MQTT are effectively **unencrypted** — anyone can decode them. Always use a custom PSK for private communications. + +## Best Practices + +- Use channel-level encryption (PSK) on channels that bridge to MQTT +- Don't enable MQTT on nodes without internet access (it will buffer and waste memory) +- Use a private broker for sensitive deployments +- Be mindful of airtime when downlinking messages from busy MQTT topics — every downlinked message consumes radio airtime on your local mesh +- Consider enabling uplink-only if you only need to monitor your mesh remotely without injecting messages back + +## Troubleshooting + +### MQTT Not Connecting + +- **Check WiFi** — the gateway node must have an active internet connection (WiFi or Ethernet). MQTT does not work over the LoRa radio link itself. +- **Verify credentials** — incorrect username or password will silently fail on most brokers. Double-check for trailing spaces. +- **Firewall** — port 1883 (MQTT) or 8883 (MQTT+TLS) must be open. Some networks block non-standard ports. +- **DNS resolution** — if using a custom broker hostname, verify the node can resolve it. Try the broker's IP address directly. + +### Messages Not Bridging + +- **Check uplink/downlink settings** — if only uplink is enabled, messages flow from mesh to MQTT but not back. Enable downlink on the receiving gateway. +- **Channel mismatch** — both gateways must share the same channel with the same PSK. A mismatch means messages are encrypted with different keys and appear as garbage. +- **Topic mismatch** — ensure both gateways use the same root topic. The default `msh` works for the public broker. + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — MQTT module configuration reference +- [Messages & Channels](messages-and-channels) — channel encryption and PSK setup +- [MQTT integration guide](https://meshtastic.org/docs/software/integrations/mqtt) — detailed MQTT documentation on meshtastic.org + +--- + diff --git a/docs/is-rIS/user/node-metrics.md b/docs/is-rIS/user/node-metrics.md new file mode 100644 index 000000000..495fa447a --- /dev/null +++ b/docs/is-rIS/user/node-metrics.md @@ -0,0 +1,130 @@ +--- +title: Node Metrics +nav_order: 5 +last_updated: 2026-05-13 +description: Telemetry dashboards for each mesh node — device health, environment sensors, signal quality, power, traceroute, and position history. +aliases: + - metrics + - telemetry + - device-metrics + - signal +--- + +# Node Metrics + +The node detail screen provides comprehensive telemetry and metrics for each node on your mesh. + +## Device Metrics + +Basic operating information reported by each node: + +| Metric | Lýsing | +| ------------------- | ----------------------------------- | +| Battery Level | Current battery percentage | +| Voltage | Battery voltage reading | +| Channel Utilization | Percentage of airtime consumed | +| Airtime | Transmission time used by this node | +| Uptime | Time since last reboot | + +Device metrics are displayed as individual cards with trend sparklines showing battery level, voltage, channel utilization, airtime, and uptime over time. + +> 💡 **Tip:** Tap any metric card to expand it into a full chart with historical data points. Pinch to zoom the time axis. + +## Environment Metrics + +Environmental sensor data (requires compatible hardware): + +| Metric | Sensor Examples | +| ------------------------------------ | --------------------- | +| Temperature | BME280, BME680, SHT31 | +| Humidity | BME280, BME680, SHT31 | +| Barometric Pressure | BME280, BMP280 | +| Gas Resistance | BME680 | +| IAQ (Air Quality) | BME680 | + +Environment metrics are charted over time for easy trend analysis — temperature, humidity, and pressure each get their own line chart with the measurement unit displayed on the Y axis. + +> 💡 **Tip:** Environment metrics require a sensor connected to the remote node. Not all nodes report environmental data. See [Telemetry & Sensors](telemetry-and-sensors) for a full list of supported sensors. + +## Signal Metrics + +Radio signal quality information: + +| Metric | Lýsing | +| --------- | ----------------------------------------------------------------------------- | +| SNR | Signal-to-Noise Ratio (higher is better) | +| RSSI | Received Signal Strength Indicator (closer to 0 is better) | +| Hop Count | Number of mesh hops for last message | + +### Signal Quality Reference + +| SNR Range | Quality | +| --------------------------------- | --------- | +| > 10 dB | Excellent | +| 0 to 10 dB | Good | +| -10 to 0 dB | Fair | +| < -10 dB | Poor | + +## Power Metrics + +Power management telemetry (requires INA sensor or compatible hardware): + +| Metric | Lýsing | +| ----------- | ----------------------- | +| Bus Voltage | Supply voltage | +| Current | Power draw in milliamps | +| Power | Calculated wattage | + +## Ferilkönnun + +Traceroute shows the path a message takes through the mesh: + +1. From the node detail screen, tap **Traceroute**. +2. The app sends a traceroute request to the target node. +3. Results show each hop with SNR/RSSI values. + +### Reading Traceroute Results + +``` +You → Node A (SNR: 8.5) → Node B (SNR: 5.2) → Target +``` + +Each hop represents a relay node that forwarded the message. + +## Position Log + +Historical position data for nodes that share their location: + +- GPS coordinates +- Altitude +- Speed (if moving) +- Timestamp for each position report + +## Neighbor Info + +Shows which nodes a given node can directly hear, useful for understanding mesh topology. + +## Viewing Metrics + +1. Navigate to **Nodes**. +2. Tap the node you want to inspect. +3. Select the metric category from the detail tabs. + +![Node detail — local device](/assets/screenshots/nodes_detail_local.png) + +The position tab shows location data for nodes that share GPS: + +![Position inline content](/assets/screenshots/nodes_position.png) + +> ⚠️ **Note:** Metrics are only available when they have been reported by the remote node. Metrics update at intervals configured on each node's telemetry settings. + +## Related Topics + +- [Nodes](nodes) — node list, filtering, and sorting +- [Telemetry & Sensors](telemetry-and-sensors) — supported sensors and configuration +- [Signal Meter](signal-meter) — how signal quality is calculated from SNR and RSSI +- [Discovery](discovery) — traceroute details and neighbor info +- [Units & Locale](units-and-locale) — temperature, distance, and speed display formats + +--- + diff --git a/docs/is-rIS/user/nodes.md b/docs/is-rIS/user/nodes.md new file mode 100644 index 000000000..4d5214729 --- /dev/null +++ b/docs/is-rIS/user/nodes.md @@ -0,0 +1,152 @@ +--- +title: Nodes +nav_order: 4 +last_updated: 2026-05-13 +description: Browse, filter, and sort mesh nodes — view details, signal quality, roles, and quick actions. +aliases: + - node-list + - mesh-nodes + - peers +--- + +# Nodes + +The Nodes screen displays all devices visible on your mesh network. + +## Node List + +The node list shows every node your radio has heard, including: + +- **Node name** — user-configured long name +- **Short name** — 4-character identifier +- **Signal quality** — last heard signal strength +- **Last heard** — time since last communication +- **Distance** — estimated distance (if positions are shared) +- **Battery** — remote node battery level (if telemetry is enabled) + +### Node Status Indicators + +| Badge | Meaning | +| ---------- | ------------------------------------- | +| 🟢 Online | Node heard within the last 15 minutes | +| 🟡 Away | Node heard within the last 2 hours | +| 🔴 Offline | Node not heard for over 2 hours | +| ⭐ Favorite | Node marked as favorite by the user | + +### Node Roles + +Nodes can be configured with different roles that affect their mesh behavior: + +| Role | Lýsing | +| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Client | Standard end-user device | +| Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | +| Client Mute | Receives but doesn't retransmit | +| Client Hidden | Like Client Mute, plus hides from node list | +| Router | Prioritizes message forwarding; stays awake to relay | +| Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | +| ~~Router Client~~ | ⚠️ **Deprecated** (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | +| ~~Repeater~~ | ⚠️ **Deprecated** (removed in firmware 2.7.11) — no longer selectable; use Router instead | +| Tracker | Optimized for position reporting at regular intervals | +| Sensor | Optimized for telemetry reporting | +| TAK | Interoperates with TAK systems (sends/receives CoT) | +| TAK Tracker | TAK position reporting only | +| Lost & Found | Continuous position beacon for recovery | + +### Choosing a Role + +Most users should keep the default **Client** role. Consider a different role when: + +- **Router** — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don't use Router on battery-powered handheld devices. +- **Router Late** — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. +- **Client Base** — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. +- **Client Mute** — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only devices or to reduce congestion in dense areas. +- **Tracker** — An unattended device whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. +- **Sensor** — An unattended device reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. +- **TAK / TAK Tracker** — Only needed if interoperating with ATAK/WinTAK systems. See [TAK Integration](tak) for details. + +> 💡 **Tip:** The mesh works best when most nodes are **Client** or **Router**. Too many Mute nodes reduces mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. + +### Encryption Indicators + +Nodes display encryption status icons next to their name: + +| Icon | Meaning | +| ----------- | ------------------------------------------------------------------------------------------------------------------- | +| 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | +| 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | +| ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) | + +> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. + +## Quick Actions + +From the node list, you can: + +- **Tap** a node to view its detail page +- **Long-press** for quick actions: + - Send a direct message + - View on map + - Óska eftir staðsetningu + - Mark as favorite + - Ferilkönnun + +## Filtering & Sorting + +### Text Search + +Type in the search field to filter nodes by name or short name. The filter updates in real time as you type. + +### Filter Toggles + +| Filter | Lýsing | +| -------------------------- | ---------------------------------------------------------------------------------------------- | +| **Only online** | Show only nodes heard within the last 15 minutes | +| **Only direct** | Show only nodes with direct (non-relayed) connections | +| **Include unknown** | Show nodes that haven't sent user info yet | +| **Exclude infrastructure** | Hide infrastructure-role nodes (Router, Repeater, Router Late, Client Base) | +| **Exclude MQTT** | Hide nodes heard only via MQTT internet bridge | +| **Show ignored** | Show nodes you've previously dismissed or muted | + +### Sort Options + +| Sort | Lýsing | +| ------------------------------------------- | ------------------------------------------------------------------ | +| **Last heard** (default) | Most recently heard nodes first | +| **Alphabetical** | Sorted by node long name | +| **Distance** | Nearest nodes first (requires position sharing) | +| **Hops away** | Fewest relay hops first | +| **Channel** | Grouped by channel index | +| **Via MQTT** | Grouped by MQTT vs. radio-heard | +| **Favorites** | Favorited nodes first | + +## Node Detail + +Tapping a node opens the detail view with comprehensive information. See [Node Metrics](node-metrics) for full details on metrics and telemetry. + +![Node detail view](/assets/screenshots/nodes_node_list.png) + +The detail screen includes device info, position, and action buttons: + +![Node detail section](/assets/screenshots/nodes_detail_section.png) + +Inline status indicators show key metrics at a glance: + +| Indicator | Screenshot | +| -------------- | -------------------------------------------------------- | +| Signal quality | ![Signal](/assets/screenshots/nodes_signal_info.png) | +| Battery level | ![Battery](/assets/screenshots/nodes_battery_info.png) | +| Hop count | ![Hops](/assets/screenshots/nodes_hops_info.png) | +| Last heard | ![Last heard](/assets/screenshots/nodes_last_heard.png) | +| Distance | ![Distance](/assets/screenshots/nodes_distance_info.png) | + +## Related Topics + +- [Node Metrics](node-metrics) — detailed telemetry dashboards for each node +- [Messages & Channels](messages-and-channels) — send a direct message to a node +- [Map & Waypoints](map-and-waypoints) — view node positions geographically +- [Discovery](discovery) — traceroute and neighbor info for topology exploration +- [Signal Meter](signal-meter) — understand what the signal bars mean + +--- + diff --git a/docs/is-rIS/user/onboarding.md b/docs/is-rIS/user/onboarding.md new file mode 100644 index 000000000..3b910534e --- /dev/null +++ b/docs/is-rIS/user/onboarding.md @@ -0,0 +1,99 @@ +--- +title: Getting Started +nav_order: 1 +last_updated: 2026-05-13 +description: First-launch setup — permissions, onboarding flow, and next steps after connecting your radio. +aliases: + - first-launch + - setup + - intro +--- + +# Getting Started + +Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app. + +## First Launch + +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. + +### Welcome Screen + +The welcome screen introduces Meshtastic and its core capabilities: + +- Off-grid mesh communication +- No cellular or internet required +- End-to-end encrypted messaging + +Tap **Get Started** to proceed through the setup flow. + +![Welcome screen](/assets/screenshots/onboarding_welcome.png) + +## Permissions + +The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. + +### Bluetooth Permission + +Bluetooth is the primary connection method between your phone and Meshtastic radio: + +- **Bluetooth scanning** — discover nearby Meshtastic radios +- **Bluetooth connect** — establish and maintain connections with paired radios + +Grant both permissions when prompted. Without Bluetooth, you'll need to use USB or TCP connections instead. + +### Location Permission + +> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. + +Meshtastic also uses your location for: + +- Showing your position on the mesh map +- Calculating distances to other nodes +- Sharing your GPS coordinates with other mesh members (if enabled) + +Grant **"While using the app"** or **"Always"** depending on your preference: + +- **While using the app** — position updates only when the app is open +- **Always** — enables background position updates for always-on mesh presence + +If denied, Bluetooth scanning will not function and your node will not report a position. + +### Notifications Permission + +Notifications alert you to: + +- Incoming messages from channels and direct messages +- Connection status changes (connected, disconnected, reconnecting) +- Firmware update availability + +> 💡 **Tip:** You can fine-tune notification preferences later in Android system settings. The app creates separate notification channels for messages, connection events, and background service status. + +### Critical Alerts Permission + +On supported devices, the app may request permission for critical alerts: + +- These are high-priority notifications that can break through Do Not Disturb mode +- Useful for emergency mesh alerts or urgent messages +- You can **skip** this step if you don't need breakthrough notifications +- Configure or revoke later in Android notification settings + +## After Setup + +Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. + +> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. + +## What's Next? + +Once connected to a radio, explore: + +- [Connections](connections) — pair your first radio device +- [Messages & Channels](messages-and-channels) — send your first message +- [Nodes](nodes) — see who's on your mesh +- [Map & Waypoints](map-and-waypoints) — view node positions +- [Settings](settings-radio-user) — configure your radio and user profile + +New to Meshtastic? The [getting started guide](https://meshtastic.org/docs/getting-started) on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup. + +--- diff --git a/docs/is-rIS/user/settings-module-admin.md b/docs/is-rIS/user/settings-module-admin.md new file mode 100644 index 000000000..bdbd58a69 --- /dev/null +++ b/docs/is-rIS/user/settings-module-admin.md @@ -0,0 +1,246 @@ +--- +title: Settings — Modules & Admin +nav_order: 8 +last_updated: 2026-05-13 +description: Configure optional feature modules (MQTT, telemetry, canned messages, TAK, and more) and perform device administration. +aliases: + - modules + - module-config + - administration +--- + +# Settings — Modules & Admin + +Configure optional feature modules and perform device administration. Modules extend Meshtastic with specialized capabilities — each can be independently enabled or disabled. + +> 💡 **Tip:** You only need to enable the modules you actually use. Disabling unused modules reduces airtime, saves battery, and simplifies your configuration. + +Module settings use a card-based layout with toggle switches, dropdowns, text fields, and sliders: + +![Toggle switch](/assets/screenshots/settings_switch.png) + +![Dropdown selector](/assets/screenshots/settings_dropdown.png) + +![Text field](/assets/screenshots/settings_text_field.png) + +![Settings card layout](/assets/screenshots/settings_titled_card.png) + +## Module Configuration + +### MQTT Module + +Bridges mesh messages to and from an MQTT broker for internet connectivity. This is how you extend your mesh beyond radio range or integrate with home automation systems. + +| Setting | Lýsing | +| --------------- | ------------------------------------------------------------------------ | +| Enabled | Toggle MQTT bridge | +| Server | MQTT broker address | +| Username | Authentication username | +| Password | Authentication password | +| Encryption | Encrypt MQTT payloads | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON support removed from firmware; field is ignored | +| TLS | Use secure connection | +| Root Topic | Base MQTT topic path | +| Map Report | Publish position for public map | + +See [MQTT](mqtt) for a detailed usage guide including encryption, privacy, and broker setup. + +### Serial Module + +Enables serial port communication for external device integrations (GPS modules, sensors, or custom hardware). When enabled, the node's serial port can send and receive protobuf or text data, allowing external microcontrollers or computers to interact with the mesh. + +| Setting | Lýsing | +| ---------- | ------------------------------- | +| Enabled | Activate serial communication | +| Echo | Echo received serial data back | +| Mode | Text, Protobuf, or NMEA output | +| RX/TX Pins | GPIO pins for serial connection | +| Baud Rate | Serial communication speed | + +### External Notification Module + +Controls buzzer, LED, or vibration alerts on your radio hardware. Useful for devices that need to physically signal when a message arrives — particularly helpful for unattended or outdoor installations. + +| Setting | Lýsing | +| -------------------------------- | --------------------------- | +| Enabled | Activate notifications | +| Alert Message | Notify on incoming messages | +| Alert Message Buzzer | Use buzzer for messages | +| Alert Message Vibra | Use vibration for messages | +| Alert Bell | Notify on bell character | +| Output (GPIO) | Pin for notification output | +| Active | High or Low active | +| Duration (ms) | Notification length | +| Use I2S as Buzzer | Use I2S audio output | + +### Store & Forward Module + +Buffers messages for nodes that were temporarily offline, then replays them when those nodes reconnect. Essential for meshes where nodes go in and out of range regularly — ensures messages aren't lost during brief disconnections. + +| Setting | Lýsing | +| ------------------------------------------ | -------------------------- | +| Enabled | Activate store and forward | +| Heartbeat (s) | Announcement interval | +| Records | Maximum stored messages | +| History Return (max) | Max messages to replay | +| History Return (window) | Time window for replay | + +> 💡 **Tip:** Store and Forward works best on nodes with ample memory (ESP32 with PSRAM). Router nodes are ideal candidates since they're typically always-on. + +### Range Test Module + +Automated range testing tool for evaluating link quality between nodes. When enabled, the node periodically transmits test messages with incrementing counters. A receiver node logs these messages, allowing you to walk or drive away and later analyze at what distance messages stopped arriving. + +| Setting | Lýsing | +| -------------------------------------- | --------------------------------- | +| Enabled | Activate range testing | +| Sender Interval (s) | Time between test transmissions | +| Save CSV | Log received test data to SD card | + +### Telemetry Module + +Controls what telemetry data your node shares with the mesh. Telemetry includes device health (battery, uptime) and environmental sensor data (temperature, humidity, pressure). + +| Setting | Lýsing | +| ---------------------------- | --------------------------------------- | +| Device Metrics Interval | How often to report device metrics | +| Environment Metrics Interval | How often to report environment sensors | +| Air Quality Enabled | Report particulate sensor data | +| Power Metrics Enabled | Report power usage | + +See [Telemetry & Sensors](telemetry-and-sensors) for supported sensors and configuration recommendations. + +### Canned Message Module + +Pre-configured messages accessible from the device's physical buttons (for radios with rotary encoders, keypads, or similar input hardware). Define a list of quick-send messages that can be transmitted without a phone connected — ideal for field use. + +| Setting | Lýsing | +| ------------------ | ----------------------------------------------------------- | +| ~~Enabled~~ | ⚠️ **Deprecated** — current firmware may ignore this toggle | +| Messages | Newline-separated list of messages | +| Send Bell | Play bell sound on send | +| Rotary Encoder | Enable rotary encoder input | +| Up/Down/Press Pins | GPIO pin assignments for input | + +### Audio Module + +Codec2 audio support for low-bandwidth voice communication over the mesh. This is an **experimental** feature that encodes voice into very small data packets using the Codec2 codec. + +| Setting | Lýsing | +| --------------- | -------------------------------- | +| Enabled | Activate audio module | +| Codec2 Rate | Audio quality/bandwidth tradeoff | +| I2S Word Select | GPIO pin for I2S WS | +| I2S Data In | GPIO pin for I2S DIN | +| I2S Data Out | GPIO pin for I2S DOUT | + +> ⚠️ **Note:** Audio requires specific hardware (I2S microphone and speaker). Voice quality is very low-bandwidth — think "understandable radio voice," not phone-call quality. + +### Remote Hardware Module + +GPIO control over the mesh network. Allows a remote node to read or write GPIO pins on another node — useful for activating relays, reading switches, or controlling external hardware from a distance. + +| Setting | Lýsing | +| -------------------- | --------------------------------------------------------------- | +| Enabled | Activate remote GPIO access | +| Allow Undefined Pins | Allow access to any GPIO pin (security risk) | + +> ⚠️ **Warning:** Enabling "Allow Undefined Pins" gives remote nodes access to all GPIO pins, which could interfere with the radio's own hardware. Only enable on dedicated GPIO nodes. + +### Neighbor Info Module + +Broadcasts information about directly heard neighbors, enabling mesh topology mapping. Each enabled node periodically shares a list of the other nodes it can hear and their signal quality. + +| Setting | Lýsing | +| -------------------------------------- | ------------------------------------ | +| Enabled | Activate neighbor broadcasting | +| Update Interval (s) | How often to broadcast neighbor list | + +See [Discovery](discovery) for how to use neighbor data for mesh topology exploration. + +### Ambient Lighting Module + +Controls onboard NeoPixel or other addressable RGB LEDs on supported hardware. Can be used for visual status indicators, notification lights, or decorative effects. + +| Setting | Lýsing | +| ------------------ | ---------------------------------------------------------- | +| Enabled | Activate LED control | +| LED State | On, Off, or set specific color | +| Red / Green / Blue | Individual color channel values (0–255) | + +### Detection Sensor Module + +Turns your node into a motion or door sensor alert system. When a GPIO pin detects a state change (motion detected, door opened), the node broadcasts an alert message over the mesh. + +| Setting | Lýsing | +| ---------------------------------------- | ----------------------------------------------------------------------- | +| Enabled | Activate detection sensor | +| Monitor Pin | GPIO pin connected to sensor | +| Detection Triggered High | Trigger when pin goes high (vs. low) | +| Minimum Broadcast (s) | Minimum time between alert broadcasts | +| State Broadcast (s) | Periodic state broadcast interval | +| Send Bell | Include bell character in alerts | +| Friendly Name | Custom name for this sensor | + +### Paxcounter Module + +People counter using WiFi and BLE probe requests. Counts nearby devices by passively listening for probe requests that phones and laptops emit when scanning for networks. Available only on ESP32 devices. + +| Setting | Lýsing | +| -------------------------------------- | -------------------------- | +| Enabled | Activate people counting | +| Update Interval (s) | How often to report counts | + +> 💡 **Tip:** Paxcounter is useful for estimating foot traffic at trailheads, event venues, or other locations. Counts are approximate — one person may carry multiple devices. + +### TAK Module + +Team Awareness Kit integration for interoperability with ATAK and WinTAK. See [TAK Integration](tak) for detailed setup and usage. + +## Administration + +### Remote Administration + +Remotely configure nodes that share your admin key: + +1. Select the target node in the node list. +2. Navigate to **Settings** for that node. +3. Modify configuration. +4. Tap **Save** — changes are sent over the mesh. + +> ⚠️ **Requires:** Admin key configured on both your node and the target node. + +### Clean Node Database + +Removes stale nodes from your local database that haven't been heard in a configurable time window. + +### Factory Reset + +Resets all settings to factory defaults. **This cannot be undone.** + +### Endurræsa + +Remotely reboot a connected or administered node. + +### Villuleitarborð + +View detailed diagnostic information: + +- Protocol buffers debug output +- Mesh packet log +- Connection state details + +### Troubleshooting Remote Admin + +- **"No response from target node"** — the target may be out of range, offline, or have a mismatched admin key. Verify the admin key matches on both nodes. +- **Changes not applying** — some settings require a reboot to take effect. Try the Reboot action after saving. +- **Can't see remote settings** — ensure your node has the admin key for the target node and that Admin Channel is enabled in Security Config. + +## Related Topics + +- [Settings — Radio & User](settings-radio-user) — core radio and user profile settings +- [Module configuration reference](https://meshtastic.org/docs/configuration/module) — detailed module docs on meshtastic.org +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/is-rIS/user/settings-radio-user.md b/docs/is-rIS/user/settings-radio-user.md new file mode 100644 index 000000000..6973bc91e --- /dev/null +++ b/docs/is-rIS/user/settings-radio-user.md @@ -0,0 +1,173 @@ +--- +title: Settings — Radio & User +nav_order: 7 +last_updated: 2026-05-13 +description: Configure your radio hardware, LoRa presets, user profile, position sharing, power management, and security. +aliases: + - settings + - radio-config + - user-config + - lora +--- + +# Settings — Radio & User + +Configure your radio hardware and user identity parameters. + +## User Settings + +### User Profile + +| Setting | Lýsing | +| ----------------- | ------------------------------------------------------------------------------------- | +| Long Name | Your display name (up to 39 characters) | +| Short Name | 4-character abbreviated name | +| Licensed Operator | Enable if you hold an amateur radio license (enables higher power) | + +### Applying Changes + +After modifying settings, tap **Save** to write the configuration to your radio. The device may reboot to apply changes. + +## Radio Configuration + +### Device Config + +| Setting | Lýsing | Default | +| ------------------------------------------ | ----------------------------------------------------------------------- | -------- | +| Role | Node behavior (Client, Router, etc.) | Client | +| Rebroadcast Mode | How the node retransmits messages | All | +| Node Info Broadcast (s) | Interval for broadcasting node info | 10800 | +| Double-tap Button | Action for double-tap button press | Disabled | + +### LoRa Config + +| Setting | Lýsing | Default | +| ----------------- | ----------------------------------------------------------------------- | ----------------------------------------- | +| Svæði | Regulatory region for frequency bands | Unset (must configure) | +| Modem Preset | Speed/range tradeoff | LongFast | +| Hop Limit | Maximum retransmit hops | 3 | +| TX Power | Transmission power (dBm); 0 = max allowed for region | 0 (region max) | +| Frequency Offset | Fine-tune frequency (MHz) | 0 | +| Channel Bandwidth | Bandwidth setting | Default for preset | + +> ⚠️ **Important:** You **must** set your region before transmitting. Operating without the correct region may violate local radio regulations. See the [region configuration guide](https://meshtastic.org/docs/getting-started/initial-config) on meshtastic.org for details. + +### Modem Presets + +| Preset | Range | Speed | SNR Limit | Best For | +| ------------------ | ----------------------- | ------------------------- | ------------------------ | -------------------------------------------------------------------------------------------------------- | +| Short Turbo | ~1 km | 21.9 kbps | −5 dB | Dense urban with line-of-sight; data-heavy applications | +| Short Fast | ~3 km | 10.9 kbps | −7.5 dB | Urban neighborhoods; buildings within a few blocks | +| Short Slow | ~5 km | 5.5 kbps | −10 dB | Suburban short-range; moderate building density | +| Medium Fast | ~5 km | 5.5 kbps | −10 dB | Suburban areas; moderate building density | +| Medium Slow | ~8 km | 1.1 kbps | −12.5 dB | Suburban/rural; moderate range with slower speed | +| Long Turbo | ~10 km | 4.4 kbps | −10 dB | Similar range to Long Fast but with 500 kHz bandwidth; faster throughput | +| Long Fast | ~10 km | 1.1 kbps | −12.5 dB | **General use (default)** — balanced range and speed | +| Long Moderate | ~20 km | 0.34 kbps | −15 dB | Rural with some terrain; occasional use | +| Lite Fast | ~5 km | 5.5 kbps | −10 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Medium Fast | +| Lite Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Long Fast | +| Narrow Fast | ~5 km | 2.7 kbps | −10 dB | EU 868 MHz band (62.5 kHz BW); avoids interference with other devices | +| Narrow Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 868 MHz band (62.5 kHz BW); comparable to Long Fast | +| ~~Long Slow~~ | ~30 km | 0.18 kbps | −17.5 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | +| ~~Very Long Slow~~ | ~40+ km | 0.09 kbps | −20 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | + +#### Choosing a Modem Preset + +The modem preset controls the fundamental tradeoff between **range** and **data rate**: + +- **Slower presets** use more spreading, making signals decodable at weaker signal levels (lower SNR limit). This means longer range but fewer bytes per second. +- **Faster presets** pack more data per transmission but require a stronger signal to decode. + +**Practical guidance:** + +- **Urban mesh (many nodes, short distances):** Use **Long Fast** (default) or **Short Fast**. Higher speed means less airtime congestion when many nodes share the channel. +- **Rural/sparse mesh (few nodes, long distances):** Use **Long Moderate**. Range matters more than speed when nodes are far apart. +- **EU 866/868 MHz regulatory compliance:** Use **Lite Fast**, **Lite Slow**, **Narrow Fast**, or **Narrow Slow** — these are optimized for the EU SRD/868 MHz bands with narrower bandwidths. +- **Fixed infrastructure links:** Use **Short Turbo** or **Long Turbo** for dedicated point-to-point links with good antennas and line-of-sight. +- **Mixed environments:** Stick with **Long Fast** — it's the community default and ensures compatibility with others in your area. + +> ⚠️ **Important:** All nodes on the same channel **must** use the same modem preset. Nodes with mismatched presets cannot communicate even if they share the same frequency and encryption key. + +> 💡 **Tip:** The range estimates above assume flat terrain and modest antennas. Elevation advantage (hilltop, rooftop) dramatically increases effective range. A well-placed Router with Long Fast can often outperform a ground-level node with Long Slow. + +### Display Config + +| Setting | Lýsing | +| ------------------- | ------------------------------------------------------------------------------------ | +| Screen Timeout | Time before display sleeps | +| Display Units | Metric or Imperial | +| OLED Type | Auto, SSD1306, SH1106, SH1107 | +| Compass Orientation | Rotation offset for compass display (0°, 90°, 180°, 270°) | +| ~~Compass North~~ | ⚠️ **Deprecated** — replaced by Compass Orientation; still visible in older firmware | + +### Position Config + +| Setting | Lýsing | +| ----------------------------------------- | ---------------------------------- | +| GPS Enabled | Enable/disable GPS | +| GPS Update Interval | How often to acquire GPS fix | +| Position Broadcast (s) | How often to share position | +| Smart Position | Enable movement-based broadcasting | +| Fixed Position | Use a manually set position | + +### Power Config + +| Setting | Lýsing | +| --------------------------------------- | --------------------------------------- | +| Power Saving | Enable low-power sleep mode | +| Shutdown After (s) | Auto-shutdown idle timer | +| ADC Multiplier | Battery voltage calibration factor | +| Wait Bluetooth (s) | Time to wait for BLE connection at boot | +| Mesh SDS Timeout (s) | Super-deep-sleep timeout | + +### Network Config + +| Setting | Lýsing | +| ------------- | ---------------------------------------------------- | +| WiFi Enabled | Enable WiFi radio (ESP32 devices) | +| WiFi SSID | Network name to connect to | +| WiFi PSK | Network password | +| NTP Server | Time synchronization server | +| Syslog Server | Remote logging server | + +![IP address field](/assets/screenshots/settings_ipv4_field.png) + +### Bluetooth Config + +| Setting | Lýsing | +| ----------------- | ------------------------------------------------------------------------- | +| Bluetooth Enabled | Enable/disable BLE radio | +| Pairing Mode | Fixed PIN, Random PIN, or No PIN | +| Fixed PIN | PIN code for pairing (default: 123456) | + +### Security Config + +| Setting | Lýsing | +| --------------------- | -------------------------------------------------------------------------- | +| Public Key | Your node's public key (read-only) | +| Admin Key | Key for remote administration | +| Private Key | Your node's private key (handle securely) | +| Admin Channel Enabled | Allow admin commands via channel | +| Debug Log | Output live debug logging over serial/bluetooth | +| Serial Enabled | Enable serial console access (moved from Device Config) | +| Managed Mode | Restrict non-admin channel changes | + +![Password field](/assets/screenshots/settings_password_field.png) + +Settings use standard preference controls — dropdowns, toggles, and sliders: + +| Control | Screenshot | +| -------- | ------------------------------------------------------ | +| Dropdown | ![Dropdown](/assets/screenshots/settings_dropdown.png) | +| Toggle | ![Toggle](/assets/screenshots/settings_switch.png) | +| Slider | ![Slider](/assets/screenshots/settings_slider.png) | + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — optional feature modules and device administration +- [Signal Meter](signal-meter) — how modem presets affect signal quality thresholds +- [LoRa configuration](https://meshtastic.org/docs/configuration/radio/lora) — detailed LoRa settings reference on meshtastic.org +- [Initial configuration](https://meshtastic.org/docs/getting-started/initial-config) — region setup guide on meshtastic.org + +--- + diff --git a/docs/is-rIS/user/signal-meter.md b/docs/is-rIS/user/signal-meter.md new file mode 100644 index 000000000..d34246d0e --- /dev/null +++ b/docs/is-rIS/user/signal-meter.md @@ -0,0 +1,81 @@ +--- +title: How the Meshtastic Signal Meter Works +nav_order: 15 +last_updated: 2026-05-13 +description: How the signal meter calculates quality from RSSI and SNR — LoRa spread spectrum, presets, and what the bars really mean. +aliases: + - signal + - signal-meter + - snr + - rssi +--- + +# How the Meshtastic Signal Meter Works + +The Meshtastic signal meter — the familiar bars or status color in the app — is calculated very differently than the "bars" on a traditional cell phone or Wi-Fi router. + +Most consumer devices simply measure how "loud" a signal is. However, because Meshtastic uses **LoRa (Long Range)** technology, its signal meter measures how **clear** the signal is, relative to the specific settings your mesh is using. + +--- + +## 1. The Two Metrics: "Loudness" vs. "Clarity" + +Every time the LoRa radio chip receives a message, it reports two measurements: + +- **RSSI (Received Signal Strength Indicator):** The **loudness** of the raw power hitting your antenna. +- **SNR (Signal-to-Noise Ratio):** The **clarity** of the signal compared to the background static. + +> **Tip — The Analogy:** Imagine you are trying to hear a friend talking to you. +> +> - **RSSI** is how loud their voice is. +> - **The Noise Floor** is the background noise in the room (air conditioning, other people talking, traffic). +> - **SNR** is how easily you can distinguish your friend's voice from the background noise. + +If your friend shouts at you at a deafening rock concert, the signal is incredibly loud (High RSSI), but you still can't understand them because the background noise is louder (Bad SNR). Conversely, if your friend whispers to you in a dead-silent library, the signal is very weak (Low RSSI), but you can understand them perfectly (Great SNR). + +--- + +## 2. The Magic of LoRa: Hearing "Below the Noise Floor" + +For standard radios (like FM or Wi-Fi), if the background noise is louder than the signal (a negative SNR), the receiver just hears static. + +LoRa is special. It uses **"Spread Spectrum"** modulation, which allows the radio to mathematically pull a signal out of the air even when it is buried deep _underneath_ the background noise. This is why you will frequently see **negative SNR numbers** in Meshtastic (e.g., -10 dB, which means the signal is 10 decibels weaker than the background static). + +Depending on which Meshtastic preset you are using (e.g., `LongFast` vs. `ShortFast`), the radio has a specific **SNR Limit** — the absolute maximum amount of noise it can tolerate before the message is completely lost to the static. + +--- + +## 3. How the Signal Meter Calculates Quality + +The Meshtastic apps take both RSSI and SNR and run them through a specific formula to assign your signal a quality rating (None, Bad, Fair, or Good). It specifically scales these values based on the physical limits of the radio preset you are using. + +Here is exactly how the app decides how many bars (or what color) to show you: + +| Level | Bars | Criteria | Meaning | +| ----- | ---- | ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | +| Good | 3 | RSSI better than `-115 dBm` **AND** SNR better than `-7 dB` | Signal is both loud and clear — healthy connection. | +| Fair | 2 | RSSI better than `-126 dBm` with good SNR, **OR** SNR better than `-15 dB` with good RSSI | Signal getting quieter or noisier, but still decodable. | +| Bad | 1 | Falls between Fair and None thresholds | At the edge of range or experiencing interference. | +| None | 0 | RSSI worse than `-126 dBm` **AND** SNR worse than `-15 dB` | Transmission completely buried in noise. | + +--- + +## 4. What This Means for You + +Because Meshtastic's meter acts as a **"Clarity Meter"**, it behaves differently than what most people expect: + +> **Tip — Don't panic over low RSSI:** You might see a seemingly terrible RSSI value like `-118 dBm`. On a cell phone, you would have zero bars. But if you have an SNR of `+2 dB`, Meshtastic will still show a strong signal! _The library is quiet, so the whisper is heard perfectly._ + +> **Warning — Watch out for local noise:** If you hook up a massive antenna and see a great RSSI (e.g., `-90 dBm`) but your signal meter is only showing **1 Bar (Bad)**, you have a problem. It means you have local interference — perhaps a cheap power supply, a noisy computer, or a nearby radio tower — creating so much static that it is drowning out your mesh. + +## Where Signal Information Appears + +In the app, signal data is shown in several places: + +- **Node list** — signal bars icon next to each node +- **Node detail** — SNR, RSSI, and signal quality in the device metrics section +- **Traceroute** — per-hop signal quality for each relay node +- **Signal metrics** — historical SNR and RSSI data in the metrics charts + +![Node entry showing SNR, RSSI values and colored signal bars](/assets/screenshots/nodes_signal_info.png) + diff --git a/docs/is-rIS/user/tak.md b/docs/is-rIS/user/tak.md new file mode 100644 index 000000000..d8ab610e7 --- /dev/null +++ b/docs/is-rIS/user/tak.md @@ -0,0 +1,126 @@ +--- +title: TAK Integration +nav_order: 10 +last_updated: 2026-05-13 +description: Interoperate with ATAK and WinTAK — CoT position sharing, TAK roles, and plugin setup. +aliases: + - tak + - atak + - team-awareness-kit +--- + +# TAK Integration + +Meshtastic integrates with the Team Awareness Kit (TAK) ecosystem, enabling interoperability between Meshtastic mesh devices and TAK applications like ATAK and WinTAK. + +## Overview + +The TAK module allows Meshtastic nodes to: + +- Share position data in TAK-compatible CoT (Cursor on Target) format +- Appear as team members on TAK map displays +- Receive TAK PLI (Position Location Information) messages + +## Setup + +### Prerequisites + +- ATAK (Android Team Awareness Kit) or WinTAK installed +- Meshtastic ATAK Plugin installed +- TAK module enabled on your Meshtastic radio + +### Configuration + +1. Navigate to **Settings → Module Config → TAK**. +2. Enable the TAK module. +3. Configure the TAK team/group settings: + +![Module toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | Lýsing | +| ------- | -------------------------- | +| Enabled | Activate TAK interop | +| Mode | TAK-compatible output mode | + +### ATAK Plugin Setup + +1. Install the Meshtastic ATAK Plugin from the plugin repository. +2. Open ATAK and enable the Meshtastic plugin. +3. The plugin bridges messages between ATAK and your mesh network. + +## TAK Roles + +Nodes configured with TAK-related roles behave differently from standard clients: + +| Role | Lýsing | +| --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **TAK** | Full TAK interoperability — sends and receives CoT data, chat messages, and PLI updates. Functions as a standard client plus TAK bridge. | +| **TAK Tracker** | Position-only TAK output — automatically broadcasts PLI at regular intervals without user interaction. Optimized for unattended position beacons (vehicles, equipment, waypoints). Does not relay chat messages. | + +> 💡 **Tip:** Use **TAK Tracker** for devices that only need to report position (e.g., a radio mounted in a vehicle). Use **TAK** for devices where users actively participate in TAK operations. + +### CoT (Cursor on Target) Format + +TAK messages use the Cursor on Target XML format — a military standard for sharing situational awareness data. Meshtastic converts its internal protobuf messages to CoT format when bridging to TAK systems, so no manual format conversion is needed. + +## TAK Identity + +When using TAK roles, your node broadcasts identity information that appears on TAK maps: + +| Setting | Lýsing | +| -------- | ---------------------------------------------------------------------------------------------------------------- | +| Team | Your team color on the TAK map (e.g., Blue, Red, Cyan, Green) | +| Role | Your operational role (Team Member, Team Lead, HQ, Medic, RTO, etc.) | +| Callsign | Your TAK callsign (defaults to your Meshtastic long name) | + +These settings appear in **Settings → Module Config → TAK** when the TAK module is enabled. + +> 💡 **Tip:** Team/role colors are the standard TAK affiliation colors. Coordinate with your TAK team to use consistent team assignments. + +## Wire Format (V1 / V2) + +Meshtastic supports two TAK wire formats: + +| Format | Compatibility | Features | +| ------------------------------- | --------------------------------------------------------------- | --------------------------------------------------------- | +| V1 (Legacy) | ATAK Plugin v1.x, older firmware | Basic CoT position sharing only | +| V2 (Current) | ATAK Plugin v2.x, firmware 2.3+ | Full CoT support including chat, routes, zstd compression | + +The app automatically selects V2 when both sides support it. No manual configuration needed — the TAK module negotiates format based on firmware capabilities. + +## Usage with ATAK + +Once configured: + +- Meshtastic nodes appear as markers on the ATAK map with callsign labels +- Chat messages can bridge between mesh and TAK networks +- Position updates flow bidirectionally between Meshtastic and TAK +- TAK Tracker nodes broadcast PLI automatically — their positions appear on ATAK maps without any ATAK-side configuration + +> ⚠️ **Note:** TAK integration requires specific node roles and module configuration. Standard client nodes don't automatically participate in TAK operations. + +## Troubleshooting + +| Problem | Cause | Solution | +| -------------------------------- | ------------------------------------- | ----------------------------------------------------------------------- | +| Node doesn't appear on ATAK map | TAK module disabled or wrong role | Verify TAK module is enabled and node role is TAK or TAK Tracker | +| Position updates are stale | GPS fix lost or interval too long | Check GPS status; reduce position broadcast interval in Position Config | +| ATAK plugin shows "disconnected" | BLE connection lost or plugin crashed | Reconnect Bluetooth in Meshtastic app, then restart ATAK plugin | +| Chat messages not bridging | V1 format doesn't support chat | Ensure both nodes run firmware 2.3+ for V2 wire format | +| CoT data not flowing | Channel mismatch | All TAK nodes must be on the same channel with matching encryption | + +## Security Considerations + +- TAK data shares your position and callsign information +- Ensure your channel encryption is configured when using TAK in sensitive environments +- The TAK module respects the same channel encryption as other Meshtastic messages + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — TAK module configuration +- [Nodes](nodes) — TAK and TAK Tracker roles in the node list +- [Map & Waypoints](map-and-waypoints) — node positions on the map +- [ATAK plugin guide](https://meshtastic.org/docs/software/integrations/atak-plugin) — detailed ATAK setup on meshtastic.org + +--- + diff --git a/docs/is-rIS/user/telemetry-and-sensors.md b/docs/is-rIS/user/telemetry-and-sensors.md new file mode 100644 index 000000000..aa282a0b2 --- /dev/null +++ b/docs/is-rIS/user/telemetry-and-sensors.md @@ -0,0 +1,118 @@ +--- +title: Telemetry & Sensors +nav_order: 9 +last_updated: 2026-05-13 +description: Sensor data on the mesh — supported environment, air quality, and power sensors, plus configuration and viewing guides. +aliases: + - sensors + - environment + - weather + - power-metrics +--- + +# Telemetry & Sensors + +Meshtastic nodes can collect and share sensor data across the mesh network. + +## Overview + +Telemetry allows nodes equipped with sensors to broadcast environmental, power, and device health information. This data is visible on the node detail screen and can be logged over time. + +## Device Telemetry + +All Meshtastic nodes report basic device telemetry: + +| Metric | Lýsing | Typical Range | +| ------------------- | ------------------------------ | ------------------------------------------------------------------ | +| Battery Level | Charge percentage | 0–100% | +| Voltage | Battery voltage | 3.0–4.2V (LiPo) | +| Channel Utilization | % of airtime used locally | 0–100% | +| Air Utilization TX | % of airtime used by this node | 0–100% | +| Uptime | Seconds since last boot | Varies | + +## Environment Sensors + +Supported environmental sensors: + +### Temperature & Humidity + +| Sensor | Temperature | Humidity | Pressure | Notes | +| ------- | ----------- | -------- | -------- | ----------------------- | +| BME280 | ✓ | ✓ | ✓ | Recommended all-in-one | +| BME680 | ✓ | ✓ | ✓ | Adds gas resistance/IAQ | +| SHT31 | ✓ | ✓ | — | High accuracy | +| MCP9808 | ✓ | — | — | Precision temperature | +| LPS22 | — | — | ✓ | Pressure only | + +### Air Quality + +| Sensor | Metric | Notes | +| -------- | -------------------------------------------------- | -------------------------- | +| BME680 | Gas Resistance / IAQ | Volatile organic compounds | +| PMSA003I | PM1.0, PM2.5, PM10 | Particulate matter | +| SEN55 | PM, NOx, VOC, Temp, Humidity | Multi-sensor | + +### Light & UV + +| Sensor | Metric | +| -------- | -------------------------------------- | +| OPT3001 | Ambient light (lux) | +| VEML7700 | Ambient light (lux) | +| LTR390 | UV index | + +## Power Metrics + +Nodes with INA-series power sensors can report: + +| Metric | Lýsing | +| ----------- | ----------------------------------------- | +| Bus Voltage | Supply rail voltage | +| Current | Power consumption (mA) | +| Power | Calculated power (mW) | + +Useful for monitoring solar charging or battery health on remote nodes. + +## Configuring Telemetry + +1. Navigate to **Settings → Module Config → Telemetry**. +2. Set reporting intervals: + - **Device Metrics Interval** — how often to broadcast device metrics + - **Environment Metrics Interval** — how often to broadcast sensor data +3. Enable specific sensor types as needed. + +### Recommended Intervals + +| Use Case | Device (s) | Environment (s) | +| ------------------------------------------ | ----------------------------- | ---------------------------------- | +| Urban mesh (many nodes) | 3600 | 3600 | +| Rural mesh (few nodes) | 900 | 900 | +| Weather station | 900 | 300 | +| Battery conservation | 7200 | 7200 | + +> ⚠️ **Note:** Shorter intervals increase airtime usage and battery drain across the mesh. + +## Viewing Telemetry + +1. Navigate to **Nodes** and select a node. +2. Telemetry sections show on the detail screen: + - Device Metrics (always available) + - Environment Metrics (if sensors present) + - Power Metrics (if INA sensor present) +3. Historical graphs show trends over time. + +![Telemetry actions](/assets/screenshots/node-metrics_telemetric_actions.png) + +## Troubleshooting + +- **No environment data showing?** The remote node needs a physical sensor connected (e.g., BME280 on I2C). Device telemetry (battery, uptime) is always available, but environment metrics require hardware. +- **Stale readings?** Check the reporting interval — very long intervals (7200s+) mean data updates infrequently. Also verify the remote node is still online. +- **Sensor conflict on I2C bus?** Some sensors share I2C addresses. If you have multiple sensors on the same bus, check for address collisions in the radio's serial debug output. + +## Related Topics + +- [Node Metrics](node-metrics) — view telemetry data on the node detail screen +- [Settings — Modules & Admin](settings-module-admin) — telemetry module configuration +- [Units & Locale](units-and-locale) — temperature and pressure display units + +--- + diff --git a/docs/is-rIS/user/translate.md b/docs/is-rIS/user/translate.md new file mode 100644 index 000000000..b2ed79a34 --- /dev/null +++ b/docs/is-rIS/user/translate.md @@ -0,0 +1,97 @@ +--- +title: Translate the App +parent: User Guide +nav_order: 17 +last_updated: 2026-05-13 +aliases: + - translate + - crowdin + - localization +--- + +# Translate the App + +Contributing translations helps make Meshtastic accessible to a wider audience. The app uses [Crowdin](https://crowdin.com/) to manage community translations for both the user interface and in-app documentation. + +--- + +## What Gets Translated + +| Resource | Source Location | Notes | +| ----------------- | ------------------------------------- | ---------------------------------------------------------------------- | +| UI strings | `composeResources/values/strings.xml` | Buttons, labels, messages, and all user-visible text | +| User Guide pages | `docs/user/*.md` | In-app documentation shown in Help & Documentation | +| Fastlane metadata | `fastlane/metadata/android/en-US/` | App Store listing title, description, and changelogs | + +> **Note — Developer Guide pages are English-only.** Code-focused documentation targeting contributors is not translated. + +--- + +## How to Contribute + +1. **Visit the Crowdin project.** Open the [Meshtastic Android Crowdin project](https://crowdin.com/project/meshtastic-android) and sign in or create a free account. +2. **Choose your language.** Select an existing language or request a new one by opening a [GitHub issue](https://github.com/meshtastic/Meshtastic-Android/issues/new). +3. **Translate strings.** Crowdin shows the English source on the left and your translation on the right. Translate each string and save. +4. **Review context.** Many strings include screenshots or context comments — check these to understand where the text appears in the app. +5. **Submit.** Approved translations are automatically merged into the next release. + +> **Tip — Keep translations short.** UI strings often appear in buttons, chips, or narrow columns. If a translation is significantly longer than the English original, consider abbreviating where the meaning stays clear. + +--- + +## Adding a New Language + +If your language is not yet listed on Crowdin: + +1. Open an issue on [GitHub](https://github.com/meshtastic/Meshtastic-Android/issues/new) requesting the new locale. +2. A maintainer will add the language to Crowdin and configure `crowdin.yml`. +3. Once added, you can begin translating immediately. + +--- + +## How Translations Are Organized + +The Android app uses **Compose Multiplatform resources** for all user-visible strings: + +``` +core/resources/src/commonMain/composeResources/ +├── values/ ← English (default) +│ └── strings.xml +├── values-de/ ← German +│ └── strings.xml +├── values-fr/ ← French +│ └── strings.xml +└── ... +``` + +In-app documentation follows a similar pattern under `docs/`: + +``` +docs/ +├── user/ ← English source (default) +│ ├── onboarding.md +│ └── ... +├── fr/user/ ← French translations +│ ├── onboarding.md +│ └── ... +└── ... +``` + +The app automatically selects the correct locale based on your device's **Language & Region** settings. + +--- + +## Translation Guidelines + +- **Do not translate** technical terms like "LoRa", "MQTT", "BLE", "TAK", "SNR", or "RSSI" — these are universal. +- **Keep placeholders intact.** Strings like `%1$s` or `%d` are filled in at runtime. Do not remove or reorder them unless the grammar of your language requires it. +- **Match tone.** The app uses a friendly, direct voice. Avoid overly formal language. +- **Test if possible.** Switch your device language and open the app to see how translations look in context. + +--- + +## Questions? + +If you have questions about a specific string's context or need help getting started, open a discussion on the [Meshtastic GitHub Discussions](https://github.com/meshtastic/Meshtastic-Android/discussions) page. + +Thank you for helping expand the reach of Meshtastic! diff --git a/docs/is-rIS/user/units-and-locale.md b/docs/is-rIS/user/units-and-locale.md new file mode 100644 index 000000000..5f391111d --- /dev/null +++ b/docs/is-rIS/user/units-and-locale.md @@ -0,0 +1,118 @@ +--- +title: Units, Measurement & Locale +parent: User Guide +nav_order: 16 +last_updated: 2026-05-12 +--- + +# Units, Measurement & Locale + +The Meshtastic app automatically displays temperatures, distances, speeds, and times in the units your device is configured to use — no settings to change inside the app. + +--- + +## How It Works + +Meshtastic radios always transmit data in **metric units** (meters, °C, km/h, hPa, etc.). When the app receives this data, it uses the `MetricFormatter` utility to convert and display values in whatever unit system your device's locale specifies. + +On Android, your measurement preferences are determined by your system **Language & Region** settings. On Desktop (JVM), the app uses the JVM's default `Locale`. + +> **Tip — You never need to toggle units inside the app.** Change your system measurement preferences and every screen in Meshtastic updates automatically — node details, telemetry charts, weather, altitude, and more. + +--- + +## Temperature + +Temperature values from environment sensors are transmitted as **°C** and displayed based on your device's temperature unit preference. + +![Environment metrics with temperature](/assets/screenshots/nodes_environment_metrics.png) + +| Your Setting | You See | +| ------------ | ------- | +| Celsius | 22°C | +| Fahrenheit | 72°F | + +This affects all temperature displays throughout the app: node environment telemetry, soil temperature, dew point, and telemetry chart axes. + +## Distance & Altitude + +Distances between nodes and GPS altitudes are transmitted as **meters** and automatically scaled and converted. + +![Distance info display](/assets/screenshots/nodes_distance_info.png) + +| Your Setting | Small Distance | Large Distance | Altitude | +| -------------------------------- | -------------- | ---------------------- | -------- | +| Metric | 350 m | 2.5 km | 1,200 m | +| Imperial (US) | 1,148 ft | 1.6 mi | 3,937 ft | + +The app uses natural scaling — short distances stay in meters or feet, while longer distances switch to kilometres or miles automatically. + +### Where these appear + +- **Node list** — distance and bearing to each node +- **Node detail** — altitude, distance from your position +- **Map** — waypoint distances, traceroute hop distances +- **Compass** — distance to selected node + +## Speed + +GPS ground speed is displayed in your locale's preferred speed unit. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Metric | 12 km/h | +| Imperial (US) | 7 mph | + +## Wind + +Wind speed and gust data from environment sensors are transmitted as **m/s** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Metric | 5 m/s | +| Imperial (US) | 11 mph | + +Wind readings appear in the **Node Detail** environment section and the **Environment Telemetry** charts. + +## Rainfall + +Rainfall measurements (1-hour and 24-hour totals) are transmitted as **mm** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ---------------------- | +| Metric | 12 mm | +| Imperial (US) | 0.5 in | + +## Units That Never Change + +Some units are international standards and are displayed the same way regardless of your locale: + +| Measurement | Unit | Why | +| -------------------------------- | ------------------------------ | ------------------------------------- | +| Barometric pressure | hPa | International meteorological standard | +| Heading / bearing | ° (degrees) | Universal navigation convention | +| Radiation | μR/hr | Standard dosimetry unit | +| GPS coordinates | decimal degrees | Universal geographic standard | +| Humidity, battery, soil moisture | % | Universal | + +## Date & Time + +All timestamps throughout the app — last heard, message times, telemetry logs, chart axes — follow your device's date and time preferences. + +| Setting | What It Controls | Example | +| ---------------- | ---------------- | ------------------------------------------------ | +| **24-Hour Time** | Clock format | 14:30 vs 2:30 PM | +| **Date Format** | Date ordering | 09/05/2026 vs 05/09/2026 | + +The app also uses **relative time** where it makes sense — for example, "5 min ago" or "2 hours ago" in the node list — which is automatically localised into your device language. + +## Changing Your Measurement System (Android) + +On Android, your measurement system (metric vs imperial) is tied to your region setting: + +1. Open **Android Settings → System → Language & Region** +2. Change your **Region** or **Measurement units** preference +3. Return to Meshtastic — values update immediately + +> **Tip — The app uses `MetricFormatter` from `core:common`.** All measurement formatting is handled by a shared KMP utility that respects your platform's locale. Developers adding new measurement displays should use `MetricFormatter` rather than hard-coding unit conversions. + diff --git a/docs/it-rIT/index.md b/docs/it-rIT/index.md new file mode 100644 index 000000000..115b4df73 --- /dev/null +++ b/docs/it-rIT/index.md @@ -0,0 +1,30 @@ +--- +title: Home +layout: default +nav_order: 0 +--- + +# Meshtastic Android App Documentation + +User and developer documentation for the Meshtastic Android, Desktop, and iOS applications powered by KMP (Kotlin Multiplatform). + +Use the sidebar navigation to browse the **User Guide** for app features and the **Developer Guide** for contributing to the project. + +--- + +## Quick Links + +| Guide | Descrizione | +| --------------------------------------------------------------------- | -------------------------------------------------------------- | +| [Getting Started](user/onboarding) | Connect your first radio and send a message | +| [Messages & Channels](user/messages-and-channels) | Channel broadcasts, direct messages, reactions, and encryption | +| [Nodes](user/nodes) | Understanding the mesh network node list | +| [Signal Meter](user/signal-meter) | How the LoRa signal quality meter works | +| [Units & Locale](user/units-and-locale) | How temperatures, distances, and times adapt to your region | +| [Desktop App](user/desktop) | Linux, macOS, and Windows desktop usage | +| [Architecture](developer/architecture) | App architecture overview for contributors | +| [Contributing](developer/contributing) | Branch naming, PR workflow, and verification commands | + +--- + +> This documentation is served from the same markdown source that powers the in-app **Help & Documentation** browser. diff --git a/docs/it-rIT/user/connections.md b/docs/it-rIT/user/connections.md new file mode 100644 index 000000000..e878e2f53 --- /dev/null +++ b/docs/it-rIT/user/connections.md @@ -0,0 +1,125 @@ +--- +title: Connessioni +nav_order: 2 +last_updated: 2026-05-13 +description: Connect your phone or desktop to a Meshtastic radio via Bluetooth, USB, or TCP/IP. +aliases: + - bluetooth + - usb + - tcp + - pairing +--- + +# Connessioni + +Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node. + +## Bluetooth (BLE) + +Bluetooth Low Energy is the default and most common connection method on Android. + +### Pairing a Device + +1. Ensure your Meshtastic radio is powered on and in pairing mode. +2. Open the app and navigate to **Connections**. +3. Tap **Scan for Devices** — nearby Meshtastic radios will appear. +4. Select your device from the list. +5. Accept the Bluetooth pairing prompt if shown. + +![Device list item](/assets/screenshots/connections_bluetooth_scan.png) + +You can filter devices by transport type using the filter chips at the top: + +![Transport filter chips](/assets/screenshots/connections_transport_filters.png) + +> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. + +### Connection Status + +| Icon | State | Descrizione | +| ---- | -------------------- | ------------------------------ | +| 🟢 | Connesso | Active radio link established | +| 🟡 | Connessione in corso | Handshake in progress | +| 🔴 | Disconnesso | No active connection | +| ⚪ | Not configured | Nessun dispositivo selezionato | + +When connecting, a status indicator shows the current connection state: + +![Connecting status](/assets/screenshots/connections_connecting.png) + +If no devices are found, the app shows an empty state with instructions: + +![No devices found](/assets/screenshots/connections_empty_state.png) + +### Troubleshooting Bluetooth + +- **Device not found:** Toggle Bluetooth off/on, ensure location is enabled. +- **Connection drops:** Move closer to the radio; check for interference. +- **Pairing rejected:** Forget the device in Android Bluetooth settings and retry. + +## USB Serial + +USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable. + +### Configurazione + +1. Connect your radio via USB cable to your device. +2. The app will prompt for USB permission — tap **Allow**. +3. The connection is established automatically. + +> ⚠️ **Note:** USB connections require OTG support on Android devices. + +## TCP/IP (WiFi) + +Some Meshtastic radios support WiFi connectivity, allowing TCP-based connections. + +### Configurazione + +1. Connect your radio to a WiFi network via the radio's web interface or settings. +2. In the app, go to **Connections → TCP**. +3. Enter the radio's IP address and port (default: 4403). +4. Tap **Connect**. + +![WiFi scanning for devices](/assets/screenshots/connections_wifi_scanning.png) + +When a device is found, it appears in the connection list: + +![WiFi device found](/assets/screenshots/connections_wifi_device_found.png) + +A successful connection is confirmed with a status indicator: + +![WiFi connection success](/assets/screenshots/connections_wifi_success.png) + +### When to Use TCP + +- Radio is on the same local network +- Testing with a simulated radio +- Environments where Bluetooth has interference issues + +## Reconnection Behavior + +The app reconnects to the **last selected device** on startup. You can manually switch transports from the connections screen at any time. + +To disconnect from a radio, use the disconnect button on the connections screen: + +![Disconnect from radio](/assets/screenshots/connections_disconnect.png) + +## Desktop Connections + +On Desktop (Linux/macOS/Windows), the app supports: + +- **Bluetooth (BLE)** — via the Kable library; works on macOS, Linux, and Windows +- **USB Serial** — primary wired connection method +- **TCP/IP** — for network-connected radios + +See [Desktop App](desktop) for platform-specific details and keyboard shortcuts. + +## Related Topics + +- [Getting Started](onboarding) — first-launch setup and permissions +- [Settings — Radio & User](settings-radio-user) — Bluetooth and network configuration +- [Desktop App](desktop) — desktop-specific connection details +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — full list of compatible radios on meshtastic.org + +--- + diff --git a/docs/it-rIT/user/desktop.md b/docs/it-rIT/user/desktop.md new file mode 100644 index 000000000..f7acbd500 --- /dev/null +++ b/docs/it-rIT/user/desktop.md @@ -0,0 +1,147 @@ +--- +title: Desktop App +nav_order: 14 +last_updated: 2026-05-13 +description: Install and use the Meshtastic Desktop app on Linux, macOS, and Windows — connections, feature parity, and keyboard shortcuts. +aliases: + - desktop + - linux + - macos + - windows + - jvm +--- + +# Desktop App + +The Meshtastic Desktop application provides the same mesh communication features on Linux, macOS, and Windows. + +## Panoramica + +The Desktop app shares its core codebase with the Android app through Kotlin Multiplatform (KMP). Most features work identically across platforms. + +## Installazione + +### Linux + +- Download the `.deb` or `.AppImage` package from the releases page +- Or build from source using `./gradlew :desktopApp:run` + +### macOS + +- Download the `.dmg` package from releases +- Or build from source + +### Windows + +- Download the `.msi` installer from releases +- Or build from source + +## Connecting Your Radio + +### USB Serial (Primary) + +The most reliable connection method on Desktop: + +1. Connect your Meshtastic radio via USB cable. +2. The app should detect the serial port automatically. +3. If not detected, select the correct serial port from the connections menu. + +### TCP/IP + +For network-connected radios: + +1. Enter the radio's IP address and port (default: 4403). +2. Click **Connect**. + +### Bluetooth (BLE) + +Bluetooth Low Energy is supported on Desktop via the [Kable](https://github.com/JuulLabs/kable) library: + +1. Ensure your system has a Bluetooth adapter. +2. The app scans for nearby Meshtastic radios automatically. +3. Select your device from the connections screen. + +## Feature Parity + +| Feature | Android | Desktop | Note | +| ---------------------------------------- | ------- | ------- | -------------------------- | +| Messaging | ✓ | ✓ | Full parity | +| Node List | ✓ | ✓ | Full parity | +| Mappa | ✓ | ✓ | Full parity | +| Impostazioni | ✓ | ✓ | Full parity | +| Bluetooth (BLE) | ✓ | ✓ | Via Kable on desktop | +| Firmware Update OTA | ✓ | ✗ | Use web flasher | +| Notifications | ✓ | ✓ | Native OS notifications | +| Widgets | ✓ | ✗ | Android-only | +| AI Assistant (Chirpy) | ✓\* | ✗ | Google flavor Android only | + +\*Chirpy AI requires Android 14+ on Google flavor builds with supported hardware. + +## UI Differences + +The Desktop app uses the same Compose Multiplatform UI with adaptations for larger screens and desktop interaction. + +### Keyboard Shortcuts + +| Shortcut | Action | +| ------------------- | --------------------------- | +| **⌘Q** / **Ctrl+Q** | Quit the application | +| **⌘,** / **Ctrl+,** | Open Settings | +| **⌘1** / **Ctrl+1** | Switch to Conversations tab | +| **⌘2** / **Ctrl+2** | Switch to Nodes tab | +| **⌘3** / **Ctrl+3** | Switch to Map tab | +| **⌘4** / **Ctrl+4** | Switch to Connections tab | + +### Window & System Tray + +- **Window resizing** — responsive layout adapts to window dimensions +- **System tray** — minimize to system tray for background mesh operation +- **Tray menu** — right-click the tray icon to show window or quit +- **Mouse interaction** — hover states and standard desktop navigation + +### Notification Preferences + +The Desktop app provides in-app toggles for controlling which notifications are shown — messages, new nodes, and low battery alerts. Access these from **Settings → Notifications** within the app. + +## Built-in Documentation Browser + +The Desktop app includes a built-in documentation browser for quick access to help content without leaving the application. + +![Docs browser with table of contents](/assets/screenshots/docs-browser_toc.png) + +The browser supports full-text search across all documentation: + +![Searching the docs browser](/assets/screenshots/docs-browser_search.png) + +Individual doc pages render with full formatting: + +![A documentation page](/assets/screenshots/docs-browser_page.png) + +## Building from Source + +```bash +git clone https://github.com/meshtastic/Meshtastic-Android.git +cd Meshtastic-Android +git submodule update --init +./gradlew :desktopApp:run +``` + +Requisiti: + +- JDK 21 +- No Android SDK required for desktop-only builds + +## Limitazioni conosciute + +- No OTA firmware updates (use web flasher) +- Some Android-specific features (widgets, specific notification channels) are unavailable +- Performance may vary on low-spec hardware running Compose Desktop +- BLE bonding is not yet supported on desktop (pairing works without bonding) + +## Related Topics + +- [Connections](connections) — connection methods overview +- [Firmware Updates](firmware) — use the [Web Flasher](https://flasher.meshtastic.org) for desktop firmware updates + +--- + diff --git a/docs/it-rIT/user/discovery.md b/docs/it-rIT/user/discovery.md new file mode 100644 index 000000000..a143d0240 --- /dev/null +++ b/docs/it-rIT/user/discovery.md @@ -0,0 +1,114 @@ +--- +title: Discovery +nav_order: 12 +last_updated: 2026-05-13 +description: Explore your mesh network — traceroute paths, neighbor maps, and node discovery tools. +aliases: + - mesh-discovery + - local-discovery + - network-scan + - traceroute + - neighbor-info +--- + +# Discovery + +Discovery tools help you understand **how** your mesh network is connected — which nodes can hear each other, what paths messages take, and where bottlenecks or weak links exist. + +> 💡 **Tip:** You don't need a dedicated "discovery mode" to start exploring your mesh. The tools below are available right now from the node list and node detail screens. + +--- + +## Traceroute + +Traceroute reveals the exact path a message takes from your node to any other node on the mesh. It's the single most useful tool for debugging connectivity problems. + +### Running a Traceroute + +1. Navigate to **Nodes** and tap the node you want to trace. +2. On the node detail screen, tap **Traceroute**. +3. The app sends a traceroute request and waits for the response. +4. Results display each hop in order, with signal quality at every step. + +### Reading the Results + +A traceroute result looks like this: + +``` +You → Node A (SNR: 8.5, RSSI: -95) → Node B (SNR: 5.2, RSSI: -108) → Target +``` + +Each hop represents a relay node that forwarded the message. The SNR and RSSI values at each hop tell you about the link quality on that specific segment. + +| What to look for | What it means | +| -------------------------------------------------------------------------- | --------------------------------------------------------------------------- | +| All hops show Good SNR (> 5 dB) | Healthy path — messages flow reliably | +| One hop shows Bad SNR (< 0 dB) | Weak link — this relay segment is fragile | +| Many hops (4+) | Long path — consider repositioning a node to shorten it | +| Different path on retry | Mesh is adapting — multiple routes exist (this is good!) | + +> 💡 **Tip:** Run traceroute several times over a few minutes. If the path changes, your mesh has redundant routes — a sign of a well-connected network. + +### Troubleshooting with Traceroute + +- **"No route found"** — The target node may be offline, out of range, or on a different channel. Check that both nodes share at least one channel with the same encryption key. +- **Traceroute times out** — The path may be too long (exceeds hop limit) or a relay node is congested. Try increasing the hop limit in **Settings → LoRa Config**. +- **Asymmetric paths** — A traceroute from A→B may take a different path than B→A. This is normal — radio propagation is not always symmetric. + +--- + +## Informazioni Vicinato + +The Neighbor Info module lets each node broadcast a list of the nodes it can **directly hear** (single-hop). When multiple nodes share their neighbor lists, you can piece together a topology map of the entire mesh. + +### Enabling Neighbor Info + +1. Navigate to **Settings → Module Config → Neighbor Info**. +2. Enable the module. +3. Set the broadcast interval (default: 900 seconds / 15 minutes). + +Once enabled, your node periodically broadcasts its neighbor table. Other nodes with Neighbor Info enabled do the same. + +### Viewing Neighbor Data + +- Open any node's detail screen and look for the **Neighbors** section. +- Each neighbor entry shows the node that was directly heard and its signal quality. +- Combine neighbor data from multiple nodes to understand the full mesh topology. + +> ⚠️ **Note:** Neighbor Info increases airtime usage because every enabled node periodically broadcasts its neighbor list. On busy meshes with many nodes, consider longer broadcast intervals (3600 seconds or more) to avoid congestion. + +--- + +## Node List as a Discovery Tool + +The node list itself is a powerful discovery tool when you use its filtering and sorting features effectively. + +### Finding New Nodes + +- Sort by **Last heard** to see the most recently active nodes at the top. +- Enable **Include unknown** to see nodes that have appeared on the mesh but haven't sent user info yet — these are often newly powered-on devices. + +### Assessing Connectivity + +- Sort by **Hops away** to see which nodes are directly reachable (0 hops) versus relayed. +- Sort by **Distance** to find nearby nodes and verify they're reachable. +- Use **Exclude MQTT** to focus on nodes reachable over radio (not via internet bridge). + +### Infrastructure Audit + +- Disable **Exclude infrastructure** to see Router, Repeater, Router Late, and Client Base nodes. +- Check their signal quality and last-heard times to verify your infrastructure nodes are healthy. + +See [Nodes](nodes) for full details on filtering and sorting options. + +--- + +## Tips for Mesh Exploration + +- **Start with traceroute** — it gives you immediate, actionable information about a specific path. +- **Enable Neighbor Info on key nodes** — especially routers and repeaters, to build a picture of the backbone. +- **Check the map** — node positions on the [Map](map-and-waypoints) combined with signal data help you understand why some links are strong and others are weak. +- **Compare signal over time** — use the [Signal Meter](signal-meter) guide to interpret SNR and RSSI values correctly. + +--- + diff --git a/docs/it-rIT/user/firmware.md b/docs/it-rIT/user/firmware.md new file mode 100644 index 000000000..63397bd21 --- /dev/null +++ b/docs/it-rIT/user/firmware.md @@ -0,0 +1,114 @@ +--- +title: Firmware Updates +nav_order: 13 +last_updated: 2026-05-13 +description: Update your radio firmware over Bluetooth — OTA process, version channels, pre-flight checks, and recovery. +aliases: + - firmware + - update + - ota + - flash +--- + +# Firmware Updates + +Keep your Meshtastic radio up to date with the latest firmware for new features, bug fixes, and security improvements. + +## Checking for Updates + +1. Navigate to **Settings → Firmware Update** or tap the firmware notification if shown. +2. The app checks for available firmware versions. +3. Available updates show the version number and changelog summary. + +## Update Methods + +### OTA (Over-The-Air) via Bluetooth + +The most common update method for Android users: + +1. Ensure your radio is connected via Bluetooth. +2. Navigate to the Firmware Update screen. +3. Select the desired firmware version. +4. Tap **Update** to begin the OTA process. +5. Wait for the update to complete — **do not disconnect** during the update. + +![Firmware checking for updates](/assets/screenshots/firmware_checking.png) + +> ⚠️ **Warning:** Interrupting a firmware update can brick your device. Ensure your radio has sufficient battery (>50% recommended) and maintain Bluetooth proximity during the entire process. + +![Firmware disclaimer](/assets/screenshots/firmware_disclaimer.png) + +### USB Flashing + +For recovery or when OTA is unavailable: + +- Use the [Meshtastic Web Flasher](https://flasher.meshtastic.org) +- Or the [Meshtastic CLI tool](https://meshtastic.org/docs/getting-started/flashing-firmware) on desktop + +## Version Channels + +| Canale | Descrizione | +| ------- | ------------------------------------------- | +| Stabile | Recommended for most users; tested releases | +| Alfa | Preview releases; may contain bugs | + +## Pre-Update Checklist + +Before updating: + +- [ ] Battery > 50% +- [ ] Stable Bluetooth connection +- [ ] Note your current settings (they may reset on major version changes) +- [ ] Check the release notes for breaking changes + +## Post-Update + +After a successful update: + +- The radio will reboot automatically +- Bluetooth connection will re-establish +- Verify your settings are intact +- Check the firmware version in **Settings → About** + +![Firmware update success](/assets/screenshots/firmware_success.png) + +## Risoluzione problemi + +### Update Stuck + +If the update appears frozen: + +- Wait at least 5 minutes before intervening +- If truly stuck, power-cycle the radio +- Attempt the update again + +![Firmware update error](/assets/screenshots/firmware_error.png) + +### Device Won't Boot After Update + +If your device fails to boot: + +1. Try connecting via USB to a computer +2. Use the web flasher in recovery/DFU mode +3. Flash a known-good firmware version +4. Check the Meshtastic Discord for device-specific recovery steps + +### Compatibility Warnings + +The app may show warnings when: + +- Connected radio firmware is below minimum supported version +- Major version mismatch between app and firmware +- Deprecated features need migration + +> ⚠️ **Important:** Always update the Meshtastic app before or alongside firmware updates to ensure compatibility. + +## Related Topics + +- [Connections](connections) — reconnecting after a firmware update +- [Flashing firmware guide](https://meshtastic.org/docs/getting-started/flashing-firmware) — full firmware flashing walkthrough on meshtastic.org +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — check firmware compatibility by device +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/it-rIT/user/map-and-waypoints.md b/docs/it-rIT/user/map-and-waypoints.md new file mode 100644 index 000000000..67a62d73d --- /dev/null +++ b/docs/it-rIT/user/map-and-waypoints.md @@ -0,0 +1,116 @@ +--- +title: Map & Waypoints +nav_order: 6 +last_updated: 2026-05-13 +description: View node positions on the map, create and share waypoints, and manage position sharing and privacy. +aliases: + - map + - waypoints + - gps + - location +--- + +# Map & Waypoints + +The Map screen shows the geographic positions of nodes on your mesh, along with shared waypoints. + +## Map View + +The map displays: + +- **Node positions** — colored markers for each node reporting location +- **Waypoints** — shared points of interest +- **Your position** — your current GPS location + +### Node Markers + +Node markers on the map indicate: + +| Color | Meaning | +| ------ | ---------------------------------------------- | +| Verde | Online (heard recently) | +| Yellow | Away (heard within 2 hours) | +| Gray | Offline (stale position) | +| Blu | Your own node | + +### Map Controls + +- **Zoom** — pinch or use +/- buttons +- **Pan** — drag to explore +- **Center** — select the location button to center on your position +- **Node tap** — tap a node marker to view details + +The floating toolbar provides quick access to compass, layer switching, node filters, refresh, and location tracking. Tap the compass to reorient north-up, or tap the location button to center on your current position. + +![Map controls overlay](/assets/screenshots/map_controls_overlay.png) + +## Waypoints + +Waypoints are shared geographic points of interest that all mesh members can see. + +### Creating a Waypoint + +1. Long-press on the map at the desired location. +2. Enter a name and optional description. +3. Choose an icon/emoji for the waypoint. +4. Tap **Send** to share with the mesh. + +### Waypoint Properties + +| Property | Descrizione | +| ----------- | ------------------------------------------------------- | +| Nome | Short identifier (max 30 characters) | +| Descrizione | Optional longer description | +| Icon | Visual marker emoji on the map | +| Bloccato | If locked, only the creator can edit or delete | +| Expiration | Optional auto-remove time | + +### Waypoint Expiration + +Waypoints can be set to expire automatically: + +- **Never** (default) — waypoint remains until manually deleted +- **Timed** — waypoint is automatically removed after the specified duration (e.g., "remove after 2 hours"). Useful for temporary markers like rally points, hazards, or meeting locations. + +Expired waypoints are automatically hidden from the map so they don't clutter the display. The expiration countdown begins when the waypoint is created, not when other nodes receive it. + +### Managing Waypoints + +- Tap a waypoint on the map to view its details and coordinates +- Edit or delete waypoints you created +- **Locked waypoints** cannot be modified or deleted by other nodes — only the original creator can change them +- Unlocked waypoints can be edited by any mesh member + +## Position Sharing + +### Enabling Position Sharing + +Your node shares its GPS position based on: + +- **Fixed interval** — broadcast position at regular intervals +- **Smart position** — broadcast when movement exceeds a threshold +- **Manual** — only share when explicitly requested + +Configure position behavior in **Settings → Position**. + +### Privacy Considerations + +> 🔒 **Privacy:** Position data is broadcast to all nodes on your channel. If you don't want your location shared, disable GPS position in settings or use a fixed/fake position. + +## Map Sources + +The app supports multiple map tile sources: + +- OpenStreetMap (default) +- Satellite imagery (where available) +- Offline tiles (download map areas for offline use) + +## Related Topics + +- [Nodes](nodes) — view and filter your node list +- [Node Metrics](node-metrics) — signal quality and position history for individual nodes +- [Discovery](discovery) — traceroute and neighbor info for understanding mesh topology +- [Units & Locale](units-and-locale) — distance and coordinate display formats + +--- + diff --git a/docs/it-rIT/user/messages-and-channels.md b/docs/it-rIT/user/messages-and-channels.md new file mode 100644 index 000000000..843dff083 --- /dev/null +++ b/docs/it-rIT/user/messages-and-channels.md @@ -0,0 +1,159 @@ +--- +title: Messages & Channels +nav_order: 3 +last_updated: 2026-05-13 +description: Send and receive messages, manage channels, configure encryption, and use quick chat, reactions, and message actions. +aliases: + - channels + - direct-messages + - messaging + - conversations +--- + +# Messages & Channels + +Meshtastic supports two communication modes: **channel broadcasts** and **direct messages**. + +## Canali + +Channels are shared communication groups. All nodes configured with the same channel key can read and send messages on that channel. + +### Default Channel + +Every Meshtastic device comes with a default **LongFast** channel. This is an unencrypted channel used for general mesh communication. + +### Sicurezza del canale + +Channels support multiple encryption levels: + +| Icon | Security Level | Descrizione | +| ---- | ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------- | +| 🔒 | PSK (256-bit AES) | Fully encrypted with a strong pre-shared key. Only nodes with the matching key can read messages. | +| 🔐 | PSK (128-bit AES) | Encrypted with a shorter key. Secure for most uses but 256-bit is preferred for sensitive data. | +| 🔓 | Default / Open | Uses the well-known default key. **Any Meshtastic device** on the same preset can read these messages. | +| ⚠️ | Insecure + Position | Open channel that also broadcasts your GPS position. Use with caution in public meshes. | + +> 🔒 **Security Tip:** 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. + +### Adding a Channel + +1. Navigate to **Settings → Channels**. +2. Tap **Add Channel** or scan a QR code. +3. Configure the channel name and encryption key. +4. Share the channel URL/QR code with others who need access. + +Tapping a channel shows its details and sharing options. + +## Messaggi Diretti + +Direct messages (DMs) are point-to-point encrypted communications between two specific nodes. + +### Sending a Direct Message + +1. Open the **Messages** tab. +2. Select a node from your contacts list or tap a node in the node list. +3. Type your message and tap **Send**. + +### Message States + +| State | Icon | Meaning | +| --------------------------------- | ---- | ----------------------------------------------------------------------------------------------------------------- | +| Queued | ⏳ | Message waiting to be sent | +| En route | ✓ | Delivered to the radio, awaiting acknowledgment | +| Consegnato | ✓✓ | Acknowledgment received from recipient | +| Received | ✓ | Message received from the mesh (incoming) | +| S&F Routing | 🔗 | Store & Forward: message being routed through an S&F node | +| S&F Confirmed | 🔗 | Store & Forward: delivery confirmed via S&F node | +| Errori | ✗ | Delivery failed after retries | + +### Delivery Errors + +When a message fails to deliver, the error indicator shows what went wrong: + +| Errori | Meaning | What to Do | +| -------------------- | ---------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| No Route | No path exists to the destination node | The recipient may be offline or out of mesh range. Try later or move closer. | +| Got NAK | The next-hop node refused to relay | The relay node may be congested. Wait and retry. | +| Timeout | No acknowledgment within retry window | The recipient may be just out of range. Try increasing hop limit or moving to a better position. | +| Nessuna Interfaccia | No radio interface available to send | Check that your radio is connected and the channel is configured. | +| Max Retransmit | All retry attempts exhausted | The mesh path is unreliable. Try a different channel or wait for conditions to improve. | +| Nessun Canale | The destination channel doesn't exist | Verify both nodes share the same channel configuration. | +| Too Large | Message exceeds maximum payload size | Shorten your message (max ~230 characters). | +| No Response | Node received message but didn't respond | The recipient's radio may be busy or in low-power sleep mode. | +| Duty Cycle Limit | Regional airtime limit reached | Your radio has used its allowed transmit time. Wait for the duty cycle window to reset (typically 1 hour in EU regions). | +| Richiesta Non Valida | Malformed or invalid message | This usually indicates a software bug. Try restarting the app. | + +> 💡 **Tip:** 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. + +## Message Features + +### Quick Chat + +Pre-configured messages for rapid communication: + +- Access via the Quick Chat button in the message input area +- Choose from built-in phrases or custom messages +- Customize quick chat messages in **Settings → Quick Chat** +- Useful when typing is impractical (gloves, small screen, urgent) + +![Quick chat option](/assets/screenshots/messages_quick_chat.png) + +The channel list shows each channel with its latest message preview. + +### Message Bubbles + +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. + +### Reactions + +React to messages with emoji: + +- **Long-press** a message to open the actions menu +- Tap **Add Reaction** to choose an emoji +- Reactions appear below the message bubble +- Multiple users can react to the same message +- React to your own messages or others' messages + +![Emoji reaction badges displayed beneath a message](/assets/screenshots/messages_reaction.png) + +> 💡 **Tip:** Reactions are lightweight — they use minimal mesh bandwidth compared to full text messages. + +### Message Actions + +Long-press any message to access: + +- **Copy** — copy message text to clipboard +- **Reply** — quote the message in your response +- **React** — add an emoji reaction +- **Delete** — remove a message you sent (local deletion) + +### Message Priority + +Messages are queued and transmitted based on priority: + +1. Emergency/alert messages (highest) +2. Direct messages +3. Channel broadcasts (lowest) + +### Message Limits + +- **Maximum length:** 237 bytes (approximately 230 characters for ASCII text) +- **Rate limiting:** The mesh enforces airtime fairness; heavy message volume may be throttled +- **Delivery:** Messages are retried automatically if no acknowledgment is received + +## Buone pratiche + +- Use channels for group coordination +- Use direct messages for private person-to-person communication +- Keep messages short — mesh bandwidth is limited +- Configure encryption for sensitive communications + +## Related Topics + +- [Nodes](nodes) — tap a node to start a direct message +- [Settings — Radio & User](settings-radio-user) — configure channel encryption and presets +- [MQTT](mqtt) — bridge channel messages to the internet +- [Channel configuration](https://meshtastic.org/docs/configuration/radio/channels) — detailed channel settings on meshtastic.org + +--- + diff --git a/docs/it-rIT/user/mqtt.md b/docs/it-rIT/user/mqtt.md new file mode 100644 index 000000000..cd3dfa599 --- /dev/null +++ b/docs/it-rIT/user/mqtt.md @@ -0,0 +1,137 @@ +--- +title: MQTT +nav_order: 11 +last_updated: 2026-05-13 +description: Bridge your mesh to the internet — MQTT broker setup, encryption layers, and map reporting. +aliases: + - mqtt + - internet-bridge + - broker +--- + +# MQTT + +MQTT bridges your Meshtastic mesh network to the internet, enabling long-range communication beyond radio range. + +## Panoramica + +The MQTT module connects your node to an MQTT broker, allowing: + +- Messages to reach nodes on different physical meshes via the internet +- Integration with home automation and monitoring systems +- Publishing node positions to the public Meshtastic map +- Custom data pipelines for logging and alerting + +## Come funziona + +``` +[Your Node] → Radio → [Gateway Node with WiFi] → MQTT Broker → [Remote Gateway] → Radio → [Remote Node] +``` + +A gateway node with internet access (WiFi or Ethernet) publishes mesh messages to an MQTT topic. Remote gateways subscribed to the same topic inject those messages into their local mesh. + +## Configurazione + +### Enabling MQTT + +1. Navigate to **Settings → Module Config → MQTT**. +2. Enable the MQTT module. +3. Configure the broker connection: + +![MQTT toggle switch](/assets/screenshots/settings_switch.png) + +| Impostazione | Descrizione | Predefinito | +| ---------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------- | +| Indirizzo Server | MQTT broker hostname | mqtt.meshtastic.org | +| Username | Broker authentication | meshdev | +| Password | Broker authentication | large4cats | +| Root topic | Base topic for messages | msh | +| Cifratura | Encrypt MQTT payload | Abilitato | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON packet support has been removed from firmware; this field is ignored | Disabled | +| TLS | Secure connection to broker | Disabled | +| Map Reporting | Report position to public map | Disabled | + +### Default Meshtastic Broker + +The community maintains a public broker at `mqtt.meshtastic.org`. This is intended for general use and testing. + +> 🔒 **Privacy:** Messages on the public broker are readable by anyone subscribed. Always use channel encryption for private communications. + +### Private Broker + +For better privacy and control, you can run your own MQTT broker: + +- Mosquitto (lightweight, open-source) +- HiveMQ +- EMQX + +Configure your node to point to your private broker with appropriate credentials. + +## Map Reporting + +When Map Reporting is enabled, your node publishes its position to the Meshtastic community map: + +- Visible at [meshmap.net](https://meshmap.net) and similar community map services +- Only position and node info are shared +- Disable this if you don't want your location publicly visible + +## Uplink vs Downlink + +| Direction | Descrizione | +| ------------ | -------------------------------- | +| **Uplink** | Messages from mesh → MQTT broker | +| **Downlink** | Messages from MQTT broker → mesh | + +Configure per-channel which directions are active to control message flow and airtime usage. + +## Message Formats + +MQTT uses protobuf message format: + +| Format | Descrizione | Use case | +| ------------ | ----------------------------------- | -------------------------- | +| **Protobuf** | Binary Meshtastic protobuf encoding | Node-to-node mesh bridging | + +> ⚠️ **Note:** JSON output support was removed from firmware. The `json_enabled` setting is still visible in the app for legacy compatibility but has no effect on current firmware versions. + +## Encryption & Privacy + +Understanding the layered encryption model: + +1. **Channel encryption** happens on the mesh _before_ MQTT. If your channel has a PSK, the MQTT payload is already encrypted — the broker and any subscribers see only the ciphertext. +2. **MQTT encryption** (the module setting) adds an additional encryption layer for transit to the broker. This protects metadata and routing information. +3. **TLS** encrypts the TCP connection to the broker itself, preventing network-level eavesdropping. + +> 🔒 **Important:** The default public channel has a well-known key. Messages on the default channel sent via MQTT are effectively **unencrypted** — anyone can decode them. Always use a custom PSK for private communications. + +## Buone pratiche + +- Use channel-level encryption (PSK) on channels that bridge to MQTT +- Don't enable MQTT on nodes without internet access (it will buffer and waste memory) +- Use a private broker for sensitive deployments +- Be mindful of airtime when downlinking messages from busy MQTT topics — every downlinked message consumes radio airtime on your local mesh +- Consider enabling uplink-only if you only need to monitor your mesh remotely without injecting messages back + +## Risoluzione problemi + +### MQTT Not Connecting + +- **Check WiFi** — the gateway node must have an active internet connection (WiFi or Ethernet). MQTT does not work over the LoRa radio link itself. +- **Verify credentials** — incorrect username or password will silently fail on most brokers. Double-check for trailing spaces. +- **Firewall** — port 1883 (MQTT) or 8883 (MQTT+TLS) must be open. Some networks block non-standard ports. +- **DNS resolution** — if using a custom broker hostname, verify the node can resolve it. Try the broker's IP address directly. + +### Messages Not Bridging + +- **Check uplink/downlink settings** — if only uplink is enabled, messages flow from mesh to MQTT but not back. Enable downlink on the receiving gateway. +- **Channel mismatch** — both gateways must share the same channel with the same PSK. A mismatch means messages are encrypted with different keys and appear as garbage. +- **Topic mismatch** — ensure both gateways use the same root topic. The default `msh` works for the public broker. + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — MQTT module configuration reference +- [Messages & Channels](messages-and-channels) — channel encryption and PSK setup +- [MQTT integration guide](https://meshtastic.org/docs/software/integrations/mqtt) — detailed MQTT documentation on meshtastic.org + +--- + diff --git a/docs/it-rIT/user/node-metrics.md b/docs/it-rIT/user/node-metrics.md new file mode 100644 index 000000000..4c5f9a5e0 --- /dev/null +++ b/docs/it-rIT/user/node-metrics.md @@ -0,0 +1,130 @@ +--- +title: Node Metrics +nav_order: 5 +last_updated: 2026-05-13 +description: Telemetry dashboards for each mesh node — device health, environment sensors, signal quality, power, traceroute, and position history. +aliases: + - metrics + - telemetry + - device-metrics + - signal +--- + +# Node Metrics + +The node detail screen provides comprehensive telemetry and metrics for each node on your mesh. + +## Metriche Dispositivo + +Basic operating information reported by each node: + +| Metrico | Descrizione | +| ----------------- | ----------------------------------- | +| Battery Level | Current battery percentage | +| Tensione | Battery voltage reading | +| Utilizzo Canale | Percentage of airtime consumed | +| Airtime | Transmission time used by this node | +| Tempo di attività | Time since last reboot | + +Device metrics are displayed as individual cards with trend sparklines showing battery level, voltage, channel utilization, airtime, and uptime over time. + +> 💡 **Tip:** Tap any metric card to expand it into a full chart with historical data points. Pinch to zoom the time axis. + +## Metriche Ambientali + +Environmental sensor data (requires compatible hardware): + +| Metrico | Sensor Examples | +| ------------------------------------ | --------------------- | +| Temperatura | BME280, BME680, SHT31 | +| Umidità | BME280, BME680, SHT31 | +| Pressione barometrica | BME280, BMP280 | +| Resistenza Ai Gas | BME680 | +| IAQ (Air Quality) | BME680 | + +Environment metrics are charted over time for easy trend analysis — temperature, humidity, and pressure each get their own line chart with the measurement unit displayed on the Y axis. + +> 💡 **Tip:** Environment metrics require a sensor connected to the remote node. Not all nodes report environmental data. See [Telemetry & Sensors](telemetry-and-sensors) for a full list of supported sensors. + +## Signal Metrics + +Radio signal quality information: + +| Metrico | Descrizione | +| ------------- | ----------------------------------------------------------------------------- | +| SNR | Signal-to-Noise Ratio (higher is better) | +| RSSI | Received Signal Strength Indicator (closer to 0 is better) | +| Conteggio Hop | Number of mesh hops for last message | + +### Signal Quality Reference + +| SNR Range | Quality | +| --------------------------------- | --------- | +| > 10 dB | Excellent | +| 0 to 10 dB | Buono | +| -10 to 0 dB | Discreto | +| < -10 dB | Poor | + +## Metriche Alimentazione + +Power management telemetry (requires INA sensor or compatible hardware): + +| Metrico | Descrizione | +| ------------- | ----------------------- | +| Bus Voltage | Supply voltage | +| Attuale | Power draw in milliamps | +| Alimentazione | Calculated wattage | + +## Traceroute + +Traceroute shows the path a message takes through the mesh: + +1. From the node detail screen, tap **Traceroute**. +2. The app sends a traceroute request to the target node. +3. Results show each hop with SNR/RSSI values. + +### Reading Traceroute Results + +``` +You → Node A (SNR: 8.5) → Node B (SNR: 5.2) → Target +``` + +Each hop represents a relay node that forwarded the message. + +## Registro Posizione + +Historical position data for nodes that share their location: + +- GPS coordinates +- Altitudine +- Speed (if moving) +- Timestamp for each position report + +## Informazioni Vicinato + +Shows which nodes a given node can directly hear, useful for understanding mesh topology. + +## Viewing Metrics + +1. Navigate to **Nodes**. +2. Tap the node you want to inspect. +3. Select the metric category from the detail tabs. + +![Node detail — local device](/assets/screenshots/nodes_detail_local.png) + +The position tab shows location data for nodes that share GPS: + +![Position inline content](/assets/screenshots/nodes_position.png) + +> ⚠️ **Note:** Metrics are only available when they have been reported by the remote node. Metrics update at intervals configured on each node's telemetry settings. + +## Related Topics + +- [Nodes](nodes) — node list, filtering, and sorting +- [Telemetry & Sensors](telemetry-and-sensors) — supported sensors and configuration +- [Signal Meter](signal-meter) — how signal quality is calculated from SNR and RSSI +- [Discovery](discovery) — traceroute details and neighbor info +- [Units & Locale](units-and-locale) — temperature, distance, and speed display formats + +--- + diff --git a/docs/it-rIT/user/nodes.md b/docs/it-rIT/user/nodes.md new file mode 100644 index 000000000..3ba02ce9c --- /dev/null +++ b/docs/it-rIT/user/nodes.md @@ -0,0 +1,152 @@ +--- +title: Nodi +nav_order: 4 +last_updated: 2026-05-13 +description: Browse, filter, and sort mesh nodes — view details, signal quality, roles, and quick actions. +aliases: + - node-list + - mesh-nodes + - peers +--- + +# Nodi + +The Nodes screen displays all devices visible on your mesh network. + +## Node List + +The node list shows every node your radio has heard, including: + +- **Node name** — user-configured long name +- **Short name** — 4-character identifier +- **Signal quality** — last heard signal strength +- **Last heard** — time since last communication +- **Distance** — estimated distance (if positions are shared) +- **Battery** — remote node battery level (if telemetry is enabled) + +### Node Status Indicators + +| Badge | Meaning | +| ---------- | ------------------------------------- | +| 🟢 Online | Node heard within the last 15 minutes | +| 🟡 Away | Node heard within the last 2 hours | +| 🔴 Offline | Node not heard for over 2 hours | +| ⭐ Favorite | Node marked as favorite by the user | + +### Node Roles + +Nodes can be configured with different roles that affect their mesh behavior: + +| Ruolo | Descrizione | +| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Client | Standard end-user device | +| Base Client | Treats favorited-node traffic as Router Late priority; all other traffic as Client | +| Client Mute | Receives but doesn't retransmit | +| Client Nascosto | Like Client Mute, plus hides from node list | +| Router | Prioritizes message forwarding; stays awake to relay | +| Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | +| ~~Router Client~~ | ⚠️ **Deprecated** (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | +| ~~Repeater~~ | ⚠️ **Deprecated** (removed in firmware 2.7.11) — no longer selectable; use Router instead | +| Tracker | Optimized for position reporting at regular intervals | +| Sensore | Optimized for telemetry reporting | +| TAK | Interoperates with TAK systems (sends/receives CoT) | +| TAK Tracker | TAK position reporting only | +| Lost & Found | Continuous position beacon for recovery | + +### Choosing a Role + +Most users should keep the default **Client** role. Consider a different role when: + +- **Router** — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don't use Router on battery-powered handheld devices. +- **Router Late** — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. +- **Client Base** — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. +- **Client Mute** — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only devices or to reduce congestion in dense areas. +- **Tracker** — An unattended device whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. +- **Sensor** — An unattended device reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. +- **TAK / TAK Tracker** — Only needed if interoperating with ATAK/WinTAK systems. See [TAK Integration](tak) for details. + +> 💡 **Tip:** The mesh works best when most nodes are **Client** or **Router**. Too many Mute nodes reduces mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. + +### Encryption Indicators + +Nodes display encryption status icons next to their name: + +| Icon | Meaning | +| ----------- | ------------------------------------------------------------------------------------------------------------------- | +| 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | +| 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | +| ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) | + +> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. + +## Quick Actions + +From the node list, you can: + +- **Tap** a node to view its detail page +- **Long-press** for quick actions: + - Send a direct message + - Visualizza sulla mappa + - Richiedi posizione + - Mark as favorite + - Traceroute + +## Filtering & Sorting + +### Text Search + +Type in the search field to filter nodes by name or short name. The filter updates in real time as you type. + +### Filter Toggles + +| Filtro | Descrizione | +| -------------------------- | ---------------------------------------------------------------------------------------------- | +| **Only online** | Show only nodes heard within the last 15 minutes | +| **Only direct** | Show only nodes with direct (non-relayed) connections | +| **Include unknown** | Show nodes that haven't sent user info yet | +| **Exclude infrastructure** | Hide infrastructure-role nodes (Router, Repeater, Router Late, Client Base) | +| **Exclude MQTT** | Hide nodes heard only via MQTT internet bridge | +| **Show ignored** | Show nodes you've previously dismissed or muted | + +### Sort Options + +| Sort | Descrizione | +| ------------------------------------------- | ------------------------------------------------------------------ | +| **Last heard** (default) | Most recently heard nodes first | +| **Alphabetical** | Sorted by node long name | +| **Distance** | Nearest nodes first (requires position sharing) | +| **Hops away** | Fewest relay hops first | +| **Channel** | Grouped by channel index | +| **Via MQTT** | Grouped by MQTT vs. radio-heard | +| **Favorites** | Favorited nodes first | + +## Node Detail + +Tapping a node opens the detail view with comprehensive information. See [Node Metrics](node-metrics) for full details on metrics and telemetry. + +![Node detail view](/assets/screenshots/nodes_node_list.png) + +The detail screen includes device info, position, and action buttons: + +![Node detail section](/assets/screenshots/nodes_detail_section.png) + +Inline status indicators show key metrics at a glance: + +| Indicator | Screenshot | +| ----------------------- | -------------------------------------------------------- | +| Signal quality | ![Signal](/assets/screenshots/nodes_signal_info.png) | +| Livello batteria | ![Battery](/assets/screenshots/nodes_battery_info.png) | +| Hop count | ![Hops](/assets/screenshots/nodes_hops_info.png) | +| Ricevuto più di recente | ![Last heard](/assets/screenshots/nodes_last_heard.png) | +| Distanza | ![Distance](/assets/screenshots/nodes_distance_info.png) | + +## Related Topics + +- [Node Metrics](node-metrics) — detailed telemetry dashboards for each node +- [Messages & Channels](messages-and-channels) — send a direct message to a node +- [Map & Waypoints](map-and-waypoints) — view node positions geographically +- [Discovery](discovery) — traceroute and neighbor info for topology exploration +- [Signal Meter](signal-meter) — understand what the signal bars mean + +--- + diff --git a/docs/it-rIT/user/onboarding.md b/docs/it-rIT/user/onboarding.md new file mode 100644 index 000000000..6765ab198 --- /dev/null +++ b/docs/it-rIT/user/onboarding.md @@ -0,0 +1,99 @@ +--- +title: Come iniziare +nav_order: 1 +last_updated: 2026-05-13 +description: First-launch setup — permissions, onboarding flow, and next steps after connecting your radio. +aliases: + - first-launch + - setup + - intro +--- + +# Come iniziare + +Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app. + +## First Launch + +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. + +### Welcome Screen + +The welcome screen introduces Meshtastic and its core capabilities: + +- Off-grid mesh communication +- No cellular or internet required +- End-to-end encrypted messaging + +Tap **Get Started** to proceed through the setup flow. + +![Welcome screen](/assets/screenshots/onboarding_welcome.png) + +## Permissions + +The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. + +### Bluetooth Permission + +Bluetooth is the primary connection method between your phone and Meshtastic radio: + +- **Bluetooth scanning** — discover nearby Meshtastic radios +- **Bluetooth connect** — establish and maintain connections with paired radios + +Grant both permissions when prompted. Without Bluetooth, you'll need to use USB or TCP connections instead. + +### Location Permission + +> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. + +Meshtastic also uses your location for: + +- Showing your position on the mesh map +- Calculating distances to other nodes +- Sharing your GPS coordinates with other mesh members (if enabled) + +Grant **"While using the app"** or **"Always"** depending on your preference: + +- **While using the app** — position updates only when the app is open +- **Always** — enables background position updates for always-on mesh presence + +If denied, Bluetooth scanning will not function and your node will not report a position. + +### Notifications Permission + +Notifications alert you to: + +- Incoming messages from channels and direct messages +- Connection status changes (connected, disconnected, reconnecting) +- Firmware update availability + +> 💡 **Tip:** You can fine-tune notification preferences later in Android system settings. The app creates separate notification channels for messages, connection events, and background service status. + +### Critical Alerts Permission + +On supported devices, the app may request permission for critical alerts: + +- These are high-priority notifications that can break through Do Not Disturb mode +- Useful for emergency mesh alerts or urgent messages +- You can **skip** this step if you don't need breakthrough notifications +- Configure or revoke later in Android notification settings + +## After Setup + +Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. + +> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. + +## What's Next? + +Once connected to a radio, explore: + +- [Connections](connections) — pair your first radio device +- [Messages & Channels](messages-and-channels) — send your first message +- [Nodes](nodes) — see who's on your mesh +- [Map & Waypoints](map-and-waypoints) — view node positions +- [Settings](settings-radio-user) — configure your radio and user profile + +New to Meshtastic? The [getting started guide](https://meshtastic.org/docs/getting-started) on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup. + +--- diff --git a/docs/it-rIT/user/settings-module-admin.md b/docs/it-rIT/user/settings-module-admin.md new file mode 100644 index 000000000..f943a082d --- /dev/null +++ b/docs/it-rIT/user/settings-module-admin.md @@ -0,0 +1,246 @@ +--- +title: Settings — Modules & Admin +nav_order: 8 +last_updated: 2026-05-13 +description: Configure optional feature modules (MQTT, telemetry, canned messages, TAK, and more) and perform device administration. +aliases: + - modules + - module-config + - administration +--- + +# Settings — Modules & Admin + +Configure optional feature modules and perform device administration. Modules extend Meshtastic with specialized capabilities — each can be independently enabled or disabled. + +> 💡 **Tip:** You only need to enable the modules you actually use. Disabling unused modules reduces airtime, saves battery, and simplifies your configuration. + +Module settings use a card-based layout with toggle switches, dropdowns, text fields, and sliders: + +![Toggle switch](/assets/screenshots/settings_switch.png) + +![Dropdown selector](/assets/screenshots/settings_dropdown.png) + +![Text field](/assets/screenshots/settings_text_field.png) + +![Settings card layout](/assets/screenshots/settings_titled_card.png) + +## Configurazione modulo + +### MQTT Module + +Bridges mesh messages to and from an MQTT broker for internet connectivity. This is how you extend your mesh beyond radio range or integrate with home automation systems. + +| Impostazione | Descrizione | +| --------------- | ------------------------------------------------------------------------ | +| Abilitato | Toggle MQTT bridge | +| Server | MQTT broker address | +| Username | Authentication username | +| Password | Authentication password | +| Cifratura | Encrypt MQTT payloads | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON support removed from firmware; field is ignored | +| TLS | Use secure connection | +| Root topic | Base MQTT topic path | +| Map Report | Publish position for public map | + +See [MQTT](mqtt) for a detailed usage guide including encryption, privacy, and broker setup. + +### Serial Module + +Enables serial port communication for external device integrations (GPS modules, sensors, or custom hardware). When enabled, the node's serial port can send and receive protobuf or text data, allowing external microcontrollers or computers to interact with the mesh. + +| Impostazione | Descrizione | +| ------------ | ------------------------------- | +| Abilitato | Activate serial communication | +| Echo | Echo received serial data back | +| Modalità | Text, Protobuf, or NMEA output | +| RX/TX Pins | GPIO pins for serial connection | +| Baud Rate | Serial communication speed | + +### External Notification Module + +Controls buzzer, LED, or vibration alerts on your radio hardware. Useful for devices that need to physically signal when a message arrives — particularly helpful for unattended or outdoor installations. + +| Impostazione | Descrizione | +| -------------------------------- | --------------------------- | +| Abilitato | Activate notifications | +| Messaggio di allerta | Notify on incoming messages | +| Buzzer Messaggio Di Allerta | Use buzzer for messages | +| Alert Message Vibra | Use vibration for messages | +| Campanella Di Allarme | Notify on bell character | +| Output (GPIO) | Pin for notification output | +| Attivo | High or Low active | +| Duration (ms) | Notification length | +| Use I2S as Buzzer | Use I2S audio output | + +### Store & Forward Module + +Buffers messages for nodes that were temporarily offline, then replays them when those nodes reconnect. Essential for meshes where nodes go in and out of range regularly — ensures messages aren't lost during brief disconnections. + +| Impostazione | Descrizione | +| ------------------------------------------ | -------------------------- | +| Abilitato | Activate store and forward | +| Heartbeat (s) | Announcement interval | +| Record | Maximum stored messages | +| History Return (max) | Max messages to replay | +| History Return (window) | Time window for replay | + +> 💡 **Tip:** Store and Forward works best on nodes with ample memory (ESP32 with PSRAM). Router nodes are ideal candidates since they're typically always-on. + +### Range Test Module + +Automated range testing tool for evaluating link quality between nodes. When enabled, the node periodically transmits test messages with incrementing counters. A receiver node logs these messages, allowing you to walk or drive away and later analyze at what distance messages stopped arriving. + +| Impostazione | Descrizione | +| -------------------------------------- | --------------------------------- | +| Abilitato | Activate range testing | +| Sender Interval (s) | Time between test transmissions | +| Save CSV | Log received test data to SD card | + +### Telemetry Module + +Controls what telemetry data your node shares with the mesh. Telemetry includes device health (battery, uptime) and environmental sensor data (temperature, humidity, pressure). + +| Impostazione | Descrizione | +| ----------------------------------- | --------------------------------------- | +| Device Metrics Interval | How often to report device metrics | +| Environment Metrics Interval | How often to report environment sensors | +| Qualità Dell'Aria Abilitata | Report particulate sensor data | +| Metriche Di Alimentazione Abilitate | Report power usage | + +See [Telemetry & Sensors](telemetry-and-sensors) for supported sensors and configuration recommendations. + +### Canned Message Module + +Pre-configured messages accessible from the device's physical buttons (for radios with rotary encoders, keypads, or similar input hardware). Define a list of quick-send messages that can be transmitted without a phone connected — ideal for field use. + +| Impostazione | Descrizione | +| ------------------ | ----------------------------------------------------------- | +| ~~Enabled~~ | ⚠️ **Deprecated** — current firmware may ignore this toggle | +| Messaggi | Newline-separated list of messages | +| Invia Campanella | Play bell sound on send | +| Rotary Encoder | Enable rotary encoder input | +| Up/Down/Press Pins | GPIO pin assignments for input | + +### Audio Module + +Codec2 audio support for low-bandwidth voice communication over the mesh. This is an **experimental** feature that encodes voice into very small data packets using the Codec2 codec. + +| Impostazione | Descrizione | +| -------------------- | -------------------------------- | +| Abilitato | Activate audio module | +| Codec2 Rate | Audio quality/bandwidth tradeoff | +| Selezione Parola I2S | GPIO pin for I2S WS | +| I2S Data In | GPIO pin for I2S DIN | +| I2S Data Out | GPIO pin for I2S DOUT | + +> ⚠️ **Note:** Audio requires specific hardware (I2S microphone and speaker). Voice quality is very low-bandwidth — think "understandable radio voice," not phone-call quality. + +### Remote Hardware Module + +GPIO control over the mesh network. Allows a remote node to read or write GPIO pins on another node — useful for activating relays, reading switches, or controlling external hardware from a distance. + +| Impostazione | Descrizione | +| -------------------- | --------------------------------------------------------------- | +| Abilitato | Activate remote GPIO access | +| Allow Undefined Pins | Allow access to any GPIO pin (security risk) | + +> ⚠️ **Warning:** Enabling "Allow Undefined Pins" gives remote nodes access to all GPIO pins, which could interfere with the radio's own hardware. Only enable on dedicated GPIO nodes. + +### Neighbor Info Module + +Broadcasts information about directly heard neighbors, enabling mesh topology mapping. Each enabled node periodically shares a list of the other nodes it can hear and their signal quality. + +| Impostazione | Descrizione | +| -------------------------------------- | ------------------------------------ | +| Abilitato | Activate neighbor broadcasting | +| Update Interval (s) | How often to broadcast neighbor list | + +See [Discovery](discovery) for how to use neighbor data for mesh topology exploration. + +### Ambient Lighting Module + +Controls onboard NeoPixel or other addressable RGB LEDs on supported hardware. Can be used for visual status indicators, notification lights, or decorative effects. + +| Impostazione | Descrizione | +| ------------------ | ---------------------------------------------------------- | +| Abilitato | Activate LED control | +| Stato LED | On, Off, or set specific color | +| Red / Green / Blue | Individual color channel values (0–255) | + +### Detection Sensor Module + +Turns your node into a motion or door sensor alert system. When a GPIO pin detects a state change (motion detected, door opened), the node broadcasts an alert message over the mesh. + +| Impostazione | Descrizione | +| ---------------------------------------- | ----------------------------------------------------------------------- | +| Abilitato | Activate detection sensor | +| Pin Monitor | GPIO pin connected to sensor | +| Rilevamento Trigger su HIGH | Trigger when pin goes high (vs. low) | +| Minimum Broadcast (s) | Minimum time between alert broadcasts | +| State Broadcast (s) | Periodic state broadcast interval | +| Invia Campanella | Include bell character in alerts | +| Nome Descrittivo | Custom name for this sensor | + +### Paxcounter Module + +People counter using WiFi and BLE probe requests. Counts nearby devices by passively listening for probe requests that phones and laptops emit when scanning for networks. Available only on ESP32 devices. + +| Impostazione | Descrizione | +| -------------------------------------- | -------------------------- | +| Abilitato | Activate people counting | +| Update Interval (s) | How often to report counts | + +> 💡 **Tip:** Paxcounter is useful for estimating foot traffic at trailheads, event venues, or other locations. Counts are approximate — one person may carry multiple devices. + +### TAK Module + +Team Awareness Kit integration for interoperability with ATAK and WinTAK. See [TAK Integration](tak) for detailed setup and usage. + +## Amministrazione + +### Amministrazione Remota + +Remotely configure nodes that share your admin key: + +1. Select the target node in the node list. +2. Navigate to **Settings** for that node. +3. Modify configuration. +4. Tap **Save** — changes are sent over the mesh. + +> ⚠️ **Requires:** Admin key configured on both your node and the target node. + +### Azzera il database dei nodi + +Removes stale nodes from your local database that haven't been heard in a configurable time window. + +### Factory Reset + +Resets all settings to factory defaults. **This cannot be undone.** + +### Riavvia + +Remotely reboot a connected or administered node. + +### Pannello Di Debug + +View detailed diagnostic information: + +- Protocol buffers debug output +- Mesh packet log +- Connection state details + +### Troubleshooting Remote Admin + +- **"No response from target node"** — the target may be out of range, offline, or have a mismatched admin key. Verify the admin key matches on both nodes. +- **Changes not applying** — some settings require a reboot to take effect. Try the Reboot action after saving. +- **Can't see remote settings** — ensure your node has the admin key for the target node and that Admin Channel is enabled in Security Config. + +## Related Topics + +- [Settings — Radio & User](settings-radio-user) — core radio and user profile settings +- [Module configuration reference](https://meshtastic.org/docs/configuration/module) — detailed module docs on meshtastic.org +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/it-rIT/user/settings-radio-user.md b/docs/it-rIT/user/settings-radio-user.md new file mode 100644 index 000000000..caad4da73 --- /dev/null +++ b/docs/it-rIT/user/settings-radio-user.md @@ -0,0 +1,173 @@ +--- +title: Settings — Radio & User +nav_order: 7 +last_updated: 2026-05-13 +description: Configure your radio hardware, LoRa presets, user profile, position sharing, power management, and security. +aliases: + - impostazioni + - radio-config + - user-config + - lora +--- + +# Settings — Radio & User + +Configure your radio hardware and user identity parameters. + +## Impostazioni Utente + +### User Profile + +| Impostazione | Descrizione | +| ----------------- | ------------------------------------------------------------------------------------- | +| Nome Lungo | Your display name (up to 39 characters) | +| Nome Breve | 4-character abbreviated name | +| Licensed Operator | Enable if you hold an amateur radio license (enables higher power) | + +### Applying Changes + +After modifying settings, tap **Save** to write the configuration to your radio. The device may reboot to apply changes. + +## Configurazione Radio + +### Configurazione Dispositivo + +| Impostazione | Descrizione | Predefinito | +| ------------------------------------------ | ----------------------------------------------------------------------- | ----------- | +| Ruolo | Node behavior (Client, Router, etc.) | Client | +| Modalità Ritrasmissione | How the node retransmits messages | Tutti | +| Node Info Broadcast (s) | Interval for broadcasting node info | 10800 | +| Double-tap Button | Action for double-tap button press | Disabled | + +### Configurazione LoRa + +| Impostazione | Descrizione | Predefinito | +| -------------------- | ----------------------------------------------------------------------- | ----------------------------------------- | +| Regione | Regulatory region for frequency bands | Unset (must configure) | +| Configurazione Modem | Speed/range tradeoff | LongFast | +| Limite di hop | Maximum retransmit hops | 3 | +| TX Power | Transmission power (dBm); 0 = max allowed for region | 0 (region max) | +| Offset Di Frequenza | Fine-tune frequency (MHz) | 0 | +| Channel Bandwidth | Bandwidth setting | Default for preset | + +> ⚠️ **Important:** You **must** set your region before transmitting. Operating without the correct region may violate local radio regulations. See the [region configuration guide](https://meshtastic.org/docs/getting-started/initial-config) on meshtastic.org for details. + +### Modem Presets + +| Preset | Range | Velocità | SNR Limit | Best For | +| ------------------ | ----------------------- | ------------------------- | ------------------------ | -------------------------------------------------------------------------------------------------------- | +| Short Turbo | ~1 km | 21.9 kbps | −5 dB | Dense urban with line-of-sight; data-heavy applications | +| Short Fast | ~3 km | 10.9 kbps | −7.5 dB | Urban neighborhoods; buildings within a few blocks | +| Short Slow | ~5 km | 5.5 kbps | −10 dB | Suburban short-range; moderate building density | +| Medium Fast | ~5 km | 5.5 kbps | −10 dB | Suburban areas; moderate building density | +| Medium Slow | ~8 km | 1.1 kbps | −12.5 dB | Suburban/rural; moderate range with slower speed | +| Long Turbo | ~10 km | 4.4 kbps | −10 dB | Similar range to Long Fast but with 500 kHz bandwidth; faster throughput | +| Long Fast | ~10 km | 1.1 kbps | −12.5 dB | **General use (default)** — balanced range and speed | +| Long Moderate | ~20 km | 0,34 kbps | −15 dB | Rural with some terrain; occasional use | +| Lite Fast | ~5 km | 5.5 kbps | −10 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Medium Fast | +| Lite Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Long Fast | +| Narrow Fast | ~5 km | 2.7 kbps | −10 dB | EU 868 MHz band (62.5 kHz BW); avoids interference with other devices | +| Narrow Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 868 MHz band (62.5 kHz BW); comparable to Long Fast | +| ~~Long Slow~~ | ~30 km | 0,18 kbps | −17.5 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | +| ~~Very Long Slow~~ | ~40+ km | 0.09 kbps | −20 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | + +#### Choosing a Modem Preset + +The modem preset controls the fundamental tradeoff between **range** and **data rate**: + +- **Slower presets** use more spreading, making signals decodable at weaker signal levels (lower SNR limit). This means longer range but fewer bytes per second. +- **Faster presets** pack more data per transmission but require a stronger signal to decode. + +**Practical guidance:** + +- **Urban mesh (many nodes, short distances):** Use **Long Fast** (default) or **Short Fast**. Higher speed means less airtime congestion when many nodes share the channel. +- **Rural/sparse mesh (few nodes, long distances):** Use **Long Moderate**. Range matters more than speed when nodes are far apart. +- **EU 866/868 MHz regulatory compliance:** Use **Lite Fast**, **Lite Slow**, **Narrow Fast**, or **Narrow Slow** — these are optimized for the EU SRD/868 MHz bands with narrower bandwidths. +- **Fixed infrastructure links:** Use **Short Turbo** or **Long Turbo** for dedicated point-to-point links with good antennas and line-of-sight. +- **Mixed environments:** Stick with **Long Fast** — it's the community default and ensures compatibility with others in your area. + +> ⚠️ **Important:** All nodes on the same channel **must** use the same modem preset. Nodes with mismatched presets cannot communicate even if they share the same frequency and encryption key. + +> 💡 **Tip:** The range estimates above assume flat terrain and modest antennas. Elevation advantage (hilltop, rooftop) dramatically increases effective range. A well-placed Router with Long Fast can often outperform a ground-level node with Long Slow. + +### Configurazione Schermo + +| Impostazione | Descrizione | +| -------------------- | ------------------------------------------------------------------------------------ | +| Timeout Schermo | Time before display sleeps | +| Mostra Unità | Metric or Imperial | +| Tipo OLED | Auto, SSD1306, SH1106, SH1107 | +| Orientamento bussola | Rotation offset for compass display (0°, 90°, 180°, 270°) | +| ~~Compass North~~ | ⚠️ **Deprecated** — replaced by Compass Orientation; still visible in older firmware | + +### Configurazione Posizione + +| Impostazione | Descrizione | +| ----------------------------------------- | ---------------------------------- | +| GPS Enabled | Enable/disable GPS | +| Intervallo di aggiornamento GPS | How often to acquire GPS fix | +| Position Broadcast (s) | How often to share position | +| Posizione Smart | Enable movement-based broadcasting | +| Posizione Fissa | Use a manually set position | + +### Configurazione Alimentazione + +| Impostazione | Descrizione | +| --------------------------------------- | --------------------------------------- | +| Risparmio energetico | Enable low-power sleep mode | +| Shutdown After (s) | Auto-shutdown idle timer | +| ADC Multiplier | Battery voltage calibration factor | +| Wait Bluetooth (s) | Time to wait for BLE connection at boot | +| Mesh SDS Timeout (s) | Super-deep-sleep timeout | + +### Configurazione Della Rete + +| Impostazione | Descrizione | +| -------------- | ---------------------------------------------------- | +| WiFi abilitato | Enable WiFi radio (ESP32 devices) | +| SSID WiFi | Network name to connect to | +| WiFi PSK | Password di rete | +| Server NTP | Time synchronization server | +| Syslog Server | Remote logging server | + +![IP address field](/assets/screenshots/settings_ipv4_field.png) + +### Configurazione Bluetooth + +| Impostazione | Descrizione | +| ----------------------- | ------------------------------------------------------------------------- | +| Bluetooth Enabled | Enable/disable BLE radio | +| Modalità di abbinamento | Fixed PIN, Random PIN, or No PIN | +| PIN Fisso | PIN code for pairing (default: 123456) | + +### Configurazione Sicurezza + +| Impostazione | Descrizione | +| ------------------------------- | -------------------------------------------------------------------------- | +| Chiave Pubblica | Your node's public key (read-only) | +| Chiave Amministratore | Key for remote administration | +| Chiave Privata | Your node's private key (handle securely) | +| Canale Amministratore Abilitato | Allow admin commands via channel | +| Log di debug | Output live debug logging over serial/bluetooth | +| Serial Enabled | Enable serial console access (moved from Device Config) | +| Modalità Gestita | Restrict non-admin channel changes | + +![Password field](/assets/screenshots/settings_password_field.png) + +Settings use standard preference controls — dropdowns, toggles, and sliders: + +| Control | Screenshot | +| -------- | ------------------------------------------------------ | +| Dropdown | ![Dropdown](/assets/screenshots/settings_dropdown.png) | +| Toggle | ![Toggle](/assets/screenshots/settings_switch.png) | +| Slider | ![Slider](/assets/screenshots/settings_slider.png) | + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — optional feature modules and device administration +- [Signal Meter](signal-meter) — how modem presets affect signal quality thresholds +- [LoRa configuration](https://meshtastic.org/docs/configuration/radio/lora) — detailed LoRa settings reference on meshtastic.org +- [Initial configuration](https://meshtastic.org/docs/getting-started/initial-config) — region setup guide on meshtastic.org + +--- + diff --git a/docs/it-rIT/user/signal-meter.md b/docs/it-rIT/user/signal-meter.md new file mode 100644 index 000000000..d5c409beb --- /dev/null +++ b/docs/it-rIT/user/signal-meter.md @@ -0,0 +1,81 @@ +--- +title: How the Meshtastic Signal Meter Works +nav_order: 15 +last_updated: 2026-05-13 +description: How the signal meter calculates quality from RSSI and SNR — LoRa spread spectrum, presets, and what the bars really mean. +aliases: + - signal + - signal-meter + - snr + - rssi +--- + +# How the Meshtastic Signal Meter Works + +The Meshtastic signal meter — the familiar bars or status color in the app — is calculated very differently than the "bars" on a traditional cell phone or Wi-Fi router. + +Most consumer devices simply measure how "loud" a signal is. However, because Meshtastic uses **LoRa (Long Range)** technology, its signal meter measures how **clear** the signal is, relative to the specific settings your mesh is using. + +--- + +## 1. The Two Metrics: "Loudness" vs. "Clarity" + +Every time the LoRa radio chip receives a message, it reports two measurements: + +- **RSSI (Received Signal Strength Indicator):** The **loudness** of the raw power hitting your antenna. +- **SNR (Signal-to-Noise Ratio):** The **clarity** of the signal compared to the background static. + +> **Tip — The Analogy:** Imagine you are trying to hear a friend talking to you. +> +> - **RSSI** is how loud their voice is. +> - **The Noise Floor** is the background noise in the room (air conditioning, other people talking, traffic). +> - **SNR** is how easily you can distinguish your friend's voice from the background noise. + +If your friend shouts at you at a deafening rock concert, the signal is incredibly loud (High RSSI), but you still can't understand them because the background noise is louder (Bad SNR). Conversely, if your friend whispers to you in a dead-silent library, the signal is very weak (Low RSSI), but you can understand them perfectly (Great SNR). + +--- + +## 2. The Magic of LoRa: Hearing "Below the Noise Floor" + +For standard radios (like FM or Wi-Fi), if the background noise is louder than the signal (a negative SNR), the receiver just hears static. + +LoRa is special. It uses **"Spread Spectrum"** modulation, which allows the radio to mathematically pull a signal out of the air even when it is buried deep _underneath_ the background noise. This is why you will frequently see **negative SNR numbers** in Meshtastic (e.g., -10 dB, which means the signal is 10 decibels weaker than the background static). + +Depending on which Meshtastic preset you are using (e.g., `LongFast` vs. `ShortFast`), the radio has a specific **SNR Limit** — the absolute maximum amount of noise it can tolerate before the message is completely lost to the static. + +--- + +## 3. How the Signal Meter Calculates Quality + +The Meshtastic apps take both RSSI and SNR and run them through a specific formula to assign your signal a quality rating (None, Bad, Fair, or Good). It specifically scales these values based on the physical limits of the radio preset you are using. + +Here is exactly how the app decides how many bars (or what color) to show you: + +| Level | Bars | Criteria | Meaning | +| -------- | ---- | ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | +| Buono | 3 | RSSI better than `-115 dBm` **AND** SNR better than `-7 dB` | Signal is both loud and clear — healthy connection. | +| Discreto | 2 | RSSI better than `-126 dBm` with good SNR, **OR** SNR better than `-15 dB` with good RSSI | Signal getting quieter or noisier, but still decodable. | +| Scarso | 1 | Falls between Fair and None thresholds | At the edge of range or experiencing interference. | +| Nessuno | 0 | RSSI worse than `-126 dBm` **AND** SNR worse than `-15 dB` | Transmission completely buried in noise. | + +--- + +## 4. What This Means for You + +Because Meshtastic's meter acts as a **"Clarity Meter"**, it behaves differently than what most people expect: + +> **Tip — Don't panic over low RSSI:** You might see a seemingly terrible RSSI value like `-118 dBm`. On a cell phone, you would have zero bars. But if you have an SNR of `+2 dB`, Meshtastic will still show a strong signal! _The library is quiet, so the whisper is heard perfectly._ + +> **Warning — Watch out for local noise:** If you hook up a massive antenna and see a great RSSI (e.g., `-90 dBm`) but your signal meter is only showing **1 Bar (Bad)**, you have a problem. It means you have local interference — perhaps a cheap power supply, a noisy computer, or a nearby radio tower — creating so much static that it is drowning out your mesh. + +## Where Signal Information Appears + +In the app, signal data is shown in several places: + +- **Node list** — signal bars icon next to each node +- **Node detail** — SNR, RSSI, and signal quality in the device metrics section +- **Traceroute** — per-hop signal quality for each relay node +- **Signal metrics** — historical SNR and RSSI data in the metrics charts + +![Node entry showing SNR, RSSI values and colored signal bars](/assets/screenshots/nodes_signal_info.png) + diff --git a/docs/it-rIT/user/tak.md b/docs/it-rIT/user/tak.md new file mode 100644 index 000000000..6b6333eeb --- /dev/null +++ b/docs/it-rIT/user/tak.md @@ -0,0 +1,126 @@ +--- +title: TAK Integration +nav_order: 10 +last_updated: 2026-05-13 +description: Interoperate with ATAK and WinTAK — CoT position sharing, TAK roles, and plugin setup. +aliases: + - tak + - atak + - team-awareness-kit +--- + +# TAK Integration + +Meshtastic integrates with the Team Awareness Kit (TAK) ecosystem, enabling interoperability between Meshtastic mesh devices and TAK applications like ATAK and WinTAK. + +## Panoramica + +The TAK module allows Meshtastic nodes to: + +- Share position data in TAK-compatible CoT (Cursor on Target) format +- Appear as team members on TAK map displays +- Receive TAK PLI (Position Location Information) messages + +## Configurazione + +### Prerequisiti + +- ATAK (Android Team Awareness Kit) or WinTAK installed +- Meshtastic ATAK Plugin installed +- TAK module enabled on your Meshtastic radio + +### Configurazione + +1. Navigate to **Settings → Module Config → TAK**. +2. Enable the TAK module. +3. Configure the TAK team/group settings: + +![Module toggle switch](/assets/screenshots/settings_switch.png) + +| Impostazione | Descrizione | +| ------------ | -------------------------- | +| Abilitato | Activate TAK interop | +| Modalità | TAK-compatible output mode | + +### ATAK Plugin Setup + +1. Install the Meshtastic ATAK Plugin from the plugin repository. +2. Open ATAK and enable the Meshtastic plugin. +3. The plugin bridges messages between ATAK and your mesh network. + +## TAK Roles + +Nodes configured with TAK-related roles behave differently from standard clients: + +| Ruolo | Descrizione | +| --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **TAK** | Full TAK interoperability — sends and receives CoT data, chat messages, and PLI updates. Functions as a standard client plus TAK bridge. | +| **TAK Tracker** | Position-only TAK output — automatically broadcasts PLI at regular intervals without user interaction. Optimized for unattended position beacons (vehicles, equipment, waypoints). Does not relay chat messages. | + +> 💡 **Tip:** Use **TAK Tracker** for devices that only need to report position (e.g., a radio mounted in a vehicle). Use **TAK** for devices where users actively participate in TAK operations. + +### CoT (Cursor on Target) Format + +TAK messages use the Cursor on Target XML format — a military standard for sharing situational awareness data. Meshtastic converts its internal protobuf messages to CoT format when bridging to TAK systems, so no manual format conversion is needed. + +## TAK Identity + +When using TAK roles, your node broadcasts identity information that appears on TAK maps: + +| Impostazione | Descrizione | +| ------------ | ---------------------------------------------------------------------------------------------------------------- | +| Team | Your team color on the TAK map (e.g., Blue, Red, Cyan, Green) | +| Ruolo | Your operational role (Team Member, Team Lead, HQ, Medic, RTO, etc.) | +| Callsign | Your TAK callsign (defaults to your Meshtastic long name) | + +These settings appear in **Settings → Module Config → TAK** when the TAK module is enabled. + +> 💡 **Tip:** Team/role colors are the standard TAK affiliation colors. Coordinate with your TAK team to use consistent team assignments. + +## Wire Format (V1 / V2) + +Meshtastic supports two TAK wire formats: + +| Format | Compatibility | Caratteristiche | +| ------------------------------- | --------------------------------------------------------------- | --------------------------------------------------------- | +| V1 (Legacy) | ATAK Plugin v1.x, older firmware | Basic CoT position sharing only | +| V2 (Current) | ATAK Plugin v2.x, firmware 2.3+ | Full CoT support including chat, routes, zstd compression | + +The app automatically selects V2 when both sides support it. No manual configuration needed — the TAK module negotiates format based on firmware capabilities. + +## Usage with ATAK + +Once configured: + +- Meshtastic nodes appear as markers on the ATAK map with callsign labels +- Chat messages can bridge between mesh and TAK networks +- Position updates flow bidirectionally between Meshtastic and TAK +- TAK Tracker nodes broadcast PLI automatically — their positions appear on ATAK maps without any ATAK-side configuration + +> ⚠️ **Note:** TAK integration requires specific node roles and module configuration. Standard client nodes don't automatically participate in TAK operations. + +## Risoluzione problemi + +| Problem | Cause | Solution | +| -------------------------------- | ------------------------------------- | ----------------------------------------------------------------------- | +| Node doesn't appear on ATAK map | TAK module disabled or wrong role | Verify TAK module is enabled and node role is TAK or TAK Tracker | +| Position updates are stale | GPS fix lost or interval too long | Check GPS status; reduce position broadcast interval in Position Config | +| ATAK plugin shows "disconnected" | BLE connection lost or plugin crashed | Reconnect Bluetooth in Meshtastic app, then restart ATAK plugin | +| Chat messages not bridging | V1 format doesn't support chat | Ensure both nodes run firmware 2.3+ for V2 wire format | +| CoT data not flowing | Channel mismatch | All TAK nodes must be on the same channel with matching encryption | + +## Security Considerations + +- TAK data shares your position and callsign information +- Ensure your channel encryption is configured when using TAK in sensitive environments +- The TAK module respects the same channel encryption as other Meshtastic messages + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — TAK module configuration +- [Nodes](nodes) — TAK and TAK Tracker roles in the node list +- [Map & Waypoints](map-and-waypoints) — node positions on the map +- [ATAK plugin guide](https://meshtastic.org/docs/software/integrations/atak-plugin) — detailed ATAK setup on meshtastic.org + +--- + diff --git a/docs/it-rIT/user/telemetry-and-sensors.md b/docs/it-rIT/user/telemetry-and-sensors.md new file mode 100644 index 000000000..2dd6dcd49 --- /dev/null +++ b/docs/it-rIT/user/telemetry-and-sensors.md @@ -0,0 +1,118 @@ +--- +title: Telemetry & Sensors +nav_order: 9 +last_updated: 2026-05-13 +description: Sensor data on the mesh — supported environment, air quality, and power sensors, plus configuration and viewing guides. +aliases: + - sensors + - environment + - weather + - power-metrics +--- + +# Telemetry & Sensors + +Meshtastic nodes can collect and share sensor data across the mesh network. + +## Panoramica + +Telemetry allows nodes equipped with sensors to broadcast environmental, power, and device health information. This data is visible on the node detail screen and can be logged over time. + +## Telemetria dispositivo + +All Meshtastic nodes report basic device telemetry: + +| Metrico | Descrizione | Typical Range | +| ------------------ | ------------------------------ | ------------------------------------------------------------------ | +| Battery Level | Charge percentage | 0–100% | +| Tensione | Battery voltage | 3.0–4.2V (LiPo) | +| Utilizzo Canale | % of airtime used locally | 0–100% | +| Air Utilization TX | % of airtime used by this node | 0–100% | +| Tempo di attività | Seconds since last boot | Varies | + +## Environment Sensors + +Supported environmental sensors: + +### Temperature & Humidity + +| Sensore | Temperatura | Umidità | Pressione | Note | +| ------- | ----------- | ------- | --------- | ----------------------- | +| BME280 | ✓ | ✓ | ✓ | Recommended all-in-one | +| BME680 | ✓ | ✓ | ✓ | Adds gas resistance/IAQ | +| SHT31 | ✓ | ✓ | — | High accuracy | +| MCP9808 | ✓ | — | — | Precision temperature | +| LPS22 | — | — | ✓ | Pressure only | + +### Air Quality + +| Sensore | Metrico | Note | +| -------- | -------------------------------------------------- | -------------------------- | +| BME680 | Gas Resistance / IAQ | Volatile organic compounds | +| PMSA003I | PM1.0, PM2.5, PM10 | Particulate matter | +| SEN55 | PM, NOx, VOC, Temp, Humidity | Multi-sensor | + +### Light & UV + +| Sensore | Metrico | +| -------- | -------------------------------------- | +| OPT3001 | Ambient light (lux) | +| VEML7700 | Ambient light (lux) | +| LTR390 | UV index | + +## Metriche Alimentazione + +Nodes with INA-series power sensors can report: + +| Metrico | Descrizione | +| ------------- | ----------------------------------------- | +| Bus Voltage | Supply rail voltage | +| Attuale | Power consumption (mA) | +| Alimentazione | Calculated power (mW) | + +Useful for monitoring solar charging or battery health on remote nodes. + +## Configuring Telemetry + +1. Navigate to **Settings → Module Config → Telemetry**. +2. Set reporting intervals: + - **Device Metrics Interval** — how often to broadcast device metrics + - **Environment Metrics Interval** — how often to broadcast sensor data +3. Enable specific sensor types as needed. + +### Recommended Intervals + +| Use Case | Device (s) | Environment (s) | +| ------------------------------------------ | ----------------------------- | ---------------------------------- | +| Urban mesh (many nodes) | 3600 | 3600 | +| Rural mesh (few nodes) | 900 | 900 | +| Weather station | 900 | 300 | +| Battery conservation | 7200 | 7200 | + +> ⚠️ **Note:** Shorter intervals increase airtime usage and battery drain across the mesh. + +## Viewing Telemetry + +1. Navigate to **Nodes** and select a node. +2. Telemetry sections show on the detail screen: + - Device Metrics (always available) + - Environment Metrics (if sensors present) + - Power Metrics (if INA sensor present) +3. Historical graphs show trends over time. + +![Telemetry actions](/assets/screenshots/node-metrics_telemetric_actions.png) + +## Risoluzione problemi + +- **No environment data showing?** The remote node needs a physical sensor connected (e.g., BME280 on I2C). Device telemetry (battery, uptime) is always available, but environment metrics require hardware. +- **Stale readings?** Check the reporting interval — very long intervals (7200s+) mean data updates infrequently. Also verify the remote node is still online. +- **Sensor conflict on I2C bus?** Some sensors share I2C addresses. If you have multiple sensors on the same bus, check for address collisions in the radio's serial debug output. + +## Related Topics + +- [Node Metrics](node-metrics) — view telemetry data on the node detail screen +- [Settings — Modules & Admin](settings-module-admin) — telemetry module configuration +- [Units & Locale](units-and-locale) — temperature and pressure display units + +--- + diff --git a/docs/it-rIT/user/translate.md b/docs/it-rIT/user/translate.md new file mode 100644 index 000000000..7ce5188ab --- /dev/null +++ b/docs/it-rIT/user/translate.md @@ -0,0 +1,97 @@ +--- +title: Translate the App +parent: User Guide +nav_order: 17 +last_updated: 2026-05-13 +aliases: + - translate + - crowdin + - localization +--- + +# Translate the App + +Contributing translations helps make Meshtastic accessible to a wider audience. The app uses [Crowdin](https://crowdin.com/) to manage community translations for both the user interface and in-app documentation. + +--- + +## What Gets Translated + +| Resource | Source Location | Note | +| ----------------- | ------------------------------------- | ---------------------------------------------------------------------- | +| UI strings | `composeResources/values/strings.xml` | Buttons, labels, messages, and all user-visible text | +| User Guide pages | `docs/user/*.md` | In-app documentation shown in Help & Documentation | +| Fastlane metadata | `fastlane/metadata/android/en-US/` | App Store listing title, description, and changelogs | + +> **Note — Developer Guide pages are English-only.** Code-focused documentation targeting contributors is not translated. + +--- + +## How to Contribute + +1. **Visit the Crowdin project.** Open the [Meshtastic Android Crowdin project](https://crowdin.com/project/meshtastic-android) and sign in or create a free account. +2. **Choose your language.** Select an existing language or request a new one by opening a [GitHub issue](https://github.com/meshtastic/Meshtastic-Android/issues/new). +3. **Translate strings.** Crowdin shows the English source on the left and your translation on the right. Translate each string and save. +4. **Review context.** Many strings include screenshots or context comments — check these to understand where the text appears in the app. +5. **Submit.** Approved translations are automatically merged into the next release. + +> **Tip — Keep translations short.** UI strings often appear in buttons, chips, or narrow columns. If a translation is significantly longer than the English original, consider abbreviating where the meaning stays clear. + +--- + +## Adding a New Language + +If your language is not yet listed on Crowdin: + +1. Open an issue on [GitHub](https://github.com/meshtastic/Meshtastic-Android/issues/new) requesting the new locale. +2. A maintainer will add the language to Crowdin and configure `crowdin.yml`. +3. Once added, you can begin translating immediately. + +--- + +## How Translations Are Organized + +The Android app uses **Compose Multiplatform resources** for all user-visible strings: + +``` +core/resources/src/commonMain/composeResources/ +├── values/ ← English (default) +│ └── strings.xml +├── values-de/ ← German +│ └── strings.xml +├── values-fr/ ← French +│ └── strings.xml +└── ... +``` + +In-app documentation follows a similar pattern under `docs/`: + +``` +docs/ +├── user/ ← English source (default) +│ ├── onboarding.md +│ └── ... +├── fr/user/ ← French translations +│ ├── onboarding.md +│ └── ... +└── ... +``` + +The app automatically selects the correct locale based on your device's **Language & Region** settings. + +--- + +## Translation Guidelines + +- **Do not translate** technical terms like "LoRa", "MQTT", "BLE", "TAK", "SNR", or "RSSI" — these are universal. +- **Keep placeholders intact.** Strings like `%1$s` or `%d` are filled in at runtime. Do not remove or reorder them unless the grammar of your language requires it. +- **Match tone.** The app uses a friendly, direct voice. Avoid overly formal language. +- **Test if possible.** Switch your device language and open the app to see how translations look in context. + +--- + +## Questions? + +If you have questions about a specific string's context or need help getting started, open a discussion on the [Meshtastic GitHub Discussions](https://github.com/meshtastic/Meshtastic-Android/discussions) page. + +Thank you for helping expand the reach of Meshtastic! diff --git a/docs/it-rIT/user/units-and-locale.md b/docs/it-rIT/user/units-and-locale.md new file mode 100644 index 000000000..5c954f9aa --- /dev/null +++ b/docs/it-rIT/user/units-and-locale.md @@ -0,0 +1,118 @@ +--- +title: Units, Measurement & Locale +parent: User Guide +nav_order: 16 +last_updated: 2026-05-12 +--- + +# Units, Measurement & Locale + +The Meshtastic app automatically displays temperatures, distances, speeds, and times in the units your device is configured to use — no settings to change inside the app. + +--- + +## Come funziona + +Meshtastic radios always transmit data in **metric units** (meters, °C, km/h, hPa, etc.). When the app receives this data, it uses the `MetricFormatter` utility to convert and display values in whatever unit system your device's locale specifies. + +On Android, your measurement preferences are determined by your system **Language & Region** settings. On Desktop (JVM), the app uses the JVM's default `Locale`. + +> **Tip — You never need to toggle units inside the app.** Change your system measurement preferences and every screen in Meshtastic updates automatically — node details, telemetry charts, weather, altitude, and more. + +--- + +## Temperatura + +Temperature values from environment sensors are transmitted as **°C** and displayed based on your device's temperature unit preference. + +![Environment metrics with temperature](/assets/screenshots/nodes_environment_metrics.png) + +| Your Setting | You See | +| ------------ | ------- | +| Celsius | 22°C | +| Fahrenheit | 72°F | + +This affects all temperature displays throughout the app: node environment telemetry, soil temperature, dew point, and telemetry chart axes. + +## Distance & Altitude + +Distances between nodes and GPS altitudes are transmitted as **meters** and automatically scaled and converted. + +![Distance info display](/assets/screenshots/nodes_distance_info.png) + +| Your Setting | Small Distance | Large Distance | Altitudine | +| -------------------------------- | -------------- | ---------------------- | ---------- | +| Metrico | 350 m | 2.5 km | 1,200 m | +| Imperial (US) | 1,148 ft | 1.6 mi | 3,937 ft | + +The app uses natural scaling — short distances stay in meters or feet, while longer distances switch to kilometres or miles automatically. + +### Where these appear + +- **Node list** — distance and bearing to each node +- **Node detail** — altitude, distance from your position +- **Map** — waypoint distances, traceroute hop distances +- **Compass** — distance to selected node + +## Velocità + +GPS ground speed is displayed in your locale's preferred speed unit. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Metrico | 12 km/h | +| Imperial (US) | 7 mph | + +## Vento + +Wind speed and gust data from environment sensors are transmitted as **m/s** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Metrico | 5 m/s | +| Imperial (US) | 11 mph | + +Wind readings appear in the **Node Detail** environment section and the **Environment Telemetry** charts. + +## Rainfall + +Rainfall measurements (1-hour and 24-hour totals) are transmitted as **mm** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ---------------------- | +| Metrico | 12 mm | +| Imperial (US) | 0.5 in | + +## Units That Never Change + +Some units are international standards and are displayed the same way regardless of your locale: + +| Measurement | Unit | Why | +| -------------------------------- | ------------------------------ | ------------------------------------- | +| Pressione barometrica | hPa | International meteorological standard | +| Heading / bearing | ° (degrees) | Universal navigation convention | +| Radiazione | μR/hr | Standard dosimetry unit | +| GPS coordinates | decimal degrees | Universal geographic standard | +| Humidity, battery, soil moisture | % | Universal | + +## Date & Time + +All timestamps throughout the app — last heard, message times, telemetry logs, chart axes — follow your device's date and time preferences. + +| Impostazione | What It Controls | Esempio | +| ---------------- | ---------------- | ------------------------------------------------ | +| **24-Hour Time** | Clock format | 14:30 vs 2:30 PM | +| **Date Format** | Date ordering | 09/05/2026 vs 05/09/2026 | + +The app also uses **relative time** where it makes sense — for example, "5 min ago" or "2 hours ago" in the node list — which is automatically localised into your device language. + +## Changing Your Measurement System (Android) + +On Android, your measurement system (metric vs imperial) is tied to your region setting: + +1. Open **Android Settings → System → Language & Region** +2. Change your **Region** or **Measurement units** preference +3. Return to Meshtastic — values update immediately + +> **Tip — The app uses `MetricFormatter` from `core:common`.** All measurement formatting is handled by a shared KMP utility that respects your platform's locale. Developers adding new measurement displays should use `MetricFormatter` rather than hard-coding unit conversions. + diff --git a/docs/iw-rIL/index.md b/docs/iw-rIL/index.md new file mode 100644 index 000000000..56a75c822 --- /dev/null +++ b/docs/iw-rIL/index.md @@ -0,0 +1,30 @@ +--- +title: Home +layout: default +nav_order: 0 +--- + +# Meshtastic Android App Documentation + +User and developer documentation for the Meshtastic Android, Desktop, and iOS applications powered by KMP (Kotlin Multiplatform). + +Use the sidebar navigation to browse the **User Guide** for app features and the **Developer Guide** for contributing to the project. + +--- + +## Quick Links + +| Guide | תיאור | +| --------------------------------------------------------------------- | -------------------------------------------------------------- | +| [Getting Started](user/onboarding) | Connect your first radio and send a message | +| [Messages & Channels](user/messages-and-channels) | Channel broadcasts, direct messages, reactions, and encryption | +| [Nodes](user/nodes) | Understanding the mesh network node list | +| [Signal Meter](user/signal-meter) | How the LoRa signal quality meter works | +| [Units & Locale](user/units-and-locale) | How temperatures, distances, and times adapt to your region | +| [Desktop App](user/desktop) | Linux, macOS, and Windows desktop usage | +| [Architecture](developer/architecture) | App architecture overview for contributors | +| [Contributing](developer/contributing) | Branch naming, PR workflow, and verification commands | + +--- + +> This documentation is served from the same markdown source that powers the in-app **Help & Documentation** browser. diff --git a/docs/iw-rIL/user/connections.md b/docs/iw-rIL/user/connections.md new file mode 100644 index 000000000..5df8d1956 --- /dev/null +++ b/docs/iw-rIL/user/connections.md @@ -0,0 +1,125 @@ +--- +title: Connections +nav_order: 2 +last_updated: 2026-05-13 +description: Connect your phone or desktop to a Meshtastic radio via Bluetooth, USB, or TCP/IP. +aliases: + - bluetooth + - usb + - tcp + - pairing +--- + +# Connections + +Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node. + +## Bluetooth (BLE) + +Bluetooth Low Energy is the default and most common connection method on Android. + +### Pairing a Device + +1. Ensure your Meshtastic radio is powered on and in pairing mode. +2. Open the app and navigate to **Connections**. +3. Tap **Scan for Devices** — nearby Meshtastic radios will appear. +4. Select your device from the list. +5. Accept the Bluetooth pairing prompt if shown. + +![Device list item](/assets/screenshots/connections_bluetooth_scan.png) + +You can filter devices by transport type using the filter chips at the top: + +![Transport filter chips](/assets/screenshots/connections_transport_filters.png) + +> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. + +### Connection Status + +| Icon | State | תיאור | +| ---- | -------------- | ----------------------------- | +| 🟢 | Connected | Active radio link established | +| 🟡 | Connecting | Handshake in progress | +| 🔴 | מנותק | No active connection | +| ⚪ | Not configured | No device selected | + +When connecting, a status indicator shows the current connection state: + +![Connecting status](/assets/screenshots/connections_connecting.png) + +If no devices are found, the app shows an empty state with instructions: + +![No devices found](/assets/screenshots/connections_empty_state.png) + +### Troubleshooting Bluetooth + +- **Device not found:** Toggle Bluetooth off/on, ensure location is enabled. +- **Connection drops:** Move closer to the radio; check for interference. +- **Pairing rejected:** Forget the device in Android Bluetooth settings and retry. + +## USB Serial + +USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable. + +### Setup + +1. Connect your radio via USB cable to your device. +2. The app will prompt for USB permission — tap **Allow**. +3. The connection is established automatically. + +> ⚠️ **Note:** USB connections require OTG support on Android devices. + +## TCP/IP (WiFi) + +Some Meshtastic radios support WiFi connectivity, allowing TCP-based connections. + +### Configuration + +1. Connect your radio to a WiFi network via the radio's web interface or settings. +2. In the app, go to **Connections → TCP**. +3. Enter the radio's IP address and port (default: 4403). +4. Tap **Connect**. + +![WiFi scanning for devices](/assets/screenshots/connections_wifi_scanning.png) + +When a device is found, it appears in the connection list: + +![WiFi device found](/assets/screenshots/connections_wifi_device_found.png) + +A successful connection is confirmed with a status indicator: + +![WiFi connection success](/assets/screenshots/connections_wifi_success.png) + +### When to Use TCP + +- Radio is on the same local network +- Testing with a simulated radio +- Environments where Bluetooth has interference issues + +## Reconnection Behavior + +The app reconnects to the **last selected device** on startup. You can manually switch transports from the connections screen at any time. + +To disconnect from a radio, use the disconnect button on the connections screen: + +![Disconnect from radio](/assets/screenshots/connections_disconnect.png) + +## Desktop Connections + +On Desktop (Linux/macOS/Windows), the app supports: + +- **Bluetooth (BLE)** — via the Kable library; works on macOS, Linux, and Windows +- **USB Serial** — primary wired connection method +- **TCP/IP** — for network-connected radios + +See [Desktop App](desktop) for platform-specific details and keyboard shortcuts. + +## Related Topics + +- [Getting Started](onboarding) — first-launch setup and permissions +- [Settings — Radio & User](settings-radio-user) — Bluetooth and network configuration +- [Desktop App](desktop) — desktop-specific connection details +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — full list of compatible radios on meshtastic.org + +--- + diff --git a/docs/iw-rIL/user/desktop.md b/docs/iw-rIL/user/desktop.md new file mode 100644 index 000000000..b38371a62 --- /dev/null +++ b/docs/iw-rIL/user/desktop.md @@ -0,0 +1,147 @@ +--- +title: Desktop App +nav_order: 14 +last_updated: 2026-05-13 +description: Install and use the Meshtastic Desktop app on Linux, macOS, and Windows — connections, feature parity, and keyboard shortcuts. +aliases: + - desktop + - linux + - macos + - windows + - jvm +--- + +# Desktop App + +The Meshtastic Desktop application provides the same mesh communication features on Linux, macOS, and Windows. + +## Overview + +The Desktop app shares its core codebase with the Android app through Kotlin Multiplatform (KMP). Most features work identically across platforms. + +## Installation + +### Linux + +- Download the `.deb` or `.AppImage` package from the releases page +- Or build from source using `./gradlew :desktopApp:run` + +### macOS + +- Download the `.dmg` package from releases +- Or build from source + +### Windows + +- Download the `.msi` installer from releases +- Or build from source + +## Connecting Your Radio + +### USB Serial (Primary) + +The most reliable connection method on Desktop: + +1. Connect your Meshtastic radio via USB cable. +2. The app should detect the serial port automatically. +3. If not detected, select the correct serial port from the connections menu. + +### TCP/IP + +For network-connected radios: + +1. Enter the radio's IP address and port (default: 4403). +2. Click **Connect**. + +### Bluetooth (BLE) + +Bluetooth Low Energy is supported on Desktop via the [Kable](https://github.com/JuulLabs/kable) library: + +1. Ensure your system has a Bluetooth adapter. +2. The app scans for nearby Meshtastic radios automatically. +3. Select your device from the connections screen. + +## Feature Parity + +| Feature | Android | Desktop | Notes | +| ---------------------------------------- | ------- | ------- | -------------------------- | +| Messaging | ✓ | ✓ | Full parity | +| Node List | ✓ | ✓ | Full parity | +| מפה | ✓ | ✓ | Full parity | +| הגדרות | ✓ | ✓ | Full parity | +| Bluetooth (BLE) | ✓ | ✓ | Via Kable on desktop | +| Firmware Update OTA | ✓ | ✗ | Use web flasher | +| Notifications | ✓ | ✓ | Native OS notifications | +| Widgets | ✓ | ✗ | Android-only | +| AI Assistant (Chirpy) | ✓\* | ✗ | Google flavor Android only | + +\*Chirpy AI requires Android 14+ on Google flavor builds with supported hardware. + +## UI Differences + +The Desktop app uses the same Compose Multiplatform UI with adaptations for larger screens and desktop interaction. + +### Keyboard Shortcuts + +| Shortcut | Action | +| ------------------- | --------------------------- | +| **⌘Q** / **Ctrl+Q** | Quit the application | +| **⌘,** / **Ctrl+,** | Open Settings | +| **⌘1** / **Ctrl+1** | Switch to Conversations tab | +| **⌘2** / **Ctrl+2** | Switch to Nodes tab | +| **⌘3** / **Ctrl+3** | Switch to Map tab | +| **⌘4** / **Ctrl+4** | Switch to Connections tab | + +### Window & System Tray + +- **Window resizing** — responsive layout adapts to window dimensions +- **System tray** — minimize to system tray for background mesh operation +- **Tray menu** — right-click the tray icon to show window or quit +- **Mouse interaction** — hover states and standard desktop navigation + +### Notification Preferences + +The Desktop app provides in-app toggles for controlling which notifications are shown — messages, new nodes, and low battery alerts. Access these from **Settings → Notifications** within the app. + +## Built-in Documentation Browser + +The Desktop app includes a built-in documentation browser for quick access to help content without leaving the application. + +![Docs browser with table of contents](/assets/screenshots/docs-browser_toc.png) + +The browser supports full-text search across all documentation: + +![Searching the docs browser](/assets/screenshots/docs-browser_search.png) + +Individual doc pages render with full formatting: + +![A documentation page](/assets/screenshots/docs-browser_page.png) + +## Building from Source + +```bash +git clone https://github.com/meshtastic/Meshtastic-Android.git +cd Meshtastic-Android +git submodule update --init +./gradlew :desktopApp:run +``` + +Requirements: + +- JDK 21 +- No Android SDK required for desktop-only builds + +## Known Limitations + +- No OTA firmware updates (use web flasher) +- Some Android-specific features (widgets, specific notification channels) are unavailable +- Performance may vary on low-spec hardware running Compose Desktop +- BLE bonding is not yet supported on desktop (pairing works without bonding) + +## Related Topics + +- [Connections](connections) — connection methods overview +- [Firmware Updates](firmware) — use the [Web Flasher](https://flasher.meshtastic.org) for desktop firmware updates + +--- + diff --git a/docs/iw-rIL/user/discovery.md b/docs/iw-rIL/user/discovery.md new file mode 100644 index 000000000..e56066d7a --- /dev/null +++ b/docs/iw-rIL/user/discovery.md @@ -0,0 +1,114 @@ +--- +title: Discovery +nav_order: 12 +last_updated: 2026-05-13 +description: Explore your mesh network — traceroute paths, neighbor maps, and node discovery tools. +aliases: + - mesh-discovery + - local-discovery + - network-scan + - traceroute + - neighbor-info +--- + +# Discovery + +Discovery tools help you understand **how** your mesh network is connected — which nodes can hear each other, what paths messages take, and where bottlenecks or weak links exist. + +> 💡 **Tip:** You don't need a dedicated "discovery mode" to start exploring your mesh. The tools below are available right now from the node list and node detail screens. + +--- + +## בדיקת מסלול + +Traceroute reveals the exact path a message takes from your node to any other node on the mesh. It's the single most useful tool for debugging connectivity problems. + +### Running a Traceroute + +1. Navigate to **Nodes** and tap the node you want to trace. +2. On the node detail screen, tap **Traceroute**. +3. The app sends a traceroute request and waits for the response. +4. Results display each hop in order, with signal quality at every step. + +### Reading the Results + +A traceroute result looks like this: + +``` +You → Node A (SNR: 8.5, RSSI: -95) → Node B (SNR: 5.2, RSSI: -108) → Target +``` + +Each hop represents a relay node that forwarded the message. The SNR and RSSI values at each hop tell you about the link quality on that specific segment. + +| What to look for | What it means | +| -------------------------------------------------------------------------- | --------------------------------------------------------------------------- | +| All hops show Good SNR (> 5 dB) | Healthy path — messages flow reliably | +| One hop shows Bad SNR (< 0 dB) | Weak link — this relay segment is fragile | +| Many hops (4+) | Long path — consider repositioning a node to shorten it | +| Different path on retry | Mesh is adapting — multiple routes exist (this is good!) | + +> 💡 **Tip:** Run traceroute several times over a few minutes. If the path changes, your mesh has redundant routes — a sign of a well-connected network. + +### Troubleshooting with Traceroute + +- **"No route found"** — The target node may be offline, out of range, or on a different channel. Check that both nodes share at least one channel with the same encryption key. +- **Traceroute times out** — The path may be too long (exceeds hop limit) or a relay node is congested. Try increasing the hop limit in **Settings → LoRa Config**. +- **Asymmetric paths** — A traceroute from A→B may take a different path than B→A. This is normal — radio propagation is not always symmetric. + +--- + +## Neighbor Info + +The Neighbor Info module lets each node broadcast a list of the nodes it can **directly hear** (single-hop). When multiple nodes share their neighbor lists, you can piece together a topology map of the entire mesh. + +### Enabling Neighbor Info + +1. Navigate to **Settings → Module Config → Neighbor Info**. +2. Enable the module. +3. Set the broadcast interval (default: 900 seconds / 15 minutes). + +Once enabled, your node periodically broadcasts its neighbor table. Other nodes with Neighbor Info enabled do the same. + +### Viewing Neighbor Data + +- Open any node's detail screen and look for the **Neighbors** section. +- Each neighbor entry shows the node that was directly heard and its signal quality. +- Combine neighbor data from multiple nodes to understand the full mesh topology. + +> ⚠️ **Note:** Neighbor Info increases airtime usage because every enabled node periodically broadcasts its neighbor list. On busy meshes with many nodes, consider longer broadcast intervals (3600 seconds or more) to avoid congestion. + +--- + +## Node List as a Discovery Tool + +The node list itself is a powerful discovery tool when you use its filtering and sorting features effectively. + +### Finding New Nodes + +- Sort by **Last heard** to see the most recently active nodes at the top. +- Enable **Include unknown** to see nodes that have appeared on the mesh but haven't sent user info yet — these are often newly powered-on devices. + +### Assessing Connectivity + +- Sort by **Hops away** to see which nodes are directly reachable (0 hops) versus relayed. +- Sort by **Distance** to find nearby nodes and verify they're reachable. +- Use **Exclude MQTT** to focus on nodes reachable over radio (not via internet bridge). + +### Infrastructure Audit + +- Disable **Exclude infrastructure** to see Router, Repeater, Router Late, and Client Base nodes. +- Check their signal quality and last-heard times to verify your infrastructure nodes are healthy. + +See [Nodes](nodes) for full details on filtering and sorting options. + +--- + +## Tips for Mesh Exploration + +- **Start with traceroute** — it gives you immediate, actionable information about a specific path. +- **Enable Neighbor Info on key nodes** — especially routers and repeaters, to build a picture of the backbone. +- **Check the map** — node positions on the [Map](map-and-waypoints) combined with signal data help you understand why some links are strong and others are weak. +- **Compare signal over time** — use the [Signal Meter](signal-meter) guide to interpret SNR and RSSI values correctly. + +--- + diff --git a/docs/iw-rIL/user/firmware.md b/docs/iw-rIL/user/firmware.md new file mode 100644 index 000000000..de781e08a --- /dev/null +++ b/docs/iw-rIL/user/firmware.md @@ -0,0 +1,114 @@ +--- +title: Firmware Updates +nav_order: 13 +last_updated: 2026-05-13 +description: Update your radio firmware over Bluetooth — OTA process, version channels, pre-flight checks, and recovery. +aliases: + - firmware + - update + - ota + - flash +--- + +# Firmware Updates + +Keep your Meshtastic radio up to date with the latest firmware for new features, bug fixes, and security improvements. + +## Checking for Updates + +1. Navigate to **Settings → Firmware Update** or tap the firmware notification if shown. +2. The app checks for available firmware versions. +3. Available updates show the version number and changelog summary. + +## Update Methods + +### OTA (Over-The-Air) via Bluetooth + +The most common update method for Android users: + +1. Ensure your radio is connected via Bluetooth. +2. Navigate to the Firmware Update screen. +3. Select the desired firmware version. +4. Tap **Update** to begin the OTA process. +5. Wait for the update to complete — **do not disconnect** during the update. + +![Firmware checking for updates](/assets/screenshots/firmware_checking.png) + +> ⚠️ **Warning:** Interrupting a firmware update can brick your device. Ensure your radio has sufficient battery (>50% recommended) and maintain Bluetooth proximity during the entire process. + +![Firmware disclaimer](/assets/screenshots/firmware_disclaimer.png) + +### USB Flashing + +For recovery or when OTA is unavailable: + +- Use the [Meshtastic Web Flasher](https://flasher.meshtastic.org) +- Or the [Meshtastic CLI tool](https://meshtastic.org/docs/getting-started/flashing-firmware) on desktop + +## Version Channels + +| ערוץ | תיאור | +| ------ | ------------------------------------------- | +| Stable | Recommended for most users; tested releases | +| Alpha | Preview releases; may contain bugs | + +## Pre-Update Checklist + +Before updating: + +- [ ] Battery > 50% +- [ ] Stable Bluetooth connection +- [ ] Note your current settings (they may reset on major version changes) +- [ ] Check the release notes for breaking changes + +## Post-Update + +After a successful update: + +- The radio will reboot automatically +- Bluetooth connection will re-establish +- Verify your settings are intact +- Check the firmware version in **Settings → About** + +![Firmware update success](/assets/screenshots/firmware_success.png) + +## Troubleshooting + +### Update Stuck + +If the update appears frozen: + +- Wait at least 5 minutes before intervening +- If truly stuck, power-cycle the radio +- Attempt the update again + +![Firmware update error](/assets/screenshots/firmware_error.png) + +### Device Won't Boot After Update + +If your device fails to boot: + +1. Try connecting via USB to a computer +2. Use the web flasher in recovery/DFU mode +3. Flash a known-good firmware version +4. Check the Meshtastic Discord for device-specific recovery steps + +### Compatibility Warnings + +The app may show warnings when: + +- Connected radio firmware is below minimum supported version +- Major version mismatch between app and firmware +- Deprecated features need migration + +> ⚠️ **Important:** Always update the Meshtastic app before or alongside firmware updates to ensure compatibility. + +## Related Topics + +- [Connections](connections) — reconnecting after a firmware update +- [Flashing firmware guide](https://meshtastic.org/docs/getting-started/flashing-firmware) — full firmware flashing walkthrough on meshtastic.org +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — check firmware compatibility by device +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/iw-rIL/user/map-and-waypoints.md b/docs/iw-rIL/user/map-and-waypoints.md new file mode 100644 index 000000000..755da6636 --- /dev/null +++ b/docs/iw-rIL/user/map-and-waypoints.md @@ -0,0 +1,116 @@ +--- +title: Map & Waypoints +nav_order: 6 +last_updated: 2026-05-13 +description: View node positions on the map, create and share waypoints, and manage position sharing and privacy. +aliases: + - map + - waypoints + - gps + - location +--- + +# Map & Waypoints + +The Map screen shows the geographic positions of nodes on your mesh, along with shared waypoints. + +## Map View + +The map displays: + +- **Node positions** — colored markers for each node reporting location +- **Waypoints** — shared points of interest +- **Your position** — your current GPS location + +### Node Markers + +Node markers on the map indicate: + +| Color | Meaning | +| ------ | ---------------------------------------------- | +| Green | Online (heard recently) | +| Yellow | Away (heard within 2 hours) | +| Gray | Offline (stale position) | +| Blue | Your own node | + +### Map Controls + +- **Zoom** — pinch or use +/- buttons +- **Pan** — drag to explore +- **Center** — select the location button to center on your position +- **Node tap** — tap a node marker to view details + +The floating toolbar provides quick access to compass, layer switching, node filters, refresh, and location tracking. Tap the compass to reorient north-up, or tap the location button to center on your current position. + +![Map controls overlay](/assets/screenshots/map_controls_overlay.png) + +## Waypoints + +Waypoints are shared geographic points of interest that all mesh members can see. + +### Creating a Waypoint + +1. Long-press on the map at the desired location. +2. Enter a name and optional description. +3. Choose an icon/emoji for the waypoint. +4. Tap **Send** to share with the mesh. + +### Waypoint Properties + +| Property | תיאור | +| ---------- | ------------------------------------------------------- | +| שם | Short identifier (max 30 characters) | +| תיאור | Optional longer description | +| Icon | Visual marker emoji on the map | +| נעול | If locked, only the creator can edit or delete | +| Expiration | Optional auto-remove time | + +### Waypoint Expiration + +Waypoints can be set to expire automatically: + +- **Never** (default) — waypoint remains until manually deleted +- **Timed** — waypoint is automatically removed after the specified duration (e.g., "remove after 2 hours"). Useful for temporary markers like rally points, hazards, or meeting locations. + +Expired waypoints are automatically hidden from the map so they don't clutter the display. The expiration countdown begins when the waypoint is created, not when other nodes receive it. + +### Managing Waypoints + +- Tap a waypoint on the map to view its details and coordinates +- Edit or delete waypoints you created +- **Locked waypoints** cannot be modified or deleted by other nodes — only the original creator can change them +- Unlocked waypoints can be edited by any mesh member + +## Position Sharing + +### Enabling Position Sharing + +Your node shares its GPS position based on: + +- **Fixed interval** — broadcast position at regular intervals +- **Smart position** — broadcast when movement exceeds a threshold +- **Manual** — only share when explicitly requested + +Configure position behavior in **Settings → Position**. + +### Privacy Considerations + +> 🔒 **Privacy:** Position data is broadcast to all nodes on your channel. If you don't want your location shared, disable GPS position in settings or use a fixed/fake position. + +## Map Sources + +The app supports multiple map tile sources: + +- OpenStreetMap (default) +- Satellite imagery (where available) +- Offline tiles (download map areas for offline use) + +## Related Topics + +- [Nodes](nodes) — view and filter your node list +- [Node Metrics](node-metrics) — signal quality and position history for individual nodes +- [Discovery](discovery) — traceroute and neighbor info for understanding mesh topology +- [Units & Locale](units-and-locale) — distance and coordinate display formats + +--- + diff --git a/docs/iw-rIL/user/messages-and-channels.md b/docs/iw-rIL/user/messages-and-channels.md new file mode 100644 index 000000000..241b1625c --- /dev/null +++ b/docs/iw-rIL/user/messages-and-channels.md @@ -0,0 +1,159 @@ +--- +title: Messages & Channels +nav_order: 3 +last_updated: 2026-05-13 +description: Send and receive messages, manage channels, configure encryption, and use quick chat, reactions, and message actions. +aliases: + - channels + - direct-messages + - messaging + - conversations +--- + +# Messages & Channels + +Meshtastic supports two communication modes: **channel broadcasts** and **direct messages**. + +## Channels + +Channels are shared communication groups. All nodes configured with the same channel key can read and send messages on that channel. + +### Default Channel + +Every Meshtastic device comes with a default **LongFast** channel. This is an unencrypted channel used for general mesh communication. + +### Channel Security + +Channels support multiple encryption levels: + +| Icon | Security Level | תיאור | +| ---- | ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------- | +| 🔒 | PSK (256-bit AES) | Fully encrypted with a strong pre-shared key. Only nodes with the matching key can read messages. | +| 🔐 | PSK (128-bit AES) | Encrypted with a shorter key. Secure for most uses but 256-bit is preferred for sensitive data. | +| 🔓 | Default / Open | Uses the well-known default key. **Any Meshtastic device** on the same preset can read these messages. | +| ⚠️ | Insecure + Position | Open channel that also broadcasts your GPS position. Use with caution in public meshes. | + +> 🔒 **Security Tip:** 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. + +### Adding a Channel + +1. Navigate to **Settings → Channels**. +2. Tap **Add Channel** or scan a QR code. +3. Configure the channel name and encryption key. +4. Share the channel URL/QR code with others who need access. + +Tapping a channel shows its details and sharing options. + +## Direct Messages + +Direct messages (DMs) are point-to-point encrypted communications between two specific nodes. + +### Sending a Direct Message + +1. Open the **Messages** tab. +2. Select a node from your contacts list or tap a node in the node list. +3. Type your message and tap **Send**. + +### Message States + +| State | Icon | Meaning | +| --------------------------------- | ---- | ----------------------------------------------------------------------------------------------------------------- | +| Queued | ⏳ | Message waiting to be sent | +| En route | ✓ | Delivered to the radio, awaiting acknowledgment | +| Delivered | ✓✓ | Acknowledgment received from recipient | +| Received | ✓ | Message received from the mesh (incoming) | +| S&F Routing | 🔗 | Store & Forward: message being routed through an S&F node | +| S&F Confirmed | 🔗 | Store & Forward: delivery confirmed via S&F node | +| שגיאה | ✗ | Delivery failed after retries | + +### Delivery Errors + +When a message fails to deliver, the error indicator shows what went wrong: + +| שגיאה | Meaning | What to Do | +| ---------------- | ---------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| No Route | No path exists to the destination node | The recipient may be offline or out of mesh range. Try later or move closer. | +| Got NAK | The next-hop node refused to relay | The relay node may be congested. Wait and retry. | +| Timeout | No acknowledgment within retry window | The recipient may be just out of range. Try increasing hop limit or moving to a better position. | +| No Interface | No radio interface available to send | Check that your radio is connected and the channel is configured. | +| Max Retransmit | All retry attempts exhausted | The mesh path is unreliable. Try a different channel or wait for conditions to improve. | +| No Channel | The destination channel doesn't exist | Verify both nodes share the same channel configuration. | +| Too Large | Message exceeds maximum payload size | Shorten your message (max ~230 characters). | +| No Response | Node received message but didn't respond | The recipient's radio may be busy or in low-power sleep mode. | +| Duty Cycle Limit | Regional airtime limit reached | Your radio has used its allowed transmit time. Wait for the duty cycle window to reset (typically 1 hour in EU regions). | +| Bad Request | Malformed or invalid message | This usually indicates a software bug. Try restarting the app. | + +> 💡 **Tip:** 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. + +## Message Features + +### Quick Chat + +Pre-configured messages for rapid communication: + +- Access via the Quick Chat button in the message input area +- Choose from built-in phrases or custom messages +- Customize quick chat messages in **Settings → Quick Chat** +- Useful when typing is impractical (gloves, small screen, urgent) + +![Quick chat option](/assets/screenshots/messages_quick_chat.png) + +The channel list shows each channel with its latest message preview. + +### Message Bubbles + +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. + +### Reactions + +React to messages with emoji: + +- **Long-press** a message to open the actions menu +- Tap **Add Reaction** to choose an emoji +- Reactions appear below the message bubble +- Multiple users can react to the same message +- React to your own messages or others' messages + +![Emoji reaction badges displayed beneath a message](/assets/screenshots/messages_reaction.png) + +> 💡 **Tip:** Reactions are lightweight — they use minimal mesh bandwidth compared to full text messages. + +### Message Actions + +Long-press any message to access: + +- **Copy** — copy message text to clipboard +- **Reply** — quote the message in your response +- **React** — add an emoji reaction +- **Delete** — remove a message you sent (local deletion) + +### Message Priority + +Messages are queued and transmitted based on priority: + +1. Emergency/alert messages (highest) +2. Direct messages +3. Channel broadcasts (lowest) + +### Message Limits + +- **Maximum length:** 237 bytes (approximately 230 characters for ASCII text) +- **Rate limiting:** The mesh enforces airtime fairness; heavy message volume may be throttled +- **Delivery:** Messages are retried automatically if no acknowledgment is received + +## Best Practices + +- Use channels for group coordination +- Use direct messages for private person-to-person communication +- Keep messages short — mesh bandwidth is limited +- Configure encryption for sensitive communications + +## Related Topics + +- [Nodes](nodes) — tap a node to start a direct message +- [Settings — Radio & User](settings-radio-user) — configure channel encryption and presets +- [MQTT](mqtt) — bridge channel messages to the internet +- [Channel configuration](https://meshtastic.org/docs/configuration/radio/channels) — detailed channel settings on meshtastic.org + +--- + diff --git a/docs/iw-rIL/user/mqtt.md b/docs/iw-rIL/user/mqtt.md new file mode 100644 index 000000000..ced03953c --- /dev/null +++ b/docs/iw-rIL/user/mqtt.md @@ -0,0 +1,137 @@ +--- +title: MQTT +nav_order: 11 +last_updated: 2026-05-13 +description: Bridge your mesh to the internet — MQTT broker setup, encryption layers, and map reporting. +aliases: + - mqtt + - internet-bridge + - broker +--- + +# MQTT + +MQTT bridges your Meshtastic mesh network to the internet, enabling long-range communication beyond radio range. + +## Overview + +The MQTT module connects your node to an MQTT broker, allowing: + +- Messages to reach nodes on different physical meshes via the internet +- Integration with home automation and monitoring systems +- Publishing node positions to the public Meshtastic map +- Custom data pipelines for logging and alerting + +## How It Works + +``` +[Your Node] → Radio → [Gateway Node with WiFi] → MQTT Broker → [Remote Gateway] → Radio → [Remote Node] +``` + +A gateway node with internet access (WiFi or Ethernet) publishes mesh messages to an MQTT topic. Remote gateways subscribed to the same topic inject those messages into their local mesh. + +## Configuration + +### Enabling MQTT + +1. Navigate to **Settings → Module Config → MQTT**. +2. Enable the MQTT module. +3. Configure the broker connection: + +![MQTT toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | תיאור | Default | +| --------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------- | +| Server Address | MQTT broker hostname | mqtt.meshtastic.org | +| Username | Broker authentication | meshdev | +| Password | Broker authentication | large4cats | +| Root Topic | Base topic for messages | msh | +| Encryption | Encrypt MQTT payload | Enabled | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON packet support has been removed from firmware; this field is ignored | Disabled | +| TLS | Secure connection to broker | Disabled | +| Map Reporting | Report position to public map | Disabled | + +### Default Meshtastic Broker + +The community maintains a public broker at `mqtt.meshtastic.org`. This is intended for general use and testing. + +> 🔒 **Privacy:** Messages on the public broker are readable by anyone subscribed. Always use channel encryption for private communications. + +### Private Broker + +For better privacy and control, you can run your own MQTT broker: + +- Mosquitto (lightweight, open-source) +- HiveMQ +- EMQX + +Configure your node to point to your private broker with appropriate credentials. + +## Map Reporting + +When Map Reporting is enabled, your node publishes its position to the Meshtastic community map: + +- Visible at [meshmap.net](https://meshmap.net) and similar community map services +- Only position and node info are shared +- Disable this if you don't want your location publicly visible + +## Uplink vs Downlink + +| Direction | תיאור | +| ------------ | -------------------------------- | +| **Uplink** | Messages from mesh → MQTT broker | +| **Downlink** | Messages from MQTT broker → mesh | + +Configure per-channel which directions are active to control message flow and airtime usage. + +## Message Formats + +MQTT uses protobuf message format: + +| Format | תיאור | Use case | +| ------------ | ----------------------------------- | -------------------------- | +| **Protobuf** | Binary Meshtastic protobuf encoding | Node-to-node mesh bridging | + +> ⚠️ **Note:** JSON output support was removed from firmware. The `json_enabled` setting is still visible in the app for legacy compatibility but has no effect on current firmware versions. + +## Encryption & Privacy + +Understanding the layered encryption model: + +1. **Channel encryption** happens on the mesh _before_ MQTT. If your channel has a PSK, the MQTT payload is already encrypted — the broker and any subscribers see only the ciphertext. +2. **MQTT encryption** (the module setting) adds an additional encryption layer for transit to the broker. This protects metadata and routing information. +3. **TLS** encrypts the TCP connection to the broker itself, preventing network-level eavesdropping. + +> 🔒 **Important:** The default public channel has a well-known key. Messages on the default channel sent via MQTT are effectively **unencrypted** — anyone can decode them. Always use a custom PSK for private communications. + +## Best Practices + +- Use channel-level encryption (PSK) on channels that bridge to MQTT +- Don't enable MQTT on nodes without internet access (it will buffer and waste memory) +- Use a private broker for sensitive deployments +- Be mindful of airtime when downlinking messages from busy MQTT topics — every downlinked message consumes radio airtime on your local mesh +- Consider enabling uplink-only if you only need to monitor your mesh remotely without injecting messages back + +## Troubleshooting + +### MQTT Not Connecting + +- **Check WiFi** — the gateway node must have an active internet connection (WiFi or Ethernet). MQTT does not work over the LoRa radio link itself. +- **Verify credentials** — incorrect username or password will silently fail on most brokers. Double-check for trailing spaces. +- **Firewall** — port 1883 (MQTT) or 8883 (MQTT+TLS) must be open. Some networks block non-standard ports. +- **DNS resolution** — if using a custom broker hostname, verify the node can resolve it. Try the broker's IP address directly. + +### Messages Not Bridging + +- **Check uplink/downlink settings** — if only uplink is enabled, messages flow from mesh to MQTT but not back. Enable downlink on the receiving gateway. +- **Channel mismatch** — both gateways must share the same channel with the same PSK. A mismatch means messages are encrypted with different keys and appear as garbage. +- **Topic mismatch** — ensure both gateways use the same root topic. The default `msh` works for the public broker. + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — MQTT module configuration reference +- [Messages & Channels](messages-and-channels) — channel encryption and PSK setup +- [MQTT integration guide](https://meshtastic.org/docs/software/integrations/mqtt) — detailed MQTT documentation on meshtastic.org + +--- + diff --git a/docs/iw-rIL/user/node-metrics.md b/docs/iw-rIL/user/node-metrics.md new file mode 100644 index 000000000..44d643dd9 --- /dev/null +++ b/docs/iw-rIL/user/node-metrics.md @@ -0,0 +1,130 @@ +--- +title: Node Metrics +nav_order: 5 +last_updated: 2026-05-13 +description: Telemetry dashboards for each mesh node — device health, environment sensors, signal quality, power, traceroute, and position history. +aliases: + - metrics + - telemetry + - device-metrics + - signal +--- + +# Node Metrics + +The node detail screen provides comprehensive telemetry and metrics for each node on your mesh. + +## Device Metrics + +Basic operating information reported by each node: + +| Metric | תיאור | +| ------------------- | ----------------------------------- | +| Battery Level | Current battery percentage | +| Voltage | Battery voltage reading | +| Channel Utilization | Percentage of airtime consumed | +| Airtime | Transmission time used by this node | +| Uptime | Time since last reboot | + +Device metrics are displayed as individual cards with trend sparklines showing battery level, voltage, channel utilization, airtime, and uptime over time. + +> 💡 **Tip:** Tap any metric card to expand it into a full chart with historical data points. Pinch to zoom the time axis. + +## Environment Metrics + +Environmental sensor data (requires compatible hardware): + +| Metric | Sensor Examples | +| ------------------------------------ | --------------------- | +| Temperature | BME280, BME680, SHT31 | +| Humidity | BME280, BME680, SHT31 | +| Barometric Pressure | BME280, BMP280 | +| Gas Resistance | BME680 | +| IAQ (Air Quality) | BME680 | + +Environment metrics are charted over time for easy trend analysis — temperature, humidity, and pressure each get their own line chart with the measurement unit displayed on the Y axis. + +> 💡 **Tip:** Environment metrics require a sensor connected to the remote node. Not all nodes report environmental data. See [Telemetry & Sensors](telemetry-and-sensors) for a full list of supported sensors. + +## Signal Metrics + +Radio signal quality information: + +| Metric | תיאור | +| --------- | ----------------------------------------------------------------------------- | +| SNR | Signal-to-Noise Ratio (higher is better) | +| RSSI | Received Signal Strength Indicator (closer to 0 is better) | +| Hop Count | Number of mesh hops for last message | + +### Signal Quality Reference + +| SNR Range | Quality | +| --------------------------------- | --------- | +| > 10 dB | Excellent | +| 0 to 10 dB | Good | +| -10 to 0 dB | Fair | +| < -10 dB | Poor | + +## Power Metrics + +Power management telemetry (requires INA sensor or compatible hardware): + +| Metric | תיאור | +| ----------- | ----------------------- | +| Bus Voltage | Supply voltage | +| Current | Power draw in milliamps | +| Power | Calculated wattage | + +## בדיקת מסלול + +Traceroute shows the path a message takes through the mesh: + +1. From the node detail screen, tap **Traceroute**. +2. The app sends a traceroute request to the target node. +3. Results show each hop with SNR/RSSI values. + +### Reading Traceroute Results + +``` +You → Node A (SNR: 8.5) → Node B (SNR: 5.2) → Target +``` + +Each hop represents a relay node that forwarded the message. + +## Position Log + +Historical position data for nodes that share their location: + +- GPS coordinates +- Altitude +- Speed (if moving) +- Timestamp for each position report + +## Neighbor Info + +Shows which nodes a given node can directly hear, useful for understanding mesh topology. + +## Viewing Metrics + +1. Navigate to **Nodes**. +2. Tap the node you want to inspect. +3. Select the metric category from the detail tabs. + +![Node detail — local device](/assets/screenshots/nodes_detail_local.png) + +The position tab shows location data for nodes that share GPS: + +![Position inline content](/assets/screenshots/nodes_position.png) + +> ⚠️ **Note:** Metrics are only available when they have been reported by the remote node. Metrics update at intervals configured on each node's telemetry settings. + +## Related Topics + +- [Nodes](nodes) — node list, filtering, and sorting +- [Telemetry & Sensors](telemetry-and-sensors) — supported sensors and configuration +- [Signal Meter](signal-meter) — how signal quality is calculated from SNR and RSSI +- [Discovery](discovery) — traceroute details and neighbor info +- [Units & Locale](units-and-locale) — temperature, distance, and speed display formats + +--- + diff --git a/docs/iw-rIL/user/nodes.md b/docs/iw-rIL/user/nodes.md new file mode 100644 index 000000000..034c982a7 --- /dev/null +++ b/docs/iw-rIL/user/nodes.md @@ -0,0 +1,152 @@ +--- +title: Nodes +nav_order: 4 +last_updated: 2026-05-13 +description: Browse, filter, and sort mesh nodes — view details, signal quality, roles, and quick actions. +aliases: + - node-list + - mesh-nodes + - peers +--- + +# Nodes + +The Nodes screen displays all devices visible on your mesh network. + +## Node List + +The node list shows every node your radio has heard, including: + +- **Node name** — user-configured long name +- **Short name** — 4-character identifier +- **Signal quality** — last heard signal strength +- **Last heard** — time since last communication +- **Distance** — estimated distance (if positions are shared) +- **Battery** — remote node battery level (if telemetry is enabled) + +### Node Status Indicators + +| Badge | Meaning | +| ---------- | ------------------------------------- | +| 🟢 Online | Node heard within the last 15 minutes | +| 🟡 Away | Node heard within the last 2 hours | +| 🔴 Offline | Node not heard for over 2 hours | +| ⭐ Favorite | Node marked as favorite by the user | + +### Node Roles + +Nodes can be configured with different roles that affect their mesh behavior: + +| Role | תיאור | +| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Client | Standard end-user device | +| Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | +| Client Mute | Receives but doesn't retransmit | +| Client Hidden | Like Client Mute, plus hides from node list | +| Router | Prioritizes message forwarding; stays awake to relay | +| Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | +| ~~Router Client~~ | ⚠️ **Deprecated** (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | +| ~~Repeater~~ | ⚠️ **Deprecated** (removed in firmware 2.7.11) — no longer selectable; use Router instead | +| Tracker | Optimized for position reporting at regular intervals | +| Sensor | Optimized for telemetry reporting | +| TAK | Interoperates with TAK systems (sends/receives CoT) | +| TAK Tracker | TAK position reporting only | +| Lost & Found | Continuous position beacon for recovery | + +### Choosing a Role + +Most users should keep the default **Client** role. Consider a different role when: + +- **Router** — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don't use Router on battery-powered handheld devices. +- **Router Late** — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. +- **Client Base** — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. +- **Client Mute** — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only devices or to reduce congestion in dense areas. +- **Tracker** — An unattended device whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. +- **Sensor** — An unattended device reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. +- **TAK / TAK Tracker** — Only needed if interoperating with ATAK/WinTAK systems. See [TAK Integration](tak) for details. + +> 💡 **Tip:** The mesh works best when most nodes are **Client** or **Router**. Too many Mute nodes reduces mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. + +### Encryption Indicators + +Nodes display encryption status icons next to their name: + +| Icon | Meaning | +| ----------- | ------------------------------------------------------------------------------------------------------------------- | +| 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | +| 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | +| ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) | + +> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. + +## Quick Actions + +From the node list, you can: + +- **Tap** a node to view its detail page +- **Long-press** for quick actions: + - Send a direct message + - View on map + - בקש מיקום + - Mark as favorite + - בדיקת מסלול + +## Filtering & Sorting + +### Text Search + +Type in the search field to filter nodes by name or short name. The filter updates in real time as you type. + +### Filter Toggles + +| פילטר | תיאור | +| -------------------------- | ---------------------------------------------------------------------------------------------- | +| **Only online** | Show only nodes heard within the last 15 minutes | +| **Only direct** | Show only nodes with direct (non-relayed) connections | +| **Include unknown** | Show nodes that haven't sent user info yet | +| **Exclude infrastructure** | Hide infrastructure-role nodes (Router, Repeater, Router Late, Client Base) | +| **Exclude MQTT** | Hide nodes heard only via MQTT internet bridge | +| **Show ignored** | Show nodes you've previously dismissed or muted | + +### Sort Options + +| Sort | תיאור | +| ------------------------------------------- | ------------------------------------------------------------------ | +| **Last heard** (default) | Most recently heard nodes first | +| **Alphabetical** | Sorted by node long name | +| **Distance** | Nearest nodes first (requires position sharing) | +| **Hops away** | Fewest relay hops first | +| **Channel** | Grouped by channel index | +| **Via MQTT** | Grouped by MQTT vs. radio-heard | +| **Favorites** | Favorited nodes first | + +## Node Detail + +Tapping a node opens the detail view with comprehensive information. See [Node Metrics](node-metrics) for full details on metrics and telemetry. + +![Node detail view](/assets/screenshots/nodes_node_list.png) + +The detail screen includes device info, position, and action buttons: + +![Node detail section](/assets/screenshots/nodes_detail_section.png) + +Inline status indicators show key metrics at a glance: + +| Indicator | Screenshot | +| -------------- | -------------------------------------------------------- | +| Signal quality | ![Signal](/assets/screenshots/nodes_signal_info.png) | +| Battery level | ![Battery](/assets/screenshots/nodes_battery_info.png) | +| Hop count | ![Hops](/assets/screenshots/nodes_hops_info.png) | +| Last heard | ![Last heard](/assets/screenshots/nodes_last_heard.png) | +| מרחק | ![Distance](/assets/screenshots/nodes_distance_info.png) | + +## Related Topics + +- [Node Metrics](node-metrics) — detailed telemetry dashboards for each node +- [Messages & Channels](messages-and-channels) — send a direct message to a node +- [Map & Waypoints](map-and-waypoints) — view node positions geographically +- [Discovery](discovery) — traceroute and neighbor info for topology exploration +- [Signal Meter](signal-meter) — understand what the signal bars mean + +--- + diff --git a/docs/iw-rIL/user/onboarding.md b/docs/iw-rIL/user/onboarding.md new file mode 100644 index 000000000..3b910534e --- /dev/null +++ b/docs/iw-rIL/user/onboarding.md @@ -0,0 +1,99 @@ +--- +title: Getting Started +nav_order: 1 +last_updated: 2026-05-13 +description: First-launch setup — permissions, onboarding flow, and next steps after connecting your radio. +aliases: + - first-launch + - setup + - intro +--- + +# Getting Started + +Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app. + +## First Launch + +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. + +### Welcome Screen + +The welcome screen introduces Meshtastic and its core capabilities: + +- Off-grid mesh communication +- No cellular or internet required +- End-to-end encrypted messaging + +Tap **Get Started** to proceed through the setup flow. + +![Welcome screen](/assets/screenshots/onboarding_welcome.png) + +## Permissions + +The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. + +### Bluetooth Permission + +Bluetooth is the primary connection method between your phone and Meshtastic radio: + +- **Bluetooth scanning** — discover nearby Meshtastic radios +- **Bluetooth connect** — establish and maintain connections with paired radios + +Grant both permissions when prompted. Without Bluetooth, you'll need to use USB or TCP connections instead. + +### Location Permission + +> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. + +Meshtastic also uses your location for: + +- Showing your position on the mesh map +- Calculating distances to other nodes +- Sharing your GPS coordinates with other mesh members (if enabled) + +Grant **"While using the app"** or **"Always"** depending on your preference: + +- **While using the app** — position updates only when the app is open +- **Always** — enables background position updates for always-on mesh presence + +If denied, Bluetooth scanning will not function and your node will not report a position. + +### Notifications Permission + +Notifications alert you to: + +- Incoming messages from channels and direct messages +- Connection status changes (connected, disconnected, reconnecting) +- Firmware update availability + +> 💡 **Tip:** You can fine-tune notification preferences later in Android system settings. The app creates separate notification channels for messages, connection events, and background service status. + +### Critical Alerts Permission + +On supported devices, the app may request permission for critical alerts: + +- These are high-priority notifications that can break through Do Not Disturb mode +- Useful for emergency mesh alerts or urgent messages +- You can **skip** this step if you don't need breakthrough notifications +- Configure or revoke later in Android notification settings + +## After Setup + +Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. + +> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. + +## What's Next? + +Once connected to a radio, explore: + +- [Connections](connections) — pair your first radio device +- [Messages & Channels](messages-and-channels) — send your first message +- [Nodes](nodes) — see who's on your mesh +- [Map & Waypoints](map-and-waypoints) — view node positions +- [Settings](settings-radio-user) — configure your radio and user profile + +New to Meshtastic? The [getting started guide](https://meshtastic.org/docs/getting-started) on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup. + +--- diff --git a/docs/iw-rIL/user/settings-module-admin.md b/docs/iw-rIL/user/settings-module-admin.md new file mode 100644 index 000000000..5d8c599cd --- /dev/null +++ b/docs/iw-rIL/user/settings-module-admin.md @@ -0,0 +1,246 @@ +--- +title: Settings — Modules & Admin +nav_order: 8 +last_updated: 2026-05-13 +description: Configure optional feature modules (MQTT, telemetry, canned messages, TAK, and more) and perform device administration. +aliases: + - modules + - module-config + - administration +--- + +# Settings — Modules & Admin + +Configure optional feature modules and perform device administration. Modules extend Meshtastic with specialized capabilities — each can be independently enabled or disabled. + +> 💡 **Tip:** You only need to enable the modules you actually use. Disabling unused modules reduces airtime, saves battery, and simplifies your configuration. + +Module settings use a card-based layout with toggle switches, dropdowns, text fields, and sliders: + +![Toggle switch](/assets/screenshots/settings_switch.png) + +![Dropdown selector](/assets/screenshots/settings_dropdown.png) + +![Text field](/assets/screenshots/settings_text_field.png) + +![Settings card layout](/assets/screenshots/settings_titled_card.png) + +## Module Configuration + +### MQTT Module + +Bridges mesh messages to and from an MQTT broker for internet connectivity. This is how you extend your mesh beyond radio range or integrate with home automation systems. + +| Setting | תיאור | +| --------------- | ------------------------------------------------------------------------ | +| Enabled | Toggle MQTT bridge | +| Server | MQTT broker address | +| Username | Authentication username | +| Password | Authentication password | +| Encryption | Encrypt MQTT payloads | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON support removed from firmware; field is ignored | +| TLS | Use secure connection | +| Root Topic | Base MQTT topic path | +| Map Report | Publish position for public map | + +See [MQTT](mqtt) for a detailed usage guide including encryption, privacy, and broker setup. + +### Serial Module + +Enables serial port communication for external device integrations (GPS modules, sensors, or custom hardware). When enabled, the node's serial port can send and receive protobuf or text data, allowing external microcontrollers or computers to interact with the mesh. + +| Setting | תיאור | +| ---------- | ------------------------------- | +| Enabled | Activate serial communication | +| Echo | Echo received serial data back | +| Mode | Text, Protobuf, or NMEA output | +| RX/TX Pins | GPIO pins for serial connection | +| Baud Rate | Serial communication speed | + +### External Notification Module + +Controls buzzer, LED, or vibration alerts on your radio hardware. Useful for devices that need to physically signal when a message arrives — particularly helpful for unattended or outdoor installations. + +| Setting | תיאור | +| -------------------------------- | --------------------------- | +| Enabled | Activate notifications | +| Alert Message | Notify on incoming messages | +| Alert Message Buzzer | Use buzzer for messages | +| Alert Message Vibra | Use vibration for messages | +| Alert Bell | Notify on bell character | +| Output (GPIO) | Pin for notification output | +| Active | High or Low active | +| Duration (ms) | Notification length | +| Use I2S as Buzzer | Use I2S audio output | + +### Store & Forward Module + +Buffers messages for nodes that were temporarily offline, then replays them when those nodes reconnect. Essential for meshes where nodes go in and out of range regularly — ensures messages aren't lost during brief disconnections. + +| Setting | תיאור | +| ------------------------------------------ | -------------------------- | +| Enabled | Activate store and forward | +| Heartbeat (s) | Announcement interval | +| Records | Maximum stored messages | +| History Return (max) | Max messages to replay | +| History Return (window) | Time window for replay | + +> 💡 **Tip:** Store and Forward works best on nodes with ample memory (ESP32 with PSRAM). Router nodes are ideal candidates since they're typically always-on. + +### Range Test Module + +Automated range testing tool for evaluating link quality between nodes. When enabled, the node periodically transmits test messages with incrementing counters. A receiver node logs these messages, allowing you to walk or drive away and later analyze at what distance messages stopped arriving. + +| Setting | תיאור | +| -------------------------------------- | --------------------------------- | +| Enabled | Activate range testing | +| Sender Interval (s) | Time between test transmissions | +| Save CSV | Log received test data to SD card | + +### Telemetry Module + +Controls what telemetry data your node shares with the mesh. Telemetry includes device health (battery, uptime) and environmental sensor data (temperature, humidity, pressure). + +| Setting | תיאור | +| ---------------------------- | --------------------------------------- | +| Device Metrics Interval | How often to report device metrics | +| Environment Metrics Interval | How often to report environment sensors | +| Air Quality Enabled | Report particulate sensor data | +| Power Metrics Enabled | Report power usage | + +See [Telemetry & Sensors](telemetry-and-sensors) for supported sensors and configuration recommendations. + +### Canned Message Module + +Pre-configured messages accessible from the device's physical buttons (for radios with rotary encoders, keypads, or similar input hardware). Define a list of quick-send messages that can be transmitted without a phone connected — ideal for field use. + +| Setting | תיאור | +| ------------------ | ----------------------------------------------------------- | +| ~~Enabled~~ | ⚠️ **Deprecated** — current firmware may ignore this toggle | +| הודעות | Newline-separated list of messages | +| Send Bell | Play bell sound on send | +| Rotary Encoder | Enable rotary encoder input | +| Up/Down/Press Pins | GPIO pin assignments for input | + +### Audio Module + +Codec2 audio support for low-bandwidth voice communication over the mesh. This is an **experimental** feature that encodes voice into very small data packets using the Codec2 codec. + +| Setting | תיאור | +| --------------- | -------------------------------- | +| Enabled | Activate audio module | +| Codec2 Rate | Audio quality/bandwidth tradeoff | +| I2S Word Select | GPIO pin for I2S WS | +| I2S Data In | GPIO pin for I2S DIN | +| I2S Data Out | GPIO pin for I2S DOUT | + +> ⚠️ **Note:** Audio requires specific hardware (I2S microphone and speaker). Voice quality is very low-bandwidth — think "understandable radio voice," not phone-call quality. + +### Remote Hardware Module + +GPIO control over the mesh network. Allows a remote node to read or write GPIO pins on another node — useful for activating relays, reading switches, or controlling external hardware from a distance. + +| Setting | תיאור | +| -------------------- | --------------------------------------------------------------- | +| Enabled | Activate remote GPIO access | +| Allow Undefined Pins | Allow access to any GPIO pin (security risk) | + +> ⚠️ **Warning:** Enabling "Allow Undefined Pins" gives remote nodes access to all GPIO pins, which could interfere with the radio's own hardware. Only enable on dedicated GPIO nodes. + +### Neighbor Info Module + +Broadcasts information about directly heard neighbors, enabling mesh topology mapping. Each enabled node periodically shares a list of the other nodes it can hear and their signal quality. + +| Setting | תיאור | +| -------------------------------------- | ------------------------------------ | +| Enabled | Activate neighbor broadcasting | +| Update Interval (s) | How often to broadcast neighbor list | + +See [Discovery](discovery) for how to use neighbor data for mesh topology exploration. + +### Ambient Lighting Module + +Controls onboard NeoPixel or other addressable RGB LEDs on supported hardware. Can be used for visual status indicators, notification lights, or decorative effects. + +| Setting | תיאור | +| ------------------ | ---------------------------------------------------------- | +| Enabled | Activate LED control | +| LED State | On, Off, or set specific color | +| Red / Green / Blue | Individual color channel values (0–255) | + +### Detection Sensor Module + +Turns your node into a motion or door sensor alert system. When a GPIO pin detects a state change (motion detected, door opened), the node broadcasts an alert message over the mesh. + +| Setting | תיאור | +| ---------------------------------------- | ----------------------------------------------------------------------- | +| Enabled | Activate detection sensor | +| Monitor Pin | GPIO pin connected to sensor | +| Detection Triggered High | Trigger when pin goes high (vs. low) | +| Minimum Broadcast (s) | Minimum time between alert broadcasts | +| State Broadcast (s) | Periodic state broadcast interval | +| Send Bell | Include bell character in alerts | +| Friendly Name | Custom name for this sensor | + +### Paxcounter Module + +People counter using WiFi and BLE probe requests. Counts nearby devices by passively listening for probe requests that phones and laptops emit when scanning for networks. Available only on ESP32 devices. + +| Setting | תיאור | +| -------------------------------------- | -------------------------- | +| Enabled | Activate people counting | +| Update Interval (s) | How often to report counts | + +> 💡 **Tip:** Paxcounter is useful for estimating foot traffic at trailheads, event venues, or other locations. Counts are approximate — one person may carry multiple devices. + +### TAK Module + +Team Awareness Kit integration for interoperability with ATAK and WinTAK. See [TAK Integration](tak) for detailed setup and usage. + +## Administration + +### Remote Administration + +Remotely configure nodes that share your admin key: + +1. Select the target node in the node list. +2. Navigate to **Settings** for that node. +3. Modify configuration. +4. Tap **Save** — changes are sent over the mesh. + +> ⚠️ **Requires:** Admin key configured on both your node and the target node. + +### Clean Node Database + +Removes stale nodes from your local database that haven't been heard in a configurable time window. + +### Factory Reset + +Resets all settings to factory defaults. **This cannot be undone.** + +### אתחול מחדש + +Remotely reboot a connected or administered node. + +### פאנל דיבאג + +View detailed diagnostic information: + +- Protocol buffers debug output +- Mesh packet log +- Connection state details + +### Troubleshooting Remote Admin + +- **"No response from target node"** — the target may be out of range, offline, or have a mismatched admin key. Verify the admin key matches on both nodes. +- **Changes not applying** — some settings require a reboot to take effect. Try the Reboot action after saving. +- **Can't see remote settings** — ensure your node has the admin key for the target node and that Admin Channel is enabled in Security Config. + +## Related Topics + +- [Settings — Radio & User](settings-radio-user) — core radio and user profile settings +- [Module configuration reference](https://meshtastic.org/docs/configuration/module) — detailed module docs on meshtastic.org +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/iw-rIL/user/settings-radio-user.md b/docs/iw-rIL/user/settings-radio-user.md new file mode 100644 index 000000000..1fb7349b8 --- /dev/null +++ b/docs/iw-rIL/user/settings-radio-user.md @@ -0,0 +1,173 @@ +--- +title: Settings — Radio & User +nav_order: 7 +last_updated: 2026-05-13 +description: Configure your radio hardware, LoRa presets, user profile, position sharing, power management, and security. +aliases: + - הגדרות + - radio-config + - user-config + - lora +--- + +# Settings — Radio & User + +Configure your radio hardware and user identity parameters. + +## User Settings + +### User Profile + +| Setting | תיאור | +| ----------------- | ------------------------------------------------------------------------------------- | +| Long Name | Your display name (up to 39 characters) | +| Short Name | 4-character abbreviated name | +| Licensed Operator | Enable if you hold an amateur radio license (enables higher power) | + +### Applying Changes + +After modifying settings, tap **Save** to write the configuration to your radio. The device may reboot to apply changes. + +## Radio Configuration + +### Device Config + +| Setting | תיאור | Default | +| ------------------------------------------ | ----------------------------------------------------------------------- | -------- | +| Role | Node behavior (Client, Router, etc.) | Client | +| Rebroadcast Mode | How the node retransmits messages | All | +| Node Info Broadcast (s) | Interval for broadcasting node info | 10800 | +| Double-tap Button | Action for double-tap button press | Disabled | + +### LoRa Config + +| Setting | תיאור | Default | +| ----------------- | ----------------------------------------------------------------------- | ----------------------------------------- | +| אזור | Regulatory region for frequency bands | Unset (must configure) | +| Modem Preset | Speed/range tradeoff | LongFast | +| Hop Limit | Maximum retransmit hops | 3 | +| TX Power | Transmission power (dBm); 0 = max allowed for region | 0 (region max) | +| Frequency Offset | Fine-tune frequency (MHz) | 0 | +| Channel Bandwidth | Bandwidth setting | Default for preset | + +> ⚠️ **Important:** You **must** set your region before transmitting. Operating without the correct region may violate local radio regulations. See the [region configuration guide](https://meshtastic.org/docs/getting-started/initial-config) on meshtastic.org for details. + +### Modem Presets + +| Preset | Range | Speed | SNR Limit | Best For | +| ------------------ | ----------------------- | ------------------------- | ------------------------ | -------------------------------------------------------------------------------------------------------- | +| Short Turbo | ~1 km | 21.9 kbps | −5 dB | Dense urban with line-of-sight; data-heavy applications | +| Short Fast | ~3 km | 10.9 kbps | −7.5 dB | Urban neighborhoods; buildings within a few blocks | +| Short Slow | ~5 km | 5.5 kbps | −10 dB | Suburban short-range; moderate building density | +| Medium Fast | ~5 km | 5.5 kbps | −10 dB | Suburban areas; moderate building density | +| Medium Slow | ~8 km | 1.1 kbps | −12.5 dB | Suburban/rural; moderate range with slower speed | +| Long Turbo | ~10 km | 4.4 kbps | −10 dB | Similar range to Long Fast but with 500 kHz bandwidth; faster throughput | +| Long Fast | ~10 km | 1.1 kbps | −12.5 dB | **General use (default)** — balanced range and speed | +| Long Moderate | ~20 km | 0.34 kbps | −15 dB | Rural with some terrain; occasional use | +| Lite Fast | ~5 km | 5.5 kbps | −10 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Medium Fast | +| Lite Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Long Fast | +| Narrow Fast | ~5 km | 2.7 kbps | −10 dB | EU 868 MHz band (62.5 kHz BW); avoids interference with other devices | +| Narrow Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 868 MHz band (62.5 kHz BW); comparable to Long Fast | +| ~~Long Slow~~ | ~30 km | 0.18 kbps | −17.5 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | +| ~~Very Long Slow~~ | ~40+ km | 0.09 kbps | −20 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | + +#### Choosing a Modem Preset + +The modem preset controls the fundamental tradeoff between **range** and **data rate**: + +- **Slower presets** use more spreading, making signals decodable at weaker signal levels (lower SNR limit). This means longer range but fewer bytes per second. +- **Faster presets** pack more data per transmission but require a stronger signal to decode. + +**Practical guidance:** + +- **Urban mesh (many nodes, short distances):** Use **Long Fast** (default) or **Short Fast**. Higher speed means less airtime congestion when many nodes share the channel. +- **Rural/sparse mesh (few nodes, long distances):** Use **Long Moderate**. Range matters more than speed when nodes are far apart. +- **EU 866/868 MHz regulatory compliance:** Use **Lite Fast**, **Lite Slow**, **Narrow Fast**, or **Narrow Slow** — these are optimized for the EU SRD/868 MHz bands with narrower bandwidths. +- **Fixed infrastructure links:** Use **Short Turbo** or **Long Turbo** for dedicated point-to-point links with good antennas and line-of-sight. +- **Mixed environments:** Stick with **Long Fast** — it's the community default and ensures compatibility with others in your area. + +> ⚠️ **Important:** All nodes on the same channel **must** use the same modem preset. Nodes with mismatched presets cannot communicate even if they share the same frequency and encryption key. + +> 💡 **Tip:** The range estimates above assume flat terrain and modest antennas. Elevation advantage (hilltop, rooftop) dramatically increases effective range. A well-placed Router with Long Fast can often outperform a ground-level node with Long Slow. + +### Display Config + +| Setting | תיאור | +| ------------------- | ------------------------------------------------------------------------------------ | +| Screen Timeout | Time before display sleeps | +| Display Units | Metric or Imperial | +| OLED Type | Auto, SSD1306, SH1106, SH1107 | +| Compass Orientation | Rotation offset for compass display (0°, 90°, 180°, 270°) | +| ~~Compass North~~ | ⚠️ **Deprecated** — replaced by Compass Orientation; still visible in older firmware | + +### Position Config + +| Setting | תיאור | +| ----------------------------------------- | ---------------------------------- | +| GPS Enabled | Enable/disable GPS | +| GPS Update Interval | How often to acquire GPS fix | +| Position Broadcast (s) | How often to share position | +| Smart Position | Enable movement-based broadcasting | +| Fixed Position | Use a manually set position | + +### Power Config + +| Setting | תיאור | +| --------------------------------------- | --------------------------------------- | +| Power Saving | Enable low-power sleep mode | +| Shutdown After (s) | Auto-shutdown idle timer | +| ADC Multiplier | Battery voltage calibration factor | +| Wait Bluetooth (s) | Time to wait for BLE connection at boot | +| Mesh SDS Timeout (s) | Super-deep-sleep timeout | + +### Network Config + +| Setting | תיאור | +| ------------- | ---------------------------------------------------- | +| WiFi Enabled | Enable WiFi radio (ESP32 devices) | +| WiFi SSID | Network name to connect to | +| WiFi PSK | Network password | +| NTP Server | Time synchronization server | +| Syslog Server | Remote logging server | + +![IP address field](/assets/screenshots/settings_ipv4_field.png) + +### Bluetooth Config + +| Setting | תיאור | +| ----------------- | ------------------------------------------------------------------------- | +| Bluetooth Enabled | Enable/disable BLE radio | +| Pairing Mode | Fixed PIN, Random PIN, or No PIN | +| Fixed PIN | PIN code for pairing (default: 123456) | + +### Security Config + +| Setting | תיאור | +| --------------------- | -------------------------------------------------------------------------- | +| Public Key | Your node's public key (read-only) | +| Admin Key | Key for remote administration | +| Private Key | Your node's private key (handle securely) | +| Admin Channel Enabled | Allow admin commands via channel | +| Debug Log | Output live debug logging over serial/bluetooth | +| Serial Enabled | Enable serial console access (moved from Device Config) | +| Managed Mode | Restrict non-admin channel changes | + +![Password field](/assets/screenshots/settings_password_field.png) + +Settings use standard preference controls — dropdowns, toggles, and sliders: + +| Control | Screenshot | +| -------- | ------------------------------------------------------ | +| Dropdown | ![Dropdown](/assets/screenshots/settings_dropdown.png) | +| Toggle | ![Toggle](/assets/screenshots/settings_switch.png) | +| Slider | ![Slider](/assets/screenshots/settings_slider.png) | + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — optional feature modules and device administration +- [Signal Meter](signal-meter) — how modem presets affect signal quality thresholds +- [LoRa configuration](https://meshtastic.org/docs/configuration/radio/lora) — detailed LoRa settings reference on meshtastic.org +- [Initial configuration](https://meshtastic.org/docs/getting-started/initial-config) — region setup guide on meshtastic.org + +--- + diff --git a/docs/iw-rIL/user/signal-meter.md b/docs/iw-rIL/user/signal-meter.md new file mode 100644 index 000000000..d34246d0e --- /dev/null +++ b/docs/iw-rIL/user/signal-meter.md @@ -0,0 +1,81 @@ +--- +title: How the Meshtastic Signal Meter Works +nav_order: 15 +last_updated: 2026-05-13 +description: How the signal meter calculates quality from RSSI and SNR — LoRa spread spectrum, presets, and what the bars really mean. +aliases: + - signal + - signal-meter + - snr + - rssi +--- + +# How the Meshtastic Signal Meter Works + +The Meshtastic signal meter — the familiar bars or status color in the app — is calculated very differently than the "bars" on a traditional cell phone or Wi-Fi router. + +Most consumer devices simply measure how "loud" a signal is. However, because Meshtastic uses **LoRa (Long Range)** technology, its signal meter measures how **clear** the signal is, relative to the specific settings your mesh is using. + +--- + +## 1. The Two Metrics: "Loudness" vs. "Clarity" + +Every time the LoRa radio chip receives a message, it reports two measurements: + +- **RSSI (Received Signal Strength Indicator):** The **loudness** of the raw power hitting your antenna. +- **SNR (Signal-to-Noise Ratio):** The **clarity** of the signal compared to the background static. + +> **Tip — The Analogy:** Imagine you are trying to hear a friend talking to you. +> +> - **RSSI** is how loud their voice is. +> - **The Noise Floor** is the background noise in the room (air conditioning, other people talking, traffic). +> - **SNR** is how easily you can distinguish your friend's voice from the background noise. + +If your friend shouts at you at a deafening rock concert, the signal is incredibly loud (High RSSI), but you still can't understand them because the background noise is louder (Bad SNR). Conversely, if your friend whispers to you in a dead-silent library, the signal is very weak (Low RSSI), but you can understand them perfectly (Great SNR). + +--- + +## 2. The Magic of LoRa: Hearing "Below the Noise Floor" + +For standard radios (like FM or Wi-Fi), if the background noise is louder than the signal (a negative SNR), the receiver just hears static. + +LoRa is special. It uses **"Spread Spectrum"** modulation, which allows the radio to mathematically pull a signal out of the air even when it is buried deep _underneath_ the background noise. This is why you will frequently see **negative SNR numbers** in Meshtastic (e.g., -10 dB, which means the signal is 10 decibels weaker than the background static). + +Depending on which Meshtastic preset you are using (e.g., `LongFast` vs. `ShortFast`), the radio has a specific **SNR Limit** — the absolute maximum amount of noise it can tolerate before the message is completely lost to the static. + +--- + +## 3. How the Signal Meter Calculates Quality + +The Meshtastic apps take both RSSI and SNR and run them through a specific formula to assign your signal a quality rating (None, Bad, Fair, or Good). It specifically scales these values based on the physical limits of the radio preset you are using. + +Here is exactly how the app decides how many bars (or what color) to show you: + +| Level | Bars | Criteria | Meaning | +| ----- | ---- | ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | +| Good | 3 | RSSI better than `-115 dBm` **AND** SNR better than `-7 dB` | Signal is both loud and clear — healthy connection. | +| Fair | 2 | RSSI better than `-126 dBm` with good SNR, **OR** SNR better than `-15 dB` with good RSSI | Signal getting quieter or noisier, but still decodable. | +| Bad | 1 | Falls between Fair and None thresholds | At the edge of range or experiencing interference. | +| None | 0 | RSSI worse than `-126 dBm` **AND** SNR worse than `-15 dB` | Transmission completely buried in noise. | + +--- + +## 4. What This Means for You + +Because Meshtastic's meter acts as a **"Clarity Meter"**, it behaves differently than what most people expect: + +> **Tip — Don't panic over low RSSI:** You might see a seemingly terrible RSSI value like `-118 dBm`. On a cell phone, you would have zero bars. But if you have an SNR of `+2 dB`, Meshtastic will still show a strong signal! _The library is quiet, so the whisper is heard perfectly._ + +> **Warning — Watch out for local noise:** If you hook up a massive antenna and see a great RSSI (e.g., `-90 dBm`) but your signal meter is only showing **1 Bar (Bad)**, you have a problem. It means you have local interference — perhaps a cheap power supply, a noisy computer, or a nearby radio tower — creating so much static that it is drowning out your mesh. + +## Where Signal Information Appears + +In the app, signal data is shown in several places: + +- **Node list** — signal bars icon next to each node +- **Node detail** — SNR, RSSI, and signal quality in the device metrics section +- **Traceroute** — per-hop signal quality for each relay node +- **Signal metrics** — historical SNR and RSSI data in the metrics charts + +![Node entry showing SNR, RSSI values and colored signal bars](/assets/screenshots/nodes_signal_info.png) + diff --git a/docs/iw-rIL/user/tak.md b/docs/iw-rIL/user/tak.md new file mode 100644 index 000000000..8bc2bb38f --- /dev/null +++ b/docs/iw-rIL/user/tak.md @@ -0,0 +1,126 @@ +--- +title: TAK Integration +nav_order: 10 +last_updated: 2026-05-13 +description: Interoperate with ATAK and WinTAK — CoT position sharing, TAK roles, and plugin setup. +aliases: + - tak + - atak + - team-awareness-kit +--- + +# TAK Integration + +Meshtastic integrates with the Team Awareness Kit (TAK) ecosystem, enabling interoperability between Meshtastic mesh devices and TAK applications like ATAK and WinTAK. + +## Overview + +The TAK module allows Meshtastic nodes to: + +- Share position data in TAK-compatible CoT (Cursor on Target) format +- Appear as team members on TAK map displays +- Receive TAK PLI (Position Location Information) messages + +## Setup + +### Prerequisites + +- ATAK (Android Team Awareness Kit) or WinTAK installed +- Meshtastic ATAK Plugin installed +- TAK module enabled on your Meshtastic radio + +### Configuration + +1. Navigate to **Settings → Module Config → TAK**. +2. Enable the TAK module. +3. Configure the TAK team/group settings: + +![Module toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | תיאור | +| ------- | -------------------------- | +| Enabled | Activate TAK interop | +| Mode | TAK-compatible output mode | + +### ATAK Plugin Setup + +1. Install the Meshtastic ATAK Plugin from the plugin repository. +2. Open ATAK and enable the Meshtastic plugin. +3. The plugin bridges messages between ATAK and your mesh network. + +## TAK Roles + +Nodes configured with TAK-related roles behave differently from standard clients: + +| Role | תיאור | +| --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **TAK** | Full TAK interoperability — sends and receives CoT data, chat messages, and PLI updates. Functions as a standard client plus TAK bridge. | +| **TAK Tracker** | Position-only TAK output — automatically broadcasts PLI at regular intervals without user interaction. Optimized for unattended position beacons (vehicles, equipment, waypoints). Does not relay chat messages. | + +> 💡 **Tip:** Use **TAK Tracker** for devices that only need to report position (e.g., a radio mounted in a vehicle). Use **TAK** for devices where users actively participate in TAK operations. + +### CoT (Cursor on Target) Format + +TAK messages use the Cursor on Target XML format — a military standard for sharing situational awareness data. Meshtastic converts its internal protobuf messages to CoT format when bridging to TAK systems, so no manual format conversion is needed. + +## TAK Identity + +When using TAK roles, your node broadcasts identity information that appears on TAK maps: + +| Setting | תיאור | +| -------- | ---------------------------------------------------------------------------------------------------------------- | +| Team | Your team color on the TAK map (e.g., Blue, Red, Cyan, Green) | +| Role | Your operational role (Team Member, Team Lead, HQ, Medic, RTO, etc.) | +| Callsign | Your TAK callsign (defaults to your Meshtastic long name) | + +These settings appear in **Settings → Module Config → TAK** when the TAK module is enabled. + +> 💡 **Tip:** Team/role colors are the standard TAK affiliation colors. Coordinate with your TAK team to use consistent team assignments. + +## Wire Format (V1 / V2) + +Meshtastic supports two TAK wire formats: + +| Format | Compatibility | Features | +| ------------------------------- | --------------------------------------------------------------- | --------------------------------------------------------- | +| V1 (Legacy) | ATAK Plugin v1.x, older firmware | Basic CoT position sharing only | +| V2 (Current) | ATAK Plugin v2.x, firmware 2.3+ | Full CoT support including chat, routes, zstd compression | + +The app automatically selects V2 when both sides support it. No manual configuration needed — the TAK module negotiates format based on firmware capabilities. + +## Usage with ATAK + +Once configured: + +- Meshtastic nodes appear as markers on the ATAK map with callsign labels +- Chat messages can bridge between mesh and TAK networks +- Position updates flow bidirectionally between Meshtastic and TAK +- TAK Tracker nodes broadcast PLI automatically — their positions appear on ATAK maps without any ATAK-side configuration + +> ⚠️ **Note:** TAK integration requires specific node roles and module configuration. Standard client nodes don't automatically participate in TAK operations. + +## Troubleshooting + +| Problem | Cause | Solution | +| -------------------------------- | ------------------------------------- | ----------------------------------------------------------------------- | +| Node doesn't appear on ATAK map | TAK module disabled or wrong role | Verify TAK module is enabled and node role is TAK or TAK Tracker | +| Position updates are stale | GPS fix lost or interval too long | Check GPS status; reduce position broadcast interval in Position Config | +| ATAK plugin shows "disconnected" | BLE connection lost or plugin crashed | Reconnect Bluetooth in Meshtastic app, then restart ATAK plugin | +| Chat messages not bridging | V1 format doesn't support chat | Ensure both nodes run firmware 2.3+ for V2 wire format | +| CoT data not flowing | Channel mismatch | All TAK nodes must be on the same channel with matching encryption | + +## Security Considerations + +- TAK data shares your position and callsign information +- Ensure your channel encryption is configured when using TAK in sensitive environments +- The TAK module respects the same channel encryption as other Meshtastic messages + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — TAK module configuration +- [Nodes](nodes) — TAK and TAK Tracker roles in the node list +- [Map & Waypoints](map-and-waypoints) — node positions on the map +- [ATAK plugin guide](https://meshtastic.org/docs/software/integrations/atak-plugin) — detailed ATAK setup on meshtastic.org + +--- + diff --git a/docs/iw-rIL/user/telemetry-and-sensors.md b/docs/iw-rIL/user/telemetry-and-sensors.md new file mode 100644 index 000000000..b6b3a5e2d --- /dev/null +++ b/docs/iw-rIL/user/telemetry-and-sensors.md @@ -0,0 +1,118 @@ +--- +title: Telemetry & Sensors +nav_order: 9 +last_updated: 2026-05-13 +description: Sensor data on the mesh — supported environment, air quality, and power sensors, plus configuration and viewing guides. +aliases: + - sensors + - environment + - weather + - power-metrics +--- + +# Telemetry & Sensors + +Meshtastic nodes can collect and share sensor data across the mesh network. + +## Overview + +Telemetry allows nodes equipped with sensors to broadcast environmental, power, and device health information. This data is visible on the node detail screen and can be logged over time. + +## Device Telemetry + +All Meshtastic nodes report basic device telemetry: + +| Metric | תיאור | Typical Range | +| ------------------- | ------------------------------ | ------------------------------------------------------------------ | +| Battery Level | Charge percentage | 0–100% | +| Voltage | Battery voltage | 3.0–4.2V (LiPo) | +| Channel Utilization | % of airtime used locally | 0–100% | +| Air Utilization TX | % of airtime used by this node | 0–100% | +| Uptime | Seconds since last boot | Varies | + +## Environment Sensors + +Supported environmental sensors: + +### Temperature & Humidity + +| Sensor | Temperature | Humidity | Pressure | Notes | +| ------- | ----------- | -------- | -------- | ----------------------- | +| BME280 | ✓ | ✓ | ✓ | Recommended all-in-one | +| BME680 | ✓ | ✓ | ✓ | Adds gas resistance/IAQ | +| SHT31 | ✓ | ✓ | — | High accuracy | +| MCP9808 | ✓ | — | — | Precision temperature | +| LPS22 | — | — | ✓ | Pressure only | + +### Air Quality + +| Sensor | Metric | Notes | +| -------- | -------------------------------------------------- | -------------------------- | +| BME680 | Gas Resistance / IAQ | Volatile organic compounds | +| PMSA003I | PM1.0, PM2.5, PM10 | Particulate matter | +| SEN55 | PM, NOx, VOC, Temp, Humidity | Multi-sensor | + +### Light & UV + +| Sensor | Metric | +| -------- | -------------------------------------- | +| OPT3001 | Ambient light (lux) | +| VEML7700 | Ambient light (lux) | +| LTR390 | UV index | + +## Power Metrics + +Nodes with INA-series power sensors can report: + +| Metric | תיאור | +| ----------- | ----------------------------------------- | +| Bus Voltage | Supply rail voltage | +| Current | Power consumption (mA) | +| Power | Calculated power (mW) | + +Useful for monitoring solar charging or battery health on remote nodes. + +## Configuring Telemetry + +1. Navigate to **Settings → Module Config → Telemetry**. +2. Set reporting intervals: + - **Device Metrics Interval** — how often to broadcast device metrics + - **Environment Metrics Interval** — how often to broadcast sensor data +3. Enable specific sensor types as needed. + +### Recommended Intervals + +| Use Case | Device (s) | Environment (s) | +| ------------------------------------------ | ----------------------------- | ---------------------------------- | +| Urban mesh (many nodes) | 3600 | 3600 | +| Rural mesh (few nodes) | 900 | 900 | +| Weather station | 900 | 300 | +| Battery conservation | 7200 | 7200 | + +> ⚠️ **Note:** Shorter intervals increase airtime usage and battery drain across the mesh. + +## Viewing Telemetry + +1. Navigate to **Nodes** and select a node. +2. Telemetry sections show on the detail screen: + - Device Metrics (always available) + - Environment Metrics (if sensors present) + - Power Metrics (if INA sensor present) +3. Historical graphs show trends over time. + +![Telemetry actions](/assets/screenshots/node-metrics_telemetric_actions.png) + +## Troubleshooting + +- **No environment data showing?** The remote node needs a physical sensor connected (e.g., BME280 on I2C). Device telemetry (battery, uptime) is always available, but environment metrics require hardware. +- **Stale readings?** Check the reporting interval — very long intervals (7200s+) mean data updates infrequently. Also verify the remote node is still online. +- **Sensor conflict on I2C bus?** Some sensors share I2C addresses. If you have multiple sensors on the same bus, check for address collisions in the radio's serial debug output. + +## Related Topics + +- [Node Metrics](node-metrics) — view telemetry data on the node detail screen +- [Settings — Modules & Admin](settings-module-admin) — telemetry module configuration +- [Units & Locale](units-and-locale) — temperature and pressure display units + +--- + diff --git a/docs/iw-rIL/user/translate.md b/docs/iw-rIL/user/translate.md new file mode 100644 index 000000000..b2ed79a34 --- /dev/null +++ b/docs/iw-rIL/user/translate.md @@ -0,0 +1,97 @@ +--- +title: Translate the App +parent: User Guide +nav_order: 17 +last_updated: 2026-05-13 +aliases: + - translate + - crowdin + - localization +--- + +# Translate the App + +Contributing translations helps make Meshtastic accessible to a wider audience. The app uses [Crowdin](https://crowdin.com/) to manage community translations for both the user interface and in-app documentation. + +--- + +## What Gets Translated + +| Resource | Source Location | Notes | +| ----------------- | ------------------------------------- | ---------------------------------------------------------------------- | +| UI strings | `composeResources/values/strings.xml` | Buttons, labels, messages, and all user-visible text | +| User Guide pages | `docs/user/*.md` | In-app documentation shown in Help & Documentation | +| Fastlane metadata | `fastlane/metadata/android/en-US/` | App Store listing title, description, and changelogs | + +> **Note — Developer Guide pages are English-only.** Code-focused documentation targeting contributors is not translated. + +--- + +## How to Contribute + +1. **Visit the Crowdin project.** Open the [Meshtastic Android Crowdin project](https://crowdin.com/project/meshtastic-android) and sign in or create a free account. +2. **Choose your language.** Select an existing language or request a new one by opening a [GitHub issue](https://github.com/meshtastic/Meshtastic-Android/issues/new). +3. **Translate strings.** Crowdin shows the English source on the left and your translation on the right. Translate each string and save. +4. **Review context.** Many strings include screenshots or context comments — check these to understand where the text appears in the app. +5. **Submit.** Approved translations are automatically merged into the next release. + +> **Tip — Keep translations short.** UI strings often appear in buttons, chips, or narrow columns. If a translation is significantly longer than the English original, consider abbreviating where the meaning stays clear. + +--- + +## Adding a New Language + +If your language is not yet listed on Crowdin: + +1. Open an issue on [GitHub](https://github.com/meshtastic/Meshtastic-Android/issues/new) requesting the new locale. +2. A maintainer will add the language to Crowdin and configure `crowdin.yml`. +3. Once added, you can begin translating immediately. + +--- + +## How Translations Are Organized + +The Android app uses **Compose Multiplatform resources** for all user-visible strings: + +``` +core/resources/src/commonMain/composeResources/ +├── values/ ← English (default) +│ └── strings.xml +├── values-de/ ← German +│ └── strings.xml +├── values-fr/ ← French +│ └── strings.xml +└── ... +``` + +In-app documentation follows a similar pattern under `docs/`: + +``` +docs/ +├── user/ ← English source (default) +│ ├── onboarding.md +│ └── ... +├── fr/user/ ← French translations +│ ├── onboarding.md +│ └── ... +└── ... +``` + +The app automatically selects the correct locale based on your device's **Language & Region** settings. + +--- + +## Translation Guidelines + +- **Do not translate** technical terms like "LoRa", "MQTT", "BLE", "TAK", "SNR", or "RSSI" — these are universal. +- **Keep placeholders intact.** Strings like `%1$s` or `%d` are filled in at runtime. Do not remove or reorder them unless the grammar of your language requires it. +- **Match tone.** The app uses a friendly, direct voice. Avoid overly formal language. +- **Test if possible.** Switch your device language and open the app to see how translations look in context. + +--- + +## Questions? + +If you have questions about a specific string's context or need help getting started, open a discussion on the [Meshtastic GitHub Discussions](https://github.com/meshtastic/Meshtastic-Android/discussions) page. + +Thank you for helping expand the reach of Meshtastic! diff --git a/docs/iw-rIL/user/units-and-locale.md b/docs/iw-rIL/user/units-and-locale.md new file mode 100644 index 000000000..5f391111d --- /dev/null +++ b/docs/iw-rIL/user/units-and-locale.md @@ -0,0 +1,118 @@ +--- +title: Units, Measurement & Locale +parent: User Guide +nav_order: 16 +last_updated: 2026-05-12 +--- + +# Units, Measurement & Locale + +The Meshtastic app automatically displays temperatures, distances, speeds, and times in the units your device is configured to use — no settings to change inside the app. + +--- + +## How It Works + +Meshtastic radios always transmit data in **metric units** (meters, °C, km/h, hPa, etc.). When the app receives this data, it uses the `MetricFormatter` utility to convert and display values in whatever unit system your device's locale specifies. + +On Android, your measurement preferences are determined by your system **Language & Region** settings. On Desktop (JVM), the app uses the JVM's default `Locale`. + +> **Tip — You never need to toggle units inside the app.** Change your system measurement preferences and every screen in Meshtastic updates automatically — node details, telemetry charts, weather, altitude, and more. + +--- + +## Temperature + +Temperature values from environment sensors are transmitted as **°C** and displayed based on your device's temperature unit preference. + +![Environment metrics with temperature](/assets/screenshots/nodes_environment_metrics.png) + +| Your Setting | You See | +| ------------ | ------- | +| Celsius | 22°C | +| Fahrenheit | 72°F | + +This affects all temperature displays throughout the app: node environment telemetry, soil temperature, dew point, and telemetry chart axes. + +## Distance & Altitude + +Distances between nodes and GPS altitudes are transmitted as **meters** and automatically scaled and converted. + +![Distance info display](/assets/screenshots/nodes_distance_info.png) + +| Your Setting | Small Distance | Large Distance | Altitude | +| -------------------------------- | -------------- | ---------------------- | -------- | +| Metric | 350 m | 2.5 km | 1,200 m | +| Imperial (US) | 1,148 ft | 1.6 mi | 3,937 ft | + +The app uses natural scaling — short distances stay in meters or feet, while longer distances switch to kilometres or miles automatically. + +### Where these appear + +- **Node list** — distance and bearing to each node +- **Node detail** — altitude, distance from your position +- **Map** — waypoint distances, traceroute hop distances +- **Compass** — distance to selected node + +## Speed + +GPS ground speed is displayed in your locale's preferred speed unit. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Metric | 12 km/h | +| Imperial (US) | 7 mph | + +## Wind + +Wind speed and gust data from environment sensors are transmitted as **m/s** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Metric | 5 m/s | +| Imperial (US) | 11 mph | + +Wind readings appear in the **Node Detail** environment section and the **Environment Telemetry** charts. + +## Rainfall + +Rainfall measurements (1-hour and 24-hour totals) are transmitted as **mm** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ---------------------- | +| Metric | 12 mm | +| Imperial (US) | 0.5 in | + +## Units That Never Change + +Some units are international standards and are displayed the same way regardless of your locale: + +| Measurement | Unit | Why | +| -------------------------------- | ------------------------------ | ------------------------------------- | +| Barometric pressure | hPa | International meteorological standard | +| Heading / bearing | ° (degrees) | Universal navigation convention | +| Radiation | μR/hr | Standard dosimetry unit | +| GPS coordinates | decimal degrees | Universal geographic standard | +| Humidity, battery, soil moisture | % | Universal | + +## Date & Time + +All timestamps throughout the app — last heard, message times, telemetry logs, chart axes — follow your device's date and time preferences. + +| Setting | What It Controls | Example | +| ---------------- | ---------------- | ------------------------------------------------ | +| **24-Hour Time** | Clock format | 14:30 vs 2:30 PM | +| **Date Format** | Date ordering | 09/05/2026 vs 05/09/2026 | + +The app also uses **relative time** where it makes sense — for example, "5 min ago" or "2 hours ago" in the node list — which is automatically localised into your device language. + +## Changing Your Measurement System (Android) + +On Android, your measurement system (metric vs imperial) is tied to your region setting: + +1. Open **Android Settings → System → Language & Region** +2. Change your **Region** or **Measurement units** preference +3. Return to Meshtastic — values update immediately + +> **Tip — The app uses `MetricFormatter` from `core:common`.** All measurement formatting is handled by a shared KMP utility that respects your platform's locale. Developers adding new measurement displays should use `MetricFormatter` rather than hard-coding unit conversions. + diff --git a/docs/ja-rJP/index.md b/docs/ja-rJP/index.md new file mode 100644 index 000000000..761468611 --- /dev/null +++ b/docs/ja-rJP/index.md @@ -0,0 +1,30 @@ +--- +title: Home +layout: default +nav_order: 0 +--- + +# Meshtastic Android App Documentation + +User and developer documentation for the Meshtastic Android, Desktop, and iOS applications powered by KMP (Kotlin Multiplatform). + +Use the sidebar navigation to browse the **User Guide** for app features and the **Developer Guide** for contributing to the project. + +--- + +## Quick Links + +| Guide | 説明 | +| --------------------------------------------------------------------- | -------------------------------------------------------------- | +| [Getting Started](user/onboarding) | Connect your first radio and send a message | +| [Messages & Channels](user/messages-and-channels) | Channel broadcasts, direct messages, reactions, and encryption | +| [Nodes](user/nodes) | Understanding the mesh network node list | +| [Signal Meter](user/signal-meter) | How the LoRa signal quality meter works | +| [Units & Locale](user/units-and-locale) | How temperatures, distances, and times adapt to your region | +| [Desktop App](user/desktop) | Linux, macOS, and Windows desktop usage | +| [Architecture](developer/architecture) | App architecture overview for contributors | +| [Contributing](developer/contributing) | Branch naming, PR workflow, and verification commands | + +--- + +> This documentation is served from the same markdown source that powers the in-app **Help & Documentation** browser. diff --git a/docs/ja-rJP/user/connections.md b/docs/ja-rJP/user/connections.md new file mode 100644 index 000000000..783641ba5 --- /dev/null +++ b/docs/ja-rJP/user/connections.md @@ -0,0 +1,125 @@ +--- +title: コネクション +nav_order: 2 +last_updated: 2026-05-13 +description: Connect your phone or desktop to a Meshtastic radio via Bluetooth, USB, or TCP/IP. +aliases: + - bluetooth + - usb + - tcp + - pairing +--- + +# コネクション + +Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node. + +## Bluetooth (BLE) + +Bluetooth Low Energy is the default and most common connection method on Android. + +### Pairing a Device + +1. Ensure your Meshtastic radio is powered on and in pairing mode. +2. Open the app and navigate to **Connections**. +3. Tap **Scan for Devices** — nearby Meshtastic radios will appear. +4. Select your device from the list. +5. Accept the Bluetooth pairing prompt if shown. + +![Device list item](/assets/screenshots/connections_bluetooth_scan.png) + +You can filter devices by transport type using the filter chips at the top: + +![Transport filter chips](/assets/screenshots/connections_transport_filters.png) + +> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. + +### Connection Status + +| Icon | State | 説明 | +| ---- | -------------- | ----------------------------- | +| 🟢 | 接続済 | Active radio link established | +| 🟡 | 接続中 | Handshake in progress | +| 🔴 | 切断 | No active connection | +| ⚪ | Not configured | デバイスが選択されていません | + +When connecting, a status indicator shows the current connection state: + +![Connecting status](/assets/screenshots/connections_connecting.png) + +If no devices are found, the app shows an empty state with instructions: + +![No devices found](/assets/screenshots/connections_empty_state.png) + +### Troubleshooting Bluetooth + +- **Device not found:** Toggle Bluetooth off/on, ensure location is enabled. +- **Connection drops:** Move closer to the radio; check for interference. +- **Pairing rejected:** Forget the device in Android Bluetooth settings and retry. + +## USB Serial + +USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable. + +### Setup + +1. Connect your radio via USB cable to your device. +2. The app will prompt for USB permission — tap **Allow**. +3. The connection is established automatically. + +> ⚠️ **Note:** USB connections require OTG support on Android devices. + +## TCP/IP (WiFi) + +Some Meshtastic radios support WiFi connectivity, allowing TCP-based connections. + +### 設定 + +1. Connect your radio to a WiFi network via the radio's web interface or settings. +2. In the app, go to **Connections → TCP**. +3. Enter the radio's IP address and port (default: 4403). +4. Tap **Connect**. + +![WiFi scanning for devices](/assets/screenshots/connections_wifi_scanning.png) + +When a device is found, it appears in the connection list: + +![WiFi device found](/assets/screenshots/connections_wifi_device_found.png) + +A successful connection is confirmed with a status indicator: + +![WiFi connection success](/assets/screenshots/connections_wifi_success.png) + +### When to Use TCP + +- Radio is on the same local network +- Testing with a simulated radio +- Environments where Bluetooth has interference issues + +## Reconnection Behavior + +The app reconnects to the **last selected device** on startup. You can manually switch transports from the connections screen at any time. + +To disconnect from a radio, use the disconnect button on the connections screen: + +![Disconnect from radio](/assets/screenshots/connections_disconnect.png) + +## Desktop Connections + +On Desktop (Linux/macOS/Windows), the app supports: + +- **Bluetooth (BLE)** — via the Kable library; works on macOS, Linux, and Windows +- **USB Serial** — primary wired connection method +- **TCP/IP** — for network-connected radios + +See [Desktop App](desktop) for platform-specific details and keyboard shortcuts. + +## Related Topics + +- [Getting Started](onboarding) — first-launch setup and permissions +- [Settings — Radio & User](settings-radio-user) — Bluetooth and network configuration +- [Desktop App](desktop) — desktop-specific connection details +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — full list of compatible radios on meshtastic.org + +--- + diff --git a/docs/ja-rJP/user/desktop.md b/docs/ja-rJP/user/desktop.md new file mode 100644 index 000000000..73beb6ab1 --- /dev/null +++ b/docs/ja-rJP/user/desktop.md @@ -0,0 +1,147 @@ +--- +title: Desktop App +nav_order: 14 +last_updated: 2026-05-13 +description: Install and use the Meshtastic Desktop app on Linux, macOS, and Windows — connections, feature parity, and keyboard shortcuts. +aliases: + - desktop + - linux + - macos + - windows + - jvm +--- + +# Desktop App + +The Meshtastic Desktop application provides the same mesh communication features on Linux, macOS, and Windows. + +## Overview + +The Desktop app shares its core codebase with the Android app through Kotlin Multiplatform (KMP). Most features work identically across platforms. + +## Installation + +### Linux + +- Download the `.deb` or `.AppImage` package from the releases page +- Or build from source using `./gradlew :desktopApp:run` + +### macOS + +- Download the `.dmg` package from releases +- Or build from source + +### Windows + +- Download the `.msi` installer from releases +- Or build from source + +## Connecting Your Radio + +### USB Serial (Primary) + +The most reliable connection method on Desktop: + +1. Connect your Meshtastic radio via USB cable. +2. The app should detect the serial port automatically. +3. If not detected, select the correct serial port from the connections menu. + +### TCP/IP + +For network-connected radios: + +1. Enter the radio's IP address and port (default: 4403). +2. Click **Connect**. + +### Bluetooth (BLE) + +Bluetooth Low Energy is supported on Desktop via the [Kable](https://github.com/JuulLabs/kable) library: + +1. Ensure your system has a Bluetooth adapter. +2. The app scans for nearby Meshtastic radios automatically. +3. Select your device from the connections screen. + +## Feature Parity + +| Feature | Android | Desktop | Notes | +| ---------------------------------------- | ------- | ------- | -------------------------- | +| Messaging | ✓ | ✓ | Full parity | +| Node List | ✓ | ✓ | Full parity | +| 地図 | ✓ | ✓ | Full parity | +| 設定 | ✓ | ✓ | Full parity | +| Bluetooth (BLE) | ✓ | ✓ | Via Kable on desktop | +| Firmware Update OTA | ✓ | ✗ | Use web flasher | +| Notifications | ✓ | ✓ | Native OS notifications | +| Widgets | ✓ | ✗ | Android-only | +| AI Assistant (Chirpy) | ✓\* | ✗ | Google flavor Android only | + +\*Chirpy AI requires Android 14+ on Google flavor builds with supported hardware. + +## UI Differences + +The Desktop app uses the same Compose Multiplatform UI with adaptations for larger screens and desktop interaction. + +### Keyboard Shortcuts + +| Shortcut | Action | +| ------------------- | --------------------------- | +| **⌘Q** / **Ctrl+Q** | Quit the application | +| **⌘,** / **Ctrl+,** | Open Settings | +| **⌘1** / **Ctrl+1** | Switch to Conversations tab | +| **⌘2** / **Ctrl+2** | Switch to Nodes tab | +| **⌘3** / **Ctrl+3** | Switch to Map tab | +| **⌘4** / **Ctrl+4** | Switch to Connections tab | + +### Window & System Tray + +- **Window resizing** — responsive layout adapts to window dimensions +- **System tray** — minimize to system tray for background mesh operation +- **Tray menu** — right-click the tray icon to show window or quit +- **Mouse interaction** — hover states and standard desktop navigation + +### Notification Preferences + +The Desktop app provides in-app toggles for controlling which notifications are shown — messages, new nodes, and low battery alerts. Access these from **Settings → Notifications** within the app. + +## Built-in Documentation Browser + +The Desktop app includes a built-in documentation browser for quick access to help content without leaving the application. + +![Docs browser with table of contents](/assets/screenshots/docs-browser_toc.png) + +The browser supports full-text search across all documentation: + +![Searching the docs browser](/assets/screenshots/docs-browser_search.png) + +Individual doc pages render with full formatting: + +![A documentation page](/assets/screenshots/docs-browser_page.png) + +## Building from Source + +```bash +git clone https://github.com/meshtastic/Meshtastic-Android.git +cd Meshtastic-Android +git submodule update --init +./gradlew :desktopApp:run +``` + +Requirements: + +- JDK 21 +- No Android SDK required for desktop-only builds + +## Known Limitations + +- No OTA firmware updates (use web flasher) +- Some Android-specific features (widgets, specific notification channels) are unavailable +- Performance may vary on low-spec hardware running Compose Desktop +- BLE bonding is not yet supported on desktop (pairing works without bonding) + +## Related Topics + +- [Connections](connections) — connection methods overview +- [Firmware Updates](firmware) — use the [Web Flasher](https://flasher.meshtastic.org) for desktop firmware updates + +--- + diff --git a/docs/ja-rJP/user/discovery.md b/docs/ja-rJP/user/discovery.md new file mode 100644 index 000000000..632238dae --- /dev/null +++ b/docs/ja-rJP/user/discovery.md @@ -0,0 +1,114 @@ +--- +title: ディスカバリー +nav_order: 12 +last_updated: 2026-05-13 +description: Explore your mesh network — traceroute paths, neighbor maps, and node discovery tools. +aliases: + - mesh-discovery + - local-discovery + - network-scan + - traceroute + - neighbor-info +--- + +# ディスカバリー + +Discovery tools help you understand **how** your mesh network is connected — which nodes can hear each other, what paths messages take, and where bottlenecks or weak links exist. + +> 💡 **Tip:** You don't need a dedicated "discovery mode" to start exploring your mesh. The tools below are available right now from the node list and node detail screens. + +--- + +## ルート追跡 + +Traceroute reveals the exact path a message takes from your node to any other node on the mesh. It's the single most useful tool for debugging connectivity problems. + +### Running a Traceroute + +1. Navigate to **Nodes** and tap the node you want to trace. +2. On the node detail screen, tap **Traceroute**. +3. The app sends a traceroute request and waits for the response. +4. Results display each hop in order, with signal quality at every step. + +### Reading the Results + +A traceroute result looks like this: + +``` +You → Node A (SNR: 8.5, RSSI: -95) → Node B (SNR: 5.2, RSSI: -108) → Target +``` + +Each hop represents a relay node that forwarded the message. The SNR and RSSI values at each hop tell you about the link quality on that specific segment. + +| What to look for | What it means | +| -------------------------------------------------------------------------- | --------------------------------------------------------------------------- | +| All hops show Good SNR (> 5 dB) | Healthy path — messages flow reliably | +| One hop shows Bad SNR (< 0 dB) | Weak link — this relay segment is fragile | +| Many hops (4+) | Long path — consider repositioning a node to shorten it | +| Different path on retry | Mesh is adapting — multiple routes exist (this is good!) | + +> 💡 **Tip:** Run traceroute several times over a few minutes. If the path changes, your mesh has redundant routes — a sign of a well-connected network. + +### Troubleshooting with Traceroute + +- **"No route found"** — The target node may be offline, out of range, or on a different channel. Check that both nodes share at least one channel with the same encryption key. +- **Traceroute times out** — The path may be too long (exceeds hop limit) or a relay node is congested. Try increasing the hop limit in **Settings → LoRa Config**. +- **Asymmetric paths** — A traceroute from A→B may take a different path than B→A. This is normal — radio propagation is not always symmetric. + +--- + +## 隣接ノード情報 + +The Neighbor Info module lets each node broadcast a list of the nodes it can **directly hear** (single-hop). When multiple nodes share their neighbor lists, you can piece together a topology map of the entire mesh. + +### Enabling Neighbor Info + +1. Navigate to **Settings → Module Config → Neighbor Info**. +2. Enable the module. +3. Set the broadcast interval (default: 900 seconds / 15 minutes). + +Once enabled, your node periodically broadcasts its neighbor table. Other nodes with Neighbor Info enabled do the same. + +### Viewing Neighbor Data + +- Open any node's detail screen and look for the **Neighbors** section. +- Each neighbor entry shows the node that was directly heard and its signal quality. +- Combine neighbor data from multiple nodes to understand the full mesh topology. + +> ⚠️ **Note:** Neighbor Info increases airtime usage because every enabled node periodically broadcasts its neighbor list. On busy meshes with many nodes, consider longer broadcast intervals (3600 seconds or more) to avoid congestion. + +--- + +## Node List as a Discovery Tool + +The node list itself is a powerful discovery tool when you use its filtering and sorting features effectively. + +### Finding New Nodes + +- Sort by **Last heard** to see the most recently active nodes at the top. +- Enable **Include unknown** to see nodes that have appeared on the mesh but haven't sent user info yet — these are often newly powered-on devices. + +### Assessing Connectivity + +- Sort by **Hops away** to see which nodes are directly reachable (0 hops) versus relayed. +- Sort by **Distance** to find nearby nodes and verify they're reachable. +- Use **Exclude MQTT** to focus on nodes reachable over radio (not via internet bridge). + +### Infrastructure Audit + +- Disable **Exclude infrastructure** to see Router, Repeater, Router Late, and Client Base nodes. +- Check their signal quality and last-heard times to verify your infrastructure nodes are healthy. + +See [Nodes](nodes) for full details on filtering and sorting options. + +--- + +## Tips for Mesh Exploration + +- **Start with traceroute** — it gives you immediate, actionable information about a specific path. +- **Enable Neighbor Info on key nodes** — especially routers and repeaters, to build a picture of the backbone. +- **Check the map** — node positions on the [Map](map-and-waypoints) combined with signal data help you understand why some links are strong and others are weak. +- **Compare signal over time** — use the [Signal Meter](signal-meter) guide to interpret SNR and RSSI values correctly. + +--- + diff --git a/docs/ja-rJP/user/firmware.md b/docs/ja-rJP/user/firmware.md new file mode 100644 index 000000000..84d33d5c2 --- /dev/null +++ b/docs/ja-rJP/user/firmware.md @@ -0,0 +1,114 @@ +--- +title: Firmware Updates +nav_order: 13 +last_updated: 2026-05-13 +description: Update your radio firmware over Bluetooth — OTA process, version channels, pre-flight checks, and recovery. +aliases: + - firmware + - update + - ota + - flash +--- + +# Firmware Updates + +Keep your Meshtastic radio up to date with the latest firmware for new features, bug fixes, and security improvements. + +## Checking for Updates + +1. Navigate to **Settings → Firmware Update** or tap the firmware notification if shown. +2. The app checks for available firmware versions. +3. Available updates show the version number and changelog summary. + +## Update Methods + +### OTA (Over-The-Air) via Bluetooth + +The most common update method for Android users: + +1. Ensure your radio is connected via Bluetooth. +2. Navigate to the Firmware Update screen. +3. Select the desired firmware version. +4. Tap **Update** to begin the OTA process. +5. Wait for the update to complete — **do not disconnect** during the update. + +![Firmware checking for updates](/assets/screenshots/firmware_checking.png) + +> ⚠️ **Warning:** Interrupting a firmware update can brick your device. Ensure your radio has sufficient battery (>50% recommended) and maintain Bluetooth proximity during the entire process. + +![Firmware disclaimer](/assets/screenshots/firmware_disclaimer.png) + +### USB Flashing + +For recovery or when OTA is unavailable: + +- Use the [Meshtastic Web Flasher](https://flasher.meshtastic.org) +- Or the [Meshtastic CLI tool](https://meshtastic.org/docs/getting-started/flashing-firmware) on desktop + +## Version Channels + +| チャンネル | 説明 | +| ------ | ------------------------------------------- | +| Stable | Recommended for most users; tested releases | +| Alpha | Preview releases; may contain bugs | + +## Pre-Update Checklist + +Before updating: + +- [ ] Battery > 50% +- [ ] Stable Bluetooth connection +- [ ] Note your current settings (they may reset on major version changes) +- [ ] Check the release notes for breaking changes + +## Post-Update + +After a successful update: + +- The radio will reboot automatically +- Bluetooth connection will re-establish +- Verify your settings are intact +- Check the firmware version in **Settings → About** + +![Firmware update success](/assets/screenshots/firmware_success.png) + +## Troubleshooting + +### Update Stuck + +If the update appears frozen: + +- Wait at least 5 minutes before intervening +- If truly stuck, power-cycle the radio +- Attempt the update again + +![Firmware update error](/assets/screenshots/firmware_error.png) + +### Device Won't Boot After Update + +If your device fails to boot: + +1. Try connecting via USB to a computer +2. Use the web flasher in recovery/DFU mode +3. Flash a known-good firmware version +4. Check the Meshtastic Discord for device-specific recovery steps + +### Compatibility Warnings + +The app may show warnings when: + +- Connected radio firmware is below minimum supported version +- Major version mismatch between app and firmware +- Deprecated features need migration + +> ⚠️ **Important:** Always update the Meshtastic app before or alongside firmware updates to ensure compatibility. + +## Related Topics + +- [Connections](connections) — reconnecting after a firmware update +- [Flashing firmware guide](https://meshtastic.org/docs/getting-started/flashing-firmware) — full firmware flashing walkthrough on meshtastic.org +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — check firmware compatibility by device +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/ja-rJP/user/map-and-waypoints.md b/docs/ja-rJP/user/map-and-waypoints.md new file mode 100644 index 000000000..299e8bf8d --- /dev/null +++ b/docs/ja-rJP/user/map-and-waypoints.md @@ -0,0 +1,116 @@ +--- +title: Map & Waypoints +nav_order: 6 +last_updated: 2026-05-13 +description: View node positions on the map, create and share waypoints, and manage position sharing and privacy. +aliases: + - map + - waypoints + - gps + - location +--- + +# Map & Waypoints + +The Map screen shows the geographic positions of nodes on your mesh, along with shared waypoints. + +## Map View + +The map displays: + +- **Node positions** — colored markers for each node reporting location +- **Waypoints** — shared points of interest +- **Your position** — your current GPS location + +### Node Markers + +Node markers on the map indicate: + +| Color | Meaning | +| ----- | ---------------------------------------------- | +| 緑 | Online (heard recently) | +| 黄色 | Away (heard within 2 hours) | +| Gray | Offline (stale position) | +| 青 | Your own node | + +### Map Controls + +- **Zoom** — pinch or use +/- buttons +- **Pan** — drag to explore +- **Center** — select the location button to center on your position +- **Node tap** — tap a node marker to view details + +The floating toolbar provides quick access to compass, layer switching, node filters, refresh, and location tracking. Tap the compass to reorient north-up, or tap the location button to center on your current position. + +![Map controls overlay](/assets/screenshots/map_controls_overlay.png) + +## Waypoints + +Waypoints are shared geographic points of interest that all mesh members can see. + +### Creating a Waypoint + +1. Long-press on the map at the desired location. +2. Enter a name and optional description. +3. Choose an icon/emoji for the waypoint. +4. Tap **Send** to share with the mesh. + +### Waypoint Properties + +| Property | 説明 | +| ---------- | ------------------------------------------------------- | +| 名前 | Short identifier (max 30 characters) | +| 説明 | Optional longer description | +| Icon | Visual marker emoji on the map | +| ロック済み | If locked, only the creator can edit or delete | +| Expiration | Optional auto-remove time | + +### Waypoint Expiration + +Waypoints can be set to expire automatically: + +- **Never** (default) — waypoint remains until manually deleted +- **Timed** — waypoint is automatically removed after the specified duration (e.g., "remove after 2 hours"). Useful for temporary markers like rally points, hazards, or meeting locations. + +Expired waypoints are automatically hidden from the map so they don't clutter the display. The expiration countdown begins when the waypoint is created, not when other nodes receive it. + +### Managing Waypoints + +- Tap a waypoint on the map to view its details and coordinates +- Edit or delete waypoints you created +- **Locked waypoints** cannot be modified or deleted by other nodes — only the original creator can change them +- Unlocked waypoints can be edited by any mesh member + +## Position Sharing + +### Enabling Position Sharing + +Your node shares its GPS position based on: + +- **Fixed interval** — broadcast position at regular intervals +- **Smart position** — broadcast when movement exceeds a threshold +- **Manual** — only share when explicitly requested + +Configure position behavior in **Settings → Position**. + +### Privacy Considerations + +> 🔒 **Privacy:** Position data is broadcast to all nodes on your channel. If you don't want your location shared, disable GPS position in settings or use a fixed/fake position. + +## Map Sources + +The app supports multiple map tile sources: + +- OpenStreetMap (default) +- Satellite imagery (where available) +- Offline tiles (download map areas for offline use) + +## Related Topics + +- [Nodes](nodes) — view and filter your node list +- [Node Metrics](node-metrics) — signal quality and position history for individual nodes +- [Discovery](discovery) — traceroute and neighbor info for understanding mesh topology +- [Units & Locale](units-and-locale) — distance and coordinate display formats + +--- + diff --git a/docs/ja-rJP/user/messages-and-channels.md b/docs/ja-rJP/user/messages-and-channels.md new file mode 100644 index 000000000..f97ead3c9 --- /dev/null +++ b/docs/ja-rJP/user/messages-and-channels.md @@ -0,0 +1,159 @@ +--- +title: Messages & Channels +nav_order: 3 +last_updated: 2026-05-13 +description: Send and receive messages, manage channels, configure encryption, and use quick chat, reactions, and message actions. +aliases: + - channels + - direct-messages + - messaging + - conversations +--- + +# Messages & Channels + +Meshtastic supports two communication modes: **channel broadcasts** and **direct messages**. + +## チャンネル + +Channels are shared communication groups. All nodes configured with the same channel key can read and send messages on that channel. + +### Default Channel + +Every Meshtastic device comes with a default **LongFast** channel. This is an unencrypted channel used for general mesh communication. + +### Channel Security + +Channels support multiple encryption levels: + +| Icon | Security Level | 説明 | +| ---- | ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------- | +| 🔒 | PSK (256-bit AES) | Fully encrypted with a strong pre-shared key. Only nodes with the matching key can read messages. | +| 🔐 | PSK (128-bit AES) | Encrypted with a shorter key. Secure for most uses but 256-bit is preferred for sensitive data. | +| 🔓 | Default / Open | Uses the well-known default key. **Any Meshtastic device** on the same preset can read these messages. | +| ⚠️ | Insecure + Position | Open channel that also broadcasts your GPS position. Use with caution in public meshes. | + +> 🔒 **Security Tip:** 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. + +### Adding a Channel + +1. Navigate to **Settings → Channels**. +2. Tap **Add Channel** or scan a QR code. +3. Configure the channel name and encryption key. +4. Share the channel URL/QR code with others who need access. + +Tapping a channel shows its details and sharing options. + +## Direct Messages + +Direct messages (DMs) are point-to-point encrypted communications between two specific nodes. + +### Sending a Direct Message + +1. Open the **Messages** tab. +2. Select a node from your contacts list or tap a node in the node list. +3. Type your message and tap **Send**. + +### Message States + +| State | Icon | Meaning | +| --------------------------------- | ---- | ----------------------------------------------------------------------------------------------------------------- | +| Queued | ⏳ | Message waiting to be sent | +| En route | ✓ | Delivered to the radio, awaiting acknowledgment | +| Delivered | ✓✓ | Acknowledgment received from recipient | +| Received | ✓ | Message received from the mesh (incoming) | +| S&F Routing | 🔗 | Store & Forward: message being routed through an S&F node | +| S&F Confirmed | 🔗 | Store & Forward: delivery confirmed via S&F node | +| エラー | ✗ | Delivery failed after retries | + +### Delivery Errors + +When a message fails to deliver, the error indicator shows what went wrong: + +| エラー | Meaning | What to Do | +| ---------------- | ---------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| No Route | No path exists to the destination node | The recipient may be offline or out of mesh range. Try later or move closer. | +| Got NAK | The next-hop node refused to relay | The relay node may be congested. Wait and retry. | +| タイムアウト | No acknowledgment within retry window | The recipient may be just out of range. Try increasing hop limit or moving to a better position. | +| インターフェースがありません | No radio interface available to send | Check that your radio is connected and the channel is configured. | +| Max Retransmit | All retry attempts exhausted | The mesh path is unreliable. Try a different channel or wait for conditions to improve. | +| チャンネルがありません | The destination channel doesn't exist | Verify both nodes share the same channel configuration. | +| Too Large | Message exceeds maximum payload size | Shorten your message (max ~230 characters). | +| No Response | Node received message but didn't respond | The recipient's radio may be busy or in low-power sleep mode. | +| Duty Cycle Limit | Regional airtime limit reached | Your radio has used its allowed transmit time. Wait for the duty cycle window to reset (typically 1 hour in EU regions). | +| 不正な要求 | Malformed or invalid message | This usually indicates a software bug. Try restarting the app. | + +> 💡 **Tip:** 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. + +## Message Features + +### Quick Chat + +Pre-configured messages for rapid communication: + +- Access via the Quick Chat button in the message input area +- Choose from built-in phrases or custom messages +- Customize quick chat messages in **Settings → Quick Chat** +- Useful when typing is impractical (gloves, small screen, urgent) + +![Quick chat option](/assets/screenshots/messages_quick_chat.png) + +The channel list shows each channel with its latest message preview. + +### Message Bubbles + +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. + +### Reactions + +React to messages with emoji: + +- **Long-press** a message to open the actions menu +- Tap **Add Reaction** to choose an emoji +- Reactions appear below the message bubble +- Multiple users can react to the same message +- React to your own messages or others' messages + +![Emoji reaction badges displayed beneath a message](/assets/screenshots/messages_reaction.png) + +> 💡 **Tip:** Reactions are lightweight — they use minimal mesh bandwidth compared to full text messages. + +### Message Actions + +Long-press any message to access: + +- **Copy** — copy message text to clipboard +- **Reply** — quote the message in your response +- **React** — add an emoji reaction +- **Delete** — remove a message you sent (local deletion) + +### Message Priority + +Messages are queued and transmitted based on priority: + +1. Emergency/alert messages (highest) +2. Direct messages +3. Channel broadcasts (lowest) + +### Message Limits + +- **Maximum length:** 237 bytes (approximately 230 characters for ASCII text) +- **Rate limiting:** The mesh enforces airtime fairness; heavy message volume may be throttled +- **Delivery:** Messages are retried automatically if no acknowledgment is received + +## Best Practices + +- Use channels for group coordination +- Use direct messages for private person-to-person communication +- Keep messages short — mesh bandwidth is limited +- Configure encryption for sensitive communications + +## Related Topics + +- [Nodes](nodes) — tap a node to start a direct message +- [Settings — Radio & User](settings-radio-user) — configure channel encryption and presets +- [MQTT](mqtt) — bridge channel messages to the internet +- [Channel configuration](https://meshtastic.org/docs/configuration/radio/channels) — detailed channel settings on meshtastic.org + +--- + diff --git a/docs/ja-rJP/user/mqtt.md b/docs/ja-rJP/user/mqtt.md new file mode 100644 index 000000000..7f01dcb24 --- /dev/null +++ b/docs/ja-rJP/user/mqtt.md @@ -0,0 +1,137 @@ +--- +title: MQTT +nav_order: 11 +last_updated: 2026-05-13 +description: Bridge your mesh to the internet — MQTT broker setup, encryption layers, and map reporting. +aliases: + - mqtt + - internet-bridge + - broker +--- + +# MQTT + +MQTT bridges your Meshtastic mesh network to the internet, enabling long-range communication beyond radio range. + +## Overview + +The MQTT module connects your node to an MQTT broker, allowing: + +- Messages to reach nodes on different physical meshes via the internet +- Integration with home automation and monitoring systems +- Publishing node positions to the public Meshtastic map +- Custom data pipelines for logging and alerting + +## How It Works + +``` +[Your Node] → Radio → [Gateway Node with WiFi] → MQTT Broker → [Remote Gateway] → Radio → [Remote Node] +``` + +A gateway node with internet access (WiFi or Ethernet) publishes mesh messages to an MQTT topic. Remote gateways subscribed to the same topic inject those messages into their local mesh. + +## 設定 + +### Enabling MQTT + +1. Navigate to **Settings → Module Config → MQTT**. +2. Enable the MQTT module. +3. Configure the broker connection: + +![MQTT toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | 説明 | デフォルト | +| --------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------- | +| Server Address | MQTT broker hostname | mqtt.meshtastic.org | +| ユーザー名 | Broker authentication | meshdev | +| パスワード | Broker authentication | large4cats | +| Root Topic | Base topic for messages | msh | +| Encryption | Encrypt MQTT payload | Enabled | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON packet support has been removed from firmware; this field is ignored | Disabled | +| TLS | Secure connection to broker | Disabled | +| Map Reporting | Report position to public map | Disabled | + +### Default Meshtastic Broker + +The community maintains a public broker at `mqtt.meshtastic.org`. This is intended for general use and testing. + +> 🔒 **Privacy:** Messages on the public broker are readable by anyone subscribed. Always use channel encryption for private communications. + +### Private Broker + +For better privacy and control, you can run your own MQTT broker: + +- Mosquitto (lightweight, open-source) +- HiveMQ +- EMQX + +Configure your node to point to your private broker with appropriate credentials. + +## Map Reporting + +When Map Reporting is enabled, your node publishes its position to the Meshtastic community map: + +- Visible at [meshmap.net](https://meshmap.net) and similar community map services +- Only position and node info are shared +- Disable this if you don't want your location publicly visible + +## Uplink vs Downlink + +| Direction | 説明 | +| ------------ | -------------------------------- | +| **Uplink** | Messages from mesh → MQTT broker | +| **Downlink** | Messages from MQTT broker → mesh | + +Configure per-channel which directions are active to control message flow and airtime usage. + +## Message Formats + +MQTT uses protobuf message format: + +| Format | 説明 | Use case | +| ------------ | ----------------------------------- | -------------------------- | +| **Protobuf** | Binary Meshtastic protobuf encoding | Node-to-node mesh bridging | + +> ⚠️ **Note:** JSON output support was removed from firmware. The `json_enabled` setting is still visible in the app for legacy compatibility but has no effect on current firmware versions. + +## Encryption & Privacy + +Understanding the layered encryption model: + +1. **Channel encryption** happens on the mesh _before_ MQTT. If your channel has a PSK, the MQTT payload is already encrypted — the broker and any subscribers see only the ciphertext. +2. **MQTT encryption** (the module setting) adds an additional encryption layer for transit to the broker. This protects metadata and routing information. +3. **TLS** encrypts the TCP connection to the broker itself, preventing network-level eavesdropping. + +> 🔒 **Important:** The default public channel has a well-known key. Messages on the default channel sent via MQTT are effectively **unencrypted** — anyone can decode them. Always use a custom PSK for private communications. + +## Best Practices + +- Use channel-level encryption (PSK) on channels that bridge to MQTT +- Don't enable MQTT on nodes without internet access (it will buffer and waste memory) +- Use a private broker for sensitive deployments +- Be mindful of airtime when downlinking messages from busy MQTT topics — every downlinked message consumes radio airtime on your local mesh +- Consider enabling uplink-only if you only need to monitor your mesh remotely without injecting messages back + +## Troubleshooting + +### MQTT Not Connecting + +- **Check WiFi** — the gateway node must have an active internet connection (WiFi or Ethernet). MQTT does not work over the LoRa radio link itself. +- **Verify credentials** — incorrect username or password will silently fail on most brokers. Double-check for trailing spaces. +- **Firewall** — port 1883 (MQTT) or 8883 (MQTT+TLS) must be open. Some networks block non-standard ports. +- **DNS resolution** — if using a custom broker hostname, verify the node can resolve it. Try the broker's IP address directly. + +### Messages Not Bridging + +- **Check uplink/downlink settings** — if only uplink is enabled, messages flow from mesh to MQTT but not back. Enable downlink on the receiving gateway. +- **Channel mismatch** — both gateways must share the same channel with the same PSK. A mismatch means messages are encrypted with different keys and appear as garbage. +- **Topic mismatch** — ensure both gateways use the same root topic. The default `msh` works for the public broker. + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — MQTT module configuration reference +- [Messages & Channels](messages-and-channels) — channel encryption and PSK setup +- [MQTT integration guide](https://meshtastic.org/docs/software/integrations/mqtt) — detailed MQTT documentation on meshtastic.org + +--- + diff --git a/docs/ja-rJP/user/node-metrics.md b/docs/ja-rJP/user/node-metrics.md new file mode 100644 index 000000000..64dd80b19 --- /dev/null +++ b/docs/ja-rJP/user/node-metrics.md @@ -0,0 +1,130 @@ +--- +title: Node Metrics +nav_order: 5 +last_updated: 2026-05-13 +description: Telemetry dashboards for each mesh node — device health, environment sensors, signal quality, power, traceroute, and position history. +aliases: + - metrics + - telemetry + - device-metrics + - signal +--- + +# Node Metrics + +The node detail screen provides comprehensive telemetry and metrics for each node on your mesh. + +## Device Metrics + +Basic operating information reported by each node: + +| Metric | 説明 | +| ------------- | ----------------------------------- | +| Battery Level | Current battery percentage | +| 電圧 | Battery voltage reading | +| チャンネル全体の利用率 | Percentage of airtime consumed | +| Airtime | Transmission time used by this node | +| 連続稼働時間 | Time since last reboot | + +Device metrics are displayed as individual cards with trend sparklines showing battery level, voltage, channel utilization, airtime, and uptime over time. + +> 💡 **Tip:** Tap any metric card to expand it into a full chart with historical data points. Pinch to zoom the time axis. + +## Environment Metrics + +Environmental sensor data (requires compatible hardware): + +| Metric | Sensor Examples | +| ------------------------------------ | --------------------- | +| 温度 | BME280, BME680, SHT31 | +| 湿度 | BME280, BME680, SHT31 | +| 大気圧 | BME280, BMP280 | +| ガス圧 | BME680 | +| IAQ (Air Quality) | BME680 | + +Environment metrics are charted over time for easy trend analysis — temperature, humidity, and pressure each get their own line chart with the measurement unit displayed on the Y axis. + +> 💡 **Tip:** Environment metrics require a sensor connected to the remote node. Not all nodes report environmental data. See [Telemetry & Sensors](telemetry-and-sensors) for a full list of supported sensors. + +## Signal Metrics + +Radio signal quality information: + +| Metric | 説明 | +| --------- | ----------------------------------------------------------------------------- | +| SN比 | Signal-to-Noise Ratio (higher is better) | +| RSSI | Received Signal Strength Indicator (closer to 0 is better) | +| Hop Count | Number of mesh hops for last message | + +### Signal Quality Reference + +| SNR Range | Quality | +| --------------------------------- | --------- | +| > 10 dB | Excellent | +| 0 to 10 dB | 良 | +| -10 to 0 dB | 普通 | +| < -10 dB | Poor | + +## Power Metrics + +Power management telemetry (requires INA sensor or compatible hardware): + +| Metric | 説明 | +| ----------- | ----------------------- | +| Bus Voltage | Supply voltage | +| 電流 | Power draw in milliamps | +| 電源 | Calculated wattage | + +## ルート追跡 + +Traceroute shows the path a message takes through the mesh: + +1. From the node detail screen, tap **Traceroute**. +2. The app sends a traceroute request to the target node. +3. Results show each hop with SNR/RSSI values. + +### Reading Traceroute Results + +``` +You → Node A (SNR: 8.5) → Node B (SNR: 5.2) → Target +``` + +Each hop represents a relay node that forwarded the message. + +## 位置ログ + +Historical position data for nodes that share their location: + +- GPS coordinates +- 標高 +- Speed (if moving) +- Timestamp for each position report + +## 隣接ノード情報 + +Shows which nodes a given node can directly hear, useful for understanding mesh topology. + +## Viewing Metrics + +1. Navigate to **Nodes**. +2. Tap the node you want to inspect. +3. Select the metric category from the detail tabs. + +![Node detail — local device](/assets/screenshots/nodes_detail_local.png) + +The position tab shows location data for nodes that share GPS: + +![Position inline content](/assets/screenshots/nodes_position.png) + +> ⚠️ **Note:** Metrics are only available when they have been reported by the remote node. Metrics update at intervals configured on each node's telemetry settings. + +## Related Topics + +- [Nodes](nodes) — node list, filtering, and sorting +- [Telemetry & Sensors](telemetry-and-sensors) — supported sensors and configuration +- [Signal Meter](signal-meter) — how signal quality is calculated from SNR and RSSI +- [Discovery](discovery) — traceroute details and neighbor info +- [Units & Locale](units-and-locale) — temperature, distance, and speed display formats + +--- + diff --git a/docs/ja-rJP/user/nodes.md b/docs/ja-rJP/user/nodes.md new file mode 100644 index 000000000..1db320d49 --- /dev/null +++ b/docs/ja-rJP/user/nodes.md @@ -0,0 +1,152 @@ +--- +title: ノード +nav_order: 4 +last_updated: 2026-05-13 +description: Browse, filter, and sort mesh nodes — view details, signal quality, roles, and quick actions. +aliases: + - node-list + - mesh-nodes + - peers +--- + +# ノード + +The Nodes screen displays all devices visible on your mesh network. + +## Node List + +The node list shows every node your radio has heard, including: + +- **Node name** — user-configured long name +- **Short name** — 4-character identifier +- **Signal quality** — last heard signal strength +- **Last heard** — time since last communication +- **Distance** — estimated distance (if positions are shared) +- **Battery** — remote node battery level (if telemetry is enabled) + +### Node Status Indicators + +| Badge | Meaning | +| ---------- | ------------------------------------- | +| 🟢 Online | Node heard within the last 15 minutes | +| 🟡 Away | Node heard within the last 2 hours | +| 🔴 Offline | Node not heard for over 2 hours | +| ⭐ Favorite | Node marked as favorite by the user | + +### Node Roles + +Nodes can be configured with different roles that affect their mesh behavior: + +| 役割 | 説明 | +| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | +| クライアント | Standard end-user device | +| クライアント・ベース | Treats favorited-node traffic as Router Late priority; all other traffic as Client | +| クライアント・ミュート | Receives but doesn't retransmit | +| クライアント・非表示 | Like Client Mute, plus hides from node list | +| ルーター | Prioritizes message forwarding; stays awake to relay | +| ルーター・レイト | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | +| ~~Router Client~~ | ⚠️ **Deprecated** (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | +| ~~Repeater~~ | ⚠️ **Deprecated** (removed in firmware 2.7.11) — no longer selectable; use Router instead | +| トラッカー | Optimized for position reporting at regular intervals | +| センサー | Optimized for telemetry reporting | +| TAK | Interoperates with TAK systems (sends/receives CoT) | +| TAK Tracker | TAK position reporting only | +| Lost & Found | Continuous position beacon for recovery | + +### Choosing a Role + +Most users should keep the default **Client** role. Consider a different role when: + +- **Router** — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don't use Router on battery-powered handheld devices. +- **Router Late** — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. +- **Client Base** — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. +- **Client Mute** — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only devices or to reduce congestion in dense areas. +- **Tracker** — An unattended device whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. +- **Sensor** — An unattended device reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. +- **TAK / TAK Tracker** — Only needed if interoperating with ATAK/WinTAK systems. See [TAK Integration](tak) for details. + +> 💡 **Tip:** The mesh works best when most nodes are **Client** or **Router**. Too many Mute nodes reduces mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. + +### Encryption Indicators + +Nodes display encryption status icons next to their name: + +| Icon | Meaning | +| ----------- | ------------------------------------------------------------------------------------------------------------------- | +| 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | +| 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | +| ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) | + +> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. + +## Quick Actions + +From the node list, you can: + +- **Tap** a node to view its detail page +- **Long-press** for quick actions: + - Send a direct message + - View on map + - 位置を求める + - Mark as favorite + - ルート追跡 + +## Filtering & Sorting + +### Text Search + +Type in the search field to filter nodes by name or short name. The filter updates in real time as you type. + +### Filter Toggles + +| 絞り込み | 説明 | +| -------------------------- | ---------------------------------------------------------------------------------------------- | +| **Only online** | Show only nodes heard within the last 15 minutes | +| **Only direct** | Show only nodes with direct (non-relayed) connections | +| **Include unknown** | Show nodes that haven't sent user info yet | +| **Exclude infrastructure** | Hide infrastructure-role nodes (Router, Repeater, Router Late, Client Base) | +| **Exclude MQTT** | Hide nodes heard only via MQTT internet bridge | +| **Show ignored** | Show nodes you've previously dismissed or muted | + +### Sort Options + +| Sort | 説明 | +| ------------------------------------------- | ------------------------------------------------------------------ | +| **Last heard** (default) | Most recently heard nodes first | +| **Alphabetical** | Sorted by node long name | +| **Distance** | Nearest nodes first (requires position sharing) | +| **Hops away** | Fewest relay hops first | +| **Channel** | Grouped by channel index | +| **Via MQTT** | Grouped by MQTT vs. radio-heard | +| **Favorites** | Favorited nodes first | + +## Node Detail + +Tapping a node opens the detail view with comprehensive information. See [Node Metrics](node-metrics) for full details on metrics and telemetry. + +![Node detail view](/assets/screenshots/nodes_node_list.png) + +The detail screen includes device info, position, and action buttons: + +![Node detail section](/assets/screenshots/nodes_detail_section.png) + +Inline status indicators show key metrics at a glance: + +| Indicator | Screenshot | +| -------------- | -------------------------------------------------------- | +| Signal quality | ![Signal](/assets/screenshots/nodes_signal_info.png) | +| Battery level | ![Battery](/assets/screenshots/nodes_battery_info.png) | +| Hop count | ![Hops](/assets/screenshots/nodes_hops_info.png) | +| 最後の通信 | ![Last heard](/assets/screenshots/nodes_last_heard.png) | +| 距離 | ![Distance](/assets/screenshots/nodes_distance_info.png) | + +## Related Topics + +- [Node Metrics](node-metrics) — detailed telemetry dashboards for each node +- [Messages & Channels](messages-and-channels) — send a direct message to a node +- [Map & Waypoints](map-and-waypoints) — view node positions geographically +- [Discovery](discovery) — traceroute and neighbor info for topology exploration +- [Signal Meter](signal-meter) — understand what the signal bars mean + +--- + diff --git a/docs/ja-rJP/user/onboarding.md b/docs/ja-rJP/user/onboarding.md new file mode 100644 index 000000000..3b910534e --- /dev/null +++ b/docs/ja-rJP/user/onboarding.md @@ -0,0 +1,99 @@ +--- +title: Getting Started +nav_order: 1 +last_updated: 2026-05-13 +description: First-launch setup — permissions, onboarding flow, and next steps after connecting your radio. +aliases: + - first-launch + - setup + - intro +--- + +# Getting Started + +Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app. + +## First Launch + +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. + +### Welcome Screen + +The welcome screen introduces Meshtastic and its core capabilities: + +- Off-grid mesh communication +- No cellular or internet required +- End-to-end encrypted messaging + +Tap **Get Started** to proceed through the setup flow. + +![Welcome screen](/assets/screenshots/onboarding_welcome.png) + +## Permissions + +The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. + +### Bluetooth Permission + +Bluetooth is the primary connection method between your phone and Meshtastic radio: + +- **Bluetooth scanning** — discover nearby Meshtastic radios +- **Bluetooth connect** — establish and maintain connections with paired radios + +Grant both permissions when prompted. Without Bluetooth, you'll need to use USB or TCP connections instead. + +### Location Permission + +> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. + +Meshtastic also uses your location for: + +- Showing your position on the mesh map +- Calculating distances to other nodes +- Sharing your GPS coordinates with other mesh members (if enabled) + +Grant **"While using the app"** or **"Always"** depending on your preference: + +- **While using the app** — position updates only when the app is open +- **Always** — enables background position updates for always-on mesh presence + +If denied, Bluetooth scanning will not function and your node will not report a position. + +### Notifications Permission + +Notifications alert you to: + +- Incoming messages from channels and direct messages +- Connection status changes (connected, disconnected, reconnecting) +- Firmware update availability + +> 💡 **Tip:** You can fine-tune notification preferences later in Android system settings. The app creates separate notification channels for messages, connection events, and background service status. + +### Critical Alerts Permission + +On supported devices, the app may request permission for critical alerts: + +- These are high-priority notifications that can break through Do Not Disturb mode +- Useful for emergency mesh alerts or urgent messages +- You can **skip** this step if you don't need breakthrough notifications +- Configure or revoke later in Android notification settings + +## After Setup + +Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. + +> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. + +## What's Next? + +Once connected to a radio, explore: + +- [Connections](connections) — pair your first radio device +- [Messages & Channels](messages-and-channels) — send your first message +- [Nodes](nodes) — see who's on your mesh +- [Map & Waypoints](map-and-waypoints) — view node positions +- [Settings](settings-radio-user) — configure your radio and user profile + +New to Meshtastic? The [getting started guide](https://meshtastic.org/docs/getting-started) on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup. + +--- diff --git a/docs/ja-rJP/user/settings-module-admin.md b/docs/ja-rJP/user/settings-module-admin.md new file mode 100644 index 000000000..e55c720d6 --- /dev/null +++ b/docs/ja-rJP/user/settings-module-admin.md @@ -0,0 +1,246 @@ +--- +title: Settings — Modules & Admin +nav_order: 8 +last_updated: 2026-05-13 +description: Configure optional feature modules (MQTT, telemetry, canned messages, TAK, and more) and perform device administration. +aliases: + - modules + - module-config + - administration +--- + +# Settings — Modules & Admin + +Configure optional feature modules and perform device administration. Modules extend Meshtastic with specialized capabilities — each can be independently enabled or disabled. + +> 💡 **Tip:** You only need to enable the modules you actually use. Disabling unused modules reduces airtime, saves battery, and simplifies your configuration. + +Module settings use a card-based layout with toggle switches, dropdowns, text fields, and sliders: + +![Toggle switch](/assets/screenshots/settings_switch.png) + +![Dropdown selector](/assets/screenshots/settings_dropdown.png) + +![Text field](/assets/screenshots/settings_text_field.png) + +![Settings card layout](/assets/screenshots/settings_titled_card.png) + +## Module Configuration + +### MQTT Module + +Bridges mesh messages to and from an MQTT broker for internet connectivity. This is how you extend your mesh beyond radio range or integrate with home automation systems. + +| Setting | 説明 | +| --------------- | ------------------------------------------------------------------------ | +| Enabled | Toggle MQTT bridge | +| サーバー | MQTT broker address | +| ユーザー名 | Authentication username | +| パスワード | Authentication password | +| Encryption | Encrypt MQTT payloads | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON support removed from firmware; field is ignored | +| TLS | Use secure connection | +| Root Topic | Base MQTT topic path | +| Map Report | Publish position for public map | + +See [MQTT](mqtt) for a detailed usage guide including encryption, privacy, and broker setup. + +### Serial Module + +Enables serial port communication for external device integrations (GPS modules, sensors, or custom hardware). When enabled, the node's serial port can send and receive protobuf or text data, allowing external microcontrollers or computers to interact with the mesh. + +| Setting | 説明 | +| ---------- | ------------------------------- | +| Enabled | Activate serial communication | +| Echo | Echo received serial data back | +| Mode | Text, Protobuf, or NMEA output | +| RX/TX Pins | GPIO pins for serial connection | +| Baud Rate | Serial communication speed | + +### External Notification Module + +Controls buzzer, LED, or vibration alerts on your radio hardware. Useful for devices that need to physically signal when a message arrives — particularly helpful for unattended or outdoor installations. + +| Setting | 説明 | +| -------------------------------- | --------------------------- | +| Enabled | Activate notifications | +| Alert Message | Notify on incoming messages | +| Alert Message Buzzer | Use buzzer for messages | +| Alert Message Vibra | Use vibration for messages | +| Alert Bell | Notify on bell character | +| Output (GPIO) | Pin for notification output | +| Active | High or Low active | +| Duration (ms) | Notification length | +| Use I2S as Buzzer | Use I2S audio output | + +### Store & Forward Module + +Buffers messages for nodes that were temporarily offline, then replays them when those nodes reconnect. Essential for meshes where nodes go in and out of range regularly — ensures messages aren't lost during brief disconnections. + +| Setting | 説明 | +| ------------------------------------------ | -------------------------- | +| Enabled | Activate store and forward | +| Heartbeat (s) | Announcement interval | +| Records | Maximum stored messages | +| History Return (max) | Max messages to replay | +| History Return (window) | Time window for replay | + +> 💡 **Tip:** Store and Forward works best on nodes with ample memory (ESP32 with PSRAM). Router nodes are ideal candidates since they're typically always-on. + +### Range Test Module + +Automated range testing tool for evaluating link quality between nodes. When enabled, the node periodically transmits test messages with incrementing counters. A receiver node logs these messages, allowing you to walk or drive away and later analyze at what distance messages stopped arriving. + +| Setting | 説明 | +| -------------------------------------- | --------------------------------- | +| Enabled | Activate range testing | +| Sender Interval (s) | Time between test transmissions | +| Save CSV | Log received test data to SD card | + +### Telemetry Module + +Controls what telemetry data your node shares with the mesh. Telemetry includes device health (battery, uptime) and environmental sensor data (temperature, humidity, pressure). + +| Setting | 説明 | +| ---------------------------- | --------------------------------------- | +| Device Metrics Interval | How often to report device metrics | +| Environment Metrics Interval | How often to report environment sensors | +| Air Quality Enabled | Report particulate sensor data | +| Power Metrics Enabled | Report power usage | + +See [Telemetry & Sensors](telemetry-and-sensors) for supported sensors and configuration recommendations. + +### Canned Message Module + +Pre-configured messages accessible from the device's physical buttons (for radios with rotary encoders, keypads, or similar input hardware). Define a list of quick-send messages that can be transmitted without a phone connected — ideal for field use. + +| Setting | 説明 | +| ------------------ | ----------------------------------------------------------- | +| ~~Enabled~~ | ⚠️ **Deprecated** — current firmware may ignore this toggle | +| メッセージ | Newline-separated list of messages | +| Send Bell | Play bell sound on send | +| Rotary Encoder | Enable rotary encoder input | +| Up/Down/Press Pins | GPIO pin assignments for input | + +### Audio Module + +Codec2 audio support for low-bandwidth voice communication over the mesh. This is an **experimental** feature that encodes voice into very small data packets using the Codec2 codec. + +| Setting | 説明 | +| --------------- | -------------------------------- | +| Enabled | Activate audio module | +| Codec2 Rate | Audio quality/bandwidth tradeoff | +| I2S Word Select | GPIO pin for I2S WS | +| I2S Data In | GPIO pin for I2S DIN | +| I2S Data Out | GPIO pin for I2S DOUT | + +> ⚠️ **Note:** Audio requires specific hardware (I2S microphone and speaker). Voice quality is very low-bandwidth — think "understandable radio voice," not phone-call quality. + +### Remote Hardware Module + +GPIO control over the mesh network. Allows a remote node to read or write GPIO pins on another node — useful for activating relays, reading switches, or controlling external hardware from a distance. + +| Setting | 説明 | +| -------------------- | --------------------------------------------------------------- | +| Enabled | Activate remote GPIO access | +| Allow Undefined Pins | Allow access to any GPIO pin (security risk) | + +> ⚠️ **Warning:** Enabling "Allow Undefined Pins" gives remote nodes access to all GPIO pins, which could interfere with the radio's own hardware. Only enable on dedicated GPIO nodes. + +### Neighbor Info Module + +Broadcasts information about directly heard neighbors, enabling mesh topology mapping. Each enabled node periodically shares a list of the other nodes it can hear and their signal quality. + +| Setting | 説明 | +| -------------------------------------- | ------------------------------------ | +| Enabled | Activate neighbor broadcasting | +| Update Interval (s) | How often to broadcast neighbor list | + +See [Discovery](discovery) for how to use neighbor data for mesh topology exploration. + +### Ambient Lighting Module + +Controls onboard NeoPixel or other addressable RGB LEDs on supported hardware. Can be used for visual status indicators, notification lights, or decorative effects. + +| Setting | 説明 | +| ------------------ | ---------------------------------------------------------- | +| Enabled | Activate LED control | +| LED State | On, Off, or set specific color | +| Red / Green / Blue | Individual color channel values (0–255) | + +### Detection Sensor Module + +Turns your node into a motion or door sensor alert system. When a GPIO pin detects a state change (motion detected, door opened), the node broadcasts an alert message over the mesh. + +| Setting | 説明 | +| ---------------------------------------- | ----------------------------------------------------------------------- | +| Enabled | Activate detection sensor | +| Monitor Pin | GPIO pin connected to sensor | +| Detection Triggered High | Trigger when pin goes high (vs. low) | +| Minimum Broadcast (s) | Minimum time between alert broadcasts | +| State Broadcast (s) | Periodic state broadcast interval | +| Send Bell | Include bell character in alerts | +| Friendly Name | Custom name for this sensor | + +### Paxcounter Module + +People counter using WiFi and BLE probe requests. Counts nearby devices by passively listening for probe requests that phones and laptops emit when scanning for networks. Available only on ESP32 devices. + +| Setting | 説明 | +| -------------------------------------- | -------------------------- | +| Enabled | Activate people counting | +| Update Interval (s) | How often to report counts | + +> 💡 **Tip:** Paxcounter is useful for estimating foot traffic at trailheads, event venues, or other locations. Counts are approximate — one person may carry multiple devices. + +### TAK Module + +Team Awareness Kit integration for interoperability with ATAK and WinTAK. See [TAK Integration](tak) for detailed setup and usage. + +## 管理 + +### リモート管理 + +Remotely configure nodes that share your admin key: + +1. Select the target node in the node list. +2. Navigate to **Settings** for that node. +3. Modify configuration. +4. Tap **Save** — changes are sent over the mesh. + +> ⚠️ **Requires:** Admin key configured on both your node and the target node. + +### Clean Node Database + +Removes stale nodes from your local database that haven't been heard in a configurable time window. + +### Factory Reset + +Resets all settings to factory defaults. **This cannot be undone.** + +### 再起動 + +Remotely reboot a connected or administered node. + +### デバッグ + +View detailed diagnostic information: + +- Protocol buffers debug output +- Mesh packet log +- Connection state details + +### Troubleshooting Remote Admin + +- **"No response from target node"** — the target may be out of range, offline, or have a mismatched admin key. Verify the admin key matches on both nodes. +- **Changes not applying** — some settings require a reboot to take effect. Try the Reboot action after saving. +- **Can't see remote settings** — ensure your node has the admin key for the target node and that Admin Channel is enabled in Security Config. + +## Related Topics + +- [Settings — Radio & User](settings-radio-user) — core radio and user profile settings +- [Module configuration reference](https://meshtastic.org/docs/configuration/module) — detailed module docs on meshtastic.org +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/ja-rJP/user/settings-radio-user.md b/docs/ja-rJP/user/settings-radio-user.md new file mode 100644 index 000000000..eb5d6bb9b --- /dev/null +++ b/docs/ja-rJP/user/settings-radio-user.md @@ -0,0 +1,173 @@ +--- +title: Settings — Radio & User +nav_order: 7 +last_updated: 2026-05-13 +description: Configure your radio hardware, LoRa presets, user profile, position sharing, power management, and security. +aliases: + - 設定 + - radio-config + - user-config + - lora +--- + +# Settings — Radio & User + +Configure your radio hardware and user identity parameters. + +## User Settings + +### User Profile + +| Setting | 説明 | +| ----------------- | ------------------------------------------------------------------------------------- | +| Long Name | Your display name (up to 39 characters) | +| Short Name | 4-character abbreviated name | +| Licensed Operator | Enable if you hold an amateur radio license (enables higher power) | + +### Applying Changes + +After modifying settings, tap **Save** to write the configuration to your radio. The device may reboot to apply changes. + +## Radio Configuration + +### デバイスの設定 + +| Setting | 説明 | デフォルト | +| ------------------------------------------ | ----------------------------------------------------------------------- | -------- | +| 役割 | Node behavior (Client, Router, etc.) | クライアント | +| Rebroadcast Mode | How the node retransmits messages | すべて | +| Node Info Broadcast (s) | Interval for broadcasting node info | 10800 | +| Double-tap Button | Action for double-tap button press | Disabled | + +### LoRa設定 + +| Setting | 説明 | デフォルト | +| ----------------- | ----------------------------------------------------------------------- | ----------------------------------------- | +| リージョン | Regulatory region for frequency bands | Unset (must configure) | +| モデムプリセット | Speed/range tradeoff | LongFast | +| Hop Limit | Maximum retransmit hops | 3 | +| TX Power | Transmission power (dBm); 0 = max allowed for region | 0 (region max) | +| Frequency Offset | Fine-tune frequency (MHz) | 0 | +| Channel Bandwidth | Bandwidth setting | Default for preset | + +> ⚠️ **Important:** You **must** set your region before transmitting. Operating without the correct region may violate local radio regulations. See the [region configuration guide](https://meshtastic.org/docs/getting-started/initial-config) on meshtastic.org for details. + +### Modem Presets + +| Preset | Range | Speed | SNR Limit | Best For | +| ------------------ | ----------------------- | ------------------------- | ------------------------ | -------------------------------------------------------------------------------------------------------- | +| Short Turbo | ~1 km | 21.9 kbps | −5 dB | Dense urban with line-of-sight; data-heavy applications | +| Short Fast | ~3 km | 10.9 kbps | −7.5 dB | Urban neighborhoods; buildings within a few blocks | +| Short Slow | ~5 km | 5.5 kbps | −10 dB | Suburban short-range; moderate building density | +| Medium Fast | ~5 km | 5.5 kbps | −10 dB | Suburban areas; moderate building density | +| Medium Slow | ~8 km | 1.1 kbps | −12.5 dB | Suburban/rural; moderate range with slower speed | +| Long Turbo | ~10 km | 4.4 kbps | −10 dB | Similar range to Long Fast but with 500 kHz bandwidth; faster throughput | +| Long Fast | ~10 km | 1.1 kbps | −12.5 dB | **General use (default)** — balanced range and speed | +| Long Moderate | ~20 km | 0.34 kbps | −15 dB | Rural with some terrain; occasional use | +| Lite Fast | ~5 km | 5.5 kbps | −10 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Medium Fast | +| Lite Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Long Fast | +| Narrow Fast | ~5 km | 2.7 kbps | −10 dB | EU 868 MHz band (62.5 kHz BW); avoids interference with other devices | +| Narrow Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 868 MHz band (62.5 kHz BW); comparable to Long Fast | +| ~~Long Slow~~ | ~30 km | 0.18 kbps | −17.5 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | +| ~~Very Long Slow~~ | ~40+ km | 0.09 kbps | −20 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | + +#### Choosing a Modem Preset + +The modem preset controls the fundamental tradeoff between **range** and **data rate**: + +- **Slower presets** use more spreading, making signals decodable at weaker signal levels (lower SNR limit). This means longer range but fewer bytes per second. +- **Faster presets** pack more data per transmission but require a stronger signal to decode. + +**Practical guidance:** + +- **Urban mesh (many nodes, short distances):** Use **Long Fast** (default) or **Short Fast**. Higher speed means less airtime congestion when many nodes share the channel. +- **Rural/sparse mesh (few nodes, long distances):** Use **Long Moderate**. Range matters more than speed when nodes are far apart. +- **EU 866/868 MHz regulatory compliance:** Use **Lite Fast**, **Lite Slow**, **Narrow Fast**, or **Narrow Slow** — these are optimized for the EU SRD/868 MHz bands with narrower bandwidths. +- **Fixed infrastructure links:** Use **Short Turbo** or **Long Turbo** for dedicated point-to-point links with good antennas and line-of-sight. +- **Mixed environments:** Stick with **Long Fast** — it's the community default and ensures compatibility with others in your area. + +> ⚠️ **Important:** All nodes on the same channel **must** use the same modem preset. Nodes with mismatched presets cannot communicate even if they share the same frequency and encryption key. + +> 💡 **Tip:** The range estimates above assume flat terrain and modest antennas. Elevation advantage (hilltop, rooftop) dramatically increases effective range. A well-placed Router with Long Fast can often outperform a ground-level node with Long Slow. + +### 表示設定 + +| Setting | 説明 | +| ------------------- | ------------------------------------------------------------------------------------ | +| Screen Timeout | Time before display sleeps | +| Display Units | Metric or Imperial | +| OLED Type | Auto, SSD1306, SH1106, SH1107 | +| Compass Orientation | Rotation offset for compass display (0°, 90°, 180°, 270°) | +| ~~Compass North~~ | ⚠️ **Deprecated** — replaced by Compass Orientation; still visible in older firmware | + +### 位置情報設定 + +| Setting | 説明 | +| ----------------------------------------- | ---------------------------------- | +| GPS Enabled | Enable/disable GPS | +| GPS Update Interval | How often to acquire GPS fix | +| Position Broadcast (s) | How often to share position | +| Smart Position | Enable movement-based broadcasting | +| 固定位置 | Use a manually set position | + +### 電源設定 + +| Setting | 説明 | +| --------------------------------------- | --------------------------------------- | +| Power Saving | Enable low-power sleep mode | +| Shutdown After (s) | Auto-shutdown idle timer | +| ADC Multiplier | Battery voltage calibration factor | +| Wait Bluetooth (s) | Time to wait for BLE connection at boot | +| Mesh SDS Timeout (s) | Super-deep-sleep timeout | + +### ネットワーク設定 + +| Setting | 説明 | +| ------------- | ---------------------------------------------------- | +| WiFi Enabled | Enable WiFi radio (ESP32 devices) | +| WiFi SSID | Network name to connect to | +| WiFi PSK | Network password | +| NTP Server | Time synchronization server | +| Syslog Server | Remote logging server | + +![IP address field](/assets/screenshots/settings_ipv4_field.png) + +### Bluetooth 設定 + +| Setting | 説明 | +| ----------------- | ------------------------------------------------------------------------- | +| Bluetooth Enabled | Enable/disable BLE radio | +| Pairing Mode | Fixed PIN, Random PIN, or No PIN | +| PINコード | PIN code for pairing (default: 123456) | + +### セキュリティ設定 + +| Setting | 説明 | +| --------------------- | -------------------------------------------------------------------------- | +| 公開鍵 | Your node's public key (read-only) | +| 管理者キー | Key for remote administration | +| 秘密鍵 | Your node's private key (handle securely) | +| Admin Channel Enabled | Allow admin commands via channel | +| Debug Log | Output live debug logging over serial/bluetooth | +| Serial Enabled | Enable serial console access (moved from Device Config) | +| 管理モード | Restrict non-admin channel changes | + +![Password field](/assets/screenshots/settings_password_field.png) + +Settings use standard preference controls — dropdowns, toggles, and sliders: + +| Control | Screenshot | +| -------- | ------------------------------------------------------ | +| Dropdown | ![Dropdown](/assets/screenshots/settings_dropdown.png) | +| Toggle | ![Toggle](/assets/screenshots/settings_switch.png) | +| Slider | ![Slider](/assets/screenshots/settings_slider.png) | + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — optional feature modules and device administration +- [Signal Meter](signal-meter) — how modem presets affect signal quality thresholds +- [LoRa configuration](https://meshtastic.org/docs/configuration/radio/lora) — detailed LoRa settings reference on meshtastic.org +- [Initial configuration](https://meshtastic.org/docs/getting-started/initial-config) — region setup guide on meshtastic.org + +--- + diff --git a/docs/ja-rJP/user/signal-meter.md b/docs/ja-rJP/user/signal-meter.md new file mode 100644 index 000000000..2482815ff --- /dev/null +++ b/docs/ja-rJP/user/signal-meter.md @@ -0,0 +1,81 @@ +--- +title: How the Meshtastic Signal Meter Works +nav_order: 15 +last_updated: 2026-05-13 +description: How the signal meter calculates quality from RSSI and SNR — LoRa spread spectrum, presets, and what the bars really mean. +aliases: + - signal + - signal-meter + - snr + - rssi +--- + +# How the Meshtastic Signal Meter Works + +The Meshtastic signal meter — the familiar bars or status color in the app — is calculated very differently than the "bars" on a traditional cell phone or Wi-Fi router. + +Most consumer devices simply measure how "loud" a signal is. However, because Meshtastic uses **LoRa (Long Range)** technology, its signal meter measures how **clear** the signal is, relative to the specific settings your mesh is using. + +--- + +## 1. The Two Metrics: "Loudness" vs. "Clarity" + +Every time the LoRa radio chip receives a message, it reports two measurements: + +- **RSSI (Received Signal Strength Indicator):** The **loudness** of the raw power hitting your antenna. +- **SNR (Signal-to-Noise Ratio):** The **clarity** of the signal compared to the background static. + +> **Tip — The Analogy:** Imagine you are trying to hear a friend talking to you. +> +> - **RSSI** is how loud their voice is. +> - **The Noise Floor** is the background noise in the room (air conditioning, other people talking, traffic). +> - **SNR** is how easily you can distinguish your friend's voice from the background noise. + +If your friend shouts at you at a deafening rock concert, the signal is incredibly loud (High RSSI), but you still can't understand them because the background noise is louder (Bad SNR). Conversely, if your friend whispers to you in a dead-silent library, the signal is very weak (Low RSSI), but you can understand them perfectly (Great SNR). + +--- + +## 2. The Magic of LoRa: Hearing "Below the Noise Floor" + +For standard radios (like FM or Wi-Fi), if the background noise is louder than the signal (a negative SNR), the receiver just hears static. + +LoRa is special. It uses **"Spread Spectrum"** modulation, which allows the radio to mathematically pull a signal out of the air even when it is buried deep _underneath_ the background noise. This is why you will frequently see **negative SNR numbers** in Meshtastic (e.g., -10 dB, which means the signal is 10 decibels weaker than the background static). + +Depending on which Meshtastic preset you are using (e.g., `LongFast` vs. `ShortFast`), the radio has a specific **SNR Limit** — the absolute maximum amount of noise it can tolerate before the message is completely lost to the static. + +--- + +## 3. How the Signal Meter Calculates Quality + +The Meshtastic apps take both RSSI and SNR and run them through a specific formula to assign your signal a quality rating (None, Bad, Fair, or Good). It specifically scales these values based on the physical limits of the radio preset you are using. + +Here is exactly how the app decides how many bars (or what color) to show you: + +| Level | Bars | Criteria | Meaning | +| ----- | ---- | ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | +| 良 | 3 | RSSI better than `-115 dBm` **AND** SNR better than `-7 dB` | Signal is both loud and clear — healthy connection. | +| 普通 | 2 | RSSI better than `-126 dBm` with good SNR, **OR** SNR better than `-15 dB` with good RSSI | Signal getting quieter or noisier, but still decodable. | +| 不良 | 1 | Falls between Fair and None thresholds | At the edge of range or experiencing interference. | +| なし | 0 | RSSI worse than `-126 dBm` **AND** SNR worse than `-15 dB` | Transmission completely buried in noise. | + +--- + +## 4. What This Means for You + +Because Meshtastic's meter acts as a **"Clarity Meter"**, it behaves differently than what most people expect: + +> **Tip — Don't panic over low RSSI:** You might see a seemingly terrible RSSI value like `-118 dBm`. On a cell phone, you would have zero bars. But if you have an SNR of `+2 dB`, Meshtastic will still show a strong signal! _The library is quiet, so the whisper is heard perfectly._ + +> **Warning — Watch out for local noise:** If you hook up a massive antenna and see a great RSSI (e.g., `-90 dBm`) but your signal meter is only showing **1 Bar (Bad)**, you have a problem. It means you have local interference — perhaps a cheap power supply, a noisy computer, or a nearby radio tower — creating so much static that it is drowning out your mesh. + +## Where Signal Information Appears + +In the app, signal data is shown in several places: + +- **Node list** — signal bars icon next to each node +- **Node detail** — SNR, RSSI, and signal quality in the device metrics section +- **Traceroute** — per-hop signal quality for each relay node +- **Signal metrics** — historical SNR and RSSI data in the metrics charts + +![Node entry showing SNR, RSSI values and colored signal bars](/assets/screenshots/nodes_signal_info.png) + diff --git a/docs/ja-rJP/user/tak.md b/docs/ja-rJP/user/tak.md new file mode 100644 index 000000000..95966913a --- /dev/null +++ b/docs/ja-rJP/user/tak.md @@ -0,0 +1,126 @@ +--- +title: TAK Integration +nav_order: 10 +last_updated: 2026-05-13 +description: Interoperate with ATAK and WinTAK — CoT position sharing, TAK roles, and plugin setup. +aliases: + - tak + - atak + - team-awareness-kit +--- + +# TAK Integration + +Meshtastic integrates with the Team Awareness Kit (TAK) ecosystem, enabling interoperability between Meshtastic mesh devices and TAK applications like ATAK and WinTAK. + +## Overview + +The TAK module allows Meshtastic nodes to: + +- Share position data in TAK-compatible CoT (Cursor on Target) format +- Appear as team members on TAK map displays +- Receive TAK PLI (Position Location Information) messages + +## Setup + +### Prerequisites + +- ATAK (Android Team Awareness Kit) or WinTAK installed +- Meshtastic ATAK Plugin installed +- TAK module enabled on your Meshtastic radio + +### 設定 + +1. Navigate to **Settings → Module Config → TAK**. +2. Enable the TAK module. +3. Configure the TAK team/group settings: + +![Module toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | 説明 | +| ------- | -------------------------- | +| Enabled | Activate TAK interop | +| Mode | TAK-compatible output mode | + +### ATAK Plugin Setup + +1. Install the Meshtastic ATAK Plugin from the plugin repository. +2. Open ATAK and enable the Meshtastic plugin. +3. The plugin bridges messages between ATAK and your mesh network. + +## TAK Roles + +Nodes configured with TAK-related roles behave differently from standard clients: + +| 役割 | 説明 | +| --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **TAK** | Full TAK interoperability — sends and receives CoT data, chat messages, and PLI updates. Functions as a standard client plus TAK bridge. | +| **TAK Tracker** | Position-only TAK output — automatically broadcasts PLI at regular intervals without user interaction. Optimized for unattended position beacons (vehicles, equipment, waypoints). Does not relay chat messages. | + +> 💡 **Tip:** Use **TAK Tracker** for devices that only need to report position (e.g., a radio mounted in a vehicle). Use **TAK** for devices where users actively participate in TAK operations. + +### CoT (Cursor on Target) Format + +TAK messages use the Cursor on Target XML format — a military standard for sharing situational awareness data. Meshtastic converts its internal protobuf messages to CoT format when bridging to TAK systems, so no manual format conversion is needed. + +## TAK Identity + +When using TAK roles, your node broadcasts identity information that appears on TAK maps: + +| Setting | 説明 | +| -------- | ---------------------------------------------------------------------------------------------------------------- | +| Team | Your team color on the TAK map (e.g., Blue, Red, Cyan, Green) | +| 役割 | Your operational role (Team Member, Team Lead, HQ, Medic, RTO, etc.) | +| Callsign | Your TAK callsign (defaults to your Meshtastic long name) | + +These settings appear in **Settings → Module Config → TAK** when the TAK module is enabled. + +> 💡 **Tip:** Team/role colors are the standard TAK affiliation colors. Coordinate with your TAK team to use consistent team assignments. + +## Wire Format (V1 / V2) + +Meshtastic supports two TAK wire formats: + +| Format | Compatibility | Features | +| ------------------------------- | --------------------------------------------------------------- | --------------------------------------------------------- | +| V1 (Legacy) | ATAK Plugin v1.x, older firmware | Basic CoT position sharing only | +| V2 (Current) | ATAK Plugin v2.x, firmware 2.3+ | Full CoT support including chat, routes, zstd compression | + +The app automatically selects V2 when both sides support it. No manual configuration needed — the TAK module negotiates format based on firmware capabilities. + +## Usage with ATAK + +Once configured: + +- Meshtastic nodes appear as markers on the ATAK map with callsign labels +- Chat messages can bridge between mesh and TAK networks +- Position updates flow bidirectionally between Meshtastic and TAK +- TAK Tracker nodes broadcast PLI automatically — their positions appear on ATAK maps without any ATAK-side configuration + +> ⚠️ **Note:** TAK integration requires specific node roles and module configuration. Standard client nodes don't automatically participate in TAK operations. + +## Troubleshooting + +| Problem | Cause | Solution | +| -------------------------------- | ------------------------------------- | ----------------------------------------------------------------------- | +| Node doesn't appear on ATAK map | TAK module disabled or wrong role | Verify TAK module is enabled and node role is TAK or TAK Tracker | +| Position updates are stale | GPS fix lost or interval too long | Check GPS status; reduce position broadcast interval in Position Config | +| ATAK plugin shows "disconnected" | BLE connection lost or plugin crashed | Reconnect Bluetooth in Meshtastic app, then restart ATAK plugin | +| Chat messages not bridging | V1 format doesn't support chat | Ensure both nodes run firmware 2.3+ for V2 wire format | +| CoT data not flowing | Channel mismatch | All TAK nodes must be on the same channel with matching encryption | + +## Security Considerations + +- TAK data shares your position and callsign information +- Ensure your channel encryption is configured when using TAK in sensitive environments +- The TAK module respects the same channel encryption as other Meshtastic messages + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — TAK module configuration +- [Nodes](nodes) — TAK and TAK Tracker roles in the node list +- [Map & Waypoints](map-and-waypoints) — node positions on the map +- [ATAK plugin guide](https://meshtastic.org/docs/software/integrations/atak-plugin) — detailed ATAK setup on meshtastic.org + +--- + diff --git a/docs/ja-rJP/user/telemetry-and-sensors.md b/docs/ja-rJP/user/telemetry-and-sensors.md new file mode 100644 index 000000000..5abe5e378 --- /dev/null +++ b/docs/ja-rJP/user/telemetry-and-sensors.md @@ -0,0 +1,118 @@ +--- +title: Telemetry & Sensors +nav_order: 9 +last_updated: 2026-05-13 +description: Sensor data on the mesh — supported environment, air quality, and power sensors, plus configuration and viewing guides. +aliases: + - sensors + - environment + - weather + - power-metrics +--- + +# Telemetry & Sensors + +Meshtastic nodes can collect and share sensor data across the mesh network. + +## Overview + +Telemetry allows nodes equipped with sensors to broadcast environmental, power, and device health information. This data is visible on the node detail screen and can be logged over time. + +## Device Telemetry + +All Meshtastic nodes report basic device telemetry: + +| Metric | 説明 | Typical Range | +| ------------------ | ------------------------------ | ------------------------------------------------------------------ | +| Battery Level | Charge percentage | 0–100% | +| 電圧 | Battery voltage | 3.0–4.2V (LiPo) | +| チャンネル全体の利用率 | % of airtime used locally | 0–100% | +| Air Utilization TX | % of airtime used by this node | 0–100% | +| 連続稼働時間 | Seconds since last boot | Varies | + +## Environment Sensors + +Supported environmental sensors: + +### Temperature & Humidity + +| センサー | 温度 | 湿度 | 気圧 | Notes | +| ------- | -- | -- | -- | ----------------------- | +| BME280 | ✓ | ✓ | ✓ | Recommended all-in-one | +| BME680 | ✓ | ✓ | ✓ | Adds gas resistance/IAQ | +| SHT31 | ✓ | ✓ | — | High accuracy | +| MCP9808 | ✓ | — | — | Precision temperature | +| LPS22 | — | — | ✓ | Pressure only | + +### Air Quality + +| センサー | Metric | Notes | +| -------- | -------------------------------------------------- | -------------------------- | +| BME680 | Gas Resistance / IAQ | Volatile organic compounds | +| PMSA003I | PM1.0, PM2.5, PM10 | Particulate matter | +| SEN55 | PM, NOx, VOC, Temp, Humidity | Multi-sensor | + +### Light & UV + +| センサー | Metric | +| -------- | -------------------------------------- | +| OPT3001 | Ambient light (lux) | +| VEML7700 | Ambient light (lux) | +| LTR390 | UV index | + +## Power Metrics + +Nodes with INA-series power sensors can report: + +| Metric | 説明 | +| ----------- | ----------------------------------------- | +| Bus Voltage | Supply rail voltage | +| 電流 | Power consumption (mA) | +| 電源 | Calculated power (mW) | + +Useful for monitoring solar charging or battery health on remote nodes. + +## Configuring Telemetry + +1. Navigate to **Settings → Module Config → Telemetry**. +2. Set reporting intervals: + - **Device Metrics Interval** — how often to broadcast device metrics + - **Environment Metrics Interval** — how often to broadcast sensor data +3. Enable specific sensor types as needed. + +### Recommended Intervals + +| Use Case | Device (s) | Environment (s) | +| ------------------------------------------ | ----------------------------- | ---------------------------------- | +| Urban mesh (many nodes) | 3600 | 3600 | +| Rural mesh (few nodes) | 900 | 900 | +| Weather station | 900 | 300 | +| Battery conservation | 7200 | 7200 | + +> ⚠️ **Note:** Shorter intervals increase airtime usage and battery drain across the mesh. + +## Viewing Telemetry + +1. Navigate to **Nodes** and select a node. +2. Telemetry sections show on the detail screen: + - Device Metrics (always available) + - Environment Metrics (if sensors present) + - Power Metrics (if INA sensor present) +3. Historical graphs show trends over time. + +![Telemetry actions](/assets/screenshots/node-metrics_telemetric_actions.png) + +## Troubleshooting + +- **No environment data showing?** The remote node needs a physical sensor connected (e.g., BME280 on I2C). Device telemetry (battery, uptime) is always available, but environment metrics require hardware. +- **Stale readings?** Check the reporting interval — very long intervals (7200s+) mean data updates infrequently. Also verify the remote node is still online. +- **Sensor conflict on I2C bus?** Some sensors share I2C addresses. If you have multiple sensors on the same bus, check for address collisions in the radio's serial debug output. + +## Related Topics + +- [Node Metrics](node-metrics) — view telemetry data on the node detail screen +- [Settings — Modules & Admin](settings-module-admin) — telemetry module configuration +- [Units & Locale](units-and-locale) — temperature and pressure display units + +--- + diff --git a/docs/ja-rJP/user/translate.md b/docs/ja-rJP/user/translate.md new file mode 100644 index 000000000..b2ed79a34 --- /dev/null +++ b/docs/ja-rJP/user/translate.md @@ -0,0 +1,97 @@ +--- +title: Translate the App +parent: User Guide +nav_order: 17 +last_updated: 2026-05-13 +aliases: + - translate + - crowdin + - localization +--- + +# Translate the App + +Contributing translations helps make Meshtastic accessible to a wider audience. The app uses [Crowdin](https://crowdin.com/) to manage community translations for both the user interface and in-app documentation. + +--- + +## What Gets Translated + +| Resource | Source Location | Notes | +| ----------------- | ------------------------------------- | ---------------------------------------------------------------------- | +| UI strings | `composeResources/values/strings.xml` | Buttons, labels, messages, and all user-visible text | +| User Guide pages | `docs/user/*.md` | In-app documentation shown in Help & Documentation | +| Fastlane metadata | `fastlane/metadata/android/en-US/` | App Store listing title, description, and changelogs | + +> **Note — Developer Guide pages are English-only.** Code-focused documentation targeting contributors is not translated. + +--- + +## How to Contribute + +1. **Visit the Crowdin project.** Open the [Meshtastic Android Crowdin project](https://crowdin.com/project/meshtastic-android) and sign in or create a free account. +2. **Choose your language.** Select an existing language or request a new one by opening a [GitHub issue](https://github.com/meshtastic/Meshtastic-Android/issues/new). +3. **Translate strings.** Crowdin shows the English source on the left and your translation on the right. Translate each string and save. +4. **Review context.** Many strings include screenshots or context comments — check these to understand where the text appears in the app. +5. **Submit.** Approved translations are automatically merged into the next release. + +> **Tip — Keep translations short.** UI strings often appear in buttons, chips, or narrow columns. If a translation is significantly longer than the English original, consider abbreviating where the meaning stays clear. + +--- + +## Adding a New Language + +If your language is not yet listed on Crowdin: + +1. Open an issue on [GitHub](https://github.com/meshtastic/Meshtastic-Android/issues/new) requesting the new locale. +2. A maintainer will add the language to Crowdin and configure `crowdin.yml`. +3. Once added, you can begin translating immediately. + +--- + +## How Translations Are Organized + +The Android app uses **Compose Multiplatform resources** for all user-visible strings: + +``` +core/resources/src/commonMain/composeResources/ +├── values/ ← English (default) +│ └── strings.xml +├── values-de/ ← German +│ └── strings.xml +├── values-fr/ ← French +│ └── strings.xml +└── ... +``` + +In-app documentation follows a similar pattern under `docs/`: + +``` +docs/ +├── user/ ← English source (default) +│ ├── onboarding.md +│ └── ... +├── fr/user/ ← French translations +│ ├── onboarding.md +│ └── ... +└── ... +``` + +The app automatically selects the correct locale based on your device's **Language & Region** settings. + +--- + +## Translation Guidelines + +- **Do not translate** technical terms like "LoRa", "MQTT", "BLE", "TAK", "SNR", or "RSSI" — these are universal. +- **Keep placeholders intact.** Strings like `%1$s` or `%d` are filled in at runtime. Do not remove or reorder them unless the grammar of your language requires it. +- **Match tone.** The app uses a friendly, direct voice. Avoid overly formal language. +- **Test if possible.** Switch your device language and open the app to see how translations look in context. + +--- + +## Questions? + +If you have questions about a specific string's context or need help getting started, open a discussion on the [Meshtastic GitHub Discussions](https://github.com/meshtastic/Meshtastic-Android/discussions) page. + +Thank you for helping expand the reach of Meshtastic! diff --git a/docs/ja-rJP/user/units-and-locale.md b/docs/ja-rJP/user/units-and-locale.md new file mode 100644 index 000000000..9a2fe61c6 --- /dev/null +++ b/docs/ja-rJP/user/units-and-locale.md @@ -0,0 +1,118 @@ +--- +title: Units, Measurement & Locale +parent: User Guide +nav_order: 16 +last_updated: 2026-05-12 +--- + +# Units, Measurement & Locale + +The Meshtastic app automatically displays temperatures, distances, speeds, and times in the units your device is configured to use — no settings to change inside the app. + +--- + +## How It Works + +Meshtastic radios always transmit data in **metric units** (meters, °C, km/h, hPa, etc.). When the app receives this data, it uses the `MetricFormatter` utility to convert and display values in whatever unit system your device's locale specifies. + +On Android, your measurement preferences are determined by your system **Language & Region** settings. On Desktop (JVM), the app uses the JVM's default `Locale`. + +> **Tip — You never need to toggle units inside the app.** Change your system measurement preferences and every screen in Meshtastic updates automatically — node details, telemetry charts, weather, altitude, and more. + +--- + +## 温度 + +Temperature values from environment sensors are transmitted as **°C** and displayed based on your device's temperature unit preference. + +![Environment metrics with temperature](/assets/screenshots/nodes_environment_metrics.png) + +| Your Setting | You See | +| ------------ | ------- | +| Celsius | 22°C | +| Fahrenheit | 72°F | + +This affects all temperature displays throughout the app: node environment telemetry, soil temperature, dew point, and telemetry chart axes. + +## Distance & Altitude + +Distances between nodes and GPS altitudes are transmitted as **meters** and automatically scaled and converted. + +![Distance info display](/assets/screenshots/nodes_distance_info.png) + +| Your Setting | Small Distance | Large Distance | 標高 | +| -------------------------------- | -------------- | ---------------------- | -------- | +| Metric | 350 m | 2.5 km | 1,200 m | +| Imperial (US) | 1,148 ft | 1.6 mi | 3,937 ft | + +The app uses natural scaling — short distances stay in meters or feet, while longer distances switch to kilometres or miles automatically. + +### Where these appear + +- **Node list** — distance and bearing to each node +- **Node detail** — altitude, distance from your position +- **Map** — waypoint distances, traceroute hop distances +- **Compass** — distance to selected node + +## Speed + +GPS ground speed is displayed in your locale's preferred speed unit. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Metric | 12 km/h | +| Imperial (US) | 7 mph | + +## 風力 + +Wind speed and gust data from environment sensors are transmitted as **m/s** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Metric | 5 m/s | +| Imperial (US) | 11 mph | + +Wind readings appear in the **Node Detail** environment section and the **Environment Telemetry** charts. + +## Rainfall + +Rainfall measurements (1-hour and 24-hour totals) are transmitted as **mm** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ---------------------- | +| Metric | 12 mm | +| Imperial (US) | 0.5 in | + +## Units That Never Change + +Some units are international standards and are displayed the same way regardless of your locale: + +| Measurement | Unit | Why | +| -------------------------------- | ------------------------------ | ------------------------------------- | +| Barometric pressure | hPa | International meteorological standard | +| Heading / bearing | ° (degrees) | Universal navigation convention | +| 放射線 | μR/hr | Standard dosimetry unit | +| GPS coordinates | decimal degrees | Universal geographic standard | +| Humidity, battery, soil moisture | % | Universal | + +## Date & Time + +All timestamps throughout the app — last heard, message times, telemetry logs, chart axes — follow your device's date and time preferences. + +| Setting | What It Controls | Example | +| ---------------- | ---------------- | ------------------------------------------------ | +| **24-Hour Time** | Clock format | 14:30 vs 2:30 PM | +| **Date Format** | Date ordering | 09/05/2026 vs 05/09/2026 | + +The app also uses **relative time** where it makes sense — for example, "5 min ago" or "2 hours ago" in the node list — which is automatically localised into your device language. + +## Changing Your Measurement System (Android) + +On Android, your measurement system (metric vs imperial) is tied to your region setting: + +1. Open **Android Settings → System → Language & Region** +2. Change your **Region** or **Measurement units** preference +3. Return to Meshtastic — values update immediately + +> **Tip — The app uses `MetricFormatter` from `core:common`.** All measurement formatting is handled by a shared KMP utility that respects your platform's locale. Developers adding new measurement displays should use `MetricFormatter` rather than hard-coding unit conversions. + diff --git a/docs/ko-rKR/index.md b/docs/ko-rKR/index.md new file mode 100644 index 000000000..9b15258d6 --- /dev/null +++ b/docs/ko-rKR/index.md @@ -0,0 +1,30 @@ +--- +title: Home +layout: default +nav_order: 0 +--- + +# Meshtastic Android App Documentation + +User and developer documentation for the Meshtastic Android, Desktop, and iOS applications powered by KMP (Kotlin Multiplatform). + +Use the sidebar navigation to browse the **User Guide** for app features and the **Developer Guide** for contributing to the project. + +--- + +## Quick Links + +| Guide | 설명 | +| --------------------------------------------------------------------- | -------------------------------------------------------------- | +| [Getting Started](user/onboarding) | Connect your first radio and send a message | +| [Messages & Channels](user/messages-and-channels) | Channel broadcasts, direct messages, reactions, and encryption | +| [Nodes](user/nodes) | Understanding the mesh network node list | +| [Signal Meter](user/signal-meter) | How the LoRa signal quality meter works | +| [Units & Locale](user/units-and-locale) | How temperatures, distances, and times adapt to your region | +| [Desktop App](user/desktop) | Linux, macOS, and Windows desktop usage | +| [Architecture](developer/architecture) | App architecture overview for contributors | +| [Contributing](developer/contributing) | Branch naming, PR workflow, and verification commands | + +--- + +> This documentation is served from the same markdown source that powers the in-app **Help & Documentation** browser. diff --git a/docs/ko-rKR/user/connections.md b/docs/ko-rKR/user/connections.md new file mode 100644 index 000000000..f3e3f456f --- /dev/null +++ b/docs/ko-rKR/user/connections.md @@ -0,0 +1,125 @@ +--- +title: Connections +nav_order: 2 +last_updated: 2026-05-13 +description: Connect your phone or desktop to a Meshtastic radio via Bluetooth, USB, or TCP/IP. +aliases: + - bluetooth + - usb + - tcp + - pairing +--- + +# Connections + +Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node. + +## Bluetooth (BLE) + +Bluetooth Low Energy is the default and most common connection method on Android. + +### Pairing a Device + +1. Ensure your Meshtastic radio is powered on and in pairing mode. +2. Open the app and navigate to **Connections**. +3. Tap **Scan for Devices** — nearby Meshtastic radios will appear. +4. Select your device from the list. +5. Accept the Bluetooth pairing prompt if shown. + +![Device list item](/assets/screenshots/connections_bluetooth_scan.png) + +You can filter devices by transport type using the filter chips at the top: + +![Transport filter chips](/assets/screenshots/connections_transport_filters.png) + +> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. + +### Connection Status + +| Icon | State | 설명 | +| ---- | -------------- | ----------------------------- | +| 🟢 | 연결됨 | Active radio link established | +| 🟡 | 연결 중 | Handshake in progress | +| 🔴 | 연결 끊김 | No active connection | +| ⚪ | Not configured | No device selected | + +When connecting, a status indicator shows the current connection state: + +![Connecting status](/assets/screenshots/connections_connecting.png) + +If no devices are found, the app shows an empty state with instructions: + +![No devices found](/assets/screenshots/connections_empty_state.png) + +### Troubleshooting Bluetooth + +- **Device not found:** Toggle Bluetooth off/on, ensure location is enabled. +- **Connection drops:** Move closer to the radio; check for interference. +- **Pairing rejected:** Forget the device in Android Bluetooth settings and retry. + +## USB Serial + +USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable. + +### Setup + +1. Connect your radio via USB cable to your device. +2. The app will prompt for USB permission — tap **Allow**. +3. The connection is established automatically. + +> ⚠️ **Note:** USB connections require OTG support on Android devices. + +## TCP/IP (WiFi) + +Some Meshtastic radios support WiFi connectivity, allowing TCP-based connections. + +### 설정 + +1. Connect your radio to a WiFi network via the radio's web interface or settings. +2. In the app, go to **Connections → TCP**. +3. Enter the radio's IP address and port (default: 4403). +4. Tap **Connect**. + +![WiFi scanning for devices](/assets/screenshots/connections_wifi_scanning.png) + +When a device is found, it appears in the connection list: + +![WiFi device found](/assets/screenshots/connections_wifi_device_found.png) + +A successful connection is confirmed with a status indicator: + +![WiFi connection success](/assets/screenshots/connections_wifi_success.png) + +### When to Use TCP + +- Radio is on the same local network +- Testing with a simulated radio +- Environments where Bluetooth has interference issues + +## Reconnection Behavior + +The app reconnects to the **last selected device** on startup. You can manually switch transports from the connections screen at any time. + +To disconnect from a radio, use the disconnect button on the connections screen: + +![Disconnect from radio](/assets/screenshots/connections_disconnect.png) + +## Desktop Connections + +On Desktop (Linux/macOS/Windows), the app supports: + +- **Bluetooth (BLE)** — via the Kable library; works on macOS, Linux, and Windows +- **USB Serial** — primary wired connection method +- **TCP/IP** — for network-connected radios + +See [Desktop App](desktop) for platform-specific details and keyboard shortcuts. + +## Related Topics + +- [Getting Started](onboarding) — first-launch setup and permissions +- [Settings — Radio & User](settings-radio-user) — Bluetooth and network configuration +- [Desktop App](desktop) — desktop-specific connection details +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — full list of compatible radios on meshtastic.org + +--- + diff --git a/docs/ko-rKR/user/desktop.md b/docs/ko-rKR/user/desktop.md new file mode 100644 index 000000000..575b57945 --- /dev/null +++ b/docs/ko-rKR/user/desktop.md @@ -0,0 +1,147 @@ +--- +title: Desktop App +nav_order: 14 +last_updated: 2026-05-13 +description: Install and use the Meshtastic Desktop app on Linux, macOS, and Windows — connections, feature parity, and keyboard shortcuts. +aliases: + - desktop + - linux + - macos + - windows + - jvm +--- + +# Desktop App + +The Meshtastic Desktop application provides the same mesh communication features on Linux, macOS, and Windows. + +## Overview + +The Desktop app shares its core codebase with the Android app through Kotlin Multiplatform (KMP). Most features work identically across platforms. + +## Installation + +### Linux + +- Download the `.deb` or `.AppImage` package from the releases page +- Or build from source using `./gradlew :desktopApp:run` + +### macOS + +- Download the `.dmg` package from releases +- Or build from source + +### Windows + +- Download the `.msi` installer from releases +- Or build from source + +## Connecting Your Radio + +### USB Serial (Primary) + +The most reliable connection method on Desktop: + +1. Connect your Meshtastic radio via USB cable. +2. The app should detect the serial port automatically. +3. If not detected, select the correct serial port from the connections menu. + +### TCP/IP + +For network-connected radios: + +1. Enter the radio's IP address and port (default: 4403). +2. Click **Connect**. + +### Bluetooth (BLE) + +Bluetooth Low Energy is supported on Desktop via the [Kable](https://github.com/JuulLabs/kable) library: + +1. Ensure your system has a Bluetooth adapter. +2. The app scans for nearby Meshtastic radios automatically. +3. Select your device from the connections screen. + +## Feature Parity + +| Feature | Android | Desktop | Notes | +| ---------------------------------------- | ------- | ------- | -------------------------- | +| Messaging | ✓ | ✓ | Full parity | +| Node List | ✓ | ✓ | Full parity | +| 지도 | ✓ | ✓ | Full parity | +| 설정 | ✓ | ✓ | Full parity | +| Bluetooth (BLE) | ✓ | ✓ | Via Kable on desktop | +| Firmware Update OTA | ✓ | ✗ | Use web flasher | +| Notifications | ✓ | ✓ | Native OS notifications | +| Widgets | ✓ | ✗ | Android-only | +| AI Assistant (Chirpy) | ✓\* | ✗ | Google flavor Android only | + +\*Chirpy AI requires Android 14+ on Google flavor builds with supported hardware. + +## UI Differences + +The Desktop app uses the same Compose Multiplatform UI with adaptations for larger screens and desktop interaction. + +### Keyboard Shortcuts + +| Shortcut | Action | +| ------------------- | --------------------------- | +| **⌘Q** / **Ctrl+Q** | Quit the application | +| **⌘,** / **Ctrl+,** | Open Settings | +| **⌘1** / **Ctrl+1** | Switch to Conversations tab | +| **⌘2** / **Ctrl+2** | Switch to Nodes tab | +| **⌘3** / **Ctrl+3** | Switch to Map tab | +| **⌘4** / **Ctrl+4** | Switch to Connections tab | + +### Window & System Tray + +- **Window resizing** — responsive layout adapts to window dimensions +- **System tray** — minimize to system tray for background mesh operation +- **Tray menu** — right-click the tray icon to show window or quit +- **Mouse interaction** — hover states and standard desktop navigation + +### Notification Preferences + +The Desktop app provides in-app toggles for controlling which notifications are shown — messages, new nodes, and low battery alerts. Access these from **Settings → Notifications** within the app. + +## Built-in Documentation Browser + +The Desktop app includes a built-in documentation browser for quick access to help content without leaving the application. + +![Docs browser with table of contents](/assets/screenshots/docs-browser_toc.png) + +The browser supports full-text search across all documentation: + +![Searching the docs browser](/assets/screenshots/docs-browser_search.png) + +Individual doc pages render with full formatting: + +![A documentation page](/assets/screenshots/docs-browser_page.png) + +## Building from Source + +```bash +git clone https://github.com/meshtastic/Meshtastic-Android.git +cd Meshtastic-Android +git submodule update --init +./gradlew :desktopApp:run +``` + +Requirements: + +- JDK 21 +- No Android SDK required for desktop-only builds + +## Known Limitations + +- No OTA firmware updates (use web flasher) +- Some Android-specific features (widgets, specific notification channels) are unavailable +- Performance may vary on low-spec hardware running Compose Desktop +- BLE bonding is not yet supported on desktop (pairing works without bonding) + +## Related Topics + +- [Connections](connections) — connection methods overview +- [Firmware Updates](firmware) — use the [Web Flasher](https://flasher.meshtastic.org) for desktop firmware updates + +--- + diff --git a/docs/ko-rKR/user/discovery.md b/docs/ko-rKR/user/discovery.md new file mode 100644 index 000000000..9f8a76924 --- /dev/null +++ b/docs/ko-rKR/user/discovery.md @@ -0,0 +1,114 @@ +--- +title: Discovery +nav_order: 12 +last_updated: 2026-05-13 +description: Explore your mesh network — traceroute paths, neighbor maps, and node discovery tools. +aliases: + - mesh-discovery + - local-discovery + - network-scan + - traceroute + - neighbor-info +--- + +# Discovery + +Discovery tools help you understand **how** your mesh network is connected — which nodes can hear each other, what paths messages take, and where bottlenecks or weak links exist. + +> 💡 **Tip:** You don't need a dedicated "discovery mode" to start exploring your mesh. The tools below are available right now from the node list and node detail screens. + +--- + +## 추적 루트 + +Traceroute reveals the exact path a message takes from your node to any other node on the mesh. It's the single most useful tool for debugging connectivity problems. + +### Running a Traceroute + +1. Navigate to **Nodes** and tap the node you want to trace. +2. On the node detail screen, tap **Traceroute**. +3. The app sends a traceroute request and waits for the response. +4. Results display each hop in order, with signal quality at every step. + +### Reading the Results + +A traceroute result looks like this: + +``` +You → Node A (SNR: 8.5, RSSI: -95) → Node B (SNR: 5.2, RSSI: -108) → Target +``` + +Each hop represents a relay node that forwarded the message. The SNR and RSSI values at each hop tell you about the link quality on that specific segment. + +| What to look for | What it means | +| -------------------------------------------------------------------------- | --------------------------------------------------------------------------- | +| All hops show Good SNR (> 5 dB) | Healthy path — messages flow reliably | +| One hop shows Bad SNR (< 0 dB) | Weak link — this relay segment is fragile | +| Many hops (4+) | Long path — consider repositioning a node to shorten it | +| Different path on retry | Mesh is adapting — multiple routes exist (this is good!) | + +> 💡 **Tip:** Run traceroute several times over a few minutes. If the path changes, your mesh has redundant routes — a sign of a well-connected network. + +### Troubleshooting with Traceroute + +- **"No route found"** — The target node may be offline, out of range, or on a different channel. Check that both nodes share at least one channel with the same encryption key. +- **Traceroute times out** — The path may be too long (exceeds hop limit) or a relay node is congested. Try increasing the hop limit in **Settings → LoRa Config**. +- **Asymmetric paths** — A traceroute from A→B may take a different path than B→A. This is normal — radio propagation is not always symmetric. + +--- + +## 이웃 정보 + +The Neighbor Info module lets each node broadcast a list of the nodes it can **directly hear** (single-hop). When multiple nodes share their neighbor lists, you can piece together a topology map of the entire mesh. + +### Enabling Neighbor Info + +1. Navigate to **Settings → Module Config → Neighbor Info**. +2. Enable the module. +3. Set the broadcast interval (default: 900 seconds / 15 minutes). + +Once enabled, your node periodically broadcasts its neighbor table. Other nodes with Neighbor Info enabled do the same. + +### Viewing Neighbor Data + +- Open any node's detail screen and look for the **Neighbors** section. +- Each neighbor entry shows the node that was directly heard and its signal quality. +- Combine neighbor data from multiple nodes to understand the full mesh topology. + +> ⚠️ **Note:** Neighbor Info increases airtime usage because every enabled node periodically broadcasts its neighbor list. On busy meshes with many nodes, consider longer broadcast intervals (3600 seconds or more) to avoid congestion. + +--- + +## Node List as a Discovery Tool + +The node list itself is a powerful discovery tool when you use its filtering and sorting features effectively. + +### Finding New Nodes + +- Sort by **Last heard** to see the most recently active nodes at the top. +- Enable **Include unknown** to see nodes that have appeared on the mesh but haven't sent user info yet — these are often newly powered-on devices. + +### Assessing Connectivity + +- Sort by **Hops away** to see which nodes are directly reachable (0 hops) versus relayed. +- Sort by **Distance** to find nearby nodes and verify they're reachable. +- Use **Exclude MQTT** to focus on nodes reachable over radio (not via internet bridge). + +### Infrastructure Audit + +- Disable **Exclude infrastructure** to see Router, Repeater, Router Late, and Client Base nodes. +- Check their signal quality and last-heard times to verify your infrastructure nodes are healthy. + +See [Nodes](nodes) for full details on filtering and sorting options. + +--- + +## Tips for Mesh Exploration + +- **Start with traceroute** — it gives you immediate, actionable information about a specific path. +- **Enable Neighbor Info on key nodes** — especially routers and repeaters, to build a picture of the backbone. +- **Check the map** — node positions on the [Map](map-and-waypoints) combined with signal data help you understand why some links are strong and others are weak. +- **Compare signal over time** — use the [Signal Meter](signal-meter) guide to interpret SNR and RSSI values correctly. + +--- + diff --git a/docs/ko-rKR/user/firmware.md b/docs/ko-rKR/user/firmware.md new file mode 100644 index 000000000..8c7f03bca --- /dev/null +++ b/docs/ko-rKR/user/firmware.md @@ -0,0 +1,114 @@ +--- +title: Firmware Updates +nav_order: 13 +last_updated: 2026-05-13 +description: Update your radio firmware over Bluetooth — OTA process, version channels, pre-flight checks, and recovery. +aliases: + - firmware + - update + - ota + - flash +--- + +# Firmware Updates + +Keep your Meshtastic radio up to date with the latest firmware for new features, bug fixes, and security improvements. + +## Checking for Updates + +1. Navigate to **Settings → Firmware Update** or tap the firmware notification if shown. +2. The app checks for available firmware versions. +3. Available updates show the version number and changelog summary. + +## Update Methods + +### OTA (Over-The-Air) via Bluetooth + +The most common update method for Android users: + +1. Ensure your radio is connected via Bluetooth. +2. Navigate to the Firmware Update screen. +3. Select the desired firmware version. +4. Tap **Update** to begin the OTA process. +5. Wait for the update to complete — **do not disconnect** during the update. + +![Firmware checking for updates](/assets/screenshots/firmware_checking.png) + +> ⚠️ **Warning:** Interrupting a firmware update can brick your device. Ensure your radio has sufficient battery (>50% recommended) and maintain Bluetooth proximity during the entire process. + +![Firmware disclaimer](/assets/screenshots/firmware_disclaimer.png) + +### USB Flashing + +For recovery or when OTA is unavailable: + +- Use the [Meshtastic Web Flasher](https://flasher.meshtastic.org) +- Or the [Meshtastic CLI tool](https://meshtastic.org/docs/getting-started/flashing-firmware) on desktop + +## Version Channels + +| 채널 | 설명 | +| ------ | ------------------------------------------- | +| Stable | Recommended for most users; tested releases | +| Alpha | Preview releases; may contain bugs | + +## Pre-Update Checklist + +Before updating: + +- [ ] Battery > 50% +- [ ] Stable Bluetooth connection +- [ ] Note your current settings (they may reset on major version changes) +- [ ] Check the release notes for breaking changes + +## Post-Update + +After a successful update: + +- The radio will reboot automatically +- Bluetooth connection will re-establish +- Verify your settings are intact +- Check the firmware version in **Settings → About** + +![Firmware update success](/assets/screenshots/firmware_success.png) + +## Troubleshooting + +### Update Stuck + +If the update appears frozen: + +- Wait at least 5 minutes before intervening +- If truly stuck, power-cycle the radio +- Attempt the update again + +![Firmware update error](/assets/screenshots/firmware_error.png) + +### Device Won't Boot After Update + +If your device fails to boot: + +1. Try connecting via USB to a computer +2. Use the web flasher in recovery/DFU mode +3. Flash a known-good firmware version +4. Check the Meshtastic Discord for device-specific recovery steps + +### Compatibility Warnings + +The app may show warnings when: + +- Connected radio firmware is below minimum supported version +- Major version mismatch between app and firmware +- Deprecated features need migration + +> ⚠️ **Important:** Always update the Meshtastic app before or alongside firmware updates to ensure compatibility. + +## Related Topics + +- [Connections](connections) — reconnecting after a firmware update +- [Flashing firmware guide](https://meshtastic.org/docs/getting-started/flashing-firmware) — full firmware flashing walkthrough on meshtastic.org +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — check firmware compatibility by device +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/ko-rKR/user/map-and-waypoints.md b/docs/ko-rKR/user/map-and-waypoints.md new file mode 100644 index 000000000..b0ba11429 --- /dev/null +++ b/docs/ko-rKR/user/map-and-waypoints.md @@ -0,0 +1,116 @@ +--- +title: Map & Waypoints +nav_order: 6 +last_updated: 2026-05-13 +description: View node positions on the map, create and share waypoints, and manage position sharing and privacy. +aliases: + - map + - waypoints + - gps + - location +--- + +# Map & Waypoints + +The Map screen shows the geographic positions of nodes on your mesh, along with shared waypoints. + +## Map View + +The map displays: + +- **Node positions** — colored markers for each node reporting location +- **Waypoints** — shared points of interest +- **Your position** — your current GPS location + +### Node Markers + +Node markers on the map indicate: + +| Color | Meaning | +| ------ | ---------------------------------------------- | +| 초록 | Online (heard recently) | +| Yellow | Away (heard within 2 hours) | +| Gray | Offline (stale position) | +| 파랑 | Your own node | + +### Map Controls + +- **Zoom** — pinch or use +/- buttons +- **Pan** — drag to explore +- **Center** — select the location button to center on your position +- **Node tap** — tap a node marker to view details + +The floating toolbar provides quick access to compass, layer switching, node filters, refresh, and location tracking. Tap the compass to reorient north-up, or tap the location button to center on your current position. + +![Map controls overlay](/assets/screenshots/map_controls_overlay.png) + +## Waypoints + +Waypoints are shared geographic points of interest that all mesh members can see. + +### Creating a Waypoint + +1. Long-press on the map at the desired location. +2. Enter a name and optional description. +3. Choose an icon/emoji for the waypoint. +4. Tap **Send** to share with the mesh. + +### Waypoint Properties + +| Property | 설명 | +| ---------- | ------------------------------------------------------- | +| 이름 | Short identifier (max 30 characters) | +| 설명 | Optional longer description | +| Icon | Visual marker emoji on the map | +| 잠김 | If locked, only the creator can edit or delete | +| Expiration | Optional auto-remove time | + +### Waypoint Expiration + +Waypoints can be set to expire automatically: + +- **Never** (default) — waypoint remains until manually deleted +- **Timed** — waypoint is automatically removed after the specified duration (e.g., "remove after 2 hours"). Useful for temporary markers like rally points, hazards, or meeting locations. + +Expired waypoints are automatically hidden from the map so they don't clutter the display. The expiration countdown begins when the waypoint is created, not when other nodes receive it. + +### Managing Waypoints + +- Tap a waypoint on the map to view its details and coordinates +- Edit or delete waypoints you created +- **Locked waypoints** cannot be modified or deleted by other nodes — only the original creator can change them +- Unlocked waypoints can be edited by any mesh member + +## Position Sharing + +### Enabling Position Sharing + +Your node shares its GPS position based on: + +- **Fixed interval** — broadcast position at regular intervals +- **Smart position** — broadcast when movement exceeds a threshold +- **Manual** — only share when explicitly requested + +Configure position behavior in **Settings → Position**. + +### Privacy Considerations + +> 🔒 **Privacy:** Position data is broadcast to all nodes on your channel. If you don't want your location shared, disable GPS position in settings or use a fixed/fake position. + +## Map Sources + +The app supports multiple map tile sources: + +- OpenStreetMap (default) +- Satellite imagery (where available) +- Offline tiles (download map areas for offline use) + +## Related Topics + +- [Nodes](nodes) — view and filter your node list +- [Node Metrics](node-metrics) — signal quality and position history for individual nodes +- [Discovery](discovery) — traceroute and neighbor info for understanding mesh topology +- [Units & Locale](units-and-locale) — distance and coordinate display formats + +--- + diff --git a/docs/ko-rKR/user/messages-and-channels.md b/docs/ko-rKR/user/messages-and-channels.md new file mode 100644 index 000000000..015409b38 --- /dev/null +++ b/docs/ko-rKR/user/messages-and-channels.md @@ -0,0 +1,159 @@ +--- +title: Messages & Channels +nav_order: 3 +last_updated: 2026-05-13 +description: Send and receive messages, manage channels, configure encryption, and use quick chat, reactions, and message actions. +aliases: + - channels + - direct-messages + - messaging + - conversations +--- + +# Messages & Channels + +Meshtastic supports two communication modes: **channel broadcasts** and **direct messages**. + +## 채널 + +Channels are shared communication groups. All nodes configured with the same channel key can read and send messages on that channel. + +### Default Channel + +Every Meshtastic device comes with a default **LongFast** channel. This is an unencrypted channel used for general mesh communication. + +### Channel Security + +Channels support multiple encryption levels: + +| Icon | Security Level | 설명 | +| ---- | ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------- | +| 🔒 | PSK (256-bit AES) | Fully encrypted with a strong pre-shared key. Only nodes with the matching key can read messages. | +| 🔐 | PSK (128-bit AES) | Encrypted with a shorter key. Secure for most uses but 256-bit is preferred for sensitive data. | +| 🔓 | Default / Open | Uses the well-known default key. **Any Meshtastic device** on the same preset can read these messages. | +| ⚠️ | Insecure + Position | Open channel that also broadcasts your GPS position. Use with caution in public meshes. | + +> 🔒 **Security Tip:** 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. + +### Adding a Channel + +1. Navigate to **Settings → Channels**. +2. Tap **Add Channel** or scan a QR code. +3. Configure the channel name and encryption key. +4. Share the channel URL/QR code with others who need access. + +Tapping a channel shows its details and sharing options. + +## Direct Messages + +Direct messages (DMs) are point-to-point encrypted communications between two specific nodes. + +### Sending a Direct Message + +1. Open the **Messages** tab. +2. Select a node from your contacts list or tap a node in the node list. +3. Type your message and tap **Send**. + +### Message States + +| State | Icon | Meaning | +| --------------------------------- | ---- | ----------------------------------------------------------------------------------------------------------------- | +| Queued | ⏳ | Message waiting to be sent | +| En route | ✓ | Delivered to the radio, awaiting acknowledgment | +| 전송됨 | ✓✓ | Acknowledgment received from recipient | +| Received | ✓ | Message received from the mesh (incoming) | +| S&F Routing | 🔗 | Store & Forward: message being routed through an S&F node | +| S&F Confirmed | 🔗 | Store & Forward: delivery confirmed via S&F node | +| Error | ✗ | Delivery failed after retries | + +### Delivery Errors + +When a message fails to deliver, the error indicator shows what went wrong: + +| Error | Meaning | What to Do | +| ---------------- | ---------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| No Route | No path exists to the destination node | The recipient may be offline or out of mesh range. Try later or move closer. | +| Got NAK | The next-hop node refused to relay | The relay node may be congested. Wait and retry. | +| 시간 초과 | No acknowledgment within retry window | The recipient may be just out of range. Try increasing hop limit or moving to a better position. | +| 인터페이스 없음 | No radio interface available to send | Check that your radio is connected and the channel is configured. | +| Max Retransmit | All retry attempts exhausted | The mesh path is unreliable. Try a different channel or wait for conditions to improve. | +| 채널 없음 | The destination channel doesn't exist | Verify both nodes share the same channel configuration. | +| Too Large | Message exceeds maximum payload size | Shorten your message (max ~230 characters). | +| No Response | Node received message but didn't respond | The recipient's radio may be busy or in low-power sleep mode. | +| Duty Cycle Limit | Regional airtime limit reached | Your radio has used its allowed transmit time. Wait for the duty cycle window to reset (typically 1 hour in EU regions). | +| 잘못된 요청 | Malformed or invalid message | This usually indicates a software bug. Try restarting the app. | + +> 💡 **Tip:** 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. + +## Message Features + +### Quick Chat + +Pre-configured messages for rapid communication: + +- Access via the Quick Chat button in the message input area +- Choose from built-in phrases or custom messages +- Customize quick chat messages in **Settings → Quick Chat** +- Useful when typing is impractical (gloves, small screen, urgent) + +![Quick chat option](/assets/screenshots/messages_quick_chat.png) + +The channel list shows each channel with its latest message preview. + +### Message Bubbles + +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. + +### Reactions + +React to messages with emoji: + +- **Long-press** a message to open the actions menu +- Tap **Add Reaction** to choose an emoji +- Reactions appear below the message bubble +- Multiple users can react to the same message +- React to your own messages or others' messages + +![Emoji reaction badges displayed beneath a message](/assets/screenshots/messages_reaction.png) + +> 💡 **Tip:** Reactions are lightweight — they use minimal mesh bandwidth compared to full text messages. + +### Message Actions + +Long-press any message to access: + +- **Copy** — copy message text to clipboard +- **Reply** — quote the message in your response +- **React** — add an emoji reaction +- **Delete** — remove a message you sent (local deletion) + +### Message Priority + +Messages are queued and transmitted based on priority: + +1. Emergency/alert messages (highest) +2. Direct messages +3. Channel broadcasts (lowest) + +### Message Limits + +- **Maximum length:** 237 bytes (approximately 230 characters for ASCII text) +- **Rate limiting:** The mesh enforces airtime fairness; heavy message volume may be throttled +- **Delivery:** Messages are retried automatically if no acknowledgment is received + +## Best Practices + +- Use channels for group coordination +- Use direct messages for private person-to-person communication +- Keep messages short — mesh bandwidth is limited +- Configure encryption for sensitive communications + +## Related Topics + +- [Nodes](nodes) — tap a node to start a direct message +- [Settings — Radio & User](settings-radio-user) — configure channel encryption and presets +- [MQTT](mqtt) — bridge channel messages to the internet +- [Channel configuration](https://meshtastic.org/docs/configuration/radio/channels) — detailed channel settings on meshtastic.org + +--- + diff --git a/docs/ko-rKR/user/mqtt.md b/docs/ko-rKR/user/mqtt.md new file mode 100644 index 000000000..bd48b97a6 --- /dev/null +++ b/docs/ko-rKR/user/mqtt.md @@ -0,0 +1,137 @@ +--- +title: MQTT +nav_order: 11 +last_updated: 2026-05-13 +description: Bridge your mesh to the internet — MQTT broker setup, encryption layers, and map reporting. +aliases: + - mqtt + - internet-bridge + - broker +--- + +# MQTT + +MQTT bridges your Meshtastic mesh network to the internet, enabling long-range communication beyond radio range. + +## Overview + +The MQTT module connects your node to an MQTT broker, allowing: + +- Messages to reach nodes on different physical meshes via the internet +- Integration with home automation and monitoring systems +- Publishing node positions to the public Meshtastic map +- Custom data pipelines for logging and alerting + +## How It Works + +``` +[Your Node] → Radio → [Gateway Node with WiFi] → MQTT Broker → [Remote Gateway] → Radio → [Remote Node] +``` + +A gateway node with internet access (WiFi or Ethernet) publishes mesh messages to an MQTT topic. Remote gateways subscribed to the same topic inject those messages into their local mesh. + +## 설정 + +### Enabling MQTT + +1. Navigate to **Settings → Module Config → MQTT**. +2. Enable the MQTT module. +3. Configure the broker connection: + +![MQTT toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | 설명 | 기본값 | +| --------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------- | +| Server Address | MQTT broker hostname | mqtt.meshtastic.org | +| 사용자명 | Broker authentication | meshdev | +| 비밀번호 | Broker authentication | large4cats | +| Root Topic | Base topic for messages | msh | +| 암호화 | Encrypt MQTT payload | 활성화 | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON packet support has been removed from firmware; this field is ignored | Disabled | +| TLS | Secure connection to broker | Disabled | +| Map Reporting | Report position to public map | Disabled | + +### Default Meshtastic Broker + +The community maintains a public broker at `mqtt.meshtastic.org`. This is intended for general use and testing. + +> 🔒 **Privacy:** Messages on the public broker are readable by anyone subscribed. Always use channel encryption for private communications. + +### Private Broker + +For better privacy and control, you can run your own MQTT broker: + +- Mosquitto (lightweight, open-source) +- HiveMQ +- EMQX + +Configure your node to point to your private broker with appropriate credentials. + +## Map Reporting + +When Map Reporting is enabled, your node publishes its position to the Meshtastic community map: + +- Visible at [meshmap.net](https://meshmap.net) and similar community map services +- Only position and node info are shared +- Disable this if you don't want your location publicly visible + +## Uplink vs Downlink + +| Direction | 설명 | +| ------------ | -------------------------------- | +| **Uplink** | Messages from mesh → MQTT broker | +| **Downlink** | Messages from MQTT broker → mesh | + +Configure per-channel which directions are active to control message flow and airtime usage. + +## Message Formats + +MQTT uses protobuf message format: + +| Format | 설명 | Use case | +| ------------ | ----------------------------------- | -------------------------- | +| **Protobuf** | Binary Meshtastic protobuf encoding | Node-to-node mesh bridging | + +> ⚠️ **Note:** JSON output support was removed from firmware. The `json_enabled` setting is still visible in the app for legacy compatibility but has no effect on current firmware versions. + +## Encryption & Privacy + +Understanding the layered encryption model: + +1. **Channel encryption** happens on the mesh _before_ MQTT. If your channel has a PSK, the MQTT payload is already encrypted — the broker and any subscribers see only the ciphertext. +2. **MQTT encryption** (the module setting) adds an additional encryption layer for transit to the broker. This protects metadata and routing information. +3. **TLS** encrypts the TCP connection to the broker itself, preventing network-level eavesdropping. + +> 🔒 **Important:** The default public channel has a well-known key. Messages on the default channel sent via MQTT are effectively **unencrypted** — anyone can decode them. Always use a custom PSK for private communications. + +## Best Practices + +- Use channel-level encryption (PSK) on channels that bridge to MQTT +- Don't enable MQTT on nodes without internet access (it will buffer and waste memory) +- Use a private broker for sensitive deployments +- Be mindful of airtime when downlinking messages from busy MQTT topics — every downlinked message consumes radio airtime on your local mesh +- Consider enabling uplink-only if you only need to monitor your mesh remotely without injecting messages back + +## Troubleshooting + +### MQTT Not Connecting + +- **Check WiFi** — the gateway node must have an active internet connection (WiFi or Ethernet). MQTT does not work over the LoRa radio link itself. +- **Verify credentials** — incorrect username or password will silently fail on most brokers. Double-check for trailing spaces. +- **Firewall** — port 1883 (MQTT) or 8883 (MQTT+TLS) must be open. Some networks block non-standard ports. +- **DNS resolution** — if using a custom broker hostname, verify the node can resolve it. Try the broker's IP address directly. + +### Messages Not Bridging + +- **Check uplink/downlink settings** — if only uplink is enabled, messages flow from mesh to MQTT but not back. Enable downlink on the receiving gateway. +- **Channel mismatch** — both gateways must share the same channel with the same PSK. A mismatch means messages are encrypted with different keys and appear as garbage. +- **Topic mismatch** — ensure both gateways use the same root topic. The default `msh` works for the public broker. + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — MQTT module configuration reference +- [Messages & Channels](messages-and-channels) — channel encryption and PSK setup +- [MQTT integration guide](https://meshtastic.org/docs/software/integrations/mqtt) — detailed MQTT documentation on meshtastic.org + +--- + diff --git a/docs/ko-rKR/user/node-metrics.md b/docs/ko-rKR/user/node-metrics.md new file mode 100644 index 000000000..484a633b7 --- /dev/null +++ b/docs/ko-rKR/user/node-metrics.md @@ -0,0 +1,130 @@ +--- +title: Node Metrics +nav_order: 5 +last_updated: 2026-05-13 +description: Telemetry dashboards for each mesh node — device health, environment sensors, signal quality, power, traceroute, and position history. +aliases: + - metrics + - telemetry + - device-metrics + - signal +--- + +# Node Metrics + +The node detail screen provides comprehensive telemetry and metrics for each node on your mesh. + +## Device Metrics + +Basic operating information reported by each node: + +| Metric | 설명 | +| ------------- | ----------------------------------- | +| Battery Level | Current battery percentage | +| 전압 | Battery voltage reading | +| 채널 사용 | Percentage of airtime consumed | +| Airtime | Transmission time used by this node | +| 업타임 | Time since last reboot | + +Device metrics are displayed as individual cards with trend sparklines showing battery level, voltage, channel utilization, airtime, and uptime over time. + +> 💡 **Tip:** Tap any metric card to expand it into a full chart with historical data points. Pinch to zoom the time axis. + +## Environment Metrics + +Environmental sensor data (requires compatible hardware): + +| Metric | Sensor Examples | +| ------------------------------------ | --------------------- | +| 온도 | BME280, BME680, SHT31 | +| 습도 | BME280, BME680, SHT31 | +| 기압 | BME280, BMP280 | +| 가스 저항 | BME680 | +| IAQ (Air Quality) | BME680 | + +Environment metrics are charted over time for easy trend analysis — temperature, humidity, and pressure each get their own line chart with the measurement unit displayed on the Y axis. + +> 💡 **Tip:** Environment metrics require a sensor connected to the remote node. Not all nodes report environmental data. See [Telemetry & Sensors](telemetry-and-sensors) for a full list of supported sensors. + +## Signal Metrics + +Radio signal quality information: + +| Metric | 설명 | +| --------- | ----------------------------------------------------------------------------- | +| SNR | Signal-to-Noise Ratio (higher is better) | +| RSSI | Received Signal Strength Indicator (closer to 0 is better) | +| Hop Count | Number of mesh hops for last message | + +### Signal Quality Reference + +| SNR Range | Quality | +| --------------------------------- | --------- | +| > 10 dB | Excellent | +| 0 to 10 dB | 좋음 | +| -10 to 0 dB | 보통 | +| < -10 dB | Poor | + +## Power Metrics + +Power management telemetry (requires INA sensor or compatible hardware): + +| Metric | 설명 | +| ----------- | ----------------------- | +| Bus Voltage | Supply voltage | +| 전류 | Power draw in milliamps | +| 전원 | Calculated wattage | + +## 추적 루트 + +Traceroute shows the path a message takes through the mesh: + +1. From the node detail screen, tap **Traceroute**. +2. The app sends a traceroute request to the target node. +3. Results show each hop with SNR/RSSI values. + +### Reading Traceroute Results + +``` +You → Node A (SNR: 8.5) → Node B (SNR: 5.2) → Target +``` + +Each hop represents a relay node that forwarded the message. + +## 위치 로그 + +Historical position data for nodes that share their location: + +- GPS coordinates +- Altitude +- Speed (if moving) +- Timestamp for each position report + +## 이웃 정보 + +Shows which nodes a given node can directly hear, useful for understanding mesh topology. + +## Viewing Metrics + +1. Navigate to **Nodes**. +2. Tap the node you want to inspect. +3. Select the metric category from the detail tabs. + +![Node detail — local device](/assets/screenshots/nodes_detail_local.png) + +The position tab shows location data for nodes that share GPS: + +![Position inline content](/assets/screenshots/nodes_position.png) + +> ⚠️ **Note:** Metrics are only available when they have been reported by the remote node. Metrics update at intervals configured on each node's telemetry settings. + +## Related Topics + +- [Nodes](nodes) — node list, filtering, and sorting +- [Telemetry & Sensors](telemetry-and-sensors) — supported sensors and configuration +- [Signal Meter](signal-meter) — how signal quality is calculated from SNR and RSSI +- [Discovery](discovery) — traceroute details and neighbor info +- [Units & Locale](units-and-locale) — temperature, distance, and speed display formats + +--- + diff --git a/docs/ko-rKR/user/nodes.md b/docs/ko-rKR/user/nodes.md new file mode 100644 index 000000000..ca5fd959d --- /dev/null +++ b/docs/ko-rKR/user/nodes.md @@ -0,0 +1,152 @@ +--- +title: 노드 +nav_order: 4 +last_updated: 2026-05-13 +description: Browse, filter, and sort mesh nodes — view details, signal quality, roles, and quick actions. +aliases: + - node-list + - mesh-nodes + - peers +--- + +# 노드 + +The Nodes screen displays all devices visible on your mesh network. + +## Node List + +The node list shows every node your radio has heard, including: + +- **Node name** — user-configured long name +- **Short name** — 4-character identifier +- **Signal quality** — last heard signal strength +- **Last heard** — time since last communication +- **Distance** — estimated distance (if positions are shared) +- **Battery** — remote node battery level (if telemetry is enabled) + +### Node Status Indicators + +| Badge | Meaning | +| ---------- | ------------------------------------- | +| 🟢 Online | Node heard within the last 15 minutes | +| 🟡 Away | Node heard within the last 2 hours | +| 🔴 Offline | Node not heard for over 2 hours | +| ⭐ Favorite | Node marked as favorite by the user | + +### Node Roles + +Nodes can be configured with different roles that affect their mesh behavior: + +| 역할 | 설명 | +| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Client | Standard end-user device | +| Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | +| Client Mute | Receives but doesn't retransmit | +| Client Hidden | Like Client Mute, plus hides from node list | +| Router | Prioritizes message forwarding; stays awake to relay | +| Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | +| ~~Router Client~~ | ⚠️ **Deprecated** (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | +| ~~Repeater~~ | ⚠️ **Deprecated** (removed in firmware 2.7.11) — no longer selectable; use Router instead | +| Tracker | Optimized for position reporting at regular intervals | +| Sensor | Optimized for telemetry reporting | +| TAK | Interoperates with TAK systems (sends/receives CoT) | +| TAK Tracker | TAK position reporting only | +| Lost & Found | Continuous position beacon for recovery | + +### Choosing a Role + +Most users should keep the default **Client** role. Consider a different role when: + +- **Router** — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don't use Router on battery-powered handheld devices. +- **Router Late** — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. +- **Client Base** — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. +- **Client Mute** — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only devices or to reduce congestion in dense areas. +- **Tracker** — An unattended device whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. +- **Sensor** — An unattended device reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. +- **TAK / TAK Tracker** — Only needed if interoperating with ATAK/WinTAK systems. See [TAK Integration](tak) for details. + +> 💡 **Tip:** The mesh works best when most nodes are **Client** or **Router**. Too many Mute nodes reduces mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. + +### Encryption Indicators + +Nodes display encryption status icons next to their name: + +| Icon | Meaning | +| ----------- | ------------------------------------------------------------------------------------------------------------------- | +| 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | +| 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | +| ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) | + +> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. + +## Quick Actions + +From the node list, you can: + +- **Tap** a node to view its detail page +- **Long-press** for quick actions: + - Send a direct message + - View on map + - 위치 요청 + - Mark as favorite + - 추적 루트 + +## Filtering & Sorting + +### Text Search + +Type in the search field to filter nodes by name or short name. The filter updates in real time as you type. + +### Filter Toggles + +| 필터 | 설명 | +| -------------------------- | ---------------------------------------------------------------------------------------------- | +| **Only online** | Show only nodes heard within the last 15 minutes | +| **Only direct** | Show only nodes with direct (non-relayed) connections | +| **Include unknown** | Show nodes that haven't sent user info yet | +| **Exclude infrastructure** | Hide infrastructure-role nodes (Router, Repeater, Router Late, Client Base) | +| **Exclude MQTT** | Hide nodes heard only via MQTT internet bridge | +| **Show ignored** | Show nodes you've previously dismissed or muted | + +### Sort Options + +| Sort | 설명 | +| ------------------------------------------- | ------------------------------------------------------------------ | +| **Last heard** (default) | Most recently heard nodes first | +| **Alphabetical** | Sorted by node long name | +| **Distance** | Nearest nodes first (requires position sharing) | +| **Hops away** | Fewest relay hops first | +| **Channel** | Grouped by channel index | +| **Via MQTT** | Grouped by MQTT vs. radio-heard | +| **Favorites** | Favorited nodes first | + +## Node Detail + +Tapping a node opens the detail view with comprehensive information. See [Node Metrics](node-metrics) for full details on metrics and telemetry. + +![Node detail view](/assets/screenshots/nodes_node_list.png) + +The detail screen includes device info, position, and action buttons: + +![Node detail section](/assets/screenshots/nodes_detail_section.png) + +Inline status indicators show key metrics at a glance: + +| Indicator | Screenshot | +| -------------- | -------------------------------------------------------- | +| Signal quality | ![Signal](/assets/screenshots/nodes_signal_info.png) | +| Battery level | ![Battery](/assets/screenshots/nodes_battery_info.png) | +| Hop count | ![Hops](/assets/screenshots/nodes_hops_info.png) | +| 최근 수신 | ![Last heard](/assets/screenshots/nodes_last_heard.png) | +| 거리 | ![Distance](/assets/screenshots/nodes_distance_info.png) | + +## Related Topics + +- [Node Metrics](node-metrics) — detailed telemetry dashboards for each node +- [Messages & Channels](messages-and-channels) — send a direct message to a node +- [Map & Waypoints](map-and-waypoints) — view node positions geographically +- [Discovery](discovery) — traceroute and neighbor info for topology exploration +- [Signal Meter](signal-meter) — understand what the signal bars mean + +--- + diff --git a/docs/ko-rKR/user/onboarding.md b/docs/ko-rKR/user/onboarding.md new file mode 100644 index 000000000..3b910534e --- /dev/null +++ b/docs/ko-rKR/user/onboarding.md @@ -0,0 +1,99 @@ +--- +title: Getting Started +nav_order: 1 +last_updated: 2026-05-13 +description: First-launch setup — permissions, onboarding flow, and next steps after connecting your radio. +aliases: + - first-launch + - setup + - intro +--- + +# Getting Started + +Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app. + +## First Launch + +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. + +### Welcome Screen + +The welcome screen introduces Meshtastic and its core capabilities: + +- Off-grid mesh communication +- No cellular or internet required +- End-to-end encrypted messaging + +Tap **Get Started** to proceed through the setup flow. + +![Welcome screen](/assets/screenshots/onboarding_welcome.png) + +## Permissions + +The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. + +### Bluetooth Permission + +Bluetooth is the primary connection method between your phone and Meshtastic radio: + +- **Bluetooth scanning** — discover nearby Meshtastic radios +- **Bluetooth connect** — establish and maintain connections with paired radios + +Grant both permissions when prompted. Without Bluetooth, you'll need to use USB or TCP connections instead. + +### Location Permission + +> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. + +Meshtastic also uses your location for: + +- Showing your position on the mesh map +- Calculating distances to other nodes +- Sharing your GPS coordinates with other mesh members (if enabled) + +Grant **"While using the app"** or **"Always"** depending on your preference: + +- **While using the app** — position updates only when the app is open +- **Always** — enables background position updates for always-on mesh presence + +If denied, Bluetooth scanning will not function and your node will not report a position. + +### Notifications Permission + +Notifications alert you to: + +- Incoming messages from channels and direct messages +- Connection status changes (connected, disconnected, reconnecting) +- Firmware update availability + +> 💡 **Tip:** You can fine-tune notification preferences later in Android system settings. The app creates separate notification channels for messages, connection events, and background service status. + +### Critical Alerts Permission + +On supported devices, the app may request permission for critical alerts: + +- These are high-priority notifications that can break through Do Not Disturb mode +- Useful for emergency mesh alerts or urgent messages +- You can **skip** this step if you don't need breakthrough notifications +- Configure or revoke later in Android notification settings + +## After Setup + +Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. + +> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. + +## What's Next? + +Once connected to a radio, explore: + +- [Connections](connections) — pair your first radio device +- [Messages & Channels](messages-and-channels) — send your first message +- [Nodes](nodes) — see who's on your mesh +- [Map & Waypoints](map-and-waypoints) — view node positions +- [Settings](settings-radio-user) — configure your radio and user profile + +New to Meshtastic? The [getting started guide](https://meshtastic.org/docs/getting-started) on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup. + +--- diff --git a/docs/ko-rKR/user/settings-module-admin.md b/docs/ko-rKR/user/settings-module-admin.md new file mode 100644 index 000000000..72be29594 --- /dev/null +++ b/docs/ko-rKR/user/settings-module-admin.md @@ -0,0 +1,246 @@ +--- +title: Settings — Modules & Admin +nav_order: 8 +last_updated: 2026-05-13 +description: Configure optional feature modules (MQTT, telemetry, canned messages, TAK, and more) and perform device administration. +aliases: + - modules + - module-config + - administration +--- + +# Settings — Modules & Admin + +Configure optional feature modules and perform device administration. Modules extend Meshtastic with specialized capabilities — each can be independently enabled or disabled. + +> 💡 **Tip:** You only need to enable the modules you actually use. Disabling unused modules reduces airtime, saves battery, and simplifies your configuration. + +Module settings use a card-based layout with toggle switches, dropdowns, text fields, and sliders: + +![Toggle switch](/assets/screenshots/settings_switch.png) + +![Dropdown selector](/assets/screenshots/settings_dropdown.png) + +![Text field](/assets/screenshots/settings_text_field.png) + +![Settings card layout](/assets/screenshots/settings_titled_card.png) + +## Module Configuration + +### MQTT Module + +Bridges mesh messages to and from an MQTT broker for internet connectivity. This is how you extend your mesh beyond radio range or integrate with home automation systems. + +| Setting | 설명 | +| --------------- | ------------------------------------------------------------------------ | +| 활성화 | Toggle MQTT bridge | +| 서버 | MQTT broker address | +| 사용자명 | Authentication username | +| 비밀번호 | Authentication password | +| 암호화 | Encrypt MQTT payloads | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON support removed from firmware; field is ignored | +| TLS | Use secure connection | +| Root Topic | Base MQTT topic path | +| Map Report | Publish position for public map | + +See [MQTT](mqtt) for a detailed usage guide including encryption, privacy, and broker setup. + +### Serial Module + +Enables serial port communication for external device integrations (GPS modules, sensors, or custom hardware). When enabled, the node's serial port can send and receive protobuf or text data, allowing external microcontrollers or computers to interact with the mesh. + +| Setting | 설명 | +| ---------- | ------------------------------- | +| 활성화 | Activate serial communication | +| Echo | Echo received serial data back | +| Mode | Text, Protobuf, or NMEA output | +| RX/TX Pins | GPIO pins for serial connection | +| Baud Rate | Serial communication speed | + +### External Notification Module + +Controls buzzer, LED, or vibration alerts on your radio hardware. Useful for devices that need to physically signal when a message arrives — particularly helpful for unattended or outdoor installations. + +| Setting | 설명 | +| -------------------------------- | --------------------------- | +| 활성화 | Activate notifications | +| Alert Message | Notify on incoming messages | +| Alert Message Buzzer | Use buzzer for messages | +| Alert Message Vibra | Use vibration for messages | +| Alert Bell | Notify on bell character | +| Output (GPIO) | Pin for notification output | +| Active | High or Low active | +| Duration (ms) | Notification length | +| Use I2S as Buzzer | Use I2S audio output | + +### Store & Forward Module + +Buffers messages for nodes that were temporarily offline, then replays them when those nodes reconnect. Essential for meshes where nodes go in and out of range regularly — ensures messages aren't lost during brief disconnections. + +| Setting | 설명 | +| ------------------------------------------ | -------------------------- | +| 활성화 | Activate store and forward | +| Heartbeat (s) | Announcement interval | +| 레코드 | Maximum stored messages | +| History Return (max) | Max messages to replay | +| History Return (window) | Time window for replay | + +> 💡 **Tip:** Store and Forward works best on nodes with ample memory (ESP32 with PSRAM). Router nodes are ideal candidates since they're typically always-on. + +### Range Test Module + +Automated range testing tool for evaluating link quality between nodes. When enabled, the node periodically transmits test messages with incrementing counters. A receiver node logs these messages, allowing you to walk or drive away and later analyze at what distance messages stopped arriving. + +| Setting | 설명 | +| -------------------------------------- | --------------------------------- | +| 활성화 | Activate range testing | +| Sender Interval (s) | Time between test transmissions | +| Save CSV | Log received test data to SD card | + +### Telemetry Module + +Controls what telemetry data your node shares with the mesh. Telemetry includes device health (battery, uptime) and environmental sensor data (temperature, humidity, pressure). + +| Setting | 설명 | +| ---------------------------- | --------------------------------------- | +| Device Metrics Interval | How often to report device metrics | +| Environment Metrics Interval | How often to report environment sensors | +| Air Quality Enabled | Report particulate sensor data | +| Power Metrics Enabled | Report power usage | + +See [Telemetry & Sensors](telemetry-and-sensors) for supported sensors and configuration recommendations. + +### Canned Message Module + +Pre-configured messages accessible from the device's physical buttons (for radios with rotary encoders, keypads, or similar input hardware). Define a list of quick-send messages that can be transmitted without a phone connected — ideal for field use. + +| Setting | 설명 | +| ------------------ | ----------------------------------------------------------- | +| ~~Enabled~~ | ⚠️ **Deprecated** — current firmware may ignore this toggle | +| 메시지기기 | Newline-separated list of messages | +| Send Bell | Play bell sound on send | +| Rotary Encoder | Enable rotary encoder input | +| Up/Down/Press Pins | GPIO pin assignments for input | + +### Audio Module + +Codec2 audio support for low-bandwidth voice communication over the mesh. This is an **experimental** feature that encodes voice into very small data packets using the Codec2 codec. + +| Setting | 설명 | +| --------------- | -------------------------------- | +| 활성화 | Activate audio module | +| Codec2 Rate | Audio quality/bandwidth tradeoff | +| I2S Word Select | GPIO pin for I2S WS | +| I2S Data In | GPIO pin for I2S DIN | +| I2S Data Out | GPIO pin for I2S DOUT | + +> ⚠️ **Note:** Audio requires specific hardware (I2S microphone and speaker). Voice quality is very low-bandwidth — think "understandable radio voice," not phone-call quality. + +### Remote Hardware Module + +GPIO control over the mesh network. Allows a remote node to read or write GPIO pins on another node — useful for activating relays, reading switches, or controlling external hardware from a distance. + +| Setting | 설명 | +| -------------------- | --------------------------------------------------------------- | +| 활성화 | Activate remote GPIO access | +| Allow Undefined Pins | Allow access to any GPIO pin (security risk) | + +> ⚠️ **Warning:** Enabling "Allow Undefined Pins" gives remote nodes access to all GPIO pins, which could interfere with the radio's own hardware. Only enable on dedicated GPIO nodes. + +### Neighbor Info Module + +Broadcasts information about directly heard neighbors, enabling mesh topology mapping. Each enabled node periodically shares a list of the other nodes it can hear and their signal quality. + +| Setting | 설명 | +| -------------------------------------- | ------------------------------------ | +| 활성화 | Activate neighbor broadcasting | +| Update Interval (s) | How often to broadcast neighbor list | + +See [Discovery](discovery) for how to use neighbor data for mesh topology exploration. + +### Ambient Lighting Module + +Controls onboard NeoPixel or other addressable RGB LEDs on supported hardware. Can be used for visual status indicators, notification lights, or decorative effects. + +| Setting | 설명 | +| ------------------ | ---------------------------------------------------------- | +| 활성화 | Activate LED control | +| LED State | On, Off, or set specific color | +| Red / Green / Blue | Individual color channel values (0–255) | + +### Detection Sensor Module + +Turns your node into a motion or door sensor alert system. When a GPIO pin detects a state change (motion detected, door opened), the node broadcasts an alert message over the mesh. + +| Setting | 설명 | +| ---------------------------------------- | ----------------------------------------------------------------------- | +| 활성화 | Activate detection sensor | +| Monitor Pin | GPIO pin connected to sensor | +| Detection Triggered High | Trigger when pin goes high (vs. low) | +| Minimum Broadcast (s) | Minimum time between alert broadcasts | +| State Broadcast (s) | Periodic state broadcast interval | +| Send Bell | Include bell character in alerts | +| Friendly Name | Custom name for this sensor | + +### Paxcounter Module + +People counter using WiFi and BLE probe requests. Counts nearby devices by passively listening for probe requests that phones and laptops emit when scanning for networks. Available only on ESP32 devices. + +| Setting | 설명 | +| -------------------------------------- | -------------------------- | +| 활성화 | Activate people counting | +| Update Interval (s) | How often to report counts | + +> 💡 **Tip:** Paxcounter is useful for estimating foot traffic at trailheads, event venues, or other locations. Counts are approximate — one person may carry multiple devices. + +### TAK Module + +Team Awareness Kit integration for interoperability with ATAK and WinTAK. See [TAK Integration](tak) for detailed setup and usage. + +## 관리 + +### 원격 설정 + +Remotely configure nodes that share your admin key: + +1. Select the target node in the node list. +2. Navigate to **Settings** for that node. +3. Modify configuration. +4. Tap **Save** — changes are sent over the mesh. + +> ⚠️ **Requires:** Admin key configured on both your node and the target node. + +### Clean Node Database + +Removes stale nodes from your local database that haven't been heard in a configurable time window. + +### Factory Reset + +Resets all settings to factory defaults. **This cannot be undone.** + +### 재부팅 + +Remotely reboot a connected or administered node. + +### 디버그 패널 + +View detailed diagnostic information: + +- Protocol buffers debug output +- Mesh packet log +- Connection state details + +### Troubleshooting Remote Admin + +- **"No response from target node"** — the target may be out of range, offline, or have a mismatched admin key. Verify the admin key matches on both nodes. +- **Changes not applying** — some settings require a reboot to take effect. Try the Reboot action after saving. +- **Can't see remote settings** — ensure your node has the admin key for the target node and that Admin Channel is enabled in Security Config. + +## Related Topics + +- [Settings — Radio & User](settings-radio-user) — core radio and user profile settings +- [Module configuration reference](https://meshtastic.org/docs/configuration/module) — detailed module docs on meshtastic.org +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/ko-rKR/user/settings-radio-user.md b/docs/ko-rKR/user/settings-radio-user.md new file mode 100644 index 000000000..90970f11e --- /dev/null +++ b/docs/ko-rKR/user/settings-radio-user.md @@ -0,0 +1,173 @@ +--- +title: Settings — Radio & User +nav_order: 7 +last_updated: 2026-05-13 +description: Configure your radio hardware, LoRa presets, user profile, position sharing, power management, and security. +aliases: + - 설정 + - radio-config + - user-config + - lora +--- + +# Settings — Radio & User + +Configure your radio hardware and user identity parameters. + +## User Settings + +### User Profile + +| Setting | 설명 | +| ----------------- | ------------------------------------------------------------------------------------- | +| 긴 이름 | Your display name (up to 39 characters) | +| 짧은 이름 | 4-character abbreviated name | +| Licensed Operator | Enable if you hold an amateur radio license (enables higher power) | + +### Applying Changes + +After modifying settings, tap **Save** to write the configuration to your radio. The device may reboot to apply changes. + +## Radio Configuration + +### 장치 설정 + +| Setting | 설명 | 기본값 | +| ------------------------------------------ | ----------------------------------------------------------------------- | -------- | +| 역할 | Node behavior (Client, Router, etc.) | Client | +| 중계 모드 | How the node retransmits messages | All | +| Node Info Broadcast (s) | Interval for broadcasting node info | 10800 | +| Double-tap Button | Action for double-tap button press | Disabled | + +### LoRa 설정 + +| Setting | 설명 | 기본값 | +| ----------------- | ----------------------------------------------------------------------- | ----------------------------------------- | +| 지역 | Regulatory region for frequency bands | Unset (must configure) | +| 모뎀 프리셋 | Speed/range tradeoff | LongFast | +| Hop 제한 | Maximum retransmit hops | 3 | +| TX Power | Transmission power (dBm); 0 = max allowed for region | 0 (region max) | +| 주파수 오프셋 | Fine-tune frequency (MHz) | 0 | +| Channel Bandwidth | Bandwidth setting | Default for preset | + +> ⚠️ **Important:** You **must** set your region before transmitting. Operating without the correct region may violate local radio regulations. See the [region configuration guide](https://meshtastic.org/docs/getting-started/initial-config) on meshtastic.org for details. + +### Modem Presets + +| Preset | Range | Speed | SNR Limit | Best For | +| ------------------ | ----------------------- | ------------------------- | ------------------------ | -------------------------------------------------------------------------------------------------------- | +| Short Turbo | ~1 km | 21.9 kbps | −5 dB | Dense urban with line-of-sight; data-heavy applications | +| Short Fast | ~3 km | 10.9 kbps | −7.5 dB | Urban neighborhoods; buildings within a few blocks | +| Short Slow | ~5 km | 5.5 kbps | −10 dB | Suburban short-range; moderate building density | +| Medium Fast | ~5 km | 5.5 kbps | −10 dB | Suburban areas; moderate building density | +| Medium Slow | ~8 km | 1.1 kbps | −12.5 dB | Suburban/rural; moderate range with slower speed | +| Long Turbo | ~10 km | 4.4 kbps | −10 dB | Similar range to Long Fast but with 500 kHz bandwidth; faster throughput | +| Long Fast | ~10 km | 1.1 kbps | −12.5 dB | **General use (default)** — balanced range and speed | +| Long Moderate | ~20 km | 0.34 kbps | −15 dB | Rural with some terrain; occasional use | +| Lite Fast | ~5 km | 5.5 kbps | −10 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Medium Fast | +| Lite Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Long Fast | +| Narrow Fast | ~5 km | 2.7 kbps | −10 dB | EU 868 MHz band (62.5 kHz BW); avoids interference with other devices | +| Narrow Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 868 MHz band (62.5 kHz BW); comparable to Long Fast | +| ~~Long Slow~~ | ~30 km | 0.18 kbps | −17.5 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | +| ~~Very Long Slow~~ | ~40+ km | 0.09 kbps | −20 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | + +#### Choosing a Modem Preset + +The modem preset controls the fundamental tradeoff between **range** and **data rate**: + +- **Slower presets** use more spreading, making signals decodable at weaker signal levels (lower SNR limit). This means longer range but fewer bytes per second. +- **Faster presets** pack more data per transmission but require a stronger signal to decode. + +**Practical guidance:** + +- **Urban mesh (many nodes, short distances):** Use **Long Fast** (default) or **Short Fast**. Higher speed means less airtime congestion when many nodes share the channel. +- **Rural/sparse mesh (few nodes, long distances):** Use **Long Moderate**. Range matters more than speed when nodes are far apart. +- **EU 866/868 MHz regulatory compliance:** Use **Lite Fast**, **Lite Slow**, **Narrow Fast**, or **Narrow Slow** — these are optimized for the EU SRD/868 MHz bands with narrower bandwidths. +- **Fixed infrastructure links:** Use **Short Turbo** or **Long Turbo** for dedicated point-to-point links with good antennas and line-of-sight. +- **Mixed environments:** Stick with **Long Fast** — it's the community default and ensures compatibility with others in your area. + +> ⚠️ **Important:** All nodes on the same channel **must** use the same modem preset. Nodes with mismatched presets cannot communicate even if they share the same frequency and encryption key. + +> 💡 **Tip:** The range estimates above assume flat terrain and modest antennas. Elevation advantage (hilltop, rooftop) dramatically increases effective range. A well-placed Router with Long Fast can often outperform a ground-level node with Long Slow. + +### 화면 설정 + +| Setting | 설명 | +| ------------------- | ------------------------------------------------------------------------------------ | +| 화면 끄기 시간 | Time before display sleeps | +| 단위 표시 | Metric or Imperial | +| OLED 타입 | Auto, SSD1306, SH1106, SH1107 | +| Compass Orientation | Rotation offset for compass display (0°, 90°, 180°, 270°) | +| ~~Compass North~~ | ⚠️ **Deprecated** — replaced by Compass Orientation; still visible in older firmware | + +### 위치 설정 + +| Setting | 설명 | +| ----------------------------------------- | ---------------------------------- | +| GPS Enabled | Enable/disable GPS | +| GPS Update Interval | How often to acquire GPS fix | +| Position Broadcast (s) | How often to share position | +| Smart Position | Enable movement-based broadcasting | +| Fixed Position | Use a manually set position | + +### 전원 설정 + +| Setting | 설명 | +| --------------------------------------- | --------------------------------------- | +| Power Saving | Enable low-power sleep mode | +| Shutdown After (s) | Auto-shutdown idle timer | +| ADC Multiplier | Battery voltage calibration factor | +| Wait Bluetooth (s) | Time to wait for BLE connection at boot | +| Mesh SDS Timeout (s) | Super-deep-sleep timeout | + +### 네트워크 설정 + +| Setting | 설명 | +| ------------- | ---------------------------------------------------- | +| WiFi Enabled | Enable WiFi radio (ESP32 devices) | +| WiFi SSID | Network name to connect to | +| WiFi PSK | 네트워크 암호 | +| NTP 서버 | Time synchronization server | +| Syslog Server | Remote logging server | + +![IP address field](/assets/screenshots/settings_ipv4_field.png) + +### 블루투스 설정 + +| Setting | 설명 | +| ----------------- | ------------------------------------------------------------------------- | +| Bluetooth Enabled | Enable/disable BLE radio | +| Pairing Mode | Fixed PIN, Random PIN, or No PIN | +| 고정 PIN | PIN code for pairing (default: 123456) | + +### 보안 설정 + +| Setting | 설명 | +| --------------------- | -------------------------------------------------------------------------- | +| 공개 키 | Your node's public key (read-only) | +| Admin 키 | Key for remote administration | +| 개인 키 | Your node's private key (handle securely) | +| Admin Channel Enabled | Allow admin commands via channel | +| Debug Log | Output live debug logging over serial/bluetooth | +| Serial Enabled | Enable serial console access (moved from Device Config) | +| 관리 모드 | Restrict non-admin channel changes | + +![Password field](/assets/screenshots/settings_password_field.png) + +Settings use standard preference controls — dropdowns, toggles, and sliders: + +| Control | Screenshot | +| -------- | ------------------------------------------------------ | +| Dropdown | ![Dropdown](/assets/screenshots/settings_dropdown.png) | +| Toggle | ![Toggle](/assets/screenshots/settings_switch.png) | +| Slider | ![Slider](/assets/screenshots/settings_slider.png) | + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — optional feature modules and device administration +- [Signal Meter](signal-meter) — how modem presets affect signal quality thresholds +- [LoRa configuration](https://meshtastic.org/docs/configuration/radio/lora) — detailed LoRa settings reference on meshtastic.org +- [Initial configuration](https://meshtastic.org/docs/getting-started/initial-config) — region setup guide on meshtastic.org + +--- + diff --git a/docs/ko-rKR/user/signal-meter.md b/docs/ko-rKR/user/signal-meter.md new file mode 100644 index 000000000..d6a5ab87e --- /dev/null +++ b/docs/ko-rKR/user/signal-meter.md @@ -0,0 +1,81 @@ +--- +title: How the Meshtastic Signal Meter Works +nav_order: 15 +last_updated: 2026-05-13 +description: How the signal meter calculates quality from RSSI and SNR — LoRa spread spectrum, presets, and what the bars really mean. +aliases: + - signal + - signal-meter + - snr + - rssi +--- + +# How the Meshtastic Signal Meter Works + +The Meshtastic signal meter — the familiar bars or status color in the app — is calculated very differently than the "bars" on a traditional cell phone or Wi-Fi router. + +Most consumer devices simply measure how "loud" a signal is. However, because Meshtastic uses **LoRa (Long Range)** technology, its signal meter measures how **clear** the signal is, relative to the specific settings your mesh is using. + +--- + +## 1. The Two Metrics: "Loudness" vs. "Clarity" + +Every time the LoRa radio chip receives a message, it reports two measurements: + +- **RSSI (Received Signal Strength Indicator):** The **loudness** of the raw power hitting your antenna. +- **SNR (Signal-to-Noise Ratio):** The **clarity** of the signal compared to the background static. + +> **Tip — The Analogy:** Imagine you are trying to hear a friend talking to you. +> +> - **RSSI** is how loud their voice is. +> - **The Noise Floor** is the background noise in the room (air conditioning, other people talking, traffic). +> - **SNR** is how easily you can distinguish your friend's voice from the background noise. + +If your friend shouts at you at a deafening rock concert, the signal is incredibly loud (High RSSI), but you still can't understand them because the background noise is louder (Bad SNR). Conversely, if your friend whispers to you in a dead-silent library, the signal is very weak (Low RSSI), but you can understand them perfectly (Great SNR). + +--- + +## 2. The Magic of LoRa: Hearing "Below the Noise Floor" + +For standard radios (like FM or Wi-Fi), if the background noise is louder than the signal (a negative SNR), the receiver just hears static. + +LoRa is special. It uses **"Spread Spectrum"** modulation, which allows the radio to mathematically pull a signal out of the air even when it is buried deep _underneath_ the background noise. This is why you will frequently see **negative SNR numbers** in Meshtastic (e.g., -10 dB, which means the signal is 10 decibels weaker than the background static). + +Depending on which Meshtastic preset you are using (e.g., `LongFast` vs. `ShortFast`), the radio has a specific **SNR Limit** — the absolute maximum amount of noise it can tolerate before the message is completely lost to the static. + +--- + +## 3. How the Signal Meter Calculates Quality + +The Meshtastic apps take both RSSI and SNR and run them through a specific formula to assign your signal a quality rating (None, Bad, Fair, or Good). It specifically scales these values based on the physical limits of the radio preset you are using. + +Here is exactly how the app decides how many bars (or what color) to show you: + +| Level | Bars | Criteria | Meaning | +| ----- | ---- | ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | +| 좋음 | 3 | RSSI better than `-115 dBm` **AND** SNR better than `-7 dB` | Signal is both loud and clear — healthy connection. | +| 보통 | 2 | RSSI better than `-126 dBm` with good SNR, **OR** SNR better than `-15 dB` with good RSSI | Signal getting quieter or noisier, but still decodable. | +| 나쁨 | 1 | Falls between Fair and None thresholds | At the edge of range or experiencing interference. | +| 없음 | 0 | RSSI worse than `-126 dBm` **AND** SNR worse than `-15 dB` | Transmission completely buried in noise. | + +--- + +## 4. What This Means for You + +Because Meshtastic's meter acts as a **"Clarity Meter"**, it behaves differently than what most people expect: + +> **Tip — Don't panic over low RSSI:** You might see a seemingly terrible RSSI value like `-118 dBm`. On a cell phone, you would have zero bars. But if you have an SNR of `+2 dB`, Meshtastic will still show a strong signal! _The library is quiet, so the whisper is heard perfectly._ + +> **Warning — Watch out for local noise:** If you hook up a massive antenna and see a great RSSI (e.g., `-90 dBm`) but your signal meter is only showing **1 Bar (Bad)**, you have a problem. It means you have local interference — perhaps a cheap power supply, a noisy computer, or a nearby radio tower — creating so much static that it is drowning out your mesh. + +## Where Signal Information Appears + +In the app, signal data is shown in several places: + +- **Node list** — signal bars icon next to each node +- **Node detail** — SNR, RSSI, and signal quality in the device metrics section +- **Traceroute** — per-hop signal quality for each relay node +- **Signal metrics** — historical SNR and RSSI data in the metrics charts + +![Node entry showing SNR, RSSI values and colored signal bars](/assets/screenshots/nodes_signal_info.png) + diff --git a/docs/ko-rKR/user/tak.md b/docs/ko-rKR/user/tak.md new file mode 100644 index 000000000..81de164fd --- /dev/null +++ b/docs/ko-rKR/user/tak.md @@ -0,0 +1,126 @@ +--- +title: TAK Integration +nav_order: 10 +last_updated: 2026-05-13 +description: Interoperate with ATAK and WinTAK — CoT position sharing, TAK roles, and plugin setup. +aliases: + - tak + - atak + - team-awareness-kit +--- + +# TAK Integration + +Meshtastic integrates with the Team Awareness Kit (TAK) ecosystem, enabling interoperability between Meshtastic mesh devices and TAK applications like ATAK and WinTAK. + +## Overview + +The TAK module allows Meshtastic nodes to: + +- Share position data in TAK-compatible CoT (Cursor on Target) format +- Appear as team members on TAK map displays +- Receive TAK PLI (Position Location Information) messages + +## Setup + +### Prerequisites + +- ATAK (Android Team Awareness Kit) or WinTAK installed +- Meshtastic ATAK Plugin installed +- TAK module enabled on your Meshtastic radio + +### 설정 + +1. Navigate to **Settings → Module Config → TAK**. +2. Enable the TAK module. +3. Configure the TAK team/group settings: + +![Module toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | 설명 | +| ------- | -------------------------- | +| 활성화 | Activate TAK interop | +| Mode | TAK-compatible output mode | + +### ATAK Plugin Setup + +1. Install the Meshtastic ATAK Plugin from the plugin repository. +2. Open ATAK and enable the Meshtastic plugin. +3. The plugin bridges messages between ATAK and your mesh network. + +## TAK Roles + +Nodes configured with TAK-related roles behave differently from standard clients: + +| 역할 | 설명 | +| --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **TAK** | Full TAK interoperability — sends and receives CoT data, chat messages, and PLI updates. Functions as a standard client plus TAK bridge. | +| **TAK Tracker** | Position-only TAK output — automatically broadcasts PLI at regular intervals without user interaction. Optimized for unattended position beacons (vehicles, equipment, waypoints). Does not relay chat messages. | + +> 💡 **Tip:** Use **TAK Tracker** for devices that only need to report position (e.g., a radio mounted in a vehicle). Use **TAK** for devices where users actively participate in TAK operations. + +### CoT (Cursor on Target) Format + +TAK messages use the Cursor on Target XML format — a military standard for sharing situational awareness data. Meshtastic converts its internal protobuf messages to CoT format when bridging to TAK systems, so no manual format conversion is needed. + +## TAK Identity + +When using TAK roles, your node broadcasts identity information that appears on TAK maps: + +| Setting | 설명 | +| -------- | ---------------------------------------------------------------------------------------------------------------- | +| Team | Your team color on the TAK map (e.g., Blue, Red, Cyan, Green) | +| 역할 | Your operational role (Team Member, Team Lead, HQ, Medic, RTO, etc.) | +| Callsign | Your TAK callsign (defaults to your Meshtastic long name) | + +These settings appear in **Settings → Module Config → TAK** when the TAK module is enabled. + +> 💡 **Tip:** Team/role colors are the standard TAK affiliation colors. Coordinate with your TAK team to use consistent team assignments. + +## Wire Format (V1 / V2) + +Meshtastic supports two TAK wire formats: + +| Format | Compatibility | Features | +| ------------------------------- | --------------------------------------------------------------- | --------------------------------------------------------- | +| V1 (Legacy) | ATAK Plugin v1.x, older firmware | Basic CoT position sharing only | +| V2 (Current) | ATAK Plugin v2.x, firmware 2.3+ | Full CoT support including chat, routes, zstd compression | + +The app automatically selects V2 when both sides support it. No manual configuration needed — the TAK module negotiates format based on firmware capabilities. + +## Usage with ATAK + +Once configured: + +- Meshtastic nodes appear as markers on the ATAK map with callsign labels +- Chat messages can bridge between mesh and TAK networks +- Position updates flow bidirectionally between Meshtastic and TAK +- TAK Tracker nodes broadcast PLI automatically — their positions appear on ATAK maps without any ATAK-side configuration + +> ⚠️ **Note:** TAK integration requires specific node roles and module configuration. Standard client nodes don't automatically participate in TAK operations. + +## Troubleshooting + +| Problem | Cause | Solution | +| -------------------------------- | ------------------------------------- | ----------------------------------------------------------------------- | +| Node doesn't appear on ATAK map | TAK module disabled or wrong role | Verify TAK module is enabled and node role is TAK or TAK Tracker | +| Position updates are stale | GPS fix lost or interval too long | Check GPS status; reduce position broadcast interval in Position Config | +| ATAK plugin shows "disconnected" | BLE connection lost or plugin crashed | Reconnect Bluetooth in Meshtastic app, then restart ATAK plugin | +| Chat messages not bridging | V1 format doesn't support chat | Ensure both nodes run firmware 2.3+ for V2 wire format | +| CoT data not flowing | Channel mismatch | All TAK nodes must be on the same channel with matching encryption | + +## Security Considerations + +- TAK data shares your position and callsign information +- Ensure your channel encryption is configured when using TAK in sensitive environments +- The TAK module respects the same channel encryption as other Meshtastic messages + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — TAK module configuration +- [Nodes](nodes) — TAK and TAK Tracker roles in the node list +- [Map & Waypoints](map-and-waypoints) — node positions on the map +- [ATAK plugin guide](https://meshtastic.org/docs/software/integrations/atak-plugin) — detailed ATAK setup on meshtastic.org + +--- + diff --git a/docs/ko-rKR/user/telemetry-and-sensors.md b/docs/ko-rKR/user/telemetry-and-sensors.md new file mode 100644 index 000000000..e92eb8c8b --- /dev/null +++ b/docs/ko-rKR/user/telemetry-and-sensors.md @@ -0,0 +1,118 @@ +--- +title: Telemetry & Sensors +nav_order: 9 +last_updated: 2026-05-13 +description: Sensor data on the mesh — supported environment, air quality, and power sensors, plus configuration and viewing guides. +aliases: + - sensors + - environment + - weather + - power-metrics +--- + +# Telemetry & Sensors + +Meshtastic nodes can collect and share sensor data across the mesh network. + +## Overview + +Telemetry allows nodes equipped with sensors to broadcast environmental, power, and device health information. This data is visible on the node detail screen and can be logged over time. + +## Device Telemetry + +All Meshtastic nodes report basic device telemetry: + +| Metric | 설명 | Typical Range | +| ------------------ | ------------------------------ | ------------------------------------------------------------------ | +| Battery Level | Charge percentage | 0–100% | +| 전압 | Battery voltage | 3.0–4.2V (LiPo) | +| 채널 사용 | % of airtime used locally | 0–100% | +| Air Utilization TX | % of airtime used by this node | 0–100% | +| 업타임 | Seconds since last boot | Varies | + +## Environment Sensors + +Supported environmental sensors: + +### Temperature & Humidity + +| Sensor | 온도 | 습도 | 기압 | Notes | +| ------- | -- | -- | -- | ----------------------- | +| BME280 | ✓ | ✓ | ✓ | Recommended all-in-one | +| BME680 | ✓ | ✓ | ✓ | Adds gas resistance/IAQ | +| SHT31 | ✓ | ✓ | — | High accuracy | +| MCP9808 | ✓ | — | — | Precision temperature | +| LPS22 | — | — | ✓ | Pressure only | + +### Air Quality + +| Sensor | Metric | Notes | +| -------- | -------------------------------------------------- | -------------------------- | +| BME680 | Gas Resistance / IAQ | Volatile organic compounds | +| PMSA003I | PM1.0, PM2.5, PM10 | Particulate matter | +| SEN55 | PM, NOx, VOC, Temp, Humidity | Multi-sensor | + +### Light & UV + +| Sensor | Metric | +| -------- | -------------------------------------- | +| OPT3001 | Ambient light (lux) | +| VEML7700 | Ambient light (lux) | +| LTR390 | UV index | + +## Power Metrics + +Nodes with INA-series power sensors can report: + +| Metric | 설명 | +| ----------- | ----------------------------------------- | +| Bus Voltage | Supply rail voltage | +| 전류 | Power consumption (mA) | +| 전원 | Calculated power (mW) | + +Useful for monitoring solar charging or battery health on remote nodes. + +## Configuring Telemetry + +1. Navigate to **Settings → Module Config → Telemetry**. +2. Set reporting intervals: + - **Device Metrics Interval** — how often to broadcast device metrics + - **Environment Metrics Interval** — how often to broadcast sensor data +3. Enable specific sensor types as needed. + +### Recommended Intervals + +| Use Case | Device (s) | Environment (s) | +| ------------------------------------------ | ----------------------------- | ---------------------------------- | +| Urban mesh (many nodes) | 3600 | 3600 | +| Rural mesh (few nodes) | 900 | 900 | +| Weather station | 900 | 300 | +| Battery conservation | 7200 | 7200 | + +> ⚠️ **Note:** Shorter intervals increase airtime usage and battery drain across the mesh. + +## Viewing Telemetry + +1. Navigate to **Nodes** and select a node. +2. Telemetry sections show on the detail screen: + - Device Metrics (always available) + - Environment Metrics (if sensors present) + - Power Metrics (if INA sensor present) +3. Historical graphs show trends over time. + +![Telemetry actions](/assets/screenshots/node-metrics_telemetric_actions.png) + +## Troubleshooting + +- **No environment data showing?** The remote node needs a physical sensor connected (e.g., BME280 on I2C). Device telemetry (battery, uptime) is always available, but environment metrics require hardware. +- **Stale readings?** Check the reporting interval — very long intervals (7200s+) mean data updates infrequently. Also verify the remote node is still online. +- **Sensor conflict on I2C bus?** Some sensors share I2C addresses. If you have multiple sensors on the same bus, check for address collisions in the radio's serial debug output. + +## Related Topics + +- [Node Metrics](node-metrics) — view telemetry data on the node detail screen +- [Settings — Modules & Admin](settings-module-admin) — telemetry module configuration +- [Units & Locale](units-and-locale) — temperature and pressure display units + +--- + diff --git a/docs/ko-rKR/user/translate.md b/docs/ko-rKR/user/translate.md new file mode 100644 index 000000000..b2ed79a34 --- /dev/null +++ b/docs/ko-rKR/user/translate.md @@ -0,0 +1,97 @@ +--- +title: Translate the App +parent: User Guide +nav_order: 17 +last_updated: 2026-05-13 +aliases: + - translate + - crowdin + - localization +--- + +# Translate the App + +Contributing translations helps make Meshtastic accessible to a wider audience. The app uses [Crowdin](https://crowdin.com/) to manage community translations for both the user interface and in-app documentation. + +--- + +## What Gets Translated + +| Resource | Source Location | Notes | +| ----------------- | ------------------------------------- | ---------------------------------------------------------------------- | +| UI strings | `composeResources/values/strings.xml` | Buttons, labels, messages, and all user-visible text | +| User Guide pages | `docs/user/*.md` | In-app documentation shown in Help & Documentation | +| Fastlane metadata | `fastlane/metadata/android/en-US/` | App Store listing title, description, and changelogs | + +> **Note — Developer Guide pages are English-only.** Code-focused documentation targeting contributors is not translated. + +--- + +## How to Contribute + +1. **Visit the Crowdin project.** Open the [Meshtastic Android Crowdin project](https://crowdin.com/project/meshtastic-android) and sign in or create a free account. +2. **Choose your language.** Select an existing language or request a new one by opening a [GitHub issue](https://github.com/meshtastic/Meshtastic-Android/issues/new). +3. **Translate strings.** Crowdin shows the English source on the left and your translation on the right. Translate each string and save. +4. **Review context.** Many strings include screenshots or context comments — check these to understand where the text appears in the app. +5. **Submit.** Approved translations are automatically merged into the next release. + +> **Tip — Keep translations short.** UI strings often appear in buttons, chips, or narrow columns. If a translation is significantly longer than the English original, consider abbreviating where the meaning stays clear. + +--- + +## Adding a New Language + +If your language is not yet listed on Crowdin: + +1. Open an issue on [GitHub](https://github.com/meshtastic/Meshtastic-Android/issues/new) requesting the new locale. +2. A maintainer will add the language to Crowdin and configure `crowdin.yml`. +3. Once added, you can begin translating immediately. + +--- + +## How Translations Are Organized + +The Android app uses **Compose Multiplatform resources** for all user-visible strings: + +``` +core/resources/src/commonMain/composeResources/ +├── values/ ← English (default) +│ └── strings.xml +├── values-de/ ← German +│ └── strings.xml +├── values-fr/ ← French +│ └── strings.xml +└── ... +``` + +In-app documentation follows a similar pattern under `docs/`: + +``` +docs/ +├── user/ ← English source (default) +│ ├── onboarding.md +│ └── ... +├── fr/user/ ← French translations +│ ├── onboarding.md +│ └── ... +└── ... +``` + +The app automatically selects the correct locale based on your device's **Language & Region** settings. + +--- + +## Translation Guidelines + +- **Do not translate** technical terms like "LoRa", "MQTT", "BLE", "TAK", "SNR", or "RSSI" — these are universal. +- **Keep placeholders intact.** Strings like `%1$s` or `%d` are filled in at runtime. Do not remove or reorder them unless the grammar of your language requires it. +- **Match tone.** The app uses a friendly, direct voice. Avoid overly formal language. +- **Test if possible.** Switch your device language and open the app to see how translations look in context. + +--- + +## Questions? + +If you have questions about a specific string's context or need help getting started, open a discussion on the [Meshtastic GitHub Discussions](https://github.com/meshtastic/Meshtastic-Android/discussions) page. + +Thank you for helping expand the reach of Meshtastic! diff --git a/docs/ko-rKR/user/units-and-locale.md b/docs/ko-rKR/user/units-and-locale.md new file mode 100644 index 000000000..0720f7226 --- /dev/null +++ b/docs/ko-rKR/user/units-and-locale.md @@ -0,0 +1,118 @@ +--- +title: Units, Measurement & Locale +parent: User Guide +nav_order: 16 +last_updated: 2026-05-12 +--- + +# Units, Measurement & Locale + +The Meshtastic app automatically displays temperatures, distances, speeds, and times in the units your device is configured to use — no settings to change inside the app. + +--- + +## How It Works + +Meshtastic radios always transmit data in **metric units** (meters, °C, km/h, hPa, etc.). When the app receives this data, it uses the `MetricFormatter` utility to convert and display values in whatever unit system your device's locale specifies. + +On Android, your measurement preferences are determined by your system **Language & Region** settings. On Desktop (JVM), the app uses the JVM's default `Locale`. + +> **Tip — You never need to toggle units inside the app.** Change your system measurement preferences and every screen in Meshtastic updates automatically — node details, telemetry charts, weather, altitude, and more. + +--- + +## 온도 + +Temperature values from environment sensors are transmitted as **°C** and displayed based on your device's temperature unit preference. + +![Environment metrics with temperature](/assets/screenshots/nodes_environment_metrics.png) + +| Your Setting | You See | +| ------------ | ------- | +| Celsius | 22°C | +| Fahrenheit | 72°F | + +This affects all temperature displays throughout the app: node environment telemetry, soil temperature, dew point, and telemetry chart axes. + +## Distance & Altitude + +Distances between nodes and GPS altitudes are transmitted as **meters** and automatically scaled and converted. + +![Distance info display](/assets/screenshots/nodes_distance_info.png) + +| Your Setting | Small Distance | Large Distance | Altitude | +| -------------------------------- | -------------- | ---------------------- | -------- | +| Metric | 350 m | 2.5 km | 1,200 m | +| Imperial (US) | 1,148 ft | 1.6 mi | 3,937 ft | + +The app uses natural scaling — short distances stay in meters or feet, while longer distances switch to kilometres or miles automatically. + +### Where these appear + +- **Node list** — distance and bearing to each node +- **Node detail** — altitude, distance from your position +- **Map** — waypoint distances, traceroute hop distances +- **Compass** — distance to selected node + +## Speed + +GPS ground speed is displayed in your locale's preferred speed unit. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Metric | 12 km/h | +| Imperial (US) | 7 mph | + +## 바람 + +Wind speed and gust data from environment sensors are transmitted as **m/s** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Metric | 5 m/s | +| Imperial (US) | 11 mph | + +Wind readings appear in the **Node Detail** environment section and the **Environment Telemetry** charts. + +## Rainfall + +Rainfall measurements (1-hour and 24-hour totals) are transmitted as **mm** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ---------------------- | +| Metric | 12 mm | +| Imperial (US) | 0.5 in | + +## Units That Never Change + +Some units are international standards and are displayed the same way regardless of your locale: + +| Measurement | Unit | Why | +| -------------------------------- | ------------------------------ | ------------------------------------- | +| Barometric pressure | hPa | International meteorological standard | +| Heading / bearing | ° (degrees) | Universal navigation convention | +| 복사 | μR/hr | Standard dosimetry unit | +| GPS coordinates | decimal degrees | Universal geographic standard | +| Humidity, battery, soil moisture | % | Universal | + +## Date & Time + +All timestamps throughout the app — last heard, message times, telemetry logs, chart axes — follow your device's date and time preferences. + +| Setting | What It Controls | Example | +| ---------------- | ---------------- | ------------------------------------------------ | +| **24-Hour Time** | Clock format | 14:30 vs 2:30 PM | +| **Date Format** | Date ordering | 09/05/2026 vs 05/09/2026 | + +The app also uses **relative time** where it makes sense — for example, "5 min ago" or "2 hours ago" in the node list — which is automatically localised into your device language. + +## Changing Your Measurement System (Android) + +On Android, your measurement system (metric vs imperial) is tied to your region setting: + +1. Open **Android Settings → System → Language & Region** +2. Change your **Region** or **Measurement units** preference +3. Return to Meshtastic — values update immediately + +> **Tip — The app uses `MetricFormatter` from `core:common`.** All measurement formatting is handled by a shared KMP utility that respects your platform's locale. Developers adding new measurement displays should use `MetricFormatter` rather than hard-coding unit conversions. + diff --git a/docs/lt-rLT/index.md b/docs/lt-rLT/index.md new file mode 100644 index 000000000..6126919ea --- /dev/null +++ b/docs/lt-rLT/index.md @@ -0,0 +1,30 @@ +--- +title: Home +layout: default +nav_order: 0 +--- + +# Meshtastic Android App Documentation + +User and developer documentation for the Meshtastic Android, Desktop, and iOS applications powered by KMP (Kotlin Multiplatform). + +Use the sidebar navigation to browse the **User Guide** for app features and the **Developer Guide** for contributing to the project. + +--- + +## Quick Links + +| Guide | Aprašymas | +| --------------------------------------------------------------------- | -------------------------------------------------------------- | +| [Getting Started](user/onboarding) | Connect your first radio and send a message | +| [Messages & Channels](user/messages-and-channels) | Channel broadcasts, direct messages, reactions, and encryption | +| [Nodes](user/nodes) | Understanding the mesh network node list | +| [Signal Meter](user/signal-meter) | How the LoRa signal quality meter works | +| [Units & Locale](user/units-and-locale) | How temperatures, distances, and times adapt to your region | +| [Desktop App](user/desktop) | Linux, macOS, and Windows desktop usage | +| [Architecture](developer/architecture) | App architecture overview for contributors | +| [Contributing](developer/contributing) | Branch naming, PR workflow, and verification commands | + +--- + +> This documentation is served from the same markdown source that powers the in-app **Help & Documentation** browser. diff --git a/docs/lt-rLT/user/connections.md b/docs/lt-rLT/user/connections.md new file mode 100644 index 000000000..1c1d8c8d7 --- /dev/null +++ b/docs/lt-rLT/user/connections.md @@ -0,0 +1,125 @@ +--- +title: Connections +nav_order: 2 +last_updated: 2026-05-13 +description: Connect your phone or desktop to a Meshtastic radio via Bluetooth, USB, or TCP/IP. +aliases: + - bluetooth + - usb + - tcp + - pairing +--- + +# Connections + +Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node. + +## Bluetooth (BLE) + +Bluetooth Low Energy is the default and most common connection method on Android. + +### Pairing a Device + +1. Ensure your Meshtastic radio is powered on and in pairing mode. +2. Open the app and navigate to **Connections**. +3. Tap **Scan for Devices** — nearby Meshtastic radios will appear. +4. Select your device from the list. +5. Accept the Bluetooth pairing prompt if shown. + +![Device list item](/assets/screenshots/connections_bluetooth_scan.png) + +You can filter devices by transport type using the filter chips at the top: + +![Transport filter chips](/assets/screenshots/connections_transport_filters.png) + +> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. + +### Connection Status + +| Icon | State | Aprašymas | +| ---- | -------------- | ----------------------------- | +| 🟢 | Connected | Active radio link established | +| 🟡 | Connecting | Handshake in progress | +| 🔴 | Atsijungta | No active connection | +| ⚪ | Not configured | No device selected | + +When connecting, a status indicator shows the current connection state: + +![Connecting status](/assets/screenshots/connections_connecting.png) + +If no devices are found, the app shows an empty state with instructions: + +![No devices found](/assets/screenshots/connections_empty_state.png) + +### Troubleshooting Bluetooth + +- **Device not found:** Toggle Bluetooth off/on, ensure location is enabled. +- **Connection drops:** Move closer to the radio; check for interference. +- **Pairing rejected:** Forget the device in Android Bluetooth settings and retry. + +## USB Serial + +USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable. + +### Setup + +1. Connect your radio via USB cable to your device. +2. The app will prompt for USB permission — tap **Allow**. +3. The connection is established automatically. + +> ⚠️ **Note:** USB connections require OTG support on Android devices. + +## TCP/IP (WiFi) + +Some Meshtastic radios support WiFi connectivity, allowing TCP-based connections. + +### Configuration + +1. Connect your radio to a WiFi network via the radio's web interface or settings. +2. In the app, go to **Connections → TCP**. +3. Enter the radio's IP address and port (default: 4403). +4. Tap **Connect**. + +![WiFi scanning for devices](/assets/screenshots/connections_wifi_scanning.png) + +When a device is found, it appears in the connection list: + +![WiFi device found](/assets/screenshots/connections_wifi_device_found.png) + +A successful connection is confirmed with a status indicator: + +![WiFi connection success](/assets/screenshots/connections_wifi_success.png) + +### When to Use TCP + +- Radio is on the same local network +- Testing with a simulated radio +- Environments where Bluetooth has interference issues + +## Reconnection Behavior + +The app reconnects to the **last selected device** on startup. You can manually switch transports from the connections screen at any time. + +To disconnect from a radio, use the disconnect button on the connections screen: + +![Disconnect from radio](/assets/screenshots/connections_disconnect.png) + +## Desktop Connections + +On Desktop (Linux/macOS/Windows), the app supports: + +- **Bluetooth (BLE)** — via the Kable library; works on macOS, Linux, and Windows +- **USB Serial** — primary wired connection method +- **TCP/IP** — for network-connected radios + +See [Desktop App](desktop) for platform-specific details and keyboard shortcuts. + +## Related Topics + +- [Getting Started](onboarding) — first-launch setup and permissions +- [Settings — Radio & User](settings-radio-user) — Bluetooth and network configuration +- [Desktop App](desktop) — desktop-specific connection details +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — full list of compatible radios on meshtastic.org + +--- + diff --git a/docs/lt-rLT/user/desktop.md b/docs/lt-rLT/user/desktop.md new file mode 100644 index 000000000..a688679eb --- /dev/null +++ b/docs/lt-rLT/user/desktop.md @@ -0,0 +1,147 @@ +--- +title: Desktop App +nav_order: 14 +last_updated: 2026-05-13 +description: Install and use the Meshtastic Desktop app on Linux, macOS, and Windows — connections, feature parity, and keyboard shortcuts. +aliases: + - desktop + - linux + - macos + - windows + - jvm +--- + +# Desktop App + +The Meshtastic Desktop application provides the same mesh communication features on Linux, macOS, and Windows. + +## Overview + +The Desktop app shares its core codebase with the Android app through Kotlin Multiplatform (KMP). Most features work identically across platforms. + +## Installation + +### Linux + +- Download the `.deb` or `.AppImage` package from the releases page +- Or build from source using `./gradlew :desktopApp:run` + +### macOS + +- Download the `.dmg` package from releases +- Or build from source + +### Windows + +- Download the `.msi` installer from releases +- Or build from source + +## Connecting Your Radio + +### USB Serial (Primary) + +The most reliable connection method on Desktop: + +1. Connect your Meshtastic radio via USB cable. +2. The app should detect the serial port automatically. +3. If not detected, select the correct serial port from the connections menu. + +### TCP/IP + +For network-connected radios: + +1. Enter the radio's IP address and port (default: 4403). +2. Click **Connect**. + +### Bluetooth (BLE) + +Bluetooth Low Energy is supported on Desktop via the [Kable](https://github.com/JuulLabs/kable) library: + +1. Ensure your system has a Bluetooth adapter. +2. The app scans for nearby Meshtastic radios automatically. +3. Select your device from the connections screen. + +## Feature Parity + +| Feature | Android | Desktop | Notes | +| ---------------------------------------- | ------- | ------- | -------------------------- | +| Messaging | ✓ | ✓ | Full parity | +| Node List | ✓ | ✓ | Full parity | +| Map | ✓ | ✓ | Full parity | +| Settings | ✓ | ✓ | Full parity | +| Bluetooth (BLE) | ✓ | ✓ | Via Kable on desktop | +| Firmware Update OTA | ✓ | ✗ | Use web flasher | +| Notifications | ✓ | ✓ | Native OS notifications | +| Widgets | ✓ | ✗ | Android-only | +| AI Assistant (Chirpy) | ✓\* | ✗ | Google flavor Android only | + +\*Chirpy AI requires Android 14+ on Google flavor builds with supported hardware. + +## UI Differences + +The Desktop app uses the same Compose Multiplatform UI with adaptations for larger screens and desktop interaction. + +### Keyboard Shortcuts + +| Shortcut | Action | +| ------------------- | --------------------------- | +| **⌘Q** / **Ctrl+Q** | Quit the application | +| **⌘,** / **Ctrl+,** | Open Settings | +| **⌘1** / **Ctrl+1** | Switch to Conversations tab | +| **⌘2** / **Ctrl+2** | Switch to Nodes tab | +| **⌘3** / **Ctrl+3** | Switch to Map tab | +| **⌘4** / **Ctrl+4** | Switch to Connections tab | + +### Window & System Tray + +- **Window resizing** — responsive layout adapts to window dimensions +- **System tray** — minimize to system tray for background mesh operation +- **Tray menu** — right-click the tray icon to show window or quit +- **Mouse interaction** — hover states and standard desktop navigation + +### Notification Preferences + +The Desktop app provides in-app toggles for controlling which notifications are shown — messages, new nodes, and low battery alerts. Access these from **Settings → Notifications** within the app. + +## Built-in Documentation Browser + +The Desktop app includes a built-in documentation browser for quick access to help content without leaving the application. + +![Docs browser with table of contents](/assets/screenshots/docs-browser_toc.png) + +The browser supports full-text search across all documentation: + +![Searching the docs browser](/assets/screenshots/docs-browser_search.png) + +Individual doc pages render with full formatting: + +![A documentation page](/assets/screenshots/docs-browser_page.png) + +## Building from Source + +```bash +git clone https://github.com/meshtastic/Meshtastic-Android.git +cd Meshtastic-Android +git submodule update --init +./gradlew :desktopApp:run +``` + +Requirements: + +- JDK 21 +- No Android SDK required for desktop-only builds + +## Known Limitations + +- No OTA firmware updates (use web flasher) +- Some Android-specific features (widgets, specific notification channels) are unavailable +- Performance may vary on low-spec hardware running Compose Desktop +- BLE bonding is not yet supported on desktop (pairing works without bonding) + +## Related Topics + +- [Connections](connections) — connection methods overview +- [Firmware Updates](firmware) — use the [Web Flasher](https://flasher.meshtastic.org) for desktop firmware updates + +--- + diff --git a/docs/lt-rLT/user/discovery.md b/docs/lt-rLT/user/discovery.md new file mode 100644 index 000000000..87ed93fa3 --- /dev/null +++ b/docs/lt-rLT/user/discovery.md @@ -0,0 +1,114 @@ +--- +title: Discovery +nav_order: 12 +last_updated: 2026-05-13 +description: Explore your mesh network — traceroute paths, neighbor maps, and node discovery tools. +aliases: + - mesh-discovery + - local-discovery + - network-scan + - traceroute + - neighbor-info +--- + +# Discovery + +Discovery tools help you understand **how** your mesh network is connected — which nodes can hear each other, what paths messages take, and where bottlenecks or weak links exist. + +> 💡 **Tip:** You don't need a dedicated "discovery mode" to start exploring your mesh. The tools below are available right now from the node list and node detail screens. + +--- + +## Žinutės kelias + +Traceroute reveals the exact path a message takes from your node to any other node on the mesh. It's the single most useful tool for debugging connectivity problems. + +### Running a Traceroute + +1. Navigate to **Nodes** and tap the node you want to trace. +2. On the node detail screen, tap **Traceroute**. +3. The app sends a traceroute request and waits for the response. +4. Results display each hop in order, with signal quality at every step. + +### Reading the Results + +A traceroute result looks like this: + +``` +You → Node A (SNR: 8.5, RSSI: -95) → Node B (SNR: 5.2, RSSI: -108) → Target +``` + +Each hop represents a relay node that forwarded the message. The SNR and RSSI values at each hop tell you about the link quality on that specific segment. + +| What to look for | What it means | +| -------------------------------------------------------------------------- | --------------------------------------------------------------------------- | +| All hops show Good SNR (> 5 dB) | Healthy path — messages flow reliably | +| One hop shows Bad SNR (< 0 dB) | Weak link — this relay segment is fragile | +| Many hops (4+) | Long path — consider repositioning a node to shorten it | +| Different path on retry | Mesh is adapting — multiple routes exist (this is good!) | + +> 💡 **Tip:** Run traceroute several times over a few minutes. If the path changes, your mesh has redundant routes — a sign of a well-connected network. + +### Troubleshooting with Traceroute + +- **"No route found"** — The target node may be offline, out of range, or on a different channel. Check that both nodes share at least one channel with the same encryption key. +- **Traceroute times out** — The path may be too long (exceeds hop limit) or a relay node is congested. Try increasing the hop limit in **Settings → LoRa Config**. +- **Asymmetric paths** — A traceroute from A→B may take a different path than B→A. This is normal — radio propagation is not always symmetric. + +--- + +## Neighbor Info + +The Neighbor Info module lets each node broadcast a list of the nodes it can **directly hear** (single-hop). When multiple nodes share their neighbor lists, you can piece together a topology map of the entire mesh. + +### Enabling Neighbor Info + +1. Navigate to **Settings → Module Config → Neighbor Info**. +2. Enable the module. +3. Set the broadcast interval (default: 900 seconds / 15 minutes). + +Once enabled, your node periodically broadcasts its neighbor table. Other nodes with Neighbor Info enabled do the same. + +### Viewing Neighbor Data + +- Open any node's detail screen and look for the **Neighbors** section. +- Each neighbor entry shows the node that was directly heard and its signal quality. +- Combine neighbor data from multiple nodes to understand the full mesh topology. + +> ⚠️ **Note:** Neighbor Info increases airtime usage because every enabled node periodically broadcasts its neighbor list. On busy meshes with many nodes, consider longer broadcast intervals (3600 seconds or more) to avoid congestion. + +--- + +## Node List as a Discovery Tool + +The node list itself is a powerful discovery tool when you use its filtering and sorting features effectively. + +### Finding New Nodes + +- Sort by **Last heard** to see the most recently active nodes at the top. +- Enable **Include unknown** to see nodes that have appeared on the mesh but haven't sent user info yet — these are often newly powered-on devices. + +### Assessing Connectivity + +- Sort by **Hops away** to see which nodes are directly reachable (0 hops) versus relayed. +- Sort by **Distance** to find nearby nodes and verify they're reachable. +- Use **Exclude MQTT** to focus on nodes reachable over radio (not via internet bridge). + +### Infrastructure Audit + +- Disable **Exclude infrastructure** to see Router, Repeater, Router Late, and Client Base nodes. +- Check their signal quality and last-heard times to verify your infrastructure nodes are healthy. + +See [Nodes](nodes) for full details on filtering and sorting options. + +--- + +## Tips for Mesh Exploration + +- **Start with traceroute** — it gives you immediate, actionable information about a specific path. +- **Enable Neighbor Info on key nodes** — especially routers and repeaters, to build a picture of the backbone. +- **Check the map** — node positions on the [Map](map-and-waypoints) combined with signal data help you understand why some links are strong and others are weak. +- **Compare signal over time** — use the [Signal Meter](signal-meter) guide to interpret SNR and RSSI values correctly. + +--- + diff --git a/docs/lt-rLT/user/firmware.md b/docs/lt-rLT/user/firmware.md new file mode 100644 index 000000000..e6b69bf01 --- /dev/null +++ b/docs/lt-rLT/user/firmware.md @@ -0,0 +1,114 @@ +--- +title: Firmware Updates +nav_order: 13 +last_updated: 2026-05-13 +description: Update your radio firmware over Bluetooth — OTA process, version channels, pre-flight checks, and recovery. +aliases: + - firmware + - update + - ota + - flash +--- + +# Firmware Updates + +Keep your Meshtastic radio up to date with the latest firmware for new features, bug fixes, and security improvements. + +## Checking for Updates + +1. Navigate to **Settings → Firmware Update** or tap the firmware notification if shown. +2. The app checks for available firmware versions. +3. Available updates show the version number and changelog summary. + +## Update Methods + +### OTA (Over-The-Air) via Bluetooth + +The most common update method for Android users: + +1. Ensure your radio is connected via Bluetooth. +2. Navigate to the Firmware Update screen. +3. Select the desired firmware version. +4. Tap **Update** to begin the OTA process. +5. Wait for the update to complete — **do not disconnect** during the update. + +![Firmware checking for updates](/assets/screenshots/firmware_checking.png) + +> ⚠️ **Warning:** Interrupting a firmware update can brick your device. Ensure your radio has sufficient battery (>50% recommended) and maintain Bluetooth proximity during the entire process. + +![Firmware disclaimer](/assets/screenshots/firmware_disclaimer.png) + +### USB Flashing + +For recovery or when OTA is unavailable: + +- Use the [Meshtastic Web Flasher](https://flasher.meshtastic.org) +- Or the [Meshtastic CLI tool](https://meshtastic.org/docs/getting-started/flashing-firmware) on desktop + +## Version Channels + +| Kanalas | Aprašymas | +| ------- | ------------------------------------------- | +| Stable | Recommended for most users; tested releases | +| Alpha | Preview releases; may contain bugs | + +## Pre-Update Checklist + +Before updating: + +- [ ] Battery > 50% +- [ ] Stable Bluetooth connection +- [ ] Note your current settings (they may reset on major version changes) +- [ ] Check the release notes for breaking changes + +## Post-Update + +After a successful update: + +- The radio will reboot automatically +- Bluetooth connection will re-establish +- Verify your settings are intact +- Check the firmware version in **Settings → About** + +![Firmware update success](/assets/screenshots/firmware_success.png) + +## Troubleshooting + +### Update Stuck + +If the update appears frozen: + +- Wait at least 5 minutes before intervening +- If truly stuck, power-cycle the radio +- Attempt the update again + +![Firmware update error](/assets/screenshots/firmware_error.png) + +### Device Won't Boot After Update + +If your device fails to boot: + +1. Try connecting via USB to a computer +2. Use the web flasher in recovery/DFU mode +3. Flash a known-good firmware version +4. Check the Meshtastic Discord for device-specific recovery steps + +### Compatibility Warnings + +The app may show warnings when: + +- Connected radio firmware is below minimum supported version +- Major version mismatch between app and firmware +- Deprecated features need migration + +> ⚠️ **Important:** Always update the Meshtastic app before or alongside firmware updates to ensure compatibility. + +## Related Topics + +- [Connections](connections) — reconnecting after a firmware update +- [Flashing firmware guide](https://meshtastic.org/docs/getting-started/flashing-firmware) — full firmware flashing walkthrough on meshtastic.org +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — check firmware compatibility by device +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/lt-rLT/user/map-and-waypoints.md b/docs/lt-rLT/user/map-and-waypoints.md new file mode 100644 index 000000000..450d5f918 --- /dev/null +++ b/docs/lt-rLT/user/map-and-waypoints.md @@ -0,0 +1,116 @@ +--- +title: Map & Waypoints +nav_order: 6 +last_updated: 2026-05-13 +description: View node positions on the map, create and share waypoints, and manage position sharing and privacy. +aliases: + - map + - waypoints + - gps + - location +--- + +# Map & Waypoints + +The Map screen shows the geographic positions of nodes on your mesh, along with shared waypoints. + +## Map View + +The map displays: + +- **Node positions** — colored markers for each node reporting location +- **Waypoints** — shared points of interest +- **Your position** — your current GPS location + +### Node Markers + +Node markers on the map indicate: + +| Color | Meaning | +| ------ | ---------------------------------------------- | +| Green | Online (heard recently) | +| Yellow | Away (heard within 2 hours) | +| Gray | Offline (stale position) | +| Blue | Your own node | + +### Map Controls + +- **Zoom** — pinch or use +/- buttons +- **Pan** — drag to explore +- **Center** — select the location button to center on your position +- **Node tap** — tap a node marker to view details + +The floating toolbar provides quick access to compass, layer switching, node filters, refresh, and location tracking. Tap the compass to reorient north-up, or tap the location button to center on your current position. + +![Map controls overlay](/assets/screenshots/map_controls_overlay.png) + +## Waypoints + +Waypoints are shared geographic points of interest that all mesh members can see. + +### Creating a Waypoint + +1. Long-press on the map at the desired location. +2. Enter a name and optional description. +3. Choose an icon/emoji for the waypoint. +4. Tap **Send** to share with the mesh. + +### Waypoint Properties + +| Property | Aprašymas | +| ----------- | ------------------------------------------------------- | +| Pavadinimas | Short identifier (max 30 characters) | +| Aprašymas | Optional longer description | +| Icon | Visual marker emoji on the map | +| Užrakintas | If locked, only the creator can edit or delete | +| Expiration | Optional auto-remove time | + +### Waypoint Expiration + +Waypoints can be set to expire automatically: + +- **Never** (default) — waypoint remains until manually deleted +- **Timed** — waypoint is automatically removed after the specified duration (e.g., "remove after 2 hours"). Useful for temporary markers like rally points, hazards, or meeting locations. + +Expired waypoints are automatically hidden from the map so they don't clutter the display. The expiration countdown begins when the waypoint is created, not when other nodes receive it. + +### Managing Waypoints + +- Tap a waypoint on the map to view its details and coordinates +- Edit or delete waypoints you created +- **Locked waypoints** cannot be modified or deleted by other nodes — only the original creator can change them +- Unlocked waypoints can be edited by any mesh member + +## Position Sharing + +### Enabling Position Sharing + +Your node shares its GPS position based on: + +- **Fixed interval** — broadcast position at regular intervals +- **Smart position** — broadcast when movement exceeds a threshold +- **Manual** — only share when explicitly requested + +Configure position behavior in **Settings → Position**. + +### Privacy Considerations + +> 🔒 **Privacy:** Position data is broadcast to all nodes on your channel. If you don't want your location shared, disable GPS position in settings or use a fixed/fake position. + +## Map Sources + +The app supports multiple map tile sources: + +- OpenStreetMap (default) +- Satellite imagery (where available) +- Offline tiles (download map areas for offline use) + +## Related Topics + +- [Nodes](nodes) — view and filter your node list +- [Node Metrics](node-metrics) — signal quality and position history for individual nodes +- [Discovery](discovery) — traceroute and neighbor info for understanding mesh topology +- [Units & Locale](units-and-locale) — distance and coordinate display formats + +--- + diff --git a/docs/lt-rLT/user/messages-and-channels.md b/docs/lt-rLT/user/messages-and-channels.md new file mode 100644 index 000000000..9a09b5796 --- /dev/null +++ b/docs/lt-rLT/user/messages-and-channels.md @@ -0,0 +1,159 @@ +--- +title: Messages & Channels +nav_order: 3 +last_updated: 2026-05-13 +description: Send and receive messages, manage channels, configure encryption, and use quick chat, reactions, and message actions. +aliases: + - channels + - direct-messages + - messaging + - conversations +--- + +# Messages & Channels + +Meshtastic supports two communication modes: **channel broadcasts** and **direct messages**. + +## Channels + +Channels are shared communication groups. All nodes configured with the same channel key can read and send messages on that channel. + +### Default Channel + +Every Meshtastic device comes with a default **LongFast** channel. This is an unencrypted channel used for general mesh communication. + +### Channel Security + +Channels support multiple encryption levels: + +| Icon | Security Level | Aprašymas | +| ---- | ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------- | +| 🔒 | PSK (256-bit AES) | Fully encrypted with a strong pre-shared key. Only nodes with the matching key can read messages. | +| 🔐 | PSK (128-bit AES) | Encrypted with a shorter key. Secure for most uses but 256-bit is preferred for sensitive data. | +| 🔓 | Default / Open | Uses the well-known default key. **Any Meshtastic device** on the same preset can read these messages. | +| ⚠️ | Insecure + Position | Open channel that also broadcasts your GPS position. Use with caution in public meshes. | + +> 🔒 **Security Tip:** 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. + +### Adding a Channel + +1. Navigate to **Settings → Channels**. +2. Tap **Add Channel** or scan a QR code. +3. Configure the channel name and encryption key. +4. Share the channel URL/QR code with others who need access. + +Tapping a channel shows its details and sharing options. + +## Direct Messages + +Direct messages (DMs) are point-to-point encrypted communications between two specific nodes. + +### Sending a Direct Message + +1. Open the **Messages** tab. +2. Select a node from your contacts list or tap a node in the node list. +3. Type your message and tap **Send**. + +### Message States + +| State | Icon | Meaning | +| --------------------------------- | ---- | ----------------------------------------------------------------------------------------------------------------- | +| Queued | ⏳ | Message waiting to be sent | +| En route | ✓ | Delivered to the radio, awaiting acknowledgment | +| Delivered | ✓✓ | Acknowledgment received from recipient | +| Received | ✓ | Message received from the mesh (incoming) | +| S&F Routing | 🔗 | Store & Forward: message being routed through an S&F node | +| S&F Confirmed | 🔗 | Store & Forward: delivery confirmed via S&F node | +| Klaida | ✗ | Delivery failed after retries | + +### Delivery Errors + +When a message fails to deliver, the error indicator shows what went wrong: + +| Klaida | Meaning | What to Do | +| ---------------- | ---------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| No Route | No path exists to the destination node | The recipient may be offline or out of mesh range. Try later or move closer. | +| Got NAK | The next-hop node refused to relay | The relay node may be congested. Wait and retry. | +| Baigėsi laikas | No acknowledgment within retry window | The recipient may be just out of range. Try increasing hop limit or moving to a better position. | +| Nėra sąsajos | No radio interface available to send | Check that your radio is connected and the channel is configured. | +| Max Retransmit | All retry attempts exhausted | The mesh path is unreliable. Try a different channel or wait for conditions to improve. | +| Nėra kanalo | The destination channel doesn't exist | Verify both nodes share the same channel configuration. | +| Too Large | Message exceeds maximum payload size | Shorten your message (max ~230 characters). | +| No Response | Node received message but didn't respond | The recipient's radio may be busy or in low-power sleep mode. | +| Duty Cycle Limit | Regional airtime limit reached | Your radio has used its allowed transmit time. Wait for the duty cycle window to reset (typically 1 hour in EU regions). | +| Bloga užklausa | Malformed or invalid message | This usually indicates a software bug. Try restarting the app. | + +> 💡 **Tip:** 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. + +## Message Features + +### Quick Chat + +Pre-configured messages for rapid communication: + +- Access via the Quick Chat button in the message input area +- Choose from built-in phrases or custom messages +- Customize quick chat messages in **Settings → Quick Chat** +- Useful when typing is impractical (gloves, small screen, urgent) + +![Quick chat option](/assets/screenshots/messages_quick_chat.png) + +The channel list shows each channel with its latest message preview. + +### Message Bubbles + +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. + +### Reactions + +React to messages with emoji: + +- **Long-press** a message to open the actions menu +- Tap **Add Reaction** to choose an emoji +- Reactions appear below the message bubble +- Multiple users can react to the same message +- React to your own messages or others' messages + +![Emoji reaction badges displayed beneath a message](/assets/screenshots/messages_reaction.png) + +> 💡 **Tip:** Reactions are lightweight — they use minimal mesh bandwidth compared to full text messages. + +### Message Actions + +Long-press any message to access: + +- **Copy** — copy message text to clipboard +- **Reply** — quote the message in your response +- **React** — add an emoji reaction +- **Delete** — remove a message you sent (local deletion) + +### Message Priority + +Messages are queued and transmitted based on priority: + +1. Emergency/alert messages (highest) +2. Direct messages +3. Channel broadcasts (lowest) + +### Message Limits + +- **Maximum length:** 237 bytes (approximately 230 characters for ASCII text) +- **Rate limiting:** The mesh enforces airtime fairness; heavy message volume may be throttled +- **Delivery:** Messages are retried automatically if no acknowledgment is received + +## Best Practices + +- Use channels for group coordination +- Use direct messages for private person-to-person communication +- Keep messages short — mesh bandwidth is limited +- Configure encryption for sensitive communications + +## Related Topics + +- [Nodes](nodes) — tap a node to start a direct message +- [Settings — Radio & User](settings-radio-user) — configure channel encryption and presets +- [MQTT](mqtt) — bridge channel messages to the internet +- [Channel configuration](https://meshtastic.org/docs/configuration/radio/channels) — detailed channel settings on meshtastic.org + +--- + diff --git a/docs/lt-rLT/user/mqtt.md b/docs/lt-rLT/user/mqtt.md new file mode 100644 index 000000000..6ecbde368 --- /dev/null +++ b/docs/lt-rLT/user/mqtt.md @@ -0,0 +1,137 @@ +--- +title: MQTT +nav_order: 11 +last_updated: 2026-05-13 +description: Bridge your mesh to the internet — MQTT broker setup, encryption layers, and map reporting. +aliases: + - mqtt + - internet-bridge + - broker +--- + +# MQTT + +MQTT bridges your Meshtastic mesh network to the internet, enabling long-range communication beyond radio range. + +## Overview + +The MQTT module connects your node to an MQTT broker, allowing: + +- Messages to reach nodes on different physical meshes via the internet +- Integration with home automation and monitoring systems +- Publishing node positions to the public Meshtastic map +- Custom data pipelines for logging and alerting + +## How It Works + +``` +[Your Node] → Radio → [Gateway Node with WiFi] → MQTT Broker → [Remote Gateway] → Radio → [Remote Node] +``` + +A gateway node with internet access (WiFi or Ethernet) publishes mesh messages to an MQTT topic. Remote gateways subscribed to the same topic inject those messages into their local mesh. + +## Configuration + +### Enabling MQTT + +1. Navigate to **Settings → Module Config → MQTT**. +2. Enable the MQTT module. +3. Configure the broker connection: + +![MQTT toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | Aprašymas | Default | +| --------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------- | +| Server Address | MQTT broker hostname | mqtt.meshtastic.org | +| Username | Broker authentication | meshdev | +| Password | Broker authentication | large4cats | +| Root Topic | Base topic for messages | msh | +| Encryption | Encrypt MQTT payload | Enabled | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON packet support has been removed from firmware; this field is ignored | Disabled | +| TLS | Secure connection to broker | Disabled | +| Map Reporting | Report position to public map | Disabled | + +### Default Meshtastic Broker + +The community maintains a public broker at `mqtt.meshtastic.org`. This is intended for general use and testing. + +> 🔒 **Privacy:** Messages on the public broker are readable by anyone subscribed. Always use channel encryption for private communications. + +### Private Broker + +For better privacy and control, you can run your own MQTT broker: + +- Mosquitto (lightweight, open-source) +- HiveMQ +- EMQX + +Configure your node to point to your private broker with appropriate credentials. + +## Map Reporting + +When Map Reporting is enabled, your node publishes its position to the Meshtastic community map: + +- Visible at [meshmap.net](https://meshmap.net) and similar community map services +- Only position and node info are shared +- Disable this if you don't want your location publicly visible + +## Uplink vs Downlink + +| Direction | Aprašymas | +| ------------ | -------------------------------- | +| **Uplink** | Messages from mesh → MQTT broker | +| **Downlink** | Messages from MQTT broker → mesh | + +Configure per-channel which directions are active to control message flow and airtime usage. + +## Message Formats + +MQTT uses protobuf message format: + +| Format | Aprašymas | Use case | +| ------------ | ----------------------------------- | -------------------------- | +| **Protobuf** | Binary Meshtastic protobuf encoding | Node-to-node mesh bridging | + +> ⚠️ **Note:** JSON output support was removed from firmware. The `json_enabled` setting is still visible in the app for legacy compatibility but has no effect on current firmware versions. + +## Encryption & Privacy + +Understanding the layered encryption model: + +1. **Channel encryption** happens on the mesh _before_ MQTT. If your channel has a PSK, the MQTT payload is already encrypted — the broker and any subscribers see only the ciphertext. +2. **MQTT encryption** (the module setting) adds an additional encryption layer for transit to the broker. This protects metadata and routing information. +3. **TLS** encrypts the TCP connection to the broker itself, preventing network-level eavesdropping. + +> 🔒 **Important:** The default public channel has a well-known key. Messages on the default channel sent via MQTT are effectively **unencrypted** — anyone can decode them. Always use a custom PSK for private communications. + +## Best Practices + +- Use channel-level encryption (PSK) on channels that bridge to MQTT +- Don't enable MQTT on nodes without internet access (it will buffer and waste memory) +- Use a private broker for sensitive deployments +- Be mindful of airtime when downlinking messages from busy MQTT topics — every downlinked message consumes radio airtime on your local mesh +- Consider enabling uplink-only if you only need to monitor your mesh remotely without injecting messages back + +## Troubleshooting + +### MQTT Not Connecting + +- **Check WiFi** — the gateway node must have an active internet connection (WiFi or Ethernet). MQTT does not work over the LoRa radio link itself. +- **Verify credentials** — incorrect username or password will silently fail on most brokers. Double-check for trailing spaces. +- **Firewall** — port 1883 (MQTT) or 8883 (MQTT+TLS) must be open. Some networks block non-standard ports. +- **DNS resolution** — if using a custom broker hostname, verify the node can resolve it. Try the broker's IP address directly. + +### Messages Not Bridging + +- **Check uplink/downlink settings** — if only uplink is enabled, messages flow from mesh to MQTT but not back. Enable downlink on the receiving gateway. +- **Channel mismatch** — both gateways must share the same channel with the same PSK. A mismatch means messages are encrypted with different keys and appear as garbage. +- **Topic mismatch** — ensure both gateways use the same root topic. The default `msh` works for the public broker. + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — MQTT module configuration reference +- [Messages & Channels](messages-and-channels) — channel encryption and PSK setup +- [MQTT integration guide](https://meshtastic.org/docs/software/integrations/mqtt) — detailed MQTT documentation on meshtastic.org + +--- + diff --git a/docs/lt-rLT/user/node-metrics.md b/docs/lt-rLT/user/node-metrics.md new file mode 100644 index 000000000..a9d8d3b1e --- /dev/null +++ b/docs/lt-rLT/user/node-metrics.md @@ -0,0 +1,130 @@ +--- +title: Node Metrics +nav_order: 5 +last_updated: 2026-05-13 +description: Telemetry dashboards for each mesh node — device health, environment sensors, signal quality, power, traceroute, and position history. +aliases: + - metrics + - telemetry + - device-metrics + - signal +--- + +# Node Metrics + +The node detail screen provides comprehensive telemetry and metrics for each node on your mesh. + +## Device Metrics + +Basic operating information reported by each node: + +| Metric | Aprašymas | +| ------------------- | ----------------------------------- | +| Battery Level | Current battery percentage | +| Voltage | Battery voltage reading | +| Kanalo panaudojimas | Percentage of airtime consumed | +| Airtime | Transmission time used by this node | +| Uptime | Time since last reboot | + +Device metrics are displayed as individual cards with trend sparklines showing battery level, voltage, channel utilization, airtime, and uptime over time. + +> 💡 **Tip:** Tap any metric card to expand it into a full chart with historical data points. Pinch to zoom the time axis. + +## Environment Metrics + +Environmental sensor data (requires compatible hardware): + +| Metric | Sensor Examples | +| ------------------------------------ | --------------------- | +| Temperatūra | BME280, BME680, SHT31 | +| Drėgmė | BME280, BME680, SHT31 | +| Barometric Pressure | BME280, BMP280 | +| Gas Resistance | BME680 | +| IAQ (Air Quality) | BME680 | + +Environment metrics are charted over time for easy trend analysis — temperature, humidity, and pressure each get their own line chart with the measurement unit displayed on the Y axis. + +> 💡 **Tip:** Environment metrics require a sensor connected to the remote node. Not all nodes report environmental data. See [Telemetry & Sensors](telemetry-and-sensors) for a full list of supported sensors. + +## Signal Metrics + +Radio signal quality information: + +| Metric | Aprašymas | +| --------- | ----------------------------------------------------------------------------- | +| SNR | Signal-to-Noise Ratio (higher is better) | +| RSSI | Received Signal Strength Indicator (closer to 0 is better) | +| Hop Count | Number of mesh hops for last message | + +### Signal Quality Reference + +| SNR Range | Quality | +| --------------------------------- | ---------- | +| > 10 dB | Excellent | +| 0 to 10 dB | Geras | +| -10 to 0 dB | Pakankamas | +| < -10 dB | Poor | + +## Power Metrics + +Power management telemetry (requires INA sensor or compatible hardware): + +| Metric | Aprašymas | +| ----------- | ----------------------- | +| Bus Voltage | Supply voltage | +| Current | Power draw in milliamps | +| Power | Calculated wattage | + +## Žinutės kelias + +Traceroute shows the path a message takes through the mesh: + +1. From the node detail screen, tap **Traceroute**. +2. The app sends a traceroute request to the target node. +3. Results show each hop with SNR/RSSI values. + +### Reading Traceroute Results + +``` +You → Node A (SNR: 8.5) → Node B (SNR: 5.2) → Target +``` + +Each hop represents a relay node that forwarded the message. + +## Pozicijos duomenų žurnalas + +Historical position data for nodes that share their location: + +- GPS coordinates +- Altitude +- Speed (if moving) +- Timestamp for each position report + +## Neighbor Info + +Shows which nodes a given node can directly hear, useful for understanding mesh topology. + +## Viewing Metrics + +1. Navigate to **Nodes**. +2. Tap the node you want to inspect. +3. Select the metric category from the detail tabs. + +![Node detail — local device](/assets/screenshots/nodes_detail_local.png) + +The position tab shows location data for nodes that share GPS: + +![Position inline content](/assets/screenshots/nodes_position.png) + +> ⚠️ **Note:** Metrics are only available when they have been reported by the remote node. Metrics update at intervals configured on each node's telemetry settings. + +## Related Topics + +- [Nodes](nodes) — node list, filtering, and sorting +- [Telemetry & Sensors](telemetry-and-sensors) — supported sensors and configuration +- [Signal Meter](signal-meter) — how signal quality is calculated from SNR and RSSI +- [Discovery](discovery) — traceroute details and neighbor info +- [Units & Locale](units-and-locale) — temperature, distance, and speed display formats + +--- + diff --git a/docs/lt-rLT/user/nodes.md b/docs/lt-rLT/user/nodes.md new file mode 100644 index 000000000..3ee75ecb2 --- /dev/null +++ b/docs/lt-rLT/user/nodes.md @@ -0,0 +1,152 @@ +--- +title: Nodes +nav_order: 4 +last_updated: 2026-05-13 +description: Browse, filter, and sort mesh nodes — view details, signal quality, roles, and quick actions. +aliases: + - node-list + - mesh-nodes + - peers +--- + +# Nodes + +The Nodes screen displays all devices visible on your mesh network. + +## Node List + +The node list shows every node your radio has heard, including: + +- **Node name** — user-configured long name +- **Short name** — 4-character identifier +- **Signal quality** — last heard signal strength +- **Last heard** — time since last communication +- **Distance** — estimated distance (if positions are shared) +- **Battery** — remote node battery level (if telemetry is enabled) + +### Node Status Indicators + +| Badge | Meaning | +| ---------- | ------------------------------------- | +| 🟢 Online | Node heard within the last 15 minutes | +| 🟡 Away | Node heard within the last 2 hours | +| 🔴 Offline | Node not heard for over 2 hours | +| ⭐ Favorite | Node marked as favorite by the user | + +### Node Roles + +Nodes can be configured with different roles that affect their mesh behavior: + +| Role | Aprašymas | +| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Client | Standard end-user device | +| Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | +| Client Mute | Receives but doesn't retransmit | +| Client Hidden | Like Client Mute, plus hides from node list | +| Router | Prioritizes message forwarding; stays awake to relay | +| Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | +| ~~Router Client~~ | ⚠️ **Deprecated** (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | +| ~~Repeater~~ | ⚠️ **Deprecated** (removed in firmware 2.7.11) — no longer selectable; use Router instead | +| Tracker | Optimized for position reporting at regular intervals | +| Sensor | Optimized for telemetry reporting | +| TAK | Interoperates with TAK systems (sends/receives CoT) | +| TAK Tracker | TAK position reporting only | +| Lost & Found | Continuous position beacon for recovery | + +### Choosing a Role + +Most users should keep the default **Client** role. Consider a different role when: + +- **Router** — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don't use Router on battery-powered handheld devices. +- **Router Late** — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. +- **Client Base** — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. +- **Client Mute** — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only devices or to reduce congestion in dense areas. +- **Tracker** — An unattended device whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. +- **Sensor** — An unattended device reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. +- **TAK / TAK Tracker** — Only needed if interoperating with ATAK/WinTAK systems. See [TAK Integration](tak) for details. + +> 💡 **Tip:** The mesh works best when most nodes are **Client** or **Router**. Too many Mute nodes reduces mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. + +### Encryption Indicators + +Nodes display encryption status icons next to their name: + +| Icon | Meaning | +| ----------- | ------------------------------------------------------------------------------------------------------------------- | +| 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | +| 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | +| ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) | + +> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. + +## Quick Actions + +From the node list, you can: + +- **Tap** a node to view its detail page +- **Long-press** for quick actions: + - Send a direct message + - View on map + - Prašyti pozicijos + - Mark as favorite + - Žinutės kelias + +## Filtering & Sorting + +### Text Search + +Type in the search field to filter nodes by name or short name. The filter updates in real time as you type. + +### Filter Toggles + +| Filtras | Aprašymas | +| -------------------------- | ---------------------------------------------------------------------------------------------- | +| **Only online** | Show only nodes heard within the last 15 minutes | +| **Only direct** | Show only nodes with direct (non-relayed) connections | +| **Include unknown** | Show nodes that haven't sent user info yet | +| **Exclude infrastructure** | Hide infrastructure-role nodes (Router, Repeater, Router Late, Client Base) | +| **Exclude MQTT** | Hide nodes heard only via MQTT internet bridge | +| **Show ignored** | Show nodes you've previously dismissed or muted | + +### Sort Options + +| Sort | Aprašymas | +| ------------------------------------------- | ------------------------------------------------------------------ | +| **Last heard** (default) | Most recently heard nodes first | +| **Alphabetical** | Sorted by node long name | +| **Distance** | Nearest nodes first (requires position sharing) | +| **Hops away** | Fewest relay hops first | +| **Channel** | Grouped by channel index | +| **Via MQTT** | Grouped by MQTT vs. radio-heard | +| **Favorites** | Favorited nodes first | + +## Node Detail + +Tapping a node opens the detail view with comprehensive information. See [Node Metrics](node-metrics) for full details on metrics and telemetry. + +![Node detail view](/assets/screenshots/nodes_node_list.png) + +The detail screen includes device info, position, and action buttons: + +![Node detail section](/assets/screenshots/nodes_detail_section.png) + +Inline status indicators show key metrics at a glance: + +| Indicator | Screenshot | +| ------------------- | -------------------------------------------------------- | +| Signal quality | ![Signal](/assets/screenshots/nodes_signal_info.png) | +| Battery level | ![Battery](/assets/screenshots/nodes_battery_info.png) | +| Hop count | ![Hops](/assets/screenshots/nodes_hops_info.png) | +| Seniausiai girdėtas | ![Last heard](/assets/screenshots/nodes_last_heard.png) | +| Atstumas | ![Distance](/assets/screenshots/nodes_distance_info.png) | + +## Related Topics + +- [Node Metrics](node-metrics) — detailed telemetry dashboards for each node +- [Messages & Channels](messages-and-channels) — send a direct message to a node +- [Map & Waypoints](map-and-waypoints) — view node positions geographically +- [Discovery](discovery) — traceroute and neighbor info for topology exploration +- [Signal Meter](signal-meter) — understand what the signal bars mean + +--- + diff --git a/docs/lt-rLT/user/onboarding.md b/docs/lt-rLT/user/onboarding.md new file mode 100644 index 000000000..3b910534e --- /dev/null +++ b/docs/lt-rLT/user/onboarding.md @@ -0,0 +1,99 @@ +--- +title: Getting Started +nav_order: 1 +last_updated: 2026-05-13 +description: First-launch setup — permissions, onboarding flow, and next steps after connecting your radio. +aliases: + - first-launch + - setup + - intro +--- + +# Getting Started + +Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app. + +## First Launch + +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. + +### Welcome Screen + +The welcome screen introduces Meshtastic and its core capabilities: + +- Off-grid mesh communication +- No cellular or internet required +- End-to-end encrypted messaging + +Tap **Get Started** to proceed through the setup flow. + +![Welcome screen](/assets/screenshots/onboarding_welcome.png) + +## Permissions + +The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. + +### Bluetooth Permission + +Bluetooth is the primary connection method between your phone and Meshtastic radio: + +- **Bluetooth scanning** — discover nearby Meshtastic radios +- **Bluetooth connect** — establish and maintain connections with paired radios + +Grant both permissions when prompted. Without Bluetooth, you'll need to use USB or TCP connections instead. + +### Location Permission + +> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. + +Meshtastic also uses your location for: + +- Showing your position on the mesh map +- Calculating distances to other nodes +- Sharing your GPS coordinates with other mesh members (if enabled) + +Grant **"While using the app"** or **"Always"** depending on your preference: + +- **While using the app** — position updates only when the app is open +- **Always** — enables background position updates for always-on mesh presence + +If denied, Bluetooth scanning will not function and your node will not report a position. + +### Notifications Permission + +Notifications alert you to: + +- Incoming messages from channels and direct messages +- Connection status changes (connected, disconnected, reconnecting) +- Firmware update availability + +> 💡 **Tip:** You can fine-tune notification preferences later in Android system settings. The app creates separate notification channels for messages, connection events, and background service status. + +### Critical Alerts Permission + +On supported devices, the app may request permission for critical alerts: + +- These are high-priority notifications that can break through Do Not Disturb mode +- Useful for emergency mesh alerts or urgent messages +- You can **skip** this step if you don't need breakthrough notifications +- Configure or revoke later in Android notification settings + +## After Setup + +Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. + +> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. + +## What's Next? + +Once connected to a radio, explore: + +- [Connections](connections) — pair your first radio device +- [Messages & Channels](messages-and-channels) — send your first message +- [Nodes](nodes) — see who's on your mesh +- [Map & Waypoints](map-and-waypoints) — view node positions +- [Settings](settings-radio-user) — configure your radio and user profile + +New to Meshtastic? The [getting started guide](https://meshtastic.org/docs/getting-started) on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup. + +--- diff --git a/docs/lt-rLT/user/settings-module-admin.md b/docs/lt-rLT/user/settings-module-admin.md new file mode 100644 index 000000000..f01695beb --- /dev/null +++ b/docs/lt-rLT/user/settings-module-admin.md @@ -0,0 +1,246 @@ +--- +title: Settings — Modules & Admin +nav_order: 8 +last_updated: 2026-05-13 +description: Configure optional feature modules (MQTT, telemetry, canned messages, TAK, and more) and perform device administration. +aliases: + - modules + - module-config + - administration +--- + +# Settings — Modules & Admin + +Configure optional feature modules and perform device administration. Modules extend Meshtastic with specialized capabilities — each can be independently enabled or disabled. + +> 💡 **Tip:** You only need to enable the modules you actually use. Disabling unused modules reduces airtime, saves battery, and simplifies your configuration. + +Module settings use a card-based layout with toggle switches, dropdowns, text fields, and sliders: + +![Toggle switch](/assets/screenshots/settings_switch.png) + +![Dropdown selector](/assets/screenshots/settings_dropdown.png) + +![Text field](/assets/screenshots/settings_text_field.png) + +![Settings card layout](/assets/screenshots/settings_titled_card.png) + +## Module Configuration + +### MQTT Module + +Bridges mesh messages to and from an MQTT broker for internet connectivity. This is how you extend your mesh beyond radio range or integrate with home automation systems. + +| Setting | Aprašymas | +| --------------- | ------------------------------------------------------------------------ | +| Enabled | Toggle MQTT bridge | +| Server | MQTT broker address | +| Username | Authentication username | +| Password | Authentication password | +| Encryption | Encrypt MQTT payloads | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON support removed from firmware; field is ignored | +| TLS | Use secure connection | +| Root Topic | Base MQTT topic path | +| Map Report | Publish position for public map | + +See [MQTT](mqtt) for a detailed usage guide including encryption, privacy, and broker setup. + +### Serial Module + +Enables serial port communication for external device integrations (GPS modules, sensors, or custom hardware). When enabled, the node's serial port can send and receive protobuf or text data, allowing external microcontrollers or computers to interact with the mesh. + +| Setting | Aprašymas | +| ---------- | ------------------------------- | +| Enabled | Activate serial communication | +| Echo | Echo received serial data back | +| Mode | Text, Protobuf, or NMEA output | +| RX/TX Pins | GPIO pins for serial connection | +| Baud Rate | Serial communication speed | + +### External Notification Module + +Controls buzzer, LED, or vibration alerts on your radio hardware. Useful for devices that need to physically signal when a message arrives — particularly helpful for unattended or outdoor installations. + +| Setting | Aprašymas | +| -------------------------------- | --------------------------- | +| Enabled | Activate notifications | +| Alert Message | Notify on incoming messages | +| Alert Message Buzzer | Use buzzer for messages | +| Alert Message Vibra | Use vibration for messages | +| Alert Bell | Notify on bell character | +| Output (GPIO) | Pin for notification output | +| Active | High or Low active | +| Duration (ms) | Notification length | +| Use I2S as Buzzer | Use I2S audio output | + +### Store & Forward Module + +Buffers messages for nodes that were temporarily offline, then replays them when those nodes reconnect. Essential for meshes where nodes go in and out of range regularly — ensures messages aren't lost during brief disconnections. + +| Setting | Aprašymas | +| ------------------------------------------ | -------------------------- | +| Enabled | Activate store and forward | +| Heartbeat (s) | Announcement interval | +| Records | Maximum stored messages | +| History Return (max) | Max messages to replay | +| History Return (window) | Time window for replay | + +> 💡 **Tip:** Store and Forward works best on nodes with ample memory (ESP32 with PSRAM). Router nodes are ideal candidates since they're typically always-on. + +### Range Test Module + +Automated range testing tool for evaluating link quality between nodes. When enabled, the node periodically transmits test messages with incrementing counters. A receiver node logs these messages, allowing you to walk or drive away and later analyze at what distance messages stopped arriving. + +| Setting | Aprašymas | +| -------------------------------------- | --------------------------------- | +| Enabled | Activate range testing | +| Sender Interval (s) | Time between test transmissions | +| Save CSV | Log received test data to SD card | + +### Telemetry Module + +Controls what telemetry data your node shares with the mesh. Telemetry includes device health (battery, uptime) and environmental sensor data (temperature, humidity, pressure). + +| Setting | Aprašymas | +| ---------------------------- | --------------------------------------- | +| Device Metrics Interval | How often to report device metrics | +| Environment Metrics Interval | How often to report environment sensors | +| Air Quality Enabled | Report particulate sensor data | +| Power Metrics Enabled | Report power usage | + +See [Telemetry & Sensors](telemetry-and-sensors) for supported sensors and configuration recommendations. + +### Canned Message Module + +Pre-configured messages accessible from the device's physical buttons (for radios with rotary encoders, keypads, or similar input hardware). Define a list of quick-send messages that can be transmitted without a phone connected — ideal for field use. + +| Setting | Aprašymas | +| ------------------ | ----------------------------------------------------------- | +| ~~Enabled~~ | ⚠️ **Deprecated** — current firmware may ignore this toggle | +| Messages | Newline-separated list of messages | +| Send Bell | Play bell sound on send | +| Rotary Encoder | Enable rotary encoder input | +| Up/Down/Press Pins | GPIO pin assignments for input | + +### Audio Module + +Codec2 audio support for low-bandwidth voice communication over the mesh. This is an **experimental** feature that encodes voice into very small data packets using the Codec2 codec. + +| Setting | Aprašymas | +| --------------- | -------------------------------- | +| Enabled | Activate audio module | +| Codec2 Rate | Audio quality/bandwidth tradeoff | +| I2S Word Select | GPIO pin for I2S WS | +| I2S Data In | GPIO pin for I2S DIN | +| I2S Data Out | GPIO pin for I2S DOUT | + +> ⚠️ **Note:** Audio requires specific hardware (I2S microphone and speaker). Voice quality is very low-bandwidth — think "understandable radio voice," not phone-call quality. + +### Remote Hardware Module + +GPIO control over the mesh network. Allows a remote node to read or write GPIO pins on another node — useful for activating relays, reading switches, or controlling external hardware from a distance. + +| Setting | Aprašymas | +| -------------------- | --------------------------------------------------------------- | +| Enabled | Activate remote GPIO access | +| Allow Undefined Pins | Allow access to any GPIO pin (security risk) | + +> ⚠️ **Warning:** Enabling "Allow Undefined Pins" gives remote nodes access to all GPIO pins, which could interfere with the radio's own hardware. Only enable on dedicated GPIO nodes. + +### Neighbor Info Module + +Broadcasts information about directly heard neighbors, enabling mesh topology mapping. Each enabled node periodically shares a list of the other nodes it can hear and their signal quality. + +| Setting | Aprašymas | +| -------------------------------------- | ------------------------------------ | +| Enabled | Activate neighbor broadcasting | +| Update Interval (s) | How often to broadcast neighbor list | + +See [Discovery](discovery) for how to use neighbor data for mesh topology exploration. + +### Ambient Lighting Module + +Controls onboard NeoPixel or other addressable RGB LEDs on supported hardware. Can be used for visual status indicators, notification lights, or decorative effects. + +| Setting | Aprašymas | +| ------------------ | ---------------------------------------------------------- | +| Enabled | Activate LED control | +| LED State | On, Off, or set specific color | +| Red / Green / Blue | Individual color channel values (0–255) | + +### Detection Sensor Module + +Turns your node into a motion or door sensor alert system. When a GPIO pin detects a state change (motion detected, door opened), the node broadcasts an alert message over the mesh. + +| Setting | Aprašymas | +| ---------------------------------------- | ----------------------------------------------------------------------- | +| Enabled | Activate detection sensor | +| Monitor Pin | GPIO pin connected to sensor | +| Detection Triggered High | Trigger when pin goes high (vs. low) | +| Minimum Broadcast (s) | Minimum time between alert broadcasts | +| State Broadcast (s) | Periodic state broadcast interval | +| Send Bell | Include bell character in alerts | +| Friendly Name | Custom name for this sensor | + +### Paxcounter Module + +People counter using WiFi and BLE probe requests. Counts nearby devices by passively listening for probe requests that phones and laptops emit when scanning for networks. Available only on ESP32 devices. + +| Setting | Aprašymas | +| -------------------------------------- | -------------------------- | +| Enabled | Activate people counting | +| Update Interval (s) | How often to report counts | + +> 💡 **Tip:** Paxcounter is useful for estimating foot traffic at trailheads, event venues, or other locations. Counts are approximate — one person may carry multiple devices. + +### TAK Module + +Team Awareness Kit integration for interoperability with ATAK and WinTAK. See [TAK Integration](tak) for detailed setup and usage. + +## Administravimas + +### Nuotolinis administravimas + +Remotely configure nodes that share your admin key: + +1. Select the target node in the node list. +2. Navigate to **Settings** for that node. +3. Modify configuration. +4. Tap **Save** — changes are sent over the mesh. + +> ⚠️ **Requires:** Admin key configured on both your node and the target node. + +### Clean Node Database + +Removes stale nodes from your local database that haven't been heard in a configurable time window. + +### Factory Reset + +Resets all settings to factory defaults. **This cannot be undone.** + +### Perkrauti + +Remotely reboot a connected or administered node. + +### Derinimo skydelis + +View detailed diagnostic information: + +- Protocol buffers debug output +- Mesh packet log +- Connection state details + +### Troubleshooting Remote Admin + +- **"No response from target node"** — the target may be out of range, offline, or have a mismatched admin key. Verify the admin key matches on both nodes. +- **Changes not applying** — some settings require a reboot to take effect. Try the Reboot action after saving. +- **Can't see remote settings** — ensure your node has the admin key for the target node and that Admin Channel is enabled in Security Config. + +## Related Topics + +- [Settings — Radio & User](settings-radio-user) — core radio and user profile settings +- [Module configuration reference](https://meshtastic.org/docs/configuration/module) — detailed module docs on meshtastic.org +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/lt-rLT/user/settings-radio-user.md b/docs/lt-rLT/user/settings-radio-user.md new file mode 100644 index 000000000..c6d2e1225 --- /dev/null +++ b/docs/lt-rLT/user/settings-radio-user.md @@ -0,0 +1,173 @@ +--- +title: Settings — Radio & User +nav_order: 7 +last_updated: 2026-05-13 +description: Configure your radio hardware, LoRa presets, user profile, position sharing, power management, and security. +aliases: + - settings + - radio-config + - user-config + - lora +--- + +# Settings — Radio & User + +Configure your radio hardware and user identity parameters. + +## User Settings + +### User Profile + +| Setting | Aprašymas | +| ----------------- | ------------------------------------------------------------------------------------- | +| Long Name | Your display name (up to 39 characters) | +| Short Name | 4-character abbreviated name | +| Licensed Operator | Enable if you hold an amateur radio license (enables higher power) | + +### Applying Changes + +After modifying settings, tap **Save** to write the configuration to your radio. The device may reboot to apply changes. + +## Radio Configuration + +### Device Config + +| Setting | Aprašymas | Default | +| ------------------------------------------ | ----------------------------------------------------------------------- | -------- | +| Role | Node behavior (Client, Router, etc.) | Client | +| Rebroadcast Mode | How the node retransmits messages | All | +| Node Info Broadcast (s) | Interval for broadcasting node info | 10800 | +| Double-tap Button | Action for double-tap button press | Disabled | + +### LoRa Config + +| Setting | Aprašymas | Default | +| ----------------- | ----------------------------------------------------------------------- | ----------------------------------------- | +| Regionas | Regulatory region for frequency bands | Unset (must configure) | +| Modem Preset | Speed/range tradeoff | LongFast | +| Hop Limit | Maximum retransmit hops | 3 | +| TX Power | Transmission power (dBm); 0 = max allowed for region | 0 (region max) | +| Frequency Offset | Fine-tune frequency (MHz) | 0 | +| Channel Bandwidth | Bandwidth setting | Default for preset | + +> ⚠️ **Important:** You **must** set your region before transmitting. Operating without the correct region may violate local radio regulations. See the [region configuration guide](https://meshtastic.org/docs/getting-started/initial-config) on meshtastic.org for details. + +### Modem Presets + +| Preset | Range | Speed | SNR Limit | Best For | +| ------------------ | ----------------------- | ------------------------- | ------------------------ | -------------------------------------------------------------------------------------------------------- | +| Short Turbo | ~1 km | 21.9 kbps | −5 dB | Dense urban with line-of-sight; data-heavy applications | +| Short Fast | ~3 km | 10.9 kbps | −7.5 dB | Urban neighborhoods; buildings within a few blocks | +| Short Slow | ~5 km | 5.5 kbps | −10 dB | Suburban short-range; moderate building density | +| Medium Fast | ~5 km | 5.5 kbps | −10 dB | Suburban areas; moderate building density | +| Medium Slow | ~8 km | 1.1 kbps | −12.5 dB | Suburban/rural; moderate range with slower speed | +| Long Turbo | ~10 km | 4.4 kbps | −10 dB | Similar range to Long Fast but with 500 kHz bandwidth; faster throughput | +| Long Fast | ~10 km | 1.1 kbps | −12.5 dB | **General use (default)** — balanced range and speed | +| Long Moderate | ~20 km | 0.34 kbps | −15 dB | Rural with some terrain; occasional use | +| Lite Fast | ~5 km | 5.5 kbps | −10 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Medium Fast | +| Lite Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Long Fast | +| Narrow Fast | ~5 km | 2.7 kbps | −10 dB | EU 868 MHz band (62.5 kHz BW); avoids interference with other devices | +| Narrow Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 868 MHz band (62.5 kHz BW); comparable to Long Fast | +| ~~Long Slow~~ | ~30 km | 0.18 kbps | −17.5 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | +| ~~Very Long Slow~~ | ~40+ km | 0.09 kbps | −20 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | + +#### Choosing a Modem Preset + +The modem preset controls the fundamental tradeoff between **range** and **data rate**: + +- **Slower presets** use more spreading, making signals decodable at weaker signal levels (lower SNR limit). This means longer range but fewer bytes per second. +- **Faster presets** pack more data per transmission but require a stronger signal to decode. + +**Practical guidance:** + +- **Urban mesh (many nodes, short distances):** Use **Long Fast** (default) or **Short Fast**. Higher speed means less airtime congestion when many nodes share the channel. +- **Rural/sparse mesh (few nodes, long distances):** Use **Long Moderate**. Range matters more than speed when nodes are far apart. +- **EU 866/868 MHz regulatory compliance:** Use **Lite Fast**, **Lite Slow**, **Narrow Fast**, or **Narrow Slow** — these are optimized for the EU SRD/868 MHz bands with narrower bandwidths. +- **Fixed infrastructure links:** Use **Short Turbo** or **Long Turbo** for dedicated point-to-point links with good antennas and line-of-sight. +- **Mixed environments:** Stick with **Long Fast** — it's the community default and ensures compatibility with others in your area. + +> ⚠️ **Important:** All nodes on the same channel **must** use the same modem preset. Nodes with mismatched presets cannot communicate even if they share the same frequency and encryption key. + +> 💡 **Tip:** The range estimates above assume flat terrain and modest antennas. Elevation advantage (hilltop, rooftop) dramatically increases effective range. A well-placed Router with Long Fast can often outperform a ground-level node with Long Slow. + +### Display Config + +| Setting | Aprašymas | +| ------------------- | ------------------------------------------------------------------------------------ | +| Screen Timeout | Time before display sleeps | +| Display Units | Metric or Imperial | +| OLED Type | Auto, SSD1306, SH1106, SH1107 | +| Compass Orientation | Rotation offset for compass display (0°, 90°, 180°, 270°) | +| ~~Compass North~~ | ⚠️ **Deprecated** — replaced by Compass Orientation; still visible in older firmware | + +### Position Config + +| Setting | Aprašymas | +| ----------------------------------------- | ---------------------------------- | +| GPS Enabled | Enable/disable GPS | +| GPS Update Interval | How often to acquire GPS fix | +| Position Broadcast (s) | How often to share position | +| Smart Position | Enable movement-based broadcasting | +| Fixed Position | Use a manually set position | + +### Power Config + +| Setting | Aprašymas | +| --------------------------------------- | --------------------------------------- | +| Power Saving | Enable low-power sleep mode | +| Shutdown After (s) | Auto-shutdown idle timer | +| ADC Multiplier | Battery voltage calibration factor | +| Wait Bluetooth (s) | Time to wait for BLE connection at boot | +| Mesh SDS Timeout (s) | Super-deep-sleep timeout | + +### Network Config + +| Setting | Aprašymas | +| ------------- | ---------------------------------------------------- | +| WiFi Enabled | Enable WiFi radio (ESP32 devices) | +| WiFi SSID | Network name to connect to | +| WiFi PSK | Network password | +| NTP Server | Time synchronization server | +| Syslog Server | Remote logging server | + +![IP address field](/assets/screenshots/settings_ipv4_field.png) + +### Bluetooth Config + +| Setting | Aprašymas | +| ----------------- | ------------------------------------------------------------------------- | +| Bluetooth Enabled | Enable/disable BLE radio | +| Pairing Mode | Fixed PIN, Random PIN, or No PIN | +| Fixed PIN | PIN code for pairing (default: 123456) | + +### Security Config + +| Setting | Aprašymas | +| --------------------- | -------------------------------------------------------------------------- | +| Viešasis raktas | Your node's public key (read-only) | +| Admin Key | Key for remote administration | +| Privatus raktas | Your node's private key (handle securely) | +| Admin Channel Enabled | Allow admin commands via channel | +| Debug Log | Output live debug logging over serial/bluetooth | +| Serial Enabled | Enable serial console access (moved from Device Config) | +| Managed Mode | Restrict non-admin channel changes | + +![Password field](/assets/screenshots/settings_password_field.png) + +Settings use standard preference controls — dropdowns, toggles, and sliders: + +| Control | Screenshot | +| -------- | ------------------------------------------------------ | +| Dropdown | ![Dropdown](/assets/screenshots/settings_dropdown.png) | +| Toggle | ![Toggle](/assets/screenshots/settings_switch.png) | +| Slider | ![Slider](/assets/screenshots/settings_slider.png) | + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — optional feature modules and device administration +- [Signal Meter](signal-meter) — how modem presets affect signal quality thresholds +- [LoRa configuration](https://meshtastic.org/docs/configuration/radio/lora) — detailed LoRa settings reference on meshtastic.org +- [Initial configuration](https://meshtastic.org/docs/getting-started/initial-config) — region setup guide on meshtastic.org + +--- + diff --git a/docs/lt-rLT/user/signal-meter.md b/docs/lt-rLT/user/signal-meter.md new file mode 100644 index 000000000..8628212d1 --- /dev/null +++ b/docs/lt-rLT/user/signal-meter.md @@ -0,0 +1,81 @@ +--- +title: How the Meshtastic Signal Meter Works +nav_order: 15 +last_updated: 2026-05-13 +description: How the signal meter calculates quality from RSSI and SNR — LoRa spread spectrum, presets, and what the bars really mean. +aliases: + - signal + - signal-meter + - snr + - rssi +--- + +# How the Meshtastic Signal Meter Works + +The Meshtastic signal meter — the familiar bars or status color in the app — is calculated very differently than the "bars" on a traditional cell phone or Wi-Fi router. + +Most consumer devices simply measure how "loud" a signal is. However, because Meshtastic uses **LoRa (Long Range)** technology, its signal meter measures how **clear** the signal is, relative to the specific settings your mesh is using. + +--- + +## 1. The Two Metrics: "Loudness" vs. "Clarity" + +Every time the LoRa radio chip receives a message, it reports two measurements: + +- **RSSI (Received Signal Strength Indicator):** The **loudness** of the raw power hitting your antenna. +- **SNR (Signal-to-Noise Ratio):** The **clarity** of the signal compared to the background static. + +> **Tip — The Analogy:** Imagine you are trying to hear a friend talking to you. +> +> - **RSSI** is how loud their voice is. +> - **The Noise Floor** is the background noise in the room (air conditioning, other people talking, traffic). +> - **SNR** is how easily you can distinguish your friend's voice from the background noise. + +If your friend shouts at you at a deafening rock concert, the signal is incredibly loud (High RSSI), but you still can't understand them because the background noise is louder (Bad SNR). Conversely, if your friend whispers to you in a dead-silent library, the signal is very weak (Low RSSI), but you can understand them perfectly (Great SNR). + +--- + +## 2. The Magic of LoRa: Hearing "Below the Noise Floor" + +For standard radios (like FM or Wi-Fi), if the background noise is louder than the signal (a negative SNR), the receiver just hears static. + +LoRa is special. It uses **"Spread Spectrum"** modulation, which allows the radio to mathematically pull a signal out of the air even when it is buried deep _underneath_ the background noise. This is why you will frequently see **negative SNR numbers** in Meshtastic (e.g., -10 dB, which means the signal is 10 decibels weaker than the background static). + +Depending on which Meshtastic preset you are using (e.g., `LongFast` vs. `ShortFast`), the radio has a specific **SNR Limit** — the absolute maximum amount of noise it can tolerate before the message is completely lost to the static. + +--- + +## 3. How the Signal Meter Calculates Quality + +The Meshtastic apps take both RSSI and SNR and run them through a specific formula to assign your signal a quality rating (None, Bad, Fair, or Good). It specifically scales these values based on the physical limits of the radio preset you are using. + +Here is exactly how the app decides how many bars (or what color) to show you: + +| Level | Bars | Criteria | Meaning | +| ---------- | ---- | ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | +| Geras | 3 | RSSI better than `-115 dBm` **AND** SNR better than `-7 dB` | Signal is both loud and clear — healthy connection. | +| Pakankamas | 2 | RSSI better than `-126 dBm` with good SNR, **OR** SNR better than `-15 dB` with good RSSI | Signal getting quieter or noisier, but still decodable. | +| Silpnas | 1 | Falls between Fair and None thresholds | At the edge of range or experiencing interference. | +| Nėra | 0 | RSSI worse than `-126 dBm` **AND** SNR worse than `-15 dB` | Transmission completely buried in noise. | + +--- + +## 4. What This Means for You + +Because Meshtastic's meter acts as a **"Clarity Meter"**, it behaves differently than what most people expect: + +> **Tip — Don't panic over low RSSI:** You might see a seemingly terrible RSSI value like `-118 dBm`. On a cell phone, you would have zero bars. But if you have an SNR of `+2 dB`, Meshtastic will still show a strong signal! _The library is quiet, so the whisper is heard perfectly._ + +> **Warning — Watch out for local noise:** If you hook up a massive antenna and see a great RSSI (e.g., `-90 dBm`) but your signal meter is only showing **1 Bar (Bad)**, you have a problem. It means you have local interference — perhaps a cheap power supply, a noisy computer, or a nearby radio tower — creating so much static that it is drowning out your mesh. + +## Where Signal Information Appears + +In the app, signal data is shown in several places: + +- **Node list** — signal bars icon next to each node +- **Node detail** — SNR, RSSI, and signal quality in the device metrics section +- **Traceroute** — per-hop signal quality for each relay node +- **Signal metrics** — historical SNR and RSSI data in the metrics charts + +![Node entry showing SNR, RSSI values and colored signal bars](/assets/screenshots/nodes_signal_info.png) + diff --git a/docs/lt-rLT/user/tak.md b/docs/lt-rLT/user/tak.md new file mode 100644 index 000000000..af64f03eb --- /dev/null +++ b/docs/lt-rLT/user/tak.md @@ -0,0 +1,126 @@ +--- +title: TAK Integration +nav_order: 10 +last_updated: 2026-05-13 +description: Interoperate with ATAK and WinTAK — CoT position sharing, TAK roles, and plugin setup. +aliases: + - tak + - atak + - team-awareness-kit +--- + +# TAK Integration + +Meshtastic integrates with the Team Awareness Kit (TAK) ecosystem, enabling interoperability between Meshtastic mesh devices and TAK applications like ATAK and WinTAK. + +## Overview + +The TAK module allows Meshtastic nodes to: + +- Share position data in TAK-compatible CoT (Cursor on Target) format +- Appear as team members on TAK map displays +- Receive TAK PLI (Position Location Information) messages + +## Setup + +### Prerequisites + +- ATAK (Android Team Awareness Kit) or WinTAK installed +- Meshtastic ATAK Plugin installed +- TAK module enabled on your Meshtastic radio + +### Configuration + +1. Navigate to **Settings → Module Config → TAK**. +2. Enable the TAK module. +3. Configure the TAK team/group settings: + +![Module toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | Aprašymas | +| ------- | -------------------------- | +| Enabled | Activate TAK interop | +| Mode | TAK-compatible output mode | + +### ATAK Plugin Setup + +1. Install the Meshtastic ATAK Plugin from the plugin repository. +2. Open ATAK and enable the Meshtastic plugin. +3. The plugin bridges messages between ATAK and your mesh network. + +## TAK Roles + +Nodes configured with TAK-related roles behave differently from standard clients: + +| Role | Aprašymas | +| --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **TAK** | Full TAK interoperability — sends and receives CoT data, chat messages, and PLI updates. Functions as a standard client plus TAK bridge. | +| **TAK Tracker** | Position-only TAK output — automatically broadcasts PLI at regular intervals without user interaction. Optimized for unattended position beacons (vehicles, equipment, waypoints). Does not relay chat messages. | + +> 💡 **Tip:** Use **TAK Tracker** for devices that only need to report position (e.g., a radio mounted in a vehicle). Use **TAK** for devices where users actively participate in TAK operations. + +### CoT (Cursor on Target) Format + +TAK messages use the Cursor on Target XML format — a military standard for sharing situational awareness data. Meshtastic converts its internal protobuf messages to CoT format when bridging to TAK systems, so no manual format conversion is needed. + +## TAK Identity + +When using TAK roles, your node broadcasts identity information that appears on TAK maps: + +| Setting | Aprašymas | +| -------- | ---------------------------------------------------------------------------------------------------------------- | +| Team | Your team color on the TAK map (e.g., Blue, Red, Cyan, Green) | +| Role | Your operational role (Team Member, Team Lead, HQ, Medic, RTO, etc.) | +| Callsign | Your TAK callsign (defaults to your Meshtastic long name) | + +These settings appear in **Settings → Module Config → TAK** when the TAK module is enabled. + +> 💡 **Tip:** Team/role colors are the standard TAK affiliation colors. Coordinate with your TAK team to use consistent team assignments. + +## Wire Format (V1 / V2) + +Meshtastic supports two TAK wire formats: + +| Format | Compatibility | Features | +| ------------------------------- | --------------------------------------------------------------- | --------------------------------------------------------- | +| V1 (Legacy) | ATAK Plugin v1.x, older firmware | Basic CoT position sharing only | +| V2 (Current) | ATAK Plugin v2.x, firmware 2.3+ | Full CoT support including chat, routes, zstd compression | + +The app automatically selects V2 when both sides support it. No manual configuration needed — the TAK module negotiates format based on firmware capabilities. + +## Usage with ATAK + +Once configured: + +- Meshtastic nodes appear as markers on the ATAK map with callsign labels +- Chat messages can bridge between mesh and TAK networks +- Position updates flow bidirectionally between Meshtastic and TAK +- TAK Tracker nodes broadcast PLI automatically — their positions appear on ATAK maps without any ATAK-side configuration + +> ⚠️ **Note:** TAK integration requires specific node roles and module configuration. Standard client nodes don't automatically participate in TAK operations. + +## Troubleshooting + +| Problem | Cause | Solution | +| -------------------------------- | ------------------------------------- | ----------------------------------------------------------------------- | +| Node doesn't appear on ATAK map | TAK module disabled or wrong role | Verify TAK module is enabled and node role is TAK or TAK Tracker | +| Position updates are stale | GPS fix lost or interval too long | Check GPS status; reduce position broadcast interval in Position Config | +| ATAK plugin shows "disconnected" | BLE connection lost or plugin crashed | Reconnect Bluetooth in Meshtastic app, then restart ATAK plugin | +| Chat messages not bridging | V1 format doesn't support chat | Ensure both nodes run firmware 2.3+ for V2 wire format | +| CoT data not flowing | Channel mismatch | All TAK nodes must be on the same channel with matching encryption | + +## Security Considerations + +- TAK data shares your position and callsign information +- Ensure your channel encryption is configured when using TAK in sensitive environments +- The TAK module respects the same channel encryption as other Meshtastic messages + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — TAK module configuration +- [Nodes](nodes) — TAK and TAK Tracker roles in the node list +- [Map & Waypoints](map-and-waypoints) — node positions on the map +- [ATAK plugin guide](https://meshtastic.org/docs/software/integrations/atak-plugin) — detailed ATAK setup on meshtastic.org + +--- + diff --git a/docs/lt-rLT/user/telemetry-and-sensors.md b/docs/lt-rLT/user/telemetry-and-sensors.md new file mode 100644 index 000000000..f0e75697a --- /dev/null +++ b/docs/lt-rLT/user/telemetry-and-sensors.md @@ -0,0 +1,118 @@ +--- +title: Telemetry & Sensors +nav_order: 9 +last_updated: 2026-05-13 +description: Sensor data on the mesh — supported environment, air quality, and power sensors, plus configuration and viewing guides. +aliases: + - sensors + - environment + - weather + - power-metrics +--- + +# Telemetry & Sensors + +Meshtastic nodes can collect and share sensor data across the mesh network. + +## Overview + +Telemetry allows nodes equipped with sensors to broadcast environmental, power, and device health information. This data is visible on the node detail screen and can be logged over time. + +## Device Telemetry + +All Meshtastic nodes report basic device telemetry: + +| Metric | Aprašymas | Typical Range | +| ------------------- | ------------------------------ | ------------------------------------------------------------------ | +| Battery Level | Charge percentage | 0–100% | +| Voltage | Battery voltage | 3.0–4.2V (LiPo) | +| Kanalo panaudojimas | % of airtime used locally | 0–100% | +| Air Utilization TX | % of airtime used by this node | 0–100% | +| Uptime | Seconds since last boot | Varies | + +## Environment Sensors + +Supported environmental sensors: + +### Temperature & Humidity + +| Sensor | Temperatūra | Drėgmė | Pressure | Notes | +| ------- | ----------- | ------ | -------- | ----------------------- | +| BME280 | ✓ | ✓ | ✓ | Recommended all-in-one | +| BME680 | ✓ | ✓ | ✓ | Adds gas resistance/IAQ | +| SHT31 | ✓ | ✓ | — | High accuracy | +| MCP9808 | ✓ | — | — | Precision temperature | +| LPS22 | — | — | ✓ | Pressure only | + +### Air Quality + +| Sensor | Metric | Notes | +| -------- | -------------------------------------------------- | -------------------------- | +| BME680 | Gas Resistance / IAQ | Volatile organic compounds | +| PMSA003I | PM1.0, PM2.5, PM10 | Particulate matter | +| SEN55 | PM, NOx, VOC, Temp, Humidity | Multi-sensor | + +### Light & UV + +| Sensor | Metric | +| -------- | -------------------------------------- | +| OPT3001 | Ambient light (lux) | +| VEML7700 | Ambient light (lux) | +| LTR390 | UV index | + +## Power Metrics + +Nodes with INA-series power sensors can report: + +| Metric | Aprašymas | +| ----------- | ----------------------------------------- | +| Bus Voltage | Supply rail voltage | +| Current | Power consumption (mA) | +| Power | Calculated power (mW) | + +Useful for monitoring solar charging or battery health on remote nodes. + +## Configuring Telemetry + +1. Navigate to **Settings → Module Config → Telemetry**. +2. Set reporting intervals: + - **Device Metrics Interval** — how often to broadcast device metrics + - **Environment Metrics Interval** — how often to broadcast sensor data +3. Enable specific sensor types as needed. + +### Recommended Intervals + +| Use Case | Device (s) | Environment (s) | +| ------------------------------------------ | ----------------------------- | ---------------------------------- | +| Urban mesh (many nodes) | 3600 | 3600 | +| Rural mesh (few nodes) | 900 | 900 | +| Weather station | 900 | 300 | +| Battery conservation | 7200 | 7200 | + +> ⚠️ **Note:** Shorter intervals increase airtime usage and battery drain across the mesh. + +## Viewing Telemetry + +1. Navigate to **Nodes** and select a node. +2. Telemetry sections show on the detail screen: + - Device Metrics (always available) + - Environment Metrics (if sensors present) + - Power Metrics (if INA sensor present) +3. Historical graphs show trends over time. + +![Telemetry actions](/assets/screenshots/node-metrics_telemetric_actions.png) + +## Troubleshooting + +- **No environment data showing?** The remote node needs a physical sensor connected (e.g., BME280 on I2C). Device telemetry (battery, uptime) is always available, but environment metrics require hardware. +- **Stale readings?** Check the reporting interval — very long intervals (7200s+) mean data updates infrequently. Also verify the remote node is still online. +- **Sensor conflict on I2C bus?** Some sensors share I2C addresses. If you have multiple sensors on the same bus, check for address collisions in the radio's serial debug output. + +## Related Topics + +- [Node Metrics](node-metrics) — view telemetry data on the node detail screen +- [Settings — Modules & Admin](settings-module-admin) — telemetry module configuration +- [Units & Locale](units-and-locale) — temperature and pressure display units + +--- + diff --git a/docs/lt-rLT/user/translate.md b/docs/lt-rLT/user/translate.md new file mode 100644 index 000000000..b2ed79a34 --- /dev/null +++ b/docs/lt-rLT/user/translate.md @@ -0,0 +1,97 @@ +--- +title: Translate the App +parent: User Guide +nav_order: 17 +last_updated: 2026-05-13 +aliases: + - translate + - crowdin + - localization +--- + +# Translate the App + +Contributing translations helps make Meshtastic accessible to a wider audience. The app uses [Crowdin](https://crowdin.com/) to manage community translations for both the user interface and in-app documentation. + +--- + +## What Gets Translated + +| Resource | Source Location | Notes | +| ----------------- | ------------------------------------- | ---------------------------------------------------------------------- | +| UI strings | `composeResources/values/strings.xml` | Buttons, labels, messages, and all user-visible text | +| User Guide pages | `docs/user/*.md` | In-app documentation shown in Help & Documentation | +| Fastlane metadata | `fastlane/metadata/android/en-US/` | App Store listing title, description, and changelogs | + +> **Note — Developer Guide pages are English-only.** Code-focused documentation targeting contributors is not translated. + +--- + +## How to Contribute + +1. **Visit the Crowdin project.** Open the [Meshtastic Android Crowdin project](https://crowdin.com/project/meshtastic-android) and sign in or create a free account. +2. **Choose your language.** Select an existing language or request a new one by opening a [GitHub issue](https://github.com/meshtastic/Meshtastic-Android/issues/new). +3. **Translate strings.** Crowdin shows the English source on the left and your translation on the right. Translate each string and save. +4. **Review context.** Many strings include screenshots or context comments — check these to understand where the text appears in the app. +5. **Submit.** Approved translations are automatically merged into the next release. + +> **Tip — Keep translations short.** UI strings often appear in buttons, chips, or narrow columns. If a translation is significantly longer than the English original, consider abbreviating where the meaning stays clear. + +--- + +## Adding a New Language + +If your language is not yet listed on Crowdin: + +1. Open an issue on [GitHub](https://github.com/meshtastic/Meshtastic-Android/issues/new) requesting the new locale. +2. A maintainer will add the language to Crowdin and configure `crowdin.yml`. +3. Once added, you can begin translating immediately. + +--- + +## How Translations Are Organized + +The Android app uses **Compose Multiplatform resources** for all user-visible strings: + +``` +core/resources/src/commonMain/composeResources/ +├── values/ ← English (default) +│ └── strings.xml +├── values-de/ ← German +│ └── strings.xml +├── values-fr/ ← French +│ └── strings.xml +└── ... +``` + +In-app documentation follows a similar pattern under `docs/`: + +``` +docs/ +├── user/ ← English source (default) +│ ├── onboarding.md +│ └── ... +├── fr/user/ ← French translations +│ ├── onboarding.md +│ └── ... +└── ... +``` + +The app automatically selects the correct locale based on your device's **Language & Region** settings. + +--- + +## Translation Guidelines + +- **Do not translate** technical terms like "LoRa", "MQTT", "BLE", "TAK", "SNR", or "RSSI" — these are universal. +- **Keep placeholders intact.** Strings like `%1$s` or `%d` are filled in at runtime. Do not remove or reorder them unless the grammar of your language requires it. +- **Match tone.** The app uses a friendly, direct voice. Avoid overly formal language. +- **Test if possible.** Switch your device language and open the app to see how translations look in context. + +--- + +## Questions? + +If you have questions about a specific string's context or need help getting started, open a discussion on the [Meshtastic GitHub Discussions](https://github.com/meshtastic/Meshtastic-Android/discussions) page. + +Thank you for helping expand the reach of Meshtastic! diff --git a/docs/lt-rLT/user/units-and-locale.md b/docs/lt-rLT/user/units-and-locale.md new file mode 100644 index 000000000..1a7613554 --- /dev/null +++ b/docs/lt-rLT/user/units-and-locale.md @@ -0,0 +1,118 @@ +--- +title: Units, Measurement & Locale +parent: User Guide +nav_order: 16 +last_updated: 2026-05-12 +--- + +# Units, Measurement & Locale + +The Meshtastic app automatically displays temperatures, distances, speeds, and times in the units your device is configured to use — no settings to change inside the app. + +--- + +## How It Works + +Meshtastic radios always transmit data in **metric units** (meters, °C, km/h, hPa, etc.). When the app receives this data, it uses the `MetricFormatter` utility to convert and display values in whatever unit system your device's locale specifies. + +On Android, your measurement preferences are determined by your system **Language & Region** settings. On Desktop (JVM), the app uses the JVM's default `Locale`. + +> **Tip — You never need to toggle units inside the app.** Change your system measurement preferences and every screen in Meshtastic updates automatically — node details, telemetry charts, weather, altitude, and more. + +--- + +## Temperatūra + +Temperature values from environment sensors are transmitted as **°C** and displayed based on your device's temperature unit preference. + +![Environment metrics with temperature](/assets/screenshots/nodes_environment_metrics.png) + +| Your Setting | You See | +| ------------ | ------- | +| Celsius | 22°C | +| Fahrenheit | 72°F | + +This affects all temperature displays throughout the app: node environment telemetry, soil temperature, dew point, and telemetry chart axes. + +## Distance & Altitude + +Distances between nodes and GPS altitudes are transmitted as **meters** and automatically scaled and converted. + +![Distance info display](/assets/screenshots/nodes_distance_info.png) + +| Your Setting | Small Distance | Large Distance | Altitude | +| -------------------------------- | -------------- | ---------------------- | -------- | +| Metric | 350 m | 2.5 km | 1,200 m | +| Imperial (US) | 1,148 ft | 1.6 mi | 3,937 ft | + +The app uses natural scaling — short distances stay in meters or feet, while longer distances switch to kilometres or miles automatically. + +### Where these appear + +- **Node list** — distance and bearing to each node +- **Node detail** — altitude, distance from your position +- **Map** — waypoint distances, traceroute hop distances +- **Compass** — distance to selected node + +## Speed + +GPS ground speed is displayed in your locale's preferred speed unit. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Metric | 12 km/h | +| Imperial (US) | 7 mph | + +## Wind + +Wind speed and gust data from environment sensors are transmitted as **m/s** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Metric | 5 m/s | +| Imperial (US) | 11 mph | + +Wind readings appear in the **Node Detail** environment section and the **Environment Telemetry** charts. + +## Rainfall + +Rainfall measurements (1-hour and 24-hour totals) are transmitted as **mm** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ---------------------- | +| Metric | 12 mm | +| Imperial (US) | 0.5 in | + +## Units That Never Change + +Some units are international standards and are displayed the same way regardless of your locale: + +| Measurement | Unit | Why | +| -------------------------------- | ------------------------------ | ------------------------------------- | +| Barometric pressure | hPa | International meteorological standard | +| Heading / bearing | ° (degrees) | Universal navigation convention | +| Radiation | μR/hr | Standard dosimetry unit | +| GPS coordinates | decimal degrees | Universal geographic standard | +| Humidity, battery, soil moisture | % | Universal | + +## Date & Time + +All timestamps throughout the app — last heard, message times, telemetry logs, chart axes — follow your device's date and time preferences. + +| Setting | What It Controls | Example | +| ---------------- | ---------------- | ------------------------------------------------ | +| **24-Hour Time** | Clock format | 14:30 vs 2:30 PM | +| **Date Format** | Date ordering | 09/05/2026 vs 05/09/2026 | + +The app also uses **relative time** where it makes sense — for example, "5 min ago" or "2 hours ago" in the node list — which is automatically localised into your device language. + +## Changing Your Measurement System (Android) + +On Android, your measurement system (metric vs imperial) is tied to your region setting: + +1. Open **Android Settings → System → Language & Region** +2. Change your **Region** or **Measurement units** preference +3. Return to Meshtastic — values update immediately + +> **Tip — The app uses `MetricFormatter` from `core:common`.** All measurement formatting is handled by a shared KMP utility that respects your platform's locale. Developers adding new measurement displays should use `MetricFormatter` rather than hard-coding unit conversions. + diff --git a/docs/nl-rNL/index.md b/docs/nl-rNL/index.md new file mode 100644 index 000000000..33c39771f --- /dev/null +++ b/docs/nl-rNL/index.md @@ -0,0 +1,30 @@ +--- +title: Home +layout: default +nav_order: 0 +--- + +# Meshtastic Android App Documentation + +User and developer documentation for the Meshtastic Android, Desktop, and iOS applications powered by KMP (Kotlin Multiplatform). + +Use the sidebar navigation to browse the **User Guide** for app features and the **Developer Guide** for contributing to the project. + +--- + +## Quick Links + +| Guide | Beschrijving | +| --------------------------------------------------------------------- | -------------------------------------------------------------- | +| [Getting Started](user/onboarding) | Connect your first radio and send a message | +| [Messages & Channels](user/messages-and-channels) | Channel broadcasts, direct messages, reactions, and encryption | +| [Nodes](user/nodes) | Understanding the mesh network node list | +| [Signal Meter](user/signal-meter) | How the LoRa signal quality meter works | +| [Units & Locale](user/units-and-locale) | How temperatures, distances, and times adapt to your region | +| [Desktop App](user/desktop) | Linux, macOS, and Windows desktop usage | +| [Architecture](developer/architecture) | App architecture overview for contributors | +| [Contributing](developer/contributing) | Branch naming, PR workflow, and verification commands | + +--- + +> This documentation is served from the same markdown source that powers the in-app **Help & Documentation** browser. diff --git a/docs/nl-rNL/user/connections.md b/docs/nl-rNL/user/connections.md new file mode 100644 index 000000000..835b8ca92 --- /dev/null +++ b/docs/nl-rNL/user/connections.md @@ -0,0 +1,125 @@ +--- +title: Connections +nav_order: 2 +last_updated: 2026-05-13 +description: Connect your phone or desktop to a Meshtastic radio via Bluetooth, USB, or TCP/IP. +aliases: + - bluetooth + - usb + - tcp + - pairing +--- + +# Connections + +Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node. + +## Bluetooth (BLE) + +Bluetooth Low Energy is the default and most common connection method on Android. + +### Pairing a Device + +1. Ensure your Meshtastic radio is powered on and in pairing mode. +2. Open the app and navigate to **Connections**. +3. Tap **Scan for Devices** — nearby Meshtastic radios will appear. +4. Select your device from the list. +5. Accept the Bluetooth pairing prompt if shown. + +![Device list item](/assets/screenshots/connections_bluetooth_scan.png) + +You can filter devices by transport type using the filter chips at the top: + +![Transport filter chips](/assets/screenshots/connections_transport_filters.png) + +> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. + +### Connection Status + +| Icon | State | Beschrijving | +| ---- | ------------------- | ----------------------------- | +| 🟢 | Verbonden | Active radio link established | +| 🟡 | Bezig met verbinden | Handshake in progress | +| 🔴 | Niet verbonden | No active connection | +| ⚪ | Not configured | No device selected | + +When connecting, a status indicator shows the current connection state: + +![Connecting status](/assets/screenshots/connections_connecting.png) + +If no devices are found, the app shows an empty state with instructions: + +![No devices found](/assets/screenshots/connections_empty_state.png) + +### Troubleshooting Bluetooth + +- **Device not found:** Toggle Bluetooth off/on, ensure location is enabled. +- **Connection drops:** Move closer to the radio; check for interference. +- **Pairing rejected:** Forget the device in Android Bluetooth settings and retry. + +## USB Serial + +USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable. + +### Setup + +1. Connect your radio via USB cable to your device. +2. The app will prompt for USB permission — tap **Allow**. +3. The connection is established automatically. + +> ⚠️ **Note:** USB connections require OTG support on Android devices. + +## TCP/IP (WiFi) + +Some Meshtastic radios support WiFi connectivity, allowing TCP-based connections. + +### Configuration + +1. Connect your radio to a WiFi network via the radio's web interface or settings. +2. In the app, go to **Connections → TCP**. +3. Enter the radio's IP address and port (default: 4403). +4. Tap **Connect**. + +![WiFi scanning for devices](/assets/screenshots/connections_wifi_scanning.png) + +When a device is found, it appears in the connection list: + +![WiFi device found](/assets/screenshots/connections_wifi_device_found.png) + +A successful connection is confirmed with a status indicator: + +![WiFi connection success](/assets/screenshots/connections_wifi_success.png) + +### When to Use TCP + +- Radio is on the same local network +- Testing with a simulated radio +- Environments where Bluetooth has interference issues + +## Reconnection Behavior + +The app reconnects to the **last selected device** on startup. You can manually switch transports from the connections screen at any time. + +To disconnect from a radio, use the disconnect button on the connections screen: + +![Disconnect from radio](/assets/screenshots/connections_disconnect.png) + +## Desktop Connections + +On Desktop (Linux/macOS/Windows), the app supports: + +- **Bluetooth (BLE)** — via the Kable library; works on macOS, Linux, and Windows +- **USB Serial** — primary wired connection method +- **TCP/IP** — for network-connected radios + +See [Desktop App](desktop) for platform-specific details and keyboard shortcuts. + +## Related Topics + +- [Getting Started](onboarding) — first-launch setup and permissions +- [Settings — Radio & User](settings-radio-user) — Bluetooth and network configuration +- [Desktop App](desktop) — desktop-specific connection details +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — full list of compatible radios on meshtastic.org + +--- + diff --git a/docs/nl-rNL/user/desktop.md b/docs/nl-rNL/user/desktop.md new file mode 100644 index 000000000..5b55a4758 --- /dev/null +++ b/docs/nl-rNL/user/desktop.md @@ -0,0 +1,147 @@ +--- +title: Desktop App +nav_order: 14 +last_updated: 2026-05-13 +description: Install and use the Meshtastic Desktop app on Linux, macOS, and Windows — connections, feature parity, and keyboard shortcuts. +aliases: + - desktop + - linux + - macos + - windows + - jvm +--- + +# Desktop App + +The Meshtastic Desktop application provides the same mesh communication features on Linux, macOS, and Windows. + +## Overview + +The Desktop app shares its core codebase with the Android app through Kotlin Multiplatform (KMP). Most features work identically across platforms. + +## Installation + +### Linux + +- Download the `.deb` or `.AppImage` package from the releases page +- Or build from source using `./gradlew :desktopApp:run` + +### macOS + +- Download the `.dmg` package from releases +- Or build from source + +### Windows + +- Download the `.msi` installer from releases +- Or build from source + +## Connecting Your Radio + +### USB Serial (Primary) + +The most reliable connection method on Desktop: + +1. Connect your Meshtastic radio via USB cable. +2. The app should detect the serial port automatically. +3. If not detected, select the correct serial port from the connections menu. + +### TCP/IP + +For network-connected radios: + +1. Enter the radio's IP address and port (default: 4403). +2. Click **Connect**. + +### Bluetooth (BLE) + +Bluetooth Low Energy is supported on Desktop via the [Kable](https://github.com/JuulLabs/kable) library: + +1. Ensure your system has a Bluetooth adapter. +2. The app scans for nearby Meshtastic radios automatically. +3. Select your device from the connections screen. + +## Feature Parity + +| Feature | Android | Desktop | Notes | +| ---------------------------------------- | ------- | ------- | -------------------------- | +| Messaging | ✓ | ✓ | Full parity | +| Node List | ✓ | ✓ | Full parity | +| Kaart | ✓ | ✓ | Full parity | +| Instellingen | ✓ | ✓ | Full parity | +| Bluetooth (BLE) | ✓ | ✓ | Via Kable on desktop | +| Firmware Update OTA | ✓ | ✗ | Use web flasher | +| Notifications | ✓ | ✓ | Native OS notifications | +| Widgets | ✓ | ✗ | Android-only | +| AI Assistant (Chirpy) | ✓\* | ✗ | Google flavor Android only | + +\*Chirpy AI requires Android 14+ on Google flavor builds with supported hardware. + +## UI Differences + +The Desktop app uses the same Compose Multiplatform UI with adaptations for larger screens and desktop interaction. + +### Keyboard Shortcuts + +| Shortcut | Action | +| ------------------- | --------------------------- | +| **⌘Q** / **Ctrl+Q** | Quit the application | +| **⌘,** / **Ctrl+,** | Open Settings | +| **⌘1** / **Ctrl+1** | Switch to Conversations tab | +| **⌘2** / **Ctrl+2** | Switch to Nodes tab | +| **⌘3** / **Ctrl+3** | Switch to Map tab | +| **⌘4** / **Ctrl+4** | Switch to Connections tab | + +### Window & System Tray + +- **Window resizing** — responsive layout adapts to window dimensions +- **System tray** — minimize to system tray for background mesh operation +- **Tray menu** — right-click the tray icon to show window or quit +- **Mouse interaction** — hover states and standard desktop navigation + +### Notification Preferences + +The Desktop app provides in-app toggles for controlling which notifications are shown — messages, new nodes, and low battery alerts. Access these from **Settings → Notifications** within the app. + +## Built-in Documentation Browser + +The Desktop app includes a built-in documentation browser for quick access to help content without leaving the application. + +![Docs browser with table of contents](/assets/screenshots/docs-browser_toc.png) + +The browser supports full-text search across all documentation: + +![Searching the docs browser](/assets/screenshots/docs-browser_search.png) + +Individual doc pages render with full formatting: + +![A documentation page](/assets/screenshots/docs-browser_page.png) + +## Building from Source + +```bash +git clone https://github.com/meshtastic/Meshtastic-Android.git +cd Meshtastic-Android +git submodule update --init +./gradlew :desktopApp:run +``` + +Requirements: + +- JDK 21 +- No Android SDK required for desktop-only builds + +## Known Limitations + +- No OTA firmware updates (use web flasher) +- Some Android-specific features (widgets, specific notification channels) are unavailable +- Performance may vary on low-spec hardware running Compose Desktop +- BLE bonding is not yet supported on desktop (pairing works without bonding) + +## Related Topics + +- [Connections](connections) — connection methods overview +- [Firmware Updates](firmware) — use the [Web Flasher](https://flasher.meshtastic.org) for desktop firmware updates + +--- + diff --git a/docs/nl-rNL/user/discovery.md b/docs/nl-rNL/user/discovery.md new file mode 100644 index 000000000..fe696299b --- /dev/null +++ b/docs/nl-rNL/user/discovery.md @@ -0,0 +1,114 @@ +--- +title: Discovery +nav_order: 12 +last_updated: 2026-05-13 +description: Explore your mesh network — traceroute paths, neighbor maps, and node discovery tools. +aliases: + - mesh-discovery + - local-discovery + - network-scan + - traceroute + - neighbor-info +--- + +# Discovery + +Discovery tools help you understand **how** your mesh network is connected — which nodes can hear each other, what paths messages take, and where bottlenecks or weak links exist. + +> 💡 **Tip:** You don't need a dedicated "discovery mode" to start exploring your mesh. The tools below are available right now from the node list and node detail screens. + +--- + +## Traceroute + +Traceroute reveals the exact path a message takes from your node to any other node on the mesh. It's the single most useful tool for debugging connectivity problems. + +### Running a Traceroute + +1. Navigate to **Nodes** and tap the node you want to trace. +2. On the node detail screen, tap **Traceroute**. +3. The app sends a traceroute request and waits for the response. +4. Results display each hop in order, with signal quality at every step. + +### Reading the Results + +A traceroute result looks like this: + +``` +You → Node A (SNR: 8.5, RSSI: -95) → Node B (SNR: 5.2, RSSI: -108) → Target +``` + +Each hop represents a relay node that forwarded the message. The SNR and RSSI values at each hop tell you about the link quality on that specific segment. + +| What to look for | What it means | +| -------------------------------------------------------------------------- | --------------------------------------------------------------------------- | +| All hops show Good SNR (> 5 dB) | Healthy path — messages flow reliably | +| One hop shows Bad SNR (< 0 dB) | Weak link — this relay segment is fragile | +| Many hops (4+) | Long path — consider repositioning a node to shorten it | +| Different path on retry | Mesh is adapting — multiple routes exist (this is good!) | + +> 💡 **Tip:** Run traceroute several times over a few minutes. If the path changes, your mesh has redundant routes — a sign of a well-connected network. + +### Troubleshooting with Traceroute + +- **"No route found"** — The target node may be offline, out of range, or on a different channel. Check that both nodes share at least one channel with the same encryption key. +- **Traceroute times out** — The path may be too long (exceeds hop limit) or a relay node is congested. Try increasing the hop limit in **Settings → LoRa Config**. +- **Asymmetric paths** — A traceroute from A→B may take a different path than B→A. This is normal — radio propagation is not always symmetric. + +--- + +## Neighbor Info + +The Neighbor Info module lets each node broadcast a list of the nodes it can **directly hear** (single-hop). When multiple nodes share their neighbor lists, you can piece together a topology map of the entire mesh. + +### Enabling Neighbor Info + +1. Navigate to **Settings → Module Config → Neighbor Info**. +2. Enable the module. +3. Set the broadcast interval (default: 900 seconds / 15 minutes). + +Once enabled, your node periodically broadcasts its neighbor table. Other nodes with Neighbor Info enabled do the same. + +### Viewing Neighbor Data + +- Open any node's detail screen and look for the **Neighbors** section. +- Each neighbor entry shows the node that was directly heard and its signal quality. +- Combine neighbor data from multiple nodes to understand the full mesh topology. + +> ⚠️ **Note:** Neighbor Info increases airtime usage because every enabled node periodically broadcasts its neighbor list. On busy meshes with many nodes, consider longer broadcast intervals (3600 seconds or more) to avoid congestion. + +--- + +## Node List as a Discovery Tool + +The node list itself is a powerful discovery tool when you use its filtering and sorting features effectively. + +### Finding New Nodes + +- Sort by **Last heard** to see the most recently active nodes at the top. +- Enable **Include unknown** to see nodes that have appeared on the mesh but haven't sent user info yet — these are often newly powered-on devices. + +### Assessing Connectivity + +- Sort by **Hops away** to see which nodes are directly reachable (0 hops) versus relayed. +- Sort by **Distance** to find nearby nodes and verify they're reachable. +- Use **Exclude MQTT** to focus on nodes reachable over radio (not via internet bridge). + +### Infrastructure Audit + +- Disable **Exclude infrastructure** to see Router, Repeater, Router Late, and Client Base nodes. +- Check their signal quality and last-heard times to verify your infrastructure nodes are healthy. + +See [Nodes](nodes) for full details on filtering and sorting options. + +--- + +## Tips for Mesh Exploration + +- **Start with traceroute** — it gives you immediate, actionable information about a specific path. +- **Enable Neighbor Info on key nodes** — especially routers and repeaters, to build a picture of the backbone. +- **Check the map** — node positions on the [Map](map-and-waypoints) combined with signal data help you understand why some links are strong and others are weak. +- **Compare signal over time** — use the [Signal Meter](signal-meter) guide to interpret SNR and RSSI values correctly. + +--- + diff --git a/docs/nl-rNL/user/firmware.md b/docs/nl-rNL/user/firmware.md new file mode 100644 index 000000000..8dd8b8264 --- /dev/null +++ b/docs/nl-rNL/user/firmware.md @@ -0,0 +1,114 @@ +--- +title: Firmware Updates +nav_order: 13 +last_updated: 2026-05-13 +description: Update your radio firmware over Bluetooth — OTA process, version channels, pre-flight checks, and recovery. +aliases: + - firmware + - update + - ota + - flash +--- + +# Firmware Updates + +Keep your Meshtastic radio up to date with the latest firmware for new features, bug fixes, and security improvements. + +## Checking for Updates + +1. Navigate to **Settings → Firmware Update** or tap the firmware notification if shown. +2. The app checks for available firmware versions. +3. Available updates show the version number and changelog summary. + +## Update Methods + +### OTA (Over-The-Air) via Bluetooth + +The most common update method for Android users: + +1. Ensure your radio is connected via Bluetooth. +2. Navigate to the Firmware Update screen. +3. Select the desired firmware version. +4. Tap **Update** to begin the OTA process. +5. Wait for the update to complete — **do not disconnect** during the update. + +![Firmware checking for updates](/assets/screenshots/firmware_checking.png) + +> ⚠️ **Warning:** Interrupting a firmware update can brick your device. Ensure your radio has sufficient battery (>50% recommended) and maintain Bluetooth proximity during the entire process. + +![Firmware disclaimer](/assets/screenshots/firmware_disclaimer.png) + +### USB Flashing + +For recovery or when OTA is unavailable: + +- Use the [Meshtastic Web Flasher](https://flasher.meshtastic.org) +- Or the [Meshtastic CLI tool](https://meshtastic.org/docs/getting-started/flashing-firmware) on desktop + +## Version Channels + +| Kanaal | Beschrijving | +| ------ | ------------------------------------------- | +| Stable | Recommended for most users; tested releases | +| Alpha | Preview releases; may contain bugs | + +## Pre-Update Checklist + +Before updating: + +- [ ] Battery > 50% +- [ ] Stable Bluetooth connection +- [ ] Note your current settings (they may reset on major version changes) +- [ ] Check the release notes for breaking changes + +## Post-Update + +After a successful update: + +- The radio will reboot automatically +- Bluetooth connection will re-establish +- Verify your settings are intact +- Check the firmware version in **Settings → About** + +![Firmware update success](/assets/screenshots/firmware_success.png) + +## Troubleshooting + +### Update Stuck + +If the update appears frozen: + +- Wait at least 5 minutes before intervening +- If truly stuck, power-cycle the radio +- Attempt the update again + +![Firmware update error](/assets/screenshots/firmware_error.png) + +### Device Won't Boot After Update + +If your device fails to boot: + +1. Try connecting via USB to a computer +2. Use the web flasher in recovery/DFU mode +3. Flash a known-good firmware version +4. Check the Meshtastic Discord for device-specific recovery steps + +### Compatibility Warnings + +The app may show warnings when: + +- Connected radio firmware is below minimum supported version +- Major version mismatch between app and firmware +- Deprecated features need migration + +> ⚠️ **Important:** Always update the Meshtastic app before or alongside firmware updates to ensure compatibility. + +## Related Topics + +- [Connections](connections) — reconnecting after a firmware update +- [Flashing firmware guide](https://meshtastic.org/docs/getting-started/flashing-firmware) — full firmware flashing walkthrough on meshtastic.org +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — check firmware compatibility by device +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/nl-rNL/user/map-and-waypoints.md b/docs/nl-rNL/user/map-and-waypoints.md new file mode 100644 index 000000000..110ce6e80 --- /dev/null +++ b/docs/nl-rNL/user/map-and-waypoints.md @@ -0,0 +1,116 @@ +--- +title: Map & Waypoints +nav_order: 6 +last_updated: 2026-05-13 +description: View node positions on the map, create and share waypoints, and manage position sharing and privacy. +aliases: + - map + - waypoints + - gps + - location +--- + +# Map & Waypoints + +The Map screen shows the geographic positions of nodes on your mesh, along with shared waypoints. + +## Map View + +The map displays: + +- **Node positions** — colored markers for each node reporting location +- **Waypoints** — shared points of interest +- **Your position** — your current GPS location + +### Node Markers + +Node markers on the map indicate: + +| Color | Meaning | +| ------ | ---------------------------------------------- | +| Groen | Online (heard recently) | +| Yellow | Away (heard within 2 hours) | +| Gray | Offline (stale position) | +| Blauw | Your own node | + +### Map Controls + +- **Zoom** — pinch or use +/- buttons +- **Pan** — drag to explore +- **Center** — select the location button to center on your position +- **Node tap** — tap a node marker to view details + +The floating toolbar provides quick access to compass, layer switching, node filters, refresh, and location tracking. Tap the compass to reorient north-up, or tap the location button to center on your current position. + +![Map controls overlay](/assets/screenshots/map_controls_overlay.png) + +## Waypoints + +Waypoints are shared geographic points of interest that all mesh members can see. + +### Creating a Waypoint + +1. Long-press on the map at the desired location. +2. Enter a name and optional description. +3. Choose an icon/emoji for the waypoint. +4. Tap **Send** to share with the mesh. + +### Waypoint Properties + +| Property | Beschrijving | +| ------------ | ------------------------------------------------------- | +| Naam | Short identifier (max 30 characters) | +| Beschrijving | Optional longer description | +| Icon | Visual marker emoji on the map | +| Vergrendeld | If locked, only the creator can edit or delete | +| Expiration | Optional auto-remove time | + +### Waypoint Expiration + +Waypoints can be set to expire automatically: + +- **Never** (default) — waypoint remains until manually deleted +- **Timed** — waypoint is automatically removed after the specified duration (e.g., "remove after 2 hours"). Useful for temporary markers like rally points, hazards, or meeting locations. + +Expired waypoints are automatically hidden from the map so they don't clutter the display. The expiration countdown begins when the waypoint is created, not when other nodes receive it. + +### Managing Waypoints + +- Tap a waypoint on the map to view its details and coordinates +- Edit or delete waypoints you created +- **Locked waypoints** cannot be modified or deleted by other nodes — only the original creator can change them +- Unlocked waypoints can be edited by any mesh member + +## Position Sharing + +### Enabling Position Sharing + +Your node shares its GPS position based on: + +- **Fixed interval** — broadcast position at regular intervals +- **Smart position** — broadcast when movement exceeds a threshold +- **Manual** — only share when explicitly requested + +Configure position behavior in **Settings → Position**. + +### Privacy Considerations + +> 🔒 **Privacy:** Position data is broadcast to all nodes on your channel. If you don't want your location shared, disable GPS position in settings or use a fixed/fake position. + +## Map Sources + +The app supports multiple map tile sources: + +- OpenStreetMap (default) +- Satellite imagery (where available) +- Offline tiles (download map areas for offline use) + +## Related Topics + +- [Nodes](nodes) — view and filter your node list +- [Node Metrics](node-metrics) — signal quality and position history for individual nodes +- [Discovery](discovery) — traceroute and neighbor info for understanding mesh topology +- [Units & Locale](units-and-locale) — distance and coordinate display formats + +--- + diff --git a/docs/nl-rNL/user/messages-and-channels.md b/docs/nl-rNL/user/messages-and-channels.md new file mode 100644 index 000000000..3a315eb2f --- /dev/null +++ b/docs/nl-rNL/user/messages-and-channels.md @@ -0,0 +1,159 @@ +--- +title: Messages & Channels +nav_order: 3 +last_updated: 2026-05-13 +description: Send and receive messages, manage channels, configure encryption, and use quick chat, reactions, and message actions. +aliases: + - channels + - direct-messages + - messaging + - conversations +--- + +# Messages & Channels + +Meshtastic supports two communication modes: **channel broadcasts** and **direct messages**. + +## Kanalen + +Channels are shared communication groups. All nodes configured with the same channel key can read and send messages on that channel. + +### Default Channel + +Every Meshtastic device comes with a default **LongFast** channel. This is an unencrypted channel used for general mesh communication. + +### Channel Security + +Channels support multiple encryption levels: + +| Icon | Security Level | Beschrijving | +| ---- | ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------- | +| 🔒 | PSK (256-bit AES) | Fully encrypted with a strong pre-shared key. Only nodes with the matching key can read messages. | +| 🔐 | PSK (128-bit AES) | Encrypted with a shorter key. Secure for most uses but 256-bit is preferred for sensitive data. | +| 🔓 | Default / Open | Uses the well-known default key. **Any Meshtastic device** on the same preset can read these messages. | +| ⚠️ | Insecure + Position | Open channel that also broadcasts your GPS position. Use with caution in public meshes. | + +> 🔒 **Security Tip:** 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. + +### Adding a Channel + +1. Navigate to **Settings → Channels**. +2. Tap **Add Channel** or scan a QR code. +3. Configure the channel name and encryption key. +4. Share the channel URL/QR code with others who need access. + +Tapping a channel shows its details and sharing options. + +## Direct Messages + +Direct messages (DMs) are point-to-point encrypted communications between two specific nodes. + +### Sending a Direct Message + +1. Open the **Messages** tab. +2. Select a node from your contacts list or tap a node in the node list. +3. Type your message and tap **Send**. + +### Message States + +| State | Icon | Meaning | +| --------------------------------- | ---- | ----------------------------------------------------------------------------------------------------------------- | +| Queued | ⏳ | Message waiting to be sent | +| En route | ✓ | Delivered to the radio, awaiting acknowledgment | +| Delivered | ✓✓ | Acknowledgment received from recipient | +| Received | ✓ | Message received from the mesh (incoming) | +| S&F Routing | 🔗 | Store & Forward: message being routed through an S&F node | +| S&F Confirmed | 🔗 | Store & Forward: delivery confirmed via S&F node | +| Foutmelding | ✗ | Delivery failed after retries | + +### Delivery Errors + +When a message fails to deliver, the error indicator shows what went wrong: + +| Foutmelding | Meaning | What to Do | +| ------------------ | ---------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| No Route | No path exists to the destination node | The recipient may be offline or out of mesh range. Try later or move closer. | +| Got NAK | The next-hop node refused to relay | The relay node may be congested. Wait and retry. | +| Time-Out | No acknowledgment within retry window | The recipient may be just out of range. Try increasing hop limit or moving to a better position. | +| Geen Interface | No radio interface available to send | Check that your radio is connected and the channel is configured. | +| Max Retransmit | All retry attempts exhausted | The mesh path is unreliable. Try a different channel or wait for conditions to improve. | +| Geen Kanaal | The destination channel doesn't exist | Verify both nodes share the same channel configuration. | +| Too Large | Message exceeds maximum payload size | Shorten your message (max ~230 characters). | +| No Response | Node received message but didn't respond | The recipient's radio may be busy or in low-power sleep mode. | +| Duty Cycle Limit | Regional airtime limit reached | Your radio has used its allowed transmit time. Wait for the duty cycle window to reset (typically 1 hour in EU regions). | +| Ongeldige aanvraag | Malformed or invalid message | This usually indicates a software bug. Try restarting the app. | + +> 💡 **Tip:** 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. + +## Message Features + +### Quick Chat + +Pre-configured messages for rapid communication: + +- Access via the Quick Chat button in the message input area +- Choose from built-in phrases or custom messages +- Customize quick chat messages in **Settings → Quick Chat** +- Useful when typing is impractical (gloves, small screen, urgent) + +![Quick chat option](/assets/screenshots/messages_quick_chat.png) + +The channel list shows each channel with its latest message preview. + +### Message Bubbles + +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. + +### Reactions + +React to messages with emoji: + +- **Long-press** a message to open the actions menu +- Tap **Add Reaction** to choose an emoji +- Reactions appear below the message bubble +- Multiple users can react to the same message +- React to your own messages or others' messages + +![Emoji reaction badges displayed beneath a message](/assets/screenshots/messages_reaction.png) + +> 💡 **Tip:** Reactions are lightweight — they use minimal mesh bandwidth compared to full text messages. + +### Message Actions + +Long-press any message to access: + +- **Copy** — copy message text to clipboard +- **Reply** — quote the message in your response +- **React** — add an emoji reaction +- **Delete** — remove a message you sent (local deletion) + +### Message Priority + +Messages are queued and transmitted based on priority: + +1. Emergency/alert messages (highest) +2. Direct messages +3. Channel broadcasts (lowest) + +### Message Limits + +- **Maximum length:** 237 bytes (approximately 230 characters for ASCII text) +- **Rate limiting:** The mesh enforces airtime fairness; heavy message volume may be throttled +- **Delivery:** Messages are retried automatically if no acknowledgment is received + +## Best Practices + +- Use channels for group coordination +- Use direct messages for private person-to-person communication +- Keep messages short — mesh bandwidth is limited +- Configure encryption for sensitive communications + +## Related Topics + +- [Nodes](nodes) — tap a node to start a direct message +- [Settings — Radio & User](settings-radio-user) — configure channel encryption and presets +- [MQTT](mqtt) — bridge channel messages to the internet +- [Channel configuration](https://meshtastic.org/docs/configuration/radio/channels) — detailed channel settings on meshtastic.org + +--- + diff --git a/docs/nl-rNL/user/mqtt.md b/docs/nl-rNL/user/mqtt.md new file mode 100644 index 000000000..64be08742 --- /dev/null +++ b/docs/nl-rNL/user/mqtt.md @@ -0,0 +1,137 @@ +--- +title: MQTT +nav_order: 11 +last_updated: 2026-05-13 +description: Bridge your mesh to the internet — MQTT broker setup, encryption layers, and map reporting. +aliases: + - mqtt + - internet-bridge + - broker +--- + +# MQTT + +MQTT bridges your Meshtastic mesh network to the internet, enabling long-range communication beyond radio range. + +## Overview + +The MQTT module connects your node to an MQTT broker, allowing: + +- Messages to reach nodes on different physical meshes via the internet +- Integration with home automation and monitoring systems +- Publishing node positions to the public Meshtastic map +- Custom data pipelines for logging and alerting + +## How It Works + +``` +[Your Node] → Radio → [Gateway Node with WiFi] → MQTT Broker → [Remote Gateway] → Radio → [Remote Node] +``` + +A gateway node with internet access (WiFi or Ethernet) publishes mesh messages to an MQTT topic. Remote gateways subscribed to the same topic inject those messages into their local mesh. + +## Configuration + +### Enabling MQTT + +1. Navigate to **Settings → Module Config → MQTT**. +2. Enable the MQTT module. +3. Configure the broker connection: + +![MQTT toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | Beschrijving | Standaard | +| --------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------- | +| Server Address | MQTT broker hostname | mqtt.meshtastic.org | +| Gebruikersnaam | Broker authentication | meshdev | +| Wachtwoord | Broker authentication | large4cats | +| Root Topic | Base topic for messages | msh | +| Encryption | Encrypt MQTT payload | Enabled | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON packet support has been removed from firmware; this field is ignored | Disabled | +| TLS | Secure connection to broker | Disabled | +| Map Reporting | Report position to public map | Disabled | + +### Default Meshtastic Broker + +The community maintains a public broker at `mqtt.meshtastic.org`. This is intended for general use and testing. + +> 🔒 **Privacy:** Messages on the public broker are readable by anyone subscribed. Always use channel encryption for private communications. + +### Private Broker + +For better privacy and control, you can run your own MQTT broker: + +- Mosquitto (lightweight, open-source) +- HiveMQ +- EMQX + +Configure your node to point to your private broker with appropriate credentials. + +## Map Reporting + +When Map Reporting is enabled, your node publishes its position to the Meshtastic community map: + +- Visible at [meshmap.net](https://meshmap.net) and similar community map services +- Only position and node info are shared +- Disable this if you don't want your location publicly visible + +## Uplink vs Downlink + +| Direction | Beschrijving | +| ------------ | -------------------------------- | +| **Uplink** | Messages from mesh → MQTT broker | +| **Downlink** | Messages from MQTT broker → mesh | + +Configure per-channel which directions are active to control message flow and airtime usage. + +## Message Formats + +MQTT uses protobuf message format: + +| Format | Beschrijving | Use case | +| ------------ | ----------------------------------- | -------------------------- | +| **Protobuf** | Binary Meshtastic protobuf encoding | Node-to-node mesh bridging | + +> ⚠️ **Note:** JSON output support was removed from firmware. The `json_enabled` setting is still visible in the app for legacy compatibility but has no effect on current firmware versions. + +## Encryption & Privacy + +Understanding the layered encryption model: + +1. **Channel encryption** happens on the mesh _before_ MQTT. If your channel has a PSK, the MQTT payload is already encrypted — the broker and any subscribers see only the ciphertext. +2. **MQTT encryption** (the module setting) adds an additional encryption layer for transit to the broker. This protects metadata and routing information. +3. **TLS** encrypts the TCP connection to the broker itself, preventing network-level eavesdropping. + +> 🔒 **Important:** The default public channel has a well-known key. Messages on the default channel sent via MQTT are effectively **unencrypted** — anyone can decode them. Always use a custom PSK for private communications. + +## Best Practices + +- Use channel-level encryption (PSK) on channels that bridge to MQTT +- Don't enable MQTT on nodes without internet access (it will buffer and waste memory) +- Use a private broker for sensitive deployments +- Be mindful of airtime when downlinking messages from busy MQTT topics — every downlinked message consumes radio airtime on your local mesh +- Consider enabling uplink-only if you only need to monitor your mesh remotely without injecting messages back + +## Troubleshooting + +### MQTT Not Connecting + +- **Check WiFi** — the gateway node must have an active internet connection (WiFi or Ethernet). MQTT does not work over the LoRa radio link itself. +- **Verify credentials** — incorrect username or password will silently fail on most brokers. Double-check for trailing spaces. +- **Firewall** — port 1883 (MQTT) or 8883 (MQTT+TLS) must be open. Some networks block non-standard ports. +- **DNS resolution** — if using a custom broker hostname, verify the node can resolve it. Try the broker's IP address directly. + +### Messages Not Bridging + +- **Check uplink/downlink settings** — if only uplink is enabled, messages flow from mesh to MQTT but not back. Enable downlink on the receiving gateway. +- **Channel mismatch** — both gateways must share the same channel with the same PSK. A mismatch means messages are encrypted with different keys and appear as garbage. +- **Topic mismatch** — ensure both gateways use the same root topic. The default `msh` works for the public broker. + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — MQTT module configuration reference +- [Messages & Channels](messages-and-channels) — channel encryption and PSK setup +- [MQTT integration guide](https://meshtastic.org/docs/software/integrations/mqtt) — detailed MQTT documentation on meshtastic.org + +--- + diff --git a/docs/nl-rNL/user/node-metrics.md b/docs/nl-rNL/user/node-metrics.md new file mode 100644 index 000000000..5fc3d8ec9 --- /dev/null +++ b/docs/nl-rNL/user/node-metrics.md @@ -0,0 +1,130 @@ +--- +title: Node Metrics +nav_order: 5 +last_updated: 2026-05-13 +description: Telemetry dashboards for each mesh node — device health, environment sensors, signal quality, power, traceroute, and position history. +aliases: + - metrics + - telemetry + - device-metrics + - signal +--- + +# Node Metrics + +The node detail screen provides comprehensive telemetry and metrics for each node on your mesh. + +## Device Metrics + +Basic operating information reported by each node: + +| Metric | Beschrijving | +| ------------- | ----------------------------------- | +| Battery Level | Current battery percentage | +| Spanning | Battery voltage reading | +| Kanaalgebruik | Percentage of airtime consumed | +| Airtime | Transmission time used by this node | +| Tijd online | Time since last reboot | + +Device metrics are displayed as individual cards with trend sparklines showing battery level, voltage, channel utilization, airtime, and uptime over time. + +> 💡 **Tip:** Tap any metric card to expand it into a full chart with historical data points. Pinch to zoom the time axis. + +## Environment Metrics + +Environmental sensor data (requires compatible hardware): + +| Metric | Sensor Examples | +| ------------------------------------ | --------------------- | +| Temperatuur | BME280, BME680, SHT31 | +| Vochtigheid | BME280, BME680, SHT31 | +| Luchtdruk | BME280, BMP280 | +| Gas Resistance | BME680 | +| IAQ (Air Quality) | BME680 | + +Environment metrics are charted over time for easy trend analysis — temperature, humidity, and pressure each get their own line chart with the measurement unit displayed on the Y axis. + +> 💡 **Tip:** Environment metrics require a sensor connected to the remote node. Not all nodes report environmental data. See [Telemetry & Sensors](telemetry-and-sensors) for a full list of supported sensors. + +## Signal Metrics + +Radio signal quality information: + +| Metric | Beschrijving | +| --------- | ----------------------------------------------------------------------------- | +| SNR | Signal-to-Noise Ratio (higher is better) | +| RSSI | Received Signal Strength Indicator (closer to 0 is better) | +| Hop Count | Number of mesh hops for last message | + +### Signal Quality Reference + +| SNR Range | Quality | +| --------------------------------- | --------- | +| > 10 dB | Excellent | +| 0 to 10 dB | Goed | +| -10 to 0 dB | Matig | +| < -10 dB | Poor | + +## Power Metrics + +Power management telemetry (requires INA sensor or compatible hardware): + +| Metric | Beschrijving | +| ----------- | ----------------------- | +| Bus Voltage | Supply voltage | +| Huidige | Power draw in milliamps | +| Vermogen | Calculated wattage | + +## Traceroute + +Traceroute shows the path a message takes through the mesh: + +1. From the node detail screen, tap **Traceroute**. +2. The app sends a traceroute request to the target node. +3. Results show each hop with SNR/RSSI values. + +### Reading Traceroute Results + +``` +You → Node A (SNR: 8.5) → Node B (SNR: 5.2) → Target +``` + +Each hop represents a relay node that forwarded the message. + +## Positie Logboek + +Historical position data for nodes that share their location: + +- GPS coordinates +- Altitude +- Speed (if moving) +- Timestamp for each position report + +## Neighbor Info + +Shows which nodes a given node can directly hear, useful for understanding mesh topology. + +## Viewing Metrics + +1. Navigate to **Nodes**. +2. Tap the node you want to inspect. +3. Select the metric category from the detail tabs. + +![Node detail — local device](/assets/screenshots/nodes_detail_local.png) + +The position tab shows location data for nodes that share GPS: + +![Position inline content](/assets/screenshots/nodes_position.png) + +> ⚠️ **Note:** Metrics are only available when they have been reported by the remote node. Metrics update at intervals configured on each node's telemetry settings. + +## Related Topics + +- [Nodes](nodes) — node list, filtering, and sorting +- [Telemetry & Sensors](telemetry-and-sensors) — supported sensors and configuration +- [Signal Meter](signal-meter) — how signal quality is calculated from SNR and RSSI +- [Discovery](discovery) — traceroute details and neighbor info +- [Units & Locale](units-and-locale) — temperature, distance, and speed display formats + +--- + diff --git a/docs/nl-rNL/user/nodes.md b/docs/nl-rNL/user/nodes.md new file mode 100644 index 000000000..1640e1ea0 --- /dev/null +++ b/docs/nl-rNL/user/nodes.md @@ -0,0 +1,152 @@ +--- +title: Nodes +nav_order: 4 +last_updated: 2026-05-13 +description: Browse, filter, and sort mesh nodes — view details, signal quality, roles, and quick actions. +aliases: + - node-list + - mesh-nodes + - peers +--- + +# Nodes + +The Nodes screen displays all devices visible on your mesh network. + +## Node List + +The node list shows every node your radio has heard, including: + +- **Node name** — user-configured long name +- **Short name** — 4-character identifier +- **Signal quality** — last heard signal strength +- **Last heard** — time since last communication +- **Distance** — estimated distance (if positions are shared) +- **Battery** — remote node battery level (if telemetry is enabled) + +### Node Status Indicators + +| Badge | Meaning | +| ---------- | ------------------------------------- | +| 🟢 Online | Node heard within the last 15 minutes | +| 🟡 Away | Node heard within the last 2 hours | +| 🔴 Offline | Node not heard for over 2 hours | +| ⭐ Favorite | Node marked as favorite by the user | + +### Node Roles + +Nodes can be configured with different roles that affect their mesh behavior: + +| Functie | Beschrijving | +| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Client | Standard end-user device | +| Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | +| Client Mute | Receives but doesn't retransmit | +| Client Hidden | Like Client Mute, plus hides from node list | +| Router | Prioritizes message forwarding; stays awake to relay | +| Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | +| ~~Router Client~~ | ⚠️ **Deprecated** (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | +| ~~Repeater~~ | ⚠️ **Deprecated** (removed in firmware 2.7.11) — no longer selectable; use Router instead | +| Tracker | Optimized for position reporting at regular intervals | +| Sensor | Optimized for telemetry reporting | +| TAK | Interoperates with TAK systems (sends/receives CoT) | +| TAK Tracker | TAK position reporting only | +| Lost & Found | Continuous position beacon for recovery | + +### Choosing a Role + +Most users should keep the default **Client** role. Consider a different role when: + +- **Router** — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don't use Router on battery-powered handheld devices. +- **Router Late** — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. +- **Client Base** — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. +- **Client Mute** — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only devices or to reduce congestion in dense areas. +- **Tracker** — An unattended device whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. +- **Sensor** — An unattended device reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. +- **TAK / TAK Tracker** — Only needed if interoperating with ATAK/WinTAK systems. See [TAK Integration](tak) for details. + +> 💡 **Tip:** The mesh works best when most nodes are **Client** or **Router**. Too many Mute nodes reduces mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. + +### Encryption Indicators + +Nodes display encryption status icons next to their name: + +| Icon | Meaning | +| ----------- | ------------------------------------------------------------------------------------------------------------------- | +| 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | +| 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | +| ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) | + +> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. + +## Quick Actions + +From the node list, you can: + +- **Tap** a node to view its detail page +- **Long-press** for quick actions: + - Send a direct message + - View on map + - Positie aanvragen + - Mark as favorite + - Traceroute + +## Filtering & Sorting + +### Text Search + +Type in the search field to filter nodes by name or short name. The filter updates in real time as you type. + +### Filter Toggles + +| Filter | Beschrijving | +| -------------------------- | ---------------------------------------------------------------------------------------------- | +| **Only online** | Show only nodes heard within the last 15 minutes | +| **Only direct** | Show only nodes with direct (non-relayed) connections | +| **Include unknown** | Show nodes that haven't sent user info yet | +| **Exclude infrastructure** | Hide infrastructure-role nodes (Router, Repeater, Router Late, Client Base) | +| **Exclude MQTT** | Hide nodes heard only via MQTT internet bridge | +| **Show ignored** | Show nodes you've previously dismissed or muted | + +### Sort Options + +| Sort | Beschrijving | +| ------------------------------------------- | ------------------------------------------------------------------ | +| **Last heard** (default) | Most recently heard nodes first | +| **Alphabetical** | Sorted by node long name | +| **Distance** | Nearest nodes first (requires position sharing) | +| **Hops away** | Fewest relay hops first | +| **Channel** | Grouped by channel index | +| **Via MQTT** | Grouped by MQTT vs. radio-heard | +| **Favorites** | Favorited nodes first | + +## Node Detail + +Tapping a node opens the detail view with comprehensive information. See [Node Metrics](node-metrics) for full details on metrics and telemetry. + +![Node detail view](/assets/screenshots/nodes_node_list.png) + +The detail screen includes device info, position, and action buttons: + +![Node detail section](/assets/screenshots/nodes_detail_section.png) + +Inline status indicators show key metrics at a glance: + +| Indicator | Screenshot | +| -------------- | -------------------------------------------------------- | +| Signal quality | ![Signal](/assets/screenshots/nodes_signal_info.png) | +| Battery level | ![Battery](/assets/screenshots/nodes_battery_info.png) | +| Hop count | ![Hops](/assets/screenshots/nodes_hops_info.png) | +| Laatst gehoord | ![Last heard](/assets/screenshots/nodes_last_heard.png) | +| Afstand | ![Distance](/assets/screenshots/nodes_distance_info.png) | + +## Related Topics + +- [Node Metrics](node-metrics) — detailed telemetry dashboards for each node +- [Messages & Channels](messages-and-channels) — send a direct message to a node +- [Map & Waypoints](map-and-waypoints) — view node positions geographically +- [Discovery](discovery) — traceroute and neighbor info for topology exploration +- [Signal Meter](signal-meter) — understand what the signal bars mean + +--- + diff --git a/docs/nl-rNL/user/onboarding.md b/docs/nl-rNL/user/onboarding.md new file mode 100644 index 000000000..3b910534e --- /dev/null +++ b/docs/nl-rNL/user/onboarding.md @@ -0,0 +1,99 @@ +--- +title: Getting Started +nav_order: 1 +last_updated: 2026-05-13 +description: First-launch setup — permissions, onboarding flow, and next steps after connecting your radio. +aliases: + - first-launch + - setup + - intro +--- + +# Getting Started + +Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app. + +## First Launch + +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. + +### Welcome Screen + +The welcome screen introduces Meshtastic and its core capabilities: + +- Off-grid mesh communication +- No cellular or internet required +- End-to-end encrypted messaging + +Tap **Get Started** to proceed through the setup flow. + +![Welcome screen](/assets/screenshots/onboarding_welcome.png) + +## Permissions + +The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. + +### Bluetooth Permission + +Bluetooth is the primary connection method between your phone and Meshtastic radio: + +- **Bluetooth scanning** — discover nearby Meshtastic radios +- **Bluetooth connect** — establish and maintain connections with paired radios + +Grant both permissions when prompted. Without Bluetooth, you'll need to use USB or TCP connections instead. + +### Location Permission + +> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. + +Meshtastic also uses your location for: + +- Showing your position on the mesh map +- Calculating distances to other nodes +- Sharing your GPS coordinates with other mesh members (if enabled) + +Grant **"While using the app"** or **"Always"** depending on your preference: + +- **While using the app** — position updates only when the app is open +- **Always** — enables background position updates for always-on mesh presence + +If denied, Bluetooth scanning will not function and your node will not report a position. + +### Notifications Permission + +Notifications alert you to: + +- Incoming messages from channels and direct messages +- Connection status changes (connected, disconnected, reconnecting) +- Firmware update availability + +> 💡 **Tip:** You can fine-tune notification preferences later in Android system settings. The app creates separate notification channels for messages, connection events, and background service status. + +### Critical Alerts Permission + +On supported devices, the app may request permission for critical alerts: + +- These are high-priority notifications that can break through Do Not Disturb mode +- Useful for emergency mesh alerts or urgent messages +- You can **skip** this step if you don't need breakthrough notifications +- Configure or revoke later in Android notification settings + +## After Setup + +Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. + +> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. + +## What's Next? + +Once connected to a radio, explore: + +- [Connections](connections) — pair your first radio device +- [Messages & Channels](messages-and-channels) — send your first message +- [Nodes](nodes) — see who's on your mesh +- [Map & Waypoints](map-and-waypoints) — view node positions +- [Settings](settings-radio-user) — configure your radio and user profile + +New to Meshtastic? The [getting started guide](https://meshtastic.org/docs/getting-started) on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup. + +--- diff --git a/docs/nl-rNL/user/settings-module-admin.md b/docs/nl-rNL/user/settings-module-admin.md new file mode 100644 index 000000000..1e74edcab --- /dev/null +++ b/docs/nl-rNL/user/settings-module-admin.md @@ -0,0 +1,246 @@ +--- +title: Settings — Modules & Admin +nav_order: 8 +last_updated: 2026-05-13 +description: Configure optional feature modules (MQTT, telemetry, canned messages, TAK, and more) and perform device administration. +aliases: + - modules + - module-config + - administration +--- + +# Settings — Modules & Admin + +Configure optional feature modules and perform device administration. Modules extend Meshtastic with specialized capabilities — each can be independently enabled or disabled. + +> 💡 **Tip:** You only need to enable the modules you actually use. Disabling unused modules reduces airtime, saves battery, and simplifies your configuration. + +Module settings use a card-based layout with toggle switches, dropdowns, text fields, and sliders: + +![Toggle switch](/assets/screenshots/settings_switch.png) + +![Dropdown selector](/assets/screenshots/settings_dropdown.png) + +![Text field](/assets/screenshots/settings_text_field.png) + +![Settings card layout](/assets/screenshots/settings_titled_card.png) + +## Module Configuration + +### MQTT Module + +Bridges mesh messages to and from an MQTT broker for internet connectivity. This is how you extend your mesh beyond radio range or integrate with home automation systems. + +| Setting | Beschrijving | +| --------------- | ------------------------------------------------------------------------ | +| Enabled | Toggle MQTT bridge | +| Server | MQTT broker address | +| Gebruikersnaam | Authentication username | +| Wachtwoord | Authentication password | +| Encryption | Encrypt MQTT payloads | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON support removed from firmware; field is ignored | +| TLS | Use secure connection | +| Root Topic | Base MQTT topic path | +| Map Report | Publish position for public map | + +See [MQTT](mqtt) for a detailed usage guide including encryption, privacy, and broker setup. + +### Serial Module + +Enables serial port communication for external device integrations (GPS modules, sensors, or custom hardware). When enabled, the node's serial port can send and receive protobuf or text data, allowing external microcontrollers or computers to interact with the mesh. + +| Setting | Beschrijving | +| ---------- | ------------------------------- | +| Enabled | Activate serial communication | +| Echo | Echo received serial data back | +| Mode | Text, Protobuf, or NMEA output | +| RX/TX Pins | GPIO pins for serial connection | +| Baud Rate | Serial communication speed | + +### External Notification Module + +Controls buzzer, LED, or vibration alerts on your radio hardware. Useful for devices that need to physically signal when a message arrives — particularly helpful for unattended or outdoor installations. + +| Setting | Beschrijving | +| -------------------------------- | --------------------------- | +| Enabled | Activate notifications | +| Alert Message | Notify on incoming messages | +| Alert Message Buzzer | Use buzzer for messages | +| Alert Message Vibra | Use vibration for messages | +| Alert Bell | Notify on bell character | +| Output (GPIO) | Pin for notification output | +| Active | High or Low active | +| Duration (ms) | Notification length | +| Use I2S as Buzzer | Use I2S audio output | + +### Store & Forward Module + +Buffers messages for nodes that were temporarily offline, then replays them when those nodes reconnect. Essential for meshes where nodes go in and out of range regularly — ensures messages aren't lost during brief disconnections. + +| Setting | Beschrijving | +| ------------------------------------------ | -------------------------- | +| Enabled | Activate store and forward | +| Heartbeat (s) | Announcement interval | +| Records | Maximum stored messages | +| History Return (max) | Max messages to replay | +| History Return (window) | Time window for replay | + +> 💡 **Tip:** Store and Forward works best on nodes with ample memory (ESP32 with PSRAM). Router nodes are ideal candidates since they're typically always-on. + +### Range Test Module + +Automated range testing tool for evaluating link quality between nodes. When enabled, the node periodically transmits test messages with incrementing counters. A receiver node logs these messages, allowing you to walk or drive away and later analyze at what distance messages stopped arriving. + +| Setting | Beschrijving | +| -------------------------------------- | --------------------------------- | +| Enabled | Activate range testing | +| Sender Interval (s) | Time between test transmissions | +| Save CSV | Log received test data to SD card | + +### Telemetry Module + +Controls what telemetry data your node shares with the mesh. Telemetry includes device health (battery, uptime) and environmental sensor data (temperature, humidity, pressure). + +| Setting | Beschrijving | +| ---------------------------- | --------------------------------------- | +| Device Metrics Interval | How often to report device metrics | +| Environment Metrics Interval | How often to report environment sensors | +| Air Quality Enabled | Report particulate sensor data | +| Power Metrics Enabled | Report power usage | + +See [Telemetry & Sensors](telemetry-and-sensors) for supported sensors and configuration recommendations. + +### Canned Message Module + +Pre-configured messages accessible from the device's physical buttons (for radios with rotary encoders, keypads, or similar input hardware). Define a list of quick-send messages that can be transmitted without a phone connected — ideal for field use. + +| Setting | Beschrijving | +| ------------------ | ----------------------------------------------------------- | +| ~~Enabled~~ | ⚠️ **Deprecated** — current firmware may ignore this toggle | +| Berichten | Newline-separated list of messages | +| Send Bell | Play bell sound on send | +| Rotary Encoder | Enable rotary encoder input | +| Up/Down/Press Pins | GPIO pin assignments for input | + +### Audio Module + +Codec2 audio support for low-bandwidth voice communication over the mesh. This is an **experimental** feature that encodes voice into very small data packets using the Codec2 codec. + +| Setting | Beschrijving | +| --------------- | -------------------------------- | +| Enabled | Activate audio module | +| Codec2 Rate | Audio quality/bandwidth tradeoff | +| I2S Word Select | GPIO pin for I2S WS | +| I2S Data In | GPIO pin for I2S DIN | +| I2S Data Out | GPIO pin for I2S DOUT | + +> ⚠️ **Note:** Audio requires specific hardware (I2S microphone and speaker). Voice quality is very low-bandwidth — think "understandable radio voice," not phone-call quality. + +### Remote Hardware Module + +GPIO control over the mesh network. Allows a remote node to read or write GPIO pins on another node — useful for activating relays, reading switches, or controlling external hardware from a distance. + +| Setting | Beschrijving | +| -------------------- | --------------------------------------------------------------- | +| Enabled | Activate remote GPIO access | +| Allow Undefined Pins | Allow access to any GPIO pin (security risk) | + +> ⚠️ **Warning:** Enabling "Allow Undefined Pins" gives remote nodes access to all GPIO pins, which could interfere with the radio's own hardware. Only enable on dedicated GPIO nodes. + +### Neighbor Info Module + +Broadcasts information about directly heard neighbors, enabling mesh topology mapping. Each enabled node periodically shares a list of the other nodes it can hear and their signal quality. + +| Setting | Beschrijving | +| -------------------------------------- | ------------------------------------ | +| Enabled | Activate neighbor broadcasting | +| Update Interval (s) | How often to broadcast neighbor list | + +See [Discovery](discovery) for how to use neighbor data for mesh topology exploration. + +### Ambient Lighting Module + +Controls onboard NeoPixel or other addressable RGB LEDs on supported hardware. Can be used for visual status indicators, notification lights, or decorative effects. + +| Setting | Beschrijving | +| ------------------ | ---------------------------------------------------------- | +| Enabled | Activate LED control | +| LED State | On, Off, or set specific color | +| Red / Green / Blue | Individual color channel values (0–255) | + +### Detection Sensor Module + +Turns your node into a motion or door sensor alert system. When a GPIO pin detects a state change (motion detected, door opened), the node broadcasts an alert message over the mesh. + +| Setting | Beschrijving | +| ---------------------------------------- | ----------------------------------------------------------------------- | +| Enabled | Activate detection sensor | +| Monitor Pin | GPIO pin connected to sensor | +| Detection Triggered High | Trigger when pin goes high (vs. low) | +| Minimum Broadcast (s) | Minimum time between alert broadcasts | +| State Broadcast (s) | Periodic state broadcast interval | +| Send Bell | Include bell character in alerts | +| Friendly Name | Custom name for this sensor | + +### Paxcounter Module + +People counter using WiFi and BLE probe requests. Counts nearby devices by passively listening for probe requests that phones and laptops emit when scanning for networks. Available only on ESP32 devices. + +| Setting | Beschrijving | +| -------------------------------------- | -------------------------- | +| Enabled | Activate people counting | +| Update Interval (s) | How often to report counts | + +> 💡 **Tip:** Paxcounter is useful for estimating foot traffic at trailheads, event venues, or other locations. Counts are approximate — one person may carry multiple devices. + +### TAK Module + +Team Awareness Kit integration for interoperability with ATAK and WinTAK. See [TAK Integration](tak) for detailed setup and usage. + +## Beheer + +### Extern beheer + +Remotely configure nodes that share your admin key: + +1. Select the target node in the node list. +2. Navigate to **Settings** for that node. +3. Modify configuration. +4. Tap **Save** — changes are sent over the mesh. + +> ⚠️ **Requires:** Admin key configured on both your node and the target node. + +### Clean Node Database + +Removes stale nodes from your local database that haven't been heard in a configurable time window. + +### Factory Reset + +Resets all settings to factory defaults. **This cannot be undone.** + +### Herstart + +Remotely reboot a connected or administered node. + +### Debug-paneel + +View detailed diagnostic information: + +- Protocol buffers debug output +- Mesh packet log +- Connection state details + +### Troubleshooting Remote Admin + +- **"No response from target node"** — the target may be out of range, offline, or have a mismatched admin key. Verify the admin key matches on both nodes. +- **Changes not applying** — some settings require a reboot to take effect. Try the Reboot action after saving. +- **Can't see remote settings** — ensure your node has the admin key for the target node and that Admin Channel is enabled in Security Config. + +## Related Topics + +- [Settings — Radio & User](settings-radio-user) — core radio and user profile settings +- [Module configuration reference](https://meshtastic.org/docs/configuration/module) — detailed module docs on meshtastic.org +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/nl-rNL/user/settings-radio-user.md b/docs/nl-rNL/user/settings-radio-user.md new file mode 100644 index 000000000..9b0d9de35 --- /dev/null +++ b/docs/nl-rNL/user/settings-radio-user.md @@ -0,0 +1,173 @@ +--- +title: Settings — Radio & User +nav_order: 7 +last_updated: 2026-05-13 +description: Configure your radio hardware, LoRa presets, user profile, position sharing, power management, and security. +aliases: + - instellingen + - radio-config + - user-config + - lora +--- + +# Settings — Radio & User + +Configure your radio hardware and user identity parameters. + +## User Settings + +### User Profile + +| Setting | Beschrijving | +| ----------------- | ------------------------------------------------------------------------------------- | +| Long Name | Your display name (up to 39 characters) | +| Short Name | 4-character abbreviated name | +| Licensed Operator | Enable if you hold an amateur radio license (enables higher power) | + +### Applying Changes + +After modifying settings, tap **Save** to write the configuration to your radio. The device may reboot to apply changes. + +## Radio Configuration + +### Apparaat Configuratie + +| Setting | Beschrijving | Standaard | +| ------------------------------------------ | ----------------------------------------------------------------------- | --------- | +| Functie | Node behavior (Client, Router, etc.) | Client | +| Rebroadcast Mode | How the node retransmits messages | Alles | +| Node Info Broadcast (s) | Interval for broadcasting node info | 10800 | +| Double-tap Button | Action for double-tap button press | Disabled | + +### LoRa Configuratie + +| Setting | Beschrijving | Standaard | +| ----------------- | ----------------------------------------------------------------------- | ----------------------------------------- | +| Regio | Regulatory region for frequency bands | Unset (must configure) | +| Modem Preset | Speed/range tradeoff | LongFast | +| Hop Limit | Maximum retransmit hops | 3 | +| TX Power | Transmission power (dBm); 0 = max allowed for region | 0 (region max) | +| Frequency Offset | Fine-tune frequency (MHz) | 0 | +| Channel Bandwidth | Bandwidth setting | Default for preset | + +> ⚠️ **Important:** You **must** set your region before transmitting. Operating without the correct region may violate local radio regulations. See the [region configuration guide](https://meshtastic.org/docs/getting-started/initial-config) on meshtastic.org for details. + +### Modem Presets + +| Preset | Range | Speed | SNR Limit | Best For | +| ------------------ | ----------------------- | ------------------------- | ------------------------ | -------------------------------------------------------------------------------------------------------- | +| Short Turbo | ~1 km | 21.9 kbps | −5 dB | Dense urban with line-of-sight; data-heavy applications | +| Short Fast | ~3 km | 10.9 kbps | −7.5 dB | Urban neighborhoods; buildings within a few blocks | +| Short Slow | ~5 km | 5.5 kbps | −10 dB | Suburban short-range; moderate building density | +| Medium Fast | ~5 km | 5.5 kbps | −10 dB | Suburban areas; moderate building density | +| Medium Slow | ~8 km | 1.1 kbps | −12.5 dB | Suburban/rural; moderate range with slower speed | +| Long Turbo | ~10 km | 4.4 kbps | −10 dB | Similar range to Long Fast but with 500 kHz bandwidth; faster throughput | +| Long Fast | ~10 km | 1.1 kbps | −12.5 dB | **General use (default)** — balanced range and speed | +| Long Moderate | ~20 km | 0.34 kbps | −15 dB | Rural with some terrain; occasional use | +| Lite Fast | ~5 km | 5.5 kbps | −10 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Medium Fast | +| Lite Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Long Fast | +| Narrow Fast | ~5 km | 2.7 kbps | −10 dB | EU 868 MHz band (62.5 kHz BW); avoids interference with other devices | +| Narrow Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 868 MHz band (62.5 kHz BW); comparable to Long Fast | +| ~~Long Slow~~ | ~30 km | 0.18 kbps | −17.5 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | +| ~~Very Long Slow~~ | ~40+ km | 0.09 kbps | −20 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | + +#### Choosing a Modem Preset + +The modem preset controls the fundamental tradeoff between **range** and **data rate**: + +- **Slower presets** use more spreading, making signals decodable at weaker signal levels (lower SNR limit). This means longer range but fewer bytes per second. +- **Faster presets** pack more data per transmission but require a stronger signal to decode. + +**Practical guidance:** + +- **Urban mesh (many nodes, short distances):** Use **Long Fast** (default) or **Short Fast**. Higher speed means less airtime congestion when many nodes share the channel. +- **Rural/sparse mesh (few nodes, long distances):** Use **Long Moderate**. Range matters more than speed when nodes are far apart. +- **EU 866/868 MHz regulatory compliance:** Use **Lite Fast**, **Lite Slow**, **Narrow Fast**, or **Narrow Slow** — these are optimized for the EU SRD/868 MHz bands with narrower bandwidths. +- **Fixed infrastructure links:** Use **Short Turbo** or **Long Turbo** for dedicated point-to-point links with good antennas and line-of-sight. +- **Mixed environments:** Stick with **Long Fast** — it's the community default and ensures compatibility with others in your area. + +> ⚠️ **Important:** All nodes on the same channel **must** use the same modem preset. Nodes with mismatched presets cannot communicate even if they share the same frequency and encryption key. + +> 💡 **Tip:** The range estimates above assume flat terrain and modest antennas. Elevation advantage (hilltop, rooftop) dramatically increases effective range. A well-placed Router with Long Fast can often outperform a ground-level node with Long Slow. + +### Weergave Configuratie + +| Setting | Beschrijving | +| ------------------- | ------------------------------------------------------------------------------------ | +| Screen Timeout | Time before display sleeps | +| Display Units | Metric or Imperial | +| OLED Type | Auto, SSD1306, SH1106, SH1107 | +| Compass Orientation | Rotation offset for compass display (0°, 90°, 180°, 270°) | +| ~~Compass North~~ | ⚠️ **Deprecated** — replaced by Compass Orientation; still visible in older firmware | + +### Positie Configuratie + +| Setting | Beschrijving | +| ----------------------------------------- | ---------------------------------- | +| GPS Enabled | Enable/disable GPS | +| GPS Update Interval | How often to acquire GPS fix | +| Position Broadcast (s) | How often to share position | +| Smart Position | Enable movement-based broadcasting | +| Fixed Position | Use a manually set position | + +### Energie configuratie + +| Setting | Beschrijving | +| --------------------------------------- | --------------------------------------- | +| Power Saving | Enable low-power sleep mode | +| Shutdown After (s) | Auto-shutdown idle timer | +| ADC Multiplier | Battery voltage calibration factor | +| Wait Bluetooth (s) | Time to wait for BLE connection at boot | +| Mesh SDS Timeout (s) | Super-deep-sleep timeout | + +### Netwerkconfiguratie + +| Setting | Beschrijving | +| ------------- | ---------------------------------------------------- | +| WiFi Enabled | Enable WiFi radio (ESP32 devices) | +| WiFi SSID | Network name to connect to | +| WiFi PSK | Network password | +| NTP Server | Time synchronization server | +| Syslog Server | Remote logging server | + +![IP address field](/assets/screenshots/settings_ipv4_field.png) + +### Bluetooth Configuratie + +| Setting | Beschrijving | +| ----------------- | ------------------------------------------------------------------------- | +| Bluetooth Enabled | Enable/disable BLE radio | +| Pairing Mode | Fixed PIN, Random PIN, or No PIN | +| Vaste PIN | PIN code for pairing (default: 123456) | + +### Beveiligings Configuratie + +| Setting | Beschrijving | +| --------------------- | -------------------------------------------------------------------------- | +| Publieke sleutel | Your node's public key (read-only) | +| Admin Sleutel | Key for remote administration | +| Privésleutel | Your node's private key (handle securely) | +| Admin Channel Enabled | Allow admin commands via channel | +| Debug Log | Output live debug logging over serial/bluetooth | +| Serial Enabled | Enable serial console access (moved from Device Config) | +| Beheerde modus | Restrict non-admin channel changes | + +![Password field](/assets/screenshots/settings_password_field.png) + +Settings use standard preference controls — dropdowns, toggles, and sliders: + +| Control | Screenshot | +| -------- | ------------------------------------------------------ | +| Dropdown | ![Dropdown](/assets/screenshots/settings_dropdown.png) | +| Toggle | ![Toggle](/assets/screenshots/settings_switch.png) | +| Slider | ![Slider](/assets/screenshots/settings_slider.png) | + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — optional feature modules and device administration +- [Signal Meter](signal-meter) — how modem presets affect signal quality thresholds +- [LoRa configuration](https://meshtastic.org/docs/configuration/radio/lora) — detailed LoRa settings reference on meshtastic.org +- [Initial configuration](https://meshtastic.org/docs/getting-started/initial-config) — region setup guide on meshtastic.org + +--- + diff --git a/docs/nl-rNL/user/signal-meter.md b/docs/nl-rNL/user/signal-meter.md new file mode 100644 index 000000000..a14435321 --- /dev/null +++ b/docs/nl-rNL/user/signal-meter.md @@ -0,0 +1,81 @@ +--- +title: How the Meshtastic Signal Meter Works +nav_order: 15 +last_updated: 2026-05-13 +description: How the signal meter calculates quality from RSSI and SNR — LoRa spread spectrum, presets, and what the bars really mean. +aliases: + - signal + - signal-meter + - snr + - rssi +--- + +# How the Meshtastic Signal Meter Works + +The Meshtastic signal meter — the familiar bars or status color in the app — is calculated very differently than the "bars" on a traditional cell phone or Wi-Fi router. + +Most consumer devices simply measure how "loud" a signal is. However, because Meshtastic uses **LoRa (Long Range)** technology, its signal meter measures how **clear** the signal is, relative to the specific settings your mesh is using. + +--- + +## 1. The Two Metrics: "Loudness" vs. "Clarity" + +Every time the LoRa radio chip receives a message, it reports two measurements: + +- **RSSI (Received Signal Strength Indicator):** The **loudness** of the raw power hitting your antenna. +- **SNR (Signal-to-Noise Ratio):** The **clarity** of the signal compared to the background static. + +> **Tip — The Analogy:** Imagine you are trying to hear a friend talking to you. +> +> - **RSSI** is how loud their voice is. +> - **The Noise Floor** is the background noise in the room (air conditioning, other people talking, traffic). +> - **SNR** is how easily you can distinguish your friend's voice from the background noise. + +If your friend shouts at you at a deafening rock concert, the signal is incredibly loud (High RSSI), but you still can't understand them because the background noise is louder (Bad SNR). Conversely, if your friend whispers to you in a dead-silent library, the signal is very weak (Low RSSI), but you can understand them perfectly (Great SNR). + +--- + +## 2. The Magic of LoRa: Hearing "Below the Noise Floor" + +For standard radios (like FM or Wi-Fi), if the background noise is louder than the signal (a negative SNR), the receiver just hears static. + +LoRa is special. It uses **"Spread Spectrum"** modulation, which allows the radio to mathematically pull a signal out of the air even when it is buried deep _underneath_ the background noise. This is why you will frequently see **negative SNR numbers** in Meshtastic (e.g., -10 dB, which means the signal is 10 decibels weaker than the background static). + +Depending on which Meshtastic preset you are using (e.g., `LongFast` vs. `ShortFast`), the radio has a specific **SNR Limit** — the absolute maximum amount of noise it can tolerate before the message is completely lost to the static. + +--- + +## 3. How the Signal Meter Calculates Quality + +The Meshtastic apps take both RSSI and SNR and run them through a specific formula to assign your signal a quality rating (None, Bad, Fair, or Good). It specifically scales these values based on the physical limits of the radio preset you are using. + +Here is exactly how the app decides how many bars (or what color) to show you: + +| Level | Bars | Criteria | Meaning | +| ------ | ---- | ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | +| Goed | 3 | RSSI better than `-115 dBm` **AND** SNR better than `-7 dB` | Signal is both loud and clear — healthy connection. | +| Matig | 2 | RSSI better than `-126 dBm` with good SNR, **OR** SNR better than `-15 dB` with good RSSI | Signal getting quieter or noisier, but still decodable. | +| Slecht | 1 | Falls between Fair and None thresholds | At the edge of range or experiencing interference. | +| Geen | 0 | RSSI worse than `-126 dBm` **AND** SNR worse than `-15 dB` | Transmission completely buried in noise. | + +--- + +## 4. What This Means for You + +Because Meshtastic's meter acts as a **"Clarity Meter"**, it behaves differently than what most people expect: + +> **Tip — Don't panic over low RSSI:** You might see a seemingly terrible RSSI value like `-118 dBm`. On a cell phone, you would have zero bars. But if you have an SNR of `+2 dB`, Meshtastic will still show a strong signal! _The library is quiet, so the whisper is heard perfectly._ + +> **Warning — Watch out for local noise:** If you hook up a massive antenna and see a great RSSI (e.g., `-90 dBm`) but your signal meter is only showing **1 Bar (Bad)**, you have a problem. It means you have local interference — perhaps a cheap power supply, a noisy computer, or a nearby radio tower — creating so much static that it is drowning out your mesh. + +## Where Signal Information Appears + +In the app, signal data is shown in several places: + +- **Node list** — signal bars icon next to each node +- **Node detail** — SNR, RSSI, and signal quality in the device metrics section +- **Traceroute** — per-hop signal quality for each relay node +- **Signal metrics** — historical SNR and RSSI data in the metrics charts + +![Node entry showing SNR, RSSI values and colored signal bars](/assets/screenshots/nodes_signal_info.png) + diff --git a/docs/nl-rNL/user/tak.md b/docs/nl-rNL/user/tak.md new file mode 100644 index 000000000..992d4f192 --- /dev/null +++ b/docs/nl-rNL/user/tak.md @@ -0,0 +1,126 @@ +--- +title: TAK Integration +nav_order: 10 +last_updated: 2026-05-13 +description: Interoperate with ATAK and WinTAK — CoT position sharing, TAK roles, and plugin setup. +aliases: + - tak + - atak + - team-awareness-kit +--- + +# TAK Integration + +Meshtastic integrates with the Team Awareness Kit (TAK) ecosystem, enabling interoperability between Meshtastic mesh devices and TAK applications like ATAK and WinTAK. + +## Overview + +The TAK module allows Meshtastic nodes to: + +- Share position data in TAK-compatible CoT (Cursor on Target) format +- Appear as team members on TAK map displays +- Receive TAK PLI (Position Location Information) messages + +## Setup + +### Prerequisites + +- ATAK (Android Team Awareness Kit) or WinTAK installed +- Meshtastic ATAK Plugin installed +- TAK module enabled on your Meshtastic radio + +### Configuration + +1. Navigate to **Settings → Module Config → TAK**. +2. Enable the TAK module. +3. Configure the TAK team/group settings: + +![Module toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | Beschrijving | +| ------- | -------------------------- | +| Enabled | Activate TAK interop | +| Mode | TAK-compatible output mode | + +### ATAK Plugin Setup + +1. Install the Meshtastic ATAK Plugin from the plugin repository. +2. Open ATAK and enable the Meshtastic plugin. +3. The plugin bridges messages between ATAK and your mesh network. + +## TAK Roles + +Nodes configured with TAK-related roles behave differently from standard clients: + +| Functie | Beschrijving | +| --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **TAK** | Full TAK interoperability — sends and receives CoT data, chat messages, and PLI updates. Functions as a standard client plus TAK bridge. | +| **TAK Tracker** | Position-only TAK output — automatically broadcasts PLI at regular intervals without user interaction. Optimized for unattended position beacons (vehicles, equipment, waypoints). Does not relay chat messages. | + +> 💡 **Tip:** Use **TAK Tracker** for devices that only need to report position (e.g., a radio mounted in a vehicle). Use **TAK** for devices where users actively participate in TAK operations. + +### CoT (Cursor on Target) Format + +TAK messages use the Cursor on Target XML format — a military standard for sharing situational awareness data. Meshtastic converts its internal protobuf messages to CoT format when bridging to TAK systems, so no manual format conversion is needed. + +## TAK Identity + +When using TAK roles, your node broadcasts identity information that appears on TAK maps: + +| Setting | Beschrijving | +| -------- | ---------------------------------------------------------------------------------------------------------------- | +| Team | Your team color on the TAK map (e.g., Blue, Red, Cyan, Green) | +| Functie | Your operational role (Team Member, Team Lead, HQ, Medic, RTO, etc.) | +| Callsign | Your TAK callsign (defaults to your Meshtastic long name) | + +These settings appear in **Settings → Module Config → TAK** when the TAK module is enabled. + +> 💡 **Tip:** Team/role colors are the standard TAK affiliation colors. Coordinate with your TAK team to use consistent team assignments. + +## Wire Format (V1 / V2) + +Meshtastic supports two TAK wire formats: + +| Format | Compatibility | Features | +| ------------------------------- | --------------------------------------------------------------- | --------------------------------------------------------- | +| V1 (Legacy) | ATAK Plugin v1.x, older firmware | Basic CoT position sharing only | +| V2 (Current) | ATAK Plugin v2.x, firmware 2.3+ | Full CoT support including chat, routes, zstd compression | + +The app automatically selects V2 when both sides support it. No manual configuration needed — the TAK module negotiates format based on firmware capabilities. + +## Usage with ATAK + +Once configured: + +- Meshtastic nodes appear as markers on the ATAK map with callsign labels +- Chat messages can bridge between mesh and TAK networks +- Position updates flow bidirectionally between Meshtastic and TAK +- TAK Tracker nodes broadcast PLI automatically — their positions appear on ATAK maps without any ATAK-side configuration + +> ⚠️ **Note:** TAK integration requires specific node roles and module configuration. Standard client nodes don't automatically participate in TAK operations. + +## Troubleshooting + +| Problem | Cause | Solution | +| -------------------------------- | ------------------------------------- | ----------------------------------------------------------------------- | +| Node doesn't appear on ATAK map | TAK module disabled or wrong role | Verify TAK module is enabled and node role is TAK or TAK Tracker | +| Position updates are stale | GPS fix lost or interval too long | Check GPS status; reduce position broadcast interval in Position Config | +| ATAK plugin shows "disconnected" | BLE connection lost or plugin crashed | Reconnect Bluetooth in Meshtastic app, then restart ATAK plugin | +| Chat messages not bridging | V1 format doesn't support chat | Ensure both nodes run firmware 2.3+ for V2 wire format | +| CoT data not flowing | Channel mismatch | All TAK nodes must be on the same channel with matching encryption | + +## Security Considerations + +- TAK data shares your position and callsign information +- Ensure your channel encryption is configured when using TAK in sensitive environments +- The TAK module respects the same channel encryption as other Meshtastic messages + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — TAK module configuration +- [Nodes](nodes) — TAK and TAK Tracker roles in the node list +- [Map & Waypoints](map-and-waypoints) — node positions on the map +- [ATAK plugin guide](https://meshtastic.org/docs/software/integrations/atak-plugin) — detailed ATAK setup on meshtastic.org + +--- + diff --git a/docs/nl-rNL/user/telemetry-and-sensors.md b/docs/nl-rNL/user/telemetry-and-sensors.md new file mode 100644 index 000000000..0fc67157c --- /dev/null +++ b/docs/nl-rNL/user/telemetry-and-sensors.md @@ -0,0 +1,118 @@ +--- +title: Telemetry & Sensors +nav_order: 9 +last_updated: 2026-05-13 +description: Sensor data on the mesh — supported environment, air quality, and power sensors, plus configuration and viewing guides. +aliases: + - sensors + - environment + - weather + - power-metrics +--- + +# Telemetry & Sensors + +Meshtastic nodes can collect and share sensor data across the mesh network. + +## Overview + +Telemetry allows nodes equipped with sensors to broadcast environmental, power, and device health information. This data is visible on the node detail screen and can be logged over time. + +## Device Telemetry + +All Meshtastic nodes report basic device telemetry: + +| Metric | Beschrijving | Typical Range | +| ------------------ | ------------------------------ | ------------------------------------------------------------------ | +| Battery Level | Charge percentage | 0–100% | +| Spanning | Battery voltage | 3.0–4.2V (LiPo) | +| Kanaalgebruik | % of airtime used locally | 0–100% | +| Air Utilization TX | % of airtime used by this node | 0–100% | +| Tijd online | Seconds since last boot | Varies | + +## Environment Sensors + +Supported environmental sensors: + +### Temperature & Humidity + +| Sensor | Temperatuur | Vochtigheid | Druk | Notes | +| ------- | ----------- | ----------- | ---- | ----------------------- | +| BME280 | ✓ | ✓ | ✓ | Recommended all-in-one | +| BME680 | ✓ | ✓ | ✓ | Adds gas resistance/IAQ | +| SHT31 | ✓ | ✓ | — | High accuracy | +| MCP9808 | ✓ | — | — | Precision temperature | +| LPS22 | — | — | ✓ | Pressure only | + +### Air Quality + +| Sensor | Metric | Notes | +| -------- | -------------------------------------------------- | -------------------------- | +| BME680 | Gas Resistance / IAQ | Volatile organic compounds | +| PMSA003I | PM1.0, PM2.5, PM10 | Particulate matter | +| SEN55 | PM, NOx, VOC, Temp, Humidity | Multi-sensor | + +### Light & UV + +| Sensor | Metric | +| -------- | -------------------------------------- | +| OPT3001 | Ambient light (lux) | +| VEML7700 | Ambient light (lux) | +| LTR390 | UV index | + +## Power Metrics + +Nodes with INA-series power sensors can report: + +| Metric | Beschrijving | +| ----------- | ----------------------------------------- | +| Bus Voltage | Supply rail voltage | +| Huidige | Power consumption (mA) | +| Vermogen | Calculated power (mW) | + +Useful for monitoring solar charging or battery health on remote nodes. + +## Configuring Telemetry + +1. Navigate to **Settings → Module Config → Telemetry**. +2. Set reporting intervals: + - **Device Metrics Interval** — how often to broadcast device metrics + - **Environment Metrics Interval** — how often to broadcast sensor data +3. Enable specific sensor types as needed. + +### Recommended Intervals + +| Use Case | Device (s) | Environment (s) | +| ------------------------------------------ | ----------------------------- | ---------------------------------- | +| Urban mesh (many nodes) | 3600 | 3600 | +| Rural mesh (few nodes) | 900 | 900 | +| Weather station | 900 | 300 | +| Battery conservation | 7200 | 7200 | + +> ⚠️ **Note:** Shorter intervals increase airtime usage and battery drain across the mesh. + +## Viewing Telemetry + +1. Navigate to **Nodes** and select a node. +2. Telemetry sections show on the detail screen: + - Device Metrics (always available) + - Environment Metrics (if sensors present) + - Power Metrics (if INA sensor present) +3. Historical graphs show trends over time. + +![Telemetry actions](/assets/screenshots/node-metrics_telemetric_actions.png) + +## Troubleshooting + +- **No environment data showing?** The remote node needs a physical sensor connected (e.g., BME280 on I2C). Device telemetry (battery, uptime) is always available, but environment metrics require hardware. +- **Stale readings?** Check the reporting interval — very long intervals (7200s+) mean data updates infrequently. Also verify the remote node is still online. +- **Sensor conflict on I2C bus?** Some sensors share I2C addresses. If you have multiple sensors on the same bus, check for address collisions in the radio's serial debug output. + +## Related Topics + +- [Node Metrics](node-metrics) — view telemetry data on the node detail screen +- [Settings — Modules & Admin](settings-module-admin) — telemetry module configuration +- [Units & Locale](units-and-locale) — temperature and pressure display units + +--- + diff --git a/docs/nl-rNL/user/translate.md b/docs/nl-rNL/user/translate.md new file mode 100644 index 000000000..b2ed79a34 --- /dev/null +++ b/docs/nl-rNL/user/translate.md @@ -0,0 +1,97 @@ +--- +title: Translate the App +parent: User Guide +nav_order: 17 +last_updated: 2026-05-13 +aliases: + - translate + - crowdin + - localization +--- + +# Translate the App + +Contributing translations helps make Meshtastic accessible to a wider audience. The app uses [Crowdin](https://crowdin.com/) to manage community translations for both the user interface and in-app documentation. + +--- + +## What Gets Translated + +| Resource | Source Location | Notes | +| ----------------- | ------------------------------------- | ---------------------------------------------------------------------- | +| UI strings | `composeResources/values/strings.xml` | Buttons, labels, messages, and all user-visible text | +| User Guide pages | `docs/user/*.md` | In-app documentation shown in Help & Documentation | +| Fastlane metadata | `fastlane/metadata/android/en-US/` | App Store listing title, description, and changelogs | + +> **Note — Developer Guide pages are English-only.** Code-focused documentation targeting contributors is not translated. + +--- + +## How to Contribute + +1. **Visit the Crowdin project.** Open the [Meshtastic Android Crowdin project](https://crowdin.com/project/meshtastic-android) and sign in or create a free account. +2. **Choose your language.** Select an existing language or request a new one by opening a [GitHub issue](https://github.com/meshtastic/Meshtastic-Android/issues/new). +3. **Translate strings.** Crowdin shows the English source on the left and your translation on the right. Translate each string and save. +4. **Review context.** Many strings include screenshots or context comments — check these to understand where the text appears in the app. +5. **Submit.** Approved translations are automatically merged into the next release. + +> **Tip — Keep translations short.** UI strings often appear in buttons, chips, or narrow columns. If a translation is significantly longer than the English original, consider abbreviating where the meaning stays clear. + +--- + +## Adding a New Language + +If your language is not yet listed on Crowdin: + +1. Open an issue on [GitHub](https://github.com/meshtastic/Meshtastic-Android/issues/new) requesting the new locale. +2. A maintainer will add the language to Crowdin and configure `crowdin.yml`. +3. Once added, you can begin translating immediately. + +--- + +## How Translations Are Organized + +The Android app uses **Compose Multiplatform resources** for all user-visible strings: + +``` +core/resources/src/commonMain/composeResources/ +├── values/ ← English (default) +│ └── strings.xml +├── values-de/ ← German +│ └── strings.xml +├── values-fr/ ← French +│ └── strings.xml +└── ... +``` + +In-app documentation follows a similar pattern under `docs/`: + +``` +docs/ +├── user/ ← English source (default) +│ ├── onboarding.md +│ └── ... +├── fr/user/ ← French translations +│ ├── onboarding.md +│ └── ... +└── ... +``` + +The app automatically selects the correct locale based on your device's **Language & Region** settings. + +--- + +## Translation Guidelines + +- **Do not translate** technical terms like "LoRa", "MQTT", "BLE", "TAK", "SNR", or "RSSI" — these are universal. +- **Keep placeholders intact.** Strings like `%1$s` or `%d` are filled in at runtime. Do not remove or reorder them unless the grammar of your language requires it. +- **Match tone.** The app uses a friendly, direct voice. Avoid overly formal language. +- **Test if possible.** Switch your device language and open the app to see how translations look in context. + +--- + +## Questions? + +If you have questions about a specific string's context or need help getting started, open a discussion on the [Meshtastic GitHub Discussions](https://github.com/meshtastic/Meshtastic-Android/discussions) page. + +Thank you for helping expand the reach of Meshtastic! diff --git a/docs/nl-rNL/user/units-and-locale.md b/docs/nl-rNL/user/units-and-locale.md new file mode 100644 index 000000000..a6028461d --- /dev/null +++ b/docs/nl-rNL/user/units-and-locale.md @@ -0,0 +1,118 @@ +--- +title: Units, Measurement & Locale +parent: User Guide +nav_order: 16 +last_updated: 2026-05-12 +--- + +# Units, Measurement & Locale + +The Meshtastic app automatically displays temperatures, distances, speeds, and times in the units your device is configured to use — no settings to change inside the app. + +--- + +## How It Works + +Meshtastic radios always transmit data in **metric units** (meters, °C, km/h, hPa, etc.). When the app receives this data, it uses the `MetricFormatter` utility to convert and display values in whatever unit system your device's locale specifies. + +On Android, your measurement preferences are determined by your system **Language & Region** settings. On Desktop (JVM), the app uses the JVM's default `Locale`. + +> **Tip — You never need to toggle units inside the app.** Change your system measurement preferences and every screen in Meshtastic updates automatically — node details, telemetry charts, weather, altitude, and more. + +--- + +## Temperatuur + +Temperature values from environment sensors are transmitted as **°C** and displayed based on your device's temperature unit preference. + +![Environment metrics with temperature](/assets/screenshots/nodes_environment_metrics.png) + +| Your Setting | You See | +| ------------ | ------- | +| Celsius | 22°C | +| Fahrenheit | 72°F | + +This affects all temperature displays throughout the app: node environment telemetry, soil temperature, dew point, and telemetry chart axes. + +## Distance & Altitude + +Distances between nodes and GPS altitudes are transmitted as **meters** and automatically scaled and converted. + +![Distance info display](/assets/screenshots/nodes_distance_info.png) + +| Your Setting | Small Distance | Large Distance | Altitude | +| -------------------------------- | -------------- | ---------------------- | -------- | +| Metric | 350 m | 2.5 km | 1,200 m | +| Imperial (US) | 1,148 ft | 1.6 mi | 3,937 ft | + +The app uses natural scaling — short distances stay in meters or feet, while longer distances switch to kilometres or miles automatically. + +### Where these appear + +- **Node list** — distance and bearing to each node +- **Node detail** — altitude, distance from your position +- **Map** — waypoint distances, traceroute hop distances +- **Compass** — distance to selected node + +## Speed + +GPS ground speed is displayed in your locale's preferred speed unit. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Metric | 12 km/h | +| Imperial (US) | 7 mph | + +## Wind + +Wind speed and gust data from environment sensors are transmitted as **m/s** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Metric | 5 m/s | +| Imperial (US) | 11 mph | + +Wind readings appear in the **Node Detail** environment section and the **Environment Telemetry** charts. + +## Rainfall + +Rainfall measurements (1-hour and 24-hour totals) are transmitted as **mm** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ---------------------- | +| Metric | 12 mm | +| Imperial (US) | 0.5 in | + +## Units That Never Change + +Some units are international standards and are displayed the same way regardless of your locale: + +| Measurement | Unit | Why | +| -------------------------------- | ------------------------------ | ------------------------------------- | +| Barometric pressure | hPa | International meteorological standard | +| Heading / bearing | ° (degrees) | Universal navigation convention | +| Straling | μR/hr | Standard dosimetry unit | +| GPS coordinates | decimal degrees | Universal geographic standard | +| Humidity, battery, soil moisture | % | Universal | + +## Date & Time + +All timestamps throughout the app — last heard, message times, telemetry logs, chart axes — follow your device's date and time preferences. + +| Setting | What It Controls | Example | +| ---------------- | ---------------- | ------------------------------------------------ | +| **24-Hour Time** | Clock format | 14:30 vs 2:30 PM | +| **Date Format** | Date ordering | 09/05/2026 vs 05/09/2026 | + +The app also uses **relative time** where it makes sense — for example, "5 min ago" or "2 hours ago" in the node list — which is automatically localised into your device language. + +## Changing Your Measurement System (Android) + +On Android, your measurement system (metric vs imperial) is tied to your region setting: + +1. Open **Android Settings → System → Language & Region** +2. Change your **Region** or **Measurement units** preference +3. Return to Meshtastic — values update immediately + +> **Tip — The app uses `MetricFormatter` from `core:common`.** All measurement formatting is handled by a shared KMP utility that respects your platform's locale. Developers adding new measurement displays should use `MetricFormatter` rather than hard-coding unit conversions. + diff --git a/docs/no-rNO/index.md b/docs/no-rNO/index.md new file mode 100644 index 000000000..b5dc882bb --- /dev/null +++ b/docs/no-rNO/index.md @@ -0,0 +1,30 @@ +--- +title: Home +layout: default +nav_order: 0 +--- + +# Meshtastic Android App Documentation + +User and developer documentation for the Meshtastic Android, Desktop, and iOS applications powered by KMP (Kotlin Multiplatform). + +Use the sidebar navigation to browse the **User Guide** for app features and the **Developer Guide** for contributing to the project. + +--- + +## Quick Links + +| Guide | Beskrivelse | +| --------------------------------------------------------------------- | -------------------------------------------------------------- | +| [Getting Started](user/onboarding) | Connect your first radio and send a message | +| [Messages & Channels](user/messages-and-channels) | Channel broadcasts, direct messages, reactions, and encryption | +| [Nodes](user/nodes) | Understanding the mesh network node list | +| [Signal Meter](user/signal-meter) | How the LoRa signal quality meter works | +| [Units & Locale](user/units-and-locale) | How temperatures, distances, and times adapt to your region | +| [Desktop App](user/desktop) | Linux, macOS, and Windows desktop usage | +| [Architecture](developer/architecture) | App architecture overview for contributors | +| [Contributing](developer/contributing) | Branch naming, PR workflow, and verification commands | + +--- + +> This documentation is served from the same markdown source that powers the in-app **Help & Documentation** browser. diff --git a/docs/no-rNO/user/connections.md b/docs/no-rNO/user/connections.md new file mode 100644 index 000000000..499280c2c --- /dev/null +++ b/docs/no-rNO/user/connections.md @@ -0,0 +1,125 @@ +--- +title: Connections +nav_order: 2 +last_updated: 2026-05-13 +description: Connect your phone or desktop to a Meshtastic radio via Bluetooth, USB, or TCP/IP. +aliases: + - bluetooth + - usb + - tcp + - pairing +--- + +# Connections + +Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node. + +## Bluetooth (BLE) + +Bluetooth Low Energy is the default and most common connection method on Android. + +### Pairing a Device + +1. Ensure your Meshtastic radio is powered on and in pairing mode. +2. Open the app and navigate to **Connections**. +3. Tap **Scan for Devices** — nearby Meshtastic radios will appear. +4. Select your device from the list. +5. Accept the Bluetooth pairing prompt if shown. + +![Device list item](/assets/screenshots/connections_bluetooth_scan.png) + +You can filter devices by transport type using the filter chips at the top: + +![Transport filter chips](/assets/screenshots/connections_transport_filters.png) + +> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. + +### Connection Status + +| Icon | State | Beskrivelse | +| ---- | -------------- | ----------------------------- | +| 🟢 | Connected | Active radio link established | +| 🟡 | Connecting | Handshake in progress | +| 🔴 | Frakoblet | No active connection | +| ⚪ | Not configured | No device selected | + +When connecting, a status indicator shows the current connection state: + +![Connecting status](/assets/screenshots/connections_connecting.png) + +If no devices are found, the app shows an empty state with instructions: + +![No devices found](/assets/screenshots/connections_empty_state.png) + +### Troubleshooting Bluetooth + +- **Device not found:** Toggle Bluetooth off/on, ensure location is enabled. +- **Connection drops:** Move closer to the radio; check for interference. +- **Pairing rejected:** Forget the device in Android Bluetooth settings and retry. + +## USB Serial + +USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable. + +### Setup + +1. Connect your radio via USB cable to your device. +2. The app will prompt for USB permission — tap **Allow**. +3. The connection is established automatically. + +> ⚠️ **Note:** USB connections require OTG support on Android devices. + +## TCP/IP (WiFi) + +Some Meshtastic radios support WiFi connectivity, allowing TCP-based connections. + +### Configuration + +1. Connect your radio to a WiFi network via the radio's web interface or settings. +2. In the app, go to **Connections → TCP**. +3. Enter the radio's IP address and port (default: 4403). +4. Tap **Connect**. + +![WiFi scanning for devices](/assets/screenshots/connections_wifi_scanning.png) + +When a device is found, it appears in the connection list: + +![WiFi device found](/assets/screenshots/connections_wifi_device_found.png) + +A successful connection is confirmed with a status indicator: + +![WiFi connection success](/assets/screenshots/connections_wifi_success.png) + +### When to Use TCP + +- Radio is on the same local network +- Testing with a simulated radio +- Environments where Bluetooth has interference issues + +## Reconnection Behavior + +The app reconnects to the **last selected device** on startup. You can manually switch transports from the connections screen at any time. + +To disconnect from a radio, use the disconnect button on the connections screen: + +![Disconnect from radio](/assets/screenshots/connections_disconnect.png) + +## Desktop Connections + +On Desktop (Linux/macOS/Windows), the app supports: + +- **Bluetooth (BLE)** — via the Kable library; works on macOS, Linux, and Windows +- **USB Serial** — primary wired connection method +- **TCP/IP** — for network-connected radios + +See [Desktop App](desktop) for platform-specific details and keyboard shortcuts. + +## Related Topics + +- [Getting Started](onboarding) — first-launch setup and permissions +- [Settings — Radio & User](settings-radio-user) — Bluetooth and network configuration +- [Desktop App](desktop) — desktop-specific connection details +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — full list of compatible radios on meshtastic.org + +--- + diff --git a/docs/no-rNO/user/desktop.md b/docs/no-rNO/user/desktop.md new file mode 100644 index 000000000..a688679eb --- /dev/null +++ b/docs/no-rNO/user/desktop.md @@ -0,0 +1,147 @@ +--- +title: Desktop App +nav_order: 14 +last_updated: 2026-05-13 +description: Install and use the Meshtastic Desktop app on Linux, macOS, and Windows — connections, feature parity, and keyboard shortcuts. +aliases: + - desktop + - linux + - macos + - windows + - jvm +--- + +# Desktop App + +The Meshtastic Desktop application provides the same mesh communication features on Linux, macOS, and Windows. + +## Overview + +The Desktop app shares its core codebase with the Android app through Kotlin Multiplatform (KMP). Most features work identically across platforms. + +## Installation + +### Linux + +- Download the `.deb` or `.AppImage` package from the releases page +- Or build from source using `./gradlew :desktopApp:run` + +### macOS + +- Download the `.dmg` package from releases +- Or build from source + +### Windows + +- Download the `.msi` installer from releases +- Or build from source + +## Connecting Your Radio + +### USB Serial (Primary) + +The most reliable connection method on Desktop: + +1. Connect your Meshtastic radio via USB cable. +2. The app should detect the serial port automatically. +3. If not detected, select the correct serial port from the connections menu. + +### TCP/IP + +For network-connected radios: + +1. Enter the radio's IP address and port (default: 4403). +2. Click **Connect**. + +### Bluetooth (BLE) + +Bluetooth Low Energy is supported on Desktop via the [Kable](https://github.com/JuulLabs/kable) library: + +1. Ensure your system has a Bluetooth adapter. +2. The app scans for nearby Meshtastic radios automatically. +3. Select your device from the connections screen. + +## Feature Parity + +| Feature | Android | Desktop | Notes | +| ---------------------------------------- | ------- | ------- | -------------------------- | +| Messaging | ✓ | ✓ | Full parity | +| Node List | ✓ | ✓ | Full parity | +| Map | ✓ | ✓ | Full parity | +| Settings | ✓ | ✓ | Full parity | +| Bluetooth (BLE) | ✓ | ✓ | Via Kable on desktop | +| Firmware Update OTA | ✓ | ✗ | Use web flasher | +| Notifications | ✓ | ✓ | Native OS notifications | +| Widgets | ✓ | ✗ | Android-only | +| AI Assistant (Chirpy) | ✓\* | ✗ | Google flavor Android only | + +\*Chirpy AI requires Android 14+ on Google flavor builds with supported hardware. + +## UI Differences + +The Desktop app uses the same Compose Multiplatform UI with adaptations for larger screens and desktop interaction. + +### Keyboard Shortcuts + +| Shortcut | Action | +| ------------------- | --------------------------- | +| **⌘Q** / **Ctrl+Q** | Quit the application | +| **⌘,** / **Ctrl+,** | Open Settings | +| **⌘1** / **Ctrl+1** | Switch to Conversations tab | +| **⌘2** / **Ctrl+2** | Switch to Nodes tab | +| **⌘3** / **Ctrl+3** | Switch to Map tab | +| **⌘4** / **Ctrl+4** | Switch to Connections tab | + +### Window & System Tray + +- **Window resizing** — responsive layout adapts to window dimensions +- **System tray** — minimize to system tray for background mesh operation +- **Tray menu** — right-click the tray icon to show window or quit +- **Mouse interaction** — hover states and standard desktop navigation + +### Notification Preferences + +The Desktop app provides in-app toggles for controlling which notifications are shown — messages, new nodes, and low battery alerts. Access these from **Settings → Notifications** within the app. + +## Built-in Documentation Browser + +The Desktop app includes a built-in documentation browser for quick access to help content without leaving the application. + +![Docs browser with table of contents](/assets/screenshots/docs-browser_toc.png) + +The browser supports full-text search across all documentation: + +![Searching the docs browser](/assets/screenshots/docs-browser_search.png) + +Individual doc pages render with full formatting: + +![A documentation page](/assets/screenshots/docs-browser_page.png) + +## Building from Source + +```bash +git clone https://github.com/meshtastic/Meshtastic-Android.git +cd Meshtastic-Android +git submodule update --init +./gradlew :desktopApp:run +``` + +Requirements: + +- JDK 21 +- No Android SDK required for desktop-only builds + +## Known Limitations + +- No OTA firmware updates (use web flasher) +- Some Android-specific features (widgets, specific notification channels) are unavailable +- Performance may vary on low-spec hardware running Compose Desktop +- BLE bonding is not yet supported on desktop (pairing works without bonding) + +## Related Topics + +- [Connections](connections) — connection methods overview +- [Firmware Updates](firmware) — use the [Web Flasher](https://flasher.meshtastic.org) for desktop firmware updates + +--- + diff --git a/docs/no-rNO/user/discovery.md b/docs/no-rNO/user/discovery.md new file mode 100644 index 000000000..fe696299b --- /dev/null +++ b/docs/no-rNO/user/discovery.md @@ -0,0 +1,114 @@ +--- +title: Discovery +nav_order: 12 +last_updated: 2026-05-13 +description: Explore your mesh network — traceroute paths, neighbor maps, and node discovery tools. +aliases: + - mesh-discovery + - local-discovery + - network-scan + - traceroute + - neighbor-info +--- + +# Discovery + +Discovery tools help you understand **how** your mesh network is connected — which nodes can hear each other, what paths messages take, and where bottlenecks or weak links exist. + +> 💡 **Tip:** You don't need a dedicated "discovery mode" to start exploring your mesh. The tools below are available right now from the node list and node detail screens. + +--- + +## Traceroute + +Traceroute reveals the exact path a message takes from your node to any other node on the mesh. It's the single most useful tool for debugging connectivity problems. + +### Running a Traceroute + +1. Navigate to **Nodes** and tap the node you want to trace. +2. On the node detail screen, tap **Traceroute**. +3. The app sends a traceroute request and waits for the response. +4. Results display each hop in order, with signal quality at every step. + +### Reading the Results + +A traceroute result looks like this: + +``` +You → Node A (SNR: 8.5, RSSI: -95) → Node B (SNR: 5.2, RSSI: -108) → Target +``` + +Each hop represents a relay node that forwarded the message. The SNR and RSSI values at each hop tell you about the link quality on that specific segment. + +| What to look for | What it means | +| -------------------------------------------------------------------------- | --------------------------------------------------------------------------- | +| All hops show Good SNR (> 5 dB) | Healthy path — messages flow reliably | +| One hop shows Bad SNR (< 0 dB) | Weak link — this relay segment is fragile | +| Many hops (4+) | Long path — consider repositioning a node to shorten it | +| Different path on retry | Mesh is adapting — multiple routes exist (this is good!) | + +> 💡 **Tip:** Run traceroute several times over a few minutes. If the path changes, your mesh has redundant routes — a sign of a well-connected network. + +### Troubleshooting with Traceroute + +- **"No route found"** — The target node may be offline, out of range, or on a different channel. Check that both nodes share at least one channel with the same encryption key. +- **Traceroute times out** — The path may be too long (exceeds hop limit) or a relay node is congested. Try increasing the hop limit in **Settings → LoRa Config**. +- **Asymmetric paths** — A traceroute from A→B may take a different path than B→A. This is normal — radio propagation is not always symmetric. + +--- + +## Neighbor Info + +The Neighbor Info module lets each node broadcast a list of the nodes it can **directly hear** (single-hop). When multiple nodes share their neighbor lists, you can piece together a topology map of the entire mesh. + +### Enabling Neighbor Info + +1. Navigate to **Settings → Module Config → Neighbor Info**. +2. Enable the module. +3. Set the broadcast interval (default: 900 seconds / 15 minutes). + +Once enabled, your node periodically broadcasts its neighbor table. Other nodes with Neighbor Info enabled do the same. + +### Viewing Neighbor Data + +- Open any node's detail screen and look for the **Neighbors** section. +- Each neighbor entry shows the node that was directly heard and its signal quality. +- Combine neighbor data from multiple nodes to understand the full mesh topology. + +> ⚠️ **Note:** Neighbor Info increases airtime usage because every enabled node periodically broadcasts its neighbor list. On busy meshes with many nodes, consider longer broadcast intervals (3600 seconds or more) to avoid congestion. + +--- + +## Node List as a Discovery Tool + +The node list itself is a powerful discovery tool when you use its filtering and sorting features effectively. + +### Finding New Nodes + +- Sort by **Last heard** to see the most recently active nodes at the top. +- Enable **Include unknown** to see nodes that have appeared on the mesh but haven't sent user info yet — these are often newly powered-on devices. + +### Assessing Connectivity + +- Sort by **Hops away** to see which nodes are directly reachable (0 hops) versus relayed. +- Sort by **Distance** to find nearby nodes and verify they're reachable. +- Use **Exclude MQTT** to focus on nodes reachable over radio (not via internet bridge). + +### Infrastructure Audit + +- Disable **Exclude infrastructure** to see Router, Repeater, Router Late, and Client Base nodes. +- Check their signal quality and last-heard times to verify your infrastructure nodes are healthy. + +See [Nodes](nodes) for full details on filtering and sorting options. + +--- + +## Tips for Mesh Exploration + +- **Start with traceroute** — it gives you immediate, actionable information about a specific path. +- **Enable Neighbor Info on key nodes** — especially routers and repeaters, to build a picture of the backbone. +- **Check the map** — node positions on the [Map](map-and-waypoints) combined with signal data help you understand why some links are strong and others are weak. +- **Compare signal over time** — use the [Signal Meter](signal-meter) guide to interpret SNR and RSSI values correctly. + +--- + diff --git a/docs/no-rNO/user/firmware.md b/docs/no-rNO/user/firmware.md new file mode 100644 index 000000000..489ce6429 --- /dev/null +++ b/docs/no-rNO/user/firmware.md @@ -0,0 +1,114 @@ +--- +title: Firmware Updates +nav_order: 13 +last_updated: 2026-05-13 +description: Update your radio firmware over Bluetooth — OTA process, version channels, pre-flight checks, and recovery. +aliases: + - firmware + - update + - ota + - flash +--- + +# Firmware Updates + +Keep your Meshtastic radio up to date with the latest firmware for new features, bug fixes, and security improvements. + +## Checking for Updates + +1. Navigate to **Settings → Firmware Update** or tap the firmware notification if shown. +2. The app checks for available firmware versions. +3. Available updates show the version number and changelog summary. + +## Update Methods + +### OTA (Over-The-Air) via Bluetooth + +The most common update method for Android users: + +1. Ensure your radio is connected via Bluetooth. +2. Navigate to the Firmware Update screen. +3. Select the desired firmware version. +4. Tap **Update** to begin the OTA process. +5. Wait for the update to complete — **do not disconnect** during the update. + +![Firmware checking for updates](/assets/screenshots/firmware_checking.png) + +> ⚠️ **Warning:** Interrupting a firmware update can brick your device. Ensure your radio has sufficient battery (>50% recommended) and maintain Bluetooth proximity during the entire process. + +![Firmware disclaimer](/assets/screenshots/firmware_disclaimer.png) + +### USB Flashing + +For recovery or when OTA is unavailable: + +- Use the [Meshtastic Web Flasher](https://flasher.meshtastic.org) +- Or the [Meshtastic CLI tool](https://meshtastic.org/docs/getting-started/flashing-firmware) on desktop + +## Version Channels + +| Kanal | Beskrivelse | +| ------ | ------------------------------------------- | +| Stable | Recommended for most users; tested releases | +| Alpha | Preview releases; may contain bugs | + +## Pre-Update Checklist + +Before updating: + +- [ ] Battery > 50% +- [ ] Stable Bluetooth connection +- [ ] Note your current settings (they may reset on major version changes) +- [ ] Check the release notes for breaking changes + +## Post-Update + +After a successful update: + +- The radio will reboot automatically +- Bluetooth connection will re-establish +- Verify your settings are intact +- Check the firmware version in **Settings → About** + +![Firmware update success](/assets/screenshots/firmware_success.png) + +## Troubleshooting + +### Update Stuck + +If the update appears frozen: + +- Wait at least 5 minutes before intervening +- If truly stuck, power-cycle the radio +- Attempt the update again + +![Firmware update error](/assets/screenshots/firmware_error.png) + +### Device Won't Boot After Update + +If your device fails to boot: + +1. Try connecting via USB to a computer +2. Use the web flasher in recovery/DFU mode +3. Flash a known-good firmware version +4. Check the Meshtastic Discord for device-specific recovery steps + +### Compatibility Warnings + +The app may show warnings when: + +- Connected radio firmware is below minimum supported version +- Major version mismatch between app and firmware +- Deprecated features need migration + +> ⚠️ **Important:** Always update the Meshtastic app before or alongside firmware updates to ensure compatibility. + +## Related Topics + +- [Connections](connections) — reconnecting after a firmware update +- [Flashing firmware guide](https://meshtastic.org/docs/getting-started/flashing-firmware) — full firmware flashing walkthrough on meshtastic.org +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — check firmware compatibility by device +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/no-rNO/user/map-and-waypoints.md b/docs/no-rNO/user/map-and-waypoints.md new file mode 100644 index 000000000..af1f97b19 --- /dev/null +++ b/docs/no-rNO/user/map-and-waypoints.md @@ -0,0 +1,116 @@ +--- +title: Map & Waypoints +nav_order: 6 +last_updated: 2026-05-13 +description: View node positions on the map, create and share waypoints, and manage position sharing and privacy. +aliases: + - map + - waypoints + - gps + - location +--- + +# Map & Waypoints + +The Map screen shows the geographic positions of nodes on your mesh, along with shared waypoints. + +## Map View + +The map displays: + +- **Node positions** — colored markers for each node reporting location +- **Waypoints** — shared points of interest +- **Your position** — your current GPS location + +### Node Markers + +Node markers on the map indicate: + +| Color | Meaning | +| ------ | ---------------------------------------------- | +| Green | Online (heard recently) | +| Yellow | Away (heard within 2 hours) | +| Gray | Offline (stale position) | +| Blue | Your own node | + +### Map Controls + +- **Zoom** — pinch or use +/- buttons +- **Pan** — drag to explore +- **Center** — select the location button to center on your position +- **Node tap** — tap a node marker to view details + +The floating toolbar provides quick access to compass, layer switching, node filters, refresh, and location tracking. Tap the compass to reorient north-up, or tap the location button to center on your current position. + +![Map controls overlay](/assets/screenshots/map_controls_overlay.png) + +## Waypoints + +Waypoints are shared geographic points of interest that all mesh members can see. + +### Creating a Waypoint + +1. Long-press on the map at the desired location. +2. Enter a name and optional description. +3. Choose an icon/emoji for the waypoint. +4. Tap **Send** to share with the mesh. + +### Waypoint Properties + +| Property | Beskrivelse | +| ----------- | ------------------------------------------------------- | +| Navn | Short identifier (max 30 characters) | +| Beskrivelse | Optional longer description | +| Icon | Visual marker emoji on the map | +| Låst | If locked, only the creator can edit or delete | +| Expiration | Optional auto-remove time | + +### Waypoint Expiration + +Waypoints can be set to expire automatically: + +- **Never** (default) — waypoint remains until manually deleted +- **Timed** — waypoint is automatically removed after the specified duration (e.g., "remove after 2 hours"). Useful for temporary markers like rally points, hazards, or meeting locations. + +Expired waypoints are automatically hidden from the map so they don't clutter the display. The expiration countdown begins when the waypoint is created, not when other nodes receive it. + +### Managing Waypoints + +- Tap a waypoint on the map to view its details and coordinates +- Edit or delete waypoints you created +- **Locked waypoints** cannot be modified or deleted by other nodes — only the original creator can change them +- Unlocked waypoints can be edited by any mesh member + +## Position Sharing + +### Enabling Position Sharing + +Your node shares its GPS position based on: + +- **Fixed interval** — broadcast position at regular intervals +- **Smart position** — broadcast when movement exceeds a threshold +- **Manual** — only share when explicitly requested + +Configure position behavior in **Settings → Position**. + +### Privacy Considerations + +> 🔒 **Privacy:** Position data is broadcast to all nodes on your channel. If you don't want your location shared, disable GPS position in settings or use a fixed/fake position. + +## Map Sources + +The app supports multiple map tile sources: + +- OpenStreetMap (default) +- Satellite imagery (where available) +- Offline tiles (download map areas for offline use) + +## Related Topics + +- [Nodes](nodes) — view and filter your node list +- [Node Metrics](node-metrics) — signal quality and position history for individual nodes +- [Discovery](discovery) — traceroute and neighbor info for understanding mesh topology +- [Units & Locale](units-and-locale) — distance and coordinate display formats + +--- + diff --git a/docs/no-rNO/user/messages-and-channels.md b/docs/no-rNO/user/messages-and-channels.md new file mode 100644 index 000000000..b772a7751 --- /dev/null +++ b/docs/no-rNO/user/messages-and-channels.md @@ -0,0 +1,159 @@ +--- +title: Messages & Channels +nav_order: 3 +last_updated: 2026-05-13 +description: Send and receive messages, manage channels, configure encryption, and use quick chat, reactions, and message actions. +aliases: + - channels + - direct-messages + - messaging + - conversations +--- + +# Messages & Channels + +Meshtastic supports two communication modes: **channel broadcasts** and **direct messages**. + +## Channels + +Channels are shared communication groups. All nodes configured with the same channel key can read and send messages on that channel. + +### Default Channel + +Every Meshtastic device comes with a default **LongFast** channel. This is an unencrypted channel used for general mesh communication. + +### Channel Security + +Channels support multiple encryption levels: + +| Icon | Security Level | Beskrivelse | +| ---- | ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------- | +| 🔒 | PSK (256-bit AES) | Fully encrypted with a strong pre-shared key. Only nodes with the matching key can read messages. | +| 🔐 | PSK (128-bit AES) | Encrypted with a shorter key. Secure for most uses but 256-bit is preferred for sensitive data. | +| 🔓 | Default / Open | Uses the well-known default key. **Any Meshtastic device** on the same preset can read these messages. | +| ⚠️ | Insecure + Position | Open channel that also broadcasts your GPS position. Use with caution in public meshes. | + +> 🔒 **Security Tip:** 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. + +### Adding a Channel + +1. Navigate to **Settings → Channels**. +2. Tap **Add Channel** or scan a QR code. +3. Configure the channel name and encryption key. +4. Share the channel URL/QR code with others who need access. + +Tapping a channel shows its details and sharing options. + +## Direct Messages + +Direct messages (DMs) are point-to-point encrypted communications between two specific nodes. + +### Sending a Direct Message + +1. Open the **Messages** tab. +2. Select a node from your contacts list or tap a node in the node list. +3. Type your message and tap **Send**. + +### Message States + +| State | Icon | Meaning | +| --------------------------------- | ---- | ----------------------------------------------------------------------------------------------------------------- | +| Queued | ⏳ | Message waiting to be sent | +| En route | ✓ | Delivered to the radio, awaiting acknowledgment | +| Delivered | ✓✓ | Acknowledgment received from recipient | +| Received | ✓ | Message received from the mesh (incoming) | +| S&F Routing | 🔗 | Store & Forward: message being routed through an S&F node | +| S&F Confirmed | 🔗 | Store & Forward: delivery confirmed via S&F node | +| Feil | ✗ | Delivery failed after retries | + +### Delivery Errors + +When a message fails to deliver, the error indicator shows what went wrong: + +| Feil | Meaning | What to Do | +| ------------------- | ---------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| No Route | No path exists to the destination node | The recipient may be offline or out of mesh range. Try later or move closer. | +| Got NAK | The next-hop node refused to relay | The relay node may be congested. Wait and retry. | +| Tidsavbrudd | No acknowledgment within retry window | The recipient may be just out of range. Try increasing hop limit or moving to a better position. | +| Ingen grensesnitt | No radio interface available to send | Check that your radio is connected and the channel is configured. | +| Max Retransmit | All retry attempts exhausted | The mesh path is unreliable. Try a different channel or wait for conditions to improve. | +| Ingen Kanal | The destination channel doesn't exist | Verify both nodes share the same channel configuration. | +| Too Large | Message exceeds maximum payload size | Shorten your message (max ~230 characters). | +| No Response | Node received message but didn't respond | The recipient's radio may be busy or in low-power sleep mode. | +| Duty Cycle Limit | Regional airtime limit reached | Your radio has used its allowed transmit time. Wait for the duty cycle window to reset (typically 1 hour in EU regions). | +| Ugyldig Forespørsel | Malformed or invalid message | This usually indicates a software bug. Try restarting the app. | + +> 💡 **Tip:** 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. + +## Message Features + +### Quick Chat + +Pre-configured messages for rapid communication: + +- Access via the Quick Chat button in the message input area +- Choose from built-in phrases or custom messages +- Customize quick chat messages in **Settings → Quick Chat** +- Useful when typing is impractical (gloves, small screen, urgent) + +![Quick chat option](/assets/screenshots/messages_quick_chat.png) + +The channel list shows each channel with its latest message preview. + +### Message Bubbles + +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. + +### Reactions + +React to messages with emoji: + +- **Long-press** a message to open the actions menu +- Tap **Add Reaction** to choose an emoji +- Reactions appear below the message bubble +- Multiple users can react to the same message +- React to your own messages or others' messages + +![Emoji reaction badges displayed beneath a message](/assets/screenshots/messages_reaction.png) + +> 💡 **Tip:** Reactions are lightweight — they use minimal mesh bandwidth compared to full text messages. + +### Message Actions + +Long-press any message to access: + +- **Copy** — copy message text to clipboard +- **Reply** — quote the message in your response +- **React** — add an emoji reaction +- **Delete** — remove a message you sent (local deletion) + +### Message Priority + +Messages are queued and transmitted based on priority: + +1. Emergency/alert messages (highest) +2. Direct messages +3. Channel broadcasts (lowest) + +### Message Limits + +- **Maximum length:** 237 bytes (approximately 230 characters for ASCII text) +- **Rate limiting:** The mesh enforces airtime fairness; heavy message volume may be throttled +- **Delivery:** Messages are retried automatically if no acknowledgment is received + +## Best Practices + +- Use channels for group coordination +- Use direct messages for private person-to-person communication +- Keep messages short — mesh bandwidth is limited +- Configure encryption for sensitive communications + +## Related Topics + +- [Nodes](nodes) — tap a node to start a direct message +- [Settings — Radio & User](settings-radio-user) — configure channel encryption and presets +- [MQTT](mqtt) — bridge channel messages to the internet +- [Channel configuration](https://meshtastic.org/docs/configuration/radio/channels) — detailed channel settings on meshtastic.org + +--- + diff --git a/docs/no-rNO/user/mqtt.md b/docs/no-rNO/user/mqtt.md new file mode 100644 index 000000000..4209dc753 --- /dev/null +++ b/docs/no-rNO/user/mqtt.md @@ -0,0 +1,137 @@ +--- +title: MQTT +nav_order: 11 +last_updated: 2026-05-13 +description: Bridge your mesh to the internet — MQTT broker setup, encryption layers, and map reporting. +aliases: + - mqtt + - internet-bridge + - broker +--- + +# MQTT + +MQTT bridges your Meshtastic mesh network to the internet, enabling long-range communication beyond radio range. + +## Overview + +The MQTT module connects your node to an MQTT broker, allowing: + +- Messages to reach nodes on different physical meshes via the internet +- Integration with home automation and monitoring systems +- Publishing node positions to the public Meshtastic map +- Custom data pipelines for logging and alerting + +## How It Works + +``` +[Your Node] → Radio → [Gateway Node with WiFi] → MQTT Broker → [Remote Gateway] → Radio → [Remote Node] +``` + +A gateway node with internet access (WiFi or Ethernet) publishes mesh messages to an MQTT topic. Remote gateways subscribed to the same topic inject those messages into their local mesh. + +## Configuration + +### Enabling MQTT + +1. Navigate to **Settings → Module Config → MQTT**. +2. Enable the MQTT module. +3. Configure the broker connection: + +![MQTT toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | Beskrivelse | Default | +| --------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------- | +| Server Address | MQTT broker hostname | mqtt.meshtastic.org | +| Username | Broker authentication | meshdev | +| Password | Broker authentication | large4cats | +| Root Topic | Base topic for messages | msh | +| Encryption | Encrypt MQTT payload | Enabled | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON packet support has been removed from firmware; this field is ignored | Disabled | +| TLS | Secure connection to broker | Disabled | +| Map Reporting | Report position to public map | Disabled | + +### Default Meshtastic Broker + +The community maintains a public broker at `mqtt.meshtastic.org`. This is intended for general use and testing. + +> 🔒 **Privacy:** Messages on the public broker are readable by anyone subscribed. Always use channel encryption for private communications. + +### Private Broker + +For better privacy and control, you can run your own MQTT broker: + +- Mosquitto (lightweight, open-source) +- HiveMQ +- EMQX + +Configure your node to point to your private broker with appropriate credentials. + +## Map Reporting + +When Map Reporting is enabled, your node publishes its position to the Meshtastic community map: + +- Visible at [meshmap.net](https://meshmap.net) and similar community map services +- Only position and node info are shared +- Disable this if you don't want your location publicly visible + +## Uplink vs Downlink + +| Direction | Beskrivelse | +| ------------ | -------------------------------- | +| **Uplink** | Messages from mesh → MQTT broker | +| **Downlink** | Messages from MQTT broker → mesh | + +Configure per-channel which directions are active to control message flow and airtime usage. + +## Message Formats + +MQTT uses protobuf message format: + +| Format | Beskrivelse | Use case | +| ------------ | ----------------------------------- | -------------------------- | +| **Protobuf** | Binary Meshtastic protobuf encoding | Node-to-node mesh bridging | + +> ⚠️ **Note:** JSON output support was removed from firmware. The `json_enabled` setting is still visible in the app for legacy compatibility but has no effect on current firmware versions. + +## Encryption & Privacy + +Understanding the layered encryption model: + +1. **Channel encryption** happens on the mesh _before_ MQTT. If your channel has a PSK, the MQTT payload is already encrypted — the broker and any subscribers see only the ciphertext. +2. **MQTT encryption** (the module setting) adds an additional encryption layer for transit to the broker. This protects metadata and routing information. +3. **TLS** encrypts the TCP connection to the broker itself, preventing network-level eavesdropping. + +> 🔒 **Important:** The default public channel has a well-known key. Messages on the default channel sent via MQTT are effectively **unencrypted** — anyone can decode them. Always use a custom PSK for private communications. + +## Best Practices + +- Use channel-level encryption (PSK) on channels that bridge to MQTT +- Don't enable MQTT on nodes without internet access (it will buffer and waste memory) +- Use a private broker for sensitive deployments +- Be mindful of airtime when downlinking messages from busy MQTT topics — every downlinked message consumes radio airtime on your local mesh +- Consider enabling uplink-only if you only need to monitor your mesh remotely without injecting messages back + +## Troubleshooting + +### MQTT Not Connecting + +- **Check WiFi** — the gateway node must have an active internet connection (WiFi or Ethernet). MQTT does not work over the LoRa radio link itself. +- **Verify credentials** — incorrect username or password will silently fail on most brokers. Double-check for trailing spaces. +- **Firewall** — port 1883 (MQTT) or 8883 (MQTT+TLS) must be open. Some networks block non-standard ports. +- **DNS resolution** — if using a custom broker hostname, verify the node can resolve it. Try the broker's IP address directly. + +### Messages Not Bridging + +- **Check uplink/downlink settings** — if only uplink is enabled, messages flow from mesh to MQTT but not back. Enable downlink on the receiving gateway. +- **Channel mismatch** — both gateways must share the same channel with the same PSK. A mismatch means messages are encrypted with different keys and appear as garbage. +- **Topic mismatch** — ensure both gateways use the same root topic. The default `msh` works for the public broker. + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — MQTT module configuration reference +- [Messages & Channels](messages-and-channels) — channel encryption and PSK setup +- [MQTT integration guide](https://meshtastic.org/docs/software/integrations/mqtt) — detailed MQTT documentation on meshtastic.org + +--- + diff --git a/docs/no-rNO/user/node-metrics.md b/docs/no-rNO/user/node-metrics.md new file mode 100644 index 000000000..38eaf7f6c --- /dev/null +++ b/docs/no-rNO/user/node-metrics.md @@ -0,0 +1,130 @@ +--- +title: Node Metrics +nav_order: 5 +last_updated: 2026-05-13 +description: Telemetry dashboards for each mesh node — device health, environment sensors, signal quality, power, traceroute, and position history. +aliases: + - metrics + - telemetry + - device-metrics + - signal +--- + +# Node Metrics + +The node detail screen provides comprehensive telemetry and metrics for each node on your mesh. + +## Device Metrics + +Basic operating information reported by each node: + +| Metric | Beskrivelse | +| --------------- | ----------------------------------- | +| Battery Level | Current battery percentage | +| Voltage | Battery voltage reading | +| Kanalutnyttelse | Percentage of airtime consumed | +| Airtime | Transmission time used by this node | +| Uptime | Time since last reboot | + +Device metrics are displayed as individual cards with trend sparklines showing battery level, voltage, channel utilization, airtime, and uptime over time. + +> 💡 **Tip:** Tap any metric card to expand it into a full chart with historical data points. Pinch to zoom the time axis. + +## Environment Metrics + +Environmental sensor data (requires compatible hardware): + +| Metric | Sensor Examples | +| ------------------------------------ | --------------------- | +| Temperatur | BME280, BME680, SHT31 | +| Luftfuktighet | BME280, BME680, SHT31 | +| Barometric Pressure | BME280, BMP280 | +| Gas Resistance | BME680 | +| IAQ (Air Quality) | BME680 | + +Environment metrics are charted over time for easy trend analysis — temperature, humidity, and pressure each get their own line chart with the measurement unit displayed on the Y axis. + +> 💡 **Tip:** Environment metrics require a sensor connected to the remote node. Not all nodes report environmental data. See [Telemetry & Sensors](telemetry-and-sensors) for a full list of supported sensors. + +## Signal Metrics + +Radio signal quality information: + +| Metric | Beskrivelse | +| --------- | ----------------------------------------------------------------------------- | +| SNR | Signal-to-Noise Ratio (higher is better) | +| RSSI | Received Signal Strength Indicator (closer to 0 is better) | +| Hop Count | Number of mesh hops for last message | + +### Signal Quality Reference + +| SNR Range | Quality | +| --------------------------------- | ----------- | +| > 10 dB | Excellent | +| 0 to 10 dB | Godt | +| -10 to 0 dB | Middelmådig | +| < -10 dB | Poor | + +## Power Metrics + +Power management telemetry (requires INA sensor or compatible hardware): + +| Metric | Beskrivelse | +| ----------- | ----------------------- | +| Bus Voltage | Supply voltage | +| Current | Power draw in milliamps | +| Power | Calculated wattage | + +## Traceroute + +Traceroute shows the path a message takes through the mesh: + +1. From the node detail screen, tap **Traceroute**. +2. The app sends a traceroute request to the target node. +3. Results show each hop with SNR/RSSI values. + +### Reading Traceroute Results + +``` +You → Node A (SNR: 8.5) → Node B (SNR: 5.2) → Target +``` + +Each hop represents a relay node that forwarded the message. + +## Posisjonslogg + +Historical position data for nodes that share their location: + +- GPS coordinates +- Altitude +- Speed (if moving) +- Timestamp for each position report + +## Neighbor Info + +Shows which nodes a given node can directly hear, useful for understanding mesh topology. + +## Viewing Metrics + +1. Navigate to **Nodes**. +2. Tap the node you want to inspect. +3. Select the metric category from the detail tabs. + +![Node detail — local device](/assets/screenshots/nodes_detail_local.png) + +The position tab shows location data for nodes that share GPS: + +![Position inline content](/assets/screenshots/nodes_position.png) + +> ⚠️ **Note:** Metrics are only available when they have been reported by the remote node. Metrics update at intervals configured on each node's telemetry settings. + +## Related Topics + +- [Nodes](nodes) — node list, filtering, and sorting +- [Telemetry & Sensors](telemetry-and-sensors) — supported sensors and configuration +- [Signal Meter](signal-meter) — how signal quality is calculated from SNR and RSSI +- [Discovery](discovery) — traceroute details and neighbor info +- [Units & Locale](units-and-locale) — temperature, distance, and speed display formats + +--- + diff --git a/docs/no-rNO/user/nodes.md b/docs/no-rNO/user/nodes.md new file mode 100644 index 000000000..13cedf8cf --- /dev/null +++ b/docs/no-rNO/user/nodes.md @@ -0,0 +1,152 @@ +--- +title: Nodes +nav_order: 4 +last_updated: 2026-05-13 +description: Browse, filter, and sort mesh nodes — view details, signal quality, roles, and quick actions. +aliases: + - node-list + - mesh-nodes + - peers +--- + +# Nodes + +The Nodes screen displays all devices visible on your mesh network. + +## Node List + +The node list shows every node your radio has heard, including: + +- **Node name** — user-configured long name +- **Short name** — 4-character identifier +- **Signal quality** — last heard signal strength +- **Last heard** — time since last communication +- **Distance** — estimated distance (if positions are shared) +- **Battery** — remote node battery level (if telemetry is enabled) + +### Node Status Indicators + +| Badge | Meaning | +| ---------- | ------------------------------------- | +| 🟢 Online | Node heard within the last 15 minutes | +| 🟡 Away | Node heard within the last 2 hours | +| 🔴 Offline | Node not heard for over 2 hours | +| ⭐ Favorite | Node marked as favorite by the user | + +### Node Roles + +Nodes can be configured with different roles that affect their mesh behavior: + +| Role | Beskrivelse | +| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Client | Standard end-user device | +| Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | +| Client Mute | Receives but doesn't retransmit | +| Client Hidden | Like Client Mute, plus hides from node list | +| Router | Prioritizes message forwarding; stays awake to relay | +| Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | +| ~~Router Client~~ | ⚠️ **Deprecated** (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | +| ~~Repeater~~ | ⚠️ **Deprecated** (removed in firmware 2.7.11) — no longer selectable; use Router instead | +| Tracker | Optimized for position reporting at regular intervals | +| Sensor | Optimized for telemetry reporting | +| TAK | Interoperates with TAK systems (sends/receives CoT) | +| TAK Tracker | TAK position reporting only | +| Lost & Found | Continuous position beacon for recovery | + +### Choosing a Role + +Most users should keep the default **Client** role. Consider a different role when: + +- **Router** — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don't use Router on battery-powered handheld devices. +- **Router Late** — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. +- **Client Base** — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. +- **Client Mute** — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only devices or to reduce congestion in dense areas. +- **Tracker** — An unattended device whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. +- **Sensor** — An unattended device reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. +- **TAK / TAK Tracker** — Only needed if interoperating with ATAK/WinTAK systems. See [TAK Integration](tak) for details. + +> 💡 **Tip:** The mesh works best when most nodes are **Client** or **Router**. Too many Mute nodes reduces mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. + +### Encryption Indicators + +Nodes display encryption status icons next to their name: + +| Icon | Meaning | +| ----------- | ------------------------------------------------------------------------------------------------------------------- | +| 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | +| 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | +| ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) | + +> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. + +## Quick Actions + +From the node list, you can: + +- **Tap** a node to view its detail page +- **Long-press** for quick actions: + - Send a direct message + - View on map + - Forespør posisjon + - Mark as favorite + - Traceroute + +## Filtering & Sorting + +### Text Search + +Type in the search field to filter nodes by name or short name. The filter updates in real time as you type. + +### Filter Toggles + +| Filter | Beskrivelse | +| -------------------------- | ---------------------------------------------------------------------------------------------- | +| **Only online** | Show only nodes heard within the last 15 minutes | +| **Only direct** | Show only nodes with direct (non-relayed) connections | +| **Include unknown** | Show nodes that haven't sent user info yet | +| **Exclude infrastructure** | Hide infrastructure-role nodes (Router, Repeater, Router Late, Client Base) | +| **Exclude MQTT** | Hide nodes heard only via MQTT internet bridge | +| **Show ignored** | Show nodes you've previously dismissed or muted | + +### Sort Options + +| Sort | Beskrivelse | +| ------------------------------------------- | ------------------------------------------------------------------ | +| **Last heard** (default) | Most recently heard nodes first | +| **Alphabetical** | Sorted by node long name | +| **Distance** | Nearest nodes first (requires position sharing) | +| **Hops away** | Fewest relay hops first | +| **Channel** | Grouped by channel index | +| **Via MQTT** | Grouped by MQTT vs. radio-heard | +| **Favorites** | Favorited nodes first | + +## Node Detail + +Tapping a node opens the detail view with comprehensive information. See [Node Metrics](node-metrics) for full details on metrics and telemetry. + +![Node detail view](/assets/screenshots/nodes_node_list.png) + +The detail screen includes device info, position, and action buttons: + +![Node detail section](/assets/screenshots/nodes_detail_section.png) + +Inline status indicators show key metrics at a glance: + +| Indicator | Screenshot | +| -------------- | -------------------------------------------------------- | +| Signal quality | ![Signal](/assets/screenshots/nodes_signal_info.png) | +| Battery level | ![Battery](/assets/screenshots/nodes_battery_info.png) | +| Hop count | ![Hops](/assets/screenshots/nodes_hops_info.png) | +| Sist hørt | ![Last heard](/assets/screenshots/nodes_last_heard.png) | +| Distanse | ![Distance](/assets/screenshots/nodes_distance_info.png) | + +## Related Topics + +- [Node Metrics](node-metrics) — detailed telemetry dashboards for each node +- [Messages & Channels](messages-and-channels) — send a direct message to a node +- [Map & Waypoints](map-and-waypoints) — view node positions geographically +- [Discovery](discovery) — traceroute and neighbor info for topology exploration +- [Signal Meter](signal-meter) — understand what the signal bars mean + +--- + diff --git a/docs/no-rNO/user/onboarding.md b/docs/no-rNO/user/onboarding.md new file mode 100644 index 000000000..3b910534e --- /dev/null +++ b/docs/no-rNO/user/onboarding.md @@ -0,0 +1,99 @@ +--- +title: Getting Started +nav_order: 1 +last_updated: 2026-05-13 +description: First-launch setup — permissions, onboarding flow, and next steps after connecting your radio. +aliases: + - first-launch + - setup + - intro +--- + +# Getting Started + +Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app. + +## First Launch + +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. + +### Welcome Screen + +The welcome screen introduces Meshtastic and its core capabilities: + +- Off-grid mesh communication +- No cellular or internet required +- End-to-end encrypted messaging + +Tap **Get Started** to proceed through the setup flow. + +![Welcome screen](/assets/screenshots/onboarding_welcome.png) + +## Permissions + +The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. + +### Bluetooth Permission + +Bluetooth is the primary connection method between your phone and Meshtastic radio: + +- **Bluetooth scanning** — discover nearby Meshtastic radios +- **Bluetooth connect** — establish and maintain connections with paired radios + +Grant both permissions when prompted. Without Bluetooth, you'll need to use USB or TCP connections instead. + +### Location Permission + +> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. + +Meshtastic also uses your location for: + +- Showing your position on the mesh map +- Calculating distances to other nodes +- Sharing your GPS coordinates with other mesh members (if enabled) + +Grant **"While using the app"** or **"Always"** depending on your preference: + +- **While using the app** — position updates only when the app is open +- **Always** — enables background position updates for always-on mesh presence + +If denied, Bluetooth scanning will not function and your node will not report a position. + +### Notifications Permission + +Notifications alert you to: + +- Incoming messages from channels and direct messages +- Connection status changes (connected, disconnected, reconnecting) +- Firmware update availability + +> 💡 **Tip:** You can fine-tune notification preferences later in Android system settings. The app creates separate notification channels for messages, connection events, and background service status. + +### Critical Alerts Permission + +On supported devices, the app may request permission for critical alerts: + +- These are high-priority notifications that can break through Do Not Disturb mode +- Useful for emergency mesh alerts or urgent messages +- You can **skip** this step if you don't need breakthrough notifications +- Configure or revoke later in Android notification settings + +## After Setup + +Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. + +> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. + +## What's Next? + +Once connected to a radio, explore: + +- [Connections](connections) — pair your first radio device +- [Messages & Channels](messages-and-channels) — send your first message +- [Nodes](nodes) — see who's on your mesh +- [Map & Waypoints](map-and-waypoints) — view node positions +- [Settings](settings-radio-user) — configure your radio and user profile + +New to Meshtastic? The [getting started guide](https://meshtastic.org/docs/getting-started) on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup. + +--- diff --git a/docs/no-rNO/user/settings-module-admin.md b/docs/no-rNO/user/settings-module-admin.md new file mode 100644 index 000000000..12d9dd7d1 --- /dev/null +++ b/docs/no-rNO/user/settings-module-admin.md @@ -0,0 +1,246 @@ +--- +title: Settings — Modules & Admin +nav_order: 8 +last_updated: 2026-05-13 +description: Configure optional feature modules (MQTT, telemetry, canned messages, TAK, and more) and perform device administration. +aliases: + - modules + - module-config + - administration +--- + +# Settings — Modules & Admin + +Configure optional feature modules and perform device administration. Modules extend Meshtastic with specialized capabilities — each can be independently enabled or disabled. + +> 💡 **Tip:** You only need to enable the modules you actually use. Disabling unused modules reduces airtime, saves battery, and simplifies your configuration. + +Module settings use a card-based layout with toggle switches, dropdowns, text fields, and sliders: + +![Toggle switch](/assets/screenshots/settings_switch.png) + +![Dropdown selector](/assets/screenshots/settings_dropdown.png) + +![Text field](/assets/screenshots/settings_text_field.png) + +![Settings card layout](/assets/screenshots/settings_titled_card.png) + +## Module Configuration + +### MQTT Module + +Bridges mesh messages to and from an MQTT broker for internet connectivity. This is how you extend your mesh beyond radio range or integrate with home automation systems. + +| Setting | Beskrivelse | +| --------------- | ------------------------------------------------------------------------ | +| Enabled | Toggle MQTT bridge | +| Server | MQTT broker address | +| Username | Authentication username | +| Password | Authentication password | +| Encryption | Encrypt MQTT payloads | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON support removed from firmware; field is ignored | +| TLS | Use secure connection | +| Root Topic | Base MQTT topic path | +| Map Report | Publish position for public map | + +See [MQTT](mqtt) for a detailed usage guide including encryption, privacy, and broker setup. + +### Serial Module + +Enables serial port communication for external device integrations (GPS modules, sensors, or custom hardware). When enabled, the node's serial port can send and receive protobuf or text data, allowing external microcontrollers or computers to interact with the mesh. + +| Setting | Beskrivelse | +| ---------- | ------------------------------- | +| Enabled | Activate serial communication | +| Echo | Echo received serial data back | +| Mode | Text, Protobuf, or NMEA output | +| RX/TX Pins | GPIO pins for serial connection | +| Baud Rate | Serial communication speed | + +### External Notification Module + +Controls buzzer, LED, or vibration alerts on your radio hardware. Useful for devices that need to physically signal when a message arrives — particularly helpful for unattended or outdoor installations. + +| Setting | Beskrivelse | +| -------------------------------- | --------------------------- | +| Enabled | Activate notifications | +| Alert Message | Notify on incoming messages | +| Alert Message Buzzer | Use buzzer for messages | +| Alert Message Vibra | Use vibration for messages | +| Alert Bell | Notify on bell character | +| Output (GPIO) | Pin for notification output | +| Active | High or Low active | +| Duration (ms) | Notification length | +| Use I2S as Buzzer | Use I2S audio output | + +### Store & Forward Module + +Buffers messages for nodes that were temporarily offline, then replays them when those nodes reconnect. Essential for meshes where nodes go in and out of range regularly — ensures messages aren't lost during brief disconnections. + +| Setting | Beskrivelse | +| ------------------------------------------ | -------------------------- | +| Enabled | Activate store and forward | +| Heartbeat (s) | Announcement interval | +| Records | Maximum stored messages | +| History Return (max) | Max messages to replay | +| History Return (window) | Time window for replay | + +> 💡 **Tip:** Store and Forward works best on nodes with ample memory (ESP32 with PSRAM). Router nodes are ideal candidates since they're typically always-on. + +### Range Test Module + +Automated range testing tool for evaluating link quality between nodes. When enabled, the node periodically transmits test messages with incrementing counters. A receiver node logs these messages, allowing you to walk or drive away and later analyze at what distance messages stopped arriving. + +| Setting | Beskrivelse | +| -------------------------------------- | --------------------------------- | +| Enabled | Activate range testing | +| Sender Interval (s) | Time between test transmissions | +| Save CSV | Log received test data to SD card | + +### Telemetry Module + +Controls what telemetry data your node shares with the mesh. Telemetry includes device health (battery, uptime) and environmental sensor data (temperature, humidity, pressure). + +| Setting | Beskrivelse | +| ---------------------------- | --------------------------------------- | +| Device Metrics Interval | How often to report device metrics | +| Environment Metrics Interval | How often to report environment sensors | +| Air Quality Enabled | Report particulate sensor data | +| Power Metrics Enabled | Report power usage | + +See [Telemetry & Sensors](telemetry-and-sensors) for supported sensors and configuration recommendations. + +### Canned Message Module + +Pre-configured messages accessible from the device's physical buttons (for radios with rotary encoders, keypads, or similar input hardware). Define a list of quick-send messages that can be transmitted without a phone connected — ideal for field use. + +| Setting | Beskrivelse | +| ------------------ | ----------------------------------------------------------- | +| ~~Enabled~~ | ⚠️ **Deprecated** — current firmware may ignore this toggle | +| Messages | Newline-separated list of messages | +| Send Bell | Play bell sound on send | +| Rotary Encoder | Enable rotary encoder input | +| Up/Down/Press Pins | GPIO pin assignments for input | + +### Audio Module + +Codec2 audio support for low-bandwidth voice communication over the mesh. This is an **experimental** feature that encodes voice into very small data packets using the Codec2 codec. + +| Setting | Beskrivelse | +| --------------- | -------------------------------- | +| Enabled | Activate audio module | +| Codec2 Rate | Audio quality/bandwidth tradeoff | +| I2S Word Select | GPIO pin for I2S WS | +| I2S Data In | GPIO pin for I2S DIN | +| I2S Data Out | GPIO pin for I2S DOUT | + +> ⚠️ **Note:** Audio requires specific hardware (I2S microphone and speaker). Voice quality is very low-bandwidth — think "understandable radio voice," not phone-call quality. + +### Remote Hardware Module + +GPIO control over the mesh network. Allows a remote node to read or write GPIO pins on another node — useful for activating relays, reading switches, or controlling external hardware from a distance. + +| Setting | Beskrivelse | +| -------------------- | --------------------------------------------------------------- | +| Enabled | Activate remote GPIO access | +| Allow Undefined Pins | Allow access to any GPIO pin (security risk) | + +> ⚠️ **Warning:** Enabling "Allow Undefined Pins" gives remote nodes access to all GPIO pins, which could interfere with the radio's own hardware. Only enable on dedicated GPIO nodes. + +### Neighbor Info Module + +Broadcasts information about directly heard neighbors, enabling mesh topology mapping. Each enabled node periodically shares a list of the other nodes it can hear and their signal quality. + +| Setting | Beskrivelse | +| -------------------------------------- | ------------------------------------ | +| Enabled | Activate neighbor broadcasting | +| Update Interval (s) | How often to broadcast neighbor list | + +See [Discovery](discovery) for how to use neighbor data for mesh topology exploration. + +### Ambient Lighting Module + +Controls onboard NeoPixel or other addressable RGB LEDs on supported hardware. Can be used for visual status indicators, notification lights, or decorative effects. + +| Setting | Beskrivelse | +| ------------------ | ---------------------------------------------------------- | +| Enabled | Activate LED control | +| LED State | On, Off, or set specific color | +| Red / Green / Blue | Individual color channel values (0–255) | + +### Detection Sensor Module + +Turns your node into a motion or door sensor alert system. When a GPIO pin detects a state change (motion detected, door opened), the node broadcasts an alert message over the mesh. + +| Setting | Beskrivelse | +| ---------------------------------------- | ----------------------------------------------------------------------- | +| Enabled | Activate detection sensor | +| Monitor Pin | GPIO pin connected to sensor | +| Detection Triggered High | Trigger when pin goes high (vs. low) | +| Minimum Broadcast (s) | Minimum time between alert broadcasts | +| State Broadcast (s) | Periodic state broadcast interval | +| Send Bell | Include bell character in alerts | +| Friendly Name | Custom name for this sensor | + +### Paxcounter Module + +People counter using WiFi and BLE probe requests. Counts nearby devices by passively listening for probe requests that phones and laptops emit when scanning for networks. Available only on ESP32 devices. + +| Setting | Beskrivelse | +| -------------------------------------- | -------------------------- | +| Enabled | Activate people counting | +| Update Interval (s) | How often to report counts | + +> 💡 **Tip:** Paxcounter is useful for estimating foot traffic at trailheads, event venues, or other locations. Counts are approximate — one person may carry multiple devices. + +### TAK Module + +Team Awareness Kit integration for interoperability with ATAK and WinTAK. See [TAK Integration](tak) for detailed setup and usage. + +## Administrasjon + +### Fjernadministrasjon + +Remotely configure nodes that share your admin key: + +1. Select the target node in the node list. +2. Navigate to **Settings** for that node. +3. Modify configuration. +4. Tap **Save** — changes are sent over the mesh. + +> ⚠️ **Requires:** Admin key configured on both your node and the target node. + +### Clean Node Database + +Removes stale nodes from your local database that haven't been heard in a configurable time window. + +### Factory Reset + +Resets all settings to factory defaults. **This cannot be undone.** + +### Omstart + +Remotely reboot a connected or administered node. + +### Feilsøkningspanel + +View detailed diagnostic information: + +- Protocol buffers debug output +- Mesh packet log +- Connection state details + +### Troubleshooting Remote Admin + +- **"No response from target node"** — the target may be out of range, offline, or have a mismatched admin key. Verify the admin key matches on both nodes. +- **Changes not applying** — some settings require a reboot to take effect. Try the Reboot action after saving. +- **Can't see remote settings** — ensure your node has the admin key for the target node and that Admin Channel is enabled in Security Config. + +## Related Topics + +- [Settings — Radio & User](settings-radio-user) — core radio and user profile settings +- [Module configuration reference](https://meshtastic.org/docs/configuration/module) — detailed module docs on meshtastic.org +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/no-rNO/user/settings-radio-user.md b/docs/no-rNO/user/settings-radio-user.md new file mode 100644 index 000000000..f27c5eb86 --- /dev/null +++ b/docs/no-rNO/user/settings-radio-user.md @@ -0,0 +1,173 @@ +--- +title: Settings — Radio & User +nav_order: 7 +last_updated: 2026-05-13 +description: Configure your radio hardware, LoRa presets, user profile, position sharing, power management, and security. +aliases: + - settings + - radio-config + - user-config + - lora +--- + +# Settings — Radio & User + +Configure your radio hardware and user identity parameters. + +## User Settings + +### User Profile + +| Setting | Beskrivelse | +| ----------------- | ------------------------------------------------------------------------------------- | +| Long Name | Your display name (up to 39 characters) | +| Short Name | 4-character abbreviated name | +| Licensed Operator | Enable if you hold an amateur radio license (enables higher power) | + +### Applying Changes + +After modifying settings, tap **Save** to write the configuration to your radio. The device may reboot to apply changes. + +## Radio Configuration + +### Device Config + +| Setting | Beskrivelse | Default | +| ------------------------------------------ | ----------------------------------------------------------------------- | -------- | +| Role | Node behavior (Client, Router, etc.) | Client | +| Rebroadcast Mode | How the node retransmits messages | All | +| Node Info Broadcast (s) | Interval for broadcasting node info | 10800 | +| Double-tap Button | Action for double-tap button press | Disabled | + +### LoRa Config + +| Setting | Beskrivelse | Default | +| ----------------- | ----------------------------------------------------------------------- | ----------------------------------------- | +| Region | Regulatory region for frequency bands | Unset (must configure) | +| Modem Preset | Speed/range tradeoff | LongFast | +| Hop Limit | Maximum retransmit hops | 3 | +| TX Power | Transmission power (dBm); 0 = max allowed for region | 0 (region max) | +| Frequency Offset | Fine-tune frequency (MHz) | 0 | +| Channel Bandwidth | Bandwidth setting | Default for preset | + +> ⚠️ **Important:** You **must** set your region before transmitting. Operating without the correct region may violate local radio regulations. See the [region configuration guide](https://meshtastic.org/docs/getting-started/initial-config) on meshtastic.org for details. + +### Modem Presets + +| Preset | Range | Speed | SNR Limit | Best For | +| ------------------ | ----------------------- | ------------------------- | ------------------------ | -------------------------------------------------------------------------------------------------------- | +| Short Turbo | ~1 km | 21.9 kbps | −5 dB | Dense urban with line-of-sight; data-heavy applications | +| Short Fast | ~3 km | 10.9 kbps | −7.5 dB | Urban neighborhoods; buildings within a few blocks | +| Short Slow | ~5 km | 5.5 kbps | −10 dB | Suburban short-range; moderate building density | +| Medium Fast | ~5 km | 5.5 kbps | −10 dB | Suburban areas; moderate building density | +| Medium Slow | ~8 km | 1.1 kbps | −12.5 dB | Suburban/rural; moderate range with slower speed | +| Long Turbo | ~10 km | 4.4 kbps | −10 dB | Similar range to Long Fast but with 500 kHz bandwidth; faster throughput | +| Long Fast | ~10 km | 1.1 kbps | −12.5 dB | **General use (default)** — balanced range and speed | +| Long Moderate | ~20 km | 0.34 kbps | −15 dB | Rural with some terrain; occasional use | +| Lite Fast | ~5 km | 5.5 kbps | −10 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Medium Fast | +| Lite Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Long Fast | +| Narrow Fast | ~5 km | 2.7 kbps | −10 dB | EU 868 MHz band (62.5 kHz BW); avoids interference with other devices | +| Narrow Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 868 MHz band (62.5 kHz BW); comparable to Long Fast | +| ~~Long Slow~~ | ~30 km | 0.18 kbps | −17.5 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | +| ~~Very Long Slow~~ | ~40+ km | 0.09 kbps | −20 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | + +#### Choosing a Modem Preset + +The modem preset controls the fundamental tradeoff between **range** and **data rate**: + +- **Slower presets** use more spreading, making signals decodable at weaker signal levels (lower SNR limit). This means longer range but fewer bytes per second. +- **Faster presets** pack more data per transmission but require a stronger signal to decode. + +**Practical guidance:** + +- **Urban mesh (many nodes, short distances):** Use **Long Fast** (default) or **Short Fast**. Higher speed means less airtime congestion when many nodes share the channel. +- **Rural/sparse mesh (few nodes, long distances):** Use **Long Moderate**. Range matters more than speed when nodes are far apart. +- **EU 866/868 MHz regulatory compliance:** Use **Lite Fast**, **Lite Slow**, **Narrow Fast**, or **Narrow Slow** — these are optimized for the EU SRD/868 MHz bands with narrower bandwidths. +- **Fixed infrastructure links:** Use **Short Turbo** or **Long Turbo** for dedicated point-to-point links with good antennas and line-of-sight. +- **Mixed environments:** Stick with **Long Fast** — it's the community default and ensures compatibility with others in your area. + +> ⚠️ **Important:** All nodes on the same channel **must** use the same modem preset. Nodes with mismatched presets cannot communicate even if they share the same frequency and encryption key. + +> 💡 **Tip:** The range estimates above assume flat terrain and modest antennas. Elevation advantage (hilltop, rooftop) dramatically increases effective range. A well-placed Router with Long Fast can often outperform a ground-level node with Long Slow. + +### Display Config + +| Setting | Beskrivelse | +| ------------------- | ------------------------------------------------------------------------------------ | +| Screen Timeout | Time before display sleeps | +| Display Units | Metric or Imperial | +| OLED Type | Auto, SSD1306, SH1106, SH1107 | +| Compass Orientation | Rotation offset for compass display (0°, 90°, 180°, 270°) | +| ~~Compass North~~ | ⚠️ **Deprecated** — replaced by Compass Orientation; still visible in older firmware | + +### Position Config + +| Setting | Beskrivelse | +| ----------------------------------------- | ---------------------------------- | +| GPS Enabled | Enable/disable GPS | +| GPS Update Interval | How often to acquire GPS fix | +| Position Broadcast (s) | How often to share position | +| Smart Position | Enable movement-based broadcasting | +| Fixed Position | Use a manually set position | + +### Power Config + +| Setting | Beskrivelse | +| --------------------------------------- | --------------------------------------- | +| Power Saving | Enable low-power sleep mode | +| Shutdown After (s) | Auto-shutdown idle timer | +| ADC Multiplier | Battery voltage calibration factor | +| Wait Bluetooth (s) | Time to wait for BLE connection at boot | +| Mesh SDS Timeout (s) | Super-deep-sleep timeout | + +### Network Config + +| Setting | Beskrivelse | +| ------------- | ---------------------------------------------------- | +| WiFi Enabled | Enable WiFi radio (ESP32 devices) | +| WiFi SSID | Network name to connect to | +| WiFi PSK | Network password | +| NTP Server | Time synchronization server | +| Syslog Server | Remote logging server | + +![IP address field](/assets/screenshots/settings_ipv4_field.png) + +### Bluetooth Config + +| Setting | Beskrivelse | +| ----------------- | ------------------------------------------------------------------------- | +| Bluetooth Enabled | Enable/disable BLE radio | +| Pairing Mode | Fixed PIN, Random PIN, or No PIN | +| Fixed PIN | PIN code for pairing (default: 123456) | + +### Security Config + +| Setting | Beskrivelse | +| --------------------- | -------------------------------------------------------------------------- | +| Offentlig nøkkel | Your node's public key (read-only) | +| Admin Key | Key for remote administration | +| Privat nøkkel | Your node's private key (handle securely) | +| Admin Channel Enabled | Allow admin commands via channel | +| Debug Log | Output live debug logging over serial/bluetooth | +| Serial Enabled | Enable serial console access (moved from Device Config) | +| Managed Mode | Restrict non-admin channel changes | + +![Password field](/assets/screenshots/settings_password_field.png) + +Settings use standard preference controls — dropdowns, toggles, and sliders: + +| Control | Screenshot | +| -------- | ------------------------------------------------------ | +| Dropdown | ![Dropdown](/assets/screenshots/settings_dropdown.png) | +| Toggle | ![Toggle](/assets/screenshots/settings_switch.png) | +| Slider | ![Slider](/assets/screenshots/settings_slider.png) | + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — optional feature modules and device administration +- [Signal Meter](signal-meter) — how modem presets affect signal quality thresholds +- [LoRa configuration](https://meshtastic.org/docs/configuration/radio/lora) — detailed LoRa settings reference on meshtastic.org +- [Initial configuration](https://meshtastic.org/docs/getting-started/initial-config) — region setup guide on meshtastic.org + +--- + diff --git a/docs/no-rNO/user/signal-meter.md b/docs/no-rNO/user/signal-meter.md new file mode 100644 index 000000000..674e5318b --- /dev/null +++ b/docs/no-rNO/user/signal-meter.md @@ -0,0 +1,81 @@ +--- +title: How the Meshtastic Signal Meter Works +nav_order: 15 +last_updated: 2026-05-13 +description: How the signal meter calculates quality from RSSI and SNR — LoRa spread spectrum, presets, and what the bars really mean. +aliases: + - signal + - signal-meter + - snr + - rssi +--- + +# How the Meshtastic Signal Meter Works + +The Meshtastic signal meter — the familiar bars or status color in the app — is calculated very differently than the "bars" on a traditional cell phone or Wi-Fi router. + +Most consumer devices simply measure how "loud" a signal is. However, because Meshtastic uses **LoRa (Long Range)** technology, its signal meter measures how **clear** the signal is, relative to the specific settings your mesh is using. + +--- + +## 1. The Two Metrics: "Loudness" vs. "Clarity" + +Every time the LoRa radio chip receives a message, it reports two measurements: + +- **RSSI (Received Signal Strength Indicator):** The **loudness** of the raw power hitting your antenna. +- **SNR (Signal-to-Noise Ratio):** The **clarity** of the signal compared to the background static. + +> **Tip — The Analogy:** Imagine you are trying to hear a friend talking to you. +> +> - **RSSI** is how loud their voice is. +> - **The Noise Floor** is the background noise in the room (air conditioning, other people talking, traffic). +> - **SNR** is how easily you can distinguish your friend's voice from the background noise. + +If your friend shouts at you at a deafening rock concert, the signal is incredibly loud (High RSSI), but you still can't understand them because the background noise is louder (Bad SNR). Conversely, if your friend whispers to you in a dead-silent library, the signal is very weak (Low RSSI), but you can understand them perfectly (Great SNR). + +--- + +## 2. The Magic of LoRa: Hearing "Below the Noise Floor" + +For standard radios (like FM or Wi-Fi), if the background noise is louder than the signal (a negative SNR), the receiver just hears static. + +LoRa is special. It uses **"Spread Spectrum"** modulation, which allows the radio to mathematically pull a signal out of the air even when it is buried deep _underneath_ the background noise. This is why you will frequently see **negative SNR numbers** in Meshtastic (e.g., -10 dB, which means the signal is 10 decibels weaker than the background static). + +Depending on which Meshtastic preset you are using (e.g., `LongFast` vs. `ShortFast`), the radio has a specific **SNR Limit** — the absolute maximum amount of noise it can tolerate before the message is completely lost to the static. + +--- + +## 3. How the Signal Meter Calculates Quality + +The Meshtastic apps take both RSSI and SNR and run them through a specific formula to assign your signal a quality rating (None, Bad, Fair, or Good). It specifically scales these values based on the physical limits of the radio preset you are using. + +Here is exactly how the app decides how many bars (or what color) to show you: + +| Level | Bars | Criteria | Meaning | +| ----------- | ---- | ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | +| Godt | 3 | RSSI better than `-115 dBm` **AND** SNR better than `-7 dB` | Signal is both loud and clear — healthy connection. | +| Middelmådig | 2 | RSSI better than `-126 dBm` with good SNR, **OR** SNR better than `-15 dB` with good RSSI | Signal getting quieter or noisier, but still decodable. | +| Dårlig | 1 | Falls between Fair and None thresholds | At the edge of range or experiencing interference. | +| Ingen | 0 | RSSI worse than `-126 dBm` **AND** SNR worse than `-15 dB` | Transmission completely buried in noise. | + +--- + +## 4. What This Means for You + +Because Meshtastic's meter acts as a **"Clarity Meter"**, it behaves differently than what most people expect: + +> **Tip — Don't panic over low RSSI:** You might see a seemingly terrible RSSI value like `-118 dBm`. On a cell phone, you would have zero bars. But if you have an SNR of `+2 dB`, Meshtastic will still show a strong signal! _The library is quiet, so the whisper is heard perfectly._ + +> **Warning — Watch out for local noise:** If you hook up a massive antenna and see a great RSSI (e.g., `-90 dBm`) but your signal meter is only showing **1 Bar (Bad)**, you have a problem. It means you have local interference — perhaps a cheap power supply, a noisy computer, or a nearby radio tower — creating so much static that it is drowning out your mesh. + +## Where Signal Information Appears + +In the app, signal data is shown in several places: + +- **Node list** — signal bars icon next to each node +- **Node detail** — SNR, RSSI, and signal quality in the device metrics section +- **Traceroute** — per-hop signal quality for each relay node +- **Signal metrics** — historical SNR and RSSI data in the metrics charts + +![Node entry showing SNR, RSSI values and colored signal bars](/assets/screenshots/nodes_signal_info.png) + diff --git a/docs/no-rNO/user/tak.md b/docs/no-rNO/user/tak.md new file mode 100644 index 000000000..bb860805a --- /dev/null +++ b/docs/no-rNO/user/tak.md @@ -0,0 +1,126 @@ +--- +title: TAK Integration +nav_order: 10 +last_updated: 2026-05-13 +description: Interoperate with ATAK and WinTAK — CoT position sharing, TAK roles, and plugin setup. +aliases: + - tak + - atak + - team-awareness-kit +--- + +# TAK Integration + +Meshtastic integrates with the Team Awareness Kit (TAK) ecosystem, enabling interoperability between Meshtastic mesh devices and TAK applications like ATAK and WinTAK. + +## Overview + +The TAK module allows Meshtastic nodes to: + +- Share position data in TAK-compatible CoT (Cursor on Target) format +- Appear as team members on TAK map displays +- Receive TAK PLI (Position Location Information) messages + +## Setup + +### Prerequisites + +- ATAK (Android Team Awareness Kit) or WinTAK installed +- Meshtastic ATAK Plugin installed +- TAK module enabled on your Meshtastic radio + +### Configuration + +1. Navigate to **Settings → Module Config → TAK**. +2. Enable the TAK module. +3. Configure the TAK team/group settings: + +![Module toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | Beskrivelse | +| ------- | -------------------------- | +| Enabled | Activate TAK interop | +| Mode | TAK-compatible output mode | + +### ATAK Plugin Setup + +1. Install the Meshtastic ATAK Plugin from the plugin repository. +2. Open ATAK and enable the Meshtastic plugin. +3. The plugin bridges messages between ATAK and your mesh network. + +## TAK Roles + +Nodes configured with TAK-related roles behave differently from standard clients: + +| Role | Beskrivelse | +| --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **TAK** | Full TAK interoperability — sends and receives CoT data, chat messages, and PLI updates. Functions as a standard client plus TAK bridge. | +| **TAK Tracker** | Position-only TAK output — automatically broadcasts PLI at regular intervals without user interaction. Optimized for unattended position beacons (vehicles, equipment, waypoints). Does not relay chat messages. | + +> 💡 **Tip:** Use **TAK Tracker** for devices that only need to report position (e.g., a radio mounted in a vehicle). Use **TAK** for devices where users actively participate in TAK operations. + +### CoT (Cursor on Target) Format + +TAK messages use the Cursor on Target XML format — a military standard for sharing situational awareness data. Meshtastic converts its internal protobuf messages to CoT format when bridging to TAK systems, so no manual format conversion is needed. + +## TAK Identity + +When using TAK roles, your node broadcasts identity information that appears on TAK maps: + +| Setting | Beskrivelse | +| -------- | ---------------------------------------------------------------------------------------------------------------- | +| Team | Your team color on the TAK map (e.g., Blue, Red, Cyan, Green) | +| Role | Your operational role (Team Member, Team Lead, HQ, Medic, RTO, etc.) | +| Callsign | Your TAK callsign (defaults to your Meshtastic long name) | + +These settings appear in **Settings → Module Config → TAK** when the TAK module is enabled. + +> 💡 **Tip:** Team/role colors are the standard TAK affiliation colors. Coordinate with your TAK team to use consistent team assignments. + +## Wire Format (V1 / V2) + +Meshtastic supports two TAK wire formats: + +| Format | Compatibility | Features | +| ------------------------------- | --------------------------------------------------------------- | --------------------------------------------------------- | +| V1 (Legacy) | ATAK Plugin v1.x, older firmware | Basic CoT position sharing only | +| V2 (Current) | ATAK Plugin v2.x, firmware 2.3+ | Full CoT support including chat, routes, zstd compression | + +The app automatically selects V2 when both sides support it. No manual configuration needed — the TAK module negotiates format based on firmware capabilities. + +## Usage with ATAK + +Once configured: + +- Meshtastic nodes appear as markers on the ATAK map with callsign labels +- Chat messages can bridge between mesh and TAK networks +- Position updates flow bidirectionally between Meshtastic and TAK +- TAK Tracker nodes broadcast PLI automatically — their positions appear on ATAK maps without any ATAK-side configuration + +> ⚠️ **Note:** TAK integration requires specific node roles and module configuration. Standard client nodes don't automatically participate in TAK operations. + +## Troubleshooting + +| Problem | Cause | Solution | +| -------------------------------- | ------------------------------------- | ----------------------------------------------------------------------- | +| Node doesn't appear on ATAK map | TAK module disabled or wrong role | Verify TAK module is enabled and node role is TAK or TAK Tracker | +| Position updates are stale | GPS fix lost or interval too long | Check GPS status; reduce position broadcast interval in Position Config | +| ATAK plugin shows "disconnected" | BLE connection lost or plugin crashed | Reconnect Bluetooth in Meshtastic app, then restart ATAK plugin | +| Chat messages not bridging | V1 format doesn't support chat | Ensure both nodes run firmware 2.3+ for V2 wire format | +| CoT data not flowing | Channel mismatch | All TAK nodes must be on the same channel with matching encryption | + +## Security Considerations + +- TAK data shares your position and callsign information +- Ensure your channel encryption is configured when using TAK in sensitive environments +- The TAK module respects the same channel encryption as other Meshtastic messages + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — TAK module configuration +- [Nodes](nodes) — TAK and TAK Tracker roles in the node list +- [Map & Waypoints](map-and-waypoints) — node positions on the map +- [ATAK plugin guide](https://meshtastic.org/docs/software/integrations/atak-plugin) — detailed ATAK setup on meshtastic.org + +--- + diff --git a/docs/no-rNO/user/telemetry-and-sensors.md b/docs/no-rNO/user/telemetry-and-sensors.md new file mode 100644 index 000000000..86c2d8ec7 --- /dev/null +++ b/docs/no-rNO/user/telemetry-and-sensors.md @@ -0,0 +1,118 @@ +--- +title: Telemetry & Sensors +nav_order: 9 +last_updated: 2026-05-13 +description: Sensor data on the mesh — supported environment, air quality, and power sensors, plus configuration and viewing guides. +aliases: + - sensors + - environment + - weather + - power-metrics +--- + +# Telemetry & Sensors + +Meshtastic nodes can collect and share sensor data across the mesh network. + +## Overview + +Telemetry allows nodes equipped with sensors to broadcast environmental, power, and device health information. This data is visible on the node detail screen and can be logged over time. + +## Device Telemetry + +All Meshtastic nodes report basic device telemetry: + +| Metric | Beskrivelse | Typical Range | +| ------------------ | ------------------------------ | ------------------------------------------------------------------ | +| Battery Level | Charge percentage | 0–100% | +| Voltage | Battery voltage | 3.0–4.2V (LiPo) | +| Kanalutnyttelse | % of airtime used locally | 0–100% | +| Air Utilization TX | % of airtime used by this node | 0–100% | +| Uptime | Seconds since last boot | Varies | + +## Environment Sensors + +Supported environmental sensors: + +### Temperature & Humidity + +| Sensor | Temperatur | Luftfuktighet | Pressure | Notes | +| ------- | ---------- | ------------- | -------- | ----------------------- | +| BME280 | ✓ | ✓ | ✓ | Recommended all-in-one | +| BME680 | ✓ | ✓ | ✓ | Adds gas resistance/IAQ | +| SHT31 | ✓ | ✓ | — | High accuracy | +| MCP9808 | ✓ | — | — | Precision temperature | +| LPS22 | — | — | ✓ | Pressure only | + +### Air Quality + +| Sensor | Metric | Notes | +| -------- | -------------------------------------------------- | -------------------------- | +| BME680 | Gas Resistance / IAQ | Volatile organic compounds | +| PMSA003I | PM1.0, PM2.5, PM10 | Particulate matter | +| SEN55 | PM, NOx, VOC, Temp, Humidity | Multi-sensor | + +### Light & UV + +| Sensor | Metric | +| -------- | -------------------------------------- | +| OPT3001 | Ambient light (lux) | +| VEML7700 | Ambient light (lux) | +| LTR390 | UV index | + +## Power Metrics + +Nodes with INA-series power sensors can report: + +| Metric | Beskrivelse | +| ----------- | ----------------------------------------- | +| Bus Voltage | Supply rail voltage | +| Current | Power consumption (mA) | +| Power | Calculated power (mW) | + +Useful for monitoring solar charging or battery health on remote nodes. + +## Configuring Telemetry + +1. Navigate to **Settings → Module Config → Telemetry**. +2. Set reporting intervals: + - **Device Metrics Interval** — how often to broadcast device metrics + - **Environment Metrics Interval** — how often to broadcast sensor data +3. Enable specific sensor types as needed. + +### Recommended Intervals + +| Use Case | Device (s) | Environment (s) | +| ------------------------------------------ | ----------------------------- | ---------------------------------- | +| Urban mesh (many nodes) | 3600 | 3600 | +| Rural mesh (few nodes) | 900 | 900 | +| Weather station | 900 | 300 | +| Battery conservation | 7200 | 7200 | + +> ⚠️ **Note:** Shorter intervals increase airtime usage and battery drain across the mesh. + +## Viewing Telemetry + +1. Navigate to **Nodes** and select a node. +2. Telemetry sections show on the detail screen: + - Device Metrics (always available) + - Environment Metrics (if sensors present) + - Power Metrics (if INA sensor present) +3. Historical graphs show trends over time. + +![Telemetry actions](/assets/screenshots/node-metrics_telemetric_actions.png) + +## Troubleshooting + +- **No environment data showing?** The remote node needs a physical sensor connected (e.g., BME280 on I2C). Device telemetry (battery, uptime) is always available, but environment metrics require hardware. +- **Stale readings?** Check the reporting interval — very long intervals (7200s+) mean data updates infrequently. Also verify the remote node is still online. +- **Sensor conflict on I2C bus?** Some sensors share I2C addresses. If you have multiple sensors on the same bus, check for address collisions in the radio's serial debug output. + +## Related Topics + +- [Node Metrics](node-metrics) — view telemetry data on the node detail screen +- [Settings — Modules & Admin](settings-module-admin) — telemetry module configuration +- [Units & Locale](units-and-locale) — temperature and pressure display units + +--- + diff --git a/docs/no-rNO/user/translate.md b/docs/no-rNO/user/translate.md new file mode 100644 index 000000000..b2ed79a34 --- /dev/null +++ b/docs/no-rNO/user/translate.md @@ -0,0 +1,97 @@ +--- +title: Translate the App +parent: User Guide +nav_order: 17 +last_updated: 2026-05-13 +aliases: + - translate + - crowdin + - localization +--- + +# Translate the App + +Contributing translations helps make Meshtastic accessible to a wider audience. The app uses [Crowdin](https://crowdin.com/) to manage community translations for both the user interface and in-app documentation. + +--- + +## What Gets Translated + +| Resource | Source Location | Notes | +| ----------------- | ------------------------------------- | ---------------------------------------------------------------------- | +| UI strings | `composeResources/values/strings.xml` | Buttons, labels, messages, and all user-visible text | +| User Guide pages | `docs/user/*.md` | In-app documentation shown in Help & Documentation | +| Fastlane metadata | `fastlane/metadata/android/en-US/` | App Store listing title, description, and changelogs | + +> **Note — Developer Guide pages are English-only.** Code-focused documentation targeting contributors is not translated. + +--- + +## How to Contribute + +1. **Visit the Crowdin project.** Open the [Meshtastic Android Crowdin project](https://crowdin.com/project/meshtastic-android) and sign in or create a free account. +2. **Choose your language.** Select an existing language or request a new one by opening a [GitHub issue](https://github.com/meshtastic/Meshtastic-Android/issues/new). +3. **Translate strings.** Crowdin shows the English source on the left and your translation on the right. Translate each string and save. +4. **Review context.** Many strings include screenshots or context comments — check these to understand where the text appears in the app. +5. **Submit.** Approved translations are automatically merged into the next release. + +> **Tip — Keep translations short.** UI strings often appear in buttons, chips, or narrow columns. If a translation is significantly longer than the English original, consider abbreviating where the meaning stays clear. + +--- + +## Adding a New Language + +If your language is not yet listed on Crowdin: + +1. Open an issue on [GitHub](https://github.com/meshtastic/Meshtastic-Android/issues/new) requesting the new locale. +2. A maintainer will add the language to Crowdin and configure `crowdin.yml`. +3. Once added, you can begin translating immediately. + +--- + +## How Translations Are Organized + +The Android app uses **Compose Multiplatform resources** for all user-visible strings: + +``` +core/resources/src/commonMain/composeResources/ +├── values/ ← English (default) +│ └── strings.xml +├── values-de/ ← German +│ └── strings.xml +├── values-fr/ ← French +│ └── strings.xml +└── ... +``` + +In-app documentation follows a similar pattern under `docs/`: + +``` +docs/ +├── user/ ← English source (default) +│ ├── onboarding.md +│ └── ... +├── fr/user/ ← French translations +│ ├── onboarding.md +│ └── ... +└── ... +``` + +The app automatically selects the correct locale based on your device's **Language & Region** settings. + +--- + +## Translation Guidelines + +- **Do not translate** technical terms like "LoRa", "MQTT", "BLE", "TAK", "SNR", or "RSSI" — these are universal. +- **Keep placeholders intact.** Strings like `%1$s` or `%d` are filled in at runtime. Do not remove or reorder them unless the grammar of your language requires it. +- **Match tone.** The app uses a friendly, direct voice. Avoid overly formal language. +- **Test if possible.** Switch your device language and open the app to see how translations look in context. + +--- + +## Questions? + +If you have questions about a specific string's context or need help getting started, open a discussion on the [Meshtastic GitHub Discussions](https://github.com/meshtastic/Meshtastic-Android/discussions) page. + +Thank you for helping expand the reach of Meshtastic! diff --git a/docs/no-rNO/user/units-and-locale.md b/docs/no-rNO/user/units-and-locale.md new file mode 100644 index 000000000..386a15ee7 --- /dev/null +++ b/docs/no-rNO/user/units-and-locale.md @@ -0,0 +1,118 @@ +--- +title: Units, Measurement & Locale +parent: User Guide +nav_order: 16 +last_updated: 2026-05-12 +--- + +# Units, Measurement & Locale + +The Meshtastic app automatically displays temperatures, distances, speeds, and times in the units your device is configured to use — no settings to change inside the app. + +--- + +## How It Works + +Meshtastic radios always transmit data in **metric units** (meters, °C, km/h, hPa, etc.). When the app receives this data, it uses the `MetricFormatter` utility to convert and display values in whatever unit system your device's locale specifies. + +On Android, your measurement preferences are determined by your system **Language & Region** settings. On Desktop (JVM), the app uses the JVM's default `Locale`. + +> **Tip — You never need to toggle units inside the app.** Change your system measurement preferences and every screen in Meshtastic updates automatically — node details, telemetry charts, weather, altitude, and more. + +--- + +## Temperatur + +Temperature values from environment sensors are transmitted as **°C** and displayed based on your device's temperature unit preference. + +![Environment metrics with temperature](/assets/screenshots/nodes_environment_metrics.png) + +| Your Setting | You See | +| ------------ | ------- | +| Celsius | 22°C | +| Fahrenheit | 72°F | + +This affects all temperature displays throughout the app: node environment telemetry, soil temperature, dew point, and telemetry chart axes. + +## Distance & Altitude + +Distances between nodes and GPS altitudes are transmitted as **meters** and automatically scaled and converted. + +![Distance info display](/assets/screenshots/nodes_distance_info.png) + +| Your Setting | Small Distance | Large Distance | Altitude | +| -------------------------------- | -------------- | ---------------------- | -------- | +| Metric | 350 m | 2.5 km | 1,200 m | +| Imperial (US) | 1,148 ft | 1.6 mi | 3,937 ft | + +The app uses natural scaling — short distances stay in meters or feet, while longer distances switch to kilometres or miles automatically. + +### Where these appear + +- **Node list** — distance and bearing to each node +- **Node detail** — altitude, distance from your position +- **Map** — waypoint distances, traceroute hop distances +- **Compass** — distance to selected node + +## Speed + +GPS ground speed is displayed in your locale's preferred speed unit. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Metric | 12 km/h | +| Imperial (US) | 7 mph | + +## Wind + +Wind speed and gust data from environment sensors are transmitted as **m/s** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Metric | 5 m/s | +| Imperial (US) | 11 mph | + +Wind readings appear in the **Node Detail** environment section and the **Environment Telemetry** charts. + +## Rainfall + +Rainfall measurements (1-hour and 24-hour totals) are transmitted as **mm** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ---------------------- | +| Metric | 12 mm | +| Imperial (US) | 0.5 in | + +## Units That Never Change + +Some units are international standards and are displayed the same way regardless of your locale: + +| Measurement | Unit | Why | +| -------------------------------- | ------------------------------ | ------------------------------------- | +| Barometric pressure | hPa | International meteorological standard | +| Heading / bearing | ° (degrees) | Universal navigation convention | +| Radiation | μR/hr | Standard dosimetry unit | +| GPS coordinates | decimal degrees | Universal geographic standard | +| Humidity, battery, soil moisture | % | Universal | + +## Date & Time + +All timestamps throughout the app — last heard, message times, telemetry logs, chart axes — follow your device's date and time preferences. + +| Setting | What It Controls | Example | +| ---------------- | ---------------- | ------------------------------------------------ | +| **24-Hour Time** | Clock format | 14:30 vs 2:30 PM | +| **Date Format** | Date ordering | 09/05/2026 vs 05/09/2026 | + +The app also uses **relative time** where it makes sense — for example, "5 min ago" or "2 hours ago" in the node list — which is automatically localised into your device language. + +## Changing Your Measurement System (Android) + +On Android, your measurement system (metric vs imperial) is tied to your region setting: + +1. Open **Android Settings → System → Language & Region** +2. Change your **Region** or **Measurement units** preference +3. Return to Meshtastic — values update immediately + +> **Tip — The app uses `MetricFormatter` from `core:common`.** All measurement formatting is handled by a shared KMP utility that respects your platform's locale. Developers adding new measurement displays should use `MetricFormatter` rather than hard-coding unit conversions. + diff --git a/docs/pl-rPL/index.md b/docs/pl-rPL/index.md new file mode 100644 index 000000000..0cb3c90e2 --- /dev/null +++ b/docs/pl-rPL/index.md @@ -0,0 +1,30 @@ +--- +title: Home +layout: default +nav_order: 0 +--- + +# Meshtastic Android App Documentation + +User and developer documentation for the Meshtastic Android, Desktop, and iOS applications powered by KMP (Kotlin Multiplatform). + +Use the sidebar navigation to browse the **User Guide** for app features and the **Developer Guide** for contributing to the project. + +--- + +## Quick Links + +| Guide | Opis | +| --------------------------------------------------------------------- | -------------------------------------------------------------- | +| [Getting Started](user/onboarding) | Connect your first radio and send a message | +| [Messages & Channels](user/messages-and-channels) | Channel broadcasts, direct messages, reactions, and encryption | +| [Nodes](user/nodes) | Understanding the mesh network node list | +| [Signal Meter](user/signal-meter) | How the LoRa signal quality meter works | +| [Units & Locale](user/units-and-locale) | How temperatures, distances, and times adapt to your region | +| [Desktop App](user/desktop) | Linux, macOS, and Windows desktop usage | +| [Architecture](developer/architecture) | App architecture overview for contributors | +| [Contributing](developer/contributing) | Branch naming, PR workflow, and verification commands | + +--- + +> This documentation is served from the same markdown source that powers the in-app **Help & Documentation** browser. diff --git a/docs/pl-rPL/user/connections.md b/docs/pl-rPL/user/connections.md new file mode 100644 index 000000000..a8ddefdde --- /dev/null +++ b/docs/pl-rPL/user/connections.md @@ -0,0 +1,125 @@ +--- +title: Connections +nav_order: 2 +last_updated: 2026-05-13 +description: Connect your phone or desktop to a Meshtastic radio via Bluetooth, USB, or TCP/IP. +aliases: + - bluetooth + - usb + - tcp + - pairing +--- + +# Connections + +Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node. + +## Bluetooth (BLE) + +Bluetooth Low Energy is the default and most common connection method on Android. + +### Pairing a Device + +1. Ensure your Meshtastic radio is powered on and in pairing mode. +2. Open the app and navigate to **Connections**. +3. Tap **Scan for Devices** — nearby Meshtastic radios will appear. +4. Select your device from the list. +5. Accept the Bluetooth pairing prompt if shown. + +![Device list item](/assets/screenshots/connections_bluetooth_scan.png) + +You can filter devices by transport type using the filter chips at the top: + +![Transport filter chips](/assets/screenshots/connections_transport_filters.png) + +> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. + +### Connection Status + +| Icon | State | Opis | +| ---- | -------------- | ----------------------------- | +| 🟢 | Połączony | Active radio link established | +| 🟡 | Łączenie | Handshake in progress | +| 🔴 | Rozłączono | No active connection | +| ⚪ | Not configured | Nie wybrano urządzenia | + +When connecting, a status indicator shows the current connection state: + +![Connecting status](/assets/screenshots/connections_connecting.png) + +If no devices are found, the app shows an empty state with instructions: + +![No devices found](/assets/screenshots/connections_empty_state.png) + +### Troubleshooting Bluetooth + +- **Device not found:** Toggle Bluetooth off/on, ensure location is enabled. +- **Connection drops:** Move closer to the radio; check for interference. +- **Pairing rejected:** Forget the device in Android Bluetooth settings and retry. + +## USB Serial + +USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable. + +### Setup + +1. Connect your radio via USB cable to your device. +2. The app will prompt for USB permission — tap **Allow**. +3. The connection is established automatically. + +> ⚠️ **Note:** USB connections require OTG support on Android devices. + +## TCP/IP (WiFi) + +Some Meshtastic radios support WiFi connectivity, allowing TCP-based connections. + +### Konfiguracja + +1. Connect your radio to a WiFi network via the radio's web interface or settings. +2. In the app, go to **Connections → TCP**. +3. Enter the radio's IP address and port (default: 4403). +4. Tap **Connect**. + +![WiFi scanning for devices](/assets/screenshots/connections_wifi_scanning.png) + +When a device is found, it appears in the connection list: + +![WiFi device found](/assets/screenshots/connections_wifi_device_found.png) + +A successful connection is confirmed with a status indicator: + +![WiFi connection success](/assets/screenshots/connections_wifi_success.png) + +### When to Use TCP + +- Radio is on the same local network +- Testing with a simulated radio +- Environments where Bluetooth has interference issues + +## Reconnection Behavior + +The app reconnects to the **last selected device** on startup. You can manually switch transports from the connections screen at any time. + +To disconnect from a radio, use the disconnect button on the connections screen: + +![Disconnect from radio](/assets/screenshots/connections_disconnect.png) + +## Desktop Connections + +On Desktop (Linux/macOS/Windows), the app supports: + +- **Bluetooth (BLE)** — via the Kable library; works on macOS, Linux, and Windows +- **USB Serial** — primary wired connection method +- **TCP/IP** — for network-connected radios + +See [Desktop App](desktop) for platform-specific details and keyboard shortcuts. + +## Related Topics + +- [Getting Started](onboarding) — first-launch setup and permissions +- [Settings — Radio & User](settings-radio-user) — Bluetooth and network configuration +- [Desktop App](desktop) — desktop-specific connection details +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — full list of compatible radios on meshtastic.org + +--- + diff --git a/docs/pl-rPL/user/desktop.md b/docs/pl-rPL/user/desktop.md new file mode 100644 index 000000000..811dce398 --- /dev/null +++ b/docs/pl-rPL/user/desktop.md @@ -0,0 +1,147 @@ +--- +title: Desktop App +nav_order: 14 +last_updated: 2026-05-13 +description: Install and use the Meshtastic Desktop app on Linux, macOS, and Windows — connections, feature parity, and keyboard shortcuts. +aliases: + - desktop + - linux + - macos + - windows + - jvm +--- + +# Desktop App + +The Meshtastic Desktop application provides the same mesh communication features on Linux, macOS, and Windows. + +## Overview + +The Desktop app shares its core codebase with the Android app through Kotlin Multiplatform (KMP). Most features work identically across platforms. + +## Installation + +### Linux + +- Download the `.deb` or `.AppImage` package from the releases page +- Or build from source using `./gradlew :desktopApp:run` + +### macOS + +- Download the `.dmg` package from releases +- Or build from source + +### Windows + +- Download the `.msi` installer from releases +- Or build from source + +## Connecting Your Radio + +### USB Serial (Primary) + +The most reliable connection method on Desktop: + +1. Connect your Meshtastic radio via USB cable. +2. The app should detect the serial port automatically. +3. If not detected, select the correct serial port from the connections menu. + +### TCP/IP + +For network-connected radios: + +1. Enter the radio's IP address and port (default: 4403). +2. Click **Connect**. + +### Bluetooth (BLE) + +Bluetooth Low Energy is supported on Desktop via the [Kable](https://github.com/JuulLabs/kable) library: + +1. Ensure your system has a Bluetooth adapter. +2. The app scans for nearby Meshtastic radios automatically. +3. Select your device from the connections screen. + +## Feature Parity + +| Feature | Android | Desktop | Notatki | +| ---------------------------------------- | ------- | ------- | -------------------------- | +| Messaging | ✓ | ✓ | Full parity | +| Node List | ✓ | ✓ | Full parity | +| Mapa | ✓ | ✓ | Full parity | +| Ustawienia | ✓ | ✓ | Full parity | +| Bluetooth (BLE) | ✓ | ✓ | Via Kable on desktop | +| Firmware Update OTA | ✓ | ✗ | Use web flasher | +| Notifications | ✓ | ✓ | Native OS notifications | +| Widgets | ✓ | ✗ | Android-only | +| AI Assistant (Chirpy) | ✓\* | ✗ | Google flavor Android only | + +\*Chirpy AI requires Android 14+ on Google flavor builds with supported hardware. + +## UI Differences + +The Desktop app uses the same Compose Multiplatform UI with adaptations for larger screens and desktop interaction. + +### Keyboard Shortcuts + +| Shortcut | Action | +| ------------------- | --------------------------- | +| **⌘Q** / **Ctrl+Q** | Quit the application | +| **⌘,** / **Ctrl+,** | Open Settings | +| **⌘1** / **Ctrl+1** | Switch to Conversations tab | +| **⌘2** / **Ctrl+2** | Switch to Nodes tab | +| **⌘3** / **Ctrl+3** | Switch to Map tab | +| **⌘4** / **Ctrl+4** | Switch to Connections tab | + +### Window & System Tray + +- **Window resizing** — responsive layout adapts to window dimensions +- **System tray** — minimize to system tray for background mesh operation +- **Tray menu** — right-click the tray icon to show window or quit +- **Mouse interaction** — hover states and standard desktop navigation + +### Notification Preferences + +The Desktop app provides in-app toggles for controlling which notifications are shown — messages, new nodes, and low battery alerts. Access these from **Settings → Notifications** within the app. + +## Built-in Documentation Browser + +The Desktop app includes a built-in documentation browser for quick access to help content without leaving the application. + +![Docs browser with table of contents](/assets/screenshots/docs-browser_toc.png) + +The browser supports full-text search across all documentation: + +![Searching the docs browser](/assets/screenshots/docs-browser_search.png) + +Individual doc pages render with full formatting: + +![A documentation page](/assets/screenshots/docs-browser_page.png) + +## Building from Source + +```bash +git clone https://github.com/meshtastic/Meshtastic-Android.git +cd Meshtastic-Android +git submodule update --init +./gradlew :desktopApp:run +``` + +Requirements: + +- JDK 21 +- No Android SDK required for desktop-only builds + +## Known Limitations + +- No OTA firmware updates (use web flasher) +- Some Android-specific features (widgets, specific notification channels) are unavailable +- Performance may vary on low-spec hardware running Compose Desktop +- BLE bonding is not yet supported on desktop (pairing works without bonding) + +## Related Topics + +- [Connections](connections) — connection methods overview +- [Firmware Updates](firmware) — use the [Web Flasher](https://flasher.meshtastic.org) for desktop firmware updates + +--- + diff --git a/docs/pl-rPL/user/discovery.md b/docs/pl-rPL/user/discovery.md new file mode 100644 index 000000000..4198aad35 --- /dev/null +++ b/docs/pl-rPL/user/discovery.md @@ -0,0 +1,114 @@ +--- +title: Discovery +nav_order: 12 +last_updated: 2026-05-13 +description: Explore your mesh network — traceroute paths, neighbor maps, and node discovery tools. +aliases: + - mesh-discovery + - local-discovery + - network-scan + - traceroute + - neighbor-info +--- + +# Discovery + +Discovery tools help you understand **how** your mesh network is connected — which nodes can hear each other, what paths messages take, and where bottlenecks or weak links exist. + +> 💡 **Tip:** You don't need a dedicated "discovery mode" to start exploring your mesh. The tools below are available right now from the node list and node detail screens. + +--- + +## Pokaż trasę + +Traceroute reveals the exact path a message takes from your node to any other node on the mesh. It's the single most useful tool for debugging connectivity problems. + +### Running a Traceroute + +1. Navigate to **Nodes** and tap the node you want to trace. +2. On the node detail screen, tap **Traceroute**. +3. The app sends a traceroute request and waits for the response. +4. Results display each hop in order, with signal quality at every step. + +### Reading the Results + +A traceroute result looks like this: + +``` +You → Node A (SNR: 8.5, RSSI: -95) → Node B (SNR: 5.2, RSSI: -108) → Target +``` + +Each hop represents a relay node that forwarded the message. The SNR and RSSI values at each hop tell you about the link quality on that specific segment. + +| What to look for | What it means | +| -------------------------------------------------------------------------- | --------------------------------------------------------------------------- | +| All hops show Good SNR (> 5 dB) | Healthy path — messages flow reliably | +| One hop shows Bad SNR (< 0 dB) | Weak link — this relay segment is fragile | +| Many hops (4+) | Long path — consider repositioning a node to shorten it | +| Different path on retry | Mesh is adapting — multiple routes exist (this is good!) | + +> 💡 **Tip:** Run traceroute several times over a few minutes. If the path changes, your mesh has redundant routes — a sign of a well-connected network. + +### Troubleshooting with Traceroute + +- **"No route found"** — The target node may be offline, out of range, or on a different channel. Check that both nodes share at least one channel with the same encryption key. +- **Traceroute times out** — The path may be too long (exceeds hop limit) or a relay node is congested. Try increasing the hop limit in **Settings → LoRa Config**. +- **Asymmetric paths** — A traceroute from A→B may take a different path than B→A. This is normal — radio propagation is not always symmetric. + +--- + +## Informacje o sąsiadze + +The Neighbor Info module lets each node broadcast a list of the nodes it can **directly hear** (single-hop). When multiple nodes share their neighbor lists, you can piece together a topology map of the entire mesh. + +### Enabling Neighbor Info + +1. Navigate to **Settings → Module Config → Neighbor Info**. +2. Enable the module. +3. Set the broadcast interval (default: 900 seconds / 15 minutes). + +Once enabled, your node periodically broadcasts its neighbor table. Other nodes with Neighbor Info enabled do the same. + +### Viewing Neighbor Data + +- Open any node's detail screen and look for the **Neighbors** section. +- Each neighbor entry shows the node that was directly heard and its signal quality. +- Combine neighbor data from multiple nodes to understand the full mesh topology. + +> ⚠️ **Note:** Neighbor Info increases airtime usage because every enabled node periodically broadcasts its neighbor list. On busy meshes with many nodes, consider longer broadcast intervals (3600 seconds or more) to avoid congestion. + +--- + +## Node List as a Discovery Tool + +The node list itself is a powerful discovery tool when you use its filtering and sorting features effectively. + +### Finding New Nodes + +- Sort by **Last heard** to see the most recently active nodes at the top. +- Enable **Include unknown** to see nodes that have appeared on the mesh but haven't sent user info yet — these are often newly powered-on devices. + +### Assessing Connectivity + +- Sort by **Hops away** to see which nodes are directly reachable (0 hops) versus relayed. +- Sort by **Distance** to find nearby nodes and verify they're reachable. +- Use **Exclude MQTT** to focus on nodes reachable over radio (not via internet bridge). + +### Infrastructure Audit + +- Disable **Exclude infrastructure** to see Router, Repeater, Router Late, and Client Base nodes. +- Check their signal quality and last-heard times to verify your infrastructure nodes are healthy. + +See [Nodes](nodes) for full details on filtering and sorting options. + +--- + +## Tips for Mesh Exploration + +- **Start with traceroute** — it gives you immediate, actionable information about a specific path. +- **Enable Neighbor Info on key nodes** — especially routers and repeaters, to build a picture of the backbone. +- **Check the map** — node positions on the [Map](map-and-waypoints) combined with signal data help you understand why some links are strong and others are weak. +- **Compare signal over time** — use the [Signal Meter](signal-meter) guide to interpret SNR and RSSI values correctly. + +--- + diff --git a/docs/pl-rPL/user/firmware.md b/docs/pl-rPL/user/firmware.md new file mode 100644 index 000000000..1b4f6e56b --- /dev/null +++ b/docs/pl-rPL/user/firmware.md @@ -0,0 +1,114 @@ +--- +title: Firmware Updates +nav_order: 13 +last_updated: 2026-05-13 +description: Update your radio firmware over Bluetooth — OTA process, version channels, pre-flight checks, and recovery. +aliases: + - firmware + - update + - ota + - flash +--- + +# Firmware Updates + +Keep your Meshtastic radio up to date with the latest firmware for new features, bug fixes, and security improvements. + +## Checking for Updates + +1. Navigate to **Settings → Firmware Update** or tap the firmware notification if shown. +2. The app checks for available firmware versions. +3. Available updates show the version number and changelog summary. + +## Update Methods + +### OTA (Over-The-Air) via Bluetooth + +The most common update method for Android users: + +1. Ensure your radio is connected via Bluetooth. +2. Navigate to the Firmware Update screen. +3. Select the desired firmware version. +4. Tap **Update** to begin the OTA process. +5. Wait for the update to complete — **do not disconnect** during the update. + +![Firmware checking for updates](/assets/screenshots/firmware_checking.png) + +> ⚠️ **Warning:** Interrupting a firmware update can brick your device. Ensure your radio has sufficient battery (>50% recommended) and maintain Bluetooth proximity during the entire process. + +![Firmware disclaimer](/assets/screenshots/firmware_disclaimer.png) + +### USB Flashing + +For recovery or when OTA is unavailable: + +- Use the [Meshtastic Web Flasher](https://flasher.meshtastic.org) +- Or the [Meshtastic CLI tool](https://meshtastic.org/docs/getting-started/flashing-firmware) on desktop + +## Version Channels + +| Kanał | Opis | +| -------- | ------------------------------------------- | +| Stabilna | Recommended for most users; tested releases | +| Alpha | Preview releases; may contain bugs | + +## Pre-Update Checklist + +Before updating: + +- [ ] Battery > 50% +- [ ] Stable Bluetooth connection +- [ ] Note your current settings (they may reset on major version changes) +- [ ] Check the release notes for breaking changes + +## Post-Update + +After a successful update: + +- The radio will reboot automatically +- Bluetooth connection will re-establish +- Verify your settings are intact +- Check the firmware version in **Settings → About** + +![Firmware update success](/assets/screenshots/firmware_success.png) + +## Troubleshooting + +### Update Stuck + +If the update appears frozen: + +- Wait at least 5 minutes before intervening +- If truly stuck, power-cycle the radio +- Attempt the update again + +![Firmware update error](/assets/screenshots/firmware_error.png) + +### Device Won't Boot After Update + +If your device fails to boot: + +1. Try connecting via USB to a computer +2. Use the web flasher in recovery/DFU mode +3. Flash a known-good firmware version +4. Check the Meshtastic Discord for device-specific recovery steps + +### Compatibility Warnings + +The app may show warnings when: + +- Connected radio firmware is below minimum supported version +- Major version mismatch between app and firmware +- Deprecated features need migration + +> ⚠️ **Important:** Always update the Meshtastic app before or alongside firmware updates to ensure compatibility. + +## Related Topics + +- [Connections](connections) — reconnecting after a firmware update +- [Flashing firmware guide](https://meshtastic.org/docs/getting-started/flashing-firmware) — full firmware flashing walkthrough on meshtastic.org +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — check firmware compatibility by device +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/pl-rPL/user/map-and-waypoints.md b/docs/pl-rPL/user/map-and-waypoints.md new file mode 100644 index 000000000..7972c5e14 --- /dev/null +++ b/docs/pl-rPL/user/map-and-waypoints.md @@ -0,0 +1,116 @@ +--- +title: Map & Waypoints +nav_order: 6 +last_updated: 2026-05-13 +description: View node positions on the map, create and share waypoints, and manage position sharing and privacy. +aliases: + - map + - waypoints + - gps + - location +--- + +# Map & Waypoints + +The Map screen shows the geographic positions of nodes on your mesh, along with shared waypoints. + +## Map View + +The map displays: + +- **Node positions** — colored markers for each node reporting location +- **Waypoints** — shared points of interest +- **Your position** — your current GPS location + +### Node Markers + +Node markers on the map indicate: + +| Color | Meaning | +| --------- | ---------------------------------------------- | +| Zielony | Online (heard recently) | +| Yellow | Away (heard within 2 hours) | +| Gray | Offline (stale position) | +| Niebieski | Your own node | + +### Map Controls + +- **Zoom** — pinch or use +/- buttons +- **Pan** — drag to explore +- **Center** — select the location button to center on your position +- **Node tap** — tap a node marker to view details + +The floating toolbar provides quick access to compass, layer switching, node filters, refresh, and location tracking. Tap the compass to reorient north-up, or tap the location button to center on your current position. + +![Map controls overlay](/assets/screenshots/map_controls_overlay.png) + +## Waypoints + +Waypoints are shared geographic points of interest that all mesh members can see. + +### Creating a Waypoint + +1. Long-press on the map at the desired location. +2. Enter a name and optional description. +3. Choose an icon/emoji for the waypoint. +4. Tap **Send** to share with the mesh. + +### Waypoint Properties + +| Property | Opis | +| ----------- | ------------------------------------------------------- | +| Nazwa | Short identifier (max 30 characters) | +| Opis | Optional longer description | +| Icon | Visual marker emoji on the map | +| Zablokowany | If locked, only the creator can edit or delete | +| Expiration | Optional auto-remove time | + +### Waypoint Expiration + +Waypoints can be set to expire automatically: + +- **Never** (default) — waypoint remains until manually deleted +- **Timed** — waypoint is automatically removed after the specified duration (e.g., "remove after 2 hours"). Useful for temporary markers like rally points, hazards, or meeting locations. + +Expired waypoints are automatically hidden from the map so they don't clutter the display. The expiration countdown begins when the waypoint is created, not when other nodes receive it. + +### Managing Waypoints + +- Tap a waypoint on the map to view its details and coordinates +- Edit or delete waypoints you created +- **Locked waypoints** cannot be modified or deleted by other nodes — only the original creator can change them +- Unlocked waypoints can be edited by any mesh member + +## Position Sharing + +### Enabling Position Sharing + +Your node shares its GPS position based on: + +- **Fixed interval** — broadcast position at regular intervals +- **Smart position** — broadcast when movement exceeds a threshold +- **Manual** — only share when explicitly requested + +Configure position behavior in **Settings → Position**. + +### Privacy Considerations + +> 🔒 **Privacy:** Position data is broadcast to all nodes on your channel. If you don't want your location shared, disable GPS position in settings or use a fixed/fake position. + +## Map Sources + +The app supports multiple map tile sources: + +- OpenStreetMap (default) +- Satellite imagery (where available) +- Offline tiles (download map areas for offline use) + +## Related Topics + +- [Nodes](nodes) — view and filter your node list +- [Node Metrics](node-metrics) — signal quality and position history for individual nodes +- [Discovery](discovery) — traceroute and neighbor info for understanding mesh topology +- [Units & Locale](units-and-locale) — distance and coordinate display formats + +--- + diff --git a/docs/pl-rPL/user/messages-and-channels.md b/docs/pl-rPL/user/messages-and-channels.md new file mode 100644 index 000000000..5abd45c33 --- /dev/null +++ b/docs/pl-rPL/user/messages-and-channels.md @@ -0,0 +1,159 @@ +--- +title: Messages & Channels +nav_order: 3 +last_updated: 2026-05-13 +description: Send and receive messages, manage channels, configure encryption, and use quick chat, reactions, and message actions. +aliases: + - channels + - direct-messages + - messaging + - conversations +--- + +# Messages & Channels + +Meshtastic supports two communication modes: **channel broadcasts** and **direct messages**. + +## Kanały + +Channels are shared communication groups. All nodes configured with the same channel key can read and send messages on that channel. + +### Default Channel + +Every Meshtastic device comes with a default **LongFast** channel. This is an unencrypted channel used for general mesh communication. + +### Bezpieczeństwo kanału + +Channels support multiple encryption levels: + +| Icon | Security Level | Opis | +| ---- | ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------- | +| 🔒 | PSK (256-bit AES) | Fully encrypted with a strong pre-shared key. Only nodes with the matching key can read messages. | +| 🔐 | PSK (128-bit AES) | Encrypted with a shorter key. Secure for most uses but 256-bit is preferred for sensitive data. | +| 🔓 | Default / Open | Uses the well-known default key. **Any Meshtastic device** on the same preset can read these messages. | +| ⚠️ | Insecure + Position | Open channel that also broadcasts your GPS position. Use with caution in public meshes. | + +> 🔒 **Security Tip:** 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. + +### Adding a Channel + +1. Navigate to **Settings → Channels**. +2. Tap **Add Channel** or scan a QR code. +3. Configure the channel name and encryption key. +4. Share the channel URL/QR code with others who need access. + +Tapping a channel shows its details and sharing options. + +## Bezpośrednie Wiadomości + +Direct messages (DMs) are point-to-point encrypted communications between two specific nodes. + +### Sending a Direct Message + +1. Open the **Messages** tab. +2. Select a node from your contacts list or tap a node in the node list. +3. Type your message and tap **Send**. + +### Message States + +| State | Icon | Meaning | +| --------------------------------- | ---- | ----------------------------------------------------------------------------------------------------------------- | +| Queued | ⏳ | Message waiting to be sent | +| En route | ✓ | Delivered to the radio, awaiting acknowledgment | +| Dostarczono | ✓✓ | Acknowledgment received from recipient | +| Received | ✓ | Message received from the mesh (incoming) | +| S&F Routing | 🔗 | Store & Forward: message being routed through an S&F node | +| S&F Confirmed | 🔗 | Store & Forward: delivery confirmed via S&F node | +| Błąd | ✗ | Delivery failed after retries | + +### Delivery Errors + +When a message fails to deliver, the error indicator shows what went wrong: + +| Błąd | Meaning | What to Do | +| ---------------- | ---------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Brak trasy | No path exists to the destination node | The recipient may be offline or out of mesh range. Try later or move closer. | +| Got NAK | The next-hop node refused to relay | The relay node may be congested. Wait and retry. | +| Limit czasu | No acknowledgment within retry window | The recipient may be just out of range. Try increasing hop limit or moving to a better position. | +| Brak interfejsu | No radio interface available to send | Check that your radio is connected and the channel is configured. | +| Max Retransmit | All retry attempts exhausted | The mesh path is unreliable. Try a different channel or wait for conditions to improve. | +| Brak kanału | The destination channel doesn't exist | Verify both nodes share the same channel configuration. | +| Too Large | Message exceeds maximum payload size | Shorten your message (max ~230 characters). | +| Brak odpowiedzi | Node received message but didn't respond | The recipient's radio may be busy or in low-power sleep mode. | +| Duty Cycle Limit | Regional airtime limit reached | Your radio has used its allowed transmit time. Wait for the duty cycle window to reset (typically 1 hour in EU regions). | +| Złe żądanie | Malformed or invalid message | This usually indicates a software bug. Try restarting the app. | + +> 💡 **Tip:** 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. + +## Message Features + +### Quick Chat + +Pre-configured messages for rapid communication: + +- Access via the Quick Chat button in the message input area +- Choose from built-in phrases or custom messages +- Customize quick chat messages in **Settings → Quick Chat** +- Useful when typing is impractical (gloves, small screen, urgent) + +![Quick chat option](/assets/screenshots/messages_quick_chat.png) + +The channel list shows each channel with its latest message preview. + +### Message Bubbles + +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. + +### Reactions + +React to messages with emoji: + +- **Long-press** a message to open the actions menu +- Tap **Add Reaction** to choose an emoji +- Reactions appear below the message bubble +- Multiple users can react to the same message +- React to your own messages or others' messages + +![Emoji reaction badges displayed beneath a message](/assets/screenshots/messages_reaction.png) + +> 💡 **Tip:** Reactions are lightweight — they use minimal mesh bandwidth compared to full text messages. + +### Message Actions + +Long-press any message to access: + +- **Copy** — copy message text to clipboard +- **Reply** — quote the message in your response +- **React** — add an emoji reaction +- **Delete** — remove a message you sent (local deletion) + +### Message Priority + +Messages are queued and transmitted based on priority: + +1. Emergency/alert messages (highest) +2. Direct messages +3. Channel broadcasts (lowest) + +### Message Limits + +- **Maximum length:** 237 bytes (approximately 230 characters for ASCII text) +- **Rate limiting:** The mesh enforces airtime fairness; heavy message volume may be throttled +- **Delivery:** Messages are retried automatically if no acknowledgment is received + +## Best Practices + +- Use channels for group coordination +- Use direct messages for private person-to-person communication +- Keep messages short — mesh bandwidth is limited +- Configure encryption for sensitive communications + +## Related Topics + +- [Nodes](nodes) — tap a node to start a direct message +- [Settings — Radio & User](settings-radio-user) — configure channel encryption and presets +- [MQTT](mqtt) — bridge channel messages to the internet +- [Channel configuration](https://meshtastic.org/docs/configuration/radio/channels) — detailed channel settings on meshtastic.org + +--- + diff --git a/docs/pl-rPL/user/mqtt.md b/docs/pl-rPL/user/mqtt.md new file mode 100644 index 000000000..57858b492 --- /dev/null +++ b/docs/pl-rPL/user/mqtt.md @@ -0,0 +1,137 @@ +--- +title: MQTT +nav_order: 11 +last_updated: 2026-05-13 +description: Bridge your mesh to the internet — MQTT broker setup, encryption layers, and map reporting. +aliases: + - mqtt + - internet-bridge + - broker +--- + +# MQTT + +MQTT bridges your Meshtastic mesh network to the internet, enabling long-range communication beyond radio range. + +## Overview + +The MQTT module connects your node to an MQTT broker, allowing: + +- Messages to reach nodes on different physical meshes via the internet +- Integration with home automation and monitoring systems +- Publishing node positions to the public Meshtastic map +- Custom data pipelines for logging and alerting + +## How It Works + +``` +[Your Node] → Radio → [Gateway Node with WiFi] → MQTT Broker → [Remote Gateway] → Radio → [Remote Node] +``` + +A gateway node with internet access (WiFi or Ethernet) publishes mesh messages to an MQTT topic. Remote gateways subscribed to the same topic inject those messages into their local mesh. + +## Konfiguracja + +### Enabling MQTT + +1. Navigate to **Settings → Module Config → MQTT**. +2. Enable the MQTT module. +3. Configure the broker connection: + +![MQTT toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | Opis | Domyślny | +| ----------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------- | +| Server Address | MQTT broker hostname | mqtt.meshtastic.org | +| Nazwa użytkownika | Broker authentication | meshdev | +| Hasło | Broker authentication | large4cats | +| Root Topic | Base topic for messages | msh | +| Szyfrowanie | Encrypt MQTT payload | Włączony | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON packet support has been removed from firmware; this field is ignored | Wyłączony | +| TLS | Secure connection to broker | Wyłączony | +| Map Reporting | Report position to public map | Wyłączony | + +### Default Meshtastic Broker + +The community maintains a public broker at `mqtt.meshtastic.org`. This is intended for general use and testing. + +> 🔒 **Privacy:** Messages on the public broker are readable by anyone subscribed. Always use channel encryption for private communications. + +### Private Broker + +For better privacy and control, you can run your own MQTT broker: + +- Mosquitto (lightweight, open-source) +- HiveMQ +- EMQX + +Configure your node to point to your private broker with appropriate credentials. + +## Map Reporting + +When Map Reporting is enabled, your node publishes its position to the Meshtastic community map: + +- Visible at [meshmap.net](https://meshmap.net) and similar community map services +- Only position and node info are shared +- Disable this if you don't want your location publicly visible + +## Uplink vs Downlink + +| Direction | Opis | +| ------------ | -------------------------------- | +| **Uplink** | Messages from mesh → MQTT broker | +| **Downlink** | Messages from MQTT broker → mesh | + +Configure per-channel which directions are active to control message flow and airtime usage. + +## Message Formats + +MQTT uses protobuf message format: + +| Format | Opis | Use case | +| ------------ | ----------------------------------- | -------------------------- | +| **Protobuf** | Binary Meshtastic protobuf encoding | Node-to-node mesh bridging | + +> ⚠️ **Note:** JSON output support was removed from firmware. The `json_enabled` setting is still visible in the app for legacy compatibility but has no effect on current firmware versions. + +## Encryption & Privacy + +Understanding the layered encryption model: + +1. **Channel encryption** happens on the mesh _before_ MQTT. If your channel has a PSK, the MQTT payload is already encrypted — the broker and any subscribers see only the ciphertext. +2. **MQTT encryption** (the module setting) adds an additional encryption layer for transit to the broker. This protects metadata and routing information. +3. **TLS** encrypts the TCP connection to the broker itself, preventing network-level eavesdropping. + +> 🔒 **Important:** The default public channel has a well-known key. Messages on the default channel sent via MQTT are effectively **unencrypted** — anyone can decode them. Always use a custom PSK for private communications. + +## Best Practices + +- Use channel-level encryption (PSK) on channels that bridge to MQTT +- Don't enable MQTT on nodes without internet access (it will buffer and waste memory) +- Use a private broker for sensitive deployments +- Be mindful of airtime when downlinking messages from busy MQTT topics — every downlinked message consumes radio airtime on your local mesh +- Consider enabling uplink-only if you only need to monitor your mesh remotely without injecting messages back + +## Troubleshooting + +### MQTT Not Connecting + +- **Check WiFi** — the gateway node must have an active internet connection (WiFi or Ethernet). MQTT does not work over the LoRa radio link itself. +- **Verify credentials** — incorrect username or password will silently fail on most brokers. Double-check for trailing spaces. +- **Firewall** — port 1883 (MQTT) or 8883 (MQTT+TLS) must be open. Some networks block non-standard ports. +- **DNS resolution** — if using a custom broker hostname, verify the node can resolve it. Try the broker's IP address directly. + +### Messages Not Bridging + +- **Check uplink/downlink settings** — if only uplink is enabled, messages flow from mesh to MQTT but not back. Enable downlink on the receiving gateway. +- **Channel mismatch** — both gateways must share the same channel with the same PSK. A mismatch means messages are encrypted with different keys and appear as garbage. +- **Topic mismatch** — ensure both gateways use the same root topic. The default `msh` works for the public broker. + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — MQTT module configuration reference +- [Messages & Channels](messages-and-channels) — channel encryption and PSK setup +- [MQTT integration guide](https://meshtastic.org/docs/software/integrations/mqtt) — detailed MQTT documentation on meshtastic.org + +--- + diff --git a/docs/pl-rPL/user/node-metrics.md b/docs/pl-rPL/user/node-metrics.md new file mode 100644 index 000000000..5d1a9b008 --- /dev/null +++ b/docs/pl-rPL/user/node-metrics.md @@ -0,0 +1,130 @@ +--- +title: Node Metrics +nav_order: 5 +last_updated: 2026-05-13 +description: Telemetry dashboards for each mesh node — device health, environment sensors, signal quality, power, traceroute, and position history. +aliases: + - metrics + - telemetry + - device-metrics + - signal +--- + +# Node Metrics + +The node detail screen provides comprehensive telemetry and metrics for each node on your mesh. + +## Metryka urządzenia + +Basic operating information reported by each node: + +| Metric | Opis | +| -------------------------- | ----------------------------------- | +| Poziom naładowania baterii | Current battery percentage | +| Napięcie | Battery voltage reading | +| Wykorzystanie kanału | Percentage of airtime consumed | +| Czas nadawania | Transmission time used by this node | +| Czas pracy | Time since last reboot | + +Device metrics are displayed as individual cards with trend sparklines showing battery level, voltage, channel utilization, airtime, and uptime over time. + +> 💡 **Tip:** Tap any metric card to expand it into a full chart with historical data points. Pinch to zoom the time axis. + +## Metryki środowiskowe + +Environmental sensor data (requires compatible hardware): + +| Metric | Sensor Examples | +| ------------------------------------ | --------------------- | +| Temperatura | BME280, BME680, SHT31 | +| Wilgotność | BME280, BME680, SHT31 | +| Ciśnienie barometryczne | BME280, BMP280 | +| Rezystancja gazu | BME680 | +| IAQ (Air Quality) | BME680 | + +Environment metrics are charted over time for easy trend analysis — temperature, humidity, and pressure each get their own line chart with the measurement unit displayed on the Y axis. + +> 💡 **Tip:** Environment metrics require a sensor connected to the remote node. Not all nodes report environmental data. See [Telemetry & Sensors](telemetry-and-sensors) for a full list of supported sensors. + +## Signal Metrics + +Radio signal quality information: + +| Metric | Opis | +| --------------------- | ----------------------------------------------------------------------------- | +| SNR: | Signal-to-Noise Ratio (higher is better) | +| RSSI: | Received Signal Strength Indicator (closer to 0 is better) | +| Hop Count | Number of mesh hops for last message | + +### Signal Quality Reference + +| SNR Range | Quality | +| --------------------------------- | ------------- | +| > 10 dB | Excellent | +| 0 to 10 dB | dobry | +| -10 to 0 dB | wystarczający | +| < -10 dB | Poor | + +## Metryki zasilania + +Power management telemetry (requires INA sensor or compatible hardware): + +| Metric | Opis | +| ----------- | ----------------------- | +| Bus Voltage | Supply voltage | +| Natężenie | Power draw in milliamps | +| Zasilanie | Calculated wattage | + +## Pokaż trasę + +Traceroute shows the path a message takes through the mesh: + +1. From the node detail screen, tap **Traceroute**. +2. The app sends a traceroute request to the target node. +3. Results show each hop with SNR/RSSI values. + +### Reading Traceroute Results + +``` +You → Node A (SNR: 8.5) → Node B (SNR: 5.2) → Target +``` + +Each hop represents a relay node that forwarded the message. + +## Historia pozycji + +Historical position data for nodes that share their location: + +- GPS coordinates +- Wysokość +- Speed (if moving) +- Timestamp for each position report + +## Informacje o sąsiadze + +Shows which nodes a given node can directly hear, useful for understanding mesh topology. + +## Viewing Metrics + +1. Navigate to **Nodes**. +2. Tap the node you want to inspect. +3. Select the metric category from the detail tabs. + +![Node detail — local device](/assets/screenshots/nodes_detail_local.png) + +The position tab shows location data for nodes that share GPS: + +![Position inline content](/assets/screenshots/nodes_position.png) + +> ⚠️ **Note:** Metrics are only available when they have been reported by the remote node. Metrics update at intervals configured on each node's telemetry settings. + +## Related Topics + +- [Nodes](nodes) — node list, filtering, and sorting +- [Telemetry & Sensors](telemetry-and-sensors) — supported sensors and configuration +- [Signal Meter](signal-meter) — how signal quality is calculated from SNR and RSSI +- [Discovery](discovery) — traceroute details and neighbor info +- [Units & Locale](units-and-locale) — temperature, distance, and speed display formats + +--- + diff --git a/docs/pl-rPL/user/nodes.md b/docs/pl-rPL/user/nodes.md new file mode 100644 index 000000000..4f7f94308 --- /dev/null +++ b/docs/pl-rPL/user/nodes.md @@ -0,0 +1,152 @@ +--- +title: Węzły +nav_order: 4 +last_updated: 2026-05-13 +description: Browse, filter, and sort mesh nodes — view details, signal quality, roles, and quick actions. +aliases: + - node-list + - mesh-nodes + - peers +--- + +# Węzły + +The Nodes screen displays all devices visible on your mesh network. + +## Node List + +The node list shows every node your radio has heard, including: + +- **Node name** — user-configured long name +- **Short name** — 4-character identifier +- **Signal quality** — last heard signal strength +- **Last heard** — time since last communication +- **Distance** — estimated distance (if positions are shared) +- **Battery** — remote node battery level (if telemetry is enabled) + +### Node Status Indicators + +| Badge | Meaning | +| ---------- | ------------------------------------- | +| 🟢 Online | Node heard within the last 15 minutes | +| 🟡 Away | Node heard within the last 2 hours | +| 🔴 Offline | Node not heard for over 2 hours | +| ⭐ Favorite | Node marked as favorite by the user | + +### Node Roles + +Nodes can be configured with different roles that affect their mesh behavior: + +| Rola | Opis | +| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Klient | Standard end-user device | +| Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | +| Klient pasywny | Receives but doesn't retransmit | +| Client Hidden | Like Client Mute, plus hides from node list | +| Router | Prioritizes message forwarding; stays awake to relay | +| Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | +| ~~Router Client~~ | ⚠️ **Deprecated** (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | +| ~~Repeater~~ | ⚠️ **Deprecated** (removed in firmware 2.7.11) — no longer selectable; use Router instead | +| Tracker | Optimized for position reporting at regular intervals | +| Czujnik | Optimized for telemetry reporting | +| TAK | Interoperates with TAK systems (sends/receives CoT) | +| TAK Tracker | TAK position reporting only | +| Lost & Found | Continuous position beacon for recovery | + +### Choosing a Role + +Most users should keep the default **Client** role. Consider a different role when: + +- **Router** — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don't use Router on battery-powered handheld devices. +- **Router Late** — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. +- **Client Base** — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. +- **Client Mute** — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only devices or to reduce congestion in dense areas. +- **Tracker** — An unattended device whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. +- **Sensor** — An unattended device reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. +- **TAK / TAK Tracker** — Only needed if interoperating with ATAK/WinTAK systems. See [TAK Integration](tak) for details. + +> 💡 **Tip:** The mesh works best when most nodes are **Client** or **Router**. Too many Mute nodes reduces mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. + +### Encryption Indicators + +Nodes display encryption status icons next to their name: + +| Icon | Meaning | +| ----------- | ------------------------------------------------------------------------------------------------------------------- | +| 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | +| 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | +| ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) | + +> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. + +## Quick Actions + +From the node list, you can: + +- **Tap** a node to view its detail page +- **Long-press** for quick actions: + - Send a direct message + - Pokaż na mapie + - Poproś o pozycję + - Mark as favorite + - Pokaż trasę + +## Filtering & Sorting + +### Text Search + +Type in the search field to filter nodes by name or short name. The filter updates in real time as you type. + +### Filter Toggles + +| Filtr | Opis | +| -------------------------- | ---------------------------------------------------------------------------------------------- | +| **Only online** | Show only nodes heard within the last 15 minutes | +| **Only direct** | Show only nodes with direct (non-relayed) connections | +| **Include unknown** | Show nodes that haven't sent user info yet | +| **Exclude infrastructure** | Hide infrastructure-role nodes (Router, Repeater, Router Late, Client Base) | +| **Exclude MQTT** | Hide nodes heard only via MQTT internet bridge | +| **Show ignored** | Show nodes you've previously dismissed or muted | + +### Sort Options + +| Sort | Opis | +| ------------------------------------------- | ------------------------------------------------------------------ | +| **Last heard** (default) | Most recently heard nodes first | +| **Alphabetical** | Sorted by node long name | +| **Distance** | Nearest nodes first (requires position sharing) | +| **Hops away** | Fewest relay hops first | +| **Channel** | Grouped by channel index | +| **Via MQTT** | Grouped by MQTT vs. radio-heard | +| **Favorites** | Favorited nodes first | + +## Node Detail + +Tapping a node opens the detail view with comprehensive information. See [Node Metrics](node-metrics) for full details on metrics and telemetry. + +![Node detail view](/assets/screenshots/nodes_node_list.png) + +The detail screen includes device info, position, and action buttons: + +![Node detail section](/assets/screenshots/nodes_detail_section.png) + +Inline status indicators show key metrics at a glance: + +| Indicator | Screenshot | +| -------------------------- | -------------------------------------------------------- | +| Signal quality | ![Signal](/assets/screenshots/nodes_signal_info.png) | +| Poziom naładowania baterii | ![Battery](/assets/screenshots/nodes_battery_info.png) | +| Hop count | ![Hops](/assets/screenshots/nodes_hops_info.png) | +| Aktywność | ![Last heard](/assets/screenshots/nodes_last_heard.png) | +| Odległość | ![Distance](/assets/screenshots/nodes_distance_info.png) | + +## Related Topics + +- [Node Metrics](node-metrics) — detailed telemetry dashboards for each node +- [Messages & Channels](messages-and-channels) — send a direct message to a node +- [Map & Waypoints](map-and-waypoints) — view node positions geographically +- [Discovery](discovery) — traceroute and neighbor info for topology exploration +- [Signal Meter](signal-meter) — understand what the signal bars mean + +--- + diff --git a/docs/pl-rPL/user/onboarding.md b/docs/pl-rPL/user/onboarding.md new file mode 100644 index 000000000..3b910534e --- /dev/null +++ b/docs/pl-rPL/user/onboarding.md @@ -0,0 +1,99 @@ +--- +title: Getting Started +nav_order: 1 +last_updated: 2026-05-13 +description: First-launch setup — permissions, onboarding flow, and next steps after connecting your radio. +aliases: + - first-launch + - setup + - intro +--- + +# Getting Started + +Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app. + +## First Launch + +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. + +### Welcome Screen + +The welcome screen introduces Meshtastic and its core capabilities: + +- Off-grid mesh communication +- No cellular or internet required +- End-to-end encrypted messaging + +Tap **Get Started** to proceed through the setup flow. + +![Welcome screen](/assets/screenshots/onboarding_welcome.png) + +## Permissions + +The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. + +### Bluetooth Permission + +Bluetooth is the primary connection method between your phone and Meshtastic radio: + +- **Bluetooth scanning** — discover nearby Meshtastic radios +- **Bluetooth connect** — establish and maintain connections with paired radios + +Grant both permissions when prompted. Without Bluetooth, you'll need to use USB or TCP connections instead. + +### Location Permission + +> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. + +Meshtastic also uses your location for: + +- Showing your position on the mesh map +- Calculating distances to other nodes +- Sharing your GPS coordinates with other mesh members (if enabled) + +Grant **"While using the app"** or **"Always"** depending on your preference: + +- **While using the app** — position updates only when the app is open +- **Always** — enables background position updates for always-on mesh presence + +If denied, Bluetooth scanning will not function and your node will not report a position. + +### Notifications Permission + +Notifications alert you to: + +- Incoming messages from channels and direct messages +- Connection status changes (connected, disconnected, reconnecting) +- Firmware update availability + +> 💡 **Tip:** You can fine-tune notification preferences later in Android system settings. The app creates separate notification channels for messages, connection events, and background service status. + +### Critical Alerts Permission + +On supported devices, the app may request permission for critical alerts: + +- These are high-priority notifications that can break through Do Not Disturb mode +- Useful for emergency mesh alerts or urgent messages +- You can **skip** this step if you don't need breakthrough notifications +- Configure or revoke later in Android notification settings + +## After Setup + +Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. + +> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. + +## What's Next? + +Once connected to a radio, explore: + +- [Connections](connections) — pair your first radio device +- [Messages & Channels](messages-and-channels) — send your first message +- [Nodes](nodes) — see who's on your mesh +- [Map & Waypoints](map-and-waypoints) — view node positions +- [Settings](settings-radio-user) — configure your radio and user profile + +New to Meshtastic? The [getting started guide](https://meshtastic.org/docs/getting-started) on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup. + +--- diff --git a/docs/pl-rPL/user/settings-module-admin.md b/docs/pl-rPL/user/settings-module-admin.md new file mode 100644 index 000000000..57fa5f158 --- /dev/null +++ b/docs/pl-rPL/user/settings-module-admin.md @@ -0,0 +1,246 @@ +--- +title: Settings — Modules & Admin +nav_order: 8 +last_updated: 2026-05-13 +description: Configure optional feature modules (MQTT, telemetry, canned messages, TAK, and more) and perform device administration. +aliases: + - modules + - module-config + - administration +--- + +# Settings — Modules & Admin + +Configure optional feature modules and perform device administration. Modules extend Meshtastic with specialized capabilities — each can be independently enabled or disabled. + +> 💡 **Tip:** You only need to enable the modules you actually use. Disabling unused modules reduces airtime, saves battery, and simplifies your configuration. + +Module settings use a card-based layout with toggle switches, dropdowns, text fields, and sliders: + +![Toggle switch](/assets/screenshots/settings_switch.png) + +![Dropdown selector](/assets/screenshots/settings_dropdown.png) + +![Text field](/assets/screenshots/settings_text_field.png) + +![Settings card layout](/assets/screenshots/settings_titled_card.png) + +## Konfiguracja modułu + +### MQTT Module + +Bridges mesh messages to and from an MQTT broker for internet connectivity. This is how you extend your mesh beyond radio range or integrate with home automation systems. + +| Setting | Opis | +| ----------------- | ------------------------------------------------------------------------ | +| Włączony | Toggle MQTT bridge | +| Serwer | MQTT broker address | +| Nazwa użytkownika | Authentication username | +| Hasło | Authentication password | +| Szyfrowanie | Encrypt MQTT payloads | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON support removed from firmware; field is ignored | +| TLS | Use secure connection | +| Root Topic | Base MQTT topic path | +| Map Report | Publish position for public map | + +See [MQTT](mqtt) for a detailed usage guide including encryption, privacy, and broker setup. + +### Serial Module + +Enables serial port communication for external device integrations (GPS modules, sensors, or custom hardware). When enabled, the node's serial port can send and receive protobuf or text data, allowing external microcontrollers or computers to interact with the mesh. + +| Setting | Opis | +| ---------- | ------------------------------- | +| Włączony | Activate serial communication | +| Echo | Echo received serial data back | +| Tryb | Text, Protobuf, or NMEA output | +| RX/TX Pins | GPIO pins for serial connection | +| Baud Rate | Serial communication speed | + +### External Notification Module + +Controls buzzer, LED, or vibration alerts on your radio hardware. Useful for devices that need to physically signal when a message arrives — particularly helpful for unattended or outdoor installations. + +| Setting | Opis | +| -------------------------------- | --------------------------- | +| Włączony | Activate notifications | +| Alert Message | Notify on incoming messages | +| Alert Message Buzzer | Use buzzer for messages | +| Alert Message Vibra | Use vibration for messages | +| Alert Bell | Notify on bell character | +| Output (GPIO) | Pin for notification output | +| Active | High or Low active | +| Duration (ms) | Notification length | +| Use I2S as Buzzer | Use I2S audio output | + +### Store & Forward Module + +Buffers messages for nodes that were temporarily offline, then replays them when those nodes reconnect. Essential for meshes where nodes go in and out of range regularly — ensures messages aren't lost during brief disconnections. + +| Setting | Opis | +| ------------------------------------------ | -------------------------- | +| Włączony | Activate store and forward | +| Heartbeat (s) | Announcement interval | +| Wpisów | Maximum stored messages | +| History Return (max) | Max messages to replay | +| History Return (window) | Time window for replay | + +> 💡 **Tip:** Store and Forward works best on nodes with ample memory (ESP32 with PSRAM). Router nodes are ideal candidates since they're typically always-on. + +### Range Test Module + +Automated range testing tool for evaluating link quality between nodes. When enabled, the node periodically transmits test messages with incrementing counters. A receiver node logs these messages, allowing you to walk or drive away and later analyze at what distance messages stopped arriving. + +| Setting | Opis | +| -------------------------------------- | --------------------------------- | +| Włączony | Activate range testing | +| Sender Interval (s) | Time between test transmissions | +| Save CSV | Log received test data to SD card | + +### Telemetry Module + +Controls what telemetry data your node shares with the mesh. Telemetry includes device health (battery, uptime) and environmental sensor data (temperature, humidity, pressure). + +| Setting | Opis | +| ---------------------------- | --------------------------------------- | +| Device Metrics Interval | How often to report device metrics | +| Environment Metrics Interval | How often to report environment sensors | +| Air Quality Enabled | Report particulate sensor data | +| Power Metrics Enabled | Report power usage | + +See [Telemetry & Sensors](telemetry-and-sensors) for supported sensors and configuration recommendations. + +### Canned Message Module + +Pre-configured messages accessible from the device's physical buttons (for radios with rotary encoders, keypads, or similar input hardware). Define a list of quick-send messages that can be transmitted without a phone connected — ideal for field use. + +| Setting | Opis | +| ------------------ | ----------------------------------------------------------- | +| ~~Enabled~~ | ⚠️ **Deprecated** — current firmware may ignore this toggle | +| Wiadomości | Newline-separated list of messages | +| Send Bell | Play bell sound on send | +| Rotary Encoder | Enable rotary encoder input | +| Up/Down/Press Pins | GPIO pin assignments for input | + +### Audio Module + +Codec2 audio support for low-bandwidth voice communication over the mesh. This is an **experimental** feature that encodes voice into very small data packets using the Codec2 codec. + +| Setting | Opis | +| --------------- | -------------------------------- | +| Włączony | Activate audio module | +| Codec2 Rate | Audio quality/bandwidth tradeoff | +| I2S Word Select | GPIO pin for I2S WS | +| I2S Data In | GPIO pin for I2S DIN | +| I2S Data Out | GPIO pin for I2S DOUT | + +> ⚠️ **Note:** Audio requires specific hardware (I2S microphone and speaker). Voice quality is very low-bandwidth — think "understandable radio voice," not phone-call quality. + +### Remote Hardware Module + +GPIO control over the mesh network. Allows a remote node to read or write GPIO pins on another node — useful for activating relays, reading switches, or controlling external hardware from a distance. + +| Setting | Opis | +| -------------------- | --------------------------------------------------------------- | +| Włączony | Activate remote GPIO access | +| Allow Undefined Pins | Allow access to any GPIO pin (security risk) | + +> ⚠️ **Warning:** Enabling "Allow Undefined Pins" gives remote nodes access to all GPIO pins, which could interfere with the radio's own hardware. Only enable on dedicated GPIO nodes. + +### Neighbor Info Module + +Broadcasts information about directly heard neighbors, enabling mesh topology mapping. Each enabled node periodically shares a list of the other nodes it can hear and their signal quality. + +| Setting | Opis | +| -------------------------------------- | ------------------------------------ | +| Włączony | Activate neighbor broadcasting | +| Update Interval (s) | How often to broadcast neighbor list | + +See [Discovery](discovery) for how to use neighbor data for mesh topology exploration. + +### Ambient Lighting Module + +Controls onboard NeoPixel or other addressable RGB LEDs on supported hardware. Can be used for visual status indicators, notification lights, or decorative effects. + +| Setting | Opis | +| ------------------ | ---------------------------------------------------------- | +| Włączony | Activate LED control | +| Stan diody LED | On, Off, or set specific color | +| Red / Green / Blue | Individual color channel values (0–255) | + +### Detection Sensor Module + +Turns your node into a motion or door sensor alert system. When a GPIO pin detects a state change (motion detected, door opened), the node broadcasts an alert message over the mesh. + +| Setting | Opis | +| ---------------------------------------- | ----------------------------------------------------------------------- | +| Włączony | Activate detection sensor | +| Monitor Pin | GPIO pin connected to sensor | +| Detection Triggered High | Trigger when pin goes high (vs. low) | +| Minimum Broadcast (s) | Minimum time between alert broadcasts | +| State Broadcast (s) | Periodic state broadcast interval | +| Send Bell | Include bell character in alerts | +| Friendly Name | Custom name for this sensor | + +### Paxcounter Module + +People counter using WiFi and BLE probe requests. Counts nearby devices by passively listening for probe requests that phones and laptops emit when scanning for networks. Available only on ESP32 devices. + +| Setting | Opis | +| -------------------------------------- | -------------------------- | +| Włączony | Activate people counting | +| Update Interval (s) | How often to report counts | + +> 💡 **Tip:** Paxcounter is useful for estimating foot traffic at trailheads, event venues, or other locations. Counts are approximate — one person may carry multiple devices. + +### TAK Module + +Team Awareness Kit integration for interoperability with ATAK and WinTAK. See [TAK Integration](tak) for detailed setup and usage. + +## Zarządzanie + +### Zdalne zarządzanie + +Remotely configure nodes that share your admin key: + +1. Select the target node in the node list. +2. Navigate to **Settings** for that node. +3. Modify configuration. +4. Tap **Save** — changes are sent over the mesh. + +> ⚠️ **Requires:** Admin key configured on both your node and the target node. + +### Wyczyść bazę węzłów + +Removes stale nodes from your local database that haven't been heard in a configurable time window. + +### Factory Reset + +Resets all settings to factory defaults. **This cannot be undone.** + +### Uruchom ponownie + +Remotely reboot a connected or administered node. + +### Panel debugowania + +View detailed diagnostic information: + +- Protocol buffers debug output +- Mesh packet log +- Connection state details + +### Troubleshooting Remote Admin + +- **"No response from target node"** — the target may be out of range, offline, or have a mismatched admin key. Verify the admin key matches on both nodes. +- **Changes not applying** — some settings require a reboot to take effect. Try the Reboot action after saving. +- **Can't see remote settings** — ensure your node has the admin key for the target node and that Admin Channel is enabled in Security Config. + +## Related Topics + +- [Settings — Radio & User](settings-radio-user) — core radio and user profile settings +- [Module configuration reference](https://meshtastic.org/docs/configuration/module) — detailed module docs on meshtastic.org +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/pl-rPL/user/settings-radio-user.md b/docs/pl-rPL/user/settings-radio-user.md new file mode 100644 index 000000000..a86042757 --- /dev/null +++ b/docs/pl-rPL/user/settings-radio-user.md @@ -0,0 +1,173 @@ +--- +title: Settings — Radio & User +nav_order: 7 +last_updated: 2026-05-13 +description: Configure your radio hardware, LoRa presets, user profile, position sharing, power management, and security. +aliases: + - ustawienia + - radio-config + - user-config + - lora +--- + +# Settings — Radio & User + +Configure your radio hardware and user identity parameters. + +## User Settings + +### User Profile + +| Setting | Opis | +| ----------------- | ------------------------------------------------------------------------------------- | +| Długa nazwa | Your display name (up to 39 characters) | +| Krótka nazwa | 4-character abbreviated name | +| Licensed Operator | Enable if you hold an amateur radio license (enables higher power) | + +### Applying Changes + +After modifying settings, tap **Save** to write the configuration to your radio. The device may reboot to apply changes. + +## Konfiguracja radia + +### Konfiguracja urządzenia + +| Setting | Opis | Domyślny | +| ------------------------------------------ | ----------------------------------------------------------------------- | --------- | +| Rola | Node behavior (Client, Router, etc.) | Klient | +| Tryb retransmisji | How the node retransmits messages | Wszystkie | +| Node Info Broadcast (s) | Interval for broadcasting node info | 10800 | +| Double-tap Button | Action for double-tap button press | Wyłączony | + +### Konfiguracja LoRa + +| Setting | Opis | Domyślny | +| --------------------------- | ----------------------------------------------------------------------- | ----------------------------------------- | +| Region | Regulatory region for frequency bands | Unset (must configure) | +| Ustawienie modemu | Speed/range tradeoff | LongFast | +| Limit przeskoków | Maximum retransmit hops | 3 | +| TX Power | Transmission power (dBm); 0 = max allowed for region | 0 (region max) | +| Przesunięcie częstotliwości | Fine-tune frequency (MHz) | 0 | +| Channel Bandwidth | Bandwidth setting | Default for preset | + +> ⚠️ **Important:** You **must** set your region before transmitting. Operating without the correct region may violate local radio regulations. See the [region configuration guide](https://meshtastic.org/docs/getting-started/initial-config) on meshtastic.org for details. + +### Modem Presets + +| Preset | Range | Prędkość | SNR Limit | Best For | +| ------------------ | ----------------------- | ------------------------- | ------------------------ | -------------------------------------------------------------------------------------------------------- | +| Short Turbo | ~1 km | 21.9 kbps | −5 dB | Dense urban with line-of-sight; data-heavy applications | +| Short Fast | ~3 km | 10.9 kbps | −7.5 dB | Urban neighborhoods; buildings within a few blocks | +| Short Slow | ~5 km | 5.5 kbps | −10 dB | Suburban short-range; moderate building density | +| Medium Fast | ~5 km | 5.5 kbps | −10 dB | Suburban areas; moderate building density | +| Medium Slow | ~8 km | 1.1 kbps | −12.5 dB | Suburban/rural; moderate range with slower speed | +| Long Turbo | ~10 km | 4.4 kbps | −10 dB | Similar range to Long Fast but with 500 kHz bandwidth; faster throughput | +| Long Fast | ~10 km | 1.1 kbps | −12.5 dB | **General use (default)** — balanced range and speed | +| Long Moderate | ~20 km | 0.34 kbps | −15 dB | Rural with some terrain; occasional use | +| Lite Fast | ~5 km | 5.5 kbps | −10 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Medium Fast | +| Lite Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Long Fast | +| Narrow Fast | ~5 km | 2.7 kbps | −10 dB | EU 868 MHz band (62.5 kHz BW); avoids interference with other devices | +| Narrow Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 868 MHz band (62.5 kHz BW); comparable to Long Fast | +| ~~Long Slow~~ | ~30 km | 0.18 kbps | −17.5 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | +| ~~Very Long Slow~~ | ~40+ km | 0.09 kbps | −20 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | + +#### Choosing a Modem Preset + +The modem preset controls the fundamental tradeoff between **range** and **data rate**: + +- **Slower presets** use more spreading, making signals decodable at weaker signal levels (lower SNR limit). This means longer range but fewer bytes per second. +- **Faster presets** pack more data per transmission but require a stronger signal to decode. + +**Practical guidance:** + +- **Urban mesh (many nodes, short distances):** Use **Long Fast** (default) or **Short Fast**. Higher speed means less airtime congestion when many nodes share the channel. +- **Rural/sparse mesh (few nodes, long distances):** Use **Long Moderate**. Range matters more than speed when nodes are far apart. +- **EU 866/868 MHz regulatory compliance:** Use **Lite Fast**, **Lite Slow**, **Narrow Fast**, or **Narrow Slow** — these are optimized for the EU SRD/868 MHz bands with narrower bandwidths. +- **Fixed infrastructure links:** Use **Short Turbo** or **Long Turbo** for dedicated point-to-point links with good antennas and line-of-sight. +- **Mixed environments:** Stick with **Long Fast** — it's the community default and ensures compatibility with others in your area. + +> ⚠️ **Important:** All nodes on the same channel **must** use the same modem preset. Nodes with mismatched presets cannot communicate even if they share the same frequency and encryption key. + +> 💡 **Tip:** The range estimates above assume flat terrain and modest antennas. Elevation advantage (hilltop, rooftop) dramatically increases effective range. A well-placed Router with Long Fast can often outperform a ground-level node with Long Slow. + +### Konfiguracja wyświetlacza + +| Setting | Opis | +| ---------------------- | ------------------------------------------------------------------------------------ | +| Wygaszenie ekranu | Time before display sleeps | +| Jednostki wyświetlania | Metric or Imperial | +| Typ ekranu OLED | Auto, SSD1306, SH1106, SH1107 | +| Compass Orientation | Rotation offset for compass display (0°, 90°, 180°, 270°) | +| ~~Compass North~~ | ⚠️ **Deprecated** — replaced by Compass Orientation; still visible in older firmware | + +### Konfiguracja pozycjonowania + +| Setting | Opis | +| ----------------------------------------- | ---------------------------------- | +| GPS Enabled | Enable/disable GPS | +| Interwał aktualizacji pozycji GPS | How often to acquire GPS fix | +| Position Broadcast (s) | How often to share position | +| Inteligentne Pozycjonowanie | Enable movement-based broadcasting | +| Położenie stałe | Use a manually set position | + +### Konfiguracja zarządzania energią + +| Setting | Opis | +| --------------------------------------- | --------------------------------------- | +| Power Saving | Enable low-power sleep mode | +| Shutdown After (s) | Auto-shutdown idle timer | +| ADC Multiplier | Battery voltage calibration factor | +| Wait Bluetooth (s) | Time to wait for BLE connection at boot | +| Mesh SDS Timeout (s) | Super-deep-sleep timeout | + +### Konfiguracja sieci + +| Setting | Opis | +| ------------- | ---------------------------------------------------- | +| WiFi Enabled | Enable WiFi radio (ESP32 devices) | +| WiFi SSID | Network name to connect to | +| WiFi PSK | Hasło do sieci | +| Serwer NTP | Time synchronization server | +| Syslog Server | Remote logging server | + +![IP address field](/assets/screenshots/settings_ipv4_field.png) + +### Konfiguracja Bluetooth + +| Setting | Opis | +| ----------------- | ------------------------------------------------------------------------- | +| Bluetooth Enabled | Enable/disable BLE radio | +| Tryb parowania | Fixed PIN, Random PIN, or No PIN | +| Stały PIN | PIN code for pairing (default: 123456) | + +### Konfiguracja zabezpieczeń + +| Setting | Opis | +| --------------------- | -------------------------------------------------------------------------- | +| Klucz publiczny | Your node's public key (read-only) | +| Klucz administratora | Key for remote administration | +| Klucz prywatny | Your node's private key (handle securely) | +| Admin Channel Enabled | Allow admin commands via channel | +| Debug Log | Output live debug logging over serial/bluetooth | +| Serial Enabled | Enable serial console access (moved from Device Config) | +| Managed Mode | Restrict non-admin channel changes | + +![Password field](/assets/screenshots/settings_password_field.png) + +Settings use standard preference controls — dropdowns, toggles, and sliders: + +| Control | Screenshot | +| -------- | ------------------------------------------------------ | +| Dropdown | ![Dropdown](/assets/screenshots/settings_dropdown.png) | +| Toggle | ![Toggle](/assets/screenshots/settings_switch.png) | +| Slider | ![Slider](/assets/screenshots/settings_slider.png) | + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — optional feature modules and device administration +- [Signal Meter](signal-meter) — how modem presets affect signal quality thresholds +- [LoRa configuration](https://meshtastic.org/docs/configuration/radio/lora) — detailed LoRa settings reference on meshtastic.org +- [Initial configuration](https://meshtastic.org/docs/getting-started/initial-config) — region setup guide on meshtastic.org + +--- + diff --git a/docs/pl-rPL/user/signal-meter.md b/docs/pl-rPL/user/signal-meter.md new file mode 100644 index 000000000..8a1472d96 --- /dev/null +++ b/docs/pl-rPL/user/signal-meter.md @@ -0,0 +1,81 @@ +--- +title: How the Meshtastic Signal Meter Works +nav_order: 15 +last_updated: 2026-05-13 +description: How the signal meter calculates quality from RSSI and SNR — LoRa spread spectrum, presets, and what the bars really mean. +aliases: + - signal + - signal-meter + - snr + - rssi +--- + +# How the Meshtastic Signal Meter Works + +The Meshtastic signal meter — the familiar bars or status color in the app — is calculated very differently than the "bars" on a traditional cell phone or Wi-Fi router. + +Most consumer devices simply measure how "loud" a signal is. However, because Meshtastic uses **LoRa (Long Range)** technology, its signal meter measures how **clear** the signal is, relative to the specific settings your mesh is using. + +--- + +## 1. The Two Metrics: "Loudness" vs. "Clarity" + +Every time the LoRa radio chip receives a message, it reports two measurements: + +- **RSSI (Received Signal Strength Indicator):** The **loudness** of the raw power hitting your antenna. +- **SNR (Signal-to-Noise Ratio):** The **clarity** of the signal compared to the background static. + +> **Tip — The Analogy:** Imagine you are trying to hear a friend talking to you. +> +> - **RSSI** is how loud their voice is. +> - **The Noise Floor** is the background noise in the room (air conditioning, other people talking, traffic). +> - **SNR** is how easily you can distinguish your friend's voice from the background noise. + +If your friend shouts at you at a deafening rock concert, the signal is incredibly loud (High RSSI), but you still can't understand them because the background noise is louder (Bad SNR). Conversely, if your friend whispers to you in a dead-silent library, the signal is very weak (Low RSSI), but you can understand them perfectly (Great SNR). + +--- + +## 2. The Magic of LoRa: Hearing "Below the Noise Floor" + +For standard radios (like FM or Wi-Fi), if the background noise is louder than the signal (a negative SNR), the receiver just hears static. + +LoRa is special. It uses **"Spread Spectrum"** modulation, which allows the radio to mathematically pull a signal out of the air even when it is buried deep _underneath_ the background noise. This is why you will frequently see **negative SNR numbers** in Meshtastic (e.g., -10 dB, which means the signal is 10 decibels weaker than the background static). + +Depending on which Meshtastic preset you are using (e.g., `LongFast` vs. `ShortFast`), the radio has a specific **SNR Limit** — the absolute maximum amount of noise it can tolerate before the message is completely lost to the static. + +--- + +## 3. How the Signal Meter Calculates Quality + +The Meshtastic apps take both RSSI and SNR and run them through a specific formula to assign your signal a quality rating (None, Bad, Fair, or Good). It specifically scales these values based on the physical limits of the radio preset you are using. + +Here is exactly how the app decides how many bars (or what color) to show you: + +| Level | Bars | Criteria | Meaning | +| ------------- | ---- | ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | +| dobry | 3 | RSSI better than `-115 dBm` **AND** SNR better than `-7 dB` | Signal is both loud and clear — healthy connection. | +| wystarczający | 2 | RSSI better than `-126 dBm` with good SNR, **OR** SNR better than `-15 dB` with good RSSI | Signal getting quieter or noisier, but still decodable. | +| słaby | 1 | Falls between Fair and None thresholds | At the edge of range or experiencing interference. | +| Brak | 0 | RSSI worse than `-126 dBm` **AND** SNR worse than `-15 dB` | Transmission completely buried in noise. | + +--- + +## 4. What This Means for You + +Because Meshtastic's meter acts as a **"Clarity Meter"**, it behaves differently than what most people expect: + +> **Tip — Don't panic over low RSSI:** You might see a seemingly terrible RSSI value like `-118 dBm`. On a cell phone, you would have zero bars. But if you have an SNR of `+2 dB`, Meshtastic will still show a strong signal! _The library is quiet, so the whisper is heard perfectly._ + +> **Warning — Watch out for local noise:** If you hook up a massive antenna and see a great RSSI (e.g., `-90 dBm`) but your signal meter is only showing **1 Bar (Bad)**, you have a problem. It means you have local interference — perhaps a cheap power supply, a noisy computer, or a nearby radio tower — creating so much static that it is drowning out your mesh. + +## Where Signal Information Appears + +In the app, signal data is shown in several places: + +- **Node list** — signal bars icon next to each node +- **Node detail** — SNR, RSSI, and signal quality in the device metrics section +- **Traceroute** — per-hop signal quality for each relay node +- **Signal metrics** — historical SNR and RSSI data in the metrics charts + +![Node entry showing SNR, RSSI values and colored signal bars](/assets/screenshots/nodes_signal_info.png) + diff --git a/docs/pl-rPL/user/tak.md b/docs/pl-rPL/user/tak.md new file mode 100644 index 000000000..d9a5da07a --- /dev/null +++ b/docs/pl-rPL/user/tak.md @@ -0,0 +1,126 @@ +--- +title: TAK Integration +nav_order: 10 +last_updated: 2026-05-13 +description: Interoperate with ATAK and WinTAK — CoT position sharing, TAK roles, and plugin setup. +aliases: + - tak + - atak + - team-awareness-kit +--- + +# TAK Integration + +Meshtastic integrates with the Team Awareness Kit (TAK) ecosystem, enabling interoperability between Meshtastic mesh devices and TAK applications like ATAK and WinTAK. + +## Overview + +The TAK module allows Meshtastic nodes to: + +- Share position data in TAK-compatible CoT (Cursor on Target) format +- Appear as team members on TAK map displays +- Receive TAK PLI (Position Location Information) messages + +## Setup + +### Prerequisites + +- ATAK (Android Team Awareness Kit) or WinTAK installed +- Meshtastic ATAK Plugin installed +- TAK module enabled on your Meshtastic radio + +### Konfiguracja + +1. Navigate to **Settings → Module Config → TAK**. +2. Enable the TAK module. +3. Configure the TAK team/group settings: + +![Module toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | Opis | +| -------- | -------------------------- | +| Włączony | Activate TAK interop | +| Tryb | TAK-compatible output mode | + +### ATAK Plugin Setup + +1. Install the Meshtastic ATAK Plugin from the plugin repository. +2. Open ATAK and enable the Meshtastic plugin. +3. The plugin bridges messages between ATAK and your mesh network. + +## TAK Roles + +Nodes configured with TAK-related roles behave differently from standard clients: + +| Rola | Opis | +| --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **TAK** | Full TAK interoperability — sends and receives CoT data, chat messages, and PLI updates. Functions as a standard client plus TAK bridge. | +| **TAK Tracker** | Position-only TAK output — automatically broadcasts PLI at regular intervals without user interaction. Optimized for unattended position beacons (vehicles, equipment, waypoints). Does not relay chat messages. | + +> 💡 **Tip:** Use **TAK Tracker** for devices that only need to report position (e.g., a radio mounted in a vehicle). Use **TAK** for devices where users actively participate in TAK operations. + +### CoT (Cursor on Target) Format + +TAK messages use the Cursor on Target XML format — a military standard for sharing situational awareness data. Meshtastic converts its internal protobuf messages to CoT format when bridging to TAK systems, so no manual format conversion is needed. + +## TAK Identity + +When using TAK roles, your node broadcasts identity information that appears on TAK maps: + +| Setting | Opis | +| -------- | ---------------------------------------------------------------------------------------------------------------- | +| Team | Your team color on the TAK map (e.g., Blue, Red, Cyan, Green) | +| Rola | Your operational role (Team Member, Team Lead, HQ, Medic, RTO, etc.) | +| Callsign | Your TAK callsign (defaults to your Meshtastic long name) | + +These settings appear in **Settings → Module Config → TAK** when the TAK module is enabled. + +> 💡 **Tip:** Team/role colors are the standard TAK affiliation colors. Coordinate with your TAK team to use consistent team assignments. + +## Wire Format (V1 / V2) + +Meshtastic supports two TAK wire formats: + +| Format | Compatibility | Features | +| ------------------------------- | --------------------------------------------------------------- | --------------------------------------------------------- | +| V1 (Legacy) | ATAK Plugin v1.x, older firmware | Basic CoT position sharing only | +| V2 (Current) | ATAK Plugin v2.x, firmware 2.3+ | Full CoT support including chat, routes, zstd compression | + +The app automatically selects V2 when both sides support it. No manual configuration needed — the TAK module negotiates format based on firmware capabilities. + +## Usage with ATAK + +Once configured: + +- Meshtastic nodes appear as markers on the ATAK map with callsign labels +- Chat messages can bridge between mesh and TAK networks +- Position updates flow bidirectionally between Meshtastic and TAK +- TAK Tracker nodes broadcast PLI automatically — their positions appear on ATAK maps without any ATAK-side configuration + +> ⚠️ **Note:** TAK integration requires specific node roles and module configuration. Standard client nodes don't automatically participate in TAK operations. + +## Troubleshooting + +| Problem | Cause | Solution | +| -------------------------------- | ------------------------------------- | ----------------------------------------------------------------------- | +| Node doesn't appear on ATAK map | TAK module disabled or wrong role | Verify TAK module is enabled and node role is TAK or TAK Tracker | +| Position updates are stale | GPS fix lost or interval too long | Check GPS status; reduce position broadcast interval in Position Config | +| ATAK plugin shows "disconnected" | BLE connection lost or plugin crashed | Reconnect Bluetooth in Meshtastic app, then restart ATAK plugin | +| Chat messages not bridging | V1 format doesn't support chat | Ensure both nodes run firmware 2.3+ for V2 wire format | +| CoT data not flowing | Channel mismatch | All TAK nodes must be on the same channel with matching encryption | + +## Security Considerations + +- TAK data shares your position and callsign information +- Ensure your channel encryption is configured when using TAK in sensitive environments +- The TAK module respects the same channel encryption as other Meshtastic messages + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — TAK module configuration +- [Nodes](nodes) — TAK and TAK Tracker roles in the node list +- [Map & Waypoints](map-and-waypoints) — node positions on the map +- [ATAK plugin guide](https://meshtastic.org/docs/software/integrations/atak-plugin) — detailed ATAK setup on meshtastic.org + +--- + diff --git a/docs/pl-rPL/user/telemetry-and-sensors.md b/docs/pl-rPL/user/telemetry-and-sensors.md new file mode 100644 index 000000000..ec9dd5f05 --- /dev/null +++ b/docs/pl-rPL/user/telemetry-and-sensors.md @@ -0,0 +1,118 @@ +--- +title: Telemetry & Sensors +nav_order: 9 +last_updated: 2026-05-13 +description: Sensor data on the mesh — supported environment, air quality, and power sensors, plus configuration and viewing guides. +aliases: + - sensors + - environment + - weather + - power-metrics +--- + +# Telemetry & Sensors + +Meshtastic nodes can collect and share sensor data across the mesh network. + +## Overview + +Telemetry allows nodes equipped with sensors to broadcast environmental, power, and device health information. This data is visible on the node detail screen and can be logged over time. + +## Device Telemetry + +All Meshtastic nodes report basic device telemetry: + +| Metric | Opis | Typical Range | +| -------------------------- | ------------------------------ | ------------------------------------------------------------------ | +| Poziom naładowania baterii | Charge percentage | 0–100% | +| Napięcie | Battery voltage | 3.0–4.2V (LiPo) | +| Wykorzystanie kanału | % of airtime used locally | 0–100% | +| Air Utilization TX | % of airtime used by this node | 0–100% | +| Czas pracy | Seconds since last boot | Varies | + +## Environment Sensors + +Supported environmental sensors: + +### Temperature & Humidity + +| Czujnik | Temperatura | Wilgotność | Ciśnienie | Notatki | +| ------- | ----------- | ---------- | --------- | ----------------------- | +| BME280 | ✓ | ✓ | ✓ | Recommended all-in-one | +| BME680 | ✓ | ✓ | ✓ | Adds gas resistance/IAQ | +| SHT31 | ✓ | ✓ | — | High accuracy | +| MCP9808 | ✓ | — | — | Precision temperature | +| LPS22 | — | — | ✓ | Pressure only | + +### Air Quality + +| Czujnik | Metric | Notatki | +| -------- | -------------------------------------------------- | -------------------------- | +| BME680 | Gas Resistance / IAQ | Volatile organic compounds | +| PMSA003I | PM1.0, PM2.5, PM10 | Particulate matter | +| SEN55 | PM, NOx, VOC, Temp, Humidity | Multi-sensor | + +### Light & UV + +| Czujnik | Metric | +| -------- | -------------------------------------- | +| OPT3001 | Ambient light (lux) | +| VEML7700 | Ambient light (lux) | +| LTR390 | UV index | + +## Metryki zasilania + +Nodes with INA-series power sensors can report: + +| Metric | Opis | +| ----------- | ----------------------------------------- | +| Bus Voltage | Supply rail voltage | +| Natężenie | Power consumption (mA) | +| Zasilanie | Calculated power (mW) | + +Useful for monitoring solar charging or battery health on remote nodes. + +## Configuring Telemetry + +1. Navigate to **Settings → Module Config → Telemetry**. +2. Set reporting intervals: + - **Device Metrics Interval** — how often to broadcast device metrics + - **Environment Metrics Interval** — how often to broadcast sensor data +3. Enable specific sensor types as needed. + +### Recommended Intervals + +| Use Case | Device (s) | Environment (s) | +| ------------------------------------------ | ----------------------------- | ---------------------------------- | +| Urban mesh (many nodes) | 3600 | 3600 | +| Rural mesh (few nodes) | 900 | 900 | +| Weather station | 900 | 300 | +| Battery conservation | 7200 | 7200 | + +> ⚠️ **Note:** Shorter intervals increase airtime usage and battery drain across the mesh. + +## Viewing Telemetry + +1. Navigate to **Nodes** and select a node. +2. Telemetry sections show on the detail screen: + - Device Metrics (always available) + - Environment Metrics (if sensors present) + - Power Metrics (if INA sensor present) +3. Historical graphs show trends over time. + +![Telemetry actions](/assets/screenshots/node-metrics_telemetric_actions.png) + +## Troubleshooting + +- **No environment data showing?** The remote node needs a physical sensor connected (e.g., BME280 on I2C). Device telemetry (battery, uptime) is always available, but environment metrics require hardware. +- **Stale readings?** Check the reporting interval — very long intervals (7200s+) mean data updates infrequently. Also verify the remote node is still online. +- **Sensor conflict on I2C bus?** Some sensors share I2C addresses. If you have multiple sensors on the same bus, check for address collisions in the radio's serial debug output. + +## Related Topics + +- [Node Metrics](node-metrics) — view telemetry data on the node detail screen +- [Settings — Modules & Admin](settings-module-admin) — telemetry module configuration +- [Units & Locale](units-and-locale) — temperature and pressure display units + +--- + diff --git a/docs/pl-rPL/user/translate.md b/docs/pl-rPL/user/translate.md new file mode 100644 index 000000000..c07af9c45 --- /dev/null +++ b/docs/pl-rPL/user/translate.md @@ -0,0 +1,97 @@ +--- +title: Translate the App +parent: User Guide +nav_order: 17 +last_updated: 2026-05-13 +aliases: + - translate + - crowdin + - localization +--- + +# Translate the App + +Contributing translations helps make Meshtastic accessible to a wider audience. The app uses [Crowdin](https://crowdin.com/) to manage community translations for both the user interface and in-app documentation. + +--- + +## What Gets Translated + +| Resource | Source Location | Notatki | +| ----------------- | ------------------------------------- | ---------------------------------------------------------------------- | +| UI strings | `composeResources/values/strings.xml` | Buttons, labels, messages, and all user-visible text | +| User Guide pages | `docs/user/*.md` | In-app documentation shown in Help & Documentation | +| Fastlane metadata | `fastlane/metadata/android/en-US/` | App Store listing title, description, and changelogs | + +> **Note — Developer Guide pages are English-only.** Code-focused documentation targeting contributors is not translated. + +--- + +## How to Contribute + +1. **Visit the Crowdin project.** Open the [Meshtastic Android Crowdin project](https://crowdin.com/project/meshtastic-android) and sign in or create a free account. +2. **Choose your language.** Select an existing language or request a new one by opening a [GitHub issue](https://github.com/meshtastic/Meshtastic-Android/issues/new). +3. **Translate strings.** Crowdin shows the English source on the left and your translation on the right. Translate each string and save. +4. **Review context.** Many strings include screenshots or context comments — check these to understand where the text appears in the app. +5. **Submit.** Approved translations are automatically merged into the next release. + +> **Tip — Keep translations short.** UI strings often appear in buttons, chips, or narrow columns. If a translation is significantly longer than the English original, consider abbreviating where the meaning stays clear. + +--- + +## Adding a New Language + +If your language is not yet listed on Crowdin: + +1. Open an issue on [GitHub](https://github.com/meshtastic/Meshtastic-Android/issues/new) requesting the new locale. +2. A maintainer will add the language to Crowdin and configure `crowdin.yml`. +3. Once added, you can begin translating immediately. + +--- + +## How Translations Are Organized + +The Android app uses **Compose Multiplatform resources** for all user-visible strings: + +``` +core/resources/src/commonMain/composeResources/ +├── values/ ← English (default) +│ └── strings.xml +├── values-de/ ← German +│ └── strings.xml +├── values-fr/ ← French +│ └── strings.xml +└── ... +``` + +In-app documentation follows a similar pattern under `docs/`: + +``` +docs/ +├── user/ ← English source (default) +│ ├── onboarding.md +│ └── ... +├── fr/user/ ← French translations +│ ├── onboarding.md +│ └── ... +└── ... +``` + +The app automatically selects the correct locale based on your device's **Language & Region** settings. + +--- + +## Translation Guidelines + +- **Do not translate** technical terms like "LoRa", "MQTT", "BLE", "TAK", "SNR", or "RSSI" — these are universal. +- **Keep placeholders intact.** Strings like `%1$s` or `%d` are filled in at runtime. Do not remove or reorder them unless the grammar of your language requires it. +- **Match tone.** The app uses a friendly, direct voice. Avoid overly formal language. +- **Test if possible.** Switch your device language and open the app to see how translations look in context. + +--- + +## Questions? + +If you have questions about a specific string's context or need help getting started, open a discussion on the [Meshtastic GitHub Discussions](https://github.com/meshtastic/Meshtastic-Android/discussions) page. + +Thank you for helping expand the reach of Meshtastic! diff --git a/docs/pl-rPL/user/units-and-locale.md b/docs/pl-rPL/user/units-and-locale.md new file mode 100644 index 000000000..c553996df --- /dev/null +++ b/docs/pl-rPL/user/units-and-locale.md @@ -0,0 +1,118 @@ +--- +title: Units, Measurement & Locale +parent: User Guide +nav_order: 16 +last_updated: 2026-05-12 +--- + +# Units, Measurement & Locale + +The Meshtastic app automatically displays temperatures, distances, speeds, and times in the units your device is configured to use — no settings to change inside the app. + +--- + +## How It Works + +Meshtastic radios always transmit data in **metric units** (meters, °C, km/h, hPa, etc.). When the app receives this data, it uses the `MetricFormatter` utility to convert and display values in whatever unit system your device's locale specifies. + +On Android, your measurement preferences are determined by your system **Language & Region** settings. On Desktop (JVM), the app uses the JVM's default `Locale`. + +> **Tip — You never need to toggle units inside the app.** Change your system measurement preferences and every screen in Meshtastic updates automatically — node details, telemetry charts, weather, altitude, and more. + +--- + +## Temperatura + +Temperature values from environment sensors are transmitted as **°C** and displayed based on your device's temperature unit preference. + +![Environment metrics with temperature](/assets/screenshots/nodes_environment_metrics.png) + +| Your Setting | You See | +| ------------ | ------- | +| Celsius | 22°C | +| Fahrenheit | 72°F | + +This affects all temperature displays throughout the app: node environment telemetry, soil temperature, dew point, and telemetry chart axes. + +## Distance & Altitude + +Distances between nodes and GPS altitudes are transmitted as **meters** and automatically scaled and converted. + +![Distance info display](/assets/screenshots/nodes_distance_info.png) + +| Your Setting | Small Distance | Large Distance | Wysokość | +| -------------------------------- | -------------- | ---------------------- | -------- | +| Metric | 350 m | 2.5 km | 1,200 m | +| Imperial (US) | 1,148 ft | 1.6 mi | 3,937 ft | + +The app uses natural scaling — short distances stay in meters or feet, while longer distances switch to kilometres or miles automatically. + +### Where these appear + +- **Node list** — distance and bearing to each node +- **Node detail** — altitude, distance from your position +- **Map** — waypoint distances, traceroute hop distances +- **Compass** — distance to selected node + +## Prędkość + +GPS ground speed is displayed in your locale's preferred speed unit. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Metric | 12 km/h | +| Imperial (US) | 7 mph | + +## Wiatr + +Wind speed and gust data from environment sensors are transmitted as **m/s** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Metric | 5 m/s | +| Imperial (US) | 11 mph | + +Wind readings appear in the **Node Detail** environment section and the **Environment Telemetry** charts. + +## Rainfall + +Rainfall measurements (1-hour and 24-hour totals) are transmitted as **mm** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ---------------------- | +| Metric | 12 mm | +| Imperial (US) | 0.5 in | + +## Units That Never Change + +Some units are international standards and are displayed the same way regardless of your locale: + +| Measurement | Unit | Why | +| -------------------------------- | ------------------------------ | ------------------------------------- | +| Barometric pressure | hPa | International meteorological standard | +| Heading / bearing | ° (degrees) | Universal navigation convention | +| Promieniowanie | μR/hr | Standard dosimetry unit | +| GPS coordinates | decimal degrees | Universal geographic standard | +| Humidity, battery, soil moisture | % | Universal | + +## Date & Time + +All timestamps throughout the app — last heard, message times, telemetry logs, chart axes — follow your device's date and time preferences. + +| Setting | What It Controls | Example | +| ---------------- | ---------------- | ------------------------------------------------ | +| **24-Hour Time** | Clock format | 14:30 vs 2:30 PM | +| **Date Format** | Date ordering | 09/05/2026 vs 05/09/2026 | + +The app also uses **relative time** where it makes sense — for example, "5 min ago" or "2 hours ago" in the node list — which is automatically localised into your device language. + +## Changing Your Measurement System (Android) + +On Android, your measurement system (metric vs imperial) is tied to your region setting: + +1. Open **Android Settings → System → Language & Region** +2. Change your **Region** or **Measurement units** preference +3. Return to Meshtastic — values update immediately + +> **Tip — The app uses `MetricFormatter` from `core:common`.** All measurement formatting is handled by a shared KMP utility that respects your platform's locale. Developers adding new measurement displays should use `MetricFormatter` rather than hard-coding unit conversions. + diff --git a/docs/pt-rBR/index.md b/docs/pt-rBR/index.md new file mode 100644 index 000000000..b93772696 --- /dev/null +++ b/docs/pt-rBR/index.md @@ -0,0 +1,30 @@ +--- +title: Home +layout: default +nav_order: 0 +--- + +# Meshtastic Android App Documentation + +User and developer documentation for the Meshtastic Android, Desktop, and iOS applications powered by KMP (Kotlin Multiplatform). + +Use the sidebar navigation to browse the **User Guide** for app features and the **Developer Guide** for contributing to the project. + +--- + +## Quick Links + +| Guide | Descrição | +| --------------------------------------------------------------------- | -------------------------------------------------------------- | +| [Getting Started](user/onboarding) | Connect your first radio and send a message | +| [Messages & Channels](user/messages-and-channels) | Channel broadcasts, direct messages, reactions, and encryption | +| [Nodes](user/nodes) | Understanding the mesh network node list | +| [Signal Meter](user/signal-meter) | How the LoRa signal quality meter works | +| [Units & Locale](user/units-and-locale) | How temperatures, distances, and times adapt to your region | +| [Desktop App](user/desktop) | Linux, macOS, and Windows desktop usage | +| [Architecture](developer/architecture) | App architecture overview for contributors | +| [Contributing](developer/contributing) | Branch naming, PR workflow, and verification commands | + +--- + +> This documentation is served from the same markdown source that powers the in-app **Help & Documentation** browser. diff --git a/docs/pt-rBR/user/connections.md b/docs/pt-rBR/user/connections.md new file mode 100644 index 000000000..5dda61ffb --- /dev/null +++ b/docs/pt-rBR/user/connections.md @@ -0,0 +1,125 @@ +--- +title: Conexões +nav_order: 2 +last_updated: 2026-05-13 +description: Connect your phone or desktop to a Meshtastic radio via Bluetooth, USB, or TCP/IP. +aliases: + - bluetooth + - usb + - tcp + - pairing +--- + +# Conexões + +Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node. + +## Bluetooth (BLE) + +Bluetooth Low Energy is the default and most common connection method on Android. + +### Pairing a Device + +1. Ensure your Meshtastic radio is powered on and in pairing mode. +2. Open the app and navigate to **Connections**. +3. Tap **Scan for Devices** — nearby Meshtastic radios will appear. +4. Select your device from the list. +5. Accept the Bluetooth pairing prompt if shown. + +![Device list item](/assets/screenshots/connections_bluetooth_scan.png) + +You can filter devices by transport type using the filter chips at the top: + +![Transport filter chips](/assets/screenshots/connections_transport_filters.png) + +> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. + +### Connection Status + +| Icon | State | Descrição | +| ---- | -------------- | ----------------------------- | +| 🟢 | Conectado | Active radio link established | +| 🟡 | Connecting | Handshake in progress | +| 🔴 | Desconectado | No active connection | +| ⚪ | Not configured | No device selected | + +When connecting, a status indicator shows the current connection state: + +![Connecting status](/assets/screenshots/connections_connecting.png) + +If no devices are found, the app shows an empty state with instructions: + +![No devices found](/assets/screenshots/connections_empty_state.png) + +### Troubleshooting Bluetooth + +- **Device not found:** Toggle Bluetooth off/on, ensure location is enabled. +- **Connection drops:** Move closer to the radio; check for interference. +- **Pairing rejected:** Forget the device in Android Bluetooth settings and retry. + +## USB Serial + +USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable. + +### Setup + +1. Connect your radio via USB cable to your device. +2. The app will prompt for USB permission — tap **Allow**. +3. The connection is established automatically. + +> ⚠️ **Note:** USB connections require OTG support on Android devices. + +## TCP/IP (WiFi) + +Some Meshtastic radios support WiFi connectivity, allowing TCP-based connections. + +### Configuration + +1. Connect your radio to a WiFi network via the radio's web interface or settings. +2. In the app, go to **Connections → TCP**. +3. Enter the radio's IP address and port (default: 4403). +4. Tap **Connect**. + +![WiFi scanning for devices](/assets/screenshots/connections_wifi_scanning.png) + +When a device is found, it appears in the connection list: + +![WiFi device found](/assets/screenshots/connections_wifi_device_found.png) + +A successful connection is confirmed with a status indicator: + +![WiFi connection success](/assets/screenshots/connections_wifi_success.png) + +### When to Use TCP + +- Radio is on the same local network +- Testing with a simulated radio +- Environments where Bluetooth has interference issues + +## Reconnection Behavior + +The app reconnects to the **last selected device** on startup. You can manually switch transports from the connections screen at any time. + +To disconnect from a radio, use the disconnect button on the connections screen: + +![Disconnect from radio](/assets/screenshots/connections_disconnect.png) + +## Desktop Connections + +On Desktop (Linux/macOS/Windows), the app supports: + +- **Bluetooth (BLE)** — via the Kable library; works on macOS, Linux, and Windows +- **USB Serial** — primary wired connection method +- **TCP/IP** — for network-connected radios + +See [Desktop App](desktop) for platform-specific details and keyboard shortcuts. + +## Related Topics + +- [Getting Started](onboarding) — first-launch setup and permissions +- [Settings — Radio & User](settings-radio-user) — Bluetooth and network configuration +- [Desktop App](desktop) — desktop-specific connection details +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — full list of compatible radios on meshtastic.org + +--- + diff --git a/docs/pt-rBR/user/desktop.md b/docs/pt-rBR/user/desktop.md new file mode 100644 index 000000000..24927bdd4 --- /dev/null +++ b/docs/pt-rBR/user/desktop.md @@ -0,0 +1,147 @@ +--- +title: Desktop App +nav_order: 14 +last_updated: 2026-05-13 +description: Install and use the Meshtastic Desktop app on Linux, macOS, and Windows — connections, feature parity, and keyboard shortcuts. +aliases: + - desktop + - linux + - macos + - windows + - jvm +--- + +# Desktop App + +The Meshtastic Desktop application provides the same mesh communication features on Linux, macOS, and Windows. + +## Overview + +The Desktop app shares its core codebase with the Android app through Kotlin Multiplatform (KMP). Most features work identically across platforms. + +## Installation + +### Linux + +- Download the `.deb` or `.AppImage` package from the releases page +- Or build from source using `./gradlew :desktopApp:run` + +### macOS + +- Download the `.dmg` package from releases +- Or build from source + +### Windows + +- Download the `.msi` installer from releases +- Or build from source + +## Connecting Your Radio + +### USB Serial (Primary) + +The most reliable connection method on Desktop: + +1. Connect your Meshtastic radio via USB cable. +2. The app should detect the serial port automatically. +3. If not detected, select the correct serial port from the connections menu. + +### TCP/IP + +For network-connected radios: + +1. Enter the radio's IP address and port (default: 4403). +2. Click **Connect**. + +### Bluetooth (BLE) + +Bluetooth Low Energy is supported on Desktop via the [Kable](https://github.com/JuulLabs/kable) library: + +1. Ensure your system has a Bluetooth adapter. +2. The app scans for nearby Meshtastic radios automatically. +3. Select your device from the connections screen. + +## Feature Parity + +| Feature | Android | Desktop | Notes | +| ---------------------------------------- | ------- | ------- | -------------------------- | +| Messaging | ✓ | ✓ | Full parity | +| Node List | ✓ | ✓ | Full parity | +| Mapa | ✓ | ✓ | Full parity | +| Configurações | ✓ | ✓ | Full parity | +| Bluetooth (BLE) | ✓ | ✓ | Via Kable on desktop | +| Firmware Update OTA | ✓ | ✗ | Use web flasher | +| Notifications | ✓ | ✓ | Native OS notifications | +| Widgets | ✓ | ✗ | Android-only | +| AI Assistant (Chirpy) | ✓\* | ✗ | Google flavor Android only | + +\*Chirpy AI requires Android 14+ on Google flavor builds with supported hardware. + +## UI Differences + +The Desktop app uses the same Compose Multiplatform UI with adaptations for larger screens and desktop interaction. + +### Keyboard Shortcuts + +| Shortcut | Action | +| ------------------- | --------------------------- | +| **⌘Q** / **Ctrl+Q** | Quit the application | +| **⌘,** / **Ctrl+,** | Open Settings | +| **⌘1** / **Ctrl+1** | Switch to Conversations tab | +| **⌘2** / **Ctrl+2** | Switch to Nodes tab | +| **⌘3** / **Ctrl+3** | Switch to Map tab | +| **⌘4** / **Ctrl+4** | Switch to Connections tab | + +### Window & System Tray + +- **Window resizing** — responsive layout adapts to window dimensions +- **System tray** — minimize to system tray for background mesh operation +- **Tray menu** — right-click the tray icon to show window or quit +- **Mouse interaction** — hover states and standard desktop navigation + +### Notification Preferences + +The Desktop app provides in-app toggles for controlling which notifications are shown — messages, new nodes, and low battery alerts. Access these from **Settings → Notifications** within the app. + +## Built-in Documentation Browser + +The Desktop app includes a built-in documentation browser for quick access to help content without leaving the application. + +![Docs browser with table of contents](/assets/screenshots/docs-browser_toc.png) + +The browser supports full-text search across all documentation: + +![Searching the docs browser](/assets/screenshots/docs-browser_search.png) + +Individual doc pages render with full formatting: + +![A documentation page](/assets/screenshots/docs-browser_page.png) + +## Building from Source + +```bash +git clone https://github.com/meshtastic/Meshtastic-Android.git +cd Meshtastic-Android +git submodule update --init +./gradlew :desktopApp:run +``` + +Requirements: + +- JDK 21 +- No Android SDK required for desktop-only builds + +## Known Limitations + +- No OTA firmware updates (use web flasher) +- Some Android-specific features (widgets, specific notification channels) are unavailable +- Performance may vary on low-spec hardware running Compose Desktop +- BLE bonding is not yet supported on desktop (pairing works without bonding) + +## Related Topics + +- [Connections](connections) — connection methods overview +- [Firmware Updates](firmware) — use the [Web Flasher](https://flasher.meshtastic.org) for desktop firmware updates + +--- + diff --git a/docs/pt-rBR/user/discovery.md b/docs/pt-rBR/user/discovery.md new file mode 100644 index 000000000..922275ce6 --- /dev/null +++ b/docs/pt-rBR/user/discovery.md @@ -0,0 +1,114 @@ +--- +title: Discovery +nav_order: 12 +last_updated: 2026-05-13 +description: Explore your mesh network — traceroute paths, neighbor maps, and node discovery tools. +aliases: + - mesh-discovery + - local-discovery + - network-scan + - traceroute + - neighbor-info +--- + +# Discovery + +Discovery tools help you understand **how** your mesh network is connected — which nodes can hear each other, what paths messages take, and where bottlenecks or weak links exist. + +> 💡 **Tip:** You don't need a dedicated "discovery mode" to start exploring your mesh. The tools below are available right now from the node list and node detail screens. + +--- + +## Traçar rota + +Traceroute reveals the exact path a message takes from your node to any other node on the mesh. It's the single most useful tool for debugging connectivity problems. + +### Running a Traceroute + +1. Navigate to **Nodes** and tap the node you want to trace. +2. On the node detail screen, tap **Traceroute**. +3. The app sends a traceroute request and waits for the response. +4. Results display each hop in order, with signal quality at every step. + +### Reading the Results + +A traceroute result looks like this: + +``` +You → Node A (SNR: 8.5, RSSI: -95) → Node B (SNR: 5.2, RSSI: -108) → Target +``` + +Each hop represents a relay node that forwarded the message. The SNR and RSSI values at each hop tell you about the link quality on that specific segment. + +| What to look for | What it means | +| -------------------------------------------------------------------------- | --------------------------------------------------------------------------- | +| All hops show Good SNR (> 5 dB) | Healthy path — messages flow reliably | +| One hop shows Bad SNR (< 0 dB) | Weak link — this relay segment is fragile | +| Many hops (4+) | Long path — consider repositioning a node to shorten it | +| Different path on retry | Mesh is adapting — multiple routes exist (this is good!) | + +> 💡 **Tip:** Run traceroute several times over a few minutes. If the path changes, your mesh has redundant routes — a sign of a well-connected network. + +### Troubleshooting with Traceroute + +- **"No route found"** — The target node may be offline, out of range, or on a different channel. Check that both nodes share at least one channel with the same encryption key. +- **Traceroute times out** — The path may be too long (exceeds hop limit) or a relay node is congested. Try increasing the hop limit in **Settings → LoRa Config**. +- **Asymmetric paths** — A traceroute from A→B may take a different path than B→A. This is normal — radio propagation is not always symmetric. + +--- + +## Informações do Vizinho + +The Neighbor Info module lets each node broadcast a list of the nodes it can **directly hear** (single-hop). When multiple nodes share their neighbor lists, you can piece together a topology map of the entire mesh. + +### Enabling Neighbor Info + +1. Navigate to **Settings → Module Config → Neighbor Info**. +2. Enable the module. +3. Set the broadcast interval (default: 900 seconds / 15 minutes). + +Once enabled, your node periodically broadcasts its neighbor table. Other nodes with Neighbor Info enabled do the same. + +### Viewing Neighbor Data + +- Open any node's detail screen and look for the **Neighbors** section. +- Each neighbor entry shows the node that was directly heard and its signal quality. +- Combine neighbor data from multiple nodes to understand the full mesh topology. + +> ⚠️ **Note:** Neighbor Info increases airtime usage because every enabled node periodically broadcasts its neighbor list. On busy meshes with many nodes, consider longer broadcast intervals (3600 seconds or more) to avoid congestion. + +--- + +## Node List as a Discovery Tool + +The node list itself is a powerful discovery tool when you use its filtering and sorting features effectively. + +### Finding New Nodes + +- Sort by **Last heard** to see the most recently active nodes at the top. +- Enable **Include unknown** to see nodes that have appeared on the mesh but haven't sent user info yet — these are often newly powered-on devices. + +### Assessing Connectivity + +- Sort by **Hops away** to see which nodes are directly reachable (0 hops) versus relayed. +- Sort by **Distance** to find nearby nodes and verify they're reachable. +- Use **Exclude MQTT** to focus on nodes reachable over radio (not via internet bridge). + +### Infrastructure Audit + +- Disable **Exclude infrastructure** to see Router, Repeater, Router Late, and Client Base nodes. +- Check their signal quality and last-heard times to verify your infrastructure nodes are healthy. + +See [Nodes](nodes) for full details on filtering and sorting options. + +--- + +## Tips for Mesh Exploration + +- **Start with traceroute** — it gives you immediate, actionable information about a specific path. +- **Enable Neighbor Info on key nodes** — especially routers and repeaters, to build a picture of the backbone. +- **Check the map** — node positions on the [Map](map-and-waypoints) combined with signal data help you understand why some links are strong and others are weak. +- **Compare signal over time** — use the [Signal Meter](signal-meter) guide to interpret SNR and RSSI values correctly. + +--- + diff --git a/docs/pt-rBR/user/firmware.md b/docs/pt-rBR/user/firmware.md new file mode 100644 index 000000000..18b702636 --- /dev/null +++ b/docs/pt-rBR/user/firmware.md @@ -0,0 +1,114 @@ +--- +title: Firmware Updates +nav_order: 13 +last_updated: 2026-05-13 +description: Update your radio firmware over Bluetooth — OTA process, version channels, pre-flight checks, and recovery. +aliases: + - firmware + - update + - ota + - flash +--- + +# Firmware Updates + +Keep your Meshtastic radio up to date with the latest firmware for new features, bug fixes, and security improvements. + +## Checking for Updates + +1. Navigate to **Settings → Firmware Update** or tap the firmware notification if shown. +2. The app checks for available firmware versions. +3. Available updates show the version number and changelog summary. + +## Update Methods + +### OTA (Over-The-Air) via Bluetooth + +The most common update method for Android users: + +1. Ensure your radio is connected via Bluetooth. +2. Navigate to the Firmware Update screen. +3. Select the desired firmware version. +4. Tap **Update** to begin the OTA process. +5. Wait for the update to complete — **do not disconnect** during the update. + +![Firmware checking for updates](/assets/screenshots/firmware_checking.png) + +> ⚠️ **Warning:** Interrupting a firmware update can brick your device. Ensure your radio has sufficient battery (>50% recommended) and maintain Bluetooth proximity during the entire process. + +![Firmware disclaimer](/assets/screenshots/firmware_disclaimer.png) + +### USB Flashing + +For recovery or when OTA is unavailable: + +- Use the [Meshtastic Web Flasher](https://flasher.meshtastic.org) +- Or the [Meshtastic CLI tool](https://meshtastic.org/docs/getting-started/flashing-firmware) on desktop + +## Version Channels + +| Canal | Descrição | +| ------ | ------------------------------------------- | +| Stable | Recommended for most users; tested releases | +| Alpha | Preview releases; may contain bugs | + +## Pre-Update Checklist + +Before updating: + +- [ ] Battery > 50% +- [ ] Stable Bluetooth connection +- [ ] Note your current settings (they may reset on major version changes) +- [ ] Check the release notes for breaking changes + +## Post-Update + +After a successful update: + +- The radio will reboot automatically +- Bluetooth connection will re-establish +- Verify your settings are intact +- Check the firmware version in **Settings → About** + +![Firmware update success](/assets/screenshots/firmware_success.png) + +## Troubleshooting + +### Update Stuck + +If the update appears frozen: + +- Wait at least 5 minutes before intervening +- If truly stuck, power-cycle the radio +- Attempt the update again + +![Firmware update error](/assets/screenshots/firmware_error.png) + +### Device Won't Boot After Update + +If your device fails to boot: + +1. Try connecting via USB to a computer +2. Use the web flasher in recovery/DFU mode +3. Flash a known-good firmware version +4. Check the Meshtastic Discord for device-specific recovery steps + +### Compatibility Warnings + +The app may show warnings when: + +- Connected radio firmware is below minimum supported version +- Major version mismatch between app and firmware +- Deprecated features need migration + +> ⚠️ **Important:** Always update the Meshtastic app before or alongside firmware updates to ensure compatibility. + +## Related Topics + +- [Connections](connections) — reconnecting after a firmware update +- [Flashing firmware guide](https://meshtastic.org/docs/getting-started/flashing-firmware) — full firmware flashing walkthrough on meshtastic.org +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — check firmware compatibility by device +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/pt-rBR/user/map-and-waypoints.md b/docs/pt-rBR/user/map-and-waypoints.md new file mode 100644 index 000000000..c8e953645 --- /dev/null +++ b/docs/pt-rBR/user/map-and-waypoints.md @@ -0,0 +1,116 @@ +--- +title: Map & Waypoints +nav_order: 6 +last_updated: 2026-05-13 +description: View node positions on the map, create and share waypoints, and manage position sharing and privacy. +aliases: + - map + - waypoints + - gps + - location +--- + +# Map & Waypoints + +The Map screen shows the geographic positions of nodes on your mesh, along with shared waypoints. + +## Map View + +The map displays: + +- **Node positions** — colored markers for each node reporting location +- **Waypoints** — shared points of interest +- **Your position** — your current GPS location + +### Node Markers + +Node markers on the map indicate: + +| Color | Meaning | +| ------ | ---------------------------------------------- | +| Verde | Online (heard recently) | +| Yellow | Away (heard within 2 hours) | +| Gray | Offline (stale position) | +| Azul | Your own node | + +### Map Controls + +- **Zoom** — pinch or use +/- buttons +- **Pan** — drag to explore +- **Center** — select the location button to center on your position +- **Node tap** — tap a node marker to view details + +The floating toolbar provides quick access to compass, layer switching, node filters, refresh, and location tracking. Tap the compass to reorient north-up, or tap the location button to center on your current position. + +![Map controls overlay](/assets/screenshots/map_controls_overlay.png) + +## Waypoints + +Waypoints are shared geographic points of interest that all mesh members can see. + +### Creating a Waypoint + +1. Long-press on the map at the desired location. +2. Enter a name and optional description. +3. Choose an icon/emoji for the waypoint. +4. Tap **Send** to share with the mesh. + +### Waypoint Properties + +| Property | Descrição | +| ---------- | ------------------------------------------------------- | +| Nome | Short identifier (max 30 characters) | +| Descrição | Optional longer description | +| Icon | Visual marker emoji on the map | +| Bloqueado | If locked, only the creator can edit or delete | +| Expiration | Optional auto-remove time | + +### Waypoint Expiration + +Waypoints can be set to expire automatically: + +- **Never** (default) — waypoint remains until manually deleted +- **Timed** — waypoint is automatically removed after the specified duration (e.g., "remove after 2 hours"). Useful for temporary markers like rally points, hazards, or meeting locations. + +Expired waypoints are automatically hidden from the map so they don't clutter the display. The expiration countdown begins when the waypoint is created, not when other nodes receive it. + +### Managing Waypoints + +- Tap a waypoint on the map to view its details and coordinates +- Edit or delete waypoints you created +- **Locked waypoints** cannot be modified or deleted by other nodes — only the original creator can change them +- Unlocked waypoints can be edited by any mesh member + +## Position Sharing + +### Enabling Position Sharing + +Your node shares its GPS position based on: + +- **Fixed interval** — broadcast position at regular intervals +- **Smart position** — broadcast when movement exceeds a threshold +- **Manual** — only share when explicitly requested + +Configure position behavior in **Settings → Position**. + +### Privacy Considerations + +> 🔒 **Privacy:** Position data is broadcast to all nodes on your channel. If you don't want your location shared, disable GPS position in settings or use a fixed/fake position. + +## Map Sources + +The app supports multiple map tile sources: + +- OpenStreetMap (default) +- Satellite imagery (where available) +- Offline tiles (download map areas for offline use) + +## Related Topics + +- [Nodes](nodes) — view and filter your node list +- [Node Metrics](node-metrics) — signal quality and position history for individual nodes +- [Discovery](discovery) — traceroute and neighbor info for understanding mesh topology +- [Units & Locale](units-and-locale) — distance and coordinate display formats + +--- + diff --git a/docs/pt-rBR/user/messages-and-channels.md b/docs/pt-rBR/user/messages-and-channels.md new file mode 100644 index 000000000..e1a5f072a --- /dev/null +++ b/docs/pt-rBR/user/messages-and-channels.md @@ -0,0 +1,159 @@ +--- +title: Messages & Channels +nav_order: 3 +last_updated: 2026-05-13 +description: Send and receive messages, manage channels, configure encryption, and use quick chat, reactions, and message actions. +aliases: + - channels + - direct-messages + - messaging + - conversations +--- + +# Messages & Channels + +Meshtastic supports two communication modes: **channel broadcasts** and **direct messages**. + +## Canais + +Channels are shared communication groups. All nodes configured with the same channel key can read and send messages on that channel. + +### Default Channel + +Every Meshtastic device comes with a default **LongFast** channel. This is an unencrypted channel used for general mesh communication. + +### Segurança do Canal + +Channels support multiple encryption levels: + +| Icon | Security Level | Descrição | +| ---- | ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------- | +| 🔒 | PSK (256-bit AES) | Fully encrypted with a strong pre-shared key. Only nodes with the matching key can read messages. | +| 🔐 | PSK (128-bit AES) | Encrypted with a shorter key. Secure for most uses but 256-bit is preferred for sensitive data. | +| 🔓 | Default / Open | Uses the well-known default key. **Any Meshtastic device** on the same preset can read these messages. | +| ⚠️ | Insecure + Position | Open channel that also broadcasts your GPS position. Use with caution in public meshes. | + +> 🔒 **Security Tip:** 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. + +### Adding a Channel + +1. Navigate to **Settings → Channels**. +2. Tap **Add Channel** or scan a QR code. +3. Configure the channel name and encryption key. +4. Share the channel URL/QR code with others who need access. + +Tapping a channel shows its details and sharing options. + +## Direct Messages + +Direct messages (DMs) are point-to-point encrypted communications between two specific nodes. + +### Sending a Direct Message + +1. Open the **Messages** tab. +2. Select a node from your contacts list or tap a node in the node list. +3. Type your message and tap **Send**. + +### Message States + +| State | Icon | Meaning | +| --------------------------------- | ---- | ----------------------------------------------------------------------------------------------------------------- | +| Queued | ⏳ | Message waiting to be sent | +| En route | ✓ | Delivered to the radio, awaiting acknowledgment | +| Delivered | ✓✓ | Acknowledgment received from recipient | +| Received | ✓ | Message received from the mesh (incoming) | +| S&F Routing | 🔗 | Store & Forward: message being routed through an S&F node | +| S&F Confirmed | 🔗 | Store & Forward: delivery confirmed via S&F node | +| Erro | ✗ | Delivery failed after retries | + +### Delivery Errors + +When a message fails to deliver, the error indicator shows what went wrong: + +| Erro | Meaning | What to Do | +| ------------------- | ---------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| No Route | No path exists to the destination node | The recipient may be offline or out of mesh range. Try later or move closer. | +| Got NAK | The next-hop node refused to relay | The relay node may be congested. Wait and retry. | +| Tempo esgotado | No acknowledgment within retry window | The recipient may be just out of range. Try increasing hop limit or moving to a better position. | +| Sem interface | No radio interface available to send | Check that your radio is connected and the channel is configured. | +| Max Retransmit | All retry attempts exhausted | The mesh path is unreliable. Try a different channel or wait for conditions to improve. | +| Nenhum canal | The destination channel doesn't exist | Verify both nodes share the same channel configuration. | +| Too Large | Message exceeds maximum payload size | Shorten your message (max ~230 characters). | +| No Response | Node received message but didn't respond | The recipient's radio may be busy or in low-power sleep mode. | +| Duty Cycle Limit | Regional airtime limit reached | Your radio has used its allowed transmit time. Wait for the duty cycle window to reset (typically 1 hour in EU regions). | +| Requisição Inválida | Malformed or invalid message | This usually indicates a software bug. Try restarting the app. | + +> 💡 **Tip:** 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. + +## Message Features + +### Quick Chat + +Pre-configured messages for rapid communication: + +- Access via the Quick Chat button in the message input area +- Choose from built-in phrases or custom messages +- Customize quick chat messages in **Settings → Quick Chat** +- Useful when typing is impractical (gloves, small screen, urgent) + +![Quick chat option](/assets/screenshots/messages_quick_chat.png) + +The channel list shows each channel with its latest message preview. + +### Message Bubbles + +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. + +### Reactions + +React to messages with emoji: + +- **Long-press** a message to open the actions menu +- Tap **Add Reaction** to choose an emoji +- Reactions appear below the message bubble +- Multiple users can react to the same message +- React to your own messages or others' messages + +![Emoji reaction badges displayed beneath a message](/assets/screenshots/messages_reaction.png) + +> 💡 **Tip:** Reactions are lightweight — they use minimal mesh bandwidth compared to full text messages. + +### Message Actions + +Long-press any message to access: + +- **Copy** — copy message text to clipboard +- **Reply** — quote the message in your response +- **React** — add an emoji reaction +- **Delete** — remove a message you sent (local deletion) + +### Message Priority + +Messages are queued and transmitted based on priority: + +1. Emergency/alert messages (highest) +2. Direct messages +3. Channel broadcasts (lowest) + +### Message Limits + +- **Maximum length:** 237 bytes (approximately 230 characters for ASCII text) +- **Rate limiting:** The mesh enforces airtime fairness; heavy message volume may be throttled +- **Delivery:** Messages are retried automatically if no acknowledgment is received + +## Best Practices + +- Use channels for group coordination +- Use direct messages for private person-to-person communication +- Keep messages short — mesh bandwidth is limited +- Configure encryption for sensitive communications + +## Related Topics + +- [Nodes](nodes) — tap a node to start a direct message +- [Settings — Radio & User](settings-radio-user) — configure channel encryption and presets +- [MQTT](mqtt) — bridge channel messages to the internet +- [Channel configuration](https://meshtastic.org/docs/configuration/radio/channels) — detailed channel settings on meshtastic.org + +--- + diff --git a/docs/pt-rBR/user/mqtt.md b/docs/pt-rBR/user/mqtt.md new file mode 100644 index 000000000..51dba6bd3 --- /dev/null +++ b/docs/pt-rBR/user/mqtt.md @@ -0,0 +1,137 @@ +--- +title: MQTT +nav_order: 11 +last_updated: 2026-05-13 +description: Bridge your mesh to the internet — MQTT broker setup, encryption layers, and map reporting. +aliases: + - mqtt + - internet-bridge + - broker +--- + +# MQTT + +MQTT bridges your Meshtastic mesh network to the internet, enabling long-range communication beyond radio range. + +## Overview + +The MQTT module connects your node to an MQTT broker, allowing: + +- Messages to reach nodes on different physical meshes via the internet +- Integration with home automation and monitoring systems +- Publishing node positions to the public Meshtastic map +- Custom data pipelines for logging and alerting + +## How It Works + +``` +[Your Node] → Radio → [Gateway Node with WiFi] → MQTT Broker → [Remote Gateway] → Radio → [Remote Node] +``` + +A gateway node with internet access (WiFi or Ethernet) publishes mesh messages to an MQTT topic. Remote gateways subscribed to the same topic inject those messages into their local mesh. + +## Configuration + +### Enabling MQTT + +1. Navigate to **Settings → Module Config → MQTT**. +2. Enable the MQTT module. +3. Configure the broker connection: + +![MQTT toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | Descrição | Padrão | +| --------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------- | +| Server Address | MQTT broker hostname | mqtt.meshtastic.org | +| Nome de usuário | Broker authentication | meshdev | +| Senha | Broker authentication | large4cats | +| Root Topic | Base topic for messages | msh | +| Encryption | Encrypt MQTT payload | Enabled | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON packet support has been removed from firmware; this field is ignored | Disabled | +| TLS | Secure connection to broker | Disabled | +| Map Reporting | Report position to public map | Disabled | + +### Default Meshtastic Broker + +The community maintains a public broker at `mqtt.meshtastic.org`. This is intended for general use and testing. + +> 🔒 **Privacy:** Messages on the public broker are readable by anyone subscribed. Always use channel encryption for private communications. + +### Private Broker + +For better privacy and control, you can run your own MQTT broker: + +- Mosquitto (lightweight, open-source) +- HiveMQ +- EMQX + +Configure your node to point to your private broker with appropriate credentials. + +## Map Reporting + +When Map Reporting is enabled, your node publishes its position to the Meshtastic community map: + +- Visible at [meshmap.net](https://meshmap.net) and similar community map services +- Only position and node info are shared +- Disable this if you don't want your location publicly visible + +## Uplink vs Downlink + +| Direction | Descrição | +| ------------ | -------------------------------- | +| **Uplink** | Messages from mesh → MQTT broker | +| **Downlink** | Messages from MQTT broker → mesh | + +Configure per-channel which directions are active to control message flow and airtime usage. + +## Message Formats + +MQTT uses protobuf message format: + +| Format | Descrição | Use case | +| ------------ | ----------------------------------- | -------------------------- | +| **Protobuf** | Binary Meshtastic protobuf encoding | Node-to-node mesh bridging | + +> ⚠️ **Note:** JSON output support was removed from firmware. The `json_enabled` setting is still visible in the app for legacy compatibility but has no effect on current firmware versions. + +## Encryption & Privacy + +Understanding the layered encryption model: + +1. **Channel encryption** happens on the mesh _before_ MQTT. If your channel has a PSK, the MQTT payload is already encrypted — the broker and any subscribers see only the ciphertext. +2. **MQTT encryption** (the module setting) adds an additional encryption layer for transit to the broker. This protects metadata and routing information. +3. **TLS** encrypts the TCP connection to the broker itself, preventing network-level eavesdropping. + +> 🔒 **Important:** The default public channel has a well-known key. Messages on the default channel sent via MQTT are effectively **unencrypted** — anyone can decode them. Always use a custom PSK for private communications. + +## Best Practices + +- Use channel-level encryption (PSK) on channels that bridge to MQTT +- Don't enable MQTT on nodes without internet access (it will buffer and waste memory) +- Use a private broker for sensitive deployments +- Be mindful of airtime when downlinking messages from busy MQTT topics — every downlinked message consumes radio airtime on your local mesh +- Consider enabling uplink-only if you only need to monitor your mesh remotely without injecting messages back + +## Troubleshooting + +### MQTT Not Connecting + +- **Check WiFi** — the gateway node must have an active internet connection (WiFi or Ethernet). MQTT does not work over the LoRa radio link itself. +- **Verify credentials** — incorrect username or password will silently fail on most brokers. Double-check for trailing spaces. +- **Firewall** — port 1883 (MQTT) or 8883 (MQTT+TLS) must be open. Some networks block non-standard ports. +- **DNS resolution** — if using a custom broker hostname, verify the node can resolve it. Try the broker's IP address directly. + +### Messages Not Bridging + +- **Check uplink/downlink settings** — if only uplink is enabled, messages flow from mesh to MQTT but not back. Enable downlink on the receiving gateway. +- **Channel mismatch** — both gateways must share the same channel with the same PSK. A mismatch means messages are encrypted with different keys and appear as garbage. +- **Topic mismatch** — ensure both gateways use the same root topic. The default `msh` works for the public broker. + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — MQTT module configuration reference +- [Messages & Channels](messages-and-channels) — channel encryption and PSK setup +- [MQTT integration guide](https://meshtastic.org/docs/software/integrations/mqtt) — detailed MQTT documentation on meshtastic.org + +--- + diff --git a/docs/pt-rBR/user/node-metrics.md b/docs/pt-rBR/user/node-metrics.md new file mode 100644 index 000000000..738bef09f --- /dev/null +++ b/docs/pt-rBR/user/node-metrics.md @@ -0,0 +1,130 @@ +--- +title: Node Metrics +nav_order: 5 +last_updated: 2026-05-13 +description: Telemetry dashboards for each mesh node — device health, environment sensors, signal quality, power, traceroute, and position history. +aliases: + - metrics + - telemetry + - device-metrics + - signal +--- + +# Node Metrics + +The node detail screen provides comprehensive telemetry and metrics for each node on your mesh. + +## Device Metrics + +Basic operating information reported by each node: + +| Metric | Descrição | +| ------------------- | ----------------------------------- | +| Battery Level | Current battery percentage | +| Voltagem | Battery voltage reading | +| Utilização do Canal | Percentage of airtime consumed | +| Airtime | Transmission time used by this node | +| Uptime | Time since last reboot | + +Device metrics are displayed as individual cards with trend sparklines showing battery level, voltage, channel utilization, airtime, and uptime over time. + +> 💡 **Tip:** Tap any metric card to expand it into a full chart with historical data points. Pinch to zoom the time axis. + +## Environment Metrics + +Environmental sensor data (requires compatible hardware): + +| Metric | Sensor Examples | +| ------------------------------------ | --------------------- | +| Temperatura | BME280, BME680, SHT31 | +| Umidade | BME280, BME680, SHT31 | +| Pressão Barométrica | BME280, BMP280 | +| Resistência ao gás | BME680 | +| IAQ (Air Quality) | BME680 | + +Environment metrics are charted over time for easy trend analysis — temperature, humidity, and pressure each get their own line chart with the measurement unit displayed on the Y axis. + +> 💡 **Tip:** Environment metrics require a sensor connected to the remote node. Not all nodes report environmental data. See [Telemetry & Sensors](telemetry-and-sensors) for a full list of supported sensors. + +## Signal Metrics + +Radio signal quality information: + +| Metric | Descrição | +| --------- | ----------------------------------------------------------------------------- | +| SNR | Signal-to-Noise Ratio (higher is better) | +| RSSI | Received Signal Strength Indicator (closer to 0 is better) | +| Hop Count | Number of mesh hops for last message | + +### Signal Quality Reference + +| SNR Range | Quality | +| --------------------------------- | --------- | +| > 10 dB | Excellent | +| 0 to 10 dB | Bom | +| -10 to 0 dB | Média | +| < -10 dB | Poor | + +## Power Metrics + +Power management telemetry (requires INA sensor or compatible hardware): + +| Metric | Descrição | +| ----------- | ----------------------- | +| Bus Voltage | Supply voltage | +| Atual | Power draw in milliamps | +| Energia | Calculated wattage | + +## Traçar rota + +Traceroute shows the path a message takes through the mesh: + +1. From the node detail screen, tap **Traceroute**. +2. The app sends a traceroute request to the target node. +3. Results show each hop with SNR/RSSI values. + +### Reading Traceroute Results + +``` +You → Node A (SNR: 8.5) → Node B (SNR: 5.2) → Target +``` + +Each hop represents a relay node that forwarded the message. + +## Log de Posição + +Historical position data for nodes that share their location: + +- GPS coordinates +- Altitude +- Speed (if moving) +- Timestamp for each position report + +## Informações do Vizinho + +Shows which nodes a given node can directly hear, useful for understanding mesh topology. + +## Viewing Metrics + +1. Navigate to **Nodes**. +2. Tap the node you want to inspect. +3. Select the metric category from the detail tabs. + +![Node detail — local device](/assets/screenshots/nodes_detail_local.png) + +The position tab shows location data for nodes that share GPS: + +![Position inline content](/assets/screenshots/nodes_position.png) + +> ⚠️ **Note:** Metrics are only available when they have been reported by the remote node. Metrics update at intervals configured on each node's telemetry settings. + +## Related Topics + +- [Nodes](nodes) — node list, filtering, and sorting +- [Telemetry & Sensors](telemetry-and-sensors) — supported sensors and configuration +- [Signal Meter](signal-meter) — how signal quality is calculated from SNR and RSSI +- [Discovery](discovery) — traceroute details and neighbor info +- [Units & Locale](units-and-locale) — temperature, distance, and speed display formats + +--- + diff --git a/docs/pt-rBR/user/nodes.md b/docs/pt-rBR/user/nodes.md new file mode 100644 index 000000000..8d449862a --- /dev/null +++ b/docs/pt-rBR/user/nodes.md @@ -0,0 +1,152 @@ +--- +title: Nós +nav_order: 4 +last_updated: 2026-05-13 +description: Browse, filter, and sort mesh nodes — view details, signal quality, roles, and quick actions. +aliases: + - node-list + - mesh-nodes + - peers +--- + +# Nós + +The Nodes screen displays all devices visible on your mesh network. + +## Node List + +The node list shows every node your radio has heard, including: + +- **Node name** — user-configured long name +- **Short name** — 4-character identifier +- **Signal quality** — last heard signal strength +- **Last heard** — time since last communication +- **Distance** — estimated distance (if positions are shared) +- **Battery** — remote node battery level (if telemetry is enabled) + +### Node Status Indicators + +| Badge | Meaning | +| ---------- | ------------------------------------- | +| 🟢 Online | Node heard within the last 15 minutes | +| 🟡 Away | Node heard within the last 2 hours | +| 🔴 Offline | Node not heard for over 2 hours | +| ⭐ Favorite | Node marked as favorite by the user | + +### Node Roles + +Nodes can be configured with different roles that affect their mesh behavior: + +| Função | Descrição | +| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Client | Standard end-user device | +| Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | +| Client Mute | Receives but doesn't retransmit | +| Client Hidden | Like Client Mute, plus hides from node list | +| Router | Prioritizes message forwarding; stays awake to relay | +| Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | +| ~~Router Client~~ | ⚠️ **Deprecated** (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | +| ~~Repeater~~ | ⚠️ **Deprecated** (removed in firmware 2.7.11) — no longer selectable; use Router instead | +| Tracker | Optimized for position reporting at regular intervals | +| Sensor | Optimized for telemetry reporting | +| TAK | Interoperates with TAK systems (sends/receives CoT) | +| TAK Tracker | TAK position reporting only | +| Lost & Found | Continuous position beacon for recovery | + +### Choosing a Role + +Most users should keep the default **Client** role. Consider a different role when: + +- **Router** — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don't use Router on battery-powered handheld devices. +- **Router Late** — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. +- **Client Base** — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. +- **Client Mute** — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only devices or to reduce congestion in dense areas. +- **Tracker** — An unattended device whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. +- **Sensor** — An unattended device reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. +- **TAK / TAK Tracker** — Only needed if interoperating with ATAK/WinTAK systems. See [TAK Integration](tak) for details. + +> 💡 **Tip:** The mesh works best when most nodes are **Client** or **Router**. Too many Mute nodes reduces mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. + +### Encryption Indicators + +Nodes display encryption status icons next to their name: + +| Icon | Meaning | +| ----------- | ------------------------------------------------------------------------------------------------------------------- | +| 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | +| 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | +| ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) | + +> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. + +## Quick Actions + +From the node list, you can: + +- **Tap** a node to view its detail page +- **Long-press** for quick actions: + - Send a direct message + - View on map + - Solicitar posição + - Mark as favorite + - Traçar rota + +## Filtering & Sorting + +### Text Search + +Type in the search field to filter nodes by name or short name. The filter updates in real time as you type. + +### Filter Toggles + +| Filtro | Descrição | +| -------------------------- | ---------------------------------------------------------------------------------------------- | +| **Only online** | Show only nodes heard within the last 15 minutes | +| **Only direct** | Show only nodes with direct (non-relayed) connections | +| **Include unknown** | Show nodes that haven't sent user info yet | +| **Exclude infrastructure** | Hide infrastructure-role nodes (Router, Repeater, Router Late, Client Base) | +| **Exclude MQTT** | Hide nodes heard only via MQTT internet bridge | +| **Show ignored** | Show nodes you've previously dismissed or muted | + +### Sort Options + +| Sort | Descrição | +| ------------------------------------------- | ------------------------------------------------------------------ | +| **Last heard** (default) | Most recently heard nodes first | +| **Alphabetical** | Sorted by node long name | +| **Distance** | Nearest nodes first (requires position sharing) | +| **Hops away** | Fewest relay hops first | +| **Channel** | Grouped by channel index | +| **Via MQTT** | Grouped by MQTT vs. radio-heard | +| **Favorites** | Favorited nodes first | + +## Node Detail + +Tapping a node opens the detail view with comprehensive information. See [Node Metrics](node-metrics) for full details on metrics and telemetry. + +![Node detail view](/assets/screenshots/nodes_node_list.png) + +The detail screen includes device info, position, and action buttons: + +![Node detail section](/assets/screenshots/nodes_detail_section.png) + +Inline status indicators show key metrics at a glance: + +| Indicator | Screenshot | +| --------------------- | -------------------------------------------------------- | +| Signal quality | ![Signal](/assets/screenshots/nodes_signal_info.png) | +| Battery level | ![Battery](/assets/screenshots/nodes_battery_info.png) | +| Hop count | ![Hops](/assets/screenshots/nodes_hops_info.png) | +| Visto pela última vez | ![Last heard](/assets/screenshots/nodes_last_heard.png) | +| Distância | ![Distance](/assets/screenshots/nodes_distance_info.png) | + +## Related Topics + +- [Node Metrics](node-metrics) — detailed telemetry dashboards for each node +- [Messages & Channels](messages-and-channels) — send a direct message to a node +- [Map & Waypoints](map-and-waypoints) — view node positions geographically +- [Discovery](discovery) — traceroute and neighbor info for topology exploration +- [Signal Meter](signal-meter) — understand what the signal bars mean + +--- + diff --git a/docs/pt-rBR/user/onboarding.md b/docs/pt-rBR/user/onboarding.md new file mode 100644 index 000000000..3b910534e --- /dev/null +++ b/docs/pt-rBR/user/onboarding.md @@ -0,0 +1,99 @@ +--- +title: Getting Started +nav_order: 1 +last_updated: 2026-05-13 +description: First-launch setup — permissions, onboarding flow, and next steps after connecting your radio. +aliases: + - first-launch + - setup + - intro +--- + +# Getting Started + +Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app. + +## First Launch + +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. + +### Welcome Screen + +The welcome screen introduces Meshtastic and its core capabilities: + +- Off-grid mesh communication +- No cellular or internet required +- End-to-end encrypted messaging + +Tap **Get Started** to proceed through the setup flow. + +![Welcome screen](/assets/screenshots/onboarding_welcome.png) + +## Permissions + +The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. + +### Bluetooth Permission + +Bluetooth is the primary connection method between your phone and Meshtastic radio: + +- **Bluetooth scanning** — discover nearby Meshtastic radios +- **Bluetooth connect** — establish and maintain connections with paired radios + +Grant both permissions when prompted. Without Bluetooth, you'll need to use USB or TCP connections instead. + +### Location Permission + +> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. + +Meshtastic also uses your location for: + +- Showing your position on the mesh map +- Calculating distances to other nodes +- Sharing your GPS coordinates with other mesh members (if enabled) + +Grant **"While using the app"** or **"Always"** depending on your preference: + +- **While using the app** — position updates only when the app is open +- **Always** — enables background position updates for always-on mesh presence + +If denied, Bluetooth scanning will not function and your node will not report a position. + +### Notifications Permission + +Notifications alert you to: + +- Incoming messages from channels and direct messages +- Connection status changes (connected, disconnected, reconnecting) +- Firmware update availability + +> 💡 **Tip:** You can fine-tune notification preferences later in Android system settings. The app creates separate notification channels for messages, connection events, and background service status. + +### Critical Alerts Permission + +On supported devices, the app may request permission for critical alerts: + +- These are high-priority notifications that can break through Do Not Disturb mode +- Useful for emergency mesh alerts or urgent messages +- You can **skip** this step if you don't need breakthrough notifications +- Configure or revoke later in Android notification settings + +## After Setup + +Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. + +> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. + +## What's Next? + +Once connected to a radio, explore: + +- [Connections](connections) — pair your first radio device +- [Messages & Channels](messages-and-channels) — send your first message +- [Nodes](nodes) — see who's on your mesh +- [Map & Waypoints](map-and-waypoints) — view node positions +- [Settings](settings-radio-user) — configure your radio and user profile + +New to Meshtastic? The [getting started guide](https://meshtastic.org/docs/getting-started) on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup. + +--- diff --git a/docs/pt-rBR/user/settings-module-admin.md b/docs/pt-rBR/user/settings-module-admin.md new file mode 100644 index 000000000..bc8d4a146 --- /dev/null +++ b/docs/pt-rBR/user/settings-module-admin.md @@ -0,0 +1,246 @@ +--- +title: Settings — Modules & Admin +nav_order: 8 +last_updated: 2026-05-13 +description: Configure optional feature modules (MQTT, telemetry, canned messages, TAK, and more) and perform device administration. +aliases: + - modules + - module-config + - administration +--- + +# Settings — Modules & Admin + +Configure optional feature modules and perform device administration. Modules extend Meshtastic with specialized capabilities — each can be independently enabled or disabled. + +> 💡 **Tip:** You only need to enable the modules you actually use. Disabling unused modules reduces airtime, saves battery, and simplifies your configuration. + +Module settings use a card-based layout with toggle switches, dropdowns, text fields, and sliders: + +![Toggle switch](/assets/screenshots/settings_switch.png) + +![Dropdown selector](/assets/screenshots/settings_dropdown.png) + +![Text field](/assets/screenshots/settings_text_field.png) + +![Settings card layout](/assets/screenshots/settings_titled_card.png) + +## Module Configuration + +### MQTT Module + +Bridges mesh messages to and from an MQTT broker for internet connectivity. This is how you extend your mesh beyond radio range or integrate with home automation systems. + +| Setting | Descrição | +| --------------- | ------------------------------------------------------------------------ | +| Enabled | Toggle MQTT bridge | +| Servidor | MQTT broker address | +| Nome de usuário | Authentication username | +| Senha | Authentication password | +| Encryption | Encrypt MQTT payloads | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON support removed from firmware; field is ignored | +| TLS | Use secure connection | +| Root Topic | Base MQTT topic path | +| Map Report | Publish position for public map | + +See [MQTT](mqtt) for a detailed usage guide including encryption, privacy, and broker setup. + +### Serial Module + +Enables serial port communication for external device integrations (GPS modules, sensors, or custom hardware). When enabled, the node's serial port can send and receive protobuf or text data, allowing external microcontrollers or computers to interact with the mesh. + +| Setting | Descrição | +| ---------- | ------------------------------- | +| Enabled | Activate serial communication | +| Echo | Echo received serial data back | +| Mode | Text, Protobuf, or NMEA output | +| RX/TX Pins | GPIO pins for serial connection | +| Baud Rate | Serial communication speed | + +### External Notification Module + +Controls buzzer, LED, or vibration alerts on your radio hardware. Useful for devices that need to physically signal when a message arrives — particularly helpful for unattended or outdoor installations. + +| Setting | Descrição | +| -------------------------------- | --------------------------- | +| Enabled | Activate notifications | +| Alert Message | Notify on incoming messages | +| Alert Message Buzzer | Use buzzer for messages | +| Alert Message Vibra | Use vibration for messages | +| Alert Bell | Notify on bell character | +| Output (GPIO) | Pin for notification output | +| Active | High or Low active | +| Duration (ms) | Notification length | +| Use I2S as Buzzer | Use I2S audio output | + +### Store & Forward Module + +Buffers messages for nodes that were temporarily offline, then replays them when those nodes reconnect. Essential for meshes where nodes go in and out of range regularly — ensures messages aren't lost during brief disconnections. + +| Setting | Descrição | +| ------------------------------------------ | -------------------------- | +| Enabled | Activate store and forward | +| Heartbeat (s) | Announcement interval | +| Records | Maximum stored messages | +| History Return (max) | Max messages to replay | +| History Return (window) | Time window for replay | + +> 💡 **Tip:** Store and Forward works best on nodes with ample memory (ESP32 with PSRAM). Router nodes are ideal candidates since they're typically always-on. + +### Range Test Module + +Automated range testing tool for evaluating link quality between nodes. When enabled, the node periodically transmits test messages with incrementing counters. A receiver node logs these messages, allowing you to walk or drive away and later analyze at what distance messages stopped arriving. + +| Setting | Descrição | +| -------------------------------------- | --------------------------------- | +| Enabled | Activate range testing | +| Sender Interval (s) | Time between test transmissions | +| Save CSV | Log received test data to SD card | + +### Telemetry Module + +Controls what telemetry data your node shares with the mesh. Telemetry includes device health (battery, uptime) and environmental sensor data (temperature, humidity, pressure). + +| Setting | Descrição | +| ---------------------------- | --------------------------------------- | +| Device Metrics Interval | How often to report device metrics | +| Environment Metrics Interval | How often to report environment sensors | +| Air Quality Enabled | Report particulate sensor data | +| Power Metrics Enabled | Report power usage | + +See [Telemetry & Sensors](telemetry-and-sensors) for supported sensors and configuration recommendations. + +### Canned Message Module + +Pre-configured messages accessible from the device's physical buttons (for radios with rotary encoders, keypads, or similar input hardware). Define a list of quick-send messages that can be transmitted without a phone connected — ideal for field use. + +| Setting | Descrição | +| ------------------ | ----------------------------------------------------------- | +| ~~Enabled~~ | ⚠️ **Deprecated** — current firmware may ignore this toggle | +| Mensagens | Newline-separated list of messages | +| Send Bell | Play bell sound on send | +| Rotary Encoder | Enable rotary encoder input | +| Up/Down/Press Pins | GPIO pin assignments for input | + +### Audio Module + +Codec2 audio support for low-bandwidth voice communication over the mesh. This is an **experimental** feature that encodes voice into very small data packets using the Codec2 codec. + +| Setting | Descrição | +| --------------- | -------------------------------- | +| Enabled | Activate audio module | +| Codec2 Rate | Audio quality/bandwidth tradeoff | +| I2S Word Select | GPIO pin for I2S WS | +| I2S Data In | GPIO pin for I2S DIN | +| I2S Data Out | GPIO pin for I2S DOUT | + +> ⚠️ **Note:** Audio requires specific hardware (I2S microphone and speaker). Voice quality is very low-bandwidth — think "understandable radio voice," not phone-call quality. + +### Remote Hardware Module + +GPIO control over the mesh network. Allows a remote node to read or write GPIO pins on another node — useful for activating relays, reading switches, or controlling external hardware from a distance. + +| Setting | Descrição | +| -------------------- | --------------------------------------------------------------- | +| Enabled | Activate remote GPIO access | +| Allow Undefined Pins | Allow access to any GPIO pin (security risk) | + +> ⚠️ **Warning:** Enabling "Allow Undefined Pins" gives remote nodes access to all GPIO pins, which could interfere with the radio's own hardware. Only enable on dedicated GPIO nodes. + +### Neighbor Info Module + +Broadcasts information about directly heard neighbors, enabling mesh topology mapping. Each enabled node periodically shares a list of the other nodes it can hear and their signal quality. + +| Setting | Descrição | +| -------------------------------------- | ------------------------------------ | +| Enabled | Activate neighbor broadcasting | +| Update Interval (s) | How often to broadcast neighbor list | + +See [Discovery](discovery) for how to use neighbor data for mesh topology exploration. + +### Ambient Lighting Module + +Controls onboard NeoPixel or other addressable RGB LEDs on supported hardware. Can be used for visual status indicators, notification lights, or decorative effects. + +| Setting | Descrição | +| ------------------ | ---------------------------------------------------------- | +| Enabled | Activate LED control | +| LED State | On, Off, or set specific color | +| Red / Green / Blue | Individual color channel values (0–255) | + +### Detection Sensor Module + +Turns your node into a motion or door sensor alert system. When a GPIO pin detects a state change (motion detected, door opened), the node broadcasts an alert message over the mesh. + +| Setting | Descrição | +| ---------------------------------------- | ----------------------------------------------------------------------- | +| Enabled | Activate detection sensor | +| Monitor Pin | GPIO pin connected to sensor | +| Detection Triggered High | Trigger when pin goes high (vs. low) | +| Minimum Broadcast (s) | Minimum time between alert broadcasts | +| State Broadcast (s) | Periodic state broadcast interval | +| Send Bell | Include bell character in alerts | +| Friendly Name | Custom name for this sensor | + +### Paxcounter Module + +People counter using WiFi and BLE probe requests. Counts nearby devices by passively listening for probe requests that phones and laptops emit when scanning for networks. Available only on ESP32 devices. + +| Setting | Descrição | +| -------------------------------------- | -------------------------- | +| Enabled | Activate people counting | +| Update Interval (s) | How often to report counts | + +> 💡 **Tip:** Paxcounter is useful for estimating foot traffic at trailheads, event venues, or other locations. Counts are approximate — one person may carry multiple devices. + +### TAK Module + +Team Awareness Kit integration for interoperability with ATAK and WinTAK. See [TAK Integration](tak) for detailed setup and usage. + +## Administração + +### Administração Remota + +Remotely configure nodes that share your admin key: + +1. Select the target node in the node list. +2. Navigate to **Settings** for that node. +3. Modify configuration. +4. Tap **Save** — changes are sent over the mesh. + +> ⚠️ **Requires:** Admin key configured on both your node and the target node. + +### Limpar Banco de Dados de Nó + +Removes stale nodes from your local database that haven't been heard in a configurable time window. + +### Factory Reset + +Resets all settings to factory defaults. **This cannot be undone.** + +### Reiniciar + +Remotely reboot a connected or administered node. + +### Painel de depuração + +View detailed diagnostic information: + +- Protocol buffers debug output +- Mesh packet log +- Connection state details + +### Troubleshooting Remote Admin + +- **"No response from target node"** — the target may be out of range, offline, or have a mismatched admin key. Verify the admin key matches on both nodes. +- **Changes not applying** — some settings require a reboot to take effect. Try the Reboot action after saving. +- **Can't see remote settings** — ensure your node has the admin key for the target node and that Admin Channel is enabled in Security Config. + +## Related Topics + +- [Settings — Radio & User](settings-radio-user) — core radio and user profile settings +- [Module configuration reference](https://meshtastic.org/docs/configuration/module) — detailed module docs on meshtastic.org +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/pt-rBR/user/settings-radio-user.md b/docs/pt-rBR/user/settings-radio-user.md new file mode 100644 index 000000000..fe339fa44 --- /dev/null +++ b/docs/pt-rBR/user/settings-radio-user.md @@ -0,0 +1,173 @@ +--- +title: Settings — Radio & User +nav_order: 7 +last_updated: 2026-05-13 +description: Configure your radio hardware, LoRa presets, user profile, position sharing, power management, and security. +aliases: + - configurações + - radio-config + - user-config + - lora +--- + +# Settings — Radio & User + +Configure your radio hardware and user identity parameters. + +## User Settings + +### User Profile + +| Setting | Descrição | +| ----------------- | ------------------------------------------------------------------------------------- | +| Long Name | Your display name (up to 39 characters) | +| Short Name | 4-character abbreviated name | +| Licensed Operator | Enable if you hold an amateur radio license (enables higher power) | + +### Applying Changes + +After modifying settings, tap **Save** to write the configuration to your radio. The device may reboot to apply changes. + +## Radio Configuration + +### Configuração do Dispositivo + +| Setting | Descrição | Padrão | +| ------------------------------------------ | ----------------------------------------------------------------------- | -------- | +| Função | Node behavior (Client, Router, etc.) | Client | +| Rebroadcast Mode | How the node retransmits messages | All | +| Node Info Broadcast (s) | Interval for broadcasting node info | 10800 | +| Double-tap Button | Action for double-tap button press | Disabled | + +### Configuração do LoRa + +| Setting | Descrição | Padrão | +| --------------------- | ----------------------------------------------------------------------- | ----------------------------------------- | +| Região | Regulatory region for frequency bands | Unset (must configure) | +| Predefinição do Modem | Speed/range tradeoff | LongFast | +| Hop Limit | Maximum retransmit hops | 3 | +| TX Power | Transmission power (dBm); 0 = max allowed for region | 0 (region max) | +| Frequency Offset | Fine-tune frequency (MHz) | 0 | +| Channel Bandwidth | Bandwidth setting | Default for preset | + +> ⚠️ **Important:** You **must** set your region before transmitting. Operating without the correct region may violate local radio regulations. See the [region configuration guide](https://meshtastic.org/docs/getting-started/initial-config) on meshtastic.org for details. + +### Modem Presets + +| Preset | Range | Velocidade | SNR Limit | Best For | +| ------------------ | ----------------------- | ------------------------- | ------------------------ | -------------------------------------------------------------------------------------------------------- | +| Short Turbo | ~1 km | 21.9 kbps | −5 dB | Dense urban with line-of-sight; data-heavy applications | +| Short Fast | ~3 km | 10.9 kbps | −7.5 dB | Urban neighborhoods; buildings within a few blocks | +| Short Slow | ~5 km | 5.5 kbps | −10 dB | Suburban short-range; moderate building density | +| Medium Fast | ~5 km | 5.5 kbps | −10 dB | Suburban areas; moderate building density | +| Medium Slow | ~8 km | 1.1 kbps | −12.5 dB | Suburban/rural; moderate range with slower speed | +| Long Turbo | ~10 km | 4.4 kbps | −10 dB | Similar range to Long Fast but with 500 kHz bandwidth; faster throughput | +| Long Fast | ~10 km | 1.1 kbps | −12.5 dB | **General use (default)** — balanced range and speed | +| Long Moderate | ~20 km | 0.34 kbps | −15 dB | Rural with some terrain; occasional use | +| Lite Fast | ~5 km | 5.5 kbps | −10 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Medium Fast | +| Lite Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Long Fast | +| Narrow Fast | ~5 km | 2.7 kbps | −10 dB | EU 868 MHz band (62.5 kHz BW); avoids interference with other devices | +| Narrow Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 868 MHz band (62.5 kHz BW); comparable to Long Fast | +| ~~Long Slow~~ | ~30 km | 0.18 kbps | −17.5 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | +| ~~Very Long Slow~~ | ~40+ km | 0.09 kbps | −20 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | + +#### Choosing a Modem Preset + +The modem preset controls the fundamental tradeoff between **range** and **data rate**: + +- **Slower presets** use more spreading, making signals decodable at weaker signal levels (lower SNR limit). This means longer range but fewer bytes per second. +- **Faster presets** pack more data per transmission but require a stronger signal to decode. + +**Practical guidance:** + +- **Urban mesh (many nodes, short distances):** Use **Long Fast** (default) or **Short Fast**. Higher speed means less airtime congestion when many nodes share the channel. +- **Rural/sparse mesh (few nodes, long distances):** Use **Long Moderate**. Range matters more than speed when nodes are far apart. +- **EU 866/868 MHz regulatory compliance:** Use **Lite Fast**, **Lite Slow**, **Narrow Fast**, or **Narrow Slow** — these are optimized for the EU SRD/868 MHz bands with narrower bandwidths. +- **Fixed infrastructure links:** Use **Short Turbo** or **Long Turbo** for dedicated point-to-point links with good antennas and line-of-sight. +- **Mixed environments:** Stick with **Long Fast** — it's the community default and ensures compatibility with others in your area. + +> ⚠️ **Important:** All nodes on the same channel **must** use the same modem preset. Nodes with mismatched presets cannot communicate even if they share the same frequency and encryption key. + +> 💡 **Tip:** The range estimates above assume flat terrain and modest antennas. Elevation advantage (hilltop, rooftop) dramatically increases effective range. A well-placed Router with Long Fast can often outperform a ground-level node with Long Slow. + +### Configuração da Tela + +| Setting | Descrição | +| ------------------- | ------------------------------------------------------------------------------------ | +| Screen Timeout | Time before display sleeps | +| Display Units | Metric or Imperial | +| OLED Type | Auto, SSD1306, SH1106, SH1107 | +| Compass Orientation | Rotation offset for compass display (0°, 90°, 180°, 270°) | +| ~~Compass North~~ | ⚠️ **Deprecated** — replaced by Compass Orientation; still visible in older firmware | + +### Configuração da Posição + +| Setting | Descrição | +| ----------------------------------------- | ---------------------------------- | +| GPS Enabled | Enable/disable GPS | +| GPS Update Interval | How often to acquire GPS fix | +| Position Broadcast (s) | How often to share position | +| Smart Position | Enable movement-based broadcasting | +| Fixed Position | Use a manually set position | + +### Configuração de Energia + +| Setting | Descrição | +| --------------------------------------- | --------------------------------------- | +| Power Saving | Enable low-power sleep mode | +| Shutdown After (s) | Auto-shutdown idle timer | +| ADC Multiplier | Battery voltage calibration factor | +| Wait Bluetooth (s) | Time to wait for BLE connection at boot | +| Mesh SDS Timeout (s) | Super-deep-sleep timeout | + +### Configuração de Rede + +| Setting | Descrição | +| ------------- | ---------------------------------------------------- | +| WiFi Enabled | Enable WiFi radio (ESP32 devices) | +| WiFi SSID | Network name to connect to | +| WiFi PSK | Network password | +| NTP Server | Time synchronization server | +| Syslog Server | Remote logging server | + +![IP address field](/assets/screenshots/settings_ipv4_field.png) + +### Configuração do Bluetooth + +| Setting | Descrição | +| ----------------- | ------------------------------------------------------------------------- | +| Bluetooth Enabled | Enable/disable BLE radio | +| Pairing Mode | Fixed PIN, Random PIN, or No PIN | +| PIN fixo | PIN code for pairing (default: 123456) | + +### Configurações de Segurança + +| Setting | Descrição | +| ---------------------- | -------------------------------------------------------------------------- | +| Chave Publica | Your node's public key (read-only) | +| Chave do Administrador | Key for remote administration | +| Chave Privada | Your node's private key (handle securely) | +| Admin Channel Enabled | Allow admin commands via channel | +| Debug Log | Output live debug logging over serial/bluetooth | +| Serial Enabled | Enable serial console access (moved from Device Config) | +| Modo Administrado | Restrict non-admin channel changes | + +![Password field](/assets/screenshots/settings_password_field.png) + +Settings use standard preference controls — dropdowns, toggles, and sliders: + +| Control | Screenshot | +| -------- | ------------------------------------------------------ | +| Dropdown | ![Dropdown](/assets/screenshots/settings_dropdown.png) | +| Toggle | ![Toggle](/assets/screenshots/settings_switch.png) | +| Slider | ![Slider](/assets/screenshots/settings_slider.png) | + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — optional feature modules and device administration +- [Signal Meter](signal-meter) — how modem presets affect signal quality thresholds +- [LoRa configuration](https://meshtastic.org/docs/configuration/radio/lora) — detailed LoRa settings reference on meshtastic.org +- [Initial configuration](https://meshtastic.org/docs/getting-started/initial-config) — region setup guide on meshtastic.org + +--- + diff --git a/docs/pt-rBR/user/signal-meter.md b/docs/pt-rBR/user/signal-meter.md new file mode 100644 index 000000000..94971bb71 --- /dev/null +++ b/docs/pt-rBR/user/signal-meter.md @@ -0,0 +1,81 @@ +--- +title: How the Meshtastic Signal Meter Works +nav_order: 15 +last_updated: 2026-05-13 +description: How the signal meter calculates quality from RSSI and SNR — LoRa spread spectrum, presets, and what the bars really mean. +aliases: + - signal + - signal-meter + - snr + - rssi +--- + +# How the Meshtastic Signal Meter Works + +The Meshtastic signal meter — the familiar bars or status color in the app — is calculated very differently than the "bars" on a traditional cell phone or Wi-Fi router. + +Most consumer devices simply measure how "loud" a signal is. However, because Meshtastic uses **LoRa (Long Range)** technology, its signal meter measures how **clear** the signal is, relative to the specific settings your mesh is using. + +--- + +## 1. The Two Metrics: "Loudness" vs. "Clarity" + +Every time the LoRa radio chip receives a message, it reports two measurements: + +- **RSSI (Received Signal Strength Indicator):** The **loudness** of the raw power hitting your antenna. +- **SNR (Signal-to-Noise Ratio):** The **clarity** of the signal compared to the background static. + +> **Tip — The Analogy:** Imagine you are trying to hear a friend talking to you. +> +> - **RSSI** is how loud their voice is. +> - **The Noise Floor** is the background noise in the room (air conditioning, other people talking, traffic). +> - **SNR** is how easily you can distinguish your friend's voice from the background noise. + +If your friend shouts at you at a deafening rock concert, the signal is incredibly loud (High RSSI), but you still can't understand them because the background noise is louder (Bad SNR). Conversely, if your friend whispers to you in a dead-silent library, the signal is very weak (Low RSSI), but you can understand them perfectly (Great SNR). + +--- + +## 2. The Magic of LoRa: Hearing "Below the Noise Floor" + +For standard radios (like FM or Wi-Fi), if the background noise is louder than the signal (a negative SNR), the receiver just hears static. + +LoRa is special. It uses **"Spread Spectrum"** modulation, which allows the radio to mathematically pull a signal out of the air even when it is buried deep _underneath_ the background noise. This is why you will frequently see **negative SNR numbers** in Meshtastic (e.g., -10 dB, which means the signal is 10 decibels weaker than the background static). + +Depending on which Meshtastic preset you are using (e.g., `LongFast` vs. `ShortFast`), the radio has a specific **SNR Limit** — the absolute maximum amount of noise it can tolerate before the message is completely lost to the static. + +--- + +## 3. How the Signal Meter Calculates Quality + +The Meshtastic apps take both RSSI and SNR and run them through a specific formula to assign your signal a quality rating (None, Bad, Fair, or Good). It specifically scales these values based on the physical limits of the radio preset you are using. + +Here is exactly how the app decides how many bars (or what color) to show you: + +| Level | Bars | Criteria | Meaning | +| ------ | ---- | ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | +| Bom | 3 | RSSI better than `-115 dBm` **AND** SNR better than `-7 dB` | Signal is both loud and clear — healthy connection. | +| Média | 2 | RSSI better than `-126 dBm` with good SNR, **OR** SNR better than `-15 dB` with good RSSI | Signal getting quieter or noisier, but still decodable. | +| Ruim | 1 | Falls between Fair and None thresholds | At the edge of range or experiencing interference. | +| Nenhum | 0 | RSSI worse than `-126 dBm` **AND** SNR worse than `-15 dB` | Transmission completely buried in noise. | + +--- + +## 4. What This Means for You + +Because Meshtastic's meter acts as a **"Clarity Meter"**, it behaves differently than what most people expect: + +> **Tip — Don't panic over low RSSI:** You might see a seemingly terrible RSSI value like `-118 dBm`. On a cell phone, you would have zero bars. But if you have an SNR of `+2 dB`, Meshtastic will still show a strong signal! _The library is quiet, so the whisper is heard perfectly._ + +> **Warning — Watch out for local noise:** If you hook up a massive antenna and see a great RSSI (e.g., `-90 dBm`) but your signal meter is only showing **1 Bar (Bad)**, you have a problem. It means you have local interference — perhaps a cheap power supply, a noisy computer, or a nearby radio tower — creating so much static that it is drowning out your mesh. + +## Where Signal Information Appears + +In the app, signal data is shown in several places: + +- **Node list** — signal bars icon next to each node +- **Node detail** — SNR, RSSI, and signal quality in the device metrics section +- **Traceroute** — per-hop signal quality for each relay node +- **Signal metrics** — historical SNR and RSSI data in the metrics charts + +![Node entry showing SNR, RSSI values and colored signal bars](/assets/screenshots/nodes_signal_info.png) + diff --git a/docs/pt-rBR/user/tak.md b/docs/pt-rBR/user/tak.md new file mode 100644 index 000000000..108b78556 --- /dev/null +++ b/docs/pt-rBR/user/tak.md @@ -0,0 +1,126 @@ +--- +title: TAK Integration +nav_order: 10 +last_updated: 2026-05-13 +description: Interoperate with ATAK and WinTAK — CoT position sharing, TAK roles, and plugin setup. +aliases: + - tak + - atak + - team-awareness-kit +--- + +# TAK Integration + +Meshtastic integrates with the Team Awareness Kit (TAK) ecosystem, enabling interoperability between Meshtastic mesh devices and TAK applications like ATAK and WinTAK. + +## Overview + +The TAK module allows Meshtastic nodes to: + +- Share position data in TAK-compatible CoT (Cursor on Target) format +- Appear as team members on TAK map displays +- Receive TAK PLI (Position Location Information) messages + +## Setup + +### Prerequisites + +- ATAK (Android Team Awareness Kit) or WinTAK installed +- Meshtastic ATAK Plugin installed +- TAK module enabled on your Meshtastic radio + +### Configuration + +1. Navigate to **Settings → Module Config → TAK**. +2. Enable the TAK module. +3. Configure the TAK team/group settings: + +![Module toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | Descrição | +| ------- | -------------------------- | +| Enabled | Activate TAK interop | +| Mode | TAK-compatible output mode | + +### ATAK Plugin Setup + +1. Install the Meshtastic ATAK Plugin from the plugin repository. +2. Open ATAK and enable the Meshtastic plugin. +3. The plugin bridges messages between ATAK and your mesh network. + +## TAK Roles + +Nodes configured with TAK-related roles behave differently from standard clients: + +| Função | Descrição | +| --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **TAK** | Full TAK interoperability — sends and receives CoT data, chat messages, and PLI updates. Functions as a standard client plus TAK bridge. | +| **TAK Tracker** | Position-only TAK output — automatically broadcasts PLI at regular intervals without user interaction. Optimized for unattended position beacons (vehicles, equipment, waypoints). Does not relay chat messages. | + +> 💡 **Tip:** Use **TAK Tracker** for devices that only need to report position (e.g., a radio mounted in a vehicle). Use **TAK** for devices where users actively participate in TAK operations. + +### CoT (Cursor on Target) Format + +TAK messages use the Cursor on Target XML format — a military standard for sharing situational awareness data. Meshtastic converts its internal protobuf messages to CoT format when bridging to TAK systems, so no manual format conversion is needed. + +## TAK Identity + +When using TAK roles, your node broadcasts identity information that appears on TAK maps: + +| Setting | Descrição | +| -------- | ---------------------------------------------------------------------------------------------------------------- | +| Team | Your team color on the TAK map (e.g., Blue, Red, Cyan, Green) | +| Função | Your operational role (Team Member, Team Lead, HQ, Medic, RTO, etc.) | +| Callsign | Your TAK callsign (defaults to your Meshtastic long name) | + +These settings appear in **Settings → Module Config → TAK** when the TAK module is enabled. + +> 💡 **Tip:** Team/role colors are the standard TAK affiliation colors. Coordinate with your TAK team to use consistent team assignments. + +## Wire Format (V1 / V2) + +Meshtastic supports two TAK wire formats: + +| Format | Compatibility | Features | +| ------------------------------- | --------------------------------------------------------------- | --------------------------------------------------------- | +| V1 (Legacy) | ATAK Plugin v1.x, older firmware | Basic CoT position sharing only | +| V2 (Current) | ATAK Plugin v2.x, firmware 2.3+ | Full CoT support including chat, routes, zstd compression | + +The app automatically selects V2 when both sides support it. No manual configuration needed — the TAK module negotiates format based on firmware capabilities. + +## Usage with ATAK + +Once configured: + +- Meshtastic nodes appear as markers on the ATAK map with callsign labels +- Chat messages can bridge between mesh and TAK networks +- Position updates flow bidirectionally between Meshtastic and TAK +- TAK Tracker nodes broadcast PLI automatically — their positions appear on ATAK maps without any ATAK-side configuration + +> ⚠️ **Note:** TAK integration requires specific node roles and module configuration. Standard client nodes don't automatically participate in TAK operations. + +## Troubleshooting + +| Problem | Cause | Solution | +| -------------------------------- | ------------------------------------- | ----------------------------------------------------------------------- | +| Node doesn't appear on ATAK map | TAK module disabled or wrong role | Verify TAK module is enabled and node role is TAK or TAK Tracker | +| Position updates are stale | GPS fix lost or interval too long | Check GPS status; reduce position broadcast interval in Position Config | +| ATAK plugin shows "disconnected" | BLE connection lost or plugin crashed | Reconnect Bluetooth in Meshtastic app, then restart ATAK plugin | +| Chat messages not bridging | V1 format doesn't support chat | Ensure both nodes run firmware 2.3+ for V2 wire format | +| CoT data not flowing | Channel mismatch | All TAK nodes must be on the same channel with matching encryption | + +## Security Considerations + +- TAK data shares your position and callsign information +- Ensure your channel encryption is configured when using TAK in sensitive environments +- The TAK module respects the same channel encryption as other Meshtastic messages + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — TAK module configuration +- [Nodes](nodes) — TAK and TAK Tracker roles in the node list +- [Map & Waypoints](map-and-waypoints) — node positions on the map +- [ATAK plugin guide](https://meshtastic.org/docs/software/integrations/atak-plugin) — detailed ATAK setup on meshtastic.org + +--- + diff --git a/docs/pt-rBR/user/telemetry-and-sensors.md b/docs/pt-rBR/user/telemetry-and-sensors.md new file mode 100644 index 000000000..c45c87dc9 --- /dev/null +++ b/docs/pt-rBR/user/telemetry-and-sensors.md @@ -0,0 +1,118 @@ +--- +title: Telemetry & Sensors +nav_order: 9 +last_updated: 2026-05-13 +description: Sensor data on the mesh — supported environment, air quality, and power sensors, plus configuration and viewing guides. +aliases: + - sensors + - environment + - weather + - power-metrics +--- + +# Telemetry & Sensors + +Meshtastic nodes can collect and share sensor data across the mesh network. + +## Overview + +Telemetry allows nodes equipped with sensors to broadcast environmental, power, and device health information. This data is visible on the node detail screen and can be logged over time. + +## Device Telemetry + +All Meshtastic nodes report basic device telemetry: + +| Metric | Descrição | Typical Range | +| ------------------- | ------------------------------ | ------------------------------------------------------------------ | +| Battery Level | Charge percentage | 0–100% | +| Voltagem | Battery voltage | 3.0–4.2V (LiPo) | +| Utilização do Canal | % of airtime used locally | 0–100% | +| Air Utilization TX | % of airtime used by this node | 0–100% | +| Uptime | Seconds since last boot | Varies | + +## Environment Sensors + +Supported environmental sensors: + +### Temperature & Humidity + +| Sensor | Temperatura | Umidade | Pressão | Notes | +| ------- | ----------- | ------- | ------- | ----------------------- | +| BME280 | ✓ | ✓ | ✓ | Recommended all-in-one | +| BME680 | ✓ | ✓ | ✓ | Adds gas resistance/IAQ | +| SHT31 | ✓ | ✓ | — | High accuracy | +| MCP9808 | ✓ | — | — | Precision temperature | +| LPS22 | — | — | ✓ | Pressure only | + +### Air Quality + +| Sensor | Metric | Notes | +| -------- | -------------------------------------------------- | -------------------------- | +| BME680 | Gas Resistance / IAQ | Volatile organic compounds | +| PMSA003I | PM1.0, PM2.5, PM10 | Particulate matter | +| SEN55 | PM, NOx, VOC, Temp, Humidity | Multi-sensor | + +### Light & UV + +| Sensor | Metric | +| -------- | -------------------------------------- | +| OPT3001 | Ambient light (lux) | +| VEML7700 | Ambient light (lux) | +| LTR390 | UV index | + +## Power Metrics + +Nodes with INA-series power sensors can report: + +| Metric | Descrição | +| ----------- | ----------------------------------------- | +| Bus Voltage | Supply rail voltage | +| Atual | Power consumption (mA) | +| Energia | Calculated power (mW) | + +Useful for monitoring solar charging or battery health on remote nodes. + +## Configuring Telemetry + +1. Navigate to **Settings → Module Config → Telemetry**. +2. Set reporting intervals: + - **Device Metrics Interval** — how often to broadcast device metrics + - **Environment Metrics Interval** — how often to broadcast sensor data +3. Enable specific sensor types as needed. + +### Recommended Intervals + +| Use Case | Device (s) | Environment (s) | +| ------------------------------------------ | ----------------------------- | ---------------------------------- | +| Urban mesh (many nodes) | 3600 | 3600 | +| Rural mesh (few nodes) | 900 | 900 | +| Weather station | 900 | 300 | +| Battery conservation | 7200 | 7200 | + +> ⚠️ **Note:** Shorter intervals increase airtime usage and battery drain across the mesh. + +## Viewing Telemetry + +1. Navigate to **Nodes** and select a node. +2. Telemetry sections show on the detail screen: + - Device Metrics (always available) + - Environment Metrics (if sensors present) + - Power Metrics (if INA sensor present) +3. Historical graphs show trends over time. + +![Telemetry actions](/assets/screenshots/node-metrics_telemetric_actions.png) + +## Troubleshooting + +- **No environment data showing?** The remote node needs a physical sensor connected (e.g., BME280 on I2C). Device telemetry (battery, uptime) is always available, but environment metrics require hardware. +- **Stale readings?** Check the reporting interval — very long intervals (7200s+) mean data updates infrequently. Also verify the remote node is still online. +- **Sensor conflict on I2C bus?** Some sensors share I2C addresses. If you have multiple sensors on the same bus, check for address collisions in the radio's serial debug output. + +## Related Topics + +- [Node Metrics](node-metrics) — view telemetry data on the node detail screen +- [Settings — Modules & Admin](settings-module-admin) — telemetry module configuration +- [Units & Locale](units-and-locale) — temperature and pressure display units + +--- + diff --git a/docs/pt-rBR/user/translate.md b/docs/pt-rBR/user/translate.md new file mode 100644 index 000000000..b2ed79a34 --- /dev/null +++ b/docs/pt-rBR/user/translate.md @@ -0,0 +1,97 @@ +--- +title: Translate the App +parent: User Guide +nav_order: 17 +last_updated: 2026-05-13 +aliases: + - translate + - crowdin + - localization +--- + +# Translate the App + +Contributing translations helps make Meshtastic accessible to a wider audience. The app uses [Crowdin](https://crowdin.com/) to manage community translations for both the user interface and in-app documentation. + +--- + +## What Gets Translated + +| Resource | Source Location | Notes | +| ----------------- | ------------------------------------- | ---------------------------------------------------------------------- | +| UI strings | `composeResources/values/strings.xml` | Buttons, labels, messages, and all user-visible text | +| User Guide pages | `docs/user/*.md` | In-app documentation shown in Help & Documentation | +| Fastlane metadata | `fastlane/metadata/android/en-US/` | App Store listing title, description, and changelogs | + +> **Note — Developer Guide pages are English-only.** Code-focused documentation targeting contributors is not translated. + +--- + +## How to Contribute + +1. **Visit the Crowdin project.** Open the [Meshtastic Android Crowdin project](https://crowdin.com/project/meshtastic-android) and sign in or create a free account. +2. **Choose your language.** Select an existing language or request a new one by opening a [GitHub issue](https://github.com/meshtastic/Meshtastic-Android/issues/new). +3. **Translate strings.** Crowdin shows the English source on the left and your translation on the right. Translate each string and save. +4. **Review context.** Many strings include screenshots or context comments — check these to understand where the text appears in the app. +5. **Submit.** Approved translations are automatically merged into the next release. + +> **Tip — Keep translations short.** UI strings often appear in buttons, chips, or narrow columns. If a translation is significantly longer than the English original, consider abbreviating where the meaning stays clear. + +--- + +## Adding a New Language + +If your language is not yet listed on Crowdin: + +1. Open an issue on [GitHub](https://github.com/meshtastic/Meshtastic-Android/issues/new) requesting the new locale. +2. A maintainer will add the language to Crowdin and configure `crowdin.yml`. +3. Once added, you can begin translating immediately. + +--- + +## How Translations Are Organized + +The Android app uses **Compose Multiplatform resources** for all user-visible strings: + +``` +core/resources/src/commonMain/composeResources/ +├── values/ ← English (default) +│ └── strings.xml +├── values-de/ ← German +│ └── strings.xml +├── values-fr/ ← French +│ └── strings.xml +└── ... +``` + +In-app documentation follows a similar pattern under `docs/`: + +``` +docs/ +├── user/ ← English source (default) +│ ├── onboarding.md +│ └── ... +├── fr/user/ ← French translations +│ ├── onboarding.md +│ └── ... +└── ... +``` + +The app automatically selects the correct locale based on your device's **Language & Region** settings. + +--- + +## Translation Guidelines + +- **Do not translate** technical terms like "LoRa", "MQTT", "BLE", "TAK", "SNR", or "RSSI" — these are universal. +- **Keep placeholders intact.** Strings like `%1$s` or `%d` are filled in at runtime. Do not remove or reorder them unless the grammar of your language requires it. +- **Match tone.** The app uses a friendly, direct voice. Avoid overly formal language. +- **Test if possible.** Switch your device language and open the app to see how translations look in context. + +--- + +## Questions? + +If you have questions about a specific string's context or need help getting started, open a discussion on the [Meshtastic GitHub Discussions](https://github.com/meshtastic/Meshtastic-Android/discussions) page. + +Thank you for helping expand the reach of Meshtastic! diff --git a/docs/pt-rBR/user/units-and-locale.md b/docs/pt-rBR/user/units-and-locale.md new file mode 100644 index 000000000..173f2a153 --- /dev/null +++ b/docs/pt-rBR/user/units-and-locale.md @@ -0,0 +1,118 @@ +--- +title: Units, Measurement & Locale +parent: User Guide +nav_order: 16 +last_updated: 2026-05-12 +--- + +# Units, Measurement & Locale + +The Meshtastic app automatically displays temperatures, distances, speeds, and times in the units your device is configured to use — no settings to change inside the app. + +--- + +## How It Works + +Meshtastic radios always transmit data in **metric units** (meters, °C, km/h, hPa, etc.). When the app receives this data, it uses the `MetricFormatter` utility to convert and display values in whatever unit system your device's locale specifies. + +On Android, your measurement preferences are determined by your system **Language & Region** settings. On Desktop (JVM), the app uses the JVM's default `Locale`. + +> **Tip — You never need to toggle units inside the app.** Change your system measurement preferences and every screen in Meshtastic updates automatically — node details, telemetry charts, weather, altitude, and more. + +--- + +## Temperatura + +Temperature values from environment sensors are transmitted as **°C** and displayed based on your device's temperature unit preference. + +![Environment metrics with temperature](/assets/screenshots/nodes_environment_metrics.png) + +| Your Setting | You See | +| ------------ | ------- | +| Celsius | 22°C | +| Fahrenheit | 72°F | + +This affects all temperature displays throughout the app: node environment telemetry, soil temperature, dew point, and telemetry chart axes. + +## Distance & Altitude + +Distances between nodes and GPS altitudes are transmitted as **meters** and automatically scaled and converted. + +![Distance info display](/assets/screenshots/nodes_distance_info.png) + +| Your Setting | Small Distance | Large Distance | Altitude | +| -------------------------------- | -------------- | ---------------------- | -------- | +| Metric | 350 m | 2.5 km | 1,200 m | +| Imperial (US) | 1,148 ft | 1.6 mi | 3,937 ft | + +The app uses natural scaling — short distances stay in meters or feet, while longer distances switch to kilometres or miles automatically. + +### Where these appear + +- **Node list** — distance and bearing to each node +- **Node detail** — altitude, distance from your position +- **Map** — waypoint distances, traceroute hop distances +- **Compass** — distance to selected node + +## Velocidade + +GPS ground speed is displayed in your locale's preferred speed unit. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Metric | 12 km/h | +| Imperial (US) | 7 mph | + +## Vento + +Wind speed and gust data from environment sensors are transmitted as **m/s** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Metric | 5 m/s | +| Imperial (US) | 11 mph | + +Wind readings appear in the **Node Detail** environment section and the **Environment Telemetry** charts. + +## Rainfall + +Rainfall measurements (1-hour and 24-hour totals) are transmitted as **mm** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ---------------------- | +| Metric | 12 mm | +| Imperial (US) | 0.5 in | + +## Units That Never Change + +Some units are international standards and are displayed the same way regardless of your locale: + +| Measurement | Unit | Why | +| -------------------------------- | ------------------------------ | ------------------------------------- | +| Barometric pressure | hPa | International meteorological standard | +| Heading / bearing | ° (degrees) | Universal navigation convention | +| Radiação | μR/hr | Standard dosimetry unit | +| GPS coordinates | decimal degrees | Universal geographic standard | +| Humidity, battery, soil moisture | % | Universal | + +## Date & Time + +All timestamps throughout the app — last heard, message times, telemetry logs, chart axes — follow your device's date and time preferences. + +| Setting | What It Controls | Example | +| ---------------- | ---------------- | ------------------------------------------------ | +| **24-Hour Time** | Clock format | 14:30 vs 2:30 PM | +| **Date Format** | Date ordering | 09/05/2026 vs 05/09/2026 | + +The app also uses **relative time** where it makes sense — for example, "5 min ago" or "2 hours ago" in the node list — which is automatically localised into your device language. + +## Changing Your Measurement System (Android) + +On Android, your measurement system (metric vs imperial) is tied to your region setting: + +1. Open **Android Settings → System → Language & Region** +2. Change your **Region** or **Measurement units** preference +3. Return to Meshtastic — values update immediately + +> **Tip — The app uses `MetricFormatter` from `core:common`.** All measurement formatting is handled by a shared KMP utility that respects your platform's locale. Developers adding new measurement displays should use `MetricFormatter` rather than hard-coding unit conversions. + diff --git a/docs/pt-rPT/index.md b/docs/pt-rPT/index.md new file mode 100644 index 000000000..b93772696 --- /dev/null +++ b/docs/pt-rPT/index.md @@ -0,0 +1,30 @@ +--- +title: Home +layout: default +nav_order: 0 +--- + +# Meshtastic Android App Documentation + +User and developer documentation for the Meshtastic Android, Desktop, and iOS applications powered by KMP (Kotlin Multiplatform). + +Use the sidebar navigation to browse the **User Guide** for app features and the **Developer Guide** for contributing to the project. + +--- + +## Quick Links + +| Guide | Descrição | +| --------------------------------------------------------------------- | -------------------------------------------------------------- | +| [Getting Started](user/onboarding) | Connect your first radio and send a message | +| [Messages & Channels](user/messages-and-channels) | Channel broadcasts, direct messages, reactions, and encryption | +| [Nodes](user/nodes) | Understanding the mesh network node list | +| [Signal Meter](user/signal-meter) | How the LoRa signal quality meter works | +| [Units & Locale](user/units-and-locale) | How temperatures, distances, and times adapt to your region | +| [Desktop App](user/desktop) | Linux, macOS, and Windows desktop usage | +| [Architecture](developer/architecture) | App architecture overview for contributors | +| [Contributing](developer/contributing) | Branch naming, PR workflow, and verification commands | + +--- + +> This documentation is served from the same markdown source that powers the in-app **Help & Documentation** browser. diff --git a/docs/pt-rPT/user/connections.md b/docs/pt-rPT/user/connections.md new file mode 100644 index 000000000..30a679ef2 --- /dev/null +++ b/docs/pt-rPT/user/connections.md @@ -0,0 +1,125 @@ +--- +title: Ligações +nav_order: 2 +last_updated: 2026-05-13 +description: Connect your phone or desktop to a Meshtastic radio via Bluetooth, USB, or TCP/IP. +aliases: + - bluetooth + - usb + - tcp + - pairing +--- + +# Ligações + +Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node. + +## Bluetooth (BLE) + +Bluetooth Low Energy is the default and most common connection method on Android. + +### Pairing a Device + +1. Ensure your Meshtastic radio is powered on and in pairing mode. +2. Open the app and navigate to **Connections**. +3. Tap **Scan for Devices** — nearby Meshtastic radios will appear. +4. Select your device from the list. +5. Accept the Bluetooth pairing prompt if shown. + +![Device list item](/assets/screenshots/connections_bluetooth_scan.png) + +You can filter devices by transport type using the filter chips at the top: + +![Transport filter chips](/assets/screenshots/connections_transport_filters.png) + +> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. + +### Connection Status + +| Icon | State | Descrição | +| ---- | -------------- | ----------------------------- | +| 🟢 | Ligado | Active radio link established | +| 🟡 | A ligar | Handshake in progress | +| 🔴 | Desconectado | No active connection | +| ⚪ | Not configured | No device selected | + +When connecting, a status indicator shows the current connection state: + +![Connecting status](/assets/screenshots/connections_connecting.png) + +If no devices are found, the app shows an empty state with instructions: + +![No devices found](/assets/screenshots/connections_empty_state.png) + +### Troubleshooting Bluetooth + +- **Device not found:** Toggle Bluetooth off/on, ensure location is enabled. +- **Connection drops:** Move closer to the radio; check for interference. +- **Pairing rejected:** Forget the device in Android Bluetooth settings and retry. + +## USB Serial + +USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable. + +### Setup + +1. Connect your radio via USB cable to your device. +2. The app will prompt for USB permission — tap **Allow**. +3. The connection is established automatically. + +> ⚠️ **Note:** USB connections require OTG support on Android devices. + +## TCP/IP (WiFi) + +Some Meshtastic radios support WiFi connectivity, allowing TCP-based connections. + +### Configuração + +1. Connect your radio to a WiFi network via the radio's web interface or settings. +2. In the app, go to **Connections → TCP**. +3. Enter the radio's IP address and port (default: 4403). +4. Tap **Connect**. + +![WiFi scanning for devices](/assets/screenshots/connections_wifi_scanning.png) + +When a device is found, it appears in the connection list: + +![WiFi device found](/assets/screenshots/connections_wifi_device_found.png) + +A successful connection is confirmed with a status indicator: + +![WiFi connection success](/assets/screenshots/connections_wifi_success.png) + +### When to Use TCP + +- Radio is on the same local network +- Testing with a simulated radio +- Environments where Bluetooth has interference issues + +## Reconnection Behavior + +The app reconnects to the **last selected device** on startup. You can manually switch transports from the connections screen at any time. + +To disconnect from a radio, use the disconnect button on the connections screen: + +![Disconnect from radio](/assets/screenshots/connections_disconnect.png) + +## Desktop Connections + +On Desktop (Linux/macOS/Windows), the app supports: + +- **Bluetooth (BLE)** — via the Kable library; works on macOS, Linux, and Windows +- **USB Serial** — primary wired connection method +- **TCP/IP** — for network-connected radios + +See [Desktop App](desktop) for platform-specific details and keyboard shortcuts. + +## Related Topics + +- [Getting Started](onboarding) — first-launch setup and permissions +- [Settings — Radio & User](settings-radio-user) — Bluetooth and network configuration +- [Desktop App](desktop) — desktop-specific connection details +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — full list of compatible radios on meshtastic.org + +--- + diff --git a/docs/pt-rPT/user/desktop.md b/docs/pt-rPT/user/desktop.md new file mode 100644 index 000000000..99e99f2f8 --- /dev/null +++ b/docs/pt-rPT/user/desktop.md @@ -0,0 +1,147 @@ +--- +title: Desktop App +nav_order: 14 +last_updated: 2026-05-13 +description: Install and use the Meshtastic Desktop app on Linux, macOS, and Windows — connections, feature parity, and keyboard shortcuts. +aliases: + - desktop + - linux + - macos + - windows + - jvm +--- + +# Desktop App + +The Meshtastic Desktop application provides the same mesh communication features on Linux, macOS, and Windows. + +## Overview + +The Desktop app shares its core codebase with the Android app through Kotlin Multiplatform (KMP). Most features work identically across platforms. + +## Installation + +### Linux + +- Download the `.deb` or `.AppImage` package from the releases page +- Or build from source using `./gradlew :desktopApp:run` + +### macOS + +- Download the `.dmg` package from releases +- Or build from source + +### Windows + +- Download the `.msi` installer from releases +- Or build from source + +## Connecting Your Radio + +### USB Serial (Primary) + +The most reliable connection method on Desktop: + +1. Connect your Meshtastic radio via USB cable. +2. The app should detect the serial port automatically. +3. If not detected, select the correct serial port from the connections menu. + +### TCP/IP + +For network-connected radios: + +1. Enter the radio's IP address and port (default: 4403). +2. Click **Connect**. + +### Bluetooth (BLE) + +Bluetooth Low Energy is supported on Desktop via the [Kable](https://github.com/JuulLabs/kable) library: + +1. Ensure your system has a Bluetooth adapter. +2. The app scans for nearby Meshtastic radios automatically. +3. Select your device from the connections screen. + +## Feature Parity + +| Feature | Android | Desktop | Notes | +| ---------------------------------------- | ------- | ------- | -------------------------- | +| Messaging | ✓ | ✓ | Full parity | +| Node List | ✓ | ✓ | Full parity | +| Mapa | ✓ | ✓ | Full parity | +| Definições | ✓ | ✓ | Full parity | +| Bluetooth (BLE) | ✓ | ✓ | Via Kable on desktop | +| Firmware Update OTA | ✓ | ✗ | Use web flasher | +| Notifications | ✓ | ✓ | Native OS notifications | +| Widgets | ✓ | ✗ | Android-only | +| AI Assistant (Chirpy) | ✓\* | ✗ | Google flavor Android only | + +\*Chirpy AI requires Android 14+ on Google flavor builds with supported hardware. + +## UI Differences + +The Desktop app uses the same Compose Multiplatform UI with adaptations for larger screens and desktop interaction. + +### Keyboard Shortcuts + +| Shortcut | Action | +| ------------------- | --------------------------- | +| **⌘Q** / **Ctrl+Q** | Quit the application | +| **⌘,** / **Ctrl+,** | Open Settings | +| **⌘1** / **Ctrl+1** | Switch to Conversations tab | +| **⌘2** / **Ctrl+2** | Switch to Nodes tab | +| **⌘3** / **Ctrl+3** | Switch to Map tab | +| **⌘4** / **Ctrl+4** | Switch to Connections tab | + +### Window & System Tray + +- **Window resizing** — responsive layout adapts to window dimensions +- **System tray** — minimize to system tray for background mesh operation +- **Tray menu** — right-click the tray icon to show window or quit +- **Mouse interaction** — hover states and standard desktop navigation + +### Notification Preferences + +The Desktop app provides in-app toggles for controlling which notifications are shown — messages, new nodes, and low battery alerts. Access these from **Settings → Notifications** within the app. + +## Built-in Documentation Browser + +The Desktop app includes a built-in documentation browser for quick access to help content without leaving the application. + +![Docs browser with table of contents](/assets/screenshots/docs-browser_toc.png) + +The browser supports full-text search across all documentation: + +![Searching the docs browser](/assets/screenshots/docs-browser_search.png) + +Individual doc pages render with full formatting: + +![A documentation page](/assets/screenshots/docs-browser_page.png) + +## Building from Source + +```bash +git clone https://github.com/meshtastic/Meshtastic-Android.git +cd Meshtastic-Android +git submodule update --init +./gradlew :desktopApp:run +``` + +Requirements: + +- JDK 21 +- No Android SDK required for desktop-only builds + +## Known Limitations + +- No OTA firmware updates (use web flasher) +- Some Android-specific features (widgets, specific notification channels) are unavailable +- Performance may vary on low-spec hardware running Compose Desktop +- BLE bonding is not yet supported on desktop (pairing works without bonding) + +## Related Topics + +- [Connections](connections) — connection methods overview +- [Firmware Updates](firmware) — use the [Web Flasher](https://flasher.meshtastic.org) for desktop firmware updates + +--- + diff --git a/docs/pt-rPT/user/discovery.md b/docs/pt-rPT/user/discovery.md new file mode 100644 index 000000000..31f94a79b --- /dev/null +++ b/docs/pt-rPT/user/discovery.md @@ -0,0 +1,114 @@ +--- +title: Discovery +nav_order: 12 +last_updated: 2026-05-13 +description: Explore your mesh network — traceroute paths, neighbor maps, and node discovery tools. +aliases: + - mesh-discovery + - local-discovery + - network-scan + - traceroute + - neighbor-info +--- + +# Discovery + +Discovery tools help you understand **how** your mesh network is connected — which nodes can hear each other, what paths messages take, and where bottlenecks or weak links exist. + +> 💡 **Tip:** You don't need a dedicated "discovery mode" to start exploring your mesh. The tools below are available right now from the node list and node detail screens. + +--- + +## Traçar rota + +Traceroute reveals the exact path a message takes from your node to any other node on the mesh. It's the single most useful tool for debugging connectivity problems. + +### Running a Traceroute + +1. Navigate to **Nodes** and tap the node you want to trace. +2. On the node detail screen, tap **Traceroute**. +3. The app sends a traceroute request and waits for the response. +4. Results display each hop in order, with signal quality at every step. + +### Reading the Results + +A traceroute result looks like this: + +``` +You → Node A (SNR: 8.5, RSSI: -95) → Node B (SNR: 5.2, RSSI: -108) → Target +``` + +Each hop represents a relay node that forwarded the message. The SNR and RSSI values at each hop tell you about the link quality on that specific segment. + +| What to look for | What it means | +| -------------------------------------------------------------------------- | --------------------------------------------------------------------------- | +| All hops show Good SNR (> 5 dB) | Healthy path — messages flow reliably | +| One hop shows Bad SNR (< 0 dB) | Weak link — this relay segment is fragile | +| Many hops (4+) | Long path — consider repositioning a node to shorten it | +| Different path on retry | Mesh is adapting — multiple routes exist (this is good!) | + +> 💡 **Tip:** Run traceroute several times over a few minutes. If the path changes, your mesh has redundant routes — a sign of a well-connected network. + +### Troubleshooting with Traceroute + +- **"No route found"** — The target node may be offline, out of range, or on a different channel. Check that both nodes share at least one channel with the same encryption key. +- **Traceroute times out** — The path may be too long (exceeds hop limit) or a relay node is congested. Try increasing the hop limit in **Settings → LoRa Config**. +- **Asymmetric paths** — A traceroute from A→B may take a different path than B→A. This is normal — radio propagation is not always symmetric. + +--- + +## Informações da vizinhança + +The Neighbor Info module lets each node broadcast a list of the nodes it can **directly hear** (single-hop). When multiple nodes share their neighbor lists, you can piece together a topology map of the entire mesh. + +### Enabling Neighbor Info + +1. Navigate to **Settings → Module Config → Neighbor Info**. +2. Enable the module. +3. Set the broadcast interval (default: 900 seconds / 15 minutes). + +Once enabled, your node periodically broadcasts its neighbor table. Other nodes with Neighbor Info enabled do the same. + +### Viewing Neighbor Data + +- Open any node's detail screen and look for the **Neighbors** section. +- Each neighbor entry shows the node that was directly heard and its signal quality. +- Combine neighbor data from multiple nodes to understand the full mesh topology. + +> ⚠️ **Note:** Neighbor Info increases airtime usage because every enabled node periodically broadcasts its neighbor list. On busy meshes with many nodes, consider longer broadcast intervals (3600 seconds or more) to avoid congestion. + +--- + +## Node List as a Discovery Tool + +The node list itself is a powerful discovery tool when you use its filtering and sorting features effectively. + +### Finding New Nodes + +- Sort by **Last heard** to see the most recently active nodes at the top. +- Enable **Include unknown** to see nodes that have appeared on the mesh but haven't sent user info yet — these are often newly powered-on devices. + +### Assessing Connectivity + +- Sort by **Hops away** to see which nodes are directly reachable (0 hops) versus relayed. +- Sort by **Distance** to find nearby nodes and verify they're reachable. +- Use **Exclude MQTT** to focus on nodes reachable over radio (not via internet bridge). + +### Infrastructure Audit + +- Disable **Exclude infrastructure** to see Router, Repeater, Router Late, and Client Base nodes. +- Check their signal quality and last-heard times to verify your infrastructure nodes are healthy. + +See [Nodes](nodes) for full details on filtering and sorting options. + +--- + +## Tips for Mesh Exploration + +- **Start with traceroute** — it gives you immediate, actionable information about a specific path. +- **Enable Neighbor Info on key nodes** — especially routers and repeaters, to build a picture of the backbone. +- **Check the map** — node positions on the [Map](map-and-waypoints) combined with signal data help you understand why some links are strong and others are weak. +- **Compare signal over time** — use the [Signal Meter](signal-meter) guide to interpret SNR and RSSI values correctly. + +--- + diff --git a/docs/pt-rPT/user/firmware.md b/docs/pt-rPT/user/firmware.md new file mode 100644 index 000000000..18b702636 --- /dev/null +++ b/docs/pt-rPT/user/firmware.md @@ -0,0 +1,114 @@ +--- +title: Firmware Updates +nav_order: 13 +last_updated: 2026-05-13 +description: Update your radio firmware over Bluetooth — OTA process, version channels, pre-flight checks, and recovery. +aliases: + - firmware + - update + - ota + - flash +--- + +# Firmware Updates + +Keep your Meshtastic radio up to date with the latest firmware for new features, bug fixes, and security improvements. + +## Checking for Updates + +1. Navigate to **Settings → Firmware Update** or tap the firmware notification if shown. +2. The app checks for available firmware versions. +3. Available updates show the version number and changelog summary. + +## Update Methods + +### OTA (Over-The-Air) via Bluetooth + +The most common update method for Android users: + +1. Ensure your radio is connected via Bluetooth. +2. Navigate to the Firmware Update screen. +3. Select the desired firmware version. +4. Tap **Update** to begin the OTA process. +5. Wait for the update to complete — **do not disconnect** during the update. + +![Firmware checking for updates](/assets/screenshots/firmware_checking.png) + +> ⚠️ **Warning:** Interrupting a firmware update can brick your device. Ensure your radio has sufficient battery (>50% recommended) and maintain Bluetooth proximity during the entire process. + +![Firmware disclaimer](/assets/screenshots/firmware_disclaimer.png) + +### USB Flashing + +For recovery or when OTA is unavailable: + +- Use the [Meshtastic Web Flasher](https://flasher.meshtastic.org) +- Or the [Meshtastic CLI tool](https://meshtastic.org/docs/getting-started/flashing-firmware) on desktop + +## Version Channels + +| Canal | Descrição | +| ------ | ------------------------------------------- | +| Stable | Recommended for most users; tested releases | +| Alpha | Preview releases; may contain bugs | + +## Pre-Update Checklist + +Before updating: + +- [ ] Battery > 50% +- [ ] Stable Bluetooth connection +- [ ] Note your current settings (they may reset on major version changes) +- [ ] Check the release notes for breaking changes + +## Post-Update + +After a successful update: + +- The radio will reboot automatically +- Bluetooth connection will re-establish +- Verify your settings are intact +- Check the firmware version in **Settings → About** + +![Firmware update success](/assets/screenshots/firmware_success.png) + +## Troubleshooting + +### Update Stuck + +If the update appears frozen: + +- Wait at least 5 minutes before intervening +- If truly stuck, power-cycle the radio +- Attempt the update again + +![Firmware update error](/assets/screenshots/firmware_error.png) + +### Device Won't Boot After Update + +If your device fails to boot: + +1. Try connecting via USB to a computer +2. Use the web flasher in recovery/DFU mode +3. Flash a known-good firmware version +4. Check the Meshtastic Discord for device-specific recovery steps + +### Compatibility Warnings + +The app may show warnings when: + +- Connected radio firmware is below minimum supported version +- Major version mismatch between app and firmware +- Deprecated features need migration + +> ⚠️ **Important:** Always update the Meshtastic app before or alongside firmware updates to ensure compatibility. + +## Related Topics + +- [Connections](connections) — reconnecting after a firmware update +- [Flashing firmware guide](https://meshtastic.org/docs/getting-started/flashing-firmware) — full firmware flashing walkthrough on meshtastic.org +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — check firmware compatibility by device +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/pt-rPT/user/map-and-waypoints.md b/docs/pt-rPT/user/map-and-waypoints.md new file mode 100644 index 000000000..c8e953645 --- /dev/null +++ b/docs/pt-rPT/user/map-and-waypoints.md @@ -0,0 +1,116 @@ +--- +title: Map & Waypoints +nav_order: 6 +last_updated: 2026-05-13 +description: View node positions on the map, create and share waypoints, and manage position sharing and privacy. +aliases: + - map + - waypoints + - gps + - location +--- + +# Map & Waypoints + +The Map screen shows the geographic positions of nodes on your mesh, along with shared waypoints. + +## Map View + +The map displays: + +- **Node positions** — colored markers for each node reporting location +- **Waypoints** — shared points of interest +- **Your position** — your current GPS location + +### Node Markers + +Node markers on the map indicate: + +| Color | Meaning | +| ------ | ---------------------------------------------- | +| Verde | Online (heard recently) | +| Yellow | Away (heard within 2 hours) | +| Gray | Offline (stale position) | +| Azul | Your own node | + +### Map Controls + +- **Zoom** — pinch or use +/- buttons +- **Pan** — drag to explore +- **Center** — select the location button to center on your position +- **Node tap** — tap a node marker to view details + +The floating toolbar provides quick access to compass, layer switching, node filters, refresh, and location tracking. Tap the compass to reorient north-up, or tap the location button to center on your current position. + +![Map controls overlay](/assets/screenshots/map_controls_overlay.png) + +## Waypoints + +Waypoints are shared geographic points of interest that all mesh members can see. + +### Creating a Waypoint + +1. Long-press on the map at the desired location. +2. Enter a name and optional description. +3. Choose an icon/emoji for the waypoint. +4. Tap **Send** to share with the mesh. + +### Waypoint Properties + +| Property | Descrição | +| ---------- | ------------------------------------------------------- | +| Nome | Short identifier (max 30 characters) | +| Descrição | Optional longer description | +| Icon | Visual marker emoji on the map | +| Bloqueado | If locked, only the creator can edit or delete | +| Expiration | Optional auto-remove time | + +### Waypoint Expiration + +Waypoints can be set to expire automatically: + +- **Never** (default) — waypoint remains until manually deleted +- **Timed** — waypoint is automatically removed after the specified duration (e.g., "remove after 2 hours"). Useful for temporary markers like rally points, hazards, or meeting locations. + +Expired waypoints are automatically hidden from the map so they don't clutter the display. The expiration countdown begins when the waypoint is created, not when other nodes receive it. + +### Managing Waypoints + +- Tap a waypoint on the map to view its details and coordinates +- Edit or delete waypoints you created +- **Locked waypoints** cannot be modified or deleted by other nodes — only the original creator can change them +- Unlocked waypoints can be edited by any mesh member + +## Position Sharing + +### Enabling Position Sharing + +Your node shares its GPS position based on: + +- **Fixed interval** — broadcast position at regular intervals +- **Smart position** — broadcast when movement exceeds a threshold +- **Manual** — only share when explicitly requested + +Configure position behavior in **Settings → Position**. + +### Privacy Considerations + +> 🔒 **Privacy:** Position data is broadcast to all nodes on your channel. If you don't want your location shared, disable GPS position in settings or use a fixed/fake position. + +## Map Sources + +The app supports multiple map tile sources: + +- OpenStreetMap (default) +- Satellite imagery (where available) +- Offline tiles (download map areas for offline use) + +## Related Topics + +- [Nodes](nodes) — view and filter your node list +- [Node Metrics](node-metrics) — signal quality and position history for individual nodes +- [Discovery](discovery) — traceroute and neighbor info for understanding mesh topology +- [Units & Locale](units-and-locale) — distance and coordinate display formats + +--- + diff --git a/docs/pt-rPT/user/messages-and-channels.md b/docs/pt-rPT/user/messages-and-channels.md new file mode 100644 index 000000000..8382e302f --- /dev/null +++ b/docs/pt-rPT/user/messages-and-channels.md @@ -0,0 +1,159 @@ +--- +title: Messages & Channels +nav_order: 3 +last_updated: 2026-05-13 +description: Send and receive messages, manage channels, configure encryption, and use quick chat, reactions, and message actions. +aliases: + - channels + - direct-messages + - messaging + - conversations +--- + +# Messages & Channels + +Meshtastic supports two communication modes: **channel broadcasts** and **direct messages**. + +## Canal + +Channels are shared communication groups. All nodes configured with the same channel key can read and send messages on that channel. + +### Default Channel + +Every Meshtastic device comes with a default **LongFast** channel. This is an unencrypted channel used for general mesh communication. + +### Channel Security + +Channels support multiple encryption levels: + +| Icon | Security Level | Descrição | +| ---- | ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------- | +| 🔒 | PSK (256-bit AES) | Fully encrypted with a strong pre-shared key. Only nodes with the matching key can read messages. | +| 🔐 | PSK (128-bit AES) | Encrypted with a shorter key. Secure for most uses but 256-bit is preferred for sensitive data. | +| 🔓 | Default / Open | Uses the well-known default key. **Any Meshtastic device** on the same preset can read these messages. | +| ⚠️ | Insecure + Position | Open channel that also broadcasts your GPS position. Use with caution in public meshes. | + +> 🔒 **Security Tip:** 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. + +### Adding a Channel + +1. Navigate to **Settings → Channels**. +2. Tap **Add Channel** or scan a QR code. +3. Configure the channel name and encryption key. +4. Share the channel URL/QR code with others who need access. + +Tapping a channel shows its details and sharing options. + +## Direct Messages + +Direct messages (DMs) are point-to-point encrypted communications between two specific nodes. + +### Sending a Direct Message + +1. Open the **Messages** tab. +2. Select a node from your contacts list or tap a node in the node list. +3. Type your message and tap **Send**. + +### Message States + +| State | Icon | Meaning | +| --------------------------------- | ---- | ----------------------------------------------------------------------------------------------------------------- | +| Queued | ⏳ | Message waiting to be sent | +| En route | ✓ | Delivered to the radio, awaiting acknowledgment | +| Delivered | ✓✓ | Acknowledgment received from recipient | +| Received | ✓ | Message received from the mesh (incoming) | +| S&F Routing | 🔗 | Store & Forward: message being routed through an S&F node | +| S&F Confirmed | 🔗 | Store & Forward: delivery confirmed via S&F node | +| Erros | ✗ | Delivery failed after retries | + +### Delivery Errors + +When a message fails to deliver, the error indicator shows what went wrong: + +| Erros | Meaning | What to Do | +| ---------------- | ---------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| No Route | No path exists to the destination node | The recipient may be offline or out of mesh range. Try later or move closer. | +| Got NAK | The next-hop node refused to relay | The relay node may be congested. Wait and retry. | +| Timeout | No acknowledgment within retry window | The recipient may be just out of range. Try increasing hop limit or moving to a better position. | +| Sem interface | No radio interface available to send | Check that your radio is connected and the channel is configured. | +| Max Retransmit | All retry attempts exhausted | The mesh path is unreliable. Try a different channel or wait for conditions to improve. | +| Sem canal | The destination channel doesn't exist | Verify both nodes share the same channel configuration. | +| Too Large | Message exceeds maximum payload size | Shorten your message (max ~230 characters). | +| No Response | Node received message but didn't respond | The recipient's radio may be busy or in low-power sleep mode. | +| Duty Cycle Limit | Regional airtime limit reached | Your radio has used its allowed transmit time. Wait for the duty cycle window to reset (typically 1 hour in EU regions). | +| Pedido Inválido | Malformed or invalid message | This usually indicates a software bug. Try restarting the app. | + +> 💡 **Tip:** 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. + +## Message Features + +### Quick Chat + +Pre-configured messages for rapid communication: + +- Access via the Quick Chat button in the message input area +- Choose from built-in phrases or custom messages +- Customize quick chat messages in **Settings → Quick Chat** +- Useful when typing is impractical (gloves, small screen, urgent) + +![Quick chat option](/assets/screenshots/messages_quick_chat.png) + +The channel list shows each channel with its latest message preview. + +### Message Bubbles + +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. + +### Reactions + +React to messages with emoji: + +- **Long-press** a message to open the actions menu +- Tap **Add Reaction** to choose an emoji +- Reactions appear below the message bubble +- Multiple users can react to the same message +- React to your own messages or others' messages + +![Emoji reaction badges displayed beneath a message](/assets/screenshots/messages_reaction.png) + +> 💡 **Tip:** Reactions are lightweight — they use minimal mesh bandwidth compared to full text messages. + +### Message Actions + +Long-press any message to access: + +- **Copy** — copy message text to clipboard +- **Reply** — quote the message in your response +- **React** — add an emoji reaction +- **Delete** — remove a message you sent (local deletion) + +### Message Priority + +Messages are queued and transmitted based on priority: + +1. Emergency/alert messages (highest) +2. Direct messages +3. Channel broadcasts (lowest) + +### Message Limits + +- **Maximum length:** 237 bytes (approximately 230 characters for ASCII text) +- **Rate limiting:** The mesh enforces airtime fairness; heavy message volume may be throttled +- **Delivery:** Messages are retried automatically if no acknowledgment is received + +## Best Practices + +- Use channels for group coordination +- Use direct messages for private person-to-person communication +- Keep messages short — mesh bandwidth is limited +- Configure encryption for sensitive communications + +## Related Topics + +- [Nodes](nodes) — tap a node to start a direct message +- [Settings — Radio & User](settings-radio-user) — configure channel encryption and presets +- [MQTT](mqtt) — bridge channel messages to the internet +- [Channel configuration](https://meshtastic.org/docs/configuration/radio/channels) — detailed channel settings on meshtastic.org + +--- + diff --git a/docs/pt-rPT/user/mqtt.md b/docs/pt-rPT/user/mqtt.md new file mode 100644 index 000000000..1443b9de4 --- /dev/null +++ b/docs/pt-rPT/user/mqtt.md @@ -0,0 +1,137 @@ +--- +title: MQTT +nav_order: 11 +last_updated: 2026-05-13 +description: Bridge your mesh to the internet — MQTT broker setup, encryption layers, and map reporting. +aliases: + - mqtt + - internet-bridge + - broker +--- + +# MQTT + +MQTT bridges your Meshtastic mesh network to the internet, enabling long-range communication beyond radio range. + +## Overview + +The MQTT module connects your node to an MQTT broker, allowing: + +- Messages to reach nodes on different physical meshes via the internet +- Integration with home automation and monitoring systems +- Publishing node positions to the public Meshtastic map +- Custom data pipelines for logging and alerting + +## How It Works + +``` +[Your Node] → Radio → [Gateway Node with WiFi] → MQTT Broker → [Remote Gateway] → Radio → [Remote Node] +``` + +A gateway node with internet access (WiFi or Ethernet) publishes mesh messages to an MQTT topic. Remote gateways subscribed to the same topic inject those messages into their local mesh. + +## Configuração + +### Enabling MQTT + +1. Navigate to **Settings → Module Config → MQTT**. +2. Enable the MQTT module. +3. Configure the broker connection: + +![MQTT toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | Descrição | Predefinição | +| --------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------- | +| Server Address | MQTT broker hostname | mqtt.meshtastic.org | +| Utilizador | Broker authentication | meshdev | +| Palavra-passe | Broker authentication | large4cats | +| Root Topic | Base topic for messages | msh | +| Encryption | Encrypt MQTT payload | Enabled | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON packet support has been removed from firmware; this field is ignored | Disabled | +| TLS | Secure connection to broker | Disabled | +| Map Reporting | Report position to public map | Disabled | + +### Default Meshtastic Broker + +The community maintains a public broker at `mqtt.meshtastic.org`. This is intended for general use and testing. + +> 🔒 **Privacy:** Messages on the public broker are readable by anyone subscribed. Always use channel encryption for private communications. + +### Private Broker + +For better privacy and control, you can run your own MQTT broker: + +- Mosquitto (lightweight, open-source) +- HiveMQ +- EMQX + +Configure your node to point to your private broker with appropriate credentials. + +## Map Reporting + +When Map Reporting is enabled, your node publishes its position to the Meshtastic community map: + +- Visible at [meshmap.net](https://meshmap.net) and similar community map services +- Only position and node info are shared +- Disable this if you don't want your location publicly visible + +## Uplink vs Downlink + +| Direction | Descrição | +| ------------ | -------------------------------- | +| **Uplink** | Messages from mesh → MQTT broker | +| **Downlink** | Messages from MQTT broker → mesh | + +Configure per-channel which directions are active to control message flow and airtime usage. + +## Message Formats + +MQTT uses protobuf message format: + +| Format | Descrição | Use case | +| ------------ | ----------------------------------- | -------------------------- | +| **Protobuf** | Binary Meshtastic protobuf encoding | Node-to-node mesh bridging | + +> ⚠️ **Note:** JSON output support was removed from firmware. The `json_enabled` setting is still visible in the app for legacy compatibility but has no effect on current firmware versions. + +## Encryption & Privacy + +Understanding the layered encryption model: + +1. **Channel encryption** happens on the mesh _before_ MQTT. If your channel has a PSK, the MQTT payload is already encrypted — the broker and any subscribers see only the ciphertext. +2. **MQTT encryption** (the module setting) adds an additional encryption layer for transit to the broker. This protects metadata and routing information. +3. **TLS** encrypts the TCP connection to the broker itself, preventing network-level eavesdropping. + +> 🔒 **Important:** The default public channel has a well-known key. Messages on the default channel sent via MQTT are effectively **unencrypted** — anyone can decode them. Always use a custom PSK for private communications. + +## Best Practices + +- Use channel-level encryption (PSK) on channels that bridge to MQTT +- Don't enable MQTT on nodes without internet access (it will buffer and waste memory) +- Use a private broker for sensitive deployments +- Be mindful of airtime when downlinking messages from busy MQTT topics — every downlinked message consumes radio airtime on your local mesh +- Consider enabling uplink-only if you only need to monitor your mesh remotely without injecting messages back + +## Troubleshooting + +### MQTT Not Connecting + +- **Check WiFi** — the gateway node must have an active internet connection (WiFi or Ethernet). MQTT does not work over the LoRa radio link itself. +- **Verify credentials** — incorrect username or password will silently fail on most brokers. Double-check for trailing spaces. +- **Firewall** — port 1883 (MQTT) or 8883 (MQTT+TLS) must be open. Some networks block non-standard ports. +- **DNS resolution** — if using a custom broker hostname, verify the node can resolve it. Try the broker's IP address directly. + +### Messages Not Bridging + +- **Check uplink/downlink settings** — if only uplink is enabled, messages flow from mesh to MQTT but not back. Enable downlink on the receiving gateway. +- **Channel mismatch** — both gateways must share the same channel with the same PSK. A mismatch means messages are encrypted with different keys and appear as garbage. +- **Topic mismatch** — ensure both gateways use the same root topic. The default `msh` works for the public broker. + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — MQTT module configuration reference +- [Messages & Channels](messages-and-channels) — channel encryption and PSK setup +- [MQTT integration guide](https://meshtastic.org/docs/software/integrations/mqtt) — detailed MQTT documentation on meshtastic.org + +--- + diff --git a/docs/pt-rPT/user/node-metrics.md b/docs/pt-rPT/user/node-metrics.md new file mode 100644 index 000000000..076ff8f2c --- /dev/null +++ b/docs/pt-rPT/user/node-metrics.md @@ -0,0 +1,130 @@ +--- +title: Node Metrics +nav_order: 5 +last_updated: 2026-05-13 +description: Telemetry dashboards for each mesh node — device health, environment sensors, signal quality, power, traceroute, and position history. +aliases: + - metrics + - telemetry + - device-metrics + - signal +--- + +# Node Metrics + +The node detail screen provides comprehensive telemetry and metrics for each node on your mesh. + +## Device Metrics + +Basic operating information reported by each node: + +| Metric | Descrição | +| ------------------- | ----------------------------------- | +| Battery Level | Current battery percentage | +| Voltagem | Battery voltage reading | +| Utilização do canal | Percentage of airtime consumed | +| Airtime | Transmission time used by this node | +| Tempo ativo | Time since last reboot | + +Device metrics are displayed as individual cards with trend sparklines showing battery level, voltage, channel utilization, airtime, and uptime over time. + +> 💡 **Tip:** Tap any metric card to expand it into a full chart with historical data points. Pinch to zoom the time axis. + +## Environment Metrics + +Environmental sensor data (requires compatible hardware): + +| Metric | Sensor Examples | +| ------------------------------------ | --------------------- | +| Temperatura | BME280, BME680, SHT31 | +| Humidade | BME280, BME680, SHT31 | +| Pressão atmosférica | BME280, BMP280 | +| Gas Resistance | BME680 | +| IAQ (Air Quality) | BME680 | + +Environment metrics are charted over time for easy trend analysis — temperature, humidity, and pressure each get their own line chart with the measurement unit displayed on the Y axis. + +> 💡 **Tip:** Environment metrics require a sensor connected to the remote node. Not all nodes report environmental data. See [Telemetry & Sensors](telemetry-and-sensors) for a full list of supported sensors. + +## Signal Metrics + +Radio signal quality information: + +| Metric | Descrição | +| --------- | ----------------------------------------------------------------------------- | +| SNR | Signal-to-Noise Ratio (higher is better) | +| RSSI | Received Signal Strength Indicator (closer to 0 is better) | +| Hop Count | Number of mesh hops for last message | + +### Signal Quality Reference + +| SNR Range | Quality | +| --------------------------------- | --------- | +| > 10 dB | Excellent | +| 0 to 10 dB | Bom | +| -10 to 0 dB | Razoável | +| < -10 dB | Poor | + +## Power Metrics + +Power management telemetry (requires INA sensor or compatible hardware): + +| Metric | Descrição | +| ----------- | ----------------------- | +| Bus Voltage | Supply voltage | +| Atual | Power draw in milliamps | +| Energia | Calculated wattage | + +## Traçar rota + +Traceroute shows the path a message takes through the mesh: + +1. From the node detail screen, tap **Traceroute**. +2. The app sends a traceroute request to the target node. +3. Results show each hop with SNR/RSSI values. + +### Reading Traceroute Results + +``` +You → Node A (SNR: 8.5) → Node B (SNR: 5.2) → Target +``` + +Each hop represents a relay node that forwarded the message. + +## Histórico de posição + +Historical position data for nodes that share their location: + +- GPS coordinates +- Altitude +- Speed (if moving) +- Timestamp for each position report + +## Informações da vizinhança + +Shows which nodes a given node can directly hear, useful for understanding mesh topology. + +## Viewing Metrics + +1. Navigate to **Nodes**. +2. Tap the node you want to inspect. +3. Select the metric category from the detail tabs. + +![Node detail — local device](/assets/screenshots/nodes_detail_local.png) + +The position tab shows location data for nodes that share GPS: + +![Position inline content](/assets/screenshots/nodes_position.png) + +> ⚠️ **Note:** Metrics are only available when they have been reported by the remote node. Metrics update at intervals configured on each node's telemetry settings. + +## Related Topics + +- [Nodes](nodes) — node list, filtering, and sorting +- [Telemetry & Sensors](telemetry-and-sensors) — supported sensors and configuration +- [Signal Meter](signal-meter) — how signal quality is calculated from SNR and RSSI +- [Discovery](discovery) — traceroute details and neighbor info +- [Units & Locale](units-and-locale) — temperature, distance, and speed display formats + +--- + diff --git a/docs/pt-rPT/user/nodes.md b/docs/pt-rPT/user/nodes.md new file mode 100644 index 000000000..3ba2be1e6 --- /dev/null +++ b/docs/pt-rPT/user/nodes.md @@ -0,0 +1,152 @@ +--- +title: Nodes +nav_order: 4 +last_updated: 2026-05-13 +description: Browse, filter, and sort mesh nodes — view details, signal quality, roles, and quick actions. +aliases: + - node-list + - mesh-nodes + - peers +--- + +# Nodes + +The Nodes screen displays all devices visible on your mesh network. + +## Node List + +The node list shows every node your radio has heard, including: + +- **Node name** — user-configured long name +- **Short name** — 4-character identifier +- **Signal quality** — last heard signal strength +- **Last heard** — time since last communication +- **Distance** — estimated distance (if positions are shared) +- **Battery** — remote node battery level (if telemetry is enabled) + +### Node Status Indicators + +| Badge | Meaning | +| ---------- | ------------------------------------- | +| 🟢 Online | Node heard within the last 15 minutes | +| 🟡 Away | Node heard within the last 2 hours | +| 🔴 Offline | Node not heard for over 2 hours | +| ⭐ Favorite | Node marked as favorite by the user | + +### Node Roles + +Nodes can be configured with different roles that affect their mesh behavior: + +| Papel | Descrição | +| ------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Cliente | Standard end-user device | +| Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | +| Cliente silenciado | Receives but doesn't retransmit | +| Cliente oculto | Like Client Mute, plus hides from node list | +| Roteador | Prioritizes message forwarding; stays awake to relay | +| Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | +| ~~Router Client~~ | ⚠️ **Deprecated** (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | +| ~~Repeater~~ | ⚠️ **Deprecated** (removed in firmware 2.7.11) — no longer selectable; use Router instead | +| Monitor | Optimized for position reporting at regular intervals | +| Sensor | Optimized for telemetry reporting | +| TAK — ‘Kit’ de Consciencialização da Equipa | Interoperates with TAK systems (sends/receives CoT) | +| TAK Tracker | TAK position reporting only | +| Lost & Found | Continuous position beacon for recovery | + +### Choosing a Role + +Most users should keep the default **Client** role. Consider a different role when: + +- **Router** — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don't use Router on battery-powered handheld devices. +- **Router Late** — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. +- **Client Base** — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. +- **Client Mute** — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only devices or to reduce congestion in dense areas. +- **Tracker** — An unattended device whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. +- **Sensor** — An unattended device reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. +- **TAK / TAK Tracker** — Only needed if interoperating with ATAK/WinTAK systems. See [TAK Integration](tak) for details. + +> 💡 **Tip:** The mesh works best when most nodes are **Client** or **Router**. Too many Mute nodes reduces mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. + +### Encryption Indicators + +Nodes display encryption status icons next to their name: + +| Icon | Meaning | +| ----------- | ------------------------------------------------------------------------------------------------------------------- | +| 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | +| 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | +| ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) | + +> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. + +## Quick Actions + +From the node list, you can: + +- **Tap** a node to view its detail page +- **Long-press** for quick actions: + - Send a direct message + - View on map + - Solicitar posição + - Mark as favorite + - Traçar rota + +## Filtering & Sorting + +### Text Search + +Type in the search field to filter nodes by name or short name. The filter updates in real time as you type. + +### Filter Toggles + +| Filtrar | Descrição | +| -------------------------- | ---------------------------------------------------------------------------------------------- | +| **Only online** | Show only nodes heard within the last 15 minutes | +| **Only direct** | Show only nodes with direct (non-relayed) connections | +| **Include unknown** | Show nodes that haven't sent user info yet | +| **Exclude infrastructure** | Hide infrastructure-role nodes (Router, Repeater, Router Late, Client Base) | +| **Exclude MQTT** | Hide nodes heard only via MQTT internet bridge | +| **Show ignored** | Show nodes you've previously dismissed or muted | + +### Sort Options + +| Sort | Descrição | +| ------------------------------------------- | ------------------------------------------------------------------ | +| **Last heard** (default) | Most recently heard nodes first | +| **Alphabetical** | Sorted by node long name | +| **Distance** | Nearest nodes first (requires position sharing) | +| **Hops away** | Fewest relay hops first | +| **Channel** | Grouped by channel index | +| **Via MQTT** | Grouped by MQTT vs. radio-heard | +| **Favorites** | Favorited nodes first | + +## Node Detail + +Tapping a node opens the detail view with comprehensive information. See [Node Metrics](node-metrics) for full details on metrics and telemetry. + +![Node detail view](/assets/screenshots/nodes_node_list.png) + +The detail screen includes device info, position, and action buttons: + +![Node detail section](/assets/screenshots/nodes_detail_section.png) + +Inline status indicators show key metrics at a glance: + +| Indicator | Screenshot | +| --------------- | -------------------------------------------------------- | +| Signal quality | ![Signal](/assets/screenshots/nodes_signal_info.png) | +| Battery level | ![Battery](/assets/screenshots/nodes_battery_info.png) | +| Hop count | ![Hops](/assets/screenshots/nodes_hops_info.png) | +| Último recebido | ![Last heard](/assets/screenshots/nodes_last_heard.png) | +| Distância | ![Distance](/assets/screenshots/nodes_distance_info.png) | + +## Related Topics + +- [Node Metrics](node-metrics) — detailed telemetry dashboards for each node +- [Messages & Channels](messages-and-channels) — send a direct message to a node +- [Map & Waypoints](map-and-waypoints) — view node positions geographically +- [Discovery](discovery) — traceroute and neighbor info for topology exploration +- [Signal Meter](signal-meter) — understand what the signal bars mean + +--- + diff --git a/docs/pt-rPT/user/onboarding.md b/docs/pt-rPT/user/onboarding.md new file mode 100644 index 000000000..3b910534e --- /dev/null +++ b/docs/pt-rPT/user/onboarding.md @@ -0,0 +1,99 @@ +--- +title: Getting Started +nav_order: 1 +last_updated: 2026-05-13 +description: First-launch setup — permissions, onboarding flow, and next steps after connecting your radio. +aliases: + - first-launch + - setup + - intro +--- + +# Getting Started + +Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app. + +## First Launch + +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. + +### Welcome Screen + +The welcome screen introduces Meshtastic and its core capabilities: + +- Off-grid mesh communication +- No cellular or internet required +- End-to-end encrypted messaging + +Tap **Get Started** to proceed through the setup flow. + +![Welcome screen](/assets/screenshots/onboarding_welcome.png) + +## Permissions + +The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. + +### Bluetooth Permission + +Bluetooth is the primary connection method between your phone and Meshtastic radio: + +- **Bluetooth scanning** — discover nearby Meshtastic radios +- **Bluetooth connect** — establish and maintain connections with paired radios + +Grant both permissions when prompted. Without Bluetooth, you'll need to use USB or TCP connections instead. + +### Location Permission + +> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. + +Meshtastic also uses your location for: + +- Showing your position on the mesh map +- Calculating distances to other nodes +- Sharing your GPS coordinates with other mesh members (if enabled) + +Grant **"While using the app"** or **"Always"** depending on your preference: + +- **While using the app** — position updates only when the app is open +- **Always** — enables background position updates for always-on mesh presence + +If denied, Bluetooth scanning will not function and your node will not report a position. + +### Notifications Permission + +Notifications alert you to: + +- Incoming messages from channels and direct messages +- Connection status changes (connected, disconnected, reconnecting) +- Firmware update availability + +> 💡 **Tip:** You can fine-tune notification preferences later in Android system settings. The app creates separate notification channels for messages, connection events, and background service status. + +### Critical Alerts Permission + +On supported devices, the app may request permission for critical alerts: + +- These are high-priority notifications that can break through Do Not Disturb mode +- Useful for emergency mesh alerts or urgent messages +- You can **skip** this step if you don't need breakthrough notifications +- Configure or revoke later in Android notification settings + +## After Setup + +Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. + +> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. + +## What's Next? + +Once connected to a radio, explore: + +- [Connections](connections) — pair your first radio device +- [Messages & Channels](messages-and-channels) — send your first message +- [Nodes](nodes) — see who's on your mesh +- [Map & Waypoints](map-and-waypoints) — view node positions +- [Settings](settings-radio-user) — configure your radio and user profile + +New to Meshtastic? The [getting started guide](https://meshtastic.org/docs/getting-started) on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup. + +--- diff --git a/docs/pt-rPT/user/settings-module-admin.md b/docs/pt-rPT/user/settings-module-admin.md new file mode 100644 index 000000000..a43a4b84b --- /dev/null +++ b/docs/pt-rPT/user/settings-module-admin.md @@ -0,0 +1,246 @@ +--- +title: Settings — Modules & Admin +nav_order: 8 +last_updated: 2026-05-13 +description: Configure optional feature modules (MQTT, telemetry, canned messages, TAK, and more) and perform device administration. +aliases: + - modules + - module-config + - administration +--- + +# Settings — Modules & Admin + +Configure optional feature modules and perform device administration. Modules extend Meshtastic with specialized capabilities — each can be independently enabled or disabled. + +> 💡 **Tip:** You only need to enable the modules you actually use. Disabling unused modules reduces airtime, saves battery, and simplifies your configuration. + +Module settings use a card-based layout with toggle switches, dropdowns, text fields, and sliders: + +![Toggle switch](/assets/screenshots/settings_switch.png) + +![Dropdown selector](/assets/screenshots/settings_dropdown.png) + +![Text field](/assets/screenshots/settings_text_field.png) + +![Settings card layout](/assets/screenshots/settings_titled_card.png) + +## Module Configuration + +### MQTT Module + +Bridges mesh messages to and from an MQTT broker for internet connectivity. This is how you extend your mesh beyond radio range or integrate with home automation systems. + +| Setting | Descrição | +| --------------- | ------------------------------------------------------------------------ | +| Enabled | Toggle MQTT bridge | +| Servidor | MQTT broker address | +| Utilizador | Authentication username | +| Palavra-passe | Authentication password | +| Encryption | Encrypt MQTT payloads | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON support removed from firmware; field is ignored | +| TLS | Use secure connection | +| Root Topic | Base MQTT topic path | +| Map Report | Publish position for public map | + +See [MQTT](mqtt) for a detailed usage guide including encryption, privacy, and broker setup. + +### Serial Module + +Enables serial port communication for external device integrations (GPS modules, sensors, or custom hardware). When enabled, the node's serial port can send and receive protobuf or text data, allowing external microcontrollers or computers to interact with the mesh. + +| Setting | Descrição | +| ---------- | ------------------------------- | +| Enabled | Activate serial communication | +| Echo | Echo received serial data back | +| Mode | Text, Protobuf, or NMEA output | +| RX/TX Pins | GPIO pins for serial connection | +| Baud Rate | Serial communication speed | + +### External Notification Module + +Controls buzzer, LED, or vibration alerts on your radio hardware. Useful for devices that need to physically signal when a message arrives — particularly helpful for unattended or outdoor installations. + +| Setting | Descrição | +| -------------------------------- | --------------------------- | +| Enabled | Activate notifications | +| Alert Message | Notify on incoming messages | +| Alert Message Buzzer | Use buzzer for messages | +| Alert Message Vibra | Use vibration for messages | +| Alert Bell | Notify on bell character | +| Output (GPIO) | Pin for notification output | +| Active | High or Low active | +| Duration (ms) | Notification length | +| Use I2S as Buzzer | Use I2S audio output | + +### Store & Forward Module + +Buffers messages for nodes that were temporarily offline, then replays them when those nodes reconnect. Essential for meshes where nodes go in and out of range regularly — ensures messages aren't lost during brief disconnections. + +| Setting | Descrição | +| ------------------------------------------ | -------------------------- | +| Enabled | Activate store and forward | +| Heartbeat (s) | Announcement interval | +| Records | Maximum stored messages | +| History Return (max) | Max messages to replay | +| History Return (window) | Time window for replay | + +> 💡 **Tip:** Store and Forward works best on nodes with ample memory (ESP32 with PSRAM). Router nodes are ideal candidates since they're typically always-on. + +### Range Test Module + +Automated range testing tool for evaluating link quality between nodes. When enabled, the node periodically transmits test messages with incrementing counters. A receiver node logs these messages, allowing you to walk or drive away and later analyze at what distance messages stopped arriving. + +| Setting | Descrição | +| -------------------------------------- | --------------------------------- | +| Enabled | Activate range testing | +| Sender Interval (s) | Time between test transmissions | +| Save CSV | Log received test data to SD card | + +### Telemetry Module + +Controls what telemetry data your node shares with the mesh. Telemetry includes device health (battery, uptime) and environmental sensor data (temperature, humidity, pressure). + +| Setting | Descrição | +| ---------------------------- | --------------------------------------- | +| Device Metrics Interval | How often to report device metrics | +| Environment Metrics Interval | How often to report environment sensors | +| Air Quality Enabled | Report particulate sensor data | +| Power Metrics Enabled | Report power usage | + +See [Telemetry & Sensors](telemetry-and-sensors) for supported sensors and configuration recommendations. + +### Canned Message Module + +Pre-configured messages accessible from the device's physical buttons (for radios with rotary encoders, keypads, or similar input hardware). Define a list of quick-send messages that can be transmitted without a phone connected — ideal for field use. + +| Setting | Descrição | +| ------------------ | ----------------------------------------------------------- | +| ~~Enabled~~ | ⚠️ **Deprecated** — current firmware may ignore this toggle | +| Mensagens | Newline-separated list of messages | +| Send Bell | Play bell sound on send | +| Rotary Encoder | Enable rotary encoder input | +| Up/Down/Press Pins | GPIO pin assignments for input | + +### Audio Module + +Codec2 audio support for low-bandwidth voice communication over the mesh. This is an **experimental** feature that encodes voice into very small data packets using the Codec2 codec. + +| Setting | Descrição | +| --------------- | -------------------------------- | +| Enabled | Activate audio module | +| Codec2 Rate | Audio quality/bandwidth tradeoff | +| I2S Word Select | GPIO pin for I2S WS | +| I2S Data In | GPIO pin for I2S DIN | +| I2S Data Out | GPIO pin for I2S DOUT | + +> ⚠️ **Note:** Audio requires specific hardware (I2S microphone and speaker). Voice quality is very low-bandwidth — think "understandable radio voice," not phone-call quality. + +### Remote Hardware Module + +GPIO control over the mesh network. Allows a remote node to read or write GPIO pins on another node — useful for activating relays, reading switches, or controlling external hardware from a distance. + +| Setting | Descrição | +| -------------------- | --------------------------------------------------------------- | +| Enabled | Activate remote GPIO access | +| Allow Undefined Pins | Allow access to any GPIO pin (security risk) | + +> ⚠️ **Warning:** Enabling "Allow Undefined Pins" gives remote nodes access to all GPIO pins, which could interfere with the radio's own hardware. Only enable on dedicated GPIO nodes. + +### Neighbor Info Module + +Broadcasts information about directly heard neighbors, enabling mesh topology mapping. Each enabled node periodically shares a list of the other nodes it can hear and their signal quality. + +| Setting | Descrição | +| -------------------------------------- | ------------------------------------ | +| Enabled | Activate neighbor broadcasting | +| Update Interval (s) | How often to broadcast neighbor list | + +See [Discovery](discovery) for how to use neighbor data for mesh topology exploration. + +### Ambient Lighting Module + +Controls onboard NeoPixel or other addressable RGB LEDs on supported hardware. Can be used for visual status indicators, notification lights, or decorative effects. + +| Setting | Descrição | +| ------------------ | ---------------------------------------------------------- | +| Enabled | Activate LED control | +| LED State | On, Off, or set specific color | +| Red / Green / Blue | Individual color channel values (0–255) | + +### Detection Sensor Module + +Turns your node into a motion or door sensor alert system. When a GPIO pin detects a state change (motion detected, door opened), the node broadcasts an alert message over the mesh. + +| Setting | Descrição | +| ---------------------------------------- | ----------------------------------------------------------------------- | +| Enabled | Activate detection sensor | +| Monitor Pin | GPIO pin connected to sensor | +| Detection Triggered High | Trigger when pin goes high (vs. low) | +| Minimum Broadcast (s) | Minimum time between alert broadcasts | +| State Broadcast (s) | Periodic state broadcast interval | +| Send Bell | Include bell character in alerts | +| Friendly Name | Custom name for this sensor | + +### Paxcounter Module + +People counter using WiFi and BLE probe requests. Counts nearby devices by passively listening for probe requests that phones and laptops emit when scanning for networks. Available only on ESP32 devices. + +| Setting | Descrição | +| -------------------------------------- | -------------------------- | +| Enabled | Activate people counting | +| Update Interval (s) | How often to report counts | + +> 💡 **Tip:** Paxcounter is useful for estimating foot traffic at trailheads, event venues, or other locations. Counts are approximate — one person may carry multiple devices. + +### TAK Module + +Team Awareness Kit integration for interoperability with ATAK and WinTAK. See [TAK Integration](tak) for detailed setup and usage. + +## Administração + +### Administração Remota + +Remotely configure nodes that share your admin key: + +1. Select the target node in the node list. +2. Navigate to **Settings** for that node. +3. Modify configuration. +4. Tap **Save** — changes are sent over the mesh. + +> ⚠️ **Requires:** Admin key configured on both your node and the target node. + +### Clean Node Database + +Removes stale nodes from your local database that haven't been heard in a configurable time window. + +### Factory Reset + +Resets all settings to factory defaults. **This cannot be undone.** + +### Reiniciar + +Remotely reboot a connected or administered node. + +### Painel de depuração + +View detailed diagnostic information: + +- Protocol buffers debug output +- Mesh packet log +- Connection state details + +### Troubleshooting Remote Admin + +- **"No response from target node"** — the target may be out of range, offline, or have a mismatched admin key. Verify the admin key matches on both nodes. +- **Changes not applying** — some settings require a reboot to take effect. Try the Reboot action after saving. +- **Can't see remote settings** — ensure your node has the admin key for the target node and that Admin Channel is enabled in Security Config. + +## Related Topics + +- [Settings — Radio & User](settings-radio-user) — core radio and user profile settings +- [Module configuration reference](https://meshtastic.org/docs/configuration/module) — detailed module docs on meshtastic.org +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/pt-rPT/user/settings-radio-user.md b/docs/pt-rPT/user/settings-radio-user.md new file mode 100644 index 000000000..d2bad6967 --- /dev/null +++ b/docs/pt-rPT/user/settings-radio-user.md @@ -0,0 +1,173 @@ +--- +title: Settings — Radio & User +nav_order: 7 +last_updated: 2026-05-13 +description: Configure your radio hardware, LoRa presets, user profile, position sharing, power management, and security. +aliases: + - definições + - radio-config + - user-config + - lora +--- + +# Settings — Radio & User + +Configure your radio hardware and user identity parameters. + +## User Settings + +### User Profile + +| Setting | Descrição | +| ----------------- | ------------------------------------------------------------------------------------- | +| Long Name | Your display name (up to 39 characters) | +| Short Name | 4-character abbreviated name | +| Licensed Operator | Enable if you hold an amateur radio license (enables higher power) | + +### Applying Changes + +After modifying settings, tap **Save** to write the configuration to your radio. The device may reboot to apply changes. + +## Radio Configuration + +### Configuração do Dispositivo + +| Setting | Descrição | Predefinição | +| ------------------------------------------ | ----------------------------------------------------------------------- | ------------ | +| Papel | Node behavior (Client, Router, etc.) | Cliente | +| Rebroadcast Mode | How the node retransmits messages | Tudo | +| Node Info Broadcast (s) | Interval for broadcasting node info | 10800 | +| Double-tap Button | Action for double-tap button press | Disabled | + +### Configuração de LoRa + +| Setting | Descrição | Predefinição | +| --------------------- | ----------------------------------------------------------------------- | ----------------------------------------- | +| Região | Regulatory region for frequency bands | Unset (must configure) | +| Predefinição de modem | Speed/range tradeoff | LongFast | +| Hop Limit | Maximum retransmit hops | 3 | +| TX Power | Transmission power (dBm); 0 = max allowed for region | 0 (region max) | +| Frequency Offset | Fine-tune frequency (MHz) | 0 | +| Channel Bandwidth | Bandwidth setting | Default for preset | + +> ⚠️ **Important:** You **must** set your region before transmitting. Operating without the correct region may violate local radio regulations. See the [region configuration guide](https://meshtastic.org/docs/getting-started/initial-config) on meshtastic.org for details. + +### Modem Presets + +| Preset | Range | Speed | SNR Limit | Best For | +| ------------------ | ----------------------- | ------------------------- | ------------------------ | -------------------------------------------------------------------------------------------------------- | +| Short Turbo | ~1 km | 21.9 kbps | −5 dB | Dense urban with line-of-sight; data-heavy applications | +| Short Fast | ~3 km | 10.9 kbps | −7.5 dB | Urban neighborhoods; buildings within a few blocks | +| Short Slow | ~5 km | 5.5 kbps | −10 dB | Suburban short-range; moderate building density | +| Medium Fast | ~5 km | 5.5 kbps | −10 dB | Suburban areas; moderate building density | +| Medium Slow | ~8 km | 1.1 kbps | −12.5 dB | Suburban/rural; moderate range with slower speed | +| Long Turbo | ~10 km | 4.4 kbps | −10 dB | Similar range to Long Fast but with 500 kHz bandwidth; faster throughput | +| Long Fast | ~10 km | 1.1 kbps | −12.5 dB | **General use (default)** — balanced range and speed | +| Long Moderate | ~20 km | 0.34 kbps | −15 dB | Rural with some terrain; occasional use | +| Lite Fast | ~5 km | 5.5 kbps | −10 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Medium Fast | +| Lite Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Long Fast | +| Narrow Fast | ~5 km | 2.7 kbps | −10 dB | EU 868 MHz band (62.5 kHz BW); avoids interference with other devices | +| Narrow Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 868 MHz band (62.5 kHz BW); comparable to Long Fast | +| ~~Long Slow~~ | ~30 km | 0.18 kbps | −17.5 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | +| ~~Very Long Slow~~ | ~40+ km | 0.09 kbps | −20 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | + +#### Choosing a Modem Preset + +The modem preset controls the fundamental tradeoff between **range** and **data rate**: + +- **Slower presets** use more spreading, making signals decodable at weaker signal levels (lower SNR limit). This means longer range but fewer bytes per second. +- **Faster presets** pack more data per transmission but require a stronger signal to decode. + +**Practical guidance:** + +- **Urban mesh (many nodes, short distances):** Use **Long Fast** (default) or **Short Fast**. Higher speed means less airtime congestion when many nodes share the channel. +- **Rural/sparse mesh (few nodes, long distances):** Use **Long Moderate**. Range matters more than speed when nodes are far apart. +- **EU 866/868 MHz regulatory compliance:** Use **Lite Fast**, **Lite Slow**, **Narrow Fast**, or **Narrow Slow** — these are optimized for the EU SRD/868 MHz bands with narrower bandwidths. +- **Fixed infrastructure links:** Use **Short Turbo** or **Long Turbo** for dedicated point-to-point links with good antennas and line-of-sight. +- **Mixed environments:** Stick with **Long Fast** — it's the community default and ensures compatibility with others in your area. + +> ⚠️ **Important:** All nodes on the same channel **must** use the same modem preset. Nodes with mismatched presets cannot communicate even if they share the same frequency and encryption key. + +> 💡 **Tip:** The range estimates above assume flat terrain and modest antennas. Elevation advantage (hilltop, rooftop) dramatically increases effective range. A well-placed Router with Long Fast can often outperform a ground-level node with Long Slow. + +### Configuração do Ecrã + +| Setting | Descrição | +| ------------------- | ------------------------------------------------------------------------------------ | +| Screen Timeout | Time before display sleeps | +| Display Units | Metric or Imperial | +| OLED Type | Auto, SSD1306, SH1106, SH1107 | +| Compass Orientation | Rotation offset for compass display (0°, 90°, 180°, 270°) | +| ~~Compass North~~ | ⚠️ **Deprecated** — replaced by Compass Orientation; still visible in older firmware | + +### Configuração da posição + +| Setting | Descrição | +| ----------------------------------------- | ---------------------------------- | +| GPS Enabled | Enable/disable GPS | +| GPS Update Interval | How often to acquire GPS fix | +| Position Broadcast (s) | How often to share position | +| Posição Inteligente | Enable movement-based broadcasting | +| Posição fixa | Use a manually set position | + +### Configuração de Energia + +| Setting | Descrição | +| --------------------------------------- | --------------------------------------- | +| Power Saving | Enable low-power sleep mode | +| Shutdown After (s) | Auto-shutdown idle timer | +| ADC Multiplier | Battery voltage calibration factor | +| Wait Bluetooth (s) | Time to wait for BLE connection at boot | +| Mesh SDS Timeout (s) | Super-deep-sleep timeout | + +### Configuração de Rede + +| Setting | Descrição | +| ------------- | ---------------------------------------------------- | +| WiFi Enabled | Enable WiFi radio (ESP32 devices) | +| WiFi SSID | Network name to connect to | +| WiFi PSK | Network password | +| NTP Server | Time synchronization server | +| Syslog Server | Remote logging server | + +![IP address field](/assets/screenshots/settings_ipv4_field.png) + +### Configuração de Bluetooth + +| Setting | Descrição | +| ----------------- | ------------------------------------------------------------------------- | +| Bluetooth Enabled | Enable/disable BLE radio | +| Pairing Mode | Fixed PIN, Random PIN, or No PIN | +| PIN fixo | PIN code for pairing (default: 123456) | + +### Configuração de Segurança + +| Setting | Descrição | +| ---------------------- | -------------------------------------------------------------------------- | +| Chave pública | Your node's public key (read-only) | +| Chave do Administrador | Key for remote administration | +| Chave privada | Your node's private key (handle securely) | +| Admin Channel Enabled | Allow admin commands via channel | +| Debug Log | Output live debug logging over serial/bluetooth | +| Serial Enabled | Enable serial console access (moved from Device Config) | +| Modo Administrado | Restrict non-admin channel changes | + +![Password field](/assets/screenshots/settings_password_field.png) + +Settings use standard preference controls — dropdowns, toggles, and sliders: + +| Control | Screenshot | +| -------- | ------------------------------------------------------ | +| Dropdown | ![Dropdown](/assets/screenshots/settings_dropdown.png) | +| Toggle | ![Toggle](/assets/screenshots/settings_switch.png) | +| Slider | ![Slider](/assets/screenshots/settings_slider.png) | + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — optional feature modules and device administration +- [Signal Meter](signal-meter) — how modem presets affect signal quality thresholds +- [LoRa configuration](https://meshtastic.org/docs/configuration/radio/lora) — detailed LoRa settings reference on meshtastic.org +- [Initial configuration](https://meshtastic.org/docs/getting-started/initial-config) — region setup guide on meshtastic.org + +--- + diff --git a/docs/pt-rPT/user/signal-meter.md b/docs/pt-rPT/user/signal-meter.md new file mode 100644 index 000000000..78f7b718f --- /dev/null +++ b/docs/pt-rPT/user/signal-meter.md @@ -0,0 +1,81 @@ +--- +title: How the Meshtastic Signal Meter Works +nav_order: 15 +last_updated: 2026-05-13 +description: How the signal meter calculates quality from RSSI and SNR — LoRa spread spectrum, presets, and what the bars really mean. +aliases: + - signal + - signal-meter + - snr + - rssi +--- + +# How the Meshtastic Signal Meter Works + +The Meshtastic signal meter — the familiar bars or status color in the app — is calculated very differently than the "bars" on a traditional cell phone or Wi-Fi router. + +Most consumer devices simply measure how "loud" a signal is. However, because Meshtastic uses **LoRa (Long Range)** technology, its signal meter measures how **clear** the signal is, relative to the specific settings your mesh is using. + +--- + +## 1. The Two Metrics: "Loudness" vs. "Clarity" + +Every time the LoRa radio chip receives a message, it reports two measurements: + +- **RSSI (Received Signal Strength Indicator):** The **loudness** of the raw power hitting your antenna. +- **SNR (Signal-to-Noise Ratio):** The **clarity** of the signal compared to the background static. + +> **Tip — The Analogy:** Imagine you are trying to hear a friend talking to you. +> +> - **RSSI** is how loud their voice is. +> - **The Noise Floor** is the background noise in the room (air conditioning, other people talking, traffic). +> - **SNR** is how easily you can distinguish your friend's voice from the background noise. + +If your friend shouts at you at a deafening rock concert, the signal is incredibly loud (High RSSI), but you still can't understand them because the background noise is louder (Bad SNR). Conversely, if your friend whispers to you in a dead-silent library, the signal is very weak (Low RSSI), but you can understand them perfectly (Great SNR). + +--- + +## 2. The Magic of LoRa: Hearing "Below the Noise Floor" + +For standard radios (like FM or Wi-Fi), if the background noise is louder than the signal (a negative SNR), the receiver just hears static. + +LoRa is special. It uses **"Spread Spectrum"** modulation, which allows the radio to mathematically pull a signal out of the air even when it is buried deep _underneath_ the background noise. This is why you will frequently see **negative SNR numbers** in Meshtastic (e.g., -10 dB, which means the signal is 10 decibels weaker than the background static). + +Depending on which Meshtastic preset you are using (e.g., `LongFast` vs. `ShortFast`), the radio has a specific **SNR Limit** — the absolute maximum amount of noise it can tolerate before the message is completely lost to the static. + +--- + +## 3. How the Signal Meter Calculates Quality + +The Meshtastic apps take both RSSI and SNR and run them through a specific formula to assign your signal a quality rating (None, Bad, Fair, or Good). It specifically scales these values based on the physical limits of the radio preset you are using. + +Here is exactly how the app decides how many bars (or what color) to show you: + +| Level | Bars | Criteria | Meaning | +| -------- | ---- | ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | +| Bom | 3 | RSSI better than `-115 dBm` **AND** SNR better than `-7 dB` | Signal is both loud and clear — healthy connection. | +| Razoável | 2 | RSSI better than `-126 dBm` with good SNR, **OR** SNR better than `-15 dB` with good RSSI | Signal getting quieter or noisier, but still decodable. | +| Mau | 1 | Falls between Fair and None thresholds | At the edge of range or experiencing interference. | +| Nenhum | 0 | RSSI worse than `-126 dBm` **AND** SNR worse than `-15 dB` | Transmission completely buried in noise. | + +--- + +## 4. What This Means for You + +Because Meshtastic's meter acts as a **"Clarity Meter"**, it behaves differently than what most people expect: + +> **Tip — Don't panic over low RSSI:** You might see a seemingly terrible RSSI value like `-118 dBm`. On a cell phone, you would have zero bars. But if you have an SNR of `+2 dB`, Meshtastic will still show a strong signal! _The library is quiet, so the whisper is heard perfectly._ + +> **Warning — Watch out for local noise:** If you hook up a massive antenna and see a great RSSI (e.g., `-90 dBm`) but your signal meter is only showing **1 Bar (Bad)**, you have a problem. It means you have local interference — perhaps a cheap power supply, a noisy computer, or a nearby radio tower — creating so much static that it is drowning out your mesh. + +## Where Signal Information Appears + +In the app, signal data is shown in several places: + +- **Node list** — signal bars icon next to each node +- **Node detail** — SNR, RSSI, and signal quality in the device metrics section +- **Traceroute** — per-hop signal quality for each relay node +- **Signal metrics** — historical SNR and RSSI data in the metrics charts + +![Node entry showing SNR, RSSI values and colored signal bars](/assets/screenshots/nodes_signal_info.png) + diff --git a/docs/pt-rPT/user/tak.md b/docs/pt-rPT/user/tak.md new file mode 100644 index 000000000..621b64081 --- /dev/null +++ b/docs/pt-rPT/user/tak.md @@ -0,0 +1,126 @@ +--- +title: TAK Integration +nav_order: 10 +last_updated: 2026-05-13 +description: Interoperate with ATAK and WinTAK — CoT position sharing, TAK roles, and plugin setup. +aliases: + - tak + - atak + - team-awareness-kit +--- + +# TAK Integration + +Meshtastic integrates with the Team Awareness Kit (TAK) ecosystem, enabling interoperability between Meshtastic mesh devices and TAK applications like ATAK and WinTAK. + +## Overview + +The TAK module allows Meshtastic nodes to: + +- Share position data in TAK-compatible CoT (Cursor on Target) format +- Appear as team members on TAK map displays +- Receive TAK PLI (Position Location Information) messages + +## Setup + +### Prerequisites + +- ATAK (Android Team Awareness Kit) or WinTAK installed +- Meshtastic ATAK Plugin installed +- TAK module enabled on your Meshtastic radio + +### Configuração + +1. Navigate to **Settings → Module Config → TAK**. +2. Enable the TAK module. +3. Configure the TAK team/group settings: + +![Module toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | Descrição | +| ------- | -------------------------- | +| Enabled | Activate TAK interop | +| Mode | TAK-compatible output mode | + +### ATAK Plugin Setup + +1. Install the Meshtastic ATAK Plugin from the plugin repository. +2. Open ATAK and enable the Meshtastic plugin. +3. The plugin bridges messages between ATAK and your mesh network. + +## TAK Roles + +Nodes configured with TAK-related roles behave differently from standard clients: + +| Papel | Descrição | +| --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **TAK** | Full TAK interoperability — sends and receives CoT data, chat messages, and PLI updates. Functions as a standard client plus TAK bridge. | +| **TAK Tracker** | Position-only TAK output — automatically broadcasts PLI at regular intervals without user interaction. Optimized for unattended position beacons (vehicles, equipment, waypoints). Does not relay chat messages. | + +> 💡 **Tip:** Use **TAK Tracker** for devices that only need to report position (e.g., a radio mounted in a vehicle). Use **TAK** for devices where users actively participate in TAK operations. + +### CoT (Cursor on Target) Format + +TAK messages use the Cursor on Target XML format — a military standard for sharing situational awareness data. Meshtastic converts its internal protobuf messages to CoT format when bridging to TAK systems, so no manual format conversion is needed. + +## TAK Identity + +When using TAK roles, your node broadcasts identity information that appears on TAK maps: + +| Setting | Descrição | +| -------- | ---------------------------------------------------------------------------------------------------------------- | +| Team | Your team color on the TAK map (e.g., Blue, Red, Cyan, Green) | +| Papel | Your operational role (Team Member, Team Lead, HQ, Medic, RTO, etc.) | +| Callsign | Your TAK callsign (defaults to your Meshtastic long name) | + +These settings appear in **Settings → Module Config → TAK** when the TAK module is enabled. + +> 💡 **Tip:** Team/role colors are the standard TAK affiliation colors. Coordinate with your TAK team to use consistent team assignments. + +## Wire Format (V1 / V2) + +Meshtastic supports two TAK wire formats: + +| Format | Compatibility | Features | +| ------------------------------- | --------------------------------------------------------------- | --------------------------------------------------------- | +| V1 (Legacy) | ATAK Plugin v1.x, older firmware | Basic CoT position sharing only | +| V2 (Current) | ATAK Plugin v2.x, firmware 2.3+ | Full CoT support including chat, routes, zstd compression | + +The app automatically selects V2 when both sides support it. No manual configuration needed — the TAK module negotiates format based on firmware capabilities. + +## Usage with ATAK + +Once configured: + +- Meshtastic nodes appear as markers on the ATAK map with callsign labels +- Chat messages can bridge between mesh and TAK networks +- Position updates flow bidirectionally between Meshtastic and TAK +- TAK Tracker nodes broadcast PLI automatically — their positions appear on ATAK maps without any ATAK-side configuration + +> ⚠️ **Note:** TAK integration requires specific node roles and module configuration. Standard client nodes don't automatically participate in TAK operations. + +## Troubleshooting + +| Problem | Cause | Solution | +| -------------------------------- | ------------------------------------- | ----------------------------------------------------------------------- | +| Node doesn't appear on ATAK map | TAK module disabled or wrong role | Verify TAK module is enabled and node role is TAK or TAK Tracker | +| Position updates are stale | GPS fix lost or interval too long | Check GPS status; reduce position broadcast interval in Position Config | +| ATAK plugin shows "disconnected" | BLE connection lost or plugin crashed | Reconnect Bluetooth in Meshtastic app, then restart ATAK plugin | +| Chat messages not bridging | V1 format doesn't support chat | Ensure both nodes run firmware 2.3+ for V2 wire format | +| CoT data not flowing | Channel mismatch | All TAK nodes must be on the same channel with matching encryption | + +## Security Considerations + +- TAK data shares your position and callsign information +- Ensure your channel encryption is configured when using TAK in sensitive environments +- The TAK module respects the same channel encryption as other Meshtastic messages + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — TAK module configuration +- [Nodes](nodes) — TAK and TAK Tracker roles in the node list +- [Map & Waypoints](map-and-waypoints) — node positions on the map +- [ATAK plugin guide](https://meshtastic.org/docs/software/integrations/atak-plugin) — detailed ATAK setup on meshtastic.org + +--- + diff --git a/docs/pt-rPT/user/telemetry-and-sensors.md b/docs/pt-rPT/user/telemetry-and-sensors.md new file mode 100644 index 000000000..0e5976f0e --- /dev/null +++ b/docs/pt-rPT/user/telemetry-and-sensors.md @@ -0,0 +1,118 @@ +--- +title: Telemetry & Sensors +nav_order: 9 +last_updated: 2026-05-13 +description: Sensor data on the mesh — supported environment, air quality, and power sensors, plus configuration and viewing guides. +aliases: + - sensors + - environment + - weather + - power-metrics +--- + +# Telemetry & Sensors + +Meshtastic nodes can collect and share sensor data across the mesh network. + +## Overview + +Telemetry allows nodes equipped with sensors to broadcast environmental, power, and device health information. This data is visible on the node detail screen and can be logged over time. + +## Device Telemetry + +All Meshtastic nodes report basic device telemetry: + +| Metric | Descrição | Typical Range | +| ------------------- | ------------------------------ | ------------------------------------------------------------------ | +| Battery Level | Charge percentage | 0–100% | +| Voltagem | Battery voltage | 3.0–4.2V (LiPo) | +| Utilização do canal | % of airtime used locally | 0–100% | +| Air Utilization TX | % of airtime used by this node | 0–100% | +| Tempo ativo | Seconds since last boot | Varies | + +## Environment Sensors + +Supported environmental sensors: + +### Temperature & Humidity + +| Sensor | Temperatura | Humidade | Pressão | Notes | +| ------- | ----------- | -------- | ------- | ----------------------- | +| BME280 | ✓ | ✓ | ✓ | Recommended all-in-one | +| BME680 | ✓ | ✓ | ✓ | Adds gas resistance/IAQ | +| SHT31 | ✓ | ✓ | — | High accuracy | +| MCP9808 | ✓ | — | — | Precision temperature | +| LPS22 | — | — | ✓ | Pressure only | + +### Air Quality + +| Sensor | Metric | Notes | +| -------- | -------------------------------------------------- | -------------------------- | +| BME680 | Gas Resistance / IAQ | Volatile organic compounds | +| PMSA003I | PM1.0, PM2.5, PM10 | Particulate matter | +| SEN55 | PM, NOx, VOC, Temp, Humidity | Multi-sensor | + +### Light & UV + +| Sensor | Metric | +| -------- | -------------------------------------- | +| OPT3001 | Ambient light (lux) | +| VEML7700 | Ambient light (lux) | +| LTR390 | UV index | + +## Power Metrics + +Nodes with INA-series power sensors can report: + +| Metric | Descrição | +| ----------- | ----------------------------------------- | +| Bus Voltage | Supply rail voltage | +| Atual | Power consumption (mA) | +| Energia | Calculated power (mW) | + +Useful for monitoring solar charging or battery health on remote nodes. + +## Configuring Telemetry + +1. Navigate to **Settings → Module Config → Telemetry**. +2. Set reporting intervals: + - **Device Metrics Interval** — how often to broadcast device metrics + - **Environment Metrics Interval** — how often to broadcast sensor data +3. Enable specific sensor types as needed. + +### Recommended Intervals + +| Use Case | Device (s) | Environment (s) | +| ------------------------------------------ | ----------------------------- | ---------------------------------- | +| Urban mesh (many nodes) | 3600 | 3600 | +| Rural mesh (few nodes) | 900 | 900 | +| Weather station | 900 | 300 | +| Battery conservation | 7200 | 7200 | + +> ⚠️ **Note:** Shorter intervals increase airtime usage and battery drain across the mesh. + +## Viewing Telemetry + +1. Navigate to **Nodes** and select a node. +2. Telemetry sections show on the detail screen: + - Device Metrics (always available) + - Environment Metrics (if sensors present) + - Power Metrics (if INA sensor present) +3. Historical graphs show trends over time. + +![Telemetry actions](/assets/screenshots/node-metrics_telemetric_actions.png) + +## Troubleshooting + +- **No environment data showing?** The remote node needs a physical sensor connected (e.g., BME280 on I2C). Device telemetry (battery, uptime) is always available, but environment metrics require hardware. +- **Stale readings?** Check the reporting interval — very long intervals (7200s+) mean data updates infrequently. Also verify the remote node is still online. +- **Sensor conflict on I2C bus?** Some sensors share I2C addresses. If you have multiple sensors on the same bus, check for address collisions in the radio's serial debug output. + +## Related Topics + +- [Node Metrics](node-metrics) — view telemetry data on the node detail screen +- [Settings — Modules & Admin](settings-module-admin) — telemetry module configuration +- [Units & Locale](units-and-locale) — temperature and pressure display units + +--- + diff --git a/docs/pt-rPT/user/translate.md b/docs/pt-rPT/user/translate.md new file mode 100644 index 000000000..b2ed79a34 --- /dev/null +++ b/docs/pt-rPT/user/translate.md @@ -0,0 +1,97 @@ +--- +title: Translate the App +parent: User Guide +nav_order: 17 +last_updated: 2026-05-13 +aliases: + - translate + - crowdin + - localization +--- + +# Translate the App + +Contributing translations helps make Meshtastic accessible to a wider audience. The app uses [Crowdin](https://crowdin.com/) to manage community translations for both the user interface and in-app documentation. + +--- + +## What Gets Translated + +| Resource | Source Location | Notes | +| ----------------- | ------------------------------------- | ---------------------------------------------------------------------- | +| UI strings | `composeResources/values/strings.xml` | Buttons, labels, messages, and all user-visible text | +| User Guide pages | `docs/user/*.md` | In-app documentation shown in Help & Documentation | +| Fastlane metadata | `fastlane/metadata/android/en-US/` | App Store listing title, description, and changelogs | + +> **Note — Developer Guide pages are English-only.** Code-focused documentation targeting contributors is not translated. + +--- + +## How to Contribute + +1. **Visit the Crowdin project.** Open the [Meshtastic Android Crowdin project](https://crowdin.com/project/meshtastic-android) and sign in or create a free account. +2. **Choose your language.** Select an existing language or request a new one by opening a [GitHub issue](https://github.com/meshtastic/Meshtastic-Android/issues/new). +3. **Translate strings.** Crowdin shows the English source on the left and your translation on the right. Translate each string and save. +4. **Review context.** Many strings include screenshots or context comments — check these to understand where the text appears in the app. +5. **Submit.** Approved translations are automatically merged into the next release. + +> **Tip — Keep translations short.** UI strings often appear in buttons, chips, or narrow columns. If a translation is significantly longer than the English original, consider abbreviating where the meaning stays clear. + +--- + +## Adding a New Language + +If your language is not yet listed on Crowdin: + +1. Open an issue on [GitHub](https://github.com/meshtastic/Meshtastic-Android/issues/new) requesting the new locale. +2. A maintainer will add the language to Crowdin and configure `crowdin.yml`. +3. Once added, you can begin translating immediately. + +--- + +## How Translations Are Organized + +The Android app uses **Compose Multiplatform resources** for all user-visible strings: + +``` +core/resources/src/commonMain/composeResources/ +├── values/ ← English (default) +│ └── strings.xml +├── values-de/ ← German +│ └── strings.xml +├── values-fr/ ← French +│ └── strings.xml +└── ... +``` + +In-app documentation follows a similar pattern under `docs/`: + +``` +docs/ +├── user/ ← English source (default) +│ ├── onboarding.md +│ └── ... +├── fr/user/ ← French translations +│ ├── onboarding.md +│ └── ... +└── ... +``` + +The app automatically selects the correct locale based on your device's **Language & Region** settings. + +--- + +## Translation Guidelines + +- **Do not translate** technical terms like "LoRa", "MQTT", "BLE", "TAK", "SNR", or "RSSI" — these are universal. +- **Keep placeholders intact.** Strings like `%1$s` or `%d` are filled in at runtime. Do not remove or reorder them unless the grammar of your language requires it. +- **Match tone.** The app uses a friendly, direct voice. Avoid overly formal language. +- **Test if possible.** Switch your device language and open the app to see how translations look in context. + +--- + +## Questions? + +If you have questions about a specific string's context or need help getting started, open a discussion on the [Meshtastic GitHub Discussions](https://github.com/meshtastic/Meshtastic-Android/discussions) page. + +Thank you for helping expand the reach of Meshtastic! diff --git a/docs/pt-rPT/user/units-and-locale.md b/docs/pt-rPT/user/units-and-locale.md new file mode 100644 index 000000000..9cb1bb6ad --- /dev/null +++ b/docs/pt-rPT/user/units-and-locale.md @@ -0,0 +1,118 @@ +--- +title: Units, Measurement & Locale +parent: User Guide +nav_order: 16 +last_updated: 2026-05-12 +--- + +# Units, Measurement & Locale + +The Meshtastic app automatically displays temperatures, distances, speeds, and times in the units your device is configured to use — no settings to change inside the app. + +--- + +## How It Works + +Meshtastic radios always transmit data in **metric units** (meters, °C, km/h, hPa, etc.). When the app receives this data, it uses the `MetricFormatter` utility to convert and display values in whatever unit system your device's locale specifies. + +On Android, your measurement preferences are determined by your system **Language & Region** settings. On Desktop (JVM), the app uses the JVM's default `Locale`. + +> **Tip — You never need to toggle units inside the app.** Change your system measurement preferences and every screen in Meshtastic updates automatically — node details, telemetry charts, weather, altitude, and more. + +--- + +## Temperatura + +Temperature values from environment sensors are transmitted as **°C** and displayed based on your device's temperature unit preference. + +![Environment metrics with temperature](/assets/screenshots/nodes_environment_metrics.png) + +| Your Setting | You See | +| ------------ | ------- | +| Celsius | 22°C | +| Fahrenheit | 72°F | + +This affects all temperature displays throughout the app: node environment telemetry, soil temperature, dew point, and telemetry chart axes. + +## Distance & Altitude + +Distances between nodes and GPS altitudes are transmitted as **meters** and automatically scaled and converted. + +![Distance info display](/assets/screenshots/nodes_distance_info.png) + +| Your Setting | Small Distance | Large Distance | Altitude | +| -------------------------------- | -------------- | ---------------------- | -------- | +| Metric | 350 m | 2.5 km | 1,200 m | +| Imperial (US) | 1,148 ft | 1.6 mi | 3,937 ft | + +The app uses natural scaling — short distances stay in meters or feet, while longer distances switch to kilometres or miles automatically. + +### Where these appear + +- **Node list** — distance and bearing to each node +- **Node detail** — altitude, distance from your position +- **Map** — waypoint distances, traceroute hop distances +- **Compass** — distance to selected node + +## Speed + +GPS ground speed is displayed in your locale's preferred speed unit. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Metric | 12 km/h | +| Imperial (US) | 7 mph | + +## Vento + +Wind speed and gust data from environment sensors are transmitted as **m/s** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Metric | 5 m/s | +| Imperial (US) | 11 mph | + +Wind readings appear in the **Node Detail** environment section and the **Environment Telemetry** charts. + +## Rainfall + +Rainfall measurements (1-hour and 24-hour totals) are transmitted as **mm** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ---------------------- | +| Metric | 12 mm | +| Imperial (US) | 0.5 in | + +## Units That Never Change + +Some units are international standards and are displayed the same way regardless of your locale: + +| Measurement | Unit | Why | +| -------------------------------- | ------------------------------ | ------------------------------------- | +| Barometric pressure | hPa | International meteorological standard | +| Heading / bearing | ° (degrees) | Universal navigation convention | +| Radiação | μR/hr | Standard dosimetry unit | +| GPS coordinates | decimal degrees | Universal geographic standard | +| Humidity, battery, soil moisture | % | Universal | + +## Date & Time + +All timestamps throughout the app — last heard, message times, telemetry logs, chart axes — follow your device's date and time preferences. + +| Setting | What It Controls | Example | +| ---------------- | ---------------- | ------------------------------------------------ | +| **24-Hour Time** | Clock format | 14:30 vs 2:30 PM | +| **Date Format** | Date ordering | 09/05/2026 vs 05/09/2026 | + +The app also uses **relative time** where it makes sense — for example, "5 min ago" or "2 hours ago" in the node list — which is automatically localised into your device language. + +## Changing Your Measurement System (Android) + +On Android, your measurement system (metric vs imperial) is tied to your region setting: + +1. Open **Android Settings → System → Language & Region** +2. Change your **Region** or **Measurement units** preference +3. Return to Meshtastic — values update immediately + +> **Tip — The app uses `MetricFormatter` from `core:common`.** All measurement formatting is handled by a shared KMP utility that respects your platform's locale. Developers adding new measurement displays should use `MetricFormatter` rather than hard-coding unit conversions. + diff --git a/docs/ro-rRO/index.md b/docs/ro-rRO/index.md new file mode 100644 index 000000000..e60717668 --- /dev/null +++ b/docs/ro-rRO/index.md @@ -0,0 +1,30 @@ +--- +title: Home +layout: default +nav_order: 0 +--- + +# Meshtastic Android App Documentation + +User and developer documentation for the Meshtastic Android, Desktop, and iOS applications powered by KMP (Kotlin Multiplatform). + +Use the sidebar navigation to browse the **User Guide** for app features and the **Developer Guide** for contributing to the project. + +--- + +## Quick Links + +| Guide | Descriere | +| --------------------------------------------------------------------- | -------------------------------------------------------------- | +| [Getting Started](user/onboarding) | Connect your first radio and send a message | +| [Messages & Channels](user/messages-and-channels) | Channel broadcasts, direct messages, reactions, and encryption | +| [Nodes](user/nodes) | Understanding the mesh network node list | +| [Signal Meter](user/signal-meter) | How the LoRa signal quality meter works | +| [Units & Locale](user/units-and-locale) | How temperatures, distances, and times adapt to your region | +| [Desktop App](user/desktop) | Linux, macOS, and Windows desktop usage | +| [Architecture](developer/architecture) | App architecture overview for contributors | +| [Contributing](developer/contributing) | Branch naming, PR workflow, and verification commands | + +--- + +> This documentation is served from the same markdown source that powers the in-app **Help & Documentation** browser. diff --git a/docs/ro-rRO/user/connections.md b/docs/ro-rRO/user/connections.md new file mode 100644 index 000000000..46d60268a --- /dev/null +++ b/docs/ro-rRO/user/connections.md @@ -0,0 +1,125 @@ +--- +title: Connections +nav_order: 2 +last_updated: 2026-05-13 +description: Connect your phone or desktop to a Meshtastic radio via Bluetooth, USB, or TCP/IP. +aliases: + - bluetooth + - usb + - tcp + - pairing +--- + +# Connections + +Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node. + +## Bluetooth (BLE) + +Bluetooth Low Energy is the default and most common connection method on Android. + +### Pairing a Device + +1. Ensure your Meshtastic radio is powered on and in pairing mode. +2. Open the app and navigate to **Connections**. +3. Tap **Scan for Devices** — nearby Meshtastic radios will appear. +4. Select your device from the list. +5. Accept the Bluetooth pairing prompt if shown. + +![Device list item](/assets/screenshots/connections_bluetooth_scan.png) + +You can filter devices by transport type using the filter chips at the top: + +![Transport filter chips](/assets/screenshots/connections_transport_filters.png) + +> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. + +### Connection Status + +| Icon | State | Descriere | +| ---- | -------------- | ----------------------------- | +| 🟢 | Conectat | Active radio link established | +| 🟡 | Conectare | Handshake in progress | +| 🔴 | Deconectat | No active connection | +| ⚪ | Not configured | Nici un dispozitiv selectat | + +When connecting, a status indicator shows the current connection state: + +![Connecting status](/assets/screenshots/connections_connecting.png) + +If no devices are found, the app shows an empty state with instructions: + +![No devices found](/assets/screenshots/connections_empty_state.png) + +### Troubleshooting Bluetooth + +- **Device not found:** Toggle Bluetooth off/on, ensure location is enabled. +- **Connection drops:** Move closer to the radio; check for interference. +- **Pairing rejected:** Forget the device in Android Bluetooth settings and retry. + +## USB Serial + +USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable. + +### Setup + +1. Connect your radio via USB cable to your device. +2. The app will prompt for USB permission — tap **Allow**. +3. The connection is established automatically. + +> ⚠️ **Note:** USB connections require OTG support on Android devices. + +## TCP/IP (WiFi) + +Some Meshtastic radios support WiFi connectivity, allowing TCP-based connections. + +### Configuration + +1. Connect your radio to a WiFi network via the radio's web interface or settings. +2. In the app, go to **Connections → TCP**. +3. Enter the radio's IP address and port (default: 4403). +4. Tap **Connect**. + +![WiFi scanning for devices](/assets/screenshots/connections_wifi_scanning.png) + +When a device is found, it appears in the connection list: + +![WiFi device found](/assets/screenshots/connections_wifi_device_found.png) + +A successful connection is confirmed with a status indicator: + +![WiFi connection success](/assets/screenshots/connections_wifi_success.png) + +### When to Use TCP + +- Radio is on the same local network +- Testing with a simulated radio +- Environments where Bluetooth has interference issues + +## Reconnection Behavior + +The app reconnects to the **last selected device** on startup. You can manually switch transports from the connections screen at any time. + +To disconnect from a radio, use the disconnect button on the connections screen: + +![Disconnect from radio](/assets/screenshots/connections_disconnect.png) + +## Desktop Connections + +On Desktop (Linux/macOS/Windows), the app supports: + +- **Bluetooth (BLE)** — via the Kable library; works on macOS, Linux, and Windows +- **USB Serial** — primary wired connection method +- **TCP/IP** — for network-connected radios + +See [Desktop App](desktop) for platform-specific details and keyboard shortcuts. + +## Related Topics + +- [Getting Started](onboarding) — first-launch setup and permissions +- [Settings — Radio & User](settings-radio-user) — Bluetooth and network configuration +- [Desktop App](desktop) — desktop-specific connection details +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — full list of compatible radios on meshtastic.org + +--- + diff --git a/docs/ro-rRO/user/desktop.md b/docs/ro-rRO/user/desktop.md new file mode 100644 index 000000000..0a188d5ac --- /dev/null +++ b/docs/ro-rRO/user/desktop.md @@ -0,0 +1,147 @@ +--- +title: Desktop App +nav_order: 14 +last_updated: 2026-05-13 +description: Install and use the Meshtastic Desktop app on Linux, macOS, and Windows — connections, feature parity, and keyboard shortcuts. +aliases: + - desktop + - linux + - macos + - windows + - jvm +--- + +# Desktop App + +The Meshtastic Desktop application provides the same mesh communication features on Linux, macOS, and Windows. + +## Overview + +The Desktop app shares its core codebase with the Android app through Kotlin Multiplatform (KMP). Most features work identically across platforms. + +## Installation + +### Linux + +- Download the `.deb` or `.AppImage` package from the releases page +- Or build from source using `./gradlew :desktopApp:run` + +### macOS + +- Download the `.dmg` package from releases +- Or build from source + +### Windows + +- Download the `.msi` installer from releases +- Or build from source + +## Connecting Your Radio + +### USB Serial (Primary) + +The most reliable connection method on Desktop: + +1. Connect your Meshtastic radio via USB cable. +2. The app should detect the serial port automatically. +3. If not detected, select the correct serial port from the connections menu. + +### TCP/IP + +For network-connected radios: + +1. Enter the radio's IP address and port (default: 4403). +2. Click **Connect**. + +### Bluetooth (BLE) + +Bluetooth Low Energy is supported on Desktop via the [Kable](https://github.com/JuulLabs/kable) library: + +1. Ensure your system has a Bluetooth adapter. +2. The app scans for nearby Meshtastic radios automatically. +3. Select your device from the connections screen. + +## Feature Parity + +| Feature | Android | Desktop | Notițe | +| ---------------------------------------- | ------- | ------- | -------------------------- | +| Messaging | ✓ | ✓ | Full parity | +| Node List | ✓ | ✓ | Full parity | +| Map | ✓ | ✓ | Full parity | +| Setări | ✓ | ✓ | Full parity | +| Bluetooth (BLE) | ✓ | ✓ | Via Kable on desktop | +| Firmware Update OTA | ✓ | ✗ | Use web flasher | +| Notifications | ✓ | ✓ | Native OS notifications | +| Widgets | ✓ | ✗ | Android-only | +| AI Assistant (Chirpy) | ✓\* | ✗ | Google flavor Android only | + +\*Chirpy AI requires Android 14+ on Google flavor builds with supported hardware. + +## UI Differences + +The Desktop app uses the same Compose Multiplatform UI with adaptations for larger screens and desktop interaction. + +### Keyboard Shortcuts + +| Shortcut | Action | +| ------------------- | --------------------------- | +| **⌘Q** / **Ctrl+Q** | Quit the application | +| **⌘,** / **Ctrl+,** | Open Settings | +| **⌘1** / **Ctrl+1** | Switch to Conversations tab | +| **⌘2** / **Ctrl+2** | Switch to Nodes tab | +| **⌘3** / **Ctrl+3** | Switch to Map tab | +| **⌘4** / **Ctrl+4** | Switch to Connections tab | + +### Window & System Tray + +- **Window resizing** — responsive layout adapts to window dimensions +- **System tray** — minimize to system tray for background mesh operation +- **Tray menu** — right-click the tray icon to show window or quit +- **Mouse interaction** — hover states and standard desktop navigation + +### Notification Preferences + +The Desktop app provides in-app toggles for controlling which notifications are shown — messages, new nodes, and low battery alerts. Access these from **Settings → Notifications** within the app. + +## Built-in Documentation Browser + +The Desktop app includes a built-in documentation browser for quick access to help content without leaving the application. + +![Docs browser with table of contents](/assets/screenshots/docs-browser_toc.png) + +The browser supports full-text search across all documentation: + +![Searching the docs browser](/assets/screenshots/docs-browser_search.png) + +Individual doc pages render with full formatting: + +![A documentation page](/assets/screenshots/docs-browser_page.png) + +## Building from Source + +```bash +git clone https://github.com/meshtastic/Meshtastic-Android.git +cd Meshtastic-Android +git submodule update --init +./gradlew :desktopApp:run +``` + +Requirements: + +- JDK 21 +- No Android SDK required for desktop-only builds + +## Known Limitations + +- No OTA firmware updates (use web flasher) +- Some Android-specific features (widgets, specific notification channels) are unavailable +- Performance may vary on low-spec hardware running Compose Desktop +- BLE bonding is not yet supported on desktop (pairing works without bonding) + +## Related Topics + +- [Connections](connections) — connection methods overview +- [Firmware Updates](firmware) — use the [Web Flasher](https://flasher.meshtastic.org) for desktop firmware updates + +--- + diff --git a/docs/ro-rRO/user/discovery.md b/docs/ro-rRO/user/discovery.md new file mode 100644 index 000000000..d87572d37 --- /dev/null +++ b/docs/ro-rRO/user/discovery.md @@ -0,0 +1,114 @@ +--- +title: Descoperiți +nav_order: 12 +last_updated: 2026-05-13 +description: Explore your mesh network — traceroute paths, neighbor maps, and node discovery tools. +aliases: + - mesh-discovery + - local-discovery + - network-scan + - traceroute + - neighbor-info +--- + +# Descoperiți + +Discovery tools help you understand **how** your mesh network is connected — which nodes can hear each other, what paths messages take, and where bottlenecks or weak links exist. + +> 💡 **Tip:** You don't need a dedicated "discovery mode" to start exploring your mesh. The tools below are available right now from the node list and node detail screens. + +--- + +## Trasare traseu + +Traceroute reveals the exact path a message takes from your node to any other node on the mesh. It's the single most useful tool for debugging connectivity problems. + +### Running a Traceroute + +1. Navigate to **Nodes** and tap the node you want to trace. +2. On the node detail screen, tap **Traceroute**. +3. The app sends a traceroute request and waits for the response. +4. Results display each hop in order, with signal quality at every step. + +### Reading the Results + +A traceroute result looks like this: + +``` +You → Node A (SNR: 8.5, RSSI: -95) → Node B (SNR: 5.2, RSSI: -108) → Target +``` + +Each hop represents a relay node that forwarded the message. The SNR and RSSI values at each hop tell you about the link quality on that specific segment. + +| What to look for | What it means | +| -------------------------------------------------------------------------- | --------------------------------------------------------------------------- | +| All hops show Good SNR (> 5 dB) | Healthy path — messages flow reliably | +| One hop shows Bad SNR (< 0 dB) | Weak link — this relay segment is fragile | +| Many hops (4+) | Long path — consider repositioning a node to shorten it | +| Different path on retry | Mesh is adapting — multiple routes exist (this is good!) | + +> 💡 **Tip:** Run traceroute several times over a few minutes. If the path changes, your mesh has redundant routes — a sign of a well-connected network. + +### Troubleshooting with Traceroute + +- **"No route found"** — The target node may be offline, out of range, or on a different channel. Check that both nodes share at least one channel with the same encryption key. +- **Traceroute times out** — The path may be too long (exceeds hop limit) or a relay node is congested. Try increasing the hop limit in **Settings → LoRa Config**. +- **Asymmetric paths** — A traceroute from A→B may take a different path than B→A. This is normal — radio propagation is not always symmetric. + +--- + +## Informații vecin + +The Neighbor Info module lets each node broadcast a list of the nodes it can **directly hear** (single-hop). When multiple nodes share their neighbor lists, you can piece together a topology map of the entire mesh. + +### Enabling Neighbor Info + +1. Navigate to **Settings → Module Config → Neighbor Info**. +2. Enable the module. +3. Set the broadcast interval (default: 900 seconds / 15 minutes). + +Once enabled, your node periodically broadcasts its neighbor table. Other nodes with Neighbor Info enabled do the same. + +### Viewing Neighbor Data + +- Open any node's detail screen and look for the **Neighbors** section. +- Each neighbor entry shows the node that was directly heard and its signal quality. +- Combine neighbor data from multiple nodes to understand the full mesh topology. + +> ⚠️ **Note:** Neighbor Info increases airtime usage because every enabled node periodically broadcasts its neighbor list. On busy meshes with many nodes, consider longer broadcast intervals (3600 seconds or more) to avoid congestion. + +--- + +## Node List as a Discovery Tool + +The node list itself is a powerful discovery tool when you use its filtering and sorting features effectively. + +### Finding New Nodes + +- Sort by **Last heard** to see the most recently active nodes at the top. +- Enable **Include unknown** to see nodes that have appeared on the mesh but haven't sent user info yet — these are often newly powered-on devices. + +### Assessing Connectivity + +- Sort by **Hops away** to see which nodes are directly reachable (0 hops) versus relayed. +- Sort by **Distance** to find nearby nodes and verify they're reachable. +- Use **Exclude MQTT** to focus on nodes reachable over radio (not via internet bridge). + +### Infrastructure Audit + +- Disable **Exclude infrastructure** to see Router, Repeater, Router Late, and Client Base nodes. +- Check their signal quality and last-heard times to verify your infrastructure nodes are healthy. + +See [Nodes](nodes) for full details on filtering and sorting options. + +--- + +## Tips for Mesh Exploration + +- **Start with traceroute** — it gives you immediate, actionable information about a specific path. +- **Enable Neighbor Info on key nodes** — especially routers and repeaters, to build a picture of the backbone. +- **Check the map** — node positions on the [Map](map-and-waypoints) combined with signal data help you understand why some links are strong and others are weak. +- **Compare signal over time** — use the [Signal Meter](signal-meter) guide to interpret SNR and RSSI values correctly. + +--- + diff --git a/docs/ro-rRO/user/firmware.md b/docs/ro-rRO/user/firmware.md new file mode 100644 index 000000000..fcff78748 --- /dev/null +++ b/docs/ro-rRO/user/firmware.md @@ -0,0 +1,114 @@ +--- +title: Firmware Updates +nav_order: 13 +last_updated: 2026-05-13 +description: Update your radio firmware over Bluetooth — OTA process, version channels, pre-flight checks, and recovery. +aliases: + - firmware + - update + - ota + - flash +--- + +# Firmware Updates + +Keep your Meshtastic radio up to date with the latest firmware for new features, bug fixes, and security improvements. + +## Checking for Updates + +1. Navigate to **Settings → Firmware Update** or tap the firmware notification if shown. +2. The app checks for available firmware versions. +3. Available updates show the version number and changelog summary. + +## Update Methods + +### OTA (Over-The-Air) via Bluetooth + +The most common update method for Android users: + +1. Ensure your radio is connected via Bluetooth. +2. Navigate to the Firmware Update screen. +3. Select the desired firmware version. +4. Tap **Update** to begin the OTA process. +5. Wait for the update to complete — **do not disconnect** during the update. + +![Firmware checking for updates](/assets/screenshots/firmware_checking.png) + +> ⚠️ **Warning:** Interrupting a firmware update can brick your device. Ensure your radio has sufficient battery (>50% recommended) and maintain Bluetooth proximity during the entire process. + +![Firmware disclaimer](/assets/screenshots/firmware_disclaimer.png) + +### USB Flashing + +For recovery or when OTA is unavailable: + +- Use the [Meshtastic Web Flasher](https://flasher.meshtastic.org) +- Or the [Meshtastic CLI tool](https://meshtastic.org/docs/getting-started/flashing-firmware) on desktop + +## Version Channels + +| Canal | Descriere | +| ------ | ------------------------------------------- | +| Stabil | Recommended for most users; tested releases | +| Alpha | Preview releases; may contain bugs | + +## Pre-Update Checklist + +Before updating: + +- [ ] Battery > 50% +- [ ] Stable Bluetooth connection +- [ ] Note your current settings (they may reset on major version changes) +- [ ] Check the release notes for breaking changes + +## Post-Update + +After a successful update: + +- The radio will reboot automatically +- Bluetooth connection will re-establish +- Verify your settings are intact +- Check the firmware version in **Settings → About** + +![Firmware update success](/assets/screenshots/firmware_success.png) + +## Troubleshooting + +### Update Stuck + +If the update appears frozen: + +- Wait at least 5 minutes before intervening +- If truly stuck, power-cycle the radio +- Attempt the update again + +![Firmware update error](/assets/screenshots/firmware_error.png) + +### Device Won't Boot After Update + +If your device fails to boot: + +1. Try connecting via USB to a computer +2. Use the web flasher in recovery/DFU mode +3. Flash a known-good firmware version +4. Check the Meshtastic Discord for device-specific recovery steps + +### Compatibility Warnings + +The app may show warnings when: + +- Connected radio firmware is below minimum supported version +- Major version mismatch between app and firmware +- Deprecated features need migration + +> ⚠️ **Important:** Always update the Meshtastic app before or alongside firmware updates to ensure compatibility. + +## Related Topics + +- [Connections](connections) — reconnecting after a firmware update +- [Flashing firmware guide](https://meshtastic.org/docs/getting-started/flashing-firmware) — full firmware flashing walkthrough on meshtastic.org +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — check firmware compatibility by device +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/ro-rRO/user/map-and-waypoints.md b/docs/ro-rRO/user/map-and-waypoints.md new file mode 100644 index 000000000..73033544a --- /dev/null +++ b/docs/ro-rRO/user/map-and-waypoints.md @@ -0,0 +1,116 @@ +--- +title: Map & Waypoints +nav_order: 6 +last_updated: 2026-05-13 +description: View node positions on the map, create and share waypoints, and manage position sharing and privacy. +aliases: + - map + - waypoints + - gps + - location +--- + +# Map & Waypoints + +The Map screen shows the geographic positions of nodes on your mesh, along with shared waypoints. + +## Map View + +The map displays: + +- **Node positions** — colored markers for each node reporting location +- **Waypoints** — shared points of interest +- **Your position** — your current GPS location + +### Node Markers + +Node markers on the map indicate: + +| Color | Meaning | +| -------- | ---------------------------------------------- | +| Verde | Online (heard recently) | +| Galben | Away (heard within 2 hours) | +| Gray | Offline (stale position) | +| Albastru | Your own node | + +### Map Controls + +- **Zoom** — pinch or use +/- buttons +- **Pan** — drag to explore +- **Center** — select the location button to center on your position +- **Node tap** — tap a node marker to view details + +The floating toolbar provides quick access to compass, layer switching, node filters, refresh, and location tracking. Tap the compass to reorient north-up, or tap the location button to center on your current position. + +![Map controls overlay](/assets/screenshots/map_controls_overlay.png) + +## Waypoints + +Waypoints are shared geographic points of interest that all mesh members can see. + +### Creating a Waypoint + +1. Long-press on the map at the desired location. +2. Enter a name and optional description. +3. Choose an icon/emoji for the waypoint. +4. Tap **Send** to share with the mesh. + +### Waypoint Properties + +| Property | Descriere | +| ---------- | ------------------------------------------------------- | +| Nume | Short identifier (max 30 characters) | +| Descriere | Optional longer description | +| Icon | Visual marker emoji on the map | +| Blocat | If locked, only the creator can edit or delete | +| Expiration | Optional auto-remove time | + +### Waypoint Expiration + +Waypoints can be set to expire automatically: + +- **Never** (default) — waypoint remains until manually deleted +- **Timed** — waypoint is automatically removed after the specified duration (e.g., "remove after 2 hours"). Useful for temporary markers like rally points, hazards, or meeting locations. + +Expired waypoints are automatically hidden from the map so they don't clutter the display. The expiration countdown begins when the waypoint is created, not when other nodes receive it. + +### Managing Waypoints + +- Tap a waypoint on the map to view its details and coordinates +- Edit or delete waypoints you created +- **Locked waypoints** cannot be modified or deleted by other nodes — only the original creator can change them +- Unlocked waypoints can be edited by any mesh member + +## Position Sharing + +### Enabling Position Sharing + +Your node shares its GPS position based on: + +- **Fixed interval** — broadcast position at regular intervals +- **Smart position** — broadcast when movement exceeds a threshold +- **Manual** — only share when explicitly requested + +Configure position behavior in **Settings → Position**. + +### Privacy Considerations + +> 🔒 **Privacy:** Position data is broadcast to all nodes on your channel. If you don't want your location shared, disable GPS position in settings or use a fixed/fake position. + +## Map Sources + +The app supports multiple map tile sources: + +- OpenStreetMap (default) +- Satellite imagery (where available) +- Offline tiles (download map areas for offline use) + +## Related Topics + +- [Nodes](nodes) — view and filter your node list +- [Node Metrics](node-metrics) — signal quality and position history for individual nodes +- [Discovery](discovery) — traceroute and neighbor info for understanding mesh topology +- [Units & Locale](units-and-locale) — distance and coordinate display formats + +--- + diff --git a/docs/ro-rRO/user/messages-and-channels.md b/docs/ro-rRO/user/messages-and-channels.md new file mode 100644 index 000000000..02fa5f062 --- /dev/null +++ b/docs/ro-rRO/user/messages-and-channels.md @@ -0,0 +1,159 @@ +--- +title: Messages & Channels +nav_order: 3 +last_updated: 2026-05-13 +description: Send and receive messages, manage channels, configure encryption, and use quick chat, reactions, and message actions. +aliases: + - channels + - direct-messages + - messaging + - conversations +--- + +# Messages & Channels + +Meshtastic supports two communication modes: **channel broadcasts** and **direct messages**. + +## Canale + +Channels are shared communication groups. All nodes configured with the same channel key can read and send messages on that channel. + +### Default Channel + +Every Meshtastic device comes with a default **LongFast** channel. This is an unencrypted channel used for general mesh communication. + +### Securitate canal + +Channels support multiple encryption levels: + +| Icon | Security Level | Descriere | +| ---- | ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------- | +| 🔒 | PSK (256-bit AES) | Fully encrypted with a strong pre-shared key. Only nodes with the matching key can read messages. | +| 🔐 | PSK (128-bit AES) | Encrypted with a shorter key. Secure for most uses but 256-bit is preferred for sensitive data. | +| 🔓 | Default / Open | Uses the well-known default key. **Any Meshtastic device** on the same preset can read these messages. | +| ⚠️ | Insecure + Position | Open channel that also broadcasts your GPS position. Use with caution in public meshes. | + +> 🔒 **Security Tip:** 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. + +### Adding a Channel + +1. Navigate to **Settings → Channels**. +2. Tap **Add Channel** or scan a QR code. +3. Configure the channel name and encryption key. +4. Share the channel URL/QR code with others who need access. + +Tapping a channel shows its details and sharing options. + +## Direct Messages + +Direct messages (DMs) are point-to-point encrypted communications between two specific nodes. + +### Sending a Direct Message + +1. Open the **Messages** tab. +2. Select a node from your contacts list or tap a node in the node list. +3. Type your message and tap **Send**. + +### Message States + +| State | Icon | Meaning | +| --------------------------------- | ---- | ----------------------------------------------------------------------------------------------------------------- | +| Queued | ⏳ | Message waiting to be sent | +| En route | ✓ | Delivered to the radio, awaiting acknowledgment | +| Delivered | ✓✓ | Acknowledgment received from recipient | +| Received | ✓ | Message received from the mesh (incoming) | +| S&F Routing | 🔗 | Store & Forward: message being routed through an S&F node | +| S&F Confirmed | 🔗 | Store & Forward: delivery confirmed via S&F node | +| Eroare | ✗ | Delivery failed after retries | + +### Delivery Errors + +When a message fails to deliver, the error indicator shows what went wrong: + +| Eroare | Meaning | What to Do | +| ------------------- | ---------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| No Route | No path exists to the destination node | The recipient may be offline or out of mesh range. Try later or move closer. | +| Got NAK | The next-hop node refused to relay | The relay node may be congested. Wait and retry. | +| Expirat | No acknowledgment within retry window | The recipient may be just out of range. Try increasing hop limit or moving to a better position. | +| Fără interfață | No radio interface available to send | Check that your radio is connected and the channel is configured. | +| Max Retransmit | All retry attempts exhausted | The mesh path is unreliable. Try a different channel or wait for conditions to improve. | +| Niciun canal | The destination channel doesn't exist | Verify both nodes share the same channel configuration. | +| Too Large | Message exceeds maximum payload size | Shorten your message (max ~230 characters). | +| Niciun raspuns | Node received message but didn't respond | The recipient's radio may be busy or in low-power sleep mode. | +| Duty Cycle Limit | Regional airtime limit reached | Your radio has used its allowed transmit time. Wait for the duty cycle window to reset (typically 1 hour in EU regions). | +| Solicitare invalidă | Malformed or invalid message | This usually indicates a software bug. Try restarting the app. | + +> 💡 **Tip:** 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. + +## Message Features + +### Quick Chat + +Pre-configured messages for rapid communication: + +- Access via the Quick Chat button in the message input area +- Choose from built-in phrases or custom messages +- Customize quick chat messages in **Settings → Quick Chat** +- Useful when typing is impractical (gloves, small screen, urgent) + +![Quick chat option](/assets/screenshots/messages_quick_chat.png) + +The channel list shows each channel with its latest message preview. + +### Message Bubbles + +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. + +### Reactions + +React to messages with emoji: + +- **Long-press** a message to open the actions menu +- Tap **Add Reaction** to choose an emoji +- Reactions appear below the message bubble +- Multiple users can react to the same message +- React to your own messages or others' messages + +![Emoji reaction badges displayed beneath a message](/assets/screenshots/messages_reaction.png) + +> 💡 **Tip:** Reactions are lightweight — they use minimal mesh bandwidth compared to full text messages. + +### Message Actions + +Long-press any message to access: + +- **Copy** — copy message text to clipboard +- **Reply** — quote the message in your response +- **React** — add an emoji reaction +- **Delete** — remove a message you sent (local deletion) + +### Message Priority + +Messages are queued and transmitted based on priority: + +1. Emergency/alert messages (highest) +2. Direct messages +3. Channel broadcasts (lowest) + +### Message Limits + +- **Maximum length:** 237 bytes (approximately 230 characters for ASCII text) +- **Rate limiting:** The mesh enforces airtime fairness; heavy message volume may be throttled +- **Delivery:** Messages are retried automatically if no acknowledgment is received + +## Best Practices + +- Use channels for group coordination +- Use direct messages for private person-to-person communication +- Keep messages short — mesh bandwidth is limited +- Configure encryption for sensitive communications + +## Related Topics + +- [Nodes](nodes) — tap a node to start a direct message +- [Settings — Radio & User](settings-radio-user) — configure channel encryption and presets +- [MQTT](mqtt) — bridge channel messages to the internet +- [Channel configuration](https://meshtastic.org/docs/configuration/radio/channels) — detailed channel settings on meshtastic.org + +--- + diff --git a/docs/ro-rRO/user/mqtt.md b/docs/ro-rRO/user/mqtt.md new file mode 100644 index 000000000..79cad72dc --- /dev/null +++ b/docs/ro-rRO/user/mqtt.md @@ -0,0 +1,137 @@ +--- +title: MQTT +nav_order: 11 +last_updated: 2026-05-13 +description: Bridge your mesh to the internet — MQTT broker setup, encryption layers, and map reporting. +aliases: + - mqtt + - internet-bridge + - broker +--- + +# MQTT + +MQTT bridges your Meshtastic mesh network to the internet, enabling long-range communication beyond radio range. + +## Overview + +The MQTT module connects your node to an MQTT broker, allowing: + +- Messages to reach nodes on different physical meshes via the internet +- Integration with home automation and monitoring systems +- Publishing node positions to the public Meshtastic map +- Custom data pipelines for logging and alerting + +## How It Works + +``` +[Your Node] → Radio → [Gateway Node with WiFi] → MQTT Broker → [Remote Gateway] → Radio → [Remote Node] +``` + +A gateway node with internet access (WiFi or Ethernet) publishes mesh messages to an MQTT topic. Remote gateways subscribed to the same topic inject those messages into their local mesh. + +## Configuration + +### Enabling MQTT + +1. Navigate to **Settings → Module Config → MQTT**. +2. Enable the MQTT module. +3. Configure the broker connection: + +![MQTT toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | Descriere | Prestabilit | +| ------------------ | --------------------------------------------------------------------------------------------- | --------------------------------------------------- | +| Server Address | MQTT broker hostname | mqtt.meshtastic.org | +| Nume de utilizator | Broker authentication | meshdev | +| Parolă | Broker authentication | large4cats | +| Root Topic | Base topic for messages | msh | +| Encryption | Encrypt MQTT payload | Activat | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON packet support has been removed from firmware; this field is ignored | Disabled | +| TLS | Secure connection to broker | Disabled | +| Map Reporting | Report position to public map | Disabled | + +### Default Meshtastic Broker + +The community maintains a public broker at `mqtt.meshtastic.org`. This is intended for general use and testing. + +> 🔒 **Privacy:** Messages on the public broker are readable by anyone subscribed. Always use channel encryption for private communications. + +### Private Broker + +For better privacy and control, you can run your own MQTT broker: + +- Mosquitto (lightweight, open-source) +- HiveMQ +- EMQX + +Configure your node to point to your private broker with appropriate credentials. + +## Map Reporting + +When Map Reporting is enabled, your node publishes its position to the Meshtastic community map: + +- Visible at [meshmap.net](https://meshmap.net) and similar community map services +- Only position and node info are shared +- Disable this if you don't want your location publicly visible + +## Uplink vs Downlink + +| Direction | Descriere | +| ------------ | -------------------------------- | +| **Uplink** | Messages from mesh → MQTT broker | +| **Downlink** | Messages from MQTT broker → mesh | + +Configure per-channel which directions are active to control message flow and airtime usage. + +## Message Formats + +MQTT uses protobuf message format: + +| Format | Descriere | Use case | +| ------------ | ----------------------------------- | -------------------------- | +| **Protobuf** | Binary Meshtastic protobuf encoding | Node-to-node mesh bridging | + +> ⚠️ **Note:** JSON output support was removed from firmware. The `json_enabled` setting is still visible in the app for legacy compatibility but has no effect on current firmware versions. + +## Encryption & Privacy + +Understanding the layered encryption model: + +1. **Channel encryption** happens on the mesh _before_ MQTT. If your channel has a PSK, the MQTT payload is already encrypted — the broker and any subscribers see only the ciphertext. +2. **MQTT encryption** (the module setting) adds an additional encryption layer for transit to the broker. This protects metadata and routing information. +3. **TLS** encrypts the TCP connection to the broker itself, preventing network-level eavesdropping. + +> 🔒 **Important:** The default public channel has a well-known key. Messages on the default channel sent via MQTT are effectively **unencrypted** — anyone can decode them. Always use a custom PSK for private communications. + +## Best Practices + +- Use channel-level encryption (PSK) on channels that bridge to MQTT +- Don't enable MQTT on nodes without internet access (it will buffer and waste memory) +- Use a private broker for sensitive deployments +- Be mindful of airtime when downlinking messages from busy MQTT topics — every downlinked message consumes radio airtime on your local mesh +- Consider enabling uplink-only if you only need to monitor your mesh remotely without injecting messages back + +## Troubleshooting + +### MQTT Not Connecting + +- **Check WiFi** — the gateway node must have an active internet connection (WiFi or Ethernet). MQTT does not work over the LoRa radio link itself. +- **Verify credentials** — incorrect username or password will silently fail on most brokers. Double-check for trailing spaces. +- **Firewall** — port 1883 (MQTT) or 8883 (MQTT+TLS) must be open. Some networks block non-standard ports. +- **DNS resolution** — if using a custom broker hostname, verify the node can resolve it. Try the broker's IP address directly. + +### Messages Not Bridging + +- **Check uplink/downlink settings** — if only uplink is enabled, messages flow from mesh to MQTT but not back. Enable downlink on the receiving gateway. +- **Channel mismatch** — both gateways must share the same channel with the same PSK. A mismatch means messages are encrypted with different keys and appear as garbage. +- **Topic mismatch** — ensure both gateways use the same root topic. The default `msh` works for the public broker. + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — MQTT module configuration reference +- [Messages & Channels](messages-and-channels) — channel encryption and PSK setup +- [MQTT integration guide](https://meshtastic.org/docs/software/integrations/mqtt) — detailed MQTT documentation on meshtastic.org + +--- + diff --git a/docs/ro-rRO/user/node-metrics.md b/docs/ro-rRO/user/node-metrics.md new file mode 100644 index 000000000..7faba541e --- /dev/null +++ b/docs/ro-rRO/user/node-metrics.md @@ -0,0 +1,130 @@ +--- +title: Node Metrics +nav_order: 5 +last_updated: 2026-05-13 +description: Telemetry dashboards for each mesh node — device health, environment sensors, signal quality, power, traceroute, and position history. +aliases: + - metrics + - telemetry + - device-metrics + - signal +--- + +# Node Metrics + +The node detail screen provides comprehensive telemetry and metrics for each node on your mesh. + +## Valori dispozitiv + +Basic operating information reported by each node: + +| Metric | Descriere | +| ------------------- | ----------------------------------- | +| Battery Level | Current battery percentage | +| Tensiune | Battery voltage reading | +| Channel Utilization | Percentage of airtime consumed | +| Airtime | Transmission time used by this node | +| Timp de functionare | Time since last reboot | + +Device metrics are displayed as individual cards with trend sparklines showing battery level, voltage, channel utilization, airtime, and uptime over time. + +> 💡 **Tip:** Tap any metric card to expand it into a full chart with historical data points. Pinch to zoom the time axis. + +## Indicatori de mediu + +Environmental sensor data (requires compatible hardware): + +| Metric | Sensor Examples | +| ------------------------------------ | --------------------- | +| Temperature | BME280, BME680, SHT31 | +| Humidity | BME280, BME680, SHT31 | +| Barometric Pressure | BME280, BMP280 | +| Rezistența la gaz | BME680 | +| IAQ (Air Quality) | BME680 | + +Environment metrics are charted over time for easy trend analysis — temperature, humidity, and pressure each get their own line chart with the measurement unit displayed on the Y axis. + +> 💡 **Tip:** Environment metrics require a sensor connected to the remote node. Not all nodes report environmental data. See [Telemetry & Sensors](telemetry-and-sensors) for a full list of supported sensors. + +## Signal Metrics + +Radio signal quality information: + +| Metric | Descriere | +| --------- | ----------------------------------------------------------------------------- | +| SNR | Signal-to-Noise Ratio (higher is better) | +| RSSI | Received Signal Strength Indicator (closer to 0 is better) | +| Hop Count | Number of mesh hops for last message | + +### Signal Quality Reference + +| SNR Range | Quality | +| --------------------------------- | ---------- | +| > 10 dB | Excellent | +| 0 to 10 dB | Bun | +| -10 to 0 dB | Acceptabil | +| < -10 dB | Poor | + +## Valori putere + +Power management telemetry (requires INA sensor or compatible hardware): + +| Metric | Descriere | +| ----------- | ----------------------- | +| Bus Voltage | Supply voltage | +| Actual | Power draw in milliamps | +| Alimentare | Calculated wattage | + +## Trasare traseu + +Traceroute shows the path a message takes through the mesh: + +1. From the node detail screen, tap **Traceroute**. +2. The app sends a traceroute request to the target node. +3. Results show each hop with SNR/RSSI values. + +### Reading Traceroute Results + +``` +You → Node A (SNR: 8.5) → Node B (SNR: 5.2) → Target +``` + +Each hop represents a relay node that forwarded the message. + +## Position Log + +Historical position data for nodes that share their location: + +- GPS coordinates +- Altitudine +- Speed (if moving) +- Timestamp for each position report + +## Informații vecin + +Shows which nodes a given node can directly hear, useful for understanding mesh topology. + +## Viewing Metrics + +1. Navigate to **Nodes**. +2. Tap the node you want to inspect. +3. Select the metric category from the detail tabs. + +![Node detail — local device](/assets/screenshots/nodes_detail_local.png) + +The position tab shows location data for nodes that share GPS: + +![Position inline content](/assets/screenshots/nodes_position.png) + +> ⚠️ **Note:** Metrics are only available when they have been reported by the remote node. Metrics update at intervals configured on each node's telemetry settings. + +## Related Topics + +- [Nodes](nodes) — node list, filtering, and sorting +- [Telemetry & Sensors](telemetry-and-sensors) — supported sensors and configuration +- [Signal Meter](signal-meter) — how signal quality is calculated from SNR and RSSI +- [Discovery](discovery) — traceroute details and neighbor info +- [Units & Locale](units-and-locale) — temperature, distance, and speed display formats + +--- + diff --git a/docs/ro-rRO/user/nodes.md b/docs/ro-rRO/user/nodes.md new file mode 100644 index 000000000..73a68b185 --- /dev/null +++ b/docs/ro-rRO/user/nodes.md @@ -0,0 +1,152 @@ +--- +title: Noduri +nav_order: 4 +last_updated: 2026-05-13 +description: Browse, filter, and sort mesh nodes — view details, signal quality, roles, and quick actions. +aliases: + - node-list + - mesh-nodes + - peers +--- + +# Noduri + +The Nodes screen displays all devices visible on your mesh network. + +## Node List + +The node list shows every node your radio has heard, including: + +- **Node name** — user-configured long name +- **Short name** — 4-character identifier +- **Signal quality** — last heard signal strength +- **Last heard** — time since last communication +- **Distance** — estimated distance (if positions are shared) +- **Battery** — remote node battery level (if telemetry is enabled) + +### Node Status Indicators + +| Badge | Meaning | +| ---------- | ------------------------------------- | +| 🟢 Online | Node heard within the last 15 minutes | +| 🟡 Away | Node heard within the last 2 hours | +| 🔴 Offline | Node not heard for over 2 hours | +| ⭐ Favorite | Node marked as favorite by the user | + +### Node Roles + +Nodes can be configured with different roles that affect their mesh behavior: + +| Role | Descriere | +| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Client | Standard end-user device | +| Client bază | Treats favorited-node traffic as Router Late priority; all other traffic as Client | +| Client mut | Receives but doesn't retransmit | +| Client ascuns | Like Client Mute, plus hides from node list | +| Ruter | Prioritizes message forwarding; stays awake to relay | +| Ruter cu întârziere | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | +| ~~Router Client~~ | ⚠️ **Deprecated** (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | +| ~~Repeater~~ | ⚠️ **Deprecated** (removed in firmware 2.7.11) — no longer selectable; use Router instead | +| Tracker | Optimized for position reporting at regular intervals | +| Senzor | Optimized for telemetry reporting | +| TAK | Interoperates with TAK systems (sends/receives CoT) | +| Tracker TAK | TAK position reporting only | +| Lost & Found | Continuous position beacon for recovery | + +### Choosing a Role + +Most users should keep the default **Client** role. Consider a different role when: + +- **Router** — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don't use Router on battery-powered handheld devices. +- **Router Late** — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. +- **Client Base** — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. +- **Client Mute** — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only devices or to reduce congestion in dense areas. +- **Tracker** — An unattended device whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. +- **Sensor** — An unattended device reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. +- **TAK / TAK Tracker** — Only needed if interoperating with ATAK/WinTAK systems. See [TAK Integration](tak) for details. + +> 💡 **Tip:** The mesh works best when most nodes are **Client** or **Router**. Too many Mute nodes reduces mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. + +### Encryption Indicators + +Nodes display encryption status icons next to their name: + +| Icon | Meaning | +| ----------- | ------------------------------------------------------------------------------------------------------------------- | +| 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | +| 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | +| ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) | + +> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. + +## Quick Actions + +From the node list, you can: + +- **Tap** a node to view its detail page +- **Long-press** for quick actions: + - Send a direct message + - Vizualizați pe hartă + - Solicită poziția + - Mark as favorite + - Trasare traseu + +## Filtering & Sorting + +### Text Search + +Type in the search field to filter nodes by name or short name. The filter updates in real time as you type. + +### Filter Toggles + +| Filtru | Descriere | +| -------------------------- | ---------------------------------------------------------------------------------------------- | +| **Only online** | Show only nodes heard within the last 15 minutes | +| **Only direct** | Show only nodes with direct (non-relayed) connections | +| **Include unknown** | Show nodes that haven't sent user info yet | +| **Exclude infrastructure** | Hide infrastructure-role nodes (Router, Repeater, Router Late, Client Base) | +| **Exclude MQTT** | Hide nodes heard only via MQTT internet bridge | +| **Show ignored** | Show nodes you've previously dismissed or muted | + +### Sort Options + +| Sort | Descriere | +| ------------------------------------------- | ------------------------------------------------------------------ | +| **Last heard** (default) | Most recently heard nodes first | +| **Alphabetical** | Sorted by node long name | +| **Distance** | Nearest nodes first (requires position sharing) | +| **Hops away** | Fewest relay hops first | +| **Channel** | Grouped by channel index | +| **Via MQTT** | Grouped by MQTT vs. radio-heard | +| **Favorites** | Favorited nodes first | + +## Node Detail + +Tapping a node opens the detail view with comprehensive information. See [Node Metrics](node-metrics) for full details on metrics and telemetry. + +![Node detail view](/assets/screenshots/nodes_node_list.png) + +The detail screen includes device info, position, and action buttons: + +![Node detail section](/assets/screenshots/nodes_detail_section.png) + +Inline status indicators show key metrics at a glance: + +| Indicator | Screenshot | +| --------------- | -------------------------------------------------------- | +| Signal quality | ![Signal](/assets/screenshots/nodes_signal_info.png) | +| Battery level | ![Battery](/assets/screenshots/nodes_battery_info.png) | +| Hop count | ![Hops](/assets/screenshots/nodes_hops_info.png) | +| Ultima recepție | ![Last heard](/assets/screenshots/nodes_last_heard.png) | +| Distanță | ![Distance](/assets/screenshots/nodes_distance_info.png) | + +## Related Topics + +- [Node Metrics](node-metrics) — detailed telemetry dashboards for each node +- [Messages & Channels](messages-and-channels) — send a direct message to a node +- [Map & Waypoints](map-and-waypoints) — view node positions geographically +- [Discovery](discovery) — traceroute and neighbor info for topology exploration +- [Signal Meter](signal-meter) — understand what the signal bars mean + +--- + diff --git a/docs/ro-rRO/user/onboarding.md b/docs/ro-rRO/user/onboarding.md new file mode 100644 index 000000000..3b910534e --- /dev/null +++ b/docs/ro-rRO/user/onboarding.md @@ -0,0 +1,99 @@ +--- +title: Getting Started +nav_order: 1 +last_updated: 2026-05-13 +description: First-launch setup — permissions, onboarding flow, and next steps after connecting your radio. +aliases: + - first-launch + - setup + - intro +--- + +# Getting Started + +Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app. + +## First Launch + +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. + +### Welcome Screen + +The welcome screen introduces Meshtastic and its core capabilities: + +- Off-grid mesh communication +- No cellular or internet required +- End-to-end encrypted messaging + +Tap **Get Started** to proceed through the setup flow. + +![Welcome screen](/assets/screenshots/onboarding_welcome.png) + +## Permissions + +The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. + +### Bluetooth Permission + +Bluetooth is the primary connection method between your phone and Meshtastic radio: + +- **Bluetooth scanning** — discover nearby Meshtastic radios +- **Bluetooth connect** — establish and maintain connections with paired radios + +Grant both permissions when prompted. Without Bluetooth, you'll need to use USB or TCP connections instead. + +### Location Permission + +> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. + +Meshtastic also uses your location for: + +- Showing your position on the mesh map +- Calculating distances to other nodes +- Sharing your GPS coordinates with other mesh members (if enabled) + +Grant **"While using the app"** or **"Always"** depending on your preference: + +- **While using the app** — position updates only when the app is open +- **Always** — enables background position updates for always-on mesh presence + +If denied, Bluetooth scanning will not function and your node will not report a position. + +### Notifications Permission + +Notifications alert you to: + +- Incoming messages from channels and direct messages +- Connection status changes (connected, disconnected, reconnecting) +- Firmware update availability + +> 💡 **Tip:** You can fine-tune notification preferences later in Android system settings. The app creates separate notification channels for messages, connection events, and background service status. + +### Critical Alerts Permission + +On supported devices, the app may request permission for critical alerts: + +- These are high-priority notifications that can break through Do Not Disturb mode +- Useful for emergency mesh alerts or urgent messages +- You can **skip** this step if you don't need breakthrough notifications +- Configure or revoke later in Android notification settings + +## After Setup + +Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. + +> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. + +## What's Next? + +Once connected to a radio, explore: + +- [Connections](connections) — pair your first radio device +- [Messages & Channels](messages-and-channels) — send your first message +- [Nodes](nodes) — see who's on your mesh +- [Map & Waypoints](map-and-waypoints) — view node positions +- [Settings](settings-radio-user) — configure your radio and user profile + +New to Meshtastic? The [getting started guide](https://meshtastic.org/docs/getting-started) on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup. + +--- diff --git a/docs/ro-rRO/user/settings-module-admin.md b/docs/ro-rRO/user/settings-module-admin.md new file mode 100644 index 000000000..56eb532c9 --- /dev/null +++ b/docs/ro-rRO/user/settings-module-admin.md @@ -0,0 +1,246 @@ +--- +title: Settings — Modules & Admin +nav_order: 8 +last_updated: 2026-05-13 +description: Configure optional feature modules (MQTT, telemetry, canned messages, TAK, and more) and perform device administration. +aliases: + - modules + - module-config + - administration +--- + +# Settings — Modules & Admin + +Configure optional feature modules and perform device administration. Modules extend Meshtastic with specialized capabilities — each can be independently enabled or disabled. + +> 💡 **Tip:** You only need to enable the modules you actually use. Disabling unused modules reduces airtime, saves battery, and simplifies your configuration. + +Module settings use a card-based layout with toggle switches, dropdowns, text fields, and sliders: + +![Toggle switch](/assets/screenshots/settings_switch.png) + +![Dropdown selector](/assets/screenshots/settings_dropdown.png) + +![Text field](/assets/screenshots/settings_text_field.png) + +![Settings card layout](/assets/screenshots/settings_titled_card.png) + +## Module Configuration + +### MQTT Module + +Bridges mesh messages to and from an MQTT broker for internet connectivity. This is how you extend your mesh beyond radio range or integrate with home automation systems. + +| Setting | Descriere | +| ------------------ | ------------------------------------------------------------------------ | +| Activat | Toggle MQTT bridge | +| Server | MQTT broker address | +| Nume de utilizator | Authentication username | +| Parolă | Authentication password | +| Encryption | Encrypt MQTT payloads | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON support removed from firmware; field is ignored | +| TLS | Use secure connection | +| Root Topic | Base MQTT topic path | +| Map Report | Publish position for public map | + +See [MQTT](mqtt) for a detailed usage guide including encryption, privacy, and broker setup. + +### Serial Module + +Enables serial port communication for external device integrations (GPS modules, sensors, or custom hardware). When enabled, the node's serial port can send and receive protobuf or text data, allowing external microcontrollers or computers to interact with the mesh. + +| Setting | Descriere | +| ---------- | ------------------------------- | +| Activat | Activate serial communication | +| Echo | Echo received serial data back | +| Mode | Text, Protobuf, or NMEA output | +| RX/TX Pins | GPIO pins for serial connection | +| Baud Rate | Serial communication speed | + +### External Notification Module + +Controls buzzer, LED, or vibration alerts on your radio hardware. Useful for devices that need to physically signal when a message arrives — particularly helpful for unattended or outdoor installations. + +| Setting | Descriere | +| -------------------------------- | --------------------------- | +| Activat | Activate notifications | +| Alert Message | Notify on incoming messages | +| Alert Message Buzzer | Use buzzer for messages | +| Alert Message Vibra | Use vibration for messages | +| Alert Bell | Notify on bell character | +| Output (GPIO) | Pin for notification output | +| Active | High or Low active | +| Duration (ms) | Notification length | +| Use I2S as Buzzer | Use I2S audio output | + +### Store & Forward Module + +Buffers messages for nodes that were temporarily offline, then replays them when those nodes reconnect. Essential for meshes where nodes go in and out of range regularly — ensures messages aren't lost during brief disconnections. + +| Setting | Descriere | +| ------------------------------------------ | -------------------------- | +| Activat | Activate store and forward | +| Heartbeat (s) | Announcement interval | +| Records | Maximum stored messages | +| History Return (max) | Max messages to replay | +| History Return (window) | Time window for replay | + +> 💡 **Tip:** Store and Forward works best on nodes with ample memory (ESP32 with PSRAM). Router nodes are ideal candidates since they're typically always-on. + +### Range Test Module + +Automated range testing tool for evaluating link quality between nodes. When enabled, the node periodically transmits test messages with incrementing counters. A receiver node logs these messages, allowing you to walk or drive away and later analyze at what distance messages stopped arriving. + +| Setting | Descriere | +| -------------------------------------- | --------------------------------- | +| Activat | Activate range testing | +| Sender Interval (s) | Time between test transmissions | +| Save CSV | Log received test data to SD card | + +### Telemetry Module + +Controls what telemetry data your node shares with the mesh. Telemetry includes device health (battery, uptime) and environmental sensor data (temperature, humidity, pressure). + +| Setting | Descriere | +| ---------------------------- | --------------------------------------- | +| Device Metrics Interval | How often to report device metrics | +| Environment Metrics Interval | How often to report environment sensors | +| Air Quality Enabled | Report particulate sensor data | +| Power Metrics Enabled | Report power usage | + +See [Telemetry & Sensors](telemetry-and-sensors) for supported sensors and configuration recommendations. + +### Canned Message Module + +Pre-configured messages accessible from the device's physical buttons (for radios with rotary encoders, keypads, or similar input hardware). Define a list of quick-send messages that can be transmitted without a phone connected — ideal for field use. + +| Setting | Descriere | +| ------------------ | ----------------------------------------------------------- | +| ~~Enabled~~ | ⚠️ **Deprecated** — current firmware may ignore this toggle | +| Mesaje | Newline-separated list of messages | +| Send Bell | Play bell sound on send | +| Rotary Encoder | Enable rotary encoder input | +| Up/Down/Press Pins | GPIO pin assignments for input | + +### Audio Module + +Codec2 audio support for low-bandwidth voice communication over the mesh. This is an **experimental** feature that encodes voice into very small data packets using the Codec2 codec. + +| Setting | Descriere | +| --------------- | -------------------------------- | +| Activat | Activate audio module | +| Codec2 Rate | Audio quality/bandwidth tradeoff | +| I2S Word Select | GPIO pin for I2S WS | +| I2S Data In | GPIO pin for I2S DIN | +| I2S Data Out | GPIO pin for I2S DOUT | + +> ⚠️ **Note:** Audio requires specific hardware (I2S microphone and speaker). Voice quality is very low-bandwidth — think "understandable radio voice," not phone-call quality. + +### Remote Hardware Module + +GPIO control over the mesh network. Allows a remote node to read or write GPIO pins on another node — useful for activating relays, reading switches, or controlling external hardware from a distance. + +| Setting | Descriere | +| -------------------- | --------------------------------------------------------------- | +| Activat | Activate remote GPIO access | +| Allow Undefined Pins | Allow access to any GPIO pin (security risk) | + +> ⚠️ **Warning:** Enabling "Allow Undefined Pins" gives remote nodes access to all GPIO pins, which could interfere with the radio's own hardware. Only enable on dedicated GPIO nodes. + +### Neighbor Info Module + +Broadcasts information about directly heard neighbors, enabling mesh topology mapping. Each enabled node periodically shares a list of the other nodes it can hear and their signal quality. + +| Setting | Descriere | +| -------------------------------------- | ------------------------------------ | +| Activat | Activate neighbor broadcasting | +| Update Interval (s) | How often to broadcast neighbor list | + +See [Discovery](discovery) for how to use neighbor data for mesh topology exploration. + +### Ambient Lighting Module + +Controls onboard NeoPixel or other addressable RGB LEDs on supported hardware. Can be used for visual status indicators, notification lights, or decorative effects. + +| Setting | Descriere | +| ------------------ | ---------------------------------------------------------- | +| Activat | Activate LED control | +| LED State | On, Off, or set specific color | +| Red / Green / Blue | Individual color channel values (0–255) | + +### Detection Sensor Module + +Turns your node into a motion or door sensor alert system. When a GPIO pin detects a state change (motion detected, door opened), the node broadcasts an alert message over the mesh. + +| Setting | Descriere | +| ---------------------------------------- | ----------------------------------------------------------------------- | +| Activat | Activate detection sensor | +| Monitor Pin | GPIO pin connected to sensor | +| Detection Triggered High | Trigger when pin goes high (vs. low) | +| Minimum Broadcast (s) | Minimum time between alert broadcasts | +| State Broadcast (s) | Periodic state broadcast interval | +| Send Bell | Include bell character in alerts | +| Friendly Name | Custom name for this sensor | + +### Paxcounter Module + +People counter using WiFi and BLE probe requests. Counts nearby devices by passively listening for probe requests that phones and laptops emit when scanning for networks. Available only on ESP32 devices. + +| Setting | Descriere | +| -------------------------------------- | -------------------------- | +| Activat | Activate people counting | +| Update Interval (s) | How often to report counts | + +> 💡 **Tip:** Paxcounter is useful for estimating foot traffic at trailheads, event venues, or other locations. Counts are approximate — one person may carry multiple devices. + +### TAK Module + +Team Awareness Kit integration for interoperability with ATAK and WinTAK. See [TAK Integration](tak) for detailed setup and usage. + +## Administrare + +### Administrare la distanță + +Remotely configure nodes that share your admin key: + +1. Select the target node in the node list. +2. Navigate to **Settings** for that node. +3. Modify configuration. +4. Tap **Save** — changes are sent over the mesh. + +> ⚠️ **Requires:** Admin key configured on both your node and the target node. + +### Curăță baza de date a nodurilor + +Removes stale nodes from your local database that haven't been heard in a configurable time window. + +### Factory Reset + +Resets all settings to factory defaults. **This cannot be undone.** + +### Restartează + +Remotely reboot a connected or administered node. + +### Panou de depanare + +View detailed diagnostic information: + +- Protocol buffers debug output +- Mesh packet log +- Connection state details + +### Troubleshooting Remote Admin + +- **"No response from target node"** — the target may be out of range, offline, or have a mismatched admin key. Verify the admin key matches on both nodes. +- **Changes not applying** — some settings require a reboot to take effect. Try the Reboot action after saving. +- **Can't see remote settings** — ensure your node has the admin key for the target node and that Admin Channel is enabled in Security Config. + +## Related Topics + +- [Settings — Radio & User](settings-radio-user) — core radio and user profile settings +- [Module configuration reference](https://meshtastic.org/docs/configuration/module) — detailed module docs on meshtastic.org +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/ro-rRO/user/settings-radio-user.md b/docs/ro-rRO/user/settings-radio-user.md new file mode 100644 index 000000000..defa3e6e4 --- /dev/null +++ b/docs/ro-rRO/user/settings-radio-user.md @@ -0,0 +1,173 @@ +--- +title: Settings — Radio & User +nav_order: 7 +last_updated: 2026-05-13 +description: Configure your radio hardware, LoRa presets, user profile, position sharing, power management, and security. +aliases: + - setari + - radio-config + - user-config + - lora +--- + +# Settings — Radio & User + +Configure your radio hardware and user identity parameters. + +## User Settings + +### User Profile + +| Setting | Descriere | +| ----------------- | ------------------------------------------------------------------------------------- | +| Nume lung | Your display name (up to 39 characters) | +| Nume scurt | 4-character abbreviated name | +| Licensed Operator | Enable if you hold an amateur radio license (enables higher power) | + +### Applying Changes + +After modifying settings, tap **Save** to write the configuration to your radio. The device may reboot to apply changes. + +## Radio Configuration + +### Device Config + +| Setting | Descriere | Prestabilit | +| ------------------------------------------ | ----------------------------------------------------------------------- | ----------- | +| Role | Node behavior (Client, Router, etc.) | Client | +| Mod de redifuzare | How the node retransmits messages | Toate | +| Node Info Broadcast (s) | Interval for broadcasting node info | 10800 | +| Double-tap Button | Action for double-tap button press | Disabled | + +### LoRa Config + +| Setting | Descriere | Prestabilit | +| ----------------- | ----------------------------------------------------------------------- | ----------------------------------------- | +| Regiune | Regulatory region for frequency bands | Unset (must configure) | +| Modem Preset | Speed/range tradeoff | LongFast | +| Hop Limit | Maximum retransmit hops | 3 | +| TX Power | Transmission power (dBm); 0 = max allowed for region | 0 (region max) | +| Frequency Offset | Fine-tune frequency (MHz) | 0 | +| Channel Bandwidth | Bandwidth setting | Default for preset | + +> ⚠️ **Important:** You **must** set your region before transmitting. Operating without the correct region may violate local radio regulations. See the [region configuration guide](https://meshtastic.org/docs/getting-started/initial-config) on meshtastic.org for details. + +### Modem Presets + +| Preset | Range | Viteza | SNR Limit | Best For | +| ------------------ | ----------------------- | ------------------------- | ------------------------ | -------------------------------------------------------------------------------------------------------- | +| Short Turbo | ~1 km | 21.9 kbps | −5 dB | Dense urban with line-of-sight; data-heavy applications | +| Short Fast | ~3 km | 10.9 kbps | −7.5 dB | Urban neighborhoods; buildings within a few blocks | +| Short Slow | ~5 km | 5.5 kbps | −10 dB | Suburban short-range; moderate building density | +| Medium Fast | ~5 km | 5.5 kbps | −10 dB | Suburban areas; moderate building density | +| Medium Slow | ~8 km | 1.1 kbps | −12.5 dB | Suburban/rural; moderate range with slower speed | +| Long Turbo | ~10 km | 4.4 kbps | −10 dB | Similar range to Long Fast but with 500 kHz bandwidth; faster throughput | +| Long Fast | ~10 km | 1.1 kbps | −12.5 dB | **General use (default)** — balanced range and speed | +| Long Moderate | ~20 km | 0.34 kbps | −15 dB | Rural with some terrain; occasional use | +| Lite Fast | ~5 km | 5.5 kbps | −10 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Medium Fast | +| Lite Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Long Fast | +| Narrow Fast | ~5 km | 2.7 kbps | −10 dB | EU 868 MHz band (62.5 kHz BW); avoids interference with other devices | +| Narrow Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 868 MHz band (62.5 kHz BW); comparable to Long Fast | +| ~~Long Slow~~ | ~30 km | 0.18 kbps | −17.5 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | +| ~~Very Long Slow~~ | ~40+ km | 0.09 kbps | −20 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | + +#### Choosing a Modem Preset + +The modem preset controls the fundamental tradeoff between **range** and **data rate**: + +- **Slower presets** use more spreading, making signals decodable at weaker signal levels (lower SNR limit). This means longer range but fewer bytes per second. +- **Faster presets** pack more data per transmission but require a stronger signal to decode. + +**Practical guidance:** + +- **Urban mesh (many nodes, short distances):** Use **Long Fast** (default) or **Short Fast**. Higher speed means less airtime congestion when many nodes share the channel. +- **Rural/sparse mesh (few nodes, long distances):** Use **Long Moderate**. Range matters more than speed when nodes are far apart. +- **EU 866/868 MHz regulatory compliance:** Use **Lite Fast**, **Lite Slow**, **Narrow Fast**, or **Narrow Slow** — these are optimized for the EU SRD/868 MHz bands with narrower bandwidths. +- **Fixed infrastructure links:** Use **Short Turbo** or **Long Turbo** for dedicated point-to-point links with good antennas and line-of-sight. +- **Mixed environments:** Stick with **Long Fast** — it's the community default and ensures compatibility with others in your area. + +> ⚠️ **Important:** All nodes on the same channel **must** use the same modem preset. Nodes with mismatched presets cannot communicate even if they share the same frequency and encryption key. + +> 💡 **Tip:** The range estimates above assume flat terrain and modest antennas. Elevation advantage (hilltop, rooftop) dramatically increases effective range. A well-placed Router with Long Fast can often outperform a ground-level node with Long Slow. + +### Display Config + +| Setting | Descriere | +| ------------------- | ------------------------------------------------------------------------------------ | +| Screen Timeout | Time before display sleeps | +| Display Units | Metric or Imperial | +| OLED Type | Auto, SSD1306, SH1106, SH1107 | +| Compass Orientation | Rotation offset for compass display (0°, 90°, 180°, 270°) | +| ~~Compass North~~ | ⚠️ **Deprecated** — replaced by Compass Orientation; still visible in older firmware | + +### Position Config + +| Setting | Descriere | +| ----------------------------------------- | ---------------------------------- | +| GPS Enabled | Enable/disable GPS | +| GPS Update Interval | How often to acquire GPS fix | +| Position Broadcast (s) | How often to share position | +| Poziție inteligentă | Enable movement-based broadcasting | +| Poziție fixă | Use a manually set position | + +### Configurare Putere + +| Setting | Descriere | +| --------------------------------------- | --------------------------------------- | +| Power Saving | Enable low-power sleep mode | +| Shutdown After (s) | Auto-shutdown idle timer | +| ADC Multiplier | Battery voltage calibration factor | +| Wait Bluetooth (s) | Time to wait for BLE connection at boot | +| Mesh SDS Timeout (s) | Super-deep-sleep timeout | + +### Network Config + +| Setting | Descriere | +| ------------- | ---------------------------------------------------- | +| WiFi Enabled | Enable WiFi radio (ESP32 devices) | +| WiFi SSID | Network name to connect to | +| WiFi PSK | Network password | +| NTP Server | Time synchronization server | +| Syslog Server | Remote logging server | + +![IP address field](/assets/screenshots/settings_ipv4_field.png) + +### Configurare Bluetooth + +| Setting | Descriere | +| ----------------- | ------------------------------------------------------------------------- | +| Bluetooth Enabled | Enable/disable BLE radio | +| Pairing Mode | Fixed PIN, Random PIN, or No PIN | +| PIN fix | PIN code for pairing (default: 123456) | + +### Security Config + +| Setting | Descriere | +| --------------------- | -------------------------------------------------------------------------- | +| Chei publice | Your node's public key (read-only) | +| Cheie Administrator | Key for remote administration | +| Cheia privată | Your node's private key (handle securely) | +| Admin Channel Enabled | Allow admin commands via channel | +| Debug Log | Output live debug logging over serial/bluetooth | +| Serial Enabled | Enable serial console access (moved from Device Config) | +| Mod Gestionat | Restrict non-admin channel changes | + +![Password field](/assets/screenshots/settings_password_field.png) + +Settings use standard preference controls — dropdowns, toggles, and sliders: + +| Control | Screenshot | +| -------- | ------------------------------------------------------ | +| Dropdown | ![Dropdown](/assets/screenshots/settings_dropdown.png) | +| Toggle | ![Toggle](/assets/screenshots/settings_switch.png) | +| Slider | ![Slider](/assets/screenshots/settings_slider.png) | + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — optional feature modules and device administration +- [Signal Meter](signal-meter) — how modem presets affect signal quality thresholds +- [LoRa configuration](https://meshtastic.org/docs/configuration/radio/lora) — detailed LoRa settings reference on meshtastic.org +- [Initial configuration](https://meshtastic.org/docs/getting-started/initial-config) — region setup guide on meshtastic.org + +--- + diff --git a/docs/ro-rRO/user/signal-meter.md b/docs/ro-rRO/user/signal-meter.md new file mode 100644 index 000000000..d65e86d7f --- /dev/null +++ b/docs/ro-rRO/user/signal-meter.md @@ -0,0 +1,81 @@ +--- +title: How the Meshtastic Signal Meter Works +nav_order: 15 +last_updated: 2026-05-13 +description: How the signal meter calculates quality from RSSI and SNR — LoRa spread spectrum, presets, and what the bars really mean. +aliases: + - signal + - signal-meter + - snr + - rssi +--- + +# How the Meshtastic Signal Meter Works + +The Meshtastic signal meter — the familiar bars or status color in the app — is calculated very differently than the "bars" on a traditional cell phone or Wi-Fi router. + +Most consumer devices simply measure how "loud" a signal is. However, because Meshtastic uses **LoRa (Long Range)** technology, its signal meter measures how **clear** the signal is, relative to the specific settings your mesh is using. + +--- + +## 1. The Two Metrics: "Loudness" vs. "Clarity" + +Every time the LoRa radio chip receives a message, it reports two measurements: + +- **RSSI (Received Signal Strength Indicator):** The **loudness** of the raw power hitting your antenna. +- **SNR (Signal-to-Noise Ratio):** The **clarity** of the signal compared to the background static. + +> **Tip — The Analogy:** Imagine you are trying to hear a friend talking to you. +> +> - **RSSI** is how loud their voice is. +> - **The Noise Floor** is the background noise in the room (air conditioning, other people talking, traffic). +> - **SNR** is how easily you can distinguish your friend's voice from the background noise. + +If your friend shouts at you at a deafening rock concert, the signal is incredibly loud (High RSSI), but you still can't understand them because the background noise is louder (Bad SNR). Conversely, if your friend whispers to you in a dead-silent library, the signal is very weak (Low RSSI), but you can understand them perfectly (Great SNR). + +--- + +## 2. The Magic of LoRa: Hearing "Below the Noise Floor" + +For standard radios (like FM or Wi-Fi), if the background noise is louder than the signal (a negative SNR), the receiver just hears static. + +LoRa is special. It uses **"Spread Spectrum"** modulation, which allows the radio to mathematically pull a signal out of the air even when it is buried deep _underneath_ the background noise. This is why you will frequently see **negative SNR numbers** in Meshtastic (e.g., -10 dB, which means the signal is 10 decibels weaker than the background static). + +Depending on which Meshtastic preset you are using (e.g., `LongFast` vs. `ShortFast`), the radio has a specific **SNR Limit** — the absolute maximum amount of noise it can tolerate before the message is completely lost to the static. + +--- + +## 3. How the Signal Meter Calculates Quality + +The Meshtastic apps take both RSSI and SNR and run them through a specific formula to assign your signal a quality rating (None, Bad, Fair, or Good). It specifically scales these values based on the physical limits of the radio preset you are using. + +Here is exactly how the app decides how many bars (or what color) to show you: + +| Level | Bars | Criteria | Meaning | +| ---------- | ---- | ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | +| Bun | 3 | RSSI better than `-115 dBm` **AND** SNR better than `-7 dB` | Signal is both loud and clear — healthy connection. | +| Acceptabil | 2 | RSSI better than `-126 dBm` with good SNR, **OR** SNR better than `-15 dB` with good RSSI | Signal getting quieter or noisier, but still decodable. | +| Slab | 1 | Falls between Fair and None thresholds | At the edge of range or experiencing interference. | +| Niciunul | 0 | RSSI worse than `-126 dBm` **AND** SNR worse than `-15 dB` | Transmission completely buried in noise. | + +--- + +## 4. What This Means for You + +Because Meshtastic's meter acts as a **"Clarity Meter"**, it behaves differently than what most people expect: + +> **Tip — Don't panic over low RSSI:** You might see a seemingly terrible RSSI value like `-118 dBm`. On a cell phone, you would have zero bars. But if you have an SNR of `+2 dB`, Meshtastic will still show a strong signal! _The library is quiet, so the whisper is heard perfectly._ + +> **Warning — Watch out for local noise:** If you hook up a massive antenna and see a great RSSI (e.g., `-90 dBm`) but your signal meter is only showing **1 Bar (Bad)**, you have a problem. It means you have local interference — perhaps a cheap power supply, a noisy computer, or a nearby radio tower — creating so much static that it is drowning out your mesh. + +## Where Signal Information Appears + +In the app, signal data is shown in several places: + +- **Node list** — signal bars icon next to each node +- **Node detail** — SNR, RSSI, and signal quality in the device metrics section +- **Traceroute** — per-hop signal quality for each relay node +- **Signal metrics** — historical SNR and RSSI data in the metrics charts + +![Node entry showing SNR, RSSI values and colored signal bars](/assets/screenshots/nodes_signal_info.png) + diff --git a/docs/ro-rRO/user/tak.md b/docs/ro-rRO/user/tak.md new file mode 100644 index 000000000..21c9357f8 --- /dev/null +++ b/docs/ro-rRO/user/tak.md @@ -0,0 +1,126 @@ +--- +title: TAK Integration +nav_order: 10 +last_updated: 2026-05-13 +description: Interoperate with ATAK and WinTAK — CoT position sharing, TAK roles, and plugin setup. +aliases: + - tak + - atak + - team-awareness-kit +--- + +# TAK Integration + +Meshtastic integrates with the Team Awareness Kit (TAK) ecosystem, enabling interoperability between Meshtastic mesh devices and TAK applications like ATAK and WinTAK. + +## Overview + +The TAK module allows Meshtastic nodes to: + +- Share position data in TAK-compatible CoT (Cursor on Target) format +- Appear as team members on TAK map displays +- Receive TAK PLI (Position Location Information) messages + +## Setup + +### Prerequisites + +- ATAK (Android Team Awareness Kit) or WinTAK installed +- Meshtastic ATAK Plugin installed +- TAK module enabled on your Meshtastic radio + +### Configuration + +1. Navigate to **Settings → Module Config → TAK**. +2. Enable the TAK module. +3. Configure the TAK team/group settings: + +![Module toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | Descriere | +| ------- | -------------------------- | +| Activat | Activate TAK interop | +| Mode | TAK-compatible output mode | + +### ATAK Plugin Setup + +1. Install the Meshtastic ATAK Plugin from the plugin repository. +2. Open ATAK and enable the Meshtastic plugin. +3. The plugin bridges messages between ATAK and your mesh network. + +## TAK Roles + +Nodes configured with TAK-related roles behave differently from standard clients: + +| Role | Descriere | +| --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **TAK** | Full TAK interoperability — sends and receives CoT data, chat messages, and PLI updates. Functions as a standard client plus TAK bridge. | +| **TAK Tracker** | Position-only TAK output — automatically broadcasts PLI at regular intervals without user interaction. Optimized for unattended position beacons (vehicles, equipment, waypoints). Does not relay chat messages. | + +> 💡 **Tip:** Use **TAK Tracker** for devices that only need to report position (e.g., a radio mounted in a vehicle). Use **TAK** for devices where users actively participate in TAK operations. + +### CoT (Cursor on Target) Format + +TAK messages use the Cursor on Target XML format — a military standard for sharing situational awareness data. Meshtastic converts its internal protobuf messages to CoT format when bridging to TAK systems, so no manual format conversion is needed. + +## TAK Identity + +When using TAK roles, your node broadcasts identity information that appears on TAK maps: + +| Setting | Descriere | +| -------- | ---------------------------------------------------------------------------------------------------------------- | +| Team | Your team color on the TAK map (e.g., Blue, Red, Cyan, Green) | +| Role | Your operational role (Team Member, Team Lead, HQ, Medic, RTO, etc.) | +| Callsign | Your TAK callsign (defaults to your Meshtastic long name) | + +These settings appear in **Settings → Module Config → TAK** when the TAK module is enabled. + +> 💡 **Tip:** Team/role colors are the standard TAK affiliation colors. Coordinate with your TAK team to use consistent team assignments. + +## Wire Format (V1 / V2) + +Meshtastic supports two TAK wire formats: + +| Format | Compatibility | Features | +| ------------------------------- | --------------------------------------------------------------- | --------------------------------------------------------- | +| V1 (Legacy) | ATAK Plugin v1.x, older firmware | Basic CoT position sharing only | +| V2 (Current) | ATAK Plugin v2.x, firmware 2.3+ | Full CoT support including chat, routes, zstd compression | + +The app automatically selects V2 when both sides support it. No manual configuration needed — the TAK module negotiates format based on firmware capabilities. + +## Usage with ATAK + +Once configured: + +- Meshtastic nodes appear as markers on the ATAK map with callsign labels +- Chat messages can bridge between mesh and TAK networks +- Position updates flow bidirectionally between Meshtastic and TAK +- TAK Tracker nodes broadcast PLI automatically — their positions appear on ATAK maps without any ATAK-side configuration + +> ⚠️ **Note:** TAK integration requires specific node roles and module configuration. Standard client nodes don't automatically participate in TAK operations. + +## Troubleshooting + +| Problem | Cause | Solution | +| -------------------------------- | ------------------------------------- | ----------------------------------------------------------------------- | +| Node doesn't appear on ATAK map | TAK module disabled or wrong role | Verify TAK module is enabled and node role is TAK or TAK Tracker | +| Position updates are stale | GPS fix lost or interval too long | Check GPS status; reduce position broadcast interval in Position Config | +| ATAK plugin shows "disconnected" | BLE connection lost or plugin crashed | Reconnect Bluetooth in Meshtastic app, then restart ATAK plugin | +| Chat messages not bridging | V1 format doesn't support chat | Ensure both nodes run firmware 2.3+ for V2 wire format | +| CoT data not flowing | Channel mismatch | All TAK nodes must be on the same channel with matching encryption | + +## Security Considerations + +- TAK data shares your position and callsign information +- Ensure your channel encryption is configured when using TAK in sensitive environments +- The TAK module respects the same channel encryption as other Meshtastic messages + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — TAK module configuration +- [Nodes](nodes) — TAK and TAK Tracker roles in the node list +- [Map & Waypoints](map-and-waypoints) — node positions on the map +- [ATAK plugin guide](https://meshtastic.org/docs/software/integrations/atak-plugin) — detailed ATAK setup on meshtastic.org + +--- + diff --git a/docs/ro-rRO/user/telemetry-and-sensors.md b/docs/ro-rRO/user/telemetry-and-sensors.md new file mode 100644 index 000000000..18fb4b47d --- /dev/null +++ b/docs/ro-rRO/user/telemetry-and-sensors.md @@ -0,0 +1,118 @@ +--- +title: Telemetry & Sensors +nav_order: 9 +last_updated: 2026-05-13 +description: Sensor data on the mesh — supported environment, air quality, and power sensors, plus configuration and viewing guides. +aliases: + - sensors + - environment + - weather + - power-metrics +--- + +# Telemetry & Sensors + +Meshtastic nodes can collect and share sensor data across the mesh network. + +## Overview + +Telemetry allows nodes equipped with sensors to broadcast environmental, power, and device health information. This data is visible on the node detail screen and can be logged over time. + +## Device Telemetry + +All Meshtastic nodes report basic device telemetry: + +| Metric | Descriere | Typical Range | +| ------------------- | ------------------------------ | ------------------------------------------------------------------ | +| Battery Level | Charge percentage | 0–100% | +| Tensiune | Battery voltage | 3.0–4.2V (LiPo) | +| Channel Utilization | % of airtime used locally | 0–100% | +| Air Utilization TX | % of airtime used by this node | 0–100% | +| Timp de functionare | Seconds since last boot | Varies | + +## Environment Sensors + +Supported environmental sensors: + +### Temperature & Humidity + +| Senzor | Temperature | Humidity | Presiune | Notițe | +| ------- | ----------- | -------- | -------- | ----------------------- | +| BME280 | ✓ | ✓ | ✓ | Recommended all-in-one | +| BME680 | ✓ | ✓ | ✓ | Adds gas resistance/IAQ | +| SHT31 | ✓ | ✓ | — | High accuracy | +| MCP9808 | ✓ | — | — | Precision temperature | +| LPS22 | — | — | ✓ | Pressure only | + +### Air Quality + +| Senzor | Metric | Notițe | +| -------- | -------------------------------------------------- | -------------------------- | +| BME680 | Gas Resistance / IAQ | Volatile organic compounds | +| PMSA003I | PM1.0, PM2.5, PM10 | Particulate matter | +| SEN55 | PM, NOx, VOC, Temp, Humidity | Multi-sensor | + +### Light & UV + +| Senzor | Metric | +| -------- | -------------------------------------- | +| OPT3001 | Ambient light (lux) | +| VEML7700 | Ambient light (lux) | +| LTR390 | UV index | + +## Valori putere + +Nodes with INA-series power sensors can report: + +| Metric | Descriere | +| ----------- | ----------------------------------------- | +| Bus Voltage | Supply rail voltage | +| Actual | Power consumption (mA) | +| Alimentare | Calculated power (mW) | + +Useful for monitoring solar charging or battery health on remote nodes. + +## Configuring Telemetry + +1. Navigate to **Settings → Module Config → Telemetry**. +2. Set reporting intervals: + - **Device Metrics Interval** — how often to broadcast device metrics + - **Environment Metrics Interval** — how often to broadcast sensor data +3. Enable specific sensor types as needed. + +### Recommended Intervals + +| Use Case | Device (s) | Environment (s) | +| ------------------------------------------ | ----------------------------- | ---------------------------------- | +| Urban mesh (many nodes) | 3600 | 3600 | +| Rural mesh (few nodes) | 900 | 900 | +| Weather station | 900 | 300 | +| Battery conservation | 7200 | 7200 | + +> ⚠️ **Note:** Shorter intervals increase airtime usage and battery drain across the mesh. + +## Viewing Telemetry + +1. Navigate to **Nodes** and select a node. +2. Telemetry sections show on the detail screen: + - Device Metrics (always available) + - Environment Metrics (if sensors present) + - Power Metrics (if INA sensor present) +3. Historical graphs show trends over time. + +![Telemetry actions](/assets/screenshots/node-metrics_telemetric_actions.png) + +## Troubleshooting + +- **No environment data showing?** The remote node needs a physical sensor connected (e.g., BME280 on I2C). Device telemetry (battery, uptime) is always available, but environment metrics require hardware. +- **Stale readings?** Check the reporting interval — very long intervals (7200s+) mean data updates infrequently. Also verify the remote node is still online. +- **Sensor conflict on I2C bus?** Some sensors share I2C addresses. If you have multiple sensors on the same bus, check for address collisions in the radio's serial debug output. + +## Related Topics + +- [Node Metrics](node-metrics) — view telemetry data on the node detail screen +- [Settings — Modules & Admin](settings-module-admin) — telemetry module configuration +- [Units & Locale](units-and-locale) — temperature and pressure display units + +--- + diff --git a/docs/ro-rRO/user/translate.md b/docs/ro-rRO/user/translate.md new file mode 100644 index 000000000..ece3a6051 --- /dev/null +++ b/docs/ro-rRO/user/translate.md @@ -0,0 +1,97 @@ +--- +title: Translate the App +parent: User Guide +nav_order: 17 +last_updated: 2026-05-13 +aliases: + - translate + - crowdin + - localization +--- + +# Translate the App + +Contributing translations helps make Meshtastic accessible to a wider audience. The app uses [Crowdin](https://crowdin.com/) to manage community translations for both the user interface and in-app documentation. + +--- + +## What Gets Translated + +| Resource | Source Location | Notițe | +| ----------------- | ------------------------------------- | ---------------------------------------------------------------------- | +| UI strings | `composeResources/values/strings.xml` | Buttons, labels, messages, and all user-visible text | +| User Guide pages | `docs/user/*.md` | In-app documentation shown in Help & Documentation | +| Fastlane metadata | `fastlane/metadata/android/en-US/` | App Store listing title, description, and changelogs | + +> **Note — Developer Guide pages are English-only.** Code-focused documentation targeting contributors is not translated. + +--- + +## How to Contribute + +1. **Visit the Crowdin project.** Open the [Meshtastic Android Crowdin project](https://crowdin.com/project/meshtastic-android) and sign in or create a free account. +2. **Choose your language.** Select an existing language or request a new one by opening a [GitHub issue](https://github.com/meshtastic/Meshtastic-Android/issues/new). +3. **Translate strings.** Crowdin shows the English source on the left and your translation on the right. Translate each string and save. +4. **Review context.** Many strings include screenshots or context comments — check these to understand where the text appears in the app. +5. **Submit.** Approved translations are automatically merged into the next release. + +> **Tip — Keep translations short.** UI strings often appear in buttons, chips, or narrow columns. If a translation is significantly longer than the English original, consider abbreviating where the meaning stays clear. + +--- + +## Adding a New Language + +If your language is not yet listed on Crowdin: + +1. Open an issue on [GitHub](https://github.com/meshtastic/Meshtastic-Android/issues/new) requesting the new locale. +2. A maintainer will add the language to Crowdin and configure `crowdin.yml`. +3. Once added, you can begin translating immediately. + +--- + +## How Translations Are Organized + +The Android app uses **Compose Multiplatform resources** for all user-visible strings: + +``` +core/resources/src/commonMain/composeResources/ +├── values/ ← English (default) +│ └── strings.xml +├── values-de/ ← German +│ └── strings.xml +├── values-fr/ ← French +│ └── strings.xml +└── ... +``` + +In-app documentation follows a similar pattern under `docs/`: + +``` +docs/ +├── user/ ← English source (default) +│ ├── onboarding.md +│ └── ... +├── fr/user/ ← French translations +│ ├── onboarding.md +│ └── ... +└── ... +``` + +The app automatically selects the correct locale based on your device's **Language & Region** settings. + +--- + +## Translation Guidelines + +- **Do not translate** technical terms like "LoRa", "MQTT", "BLE", "TAK", "SNR", or "RSSI" — these are universal. +- **Keep placeholders intact.** Strings like `%1$s` or `%d` are filled in at runtime. Do not remove or reorder them unless the grammar of your language requires it. +- **Match tone.** The app uses a friendly, direct voice. Avoid overly formal language. +- **Test if possible.** Switch your device language and open the app to see how translations look in context. + +--- + +## Questions? + +If you have questions about a specific string's context or need help getting started, open a discussion on the [Meshtastic GitHub Discussions](https://github.com/meshtastic/Meshtastic-Android/discussions) page. + +Thank you for helping expand the reach of Meshtastic! diff --git a/docs/ro-rRO/user/units-and-locale.md b/docs/ro-rRO/user/units-and-locale.md new file mode 100644 index 000000000..1c5136c1c --- /dev/null +++ b/docs/ro-rRO/user/units-and-locale.md @@ -0,0 +1,118 @@ +--- +title: Units, Measurement & Locale +parent: User Guide +nav_order: 16 +last_updated: 2026-05-12 +--- + +# Units, Measurement & Locale + +The Meshtastic app automatically displays temperatures, distances, speeds, and times in the units your device is configured to use — no settings to change inside the app. + +--- + +## How It Works + +Meshtastic radios always transmit data in **metric units** (meters, °C, km/h, hPa, etc.). When the app receives this data, it uses the `MetricFormatter` utility to convert and display values in whatever unit system your device's locale specifies. + +On Android, your measurement preferences are determined by your system **Language & Region** settings. On Desktop (JVM), the app uses the JVM's default `Locale`. + +> **Tip — You never need to toggle units inside the app.** Change your system measurement preferences and every screen in Meshtastic updates automatically — node details, telemetry charts, weather, altitude, and more. + +--- + +## Temperature + +Temperature values from environment sensors are transmitted as **°C** and displayed based on your device's temperature unit preference. + +![Environment metrics with temperature](/assets/screenshots/nodes_environment_metrics.png) + +| Your Setting | You See | +| ------------ | ------- | +| Celsius | 22°C | +| Fahrenheit | 72°F | + +This affects all temperature displays throughout the app: node environment telemetry, soil temperature, dew point, and telemetry chart axes. + +## Distance & Altitude + +Distances between nodes and GPS altitudes are transmitted as **meters** and automatically scaled and converted. + +![Distance info display](/assets/screenshots/nodes_distance_info.png) + +| Your Setting | Small Distance | Large Distance | Altitudine | +| -------------------------------- | -------------- | ---------------------- | ---------- | +| Metric | 350 m | 2.5 km | 1,200 m | +| Imperial (US) | 1,148 ft | 1.6 mi | 3,937 ft | + +The app uses natural scaling — short distances stay in meters or feet, while longer distances switch to kilometres or miles automatically. + +### Where these appear + +- **Node list** — distance and bearing to each node +- **Node detail** — altitude, distance from your position +- **Map** — waypoint distances, traceroute hop distances +- **Compass** — distance to selected node + +## Viteza + +GPS ground speed is displayed in your locale's preferred speed unit. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Metric | 12 km/h | +| Imperial (US) | 7 mph | + +## Vânt + +Wind speed and gust data from environment sensors are transmitted as **m/s** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Metric | 5 m/s | +| Imperial (US) | 11 mph | + +Wind readings appear in the **Node Detail** environment section and the **Environment Telemetry** charts. + +## Rainfall + +Rainfall measurements (1-hour and 24-hour totals) are transmitted as **mm** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ---------------------- | +| Metric | 12 mm | +| Imperial (US) | 0.5 in | + +## Units That Never Change + +Some units are international standards and are displayed the same way regardless of your locale: + +| Measurement | Unit | Why | +| -------------------------------- | ------------------------------ | ------------------------------------- | +| Barometric pressure | hPa | International meteorological standard | +| Heading / bearing | ° (degrees) | Universal navigation convention | +| Radiație | μR/hr | Standard dosimetry unit | +| GPS coordinates | decimal degrees | Universal geographic standard | +| Humidity, battery, soil moisture | % | Universal | + +## Date & Time + +All timestamps throughout the app — last heard, message times, telemetry logs, chart axes — follow your device's date and time preferences. + +| Setting | What It Controls | Example | +| ---------------- | ---------------- | ------------------------------------------------ | +| **24-Hour Time** | Clock format | 14:30 vs 2:30 PM | +| **Date Format** | Date ordering | 09/05/2026 vs 05/09/2026 | + +The app also uses **relative time** where it makes sense — for example, "5 min ago" or "2 hours ago" in the node list — which is automatically localised into your device language. + +## Changing Your Measurement System (Android) + +On Android, your measurement system (metric vs imperial) is tied to your region setting: + +1. Open **Android Settings → System → Language & Region** +2. Change your **Region** or **Measurement units** preference +3. Return to Meshtastic — values update immediately + +> **Tip — The app uses `MetricFormatter` from `core:common`.** All measurement formatting is handled by a shared KMP utility that respects your platform's locale. Developers adding new measurement displays should use `MetricFormatter` rather than hard-coding unit conversions. + diff --git a/docs/ru-rRU/index.md b/docs/ru-rRU/index.md new file mode 100644 index 000000000..05858a067 --- /dev/null +++ b/docs/ru-rRU/index.md @@ -0,0 +1,30 @@ +--- +title: Домой +layout: default +nav_order: 0 +--- + +# Документация приложения Meshtastic Android + +Документация для пользователей и разработчиков приложения Meshtastic на Android, ПК и iOS, работающих на KMP (Kotlin Multiplatform). + +Используйте боковую панель навигации, чтобы просматривать **Руководство пользователя** по функциям приложения и **Руководство разработчика** по внесению вклада в проект. + +--- + +## Быстрые ссылки + +| Руководство | Описание | +| ------------------------------------------------------------------------------ | ----------------------------------------------------------------- | +| [Начало работы](user/onboarding) | Подключите вашу первую радиостанцию и отправьте сообщение | +| [Сообщения и Каналы](user/messages-and-channels) | Широковещательный канал, прямые сообщения, реакции и шифрование | +| [Ноды](user/nodes) | Понимание списка узлов mesh-сети | +| [Индикатор сигнала](user/signal-meter) | Как работает индикатор для измерения качества сигнала LoRa | +| [Ед.изм. и локализация](user/units-and-locale) | Как температуру, расстояние и время адаптировать к вашему региону | +| [Десктопное приложение](user/desktop) | Использование настольных систем Linux, macOS и Windows | +| [Архитектура](developer/architecture) | Обзор архитектуры приложения для участников | +| [Вклад](developer/contributing) | Именование веток, рабочий процесс PR и команды проверки | + +--- + +> Эта документация предоставляется из того же источника Markdown, который обеспечивает работу встроенного браузера **Справка и документация**. diff --git a/docs/ru-rRU/user/connections.md b/docs/ru-rRU/user/connections.md new file mode 100644 index 000000000..0c30e6264 --- /dev/null +++ b/docs/ru-rRU/user/connections.md @@ -0,0 +1,125 @@ +--- +title: Соединения +nav_order: 2 +last_updated: 2026-05-13 +description: Connect your phone or desktop to a Meshtastic radio via Bluetooth, USB, or TCP/IP. +aliases: + - bluetooth + - usb + - tcp + - pairing +--- + +# Соединения + +Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node. + +## Bluetooth (BLE) + +Bluetooth Low Energy is the default and most common connection method on Android. + +### Pairing a Device + +1. Ensure your Meshtastic radio is powered on and in pairing mode. +2. Open the app and navigate to **Connections**. +3. Tap **Scan for Devices** — nearby Meshtastic radios will appear. +4. Select your device from the list. +5. Accept the Bluetooth pairing prompt if shown. + +![Device list item](/assets/screenshots/connections_bluetooth_scan.png) + +You can filter devices by transport type using the filter chips at the top: + +![Transport filter chips](/assets/screenshots/connections_transport_filters.png) + +> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. + +### Connection Status + +| Icon | State | Описание | +| ---- | -------------- | ----------------------------- | +| 🟢 | Подключено | Active radio link established | +| 🟡 | Подключение | Handshake in progress | +| 🔴 | Отключено | No active connection | +| ⚪ | Not configured | Устройство не выбрано | + +When connecting, a status indicator shows the current connection state: + +![Connecting status](/assets/screenshots/connections_connecting.png) + +If no devices are found, the app shows an empty state with instructions: + +![No devices found](/assets/screenshots/connections_empty_state.png) + +### Troubleshooting Bluetooth + +- **Device not found:** Toggle Bluetooth off/on, ensure location is enabled. +- **Connection drops:** Move closer to the radio; check for interference. +- **Pairing rejected:** Forget the device in Android Bluetooth settings and retry. + +## USB Serial + +USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable. + +### Setup + +1. Connect your radio via USB cable to your device. +2. The app will prompt for USB permission — tap **Allow**. +3. The connection is established automatically. + +> ⚠️ **Note:** USB connections require OTG support on Android devices. + +## TCP/IP (WiFi) + +Some Meshtastic radios support WiFi connectivity, allowing TCP-based connections. + +### Настройки + +1. Connect your radio to a WiFi network via the radio's web interface or settings. +2. In the app, go to **Connections → TCP**. +3. Enter the radio's IP address and port (default: 4403). +4. Tap **Connect**. + +![WiFi scanning for devices](/assets/screenshots/connections_wifi_scanning.png) + +When a device is found, it appears in the connection list: + +![WiFi device found](/assets/screenshots/connections_wifi_device_found.png) + +A successful connection is confirmed with a status indicator: + +![WiFi connection success](/assets/screenshots/connections_wifi_success.png) + +### When to Use TCP + +- Radio is on the same local network +- Testing with a simulated radio +- Environments where Bluetooth has interference issues + +## Reconnection Behavior + +The app reconnects to the **last selected device** on startup. You can manually switch transports from the connections screen at any time. + +To disconnect from a radio, use the disconnect button on the connections screen: + +![Disconnect from radio](/assets/screenshots/connections_disconnect.png) + +## Desktop Connections + +On Desktop (Linux/macOS/Windows), the app supports: + +- **Bluetooth (BLE)** — via the Kable library; works on macOS, Linux, and Windows +- **USB Serial** — primary wired connection method +- **TCP/IP** — for network-connected radios + +See [Desktop App](desktop) for platform-specific details and keyboard shortcuts. + +## Related Topics + +- [Getting Started](onboarding) — first-launch setup and permissions +- [Settings — Radio & User](settings-radio-user) — Bluetooth and network configuration +- [Desktop App](desktop) — desktop-specific connection details +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — full list of compatible radios on meshtastic.org + +--- + diff --git a/docs/ru-rRU/user/desktop.md b/docs/ru-rRU/user/desktop.md new file mode 100644 index 000000000..5f7f919b0 --- /dev/null +++ b/docs/ru-rRU/user/desktop.md @@ -0,0 +1,147 @@ +--- +title: Настольное приложение +nav_order: 14 +last_updated: 2026-05-13 +description: Install and use the Meshtastic Desktop app on Linux, macOS, and Windows — connections, feature parity, and keyboard shortcuts. +aliases: + - desktop + - linux + - macos + - windows + - jvm +--- + +# Настольное приложение + +The Meshtastic Desktop application provides the same mesh communication features on Linux, macOS, and Windows. + +## Обзор + +The Desktop app shares its core codebase with the Android app through Kotlin Multiplatform (KMP). Most features work identically across platforms. + +## Установка + +### Linux + +- Download the `.deb` or `.AppImage` package from the releases page +- Or build from source using `./gradlew :desktopApp:run` + +### macOS + +- Download the `.dmg` package from releases +- Or build from source + +### Windows + +- Download the `.msi` installer from releases +- Or build from source + +## Connecting Your Radio + +### USB Serial (Primary) + +The most reliable connection method on Desktop: + +1. Connect your Meshtastic radio via USB cable. +2. The app should detect the serial port automatically. +3. If not detected, select the correct serial port from the connections menu. + +### TCP/IP + +For network-connected radios: + +1. Enter the radio's IP address and port (default: 4403). +2. Click **Connect**. + +### Bluetooth (BLE) + +Bluetooth Low Energy is supported on Desktop via the [Kable](https://github.com/JuulLabs/kable) library: + +1. Ensure your system has a Bluetooth adapter. +2. The app scans for nearby Meshtastic radios automatically. +3. Select your device from the connections screen. + +## Feature Parity + +| Feature | Android | Desktop | Заметки | +| ---------------------------------------- | ------- | ------- | -------------------------- | +| Обмен сообщениями | ✓ | ✓ | Полное равенство | +| Список нод | ✓ | ✓ | Полное равенство | +| Карта | ✓ | ✓ | Полное равенство | +| Настройки | ✓ | ✓ | Полное равенство | +| Bluetooth (BLE) | ✓ | ✓ | Via Kable on desktop | +| Firmware Update OTA | ✓ | ✗ | Use web flasher | +| Notifications | ✓ | ✓ | Native OS notifications | +| Виджеты | ✓ | ✗ | Android-only | +| AI Assistant (Chirpy) | ✓\* | ✗ | Google flavor Android only | + +\*Chirpy AI requires Android 14+ on Google flavor builds with supported hardware. + +## UI Differences + +The Desktop app uses the same Compose Multiplatform UI with adaptations for larger screens and desktop interaction. + +### Keyboard Shortcuts + +| Shortcut | Action | +| ------------------- | --------------------------- | +| **⌘Q** / **Ctrl+Q** | Quit the application | +| **⌘,** / **Ctrl+,** | Open Settings | +| **⌘1** / **Ctrl+1** | Switch to Conversations tab | +| **⌘2** / **Ctrl+2** | Switch to Nodes tab | +| **⌘3** / **Ctrl+3** | Switch to Map tab | +| **⌘4** / **Ctrl+4** | Switch to Connections tab | + +### Window & System Tray + +- **Window resizing** — responsive layout adapts to window dimensions +- **System tray** — minimize to system tray for background mesh operation +- **Tray menu** — right-click the tray icon to show window or quit +- **Mouse interaction** — hover states and standard desktop navigation + +### Notification Preferences + +The Desktop app provides in-app toggles for controlling which notifications are shown — messages, new nodes, and low battery alerts. Access these from **Settings → Notifications** within the app. + +## Built-in Documentation Browser + +The Desktop app includes a built-in documentation browser for quick access to help content without leaving the application. + +![Docs browser with table of contents](/assets/screenshots/docs-browser_toc.png) + +The browser supports full-text search across all documentation: + +![Searching the docs browser](/assets/screenshots/docs-browser_search.png) + +Individual doc pages render with full formatting: + +![A documentation page](/assets/screenshots/docs-browser_page.png) + +## Building from Source + +```bash +git clone https://github.com/meshtastic/Meshtastic-Android.git +cd Meshtastic-Android +git submodule update --init +./gradlew :desktopApp:run +``` + +Requirements: + +- JDK 21 +- No Android SDK required for desktop-only builds + +## Known Limitations + +- No OTA firmware updates (use web flasher) +- Some Android-specific features (widgets, specific notification channels) are unavailable +- Performance may vary on low-spec hardware running Compose Desktop +- BLE bonding is not yet supported on desktop (pairing works without bonding) + +## Related Topics + +- [Connections](connections) — connection methods overview +- [Firmware Updates](firmware) — use the [Web Flasher](https://flasher.meshtastic.org) for desktop firmware updates + +--- + diff --git a/docs/ru-rRU/user/discovery.md b/docs/ru-rRU/user/discovery.md new file mode 100644 index 000000000..b811f1ef2 --- /dev/null +++ b/docs/ru-rRU/user/discovery.md @@ -0,0 +1,114 @@ +--- +title: Обнаружение +nav_order: 12 +last_updated: 2026-05-13 +description: Explore your mesh network — traceroute paths, neighbor maps, and node discovery tools. +aliases: + - mesh-discovery + - local-discovery + - network-scan + - traceroute + - neighbor-info +--- + +# Обнаружение + +Discovery tools help you understand **how** your mesh network is connected — which nodes can hear each other, what paths messages take, and where bottlenecks or weak links exist. + +> 💡 **Tip:** You don't need a dedicated "discovery mode" to start exploring your mesh. The tools below are available right now from the node list and node detail screens. + +--- + +## Трассировка маршрута + +Traceroute reveals the exact path a message takes from your node to any other node on the mesh. It's the single most useful tool for debugging connectivity problems. + +### Running a Traceroute + +1. Navigate to **Nodes** and tap the node you want to trace. +2. On the node detail screen, tap **Traceroute**. +3. The app sends a traceroute request and waits for the response. +4. Results display each hop in order, with signal quality at every step. + +### Reading the Results + +A traceroute result looks like this: + +``` +You → Node A (SNR: 8.5, RSSI: -95) → Node B (SNR: 5.2, RSSI: -108) → Target +``` + +Each hop represents a relay node that forwarded the message. The SNR and RSSI values at each hop tell you about the link quality on that specific segment. + +| What to look for | What it means | +| -------------------------------------------------------------------------- | --------------------------------------------------------------------------- | +| All hops show Good SNR (> 5 dB) | Healthy path — messages flow reliably | +| One hop shows Bad SNR (< 0 dB) | Weak link — this relay segment is fragile | +| Many hops (4+) | Long path — consider repositioning a node to shorten it | +| Different path on retry | Mesh is adapting — multiple routes exist (this is good!) | + +> 💡 **Tip:** Run traceroute several times over a few minutes. If the path changes, your mesh has redundant routes — a sign of a well-connected network. + +### Troubleshooting with Traceroute + +- **"No route found"** — The target node may be offline, out of range, or on a different channel. Check that both nodes share at least one channel with the same encryption key. +- **Traceroute times out** — The path may be too long (exceeds hop limit) or a relay node is congested. Try increasing the hop limit in **Settings → LoRa Config**. +- **Asymmetric paths** — A traceroute from A→B may take a different path than B→A. This is normal — radio propagation is not always symmetric. + +--- + +## Информация об окружении + +The Neighbor Info module lets each node broadcast a list of the nodes it can **directly hear** (single-hop). When multiple nodes share their neighbor lists, you can piece together a topology map of the entire mesh. + +### Enabling Neighbor Info + +1. Navigate to **Settings → Module Config → Neighbor Info**. +2. Enable the module. +3. Set the broadcast interval (default: 900 seconds / 15 minutes). + +Once enabled, your node periodically broadcasts its neighbor table. Other nodes with Neighbor Info enabled do the same. + +### Viewing Neighbor Data + +- Open any node's detail screen and look for the **Neighbors** section. +- Each neighbor entry shows the node that was directly heard and its signal quality. +- Combine neighbor data from multiple nodes to understand the full mesh topology. + +> ⚠️ **Note:** Neighbor Info increases airtime usage because every enabled node periodically broadcasts its neighbor list. On busy meshes with many nodes, consider longer broadcast intervals (3600 seconds or more) to avoid congestion. + +--- + +## Node List as a Discovery Tool + +The node list itself is a powerful discovery tool when you use its filtering and sorting features effectively. + +### Finding New Nodes + +- Sort by **Last heard** to see the most recently active nodes at the top. +- Enable **Include unknown** to see nodes that have appeared on the mesh but haven't sent user info yet — these are often newly powered-on devices. + +### Assessing Connectivity + +- Sort by **Hops away** to see which nodes are directly reachable (0 hops) versus relayed. +- Sort by **Distance** to find nearby nodes and verify they're reachable. +- Use **Exclude MQTT** to focus on nodes reachable over radio (not via internet bridge). + +### Infrastructure Audit + +- Disable **Exclude infrastructure** to see Router, Repeater, Router Late, and Client Base nodes. +- Check their signal quality and last-heard times to verify your infrastructure nodes are healthy. + +See [Nodes](nodes) for full details on filtering and sorting options. + +--- + +## Tips for Mesh Exploration + +- **Start with traceroute** — it gives you immediate, actionable information about a specific path. +- **Enable Neighbor Info on key nodes** — especially routers and repeaters, to build a picture of the backbone. +- **Check the map** — node positions on the [Map](map-and-waypoints) combined with signal data help you understand why some links are strong and others are weak. +- **Compare signal over time** — use the [Signal Meter](signal-meter) guide to interpret SNR and RSSI values correctly. + +--- + diff --git a/docs/ru-rRU/user/firmware.md b/docs/ru-rRU/user/firmware.md new file mode 100644 index 000000000..8a9b01a56 --- /dev/null +++ b/docs/ru-rRU/user/firmware.md @@ -0,0 +1,114 @@ +--- +title: Firmware Updates +nav_order: 13 +last_updated: 2026-05-13 +description: Update your radio firmware over Bluetooth — OTA process, version channels, pre-flight checks, and recovery. +aliases: + - firmware + - update + - ota + - flash +--- + +# Firmware Updates + +Keep your Meshtastic radio up to date with the latest firmware for new features, bug fixes, and security improvements. + +## Checking for Updates + +1. Navigate to **Settings → Firmware Update** or tap the firmware notification if shown. +2. The app checks for available firmware versions. +3. Available updates show the version number and changelog summary. + +## Update Methods + +### OTA (Over-The-Air) via Bluetooth + +The most common update method for Android users: + +1. Ensure your radio is connected via Bluetooth. +2. Navigate to the Firmware Update screen. +3. Select the desired firmware version. +4. Tap **Update** to begin the OTA process. +5. Wait for the update to complete — **do not disconnect** during the update. + +![Firmware checking for updates](/assets/screenshots/firmware_checking.png) + +> ⚠️ **Warning:** Interrupting a firmware update can brick your device. Ensure your radio has sufficient battery (>50% recommended) and maintain Bluetooth proximity during the entire process. + +![Firmware disclaimer](/assets/screenshots/firmware_disclaimer.png) + +### USB Flashing + +For recovery or when OTA is unavailable: + +- Use the [Meshtastic Web Flasher](https://flasher.meshtastic.org) +- Or the [Meshtastic CLI tool](https://meshtastic.org/docs/getting-started/flashing-firmware) on desktop + +## Version Channels + +| Канал | Описание | +| ---------- | ------------------------------------------- | +| Стабильная | Recommended for most users; tested releases | +| Альфа | Preview releases; may contain bugs | + +## Pre-Update Checklist + +Before updating: + +- [ ] Battery > 50% +- [ ] Stable Bluetooth connection +- [ ] Note your current settings (they may reset on major version changes) +- [ ] Check the release notes for breaking changes + +## Post-Update + +After a successful update: + +- The radio will reboot automatically +- Bluetooth connection will re-establish +- Verify your settings are intact +- Check the firmware version in **Settings → About** + +![Firmware update success](/assets/screenshots/firmware_success.png) + +## Troubleshooting + +### Update Stuck + +If the update appears frozen: + +- Wait at least 5 minutes before intervening +- If truly stuck, power-cycle the radio +- Attempt the update again + +![Firmware update error](/assets/screenshots/firmware_error.png) + +### Device Won't Boot After Update + +If your device fails to boot: + +1. Try connecting via USB to a computer +2. Use the web flasher in recovery/DFU mode +3. Flash a known-good firmware version +4. Check the Meshtastic Discord for device-specific recovery steps + +### Compatibility Warnings + +The app may show warnings when: + +- Connected radio firmware is below minimum supported version +- Major version mismatch between app and firmware +- Deprecated features need migration + +> ⚠️ **Important:** Always update the Meshtastic app before or alongside firmware updates to ensure compatibility. + +## Related Topics + +- [Connections](connections) — reconnecting after a firmware update +- [Flashing firmware guide](https://meshtastic.org/docs/getting-started/flashing-firmware) — full firmware flashing walkthrough on meshtastic.org +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — check firmware compatibility by device +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/ru-rRU/user/map-and-waypoints.md b/docs/ru-rRU/user/map-and-waypoints.md new file mode 100644 index 000000000..a425e7ce2 --- /dev/null +++ b/docs/ru-rRU/user/map-and-waypoints.md @@ -0,0 +1,116 @@ +--- +title: Map & Waypoints +nav_order: 6 +last_updated: 2026-05-13 +description: View node positions on the map, create and share waypoints, and manage position sharing and privacy. +aliases: + - map + - waypoints + - gps + - location +--- + +# Map & Waypoints + +The Map screen shows the geographic positions of nodes on your mesh, along with shared waypoints. + +## Map View + +The map displays: + +- **Node positions** — colored markers for each node reporting location +- **Waypoints** — shared points of interest +- **Your position** — your current GPS location + +### Node Markers + +Node markers on the map indicate: + +| Color | Meaning | +| ------- | ---------------------------------------------- | +| Зеленый | Online (heard recently) | +| Жёлтый | Away (heard within 2 hours) | +| Gray | Offline (stale position) | +| Синий | Your own node | + +### Map Controls + +- **Zoom** — pinch or use +/- buttons +- **Pan** — drag to explore +- **Center** — select the location button to center on your position +- **Node tap** — tap a node marker to view details + +The floating toolbar provides quick access to compass, layer switching, node filters, refresh, and location tracking. Tap the compass to reorient north-up, or tap the location button to center on your current position. + +![Map controls overlay](/assets/screenshots/map_controls_overlay.png) + +## Waypoints + +Waypoints are shared geographic points of interest that all mesh members can see. + +### Creating a Waypoint + +1. Long-press on the map at the desired location. +2. Enter a name and optional description. +3. Choose an icon/emoji for the waypoint. +4. Tap **Send** to share with the mesh. + +### Waypoint Properties + +| Property | Описание | +| ------------- | ------------------------------------------------------- | +| Имя | Short identifier (max 30 characters) | +| Описание | Optional longer description | +| Icon | Visual marker emoji on the map | +| Заблокировано | If locked, only the creator can edit or delete | +| Expiration | Optional auto-remove time | + +### Waypoint Expiration + +Waypoints can be set to expire automatically: + +- **Never** (default) — waypoint remains until manually deleted +- **Timed** — waypoint is automatically removed after the specified duration (e.g., "remove after 2 hours"). Useful for temporary markers like rally points, hazards, or meeting locations. + +Expired waypoints are automatically hidden from the map so they don't clutter the display. The expiration countdown begins when the waypoint is created, not when other nodes receive it. + +### Managing Waypoints + +- Tap a waypoint on the map to view its details and coordinates +- Edit or delete waypoints you created +- **Locked waypoints** cannot be modified or deleted by other nodes — only the original creator can change them +- Unlocked waypoints can be edited by any mesh member + +## Position Sharing + +### Enabling Position Sharing + +Your node shares its GPS position based on: + +- **Fixed interval** — broadcast position at regular intervals +- **Smart position** — broadcast when movement exceeds a threshold +- **Manual** — only share when explicitly requested + +Configure position behavior in **Settings → Position**. + +### Privacy Considerations + +> 🔒 **Privacy:** Position data is broadcast to all nodes on your channel. If you don't want your location shared, disable GPS position in settings or use a fixed/fake position. + +## Map Sources + +The app supports multiple map tile sources: + +- OpenStreetMap (default) +- Satellite imagery (where available) +- Offline tiles (download map areas for offline use) + +## Related Topics + +- [Nodes](nodes) — view and filter your node list +- [Node Metrics](node-metrics) — signal quality and position history for individual nodes +- [Discovery](discovery) — traceroute and neighbor info for understanding mesh topology +- [Units & Locale](units-and-locale) — distance and coordinate display formats + +--- + diff --git a/docs/ru-rRU/user/messages-and-channels.md b/docs/ru-rRU/user/messages-and-channels.md new file mode 100644 index 000000000..eb339d27f --- /dev/null +++ b/docs/ru-rRU/user/messages-and-channels.md @@ -0,0 +1,159 @@ +--- +title: Messages & Channels +nav_order: 3 +last_updated: 2026-05-13 +description: Send and receive messages, manage channels, configure encryption, and use quick chat, reactions, and message actions. +aliases: + - channels + - direct-messages + - messaging + - conversations +--- + +# Messages & Channels + +Meshtastic supports two communication modes: **channel broadcasts** and **direct messages**. + +## Каналы + +Channels are shared communication groups. All nodes configured with the same channel key can read and send messages on that channel. + +### Default Channel + +Every Meshtastic device comes with a default **LongFast** channel. This is an unencrypted channel used for general mesh communication. + +### Безопасность канала + +Channels support multiple encryption levels: + +| Icon | Security Level | Описание | +| ---- | ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------- | +| 🔒 | PSK (256-bit AES) | Fully encrypted with a strong pre-shared key. Only nodes with the matching key can read messages. | +| 🔐 | PSK (128-bit AES) | Encrypted with a shorter key. Secure for most uses but 256-bit is preferred for sensitive data. | +| 🔓 | Default / Open | Uses the well-known default key. **Any Meshtastic device** on the same preset can read these messages. | +| ⚠️ | Insecure + Position | Open channel that also broadcasts your GPS position. Use with caution in public meshes. | + +> 🔒 **Security Tip:** 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. + +### Adding a Channel + +1. Navigate to **Settings → Channels**. +2. Tap **Add Channel** or scan a QR code. +3. Configure the channel name and encryption key. +4. Share the channel URL/QR code with others who need access. + +Tapping a channel shows its details and sharing options. + +## Direct Messages + +Direct messages (DMs) are point-to-point encrypted communications between two specific nodes. + +### Sending a Direct Message + +1. Open the **Messages** tab. +2. Select a node from your contacts list or tap a node in the node list. +3. Type your message and tap **Send**. + +### Message States + +| State | Icon | Meaning | +| --------------------------------- | ---- | ----------------------------------------------------------------------------------------------------------------- | +| Queued | ⏳ | Message waiting to be sent | +| En route | ✓ | Delivered to the radio, awaiting acknowledgment | +| Доставлено | ✓✓ | Acknowledgment received from recipient | +| Received | ✓ | Message received from the mesh (incoming) | +| S&F Routing | 🔗 | Store & Forward: message being routed through an S&F node | +| S&F Confirmed | 🔗 | Store & Forward: delivery confirmed via S&F node | +| Ошибки | ✗ | Delivery failed after retries | + +### Delivery Errors + +When a message fails to deliver, the error indicator shows what went wrong: + +| Ошибки | Meaning | What to Do | +| ---------------------- | ---------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| No Route | No path exists to the destination node | The recipient may be offline or out of mesh range. Try later or move closer. | +| Got NAK | The next-hop node refused to relay | The relay node may be congested. Wait and retry. | +| Время ожидания истекло | No acknowledgment within retry window | The recipient may be just out of range. Try increasing hop limit or moving to a better position. | +| Нет интерфейса | No radio interface available to send | Check that your radio is connected and the channel is configured. | +| Max Retransmit | All retry attempts exhausted | The mesh path is unreliable. Try a different channel or wait for conditions to improve. | +| Нет канала | The destination channel doesn't exist | Verify both nodes share the same channel configuration. | +| Too Large | Message exceeds maximum payload size | Shorten your message (max ~230 characters). | +| Без ответа | Node received message but didn't respond | The recipient's radio may be busy or in low-power sleep mode. | +| Duty Cycle Limit | Regional airtime limit reached | Your radio has used its allowed transmit time. Wait for the duty cycle window to reset (typically 1 hour in EU regions). | +| Неверный запрос | Malformed or invalid message | This usually indicates a software bug. Try restarting the app. | + +> 💡 **Tip:** 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. + +## Message Features + +### Quick Chat + +Pre-configured messages for rapid communication: + +- Access via the Quick Chat button in the message input area +- Choose from built-in phrases or custom messages +- Customize quick chat messages in **Settings → Quick Chat** +- Useful when typing is impractical (gloves, small screen, urgent) + +![Quick chat option](/assets/screenshots/messages_quick_chat.png) + +The channel list shows each channel with its latest message preview. + +### Message Bubbles + +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. + +### Reactions + +React to messages with emoji: + +- **Long-press** a message to open the actions menu +- Tap **Add Reaction** to choose an emoji +- Reactions appear below the message bubble +- Multiple users can react to the same message +- React to your own messages or others' messages + +![Emoji reaction badges displayed beneath a message](/assets/screenshots/messages_reaction.png) + +> 💡 **Tip:** Reactions are lightweight — they use minimal mesh bandwidth compared to full text messages. + +### Message Actions + +Long-press any message to access: + +- **Copy** — copy message text to clipboard +- **Reply** — quote the message in your response +- **React** — add an emoji reaction +- **Delete** — remove a message you sent (local deletion) + +### Message Priority + +Messages are queued and transmitted based on priority: + +1. Emergency/alert messages (highest) +2. Direct messages +3. Channel broadcasts (lowest) + +### Message Limits + +- **Maximum length:** 237 bytes (approximately 230 characters for ASCII text) +- **Rate limiting:** The mesh enforces airtime fairness; heavy message volume may be throttled +- **Delivery:** Messages are retried automatically if no acknowledgment is received + +## Best Practices + +- Use channels for group coordination +- Use direct messages for private person-to-person communication +- Keep messages short — mesh bandwidth is limited +- Configure encryption for sensitive communications + +## Related Topics + +- [Nodes](nodes) — tap a node to start a direct message +- [Settings — Radio & User](settings-radio-user) — configure channel encryption and presets +- [MQTT](mqtt) — bridge channel messages to the internet +- [Channel configuration](https://meshtastic.org/docs/configuration/radio/channels) — detailed channel settings on meshtastic.org + +--- + diff --git a/docs/ru-rRU/user/mqtt.md b/docs/ru-rRU/user/mqtt.md new file mode 100644 index 000000000..4a0343578 --- /dev/null +++ b/docs/ru-rRU/user/mqtt.md @@ -0,0 +1,137 @@ +--- +title: MQTT +nav_order: 11 +last_updated: 2026-05-13 +description: Bridge your mesh to the internet — MQTT broker setup, encryption layers, and map reporting. +aliases: + - mqtt + - internet-bridge + - broker +--- + +# MQTT + +MQTT bridges your Meshtastic mesh network to the internet, enabling long-range communication beyond radio range. + +## Обзор + +The MQTT module connects your node to an MQTT broker, allowing: + +- Messages to reach nodes on different physical meshes via the internet +- Integration with home automation and monitoring systems +- Publishing node positions to the public Meshtastic map +- Custom data pipelines for logging and alerting + +## Как это работает + +``` +[Your Node] → Radio → [Gateway Node with WiFi] → MQTT Broker → [Remote Gateway] → Radio → [Remote Node] +``` + +A gateway node with internet access (WiFi or Ethernet) publishes mesh messages to an MQTT topic. Remote gateways subscribed to the same topic inject those messages into their local mesh. + +## Настройки + +### Включение MQTT + +1. Navigate to **Settings → Module Config → MQTT**. +2. Enable the MQTT module. +3. Configure the broker connection: + +![MQTT toggle switch](/assets/screenshots/settings_switch.png) + +| Настройка | Описание | По умолчанию | +| ---------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------- | +| Адрес сервера | MQTT broker hostname | mqtt.meshtastic.org | +| Имя пользователя | Broker authentication | meshdev | +| Пароль | Broker authentication | large4cats | +| Корневая тема | Base topic for messages | msh | +| Шифрование | Encrypt MQTT payload | Включено | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON packet support has been removed from firmware; this field is ignored | Отключено | +| TLS | Secure connection to broker | Отключено | +| Map Reporting | Report position to public map | Отключено | + +### Default Meshtastic Broker + +The community maintains a public broker at `mqtt.meshtastic.org`. This is intended for general use and testing. + +> 🔒 **Privacy:** Messages on the public broker are readable by anyone subscribed. Always use channel encryption for private communications. + +### Private Broker + +For better privacy and control, you can run your own MQTT broker: + +- Mosquitto (lightweight, open-source) +- HiveMQ +- EMQX + +Configure your node to point to your private broker with appropriate credentials. + +## Map Reporting + +When Map Reporting is enabled, your node publishes its position to the Meshtastic community map: + +- Visible at [meshmap.net](https://meshmap.net) and similar community map services +- Only position and node info are shared +- Disable this if you don't want your location publicly visible + +## Uplink vs Downlink + +| Direction | Описание | +| ------------ | -------------------------------- | +| **Uplink** | Messages from mesh → MQTT broker | +| **Downlink** | Messages from MQTT broker → mesh | + +Configure per-channel which directions are active to control message flow and airtime usage. + +## Message Formats + +MQTT uses protobuf message format: + +| Format | Описание | Use case | +| ------------ | ----------------------------------- | -------------------------- | +| **Protobuf** | Binary Meshtastic protobuf encoding | Node-to-node mesh bridging | + +> ⚠️ **Note:** JSON output support was removed from firmware. The `json_enabled` setting is still visible in the app for legacy compatibility but has no effect on current firmware versions. + +## Encryption & Privacy + +Understanding the layered encryption model: + +1. **Channel encryption** happens on the mesh _before_ MQTT. If your channel has a PSK, the MQTT payload is already encrypted — the broker and any subscribers see only the ciphertext. +2. **MQTT encryption** (the module setting) adds an additional encryption layer for transit to the broker. This protects metadata and routing information. +3. **TLS** encrypts the TCP connection to the broker itself, preventing network-level eavesdropping. + +> 🔒 **Important:** The default public channel has a well-known key. Messages on the default channel sent via MQTT are effectively **unencrypted** — anyone can decode them. Always use a custom PSK for private communications. + +## Best Practices + +- Use channel-level encryption (PSK) on channels that bridge to MQTT +- Don't enable MQTT on nodes without internet access (it will buffer and waste memory) +- Use a private broker for sensitive deployments +- Be mindful of airtime when downlinking messages from busy MQTT topics — every downlinked message consumes radio airtime on your local mesh +- Consider enabling uplink-only if you only need to monitor your mesh remotely without injecting messages back + +## Troubleshooting + +### MQTT Not Connecting + +- **Check WiFi** — the gateway node must have an active internet connection (WiFi or Ethernet). MQTT does not work over the LoRa radio link itself. +- **Verify credentials** — incorrect username or password will silently fail on most brokers. Double-check for trailing spaces. +- **Firewall** — port 1883 (MQTT) or 8883 (MQTT+TLS) must be open. Some networks block non-standard ports. +- **DNS resolution** — if using a custom broker hostname, verify the node can resolve it. Try the broker's IP address directly. + +### Messages Not Bridging + +- **Check uplink/downlink settings** — if only uplink is enabled, messages flow from mesh to MQTT but not back. Enable downlink on the receiving gateway. +- **Channel mismatch** — both gateways must share the same channel with the same PSK. A mismatch means messages are encrypted with different keys and appear as garbage. +- **Topic mismatch** — ensure both gateways use the same root topic. The default `msh` works for the public broker. + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — MQTT module configuration reference +- [Messages & Channels](messages-and-channels) — channel encryption and PSK setup +- [MQTT integration guide](https://meshtastic.org/docs/software/integrations/mqtt) — detailed MQTT documentation on meshtastic.org + +--- + diff --git a/docs/ru-rRU/user/node-metrics.md b/docs/ru-rRU/user/node-metrics.md new file mode 100644 index 000000000..ab06c0e06 --- /dev/null +++ b/docs/ru-rRU/user/node-metrics.md @@ -0,0 +1,130 @@ +--- +title: Node Metrics +nav_order: 5 +last_updated: 2026-05-13 +description: Telemetry dashboards for each mesh node — device health, environment sensors, signal quality, power, traceroute, and position history. +aliases: + - metrics + - telemetry + - device-metrics + - signal +--- + +# Node Metrics + +The node detail screen provides comprehensive telemetry and metrics for each node on your mesh. + +## Интервал передачи + +Basic operating information reported by each node: + +| Metric | Описание | +| -------------------- | ----------------------------------- | +| Battery Level | Current battery percentage | +| Напряжение | Battery voltage reading | +| Использование канала | Percentage of airtime consumed | +| Airtime | Transmission time used by this node | +| Аптайм | Time since last reboot | + +Device metrics are displayed as individual cards with trend sparklines showing battery level, voltage, channel utilization, airtime, and uptime over time. + +> 💡 **Tip:** Tap any metric card to expand it into a full chart with historical data points. Pinch to zoom the time axis. + +## Метрики окружения + +Environmental sensor data (requires compatible hardware): + +| Metric | Sensor Examples | +| ------------------------------------ | --------------------- | +| Температура | BME280, BME680, SHT31 | +| Влажность | BME280, BME680, SHT31 | +| Давление на барометре | BME280, BMP280 | +| Сопротивление газа | BME680 | +| IAQ (Air Quality) | BME680 | + +Environment metrics are charted over time for easy trend analysis — temperature, humidity, and pressure each get their own line chart with the measurement unit displayed on the Y axis. + +> 💡 **Tip:** Environment metrics require a sensor connected to the remote node. Not all nodes report environmental data. See [Telemetry & Sensors](telemetry-and-sensors) for a full list of supported sensors. + +## Показатели сигнала + +Radio signal quality information: + +| Metric | Описание | +| ---------- | ----------------------------------------------------------------------------- | +| Сигнал/шум | Signal-to-Noise Ratio (higher is better) | +| RSSI | Received Signal Strength Indicator (closer to 0 is better) | +| Hop Count | Number of mesh hops for last message | + +### Signal Quality Reference + +| SNR Range | Quality | +| --------------------------------- | --------- | +| > 10 dB | Excellent | +| 0 to 10 dB | Хороший | +| -10 to 0 dB | Средний | +| < -10 dB | Poor | + +## Метрики питания + +Power management telemetry (requires INA sensor or compatible hardware): + +| Metric | Описание | +| ----------- | ----------------------- | +| Bus Voltage | Supply voltage | +| Ток | Power draw in milliamps | +| Питание | Calculated wattage | + +## Трассировка маршрута + +Traceroute shows the path a message takes through the mesh: + +1. From the node detail screen, tap **Traceroute**. +2. The app sends a traceroute request to the target node. +3. Results show each hop with SNR/RSSI values. + +### Reading Traceroute Results + +``` +You → Node A (SNR: 8.5) → Node B (SNR: 5.2) → Target +``` + +Each hop represents a relay node that forwarded the message. + +## Журнал местоположения + +Historical position data for nodes that share their location: + +- GPS coordinates +- Высота +- Speed (if moving) +- Timestamp for each position report + +## Информация об окружении + +Shows which nodes a given node can directly hear, useful for understanding mesh topology. + +## Viewing Metrics + +1. Navigate to **Nodes**. +2. Tap the node you want to inspect. +3. Select the metric category from the detail tabs. + +![Node detail — local device](/assets/screenshots/nodes_detail_local.png) + +The position tab shows location data for nodes that share GPS: + +![Position inline content](/assets/screenshots/nodes_position.png) + +> ⚠️ **Note:** Metrics are only available when they have been reported by the remote node. Metrics update at intervals configured on each node's telemetry settings. + +## Related Topics + +- [Nodes](nodes) — node list, filtering, and sorting +- [Telemetry & Sensors](telemetry-and-sensors) — supported sensors and configuration +- [Signal Meter](signal-meter) — how signal quality is calculated from SNR and RSSI +- [Discovery](discovery) — traceroute details and neighbor info +- [Units & Locale](units-and-locale) — temperature, distance, and speed display formats + +--- + diff --git a/docs/ru-rRU/user/nodes.md b/docs/ru-rRU/user/nodes.md new file mode 100644 index 000000000..e59dcb2a2 --- /dev/null +++ b/docs/ru-rRU/user/nodes.md @@ -0,0 +1,152 @@ +--- +title: Ноды +nav_order: 4 +last_updated: 2026-05-13 +description: Просматривайте, фильтруйте и сортируйте ноды сети — просматривайте подробности, качество сигнала, роли и быстрые действия. +aliases: + - node-list + - mesh-nodes + - peers +--- + +# Ноды + +The Nodes screen displays all devices visible on your mesh network. + +## Список узлов + +The node list shows every node your radio has heard, including: + +- **Node name** — user-configured long name +- **Short name** — 4-character identifier +- **Signal quality** — last heard signal strength +- **Last heard** — time since last communication +- **Distance** — estimated distance (if positions are shared) +- **Battery** — remote node battery level (if telemetry is enabled) + +### Node Status Indicators + +| Badge | Meaning | +| ----------- | ------------------------------------- | +| 🟢 Онлайн | Node heard within the last 15 minutes | +| 🟡 Отошёл | Node heard within the last 2 hours | +| 🔴 Отключен | Node not heard for over 2 hours | +| ⭐ Избранный | Node marked as favorite by the user | + +### Node Roles + +Nodes can be configured with different roles that affect their mesh behavior: + +| Роль | Описание | +| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Client | Standard end-user device | +| Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | +| Client Mute | Receives but doesn't retransmit | +| Client Hidden | Like Client Mute, plus hides from node list | +| Router | Prioritizes message forwarding; stays awake to relay | +| Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | +| ~~Router Client~~ | ⚠️ **Deprecated** (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | +| ~~Repeater~~ | ⚠️ **Deprecated** (removed in firmware 2.7.11) — no longer selectable; use Router instead | +| Tracker | Optimized for position reporting at regular intervals | +| Sensor | Optimized for telemetry reporting | +| Тактический | Interoperates with TAK systems (sends/receives CoT) | +| TAK Tracker | TAK position reporting only | +| Lost & Found | Continuous position beacon for recovery | + +### Выбор роли + +Most users should keep the default **Client** role. Consider a different role when: + +- **Router** — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don't use Router on battery-powered handheld devices. +- **Router Late** — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. +- **Client Base** — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. +- **Client Mute** — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only devices or to reduce congestion in dense areas. +- **Tracker** — An unattended device whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. +- **Sensor** — An unattended device reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. +- **TAK / TAK Tracker** — Only needed if interoperating with ATAK/WinTAK systems. See [TAK Integration](tak) for details. + +> 💡 **Tip:** The mesh works best when most nodes are **Client** or **Router**. Too many Mute nodes reduces mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. + +### Encryption Indicators + +Nodes display encryption status icons next to their name: + +| Icon | Meaning | +| ----------- | ------------------------------------------------------------------------------------------------------------------- | +| 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | +| 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | +| ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) | + +> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. + +## Quick Actions + +From the node list, you can: + +- **Tap** a node to view its detail page +- **Long-press** for quick actions: + - Send a direct message + - Показать на карте + - Запросить позицию + - Mark as favorite + - Трассировка маршрута + +## Filtering & Sorting + +### Text Search + +Type in the search field to filter nodes by name or short name. The filter updates in real time as you type. + +### Filter Toggles + +| Фильтр | Описание | +| -------------------------- | ---------------------------------------------------------------------------------------------- | +| **Only online** | Show only nodes heard within the last 15 minutes | +| **Only direct** | Show only nodes with direct (non-relayed) connections | +| **Include unknown** | Show nodes that haven't sent user info yet | +| **Exclude infrastructure** | Hide infrastructure-role nodes (Router, Repeater, Router Late, Client Base) | +| **Exclude MQTT** | Hide nodes heard only via MQTT internet bridge | +| **Show ignored** | Show nodes you've previously dismissed or muted | + +### Sort Options + +| Sort | Описание | +| ------------------------------------------- | ------------------------------------------------------------------ | +| **Last heard** (default) | Most recently heard nodes first | +| **Alphabetical** | Sorted by node long name | +| **Distance** | Nearest nodes first (requires position sharing) | +| **Hops away** | Fewest relay hops first | +| **Channel** | Grouped by channel index | +| **Via MQTT** | Grouped by MQTT vs. radio-heard | +| **Favorites** | Favorited nodes first | + +## Node Detail + +Tapping a node opens the detail view with comprehensive information. See [Node Metrics](node-metrics) for full details on metrics and telemetry. + +![Node detail view](/assets/screenshots/nodes_node_list.png) + +The detail screen includes device info, position, and action buttons: + +![Node detail section](/assets/screenshots/nodes_detail_section.png) + +Inline status indicators show key metrics at a glance: + +| Indicator | Screenshot | +| ---------------------- | -------------------------------------------------------- | +| Signal quality | ![Signal](/assets/screenshots/nodes_signal_info.png) | +| Уровень заряда батареи | ![Battery](/assets/screenshots/nodes_battery_info.png) | +| Hop count | ![Hops](/assets/screenshots/nodes_hops_info.png) | +| Последний раз слышен | ![Last heard](/assets/screenshots/nodes_last_heard.png) | +| Расстояние | ![Distance](/assets/screenshots/nodes_distance_info.png) | + +## Related Topics + +- [Node Metrics](node-metrics) — detailed telemetry dashboards for each node +- [Messages & Channels](messages-and-channels) — send a direct message to a node +- [Map & Waypoints](map-and-waypoints) — view node positions geographically +- [Discovery](discovery) — traceroute and neighbor info for topology exploration +- [Signal Meter](signal-meter) — understand what the signal bars mean + +--- + diff --git a/docs/ru-rRU/user/onboarding.md b/docs/ru-rRU/user/onboarding.md new file mode 100644 index 000000000..3b910534e --- /dev/null +++ b/docs/ru-rRU/user/onboarding.md @@ -0,0 +1,99 @@ +--- +title: Getting Started +nav_order: 1 +last_updated: 2026-05-13 +description: First-launch setup — permissions, onboarding flow, and next steps after connecting your radio. +aliases: + - first-launch + - setup + - intro +--- + +# Getting Started + +Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app. + +## First Launch + +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. + +### Welcome Screen + +The welcome screen introduces Meshtastic and its core capabilities: + +- Off-grid mesh communication +- No cellular or internet required +- End-to-end encrypted messaging + +Tap **Get Started** to proceed through the setup flow. + +![Welcome screen](/assets/screenshots/onboarding_welcome.png) + +## Permissions + +The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. + +### Bluetooth Permission + +Bluetooth is the primary connection method between your phone and Meshtastic radio: + +- **Bluetooth scanning** — discover nearby Meshtastic radios +- **Bluetooth connect** — establish and maintain connections with paired radios + +Grant both permissions when prompted. Without Bluetooth, you'll need to use USB or TCP connections instead. + +### Location Permission + +> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. + +Meshtastic also uses your location for: + +- Showing your position on the mesh map +- Calculating distances to other nodes +- Sharing your GPS coordinates with other mesh members (if enabled) + +Grant **"While using the app"** or **"Always"** depending on your preference: + +- **While using the app** — position updates only when the app is open +- **Always** — enables background position updates for always-on mesh presence + +If denied, Bluetooth scanning will not function and your node will not report a position. + +### Notifications Permission + +Notifications alert you to: + +- Incoming messages from channels and direct messages +- Connection status changes (connected, disconnected, reconnecting) +- Firmware update availability + +> 💡 **Tip:** You can fine-tune notification preferences later in Android system settings. The app creates separate notification channels for messages, connection events, and background service status. + +### Critical Alerts Permission + +On supported devices, the app may request permission for critical alerts: + +- These are high-priority notifications that can break through Do Not Disturb mode +- Useful for emergency mesh alerts or urgent messages +- You can **skip** this step if you don't need breakthrough notifications +- Configure or revoke later in Android notification settings + +## After Setup + +Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. + +> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. + +## What's Next? + +Once connected to a radio, explore: + +- [Connections](connections) — pair your first radio device +- [Messages & Channels](messages-and-channels) — send your first message +- [Nodes](nodes) — see who's on your mesh +- [Map & Waypoints](map-and-waypoints) — view node positions +- [Settings](settings-radio-user) — configure your radio and user profile + +New to Meshtastic? The [getting started guide](https://meshtastic.org/docs/getting-started) on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup. + +--- diff --git a/docs/ru-rRU/user/settings-module-admin.md b/docs/ru-rRU/user/settings-module-admin.md new file mode 100644 index 000000000..33fb18a21 --- /dev/null +++ b/docs/ru-rRU/user/settings-module-admin.md @@ -0,0 +1,246 @@ +--- +title: Настройки — Модули и администрирование +nav_order: 8 +last_updated: 2026-05-13 +description: Configure optional feature modules (MQTT, telemetry, canned messages, TAK, and more) and perform device administration. +aliases: + - modules + - module-config + - administration +--- + +# Настройки — Модули и администрирование + +Configure optional feature modules and perform device administration. Modules extend Meshtastic with specialized capabilities — each can be independently enabled or disabled. + +> 💡 **Tip:** You only need to enable the modules you actually use. Disabling unused modules reduces airtime, saves battery, and simplifies your configuration. + +Module settings use a card-based layout with toggle switches, dropdowns, text fields, and sliders: + +![Toggle switch](/assets/screenshots/settings_switch.png) + +![Dropdown selector](/assets/screenshots/settings_dropdown.png) + +![Text field](/assets/screenshots/settings_text_field.png) + +![Settings card layout](/assets/screenshots/settings_titled_card.png) + +## Конфигурация модуля + +### Модуль MQTT + +Bridges mesh messages to and from an MQTT broker for internet connectivity. This is how you extend your mesh beyond radio range or integrate with home automation systems. + +| Настройка | Описание | +| ---------------- | ------------------------------------------------------------------------ | +| Включено | Toggle MQTT bridge | +| Сервер | MQTT broker address | +| Имя пользователя | Authentication username | +| Пароль | Authentication password | +| Шифрование | Encrypt MQTT payloads | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON support removed from firmware; field is ignored | +| TLS | Use secure connection | +| Корневая тема | Base MQTT topic path | +| Отчет карты | Publish position for public map | + +See [MQTT](mqtt) for a detailed usage guide including encryption, privacy, and broker setup. + +### Serial Module + +Enables serial port communication for external device integrations (GPS modules, sensors, or custom hardware). When enabled, the node's serial port can send and receive protobuf or text data, allowing external microcontrollers or computers to interact with the mesh. + +| Настройка | Описание | +| ------------------------------------------ | ------------------------------- | +| Включено | Activate serial communication | +| Эхо | Echo received serial data back | +| Режим обмена | Text, Protobuf, or NMEA output | +| RX/TX Pins | GPIO pins for serial connection | +| Скорость передачи (бод) | Serial communication speed | + +### External Notification Module + +Controls buzzer, LED, or vibration alerts on your radio hardware. Useful for devices that need to physically signal when a message arrives — particularly helpful for unattended or outdoor installations. + +| Настройка | Описание | +| ----------------------------------------- | --------------------------- | +| Включено | Activate notifications | +| Включить уведомление о входящем сообщении | Notify on incoming messages | +| Зуммер при уведомлении | Use buzzer for messages | +| Alert Message Vibra | Use vibration for messages | +| Уведомлять при 🔔 | Notify on bell character | +| Output (GPIO) | Pin for notification output | +| Активный выход | High or Low active | +| Duration (ms) | Notification length | +| Use I2S as Buzzer | Use I2S audio output | + +### Store & Forward Module + +Buffers messages for nodes that were temporarily offline, then replays them when those nodes reconnect. Essential for meshes where nodes go in and out of range regularly — ensures messages aren't lost during brief disconnections. + +| Setting | Описание | +| ------------------------------------------ | -------------------------- | +| Включено | Activate store and forward | +| Heartbeat (s) | Announcement interval | +| Записи | Maximum stored messages | +| History Return (max) | Max messages to replay | +| History Return (window) | Time window for replay | + +> 💡 **Tip:** Store and Forward works best on nodes with ample memory (ESP32 with PSRAM). Router nodes are ideal candidates since they're typically always-on. + +### Range Test Module + +Automated range testing tool for evaluating link quality between nodes. When enabled, the node periodically transmits test messages with incrementing counters. A receiver node logs these messages, allowing you to walk or drive away and later analyze at what distance messages stopped arriving. + +| Setting | Описание | +| -------------------------------------- | --------------------------------- | +| Включено | Activate range testing | +| Sender Interval (s) | Time between test transmissions | +| Save CSV | Log received test data to SD card | + +### Telemetry Module + +Controls what telemetry data your node shares with the mesh. Telemetry includes device health (battery, uptime) and environmental sensor data (temperature, humidity, pressure). + +| Setting | Описание | +| ---------------------------- | --------------------------------------- | +| Device Metrics Interval | How often to report device metrics | +| Environment Metrics Interval | How often to report environment sensors | +| Телеметрия воздуха | Report particulate sensor data | +| Power Metrics Enabled | Report power usage | + +See [Telemetry & Sensors](telemetry-and-sensors) for supported sensors and configuration recommendations. + +### Canned Message Module + +Pre-configured messages accessible from the device's physical buttons (for radios with rotary encoders, keypads, or similar input hardware). Define a list of quick-send messages that can be transmitted without a phone connected — ideal for field use. + +| Setting | Описание | +| ------------------ | ----------------------------------------------------------- | +| ~~Enabled~~ | ⚠️ **Deprecated** — current firmware may ignore this toggle | +| Сообщения | Newline-separated list of messages | +| Отправлять 🔔 | Play bell sound on send | +| Rotary Encoder | Enable rotary encoder input | +| Up/Down/Press Pins | GPIO pin assignments for input | + +### Audio Module + +Codec2 audio support for low-bandwidth voice communication over the mesh. This is an **experimental** feature that encodes voice into very small data packets using the Codec2 codec. + +| Setting | Описание | +| --------------- | -------------------------------- | +| Включено | Activate audio module | +| Codec2 Rate | Audio quality/bandwidth tradeoff | +| I2S Word Select | GPIO pin for I2S WS | +| I2S Data In | GPIO pin for I2S DIN | +| I2S Data Out | GPIO pin for I2S DOUT | + +> ⚠️ **Note:** Audio requires specific hardware (I2S microphone and speaker). Voice quality is very low-bandwidth — think "understandable radio voice," not phone-call quality. + +### Remote Hardware Module + +GPIO control over the mesh network. Allows a remote node to read or write GPIO pins on another node — useful for activating relays, reading switches, or controlling external hardware from a distance. + +| Setting | Описание | +| -------------------- | --------------------------------------------------------------- | +| Включено | Activate remote GPIO access | +| Allow Undefined Pins | Allow access to any GPIO pin (security risk) | + +> ⚠️ **Warning:** Enabling "Allow Undefined Pins" gives remote nodes access to all GPIO pins, which could interfere with the radio's own hardware. Only enable on dedicated GPIO nodes. + +### Neighbor Info Module + +Broadcasts information about directly heard neighbors, enabling mesh topology mapping. Each enabled node periodically shares a list of the other nodes it can hear and their signal quality. + +| Setting | Описание | +| -------------------------------------- | ------------------------------------ | +| Включено | Activate neighbor broadcasting | +| Update Interval (s) | How often to broadcast neighbor list | + +See [Discovery](discovery) for how to use neighbor data for mesh topology exploration. + +### Ambient Lighting Module + +Controls onboard NeoPixel or other addressable RGB LEDs on supported hardware. Can be used for visual status indicators, notification lights, or decorative effects. + +| Setting | Описание | +| -------------------- | ---------------------------------------------------------- | +| Включено | Activate LED control | +| Состояние светодиода | On, Off, or set specific color | +| Red / Green / Blue | Individual color channel values (0–255) | + +### Detection Sensor Module + +Turns your node into a motion or door sensor alert system. When a GPIO pin detects a state change (motion detected, door opened), the node broadcasts an alert message over the mesh. + +| Setting | Описание | +| ---------------------------------------- | ----------------------------------------------------------------------- | +| Включено | Activate detection sensor | +| Пин датчика | GPIO pin connected to sensor | +| Detection Triggered High | Trigger when pin goes high (vs. low) | +| Minimum Broadcast (s) | Minimum time between alert broadcasts | +| State Broadcast (s) | Periodic state broadcast interval | +| Отправлять 🔔 | Include bell character in alerts | +| Имя датчика | Custom name for this sensor | + +### Paxcounter Module + +People counter using WiFi and BLE probe requests. Counts nearby devices by passively listening for probe requests that phones and laptops emit when scanning for networks. Available only on ESP32 devices. + +| Setting | Описание | +| -------------------------------------- | -------------------------- | +| Включено | Activate people counting | +| Update Interval (s) | How often to report counts | + +> 💡 **Tip:** Paxcounter is useful for estimating foot traffic at trailheads, event venues, or other locations. Counts are approximate — one person may carry multiple devices. + +### TAK Module + +Team Awareness Kit integration for interoperability with ATAK and WinTAK. See [TAK Integration](tak) for detailed setup and usage. + +## Администрирование + +### Удаленное администрирование + +Remotely configure nodes that share your admin key: + +1. Select the target node in the node list. +2. Navigate to **Settings** for that node. +3. Modify configuration. +4. Tap **Save** — changes are sent over the mesh. + +> ⚠️ **Requires:** Admin key configured on both your node and the target node. + +### Очистить базу данных нод + +Removes stale nodes from your local database that haven't been heard in a configurable time window. + +### Factory Reset + +Resets all settings to factory defaults. **This cannot be undone.** + +### Перезагрузка + +Remotely reboot a connected or administered node. + +### Панель отладки + +View detailed diagnostic information: + +- Protocol buffers debug output +- Mesh packet log +- Connection state details + +### Troubleshooting Remote Admin + +- **"No response from target node"** — the target may be out of range, offline, or have a mismatched admin key. Verify the admin key matches on both nodes. +- **Changes not applying** — some settings require a reboot to take effect. Try the Reboot action after saving. +- **Can't see remote settings** — ensure your node has the admin key for the target node and that Admin Channel is enabled in Security Config. + +## Related Topics + +- [Settings — Radio & User](settings-radio-user) — core radio and user profile settings +- [Module configuration reference](https://meshtastic.org/docs/configuration/module) — detailed module docs on meshtastic.org +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/ru-rRU/user/settings-radio-user.md b/docs/ru-rRU/user/settings-radio-user.md new file mode 100644 index 000000000..9b6c8823d --- /dev/null +++ b/docs/ru-rRU/user/settings-radio-user.md @@ -0,0 +1,173 @@ +--- +title: Настройки - Радио и пользователь +nav_order: 7 +last_updated: 2026-05-13 +description: Настройте ваше радиоустройство, пресеты LoRa, пользовательский профиль, обмен местоположением, управление питанием и безопасность. +aliases: + - настройки + - radio-config + - user-config + - lora +--- + +# Настройки - Радио и пользователь + +Настройте радиоустройство и параметры идентификации пользователя. + +## Настройки пользователя + +### Профиль пользователя + +| Настройка | Описание | +| ------------------------ | ------------------------------------------------------------------------------------------------------------------- | +| Полное имя | Ваше отображаемое имя (до 39 символов) | +| Короткое имя | 4-символьное сокращённое имя | +| Лицензированный оператор | Включите, если у вас есть лицензия радиолюбителя (позволяет использовать более высокую мощность) | + +### Применение изменений + +После изменения настроек нажмите **Сохранить** чтобы записать конфигурацию в ваше радиоустройство. Устройство может перезагрузиться для применения изменений. + +## Конфигурация радио + +### Настройки устройства + +| Настройка | Описание | По умолчанию | +| ------------------------------------------ | ----------------------------------------------------------------------------------------- | ------------ | +| Роль | Поведение ноды (Client, Router и т.д.) | Client | +| Режим ретрансляции | Как нода повторно передает сообщения | Всё | +| Node Info Broadcast (s) | Interval for broadcasting node info | 10800 | +| Двойное нажатие кнопки | Action for double-tap button press | Включено | + +### Настройка LoRa + +| Настройка | Описание | По умолчанию | +| ------------------------- | ----------------------------------------------------------------------------------- | ----------------------------------------- | +| Регион / Страна | Regulatory region for frequency bands | Unset (must configure) | +| Режим работы модема | Speed/range tradeoff | LongFast | +| Лимит хопов | Maximum retransmit hops | 3 | +| Мощность передачи | Мощность передачи (дБм); 0 = максимально разрешённая для региона | 0 (максимум региона) | +| Частотное смещение | Точная настройка частоты (МГц) | 0 | +| Полоса пропускания канала | Настройка пропускной способности | По умолчанию для предустановки | + +> ⚠️ **Важно:** Вы **обязаны** установить свой регион перед отправкой. Работа без правильного региона может нарушать местные правила радиопользования. Смотрите [руководство по настройке региона](https://meshtastic.org/docs/getting-started/initial-config) на сайте meshtastic.org для получения подробной информации. + +### Предустановки модема + +| Предустановка | Диапазон | Скорость | Предел SNR | Лучше всего для | +| ------------------ | ----------------------- | ------------------------- | ------------------------ | -------------------------------------------------------------------------------------------------------- | +| Short Turbo | ~1 км | 21.9 кб/с | −5 дБ | Плотная городская застройка с прямой видимостью; приложения, требующие высокой передачи данных | +| Short Fast | ~3 км | 10.9 кб/с | −7.5 дБ | Городские районы; здания в пределах нескольких кварталов | +| Short Slow | ~5 км | 5.5 кб/с | -10 дБ | Suburban short-range; moderate building density | +| Medium Fast | ~5 км | 5.5 кб/с | -10 дБ | Пригородные районы; умеренная плотность застройки | +| Medium Slow | ~8 km | 1.1 кб/с | −12.5 дБ | Suburban/rural; moderate range with slower speed | +| Long Turbo | ~10 км | 4.4 kbps | -10 дБ | Similar range to Long Fast but with 500 kHz bandwidth; faster throughput | +| Long Fast | ~10 км | 1.1 кб/с | −12.5 дБ | **Общее использование (по умолчанию)** — сбалансированный диапазон и скорость | +| Long Moderate | ~20 км | 0.34 кб/с | -15 дБ | Сельская местность с некоторым рельефом; случайное использование | +| Lite Fast | ~5 км | 5.5 кб/с | -10 дБ | EU 866 MHz SRD band (125 kHz BW); comparable to Medium Fast | +| Lite Slow | ~10 км | 1.1 кб/с | −12.5 дБ | EU 866 MHz SRD band (125 kHz BW); comparable to Long Fast | +| Narrow Fast | ~5 км | 2.7 kbps | -10 дБ | EU 868 MHz band (62.5 kHz BW); avoids interference with other devices | +| Narrow Slow | ~10 км | 1.1 кб/с | −12.5 дБ | EU 868 MHz band (62.5 kHz BW); comparable to Long Fast | +| ~~Long Slow~~ | ~30 км | 0.18 кб/с | −17.5 дБ | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | +| ~~Very Long Slow~~ | ~40+ км | 0.09 кб/с | −20 дБ | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | + +#### Выбор предустановки модема + +The modem preset controls the fundamental tradeoff between **range** and **data rate**: + +- **Slower presets** use more spreading, making signals decodable at weaker signal levels (lower SNR limit). This means longer range but fewer bytes per second. +- **Faster presets** pack more data per transmission but require a stronger signal to decode. + +**Practical guidance:** + +- **Urban mesh (many nodes, short distances):** Use **Long Fast** (default) or **Short Fast**. Higher speed means less airtime congestion when many nodes share the channel. +- **Rural/sparse mesh (few nodes, long distances):** Use **Long Moderate**. Range matters more than speed when nodes are far apart. +- **EU 866/868 MHz regulatory compliance:** Use **Lite Fast**, **Lite Slow**, **Narrow Fast**, or **Narrow Slow** — these are optimized for the EU SRD/868 MHz bands with narrower bandwidths. +- **Fixed infrastructure links:** Use **Short Turbo** or **Long Turbo** for dedicated point-to-point links with good antennas and line-of-sight. +- **Mixed environments:** Stick with **Long Fast** — it's the community default and ensures compatibility with others in your area. + +> ⚠️ **Important:** All nodes on the same channel **must** use the same modem preset. Nodes with mismatched presets cannot communicate even if they share the same frequency and encryption key. + +> 💡 **Tip:** The range estimates above assume flat terrain and modest antennas. Elevation advantage (hilltop, rooftop) dramatically increases effective range. A well-placed Router with Long Fast can often outperform a ground-level node with Long Slow. + +### Параметры дисплея + +| Настройка | Описание | +| ------------------- | ------------------------------------------------------------------------------------ | +| Время ожидания | Время до перехода в спящий режим | +| Единицы измерения | Метрическая или имперская | +| Тип OLED-дисплея | Авто, SSD1306, SH1106, SH1107 | +| Compass Orientation | Rotation offset for compass display (0°, 90°, 180°, 270°) | +| ~~Compass North~~ | ⚠️ **Deprecated** — replaced by Compass Orientation; still visible in older firmware | + +### Настройки местоположения + +| Настройка | Описание | +| ----------------------- | --------------------------------------- | +| GPS включен | Включение/отключение GPS | +| Интервал обновления GPS | Как часто получать GPS-фиксацию | +| Вещание позиции | How often to share position | +| Умная позиция | Enable movement-based broadcasting | +| Фиксированная позиция | Использовать вручную заданное положение | + +### Настройка питания + +| Настройка | Описание | +| --------------------------------------- | --------------------------------------- | +| Power Saving | Enable low-power sleep mode | +| Shutdown After (s) | Auto-shutdown idle timer | +| Множитель ADC | Battery voltage calibration factor | +| Wait Bluetooth (s) | Time to wait for BLE connection at boot | +| Mesh SDS Timeout (s) | Super-deep-sleep timeout | + +### Настройка сети + +| Настройка | Описание | +| ------------- | --------------------------------------------------------------- | +| WiFi включен | Включить радиомодуль WiFi (устройства ESP32) | +| WiFi SSID | Имя сети для подключения | +| WiFi PSK | Пароль сети | +| NTP-сервер | Сервер синхронизации времени | +| Syslog-сервер | Удалённый сервер логирования | + +![IP address field](/assets/screenshots/settings_ipv4_field.png) + +### Настройка Bluetooth + +| Setting | Описание | +| --------------------- | ------------------------------------------------------------------------- | +| Bluetooth Enabled | Enable/disable BLE radio | +| Pairing Mode | Fixed PIN, Random PIN, or No PIN | +| Фиксированный PIN-код | PIN code for pairing (default: 123456) | + +### Настройки безопасности + +| Setting | Описание | +| --------------------- | -------------------------------------------------------------------------- | +| Публичный ключ | Your node's public key (read-only) | +| Ключ администратора | Key for remote administration | +| Приватный ключ | Your node's private key (handle securely) | +| Admin Channel Enabled | Allow admin commands via channel | +| Журнал отладки | Output live debug logging over serial/bluetooth | +| Serial Enabled | Enable serial console access (moved from Device Config) | +| Управляемый режим | Restrict non-admin channel changes | + +![Password field](/assets/screenshots/settings_password_field.png) + +Settings use standard preference controls — dropdowns, toggles, and sliders: + +| Control | Screenshot | +| -------- | ------------------------------------------------------ | +| Dropdown | ![Dropdown](/assets/screenshots/settings_dropdown.png) | +| Toggle | ![Toggle](/assets/screenshots/settings_switch.png) | +| Slider | ![Slider](/assets/screenshots/settings_slider.png) | + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — optional feature modules and device administration +- [Signal Meter](signal-meter) — how modem presets affect signal quality thresholds +- [LoRa configuration](https://meshtastic.org/docs/configuration/radio/lora) — detailed LoRa settings reference on meshtastic.org +- [Initial configuration](https://meshtastic.org/docs/getting-started/initial-config) — region setup guide on meshtastic.org + +--- + diff --git a/docs/ru-rRU/user/signal-meter.md b/docs/ru-rRU/user/signal-meter.md new file mode 100644 index 000000000..100d7e5a0 --- /dev/null +++ b/docs/ru-rRU/user/signal-meter.md @@ -0,0 +1,81 @@ +--- +title: How the Meshtastic Signal Meter Works +nav_order: 15 +last_updated: 2026-05-13 +description: How the signal meter calculates quality from RSSI and SNR — LoRa spread spectrum, presets, and what the bars really mean. +aliases: + - signal + - signal-meter + - snr + - rssi +--- + +# How the Meshtastic Signal Meter Works + +The Meshtastic signal meter — the familiar bars or status color in the app — is calculated very differently than the "bars" on a traditional cell phone or Wi-Fi router. + +Most consumer devices simply measure how "loud" a signal is. However, because Meshtastic uses **LoRa (Long Range)** technology, its signal meter measures how **clear** the signal is, relative to the specific settings your mesh is using. + +--- + +## 1. The Two Metrics: "Loudness" vs. "Clarity" + +Every time the LoRa radio chip receives a message, it reports two measurements: + +- **RSSI (Received Signal Strength Indicator):** The **loudness** of the raw power hitting your antenna. +- **SNR (Signal-to-Noise Ratio):** The **clarity** of the signal compared to the background static. + +> **Tip — The Analogy:** Imagine you are trying to hear a friend talking to you. +> +> - **RSSI** is how loud their voice is. +> - **The Noise Floor** is the background noise in the room (air conditioning, other people talking, traffic). +> - **SNR** is how easily you can distinguish your friend's voice from the background noise. + +If your friend shouts at you at a deafening rock concert, the signal is incredibly loud (High RSSI), but you still can't understand them because the background noise is louder (Bad SNR). Conversely, if your friend whispers to you in a dead-silent library, the signal is very weak (Low RSSI), but you can understand them perfectly (Great SNR). + +--- + +## 2. The Magic of LoRa: Hearing "Below the Noise Floor" + +For standard radios (like FM or Wi-Fi), if the background noise is louder than the signal (a negative SNR), the receiver just hears static. + +LoRa is special. It uses **"Spread Spectrum"** modulation, which allows the radio to mathematically pull a signal out of the air even when it is buried deep _underneath_ the background noise. This is why you will frequently see **negative SNR numbers** in Meshtastic (e.g., -10 dB, which means the signal is 10 decibels weaker than the background static). + +Depending on which Meshtastic preset you are using (e.g., `LongFast` vs. `ShortFast`), the radio has a specific **SNR Limit** — the absolute maximum amount of noise it can tolerate before the message is completely lost to the static. + +--- + +## 3. How the Signal Meter Calculates Quality + +The Meshtastic apps take both RSSI and SNR and run them through a specific formula to assign your signal a quality rating (None, Bad, Fair, or Good). It specifically scales these values based on the physical limits of the radio preset you are using. + +Here is exactly how the app decides how many bars (or what color) to show you: + +| Level | Bars | Criteria | Meaning | +| ----------- | ---- | ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | +| Хороший | 3 | RSSI better than `-115 dBm` **AND** SNR better than `-7 dB` | Signal is both loud and clear — healthy connection. | +| Средний | 2 | RSSI better than `-126 dBm` with good SNR, **OR** SNR better than `-15 dB` with good RSSI | Signal getting quieter or noisier, but still decodable. | +| Плохой | 1 | Falls between Fair and None thresholds | At the edge of range or experiencing interference. | +| Отсутствует | 0 | RSSI worse than `-126 dBm` **AND** SNR worse than `-15 dB` | Transmission completely buried in noise. | + +--- + +## 4. What This Means for You + +Because Meshtastic's meter acts as a **"Clarity Meter"**, it behaves differently than what most people expect: + +> **Tip — Don't panic over low RSSI:** You might see a seemingly terrible RSSI value like `-118 dBm`. On a cell phone, you would have zero bars. But if you have an SNR of `+2 dB`, Meshtastic will still show a strong signal! _The library is quiet, so the whisper is heard perfectly._ + +> **Warning — Watch out for local noise:** If you hook up a massive antenna and see a great RSSI (e.g., `-90 dBm`) but your signal meter is only showing **1 Bar (Bad)**, you have a problem. It means you have local interference — perhaps a cheap power supply, a noisy computer, or a nearby radio tower — creating so much static that it is drowning out your mesh. + +## Where Signal Information Appears + +In the app, signal data is shown in several places: + +- **Node list** — signal bars icon next to each node +- **Node detail** — SNR, RSSI, and signal quality in the device metrics section +- **Traceroute** — per-hop signal quality for each relay node +- **Signal metrics** — historical SNR and RSSI data in the metrics charts + +![Node entry showing SNR, RSSI values and colored signal bars](/assets/screenshots/nodes_signal_info.png) + diff --git a/docs/ru-rRU/user/tak.md b/docs/ru-rRU/user/tak.md new file mode 100644 index 000000000..178779555 --- /dev/null +++ b/docs/ru-rRU/user/tak.md @@ -0,0 +1,126 @@ +--- +title: TAK Integration +nav_order: 10 +last_updated: 2026-05-13 +description: Interoperate with ATAK and WinTAK — CoT position sharing, TAK roles, and plugin setup. +aliases: + - tak + - atak + - team-awareness-kit +--- + +# TAK Integration + +Meshtastic integrates with the Team Awareness Kit (TAK) ecosystem, enabling interoperability between Meshtastic mesh devices and TAK applications like ATAK and WinTAK. + +## Overview + +The TAK module allows Meshtastic nodes to: + +- Share position data in TAK-compatible CoT (Cursor on Target) format +- Appear as team members on TAK map displays +- Receive TAK PLI (Position Location Information) messages + +## Setup + +### Prerequisites + +- ATAK (Android Team Awareness Kit) or WinTAK installed +- Meshtastic ATAK Plugin installed +- TAK module enabled on your Meshtastic radio + +### Настройки + +1. Navigate to **Settings → Module Config → TAK**. +2. Enable the TAK module. +3. Configure the TAK team/group settings: + +![Module toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | Описание | +| ------------ | -------------------------- | +| Включено | Activate TAK interop | +| Режим обмена | TAK-compatible output mode | + +### ATAK Plugin Setup + +1. Install the Meshtastic ATAK Plugin from the plugin repository. +2. Open ATAK and enable the Meshtastic plugin. +3. The plugin bridges messages between ATAK and your mesh network. + +## TAK Roles + +Nodes configured with TAK-related roles behave differently from standard clients: + +| Роль | Описание | +| --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **TAK** | Full TAK interoperability — sends and receives CoT data, chat messages, and PLI updates. Functions as a standard client plus TAK bridge. | +| **TAK Tracker** | Position-only TAK output — automatically broadcasts PLI at regular intervals without user interaction. Optimized for unattended position beacons (vehicles, equipment, waypoints). Does not relay chat messages. | + +> 💡 **Tip:** Use **TAK Tracker** for devices that only need to report position (e.g., a radio mounted in a vehicle). Use **TAK** for devices where users actively participate in TAK operations. + +### CoT (Cursor on Target) Format + +TAK messages use the Cursor on Target XML format — a military standard for sharing situational awareness data. Meshtastic converts its internal protobuf messages to CoT format when bridging to TAK systems, so no manual format conversion is needed. + +## TAK Identity + +When using TAK roles, your node broadcasts identity information that appears on TAK maps: + +| Setting | Описание | +| -------- | ---------------------------------------------------------------------------------------------------------------- | +| Team | Your team color on the TAK map (e.g., Blue, Red, Cyan, Green) | +| Роль | Your operational role (Team Member, Team Lead, HQ, Medic, RTO, etc.) | +| Callsign | Your TAK callsign (defaults to your Meshtastic long name) | + +These settings appear in **Settings → Module Config → TAK** when the TAK module is enabled. + +> 💡 **Tip:** Team/role colors are the standard TAK affiliation colors. Coordinate with your TAK team to use consistent team assignments. + +## Wire Format (V1 / V2) + +Meshtastic supports two TAK wire formats: + +| Format | Compatibility | Features | +| ------------------------------- | --------------------------------------------------------------- | --------------------------------------------------------- | +| V1 (Legacy) | ATAK Plugin v1.x, older firmware | Basic CoT position sharing only | +| V2 (Current) | ATAK Plugin v2.x, firmware 2.3+ | Full CoT support including chat, routes, zstd compression | + +The app automatically selects V2 when both sides support it. No manual configuration needed — the TAK module negotiates format based on firmware capabilities. + +## Usage with ATAK + +Once configured: + +- Meshtastic nodes appear as markers on the ATAK map with callsign labels +- Chat messages can bridge between mesh and TAK networks +- Position updates flow bidirectionally between Meshtastic and TAK +- TAK Tracker nodes broadcast PLI automatically — their positions appear on ATAK maps without any ATAK-side configuration + +> ⚠️ **Note:** TAK integration requires specific node roles and module configuration. Standard client nodes don't automatically participate in TAK operations. + +## Troubleshooting + +| Problem | Cause | Solution | +| -------------------------------- | ------------------------------------- | ----------------------------------------------------------------------- | +| Node doesn't appear on ATAK map | TAK module disabled or wrong role | Verify TAK module is enabled and node role is TAK or TAK Tracker | +| Position updates are stale | GPS fix lost or interval too long | Check GPS status; reduce position broadcast interval in Position Config | +| ATAK plugin shows "disconnected" | BLE connection lost or plugin crashed | Reconnect Bluetooth in Meshtastic app, then restart ATAK plugin | +| Chat messages not bridging | V1 format doesn't support chat | Ensure both nodes run firmware 2.3+ for V2 wire format | +| CoT data not flowing | Channel mismatch | All TAK nodes must be on the same channel with matching encryption | + +## Security Considerations + +- TAK data shares your position and callsign information +- Ensure your channel encryption is configured when using TAK in sensitive environments +- The TAK module respects the same channel encryption as other Meshtastic messages + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — TAK module configuration +- [Nodes](nodes) — TAK and TAK Tracker roles in the node list +- [Map & Waypoints](map-and-waypoints) — node positions on the map +- [ATAK plugin guide](https://meshtastic.org/docs/software/integrations/atak-plugin) — detailed ATAK setup on meshtastic.org + +--- + diff --git a/docs/ru-rRU/user/telemetry-and-sensors.md b/docs/ru-rRU/user/telemetry-and-sensors.md new file mode 100644 index 000000000..ddedeae37 --- /dev/null +++ b/docs/ru-rRU/user/telemetry-and-sensors.md @@ -0,0 +1,118 @@ +--- +title: Telemetry & Sensors +nav_order: 9 +last_updated: 2026-05-13 +description: Sensor data on the mesh — supported environment, air quality, and power sensors, plus configuration and viewing guides. +aliases: + - sensors + - environment + - weather + - power-metrics +--- + +# Telemetry & Sensors + +Meshtastic nodes can collect and share sensor data across the mesh network. + +## Overview + +Telemetry allows nodes equipped with sensors to broadcast environmental, power, and device health information. This data is visible on the node detail screen and can be logged over time. + +## Device Telemetry + +All Meshtastic nodes report basic device telemetry: + +| Metric | Описание | Typical Range | +| -------------------- | ------------------------------ | ------------------------------------------------------------------ | +| Battery Level | Charge percentage | 0–100% | +| Напряжение | Battery voltage | 3.0–4.2V (LiPo) | +| Использование канала | % of airtime used locally | 0–100% | +| Air Utilization TX | % of airtime used by this node | 0–100% | +| Аптайм | Seconds since last boot | Varies | + +## Environment Sensors + +Supported environmental sensors: + +### Temperature & Humidity + +| Sensor | Температура | Влажность | Давление | Заметки | +| ------- | ----------- | --------- | -------- | ----------------------- | +| BME280 | ✓ | ✓ | ✓ | Recommended all-in-one | +| BME680 | ✓ | ✓ | ✓ | Adds gas resistance/IAQ | +| SHT31 | ✓ | ✓ | — | High accuracy | +| MCP9808 | ✓ | — | — | Precision temperature | +| LPS22 | — | — | ✓ | Pressure only | + +### Air Quality + +| Sensor | Metric | Заметки | +| -------- | -------------------------------------------------- | -------------------------- | +| BME680 | Gas Resistance / IAQ | Volatile organic compounds | +| PMSA003I | PM1.0, PM2.5, PM10 | Particulate matter | +| SEN55 | PM, NOx, VOC, Temp, Humidity | Multi-sensor | + +### Light & UV + +| Sensor | Metric | +| -------- | -------------------------------------- | +| OPT3001 | Ambient light (lux) | +| VEML7700 | Ambient light (lux) | +| LTR390 | UV index | + +## Метрики питания + +Nodes with INA-series power sensors can report: + +| Metric | Описание | +| ----------- | ----------------------------------------- | +| Bus Voltage | Supply rail voltage | +| Ток | Power consumption (mA) | +| Питание | Calculated power (mW) | + +Useful for monitoring solar charging or battery health on remote nodes. + +## Configuring Telemetry + +1. Navigate to **Settings → Module Config → Telemetry**. +2. Set reporting intervals: + - **Device Metrics Interval** — how often to broadcast device metrics + - **Environment Metrics Interval** — how often to broadcast sensor data +3. Enable specific sensor types as needed. + +### Recommended Intervals + +| Use Case | Device (s) | Environment (s) | +| ------------------------------------------ | ----------------------------- | ---------------------------------- | +| Urban mesh (many nodes) | 3600 | 3600 | +| Rural mesh (few nodes) | 900 | 900 | +| Weather station | 900 | 300 | +| Battery conservation | 7200 | 7200 | + +> ⚠️ **Note:** Shorter intervals increase airtime usage and battery drain across the mesh. + +## Viewing Telemetry + +1. Navigate to **Nodes** and select a node. +2. Telemetry sections show on the detail screen: + - Device Metrics (always available) + - Environment Metrics (if sensors present) + - Power Metrics (if INA sensor present) +3. Historical graphs show trends over time. + +![Telemetry actions](/assets/screenshots/node-metrics_telemetric_actions.png) + +## Troubleshooting + +- **No environment data showing?** The remote node needs a physical sensor connected (e.g., BME280 on I2C). Device telemetry (battery, uptime) is always available, but environment metrics require hardware. +- **Stale readings?** Check the reporting interval — very long intervals (7200s+) mean data updates infrequently. Also verify the remote node is still online. +- **Sensor conflict on I2C bus?** Some sensors share I2C addresses. If you have multiple sensors on the same bus, check for address collisions in the radio's serial debug output. + +## Related Topics + +- [Node Metrics](node-metrics) — view telemetry data on the node detail screen +- [Settings — Modules & Admin](settings-module-admin) — telemetry module configuration +- [Units & Locale](units-and-locale) — temperature and pressure display units + +--- + diff --git a/docs/ru-rRU/user/translate.md b/docs/ru-rRU/user/translate.md new file mode 100644 index 000000000..0bd3e1728 --- /dev/null +++ b/docs/ru-rRU/user/translate.md @@ -0,0 +1,96 @@ +--- +title: Перевод приложения +parent: Руководство пользователя +nav_order: 17 +last_updated: 2026-05-13 +aliases: + - translate + - crowdin + - localization +--- + +# Перевод приложения + +Внесение вклада в перевод помогает сделать Meshtastic доступным для более широкой аудитории. Приложение использует [Crowdin](https://crowdin.com/) для управления переводами сообщества как для пользовательского интерфейса, так и для документации в приложении. + +--- + +## Что переводится + +| Ресурс | Исходное местоположение | Заметки | +| --------------------------------- | ------------------------------------- | ------------------------------------------------------------------------ | +| Строки интерфейса | `composeResources/values/strings.xml` | Кнопки, ярлыки, сообщения и весь видимый пользователю текст | +| Страницы руководства пользователя | `docs/user/*.md` | Встроенная документация, отображаемая в разделе «Справка и документация» | +| Метаданные Fastlane | `fastlane/metadata/android/en-US/` | Название, описание и журналы изменений в App Store | + +> **Примечание — страницы руководства для разработчиков доступны только на английском языке.** Документация, ориентированная на код и предназначенная для контрибьюторов, не переводится. + +--- + +## Как внести вклад + +1. **Посетите проект Crowdin.** Откройте [проект Meshtastic Android на Crowdin](https://crowdin.com/project/meshtastic-android) и войдите в систему или создайте бесплатный аккаунт. +2. **Выберите свой язык.** Выберите существующий язык или запросите новый, открыв [GitHub issue](https://github.com/meshtastic/Meshtastic-Android/issues/new). +3. **Переводите строки.** Crowdin показывает английский исходный текст слева и ваш перевод справа. Переведите каждую строку и сохраните. +4. **Проверьте контекст.** Многие строки содержат скриншоты или комментарии о контексте — проверьте их, чтобы понять, где данный текст появляется в приложении. +5. **Отправьте.** Одобренные переводы автоматически включаются в следующий выпуск. + +> **Совет — делайте переводы короткими.** Строки интерфейса часто появляются на кнопках, ярлыках или в узких колонках. Если перевод значительно длиннее английского оригинала, рассмотрите возможность сокращения, чтобы смысл оставался понятным. + +--- + +## Добавление нового языка + +Если твоего языка еще нет в списке на Crowdin: + +1. Открой задачу на [GitHub](https://github.com/meshtastic/Meshtastic-Android/issues/new) для запроса нового языка. +2. Поддерживающий добавит язык в Crowdin и настроит `crowdin.yml`. +3. После добавления вы можете начать переводить сразу. + +--- + +## Как организованы переводы + +Приложение для Android использует **Compose Multiplatform resources** для всех строк, видимых пользователю: + +``` +core/resources/src/commonMain/composeResources/ +├── values/ ← English (default) +│ └── strings.xml +├── values-de/ ← German +│ └── strings.xml +├── values-fr/ ← French +│ └── strings.xml +└── ... +``` + +Встроенная документация следует аналогичной схеме в папке `docs/`: + +``` +├── user/ ← English source (default) +│ ├── onboarding.md +│ └── ... +├── fr/user/ ← French translations +│ ├── onboarding.md +│ └── ... +└── ... +``` + +Приложение автоматически выбирает правильную локаль на основе настроек **Язык и регион** вашего устройства. + +--- + +## Руководство по переводу + +- **Не переводите** технические термины, такие как "LoRa", "MQTT", "BLE", "TAK", "SNR" или "RSSI" — они универсальны. +- **Сохраняйте заполнители без изменений.** Строки, такие как `%1$s` или `%d`, заполняются во время выполнения. Не удаляйте и не меняйте их порядок, если только грамматика вашего языка не требует этого. +- **Согласуйте тон.** Приложение использует дружелюбный, прямой стиль общения. Избегайте чрезмерно официального языка. +- **Проверьте, если возможно.** Измените язык устройства и откройте приложение, чтобы увидеть, как переводы выглядят в контексте. + +--- + +## Вопросы? + +Если у вас есть вопросы о контексте конкретной строки или вам нужна помощь с началом работы, откройте обсуждение на странице [Meshtastic GitHub Discussions](https://github.com/meshtastic/Meshtastic-Android/discussions). + +Спасибо за помощь в расширении охвата Meshtastic! diff --git a/docs/ru-rRU/user/units-and-locale.md b/docs/ru-rRU/user/units-and-locale.md new file mode 100644 index 000000000..191fcbc98 --- /dev/null +++ b/docs/ru-rRU/user/units-and-locale.md @@ -0,0 +1,118 @@ +--- +title: Units, Measurement & Locale +parent: User Guide +nav_order: 16 +last_updated: 2026-05-12 +--- + +# Units, Measurement & Locale + +The Meshtastic app automatically displays temperatures, distances, speeds, and times in the units your device is configured to use — no settings to change inside the app. + +--- + +## How It Works + +Meshtastic radios always transmit data in **metric units** (meters, °C, km/h, hPa, etc.). When the app receives this data, it uses the `MetricFormatter` utility to convert and display values in whatever unit system your device's locale specifies. + +On Android, your measurement preferences are determined by your system **Language & Region** settings. On Desktop (JVM), the app uses the JVM's default `Locale`. + +> **Tip — You never need to toggle units inside the app.** Change your system measurement preferences and every screen in Meshtastic updates automatically — node details, telemetry charts, weather, altitude, and more. + +--- + +## Температура + +Temperature values from environment sensors are transmitted as **°C** and displayed based on your device's temperature unit preference. + +![Environment metrics with temperature](/assets/screenshots/nodes_environment_metrics.png) + +| Your Setting | You See | +| ------------ | ------- | +| Celsius | 22°C | +| Fahrenheit | 72°F | + +This affects all temperature displays throughout the app: node environment telemetry, soil temperature, dew point, and telemetry chart axes. + +## Distance & Altitude + +Distances between nodes and GPS altitudes are transmitted as **meters** and automatically scaled and converted. + +![Distance info display](/assets/screenshots/nodes_distance_info.png) + +| Your Setting | Small Distance | Large Distance | Высота | +| -------------------------------- | -------------- | ---------------------- | -------- | +| Metric | 350 m | 2.5 km | 1,200 m | +| Imperial (US) | 1,148 ft | 1.6 mi | 3,937 ft | + +The app uses natural scaling — short distances stay in meters or feet, while longer distances switch to kilometres or miles automatically. + +### Where these appear + +- **Node list** — distance and bearing to each node +- **Node detail** — altitude, distance from your position +- **Map** — waypoint distances, traceroute hop distances +- **Compass** — distance to selected node + +## Скорость + +GPS ground speed is displayed in your locale's preferred speed unit. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Metric | 12 km/h | +| Imperial (US) | 7 mph | + +## Ветер + +Wind speed and gust data from environment sensors are transmitted as **m/s** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Metric | 5 m/s | +| Imperial (US) | 11 mph | + +Wind readings appear in the **Node Detail** environment section and the **Environment Telemetry** charts. + +## Rainfall + +Rainfall measurements (1-hour and 24-hour totals) are transmitted as **mm** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ---------------------- | +| Metric | 12 mm | +| Imperial (US) | 0.5 in | + +## Units That Never Change + +Some units are international standards and are displayed the same way regardless of your locale: + +| Measurement | Unit | Why | +| -------------------------------- | ------------------------------ | ------------------------------------- | +| Barometric pressure | hPa | International meteorological standard | +| Heading / bearing | ° (degrees) | Universal navigation convention | +| Радиация | μR/hr | Standard dosimetry unit | +| GPS coordinates | decimal degrees | Universal geographic standard | +| Humidity, battery, soil moisture | % | Universal | + +## Date & Time + +All timestamps throughout the app — last heard, message times, telemetry logs, chart axes — follow your device's date and time preferences. + +| Setting | What It Controls | Example | +| ---------------- | ---------------- | ------------------------------------------------ | +| **24-Hour Time** | Clock format | 14:30 vs 2:30 PM | +| **Date Format** | Date ordering | 09/05/2026 vs 05/09/2026 | + +The app also uses **relative time** where it makes sense — for example, "5 min ago" or "2 hours ago" in the node list — which is automatically localised into your device language. + +## Changing Your Measurement System (Android) + +On Android, your measurement system (metric vs imperial) is tied to your region setting: + +1. Open **Android Settings → System → Language & Region** +2. Change your **Region** or **Measurement units** preference +3. Return to Meshtastic — values update immediately + +> **Tip — The app uses `MetricFormatter` from `core:common`.** All measurement formatting is handled by a shared KMP utility that respects your platform's locale. Developers adding new measurement displays should use `MetricFormatter` rather than hard-coding unit conversions. + diff --git a/docs/sk-rSK/index.md b/docs/sk-rSK/index.md new file mode 100644 index 000000000..99b032289 --- /dev/null +++ b/docs/sk-rSK/index.md @@ -0,0 +1,30 @@ +--- +title: Home +layout: default +nav_order: 0 +--- + +# Meshtastic Android App Documentation + +User and developer documentation for the Meshtastic Android, Desktop, and iOS applications powered by KMP (Kotlin Multiplatform). + +Use the sidebar navigation to browse the **User Guide** for app features and the **Developer Guide** for contributing to the project. + +--- + +## Quick Links + +| Guide | Popis | +| --------------------------------------------------------------------- | -------------------------------------------------------------- | +| [Getting Started](user/onboarding) | Connect your first radio and send a message | +| [Messages & Channels](user/messages-and-channels) | Channel broadcasts, direct messages, reactions, and encryption | +| [Nodes](user/nodes) | Understanding the mesh network node list | +| [Signal Meter](user/signal-meter) | How the LoRa signal quality meter works | +| [Units & Locale](user/units-and-locale) | How temperatures, distances, and times adapt to your region | +| [Desktop App](user/desktop) | Linux, macOS, and Windows desktop usage | +| [Architecture](developer/architecture) | App architecture overview for contributors | +| [Contributing](developer/contributing) | Branch naming, PR workflow, and verification commands | + +--- + +> This documentation is served from the same markdown source that powers the in-app **Help & Documentation** browser. diff --git a/docs/sk-rSK/user/connections.md b/docs/sk-rSK/user/connections.md new file mode 100644 index 000000000..56d01abf0 --- /dev/null +++ b/docs/sk-rSK/user/connections.md @@ -0,0 +1,125 @@ +--- +title: Connections +nav_order: 2 +last_updated: 2026-05-13 +description: Connect your phone or desktop to a Meshtastic radio via Bluetooth, USB, or TCP/IP. +aliases: + - bluetooth + - usb + - tcp + - pairing +--- + +# Connections + +Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node. + +## Bluetooth (BLE) + +Bluetooth Low Energy is the default and most common connection method on Android. + +### Pairing a Device + +1. Ensure your Meshtastic radio is powered on and in pairing mode. +2. Open the app and navigate to **Connections**. +3. Tap **Scan for Devices** — nearby Meshtastic radios will appear. +4. Select your device from the list. +5. Accept the Bluetooth pairing prompt if shown. + +![Device list item](/assets/screenshots/connections_bluetooth_scan.png) + +You can filter devices by transport type using the filter chips at the top: + +![Transport filter chips](/assets/screenshots/connections_transport_filters.png) + +> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. + +### Connection Status + +| Icon | State | Popis | +| ---- | ------------------- | -------------------------------- | +| 🟢 | Pripojený | Active radio link established | +| 🟡 | Prebieha pripájanie | Handshake in progress | +| 🔴 | Odpojené | No active connection | +| ⚪ | Not configured | Nebolo vybrané žiadne zariadenie | + +When connecting, a status indicator shows the current connection state: + +![Connecting status](/assets/screenshots/connections_connecting.png) + +If no devices are found, the app shows an empty state with instructions: + +![No devices found](/assets/screenshots/connections_empty_state.png) + +### Troubleshooting Bluetooth + +- **Device not found:** Toggle Bluetooth off/on, ensure location is enabled. +- **Connection drops:** Move closer to the radio; check for interference. +- **Pairing rejected:** Forget the device in Android Bluetooth settings and retry. + +## USB Serial + +USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable. + +### Setup + +1. Connect your radio via USB cable to your device. +2. The app will prompt for USB permission — tap **Allow**. +3. The connection is established automatically. + +> ⚠️ **Note:** USB connections require OTG support on Android devices. + +## TCP/IP (WiFi) + +Some Meshtastic radios support WiFi connectivity, allowing TCP-based connections. + +### Configuration + +1. Connect your radio to a WiFi network via the radio's web interface or settings. +2. In the app, go to **Connections → TCP**. +3. Enter the radio's IP address and port (default: 4403). +4. Tap **Connect**. + +![WiFi scanning for devices](/assets/screenshots/connections_wifi_scanning.png) + +When a device is found, it appears in the connection list: + +![WiFi device found](/assets/screenshots/connections_wifi_device_found.png) + +A successful connection is confirmed with a status indicator: + +![WiFi connection success](/assets/screenshots/connections_wifi_success.png) + +### When to Use TCP + +- Radio is on the same local network +- Testing with a simulated radio +- Environments where Bluetooth has interference issues + +## Reconnection Behavior + +The app reconnects to the **last selected device** on startup. You can manually switch transports from the connections screen at any time. + +To disconnect from a radio, use the disconnect button on the connections screen: + +![Disconnect from radio](/assets/screenshots/connections_disconnect.png) + +## Desktop Connections + +On Desktop (Linux/macOS/Windows), the app supports: + +- **Bluetooth (BLE)** — via the Kable library; works on macOS, Linux, and Windows +- **USB Serial** — primary wired connection method +- **TCP/IP** — for network-connected radios + +See [Desktop App](desktop) for platform-specific details and keyboard shortcuts. + +## Related Topics + +- [Getting Started](onboarding) — first-launch setup and permissions +- [Settings — Radio & User](settings-radio-user) — Bluetooth and network configuration +- [Desktop App](desktop) — desktop-specific connection details +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — full list of compatible radios on meshtastic.org + +--- + diff --git a/docs/sk-rSK/user/desktop.md b/docs/sk-rSK/user/desktop.md new file mode 100644 index 000000000..265761118 --- /dev/null +++ b/docs/sk-rSK/user/desktop.md @@ -0,0 +1,147 @@ +--- +title: Desktop App +nav_order: 14 +last_updated: 2026-05-13 +description: Install and use the Meshtastic Desktop app on Linux, macOS, and Windows — connections, feature parity, and keyboard shortcuts. +aliases: + - desktop + - linux + - macos + - windows + - jvm +--- + +# Desktop App + +The Meshtastic Desktop application provides the same mesh communication features on Linux, macOS, and Windows. + +## Overview + +The Desktop app shares its core codebase with the Android app through Kotlin Multiplatform (KMP). Most features work identically across platforms. + +## Installation + +### Linux + +- Download the `.deb` or `.AppImage` package from the releases page +- Or build from source using `./gradlew :desktopApp:run` + +### macOS + +- Download the `.dmg` package from releases +- Or build from source + +### Windows + +- Download the `.msi` installer from releases +- Or build from source + +## Connecting Your Radio + +### USB Serial (Primary) + +The most reliable connection method on Desktop: + +1. Connect your Meshtastic radio via USB cable. +2. The app should detect the serial port automatically. +3. If not detected, select the correct serial port from the connections menu. + +### TCP/IP + +For network-connected radios: + +1. Enter the radio's IP address and port (default: 4403). +2. Click **Connect**. + +### Bluetooth (BLE) + +Bluetooth Low Energy is supported on Desktop via the [Kable](https://github.com/JuulLabs/kable) library: + +1. Ensure your system has a Bluetooth adapter. +2. The app scans for nearby Meshtastic radios automatically. +3. Select your device from the connections screen. + +## Feature Parity + +| Feature | Android | Desktop | Notes | +| ---------------------------------------- | ------- | ------- | -------------------------- | +| Messaging | ✓ | ✓ | Full parity | +| Node List | ✓ | ✓ | Full parity | +| Mapa | ✓ | ✓ | Full parity | +| Nastavenia | ✓ | ✓ | Full parity | +| Bluetooth (BLE) | ✓ | ✓ | Via Kable on desktop | +| Firmware Update OTA | ✓ | ✗ | Use web flasher | +| Notifications | ✓ | ✓ | Native OS notifications | +| Widgets | ✓ | ✗ | Android-only | +| AI Assistant (Chirpy) | ✓\* | ✗ | Google flavor Android only | + +\*Chirpy AI requires Android 14+ on Google flavor builds with supported hardware. + +## UI Differences + +The Desktop app uses the same Compose Multiplatform UI with adaptations for larger screens and desktop interaction. + +### Keyboard Shortcuts + +| Shortcut | Action | +| ------------------- | --------------------------- | +| **⌘Q** / **Ctrl+Q** | Quit the application | +| **⌘,** / **Ctrl+,** | Open Settings | +| **⌘1** / **Ctrl+1** | Switch to Conversations tab | +| **⌘2** / **Ctrl+2** | Switch to Nodes tab | +| **⌘3** / **Ctrl+3** | Switch to Map tab | +| **⌘4** / **Ctrl+4** | Switch to Connections tab | + +### Window & System Tray + +- **Window resizing** — responsive layout adapts to window dimensions +- **System tray** — minimize to system tray for background mesh operation +- **Tray menu** — right-click the tray icon to show window or quit +- **Mouse interaction** — hover states and standard desktop navigation + +### Notification Preferences + +The Desktop app provides in-app toggles for controlling which notifications are shown — messages, new nodes, and low battery alerts. Access these from **Settings → Notifications** within the app. + +## Built-in Documentation Browser + +The Desktop app includes a built-in documentation browser for quick access to help content without leaving the application. + +![Docs browser with table of contents](/assets/screenshots/docs-browser_toc.png) + +The browser supports full-text search across all documentation: + +![Searching the docs browser](/assets/screenshots/docs-browser_search.png) + +Individual doc pages render with full formatting: + +![A documentation page](/assets/screenshots/docs-browser_page.png) + +## Building from Source + +```bash +git clone https://github.com/meshtastic/Meshtastic-Android.git +cd Meshtastic-Android +git submodule update --init +./gradlew :desktopApp:run +``` + +Requirements: + +- JDK 21 +- No Android SDK required for desktop-only builds + +## Known Limitations + +- No OTA firmware updates (use web flasher) +- Some Android-specific features (widgets, specific notification channels) are unavailable +- Performance may vary on low-spec hardware running Compose Desktop +- BLE bonding is not yet supported on desktop (pairing works without bonding) + +## Related Topics + +- [Connections](connections) — connection methods overview +- [Firmware Updates](firmware) — use the [Web Flasher](https://flasher.meshtastic.org) for desktop firmware updates + +--- + diff --git a/docs/sk-rSK/user/discovery.md b/docs/sk-rSK/user/discovery.md new file mode 100644 index 000000000..d4effed7f --- /dev/null +++ b/docs/sk-rSK/user/discovery.md @@ -0,0 +1,114 @@ +--- +title: Discovery +nav_order: 12 +last_updated: 2026-05-13 +description: Explore your mesh network — traceroute paths, neighbor maps, and node discovery tools. +aliases: + - mesh-discovery + - local-discovery + - network-scan + - traceroute + - neighbor-info +--- + +# Discovery + +Discovery tools help you understand **how** your mesh network is connected — which nodes can hear each other, what paths messages take, and where bottlenecks or weak links exist. + +> 💡 **Tip:** You don't need a dedicated "discovery mode" to start exploring your mesh. The tools below are available right now from the node list and node detail screens. + +--- + +## Trasovanie + +Traceroute reveals the exact path a message takes from your node to any other node on the mesh. It's the single most useful tool for debugging connectivity problems. + +### Running a Traceroute + +1. Navigate to **Nodes** and tap the node you want to trace. +2. On the node detail screen, tap **Traceroute**. +3. The app sends a traceroute request and waits for the response. +4. Results display each hop in order, with signal quality at every step. + +### Reading the Results + +A traceroute result looks like this: + +``` +You → Node A (SNR: 8.5, RSSI: -95) → Node B (SNR: 5.2, RSSI: -108) → Target +``` + +Each hop represents a relay node that forwarded the message. The SNR and RSSI values at each hop tell you about the link quality on that specific segment. + +| What to look for | What it means | +| -------------------------------------------------------------------------- | --------------------------------------------------------------------------- | +| All hops show Good SNR (> 5 dB) | Healthy path — messages flow reliably | +| One hop shows Bad SNR (< 0 dB) | Weak link — this relay segment is fragile | +| Many hops (4+) | Long path — consider repositioning a node to shorten it | +| Different path on retry | Mesh is adapting — multiple routes exist (this is good!) | + +> 💡 **Tip:** Run traceroute several times over a few minutes. If the path changes, your mesh has redundant routes — a sign of a well-connected network. + +### Troubleshooting with Traceroute + +- **"No route found"** — The target node may be offline, out of range, or on a different channel. Check that both nodes share at least one channel with the same encryption key. +- **Traceroute times out** — The path may be too long (exceeds hop limit) or a relay node is congested. Try increasing the hop limit in **Settings → LoRa Config**. +- **Asymmetric paths** — A traceroute from A→B may take a different path than B→A. This is normal — radio propagation is not always symmetric. + +--- + +## Informácia o susedoch + +The Neighbor Info module lets each node broadcast a list of the nodes it can **directly hear** (single-hop). When multiple nodes share their neighbor lists, you can piece together a topology map of the entire mesh. + +### Enabling Neighbor Info + +1. Navigate to **Settings → Module Config → Neighbor Info**. +2. Enable the module. +3. Set the broadcast interval (default: 900 seconds / 15 minutes). + +Once enabled, your node periodically broadcasts its neighbor table. Other nodes with Neighbor Info enabled do the same. + +### Viewing Neighbor Data + +- Open any node's detail screen and look for the **Neighbors** section. +- Each neighbor entry shows the node that was directly heard and its signal quality. +- Combine neighbor data from multiple nodes to understand the full mesh topology. + +> ⚠️ **Note:** Neighbor Info increases airtime usage because every enabled node periodically broadcasts its neighbor list. On busy meshes with many nodes, consider longer broadcast intervals (3600 seconds or more) to avoid congestion. + +--- + +## Node List as a Discovery Tool + +The node list itself is a powerful discovery tool when you use its filtering and sorting features effectively. + +### Finding New Nodes + +- Sort by **Last heard** to see the most recently active nodes at the top. +- Enable **Include unknown** to see nodes that have appeared on the mesh but haven't sent user info yet — these are often newly powered-on devices. + +### Assessing Connectivity + +- Sort by **Hops away** to see which nodes are directly reachable (0 hops) versus relayed. +- Sort by **Distance** to find nearby nodes and verify they're reachable. +- Use **Exclude MQTT** to focus on nodes reachable over radio (not via internet bridge). + +### Infrastructure Audit + +- Disable **Exclude infrastructure** to see Router, Repeater, Router Late, and Client Base nodes. +- Check their signal quality and last-heard times to verify your infrastructure nodes are healthy. + +See [Nodes](nodes) for full details on filtering and sorting options. + +--- + +## Tips for Mesh Exploration + +- **Start with traceroute** — it gives you immediate, actionable information about a specific path. +- **Enable Neighbor Info on key nodes** — especially routers and repeaters, to build a picture of the backbone. +- **Check the map** — node positions on the [Map](map-and-waypoints) combined with signal data help you understand why some links are strong and others are weak. +- **Compare signal over time** — use the [Signal Meter](signal-meter) guide to interpret SNR and RSSI values correctly. + +--- + diff --git a/docs/sk-rSK/user/firmware.md b/docs/sk-rSK/user/firmware.md new file mode 100644 index 000000000..367dc8548 --- /dev/null +++ b/docs/sk-rSK/user/firmware.md @@ -0,0 +1,114 @@ +--- +title: Firmware Updates +nav_order: 13 +last_updated: 2026-05-13 +description: Update your radio firmware over Bluetooth — OTA process, version channels, pre-flight checks, and recovery. +aliases: + - firmware + - update + - ota + - flash +--- + +# Firmware Updates + +Keep your Meshtastic radio up to date with the latest firmware for new features, bug fixes, and security improvements. + +## Checking for Updates + +1. Navigate to **Settings → Firmware Update** or tap the firmware notification if shown. +2. The app checks for available firmware versions. +3. Available updates show the version number and changelog summary. + +## Update Methods + +### OTA (Over-The-Air) via Bluetooth + +The most common update method for Android users: + +1. Ensure your radio is connected via Bluetooth. +2. Navigate to the Firmware Update screen. +3. Select the desired firmware version. +4. Tap **Update** to begin the OTA process. +5. Wait for the update to complete — **do not disconnect** during the update. + +![Firmware checking for updates](/assets/screenshots/firmware_checking.png) + +> ⚠️ **Warning:** Interrupting a firmware update can brick your device. Ensure your radio has sufficient battery (>50% recommended) and maintain Bluetooth proximity during the entire process. + +![Firmware disclaimer](/assets/screenshots/firmware_disclaimer.png) + +### USB Flashing + +For recovery or when OTA is unavailable: + +- Use the [Meshtastic Web Flasher](https://flasher.meshtastic.org) +- Or the [Meshtastic CLI tool](https://meshtastic.org/docs/getting-started/flashing-firmware) on desktop + +## Version Channels + +| Kanál | Popis | +| ------ | ------------------------------------------- | +| Stable | Recommended for most users; tested releases | +| Alpha | Preview releases; may contain bugs | + +## Pre-Update Checklist + +Before updating: + +- [ ] Battery > 50% +- [ ] Stable Bluetooth connection +- [ ] Note your current settings (they may reset on major version changes) +- [ ] Check the release notes for breaking changes + +## Post-Update + +After a successful update: + +- The radio will reboot automatically +- Bluetooth connection will re-establish +- Verify your settings are intact +- Check the firmware version in **Settings → About** + +![Firmware update success](/assets/screenshots/firmware_success.png) + +## Troubleshooting + +### Update Stuck + +If the update appears frozen: + +- Wait at least 5 minutes before intervening +- If truly stuck, power-cycle the radio +- Attempt the update again + +![Firmware update error](/assets/screenshots/firmware_error.png) + +### Device Won't Boot After Update + +If your device fails to boot: + +1. Try connecting via USB to a computer +2. Use the web flasher in recovery/DFU mode +3. Flash a known-good firmware version +4. Check the Meshtastic Discord for device-specific recovery steps + +### Compatibility Warnings + +The app may show warnings when: + +- Connected radio firmware is below minimum supported version +- Major version mismatch between app and firmware +- Deprecated features need migration + +> ⚠️ **Important:** Always update the Meshtastic app before or alongside firmware updates to ensure compatibility. + +## Related Topics + +- [Connections](connections) — reconnecting after a firmware update +- [Flashing firmware guide](https://meshtastic.org/docs/getting-started/flashing-firmware) — full firmware flashing walkthrough on meshtastic.org +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — check firmware compatibility by device +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/sk-rSK/user/map-and-waypoints.md b/docs/sk-rSK/user/map-and-waypoints.md new file mode 100644 index 000000000..a414b3796 --- /dev/null +++ b/docs/sk-rSK/user/map-and-waypoints.md @@ -0,0 +1,116 @@ +--- +title: Map & Waypoints +nav_order: 6 +last_updated: 2026-05-13 +description: View node positions on the map, create and share waypoints, and manage position sharing and privacy. +aliases: + - map + - waypoints + - gps + - location +--- + +# Map & Waypoints + +The Map screen shows the geographic positions of nodes on your mesh, along with shared waypoints. + +## Map View + +The map displays: + +- **Node positions** — colored markers for each node reporting location +- **Waypoints** — shared points of interest +- **Your position** — your current GPS location + +### Node Markers + +Node markers on the map indicate: + +| Color | Meaning | +| ------ | ---------------------------------------------- | +| Zelená | Online (heard recently) | +| Yellow | Away (heard within 2 hours) | +| Gray | Offline (stale position) | +| Modrá | Your own node | + +### Map Controls + +- **Zoom** — pinch or use +/- buttons +- **Pan** — drag to explore +- **Center** — select the location button to center on your position +- **Node tap** — tap a node marker to view details + +The floating toolbar provides quick access to compass, layer switching, node filters, refresh, and location tracking. Tap the compass to reorient north-up, or tap the location button to center on your current position. + +![Map controls overlay](/assets/screenshots/map_controls_overlay.png) + +## Waypoints + +Waypoints are shared geographic points of interest that all mesh members can see. + +### Creating a Waypoint + +1. Long-press on the map at the desired location. +2. Enter a name and optional description. +3. Choose an icon/emoji for the waypoint. +4. Tap **Send** to share with the mesh. + +### Waypoint Properties + +| Property | Popis | +| ---------- | ------------------------------------------------------- | +| Názov | Short identifier (max 30 characters) | +| Popis | Optional longer description | +| Icon | Visual marker emoji on the map | +| Zamknuté | If locked, only the creator can edit or delete | +| Expiration | Optional auto-remove time | + +### Waypoint Expiration + +Waypoints can be set to expire automatically: + +- **Never** (default) — waypoint remains until manually deleted +- **Timed** — waypoint is automatically removed after the specified duration (e.g., "remove after 2 hours"). Useful for temporary markers like rally points, hazards, or meeting locations. + +Expired waypoints are automatically hidden from the map so they don't clutter the display. The expiration countdown begins when the waypoint is created, not when other nodes receive it. + +### Managing Waypoints + +- Tap a waypoint on the map to view its details and coordinates +- Edit or delete waypoints you created +- **Locked waypoints** cannot be modified or deleted by other nodes — only the original creator can change them +- Unlocked waypoints can be edited by any mesh member + +## Position Sharing + +### Enabling Position Sharing + +Your node shares its GPS position based on: + +- **Fixed interval** — broadcast position at regular intervals +- **Smart position** — broadcast when movement exceeds a threshold +- **Manual** — only share when explicitly requested + +Configure position behavior in **Settings → Position**. + +### Privacy Considerations + +> 🔒 **Privacy:** Position data is broadcast to all nodes on your channel. If you don't want your location shared, disable GPS position in settings or use a fixed/fake position. + +## Map Sources + +The app supports multiple map tile sources: + +- OpenStreetMap (default) +- Satellite imagery (where available) +- Offline tiles (download map areas for offline use) + +## Related Topics + +- [Nodes](nodes) — view and filter your node list +- [Node Metrics](node-metrics) — signal quality and position history for individual nodes +- [Discovery](discovery) — traceroute and neighbor info for understanding mesh topology +- [Units & Locale](units-and-locale) — distance and coordinate display formats + +--- + diff --git a/docs/sk-rSK/user/messages-and-channels.md b/docs/sk-rSK/user/messages-and-channels.md new file mode 100644 index 000000000..eda0696f3 --- /dev/null +++ b/docs/sk-rSK/user/messages-and-channels.md @@ -0,0 +1,159 @@ +--- +title: Messages & Channels +nav_order: 3 +last_updated: 2026-05-13 +description: Send and receive messages, manage channels, configure encryption, and use quick chat, reactions, and message actions. +aliases: + - channels + - direct-messages + - messaging + - conversations +--- + +# Messages & Channels + +Meshtastic supports two communication modes: **channel broadcasts** and **direct messages**. + +## Kanále + +Channels are shared communication groups. All nodes configured with the same channel key can read and send messages on that channel. + +### Default Channel + +Every Meshtastic device comes with a default **LongFast** channel. This is an unencrypted channel used for general mesh communication. + +### Channel Security + +Channels support multiple encryption levels: + +| Icon | Security Level | Popis | +| ---- | ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------- | +| 🔒 | PSK (256-bit AES) | Fully encrypted with a strong pre-shared key. Only nodes with the matching key can read messages. | +| 🔐 | PSK (128-bit AES) | Encrypted with a shorter key. Secure for most uses but 256-bit is preferred for sensitive data. | +| 🔓 | Default / Open | Uses the well-known default key. **Any Meshtastic device** on the same preset can read these messages. | +| ⚠️ | Insecure + Position | Open channel that also broadcasts your GPS position. Use with caution in public meshes. | + +> 🔒 **Security Tip:** 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. + +### Adding a Channel + +1. Navigate to **Settings → Channels**. +2. Tap **Add Channel** or scan a QR code. +3. Configure the channel name and encryption key. +4. Share the channel URL/QR code with others who need access. + +Tapping a channel shows its details and sharing options. + +## Direct Messages + +Direct messages (DMs) are point-to-point encrypted communications between two specific nodes. + +### Sending a Direct Message + +1. Open the **Messages** tab. +2. Select a node from your contacts list or tap a node in the node list. +3. Type your message and tap **Send**. + +### Message States + +| State | Icon | Meaning | +| --------------------------------- | ---- | ----------------------------------------------------------------------------------------------------------------- | +| Queued | ⏳ | Message waiting to be sent | +| En route | ✓ | Delivered to the radio, awaiting acknowledgment | +| Delivered | ✓✓ | Acknowledgment received from recipient | +| Received | ✓ | Message received from the mesh (incoming) | +| S&F Routing | 🔗 | Store & Forward: message being routed through an S&F node | +| S&F Confirmed | 🔗 | Store & Forward: delivery confirmed via S&F node | +| Chyba | ✗ | Delivery failed after retries | + +### Delivery Errors + +When a message fails to deliver, the error indicator shows what went wrong: + +| Chyba | Meaning | What to Do | +| -------------------- | ---------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| No Route | No path exists to the destination node | The recipient may be offline or out of mesh range. Try later or move closer. | +| Got NAK | The next-hop node refused to relay | The relay node may be congested. Wait and retry. | +| Časový limit | No acknowledgment within retry window | The recipient may be just out of range. Try increasing hop limit or moving to a better position. | +| Žiadne rozhranie | No radio interface available to send | Check that your radio is connected and the channel is configured. | +| Max Retransmit | All retry attempts exhausted | The mesh path is unreliable. Try a different channel or wait for conditions to improve. | +| Žiaden kanál | The destination channel doesn't exist | Verify both nodes share the same channel configuration. | +| Too Large | Message exceeds maximum payload size | Shorten your message (max ~230 characters). | +| No Response | Node received message but didn't respond | The recipient's radio may be busy or in low-power sleep mode. | +| Duty Cycle Limit | Regional airtime limit reached | Your radio has used its allowed transmit time. Wait for the duty cycle window to reset (typically 1 hour in EU regions). | +| Nesprávna požiadavka | Malformed or invalid message | This usually indicates a software bug. Try restarting the app. | + +> 💡 **Tip:** 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. + +## Message Features + +### Quick Chat + +Pre-configured messages for rapid communication: + +- Access via the Quick Chat button in the message input area +- Choose from built-in phrases or custom messages +- Customize quick chat messages in **Settings → Quick Chat** +- Useful when typing is impractical (gloves, small screen, urgent) + +![Quick chat option](/assets/screenshots/messages_quick_chat.png) + +The channel list shows each channel with its latest message preview. + +### Message Bubbles + +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. + +### Reactions + +React to messages with emoji: + +- **Long-press** a message to open the actions menu +- Tap **Add Reaction** to choose an emoji +- Reactions appear below the message bubble +- Multiple users can react to the same message +- React to your own messages or others' messages + +![Emoji reaction badges displayed beneath a message](/assets/screenshots/messages_reaction.png) + +> 💡 **Tip:** Reactions are lightweight — they use minimal mesh bandwidth compared to full text messages. + +### Message Actions + +Long-press any message to access: + +- **Copy** — copy message text to clipboard +- **Reply** — quote the message in your response +- **React** — add an emoji reaction +- **Delete** — remove a message you sent (local deletion) + +### Message Priority + +Messages are queued and transmitted based on priority: + +1. Emergency/alert messages (highest) +2. Direct messages +3. Channel broadcasts (lowest) + +### Message Limits + +- **Maximum length:** 237 bytes (approximately 230 characters for ASCII text) +- **Rate limiting:** The mesh enforces airtime fairness; heavy message volume may be throttled +- **Delivery:** Messages are retried automatically if no acknowledgment is received + +## Best Practices + +- Use channels for group coordination +- Use direct messages for private person-to-person communication +- Keep messages short — mesh bandwidth is limited +- Configure encryption for sensitive communications + +## Related Topics + +- [Nodes](nodes) — tap a node to start a direct message +- [Settings — Radio & User](settings-radio-user) — configure channel encryption and presets +- [MQTT](mqtt) — bridge channel messages to the internet +- [Channel configuration](https://meshtastic.org/docs/configuration/radio/channels) — detailed channel settings on meshtastic.org + +--- + diff --git a/docs/sk-rSK/user/mqtt.md b/docs/sk-rSK/user/mqtt.md new file mode 100644 index 000000000..6f42e389c --- /dev/null +++ b/docs/sk-rSK/user/mqtt.md @@ -0,0 +1,137 @@ +--- +title: MQTT +nav_order: 11 +last_updated: 2026-05-13 +description: Bridge your mesh to the internet — MQTT broker setup, encryption layers, and map reporting. +aliases: + - mqtt + - internet-bridge + - broker +--- + +# MQTT + +MQTT bridges your Meshtastic mesh network to the internet, enabling long-range communication beyond radio range. + +## Overview + +The MQTT module connects your node to an MQTT broker, allowing: + +- Messages to reach nodes on different physical meshes via the internet +- Integration with home automation and monitoring systems +- Publishing node positions to the public Meshtastic map +- Custom data pipelines for logging and alerting + +## How It Works + +``` +[Your Node] → Radio → [Gateway Node with WiFi] → MQTT Broker → [Remote Gateway] → Radio → [Remote Node] +``` + +A gateway node with internet access (WiFi or Ethernet) publishes mesh messages to an MQTT topic. Remote gateways subscribed to the same topic inject those messages into their local mesh. + +## Configuration + +### Enabling MQTT + +1. Navigate to **Settings → Module Config → MQTT**. +2. Enable the MQTT module. +3. Configure the broker connection: + +![MQTT toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | Popis | Predvolené | +| ------------------ | --------------------------------------------------------------------------------------------- | --------------------------------------------------- | +| Server Address | MQTT broker hostname | mqtt.meshtastic.org | +| Používateľské meno | Broker authentication | meshdev | +| Heslo | Broker authentication | large4cats | +| Root Topic | Base topic for messages | msh | +| Encryption | Encrypt MQTT payload | Enabled | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON packet support has been removed from firmware; this field is ignored | Disabled | +| TLS | Secure connection to broker | Disabled | +| Map Reporting | Report position to public map | Disabled | + +### Default Meshtastic Broker + +The community maintains a public broker at `mqtt.meshtastic.org`. This is intended for general use and testing. + +> 🔒 **Privacy:** Messages on the public broker are readable by anyone subscribed. Always use channel encryption for private communications. + +### Private Broker + +For better privacy and control, you can run your own MQTT broker: + +- Mosquitto (lightweight, open-source) +- HiveMQ +- EMQX + +Configure your node to point to your private broker with appropriate credentials. + +## Map Reporting + +When Map Reporting is enabled, your node publishes its position to the Meshtastic community map: + +- Visible at [meshmap.net](https://meshmap.net) and similar community map services +- Only position and node info are shared +- Disable this if you don't want your location publicly visible + +## Uplink vs Downlink + +| Direction | Popis | +| ------------ | -------------------------------- | +| **Uplink** | Messages from mesh → MQTT broker | +| **Downlink** | Messages from MQTT broker → mesh | + +Configure per-channel which directions are active to control message flow and airtime usage. + +## Message Formats + +MQTT uses protobuf message format: + +| Format | Popis | Use case | +| ------------ | ----------------------------------- | -------------------------- | +| **Protobuf** | Binary Meshtastic protobuf encoding | Node-to-node mesh bridging | + +> ⚠️ **Note:** JSON output support was removed from firmware. The `json_enabled` setting is still visible in the app for legacy compatibility but has no effect on current firmware versions. + +## Encryption & Privacy + +Understanding the layered encryption model: + +1. **Channel encryption** happens on the mesh _before_ MQTT. If your channel has a PSK, the MQTT payload is already encrypted — the broker and any subscribers see only the ciphertext. +2. **MQTT encryption** (the module setting) adds an additional encryption layer for transit to the broker. This protects metadata and routing information. +3. **TLS** encrypts the TCP connection to the broker itself, preventing network-level eavesdropping. + +> 🔒 **Important:** The default public channel has a well-known key. Messages on the default channel sent via MQTT are effectively **unencrypted** — anyone can decode them. Always use a custom PSK for private communications. + +## Best Practices + +- Use channel-level encryption (PSK) on channels that bridge to MQTT +- Don't enable MQTT on nodes without internet access (it will buffer and waste memory) +- Use a private broker for sensitive deployments +- Be mindful of airtime when downlinking messages from busy MQTT topics — every downlinked message consumes radio airtime on your local mesh +- Consider enabling uplink-only if you only need to monitor your mesh remotely without injecting messages back + +## Troubleshooting + +### MQTT Not Connecting + +- **Check WiFi** — the gateway node must have an active internet connection (WiFi or Ethernet). MQTT does not work over the LoRa radio link itself. +- **Verify credentials** — incorrect username or password will silently fail on most brokers. Double-check for trailing spaces. +- **Firewall** — port 1883 (MQTT) or 8883 (MQTT+TLS) must be open. Some networks block non-standard ports. +- **DNS resolution** — if using a custom broker hostname, verify the node can resolve it. Try the broker's IP address directly. + +### Messages Not Bridging + +- **Check uplink/downlink settings** — if only uplink is enabled, messages flow from mesh to MQTT but not back. Enable downlink on the receiving gateway. +- **Channel mismatch** — both gateways must share the same channel with the same PSK. A mismatch means messages are encrypted with different keys and appear as garbage. +- **Topic mismatch** — ensure both gateways use the same root topic. The default `msh` works for the public broker. + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — MQTT module configuration reference +- [Messages & Channels](messages-and-channels) — channel encryption and PSK setup +- [MQTT integration guide](https://meshtastic.org/docs/software/integrations/mqtt) — detailed MQTT documentation on meshtastic.org + +--- + diff --git a/docs/sk-rSK/user/node-metrics.md b/docs/sk-rSK/user/node-metrics.md new file mode 100644 index 000000000..76a0757c3 --- /dev/null +++ b/docs/sk-rSK/user/node-metrics.md @@ -0,0 +1,130 @@ +--- +title: Node Metrics +nav_order: 5 +last_updated: 2026-05-13 +description: Telemetry dashboards for each mesh node — device health, environment sensors, signal quality, power, traceroute, and position history. +aliases: + - metrics + - telemetry + - device-metrics + - signal +--- + +# Node Metrics + +The node detail screen provides comprehensive telemetry and metrics for each node on your mesh. + +## Device Metrics + +Basic operating information reported by each node: + +| Metric | Popis | +| --------------- | ----------------------------------- | +| Battery Level | Current battery percentage | +| Napätie | Battery voltage reading | +| Využitie kanálu | Percentage of airtime consumed | +| Airtime | Transmission time used by this node | +| Doba prevádzky | Time since last reboot | + +Device metrics are displayed as individual cards with trend sparklines showing battery level, voltage, channel utilization, airtime, and uptime over time. + +> 💡 **Tip:** Tap any metric card to expand it into a full chart with historical data points. Pinch to zoom the time axis. + +## Environment Metrics + +Environmental sensor data (requires compatible hardware): + +| Metric | Sensor Examples | +| ------------------------------------ | --------------------- | +| Teplota | BME280, BME680, SHT31 | +| Vlhkosť | BME280, BME680, SHT31 | +| Barometrický tlak | BME280, BMP280 | +| Gas Resistance | BME680 | +| IAQ (Air Quality) | BME680 | + +Environment metrics are charted over time for easy trend analysis — temperature, humidity, and pressure each get their own line chart with the measurement unit displayed on the Y axis. + +> 💡 **Tip:** Environment metrics require a sensor connected to the remote node. Not all nodes report environmental data. See [Telemetry & Sensors](telemetry-and-sensors) for a full list of supported sensors. + +## Signal Metrics + +Radio signal quality information: + +| Metric | Popis | +| --------- | ----------------------------------------------------------------------------- | +| SNR | Signal-to-Noise Ratio (higher is better) | +| RSSI | Received Signal Strength Indicator (closer to 0 is better) | +| Hop Count | Number of mesh hops for last message | + +### Signal Quality Reference + +| SNR Range | Quality | +| --------------------------------- | --------- | +| > 10 dB | Excellent | +| 0 to 10 dB | Dobrý | +| -10 to 0 dB | Primeraný | +| < -10 dB | Poor | + +## Power Metrics + +Power management telemetry (requires INA sensor or compatible hardware): + +| Metric | Popis | +| ----------- | ----------------------- | +| Bus Voltage | Supply voltage | +| Prúd | Power draw in milliamps | +| Napájanie | Calculated wattage | + +## Trasovanie + +Traceroute shows the path a message takes through the mesh: + +1. From the node detail screen, tap **Traceroute**. +2. The app sends a traceroute request to the target node. +3. Results show each hop with SNR/RSSI values. + +### Reading Traceroute Results + +``` +You → Node A (SNR: 8.5) → Node B (SNR: 5.2) → Target +``` + +Each hop represents a relay node that forwarded the message. + +## Log pozície + +Historical position data for nodes that share their location: + +- GPS coordinates +- Nadmorská výška +- Speed (if moving) +- Timestamp for each position report + +## Informácia o susedoch + +Shows which nodes a given node can directly hear, useful for understanding mesh topology. + +## Viewing Metrics + +1. Navigate to **Nodes**. +2. Tap the node you want to inspect. +3. Select the metric category from the detail tabs. + +![Node detail — local device](/assets/screenshots/nodes_detail_local.png) + +The position tab shows location data for nodes that share GPS: + +![Position inline content](/assets/screenshots/nodes_position.png) + +> ⚠️ **Note:** Metrics are only available when they have been reported by the remote node. Metrics update at intervals configured on each node's telemetry settings. + +## Related Topics + +- [Nodes](nodes) — node list, filtering, and sorting +- [Telemetry & Sensors](telemetry-and-sensors) — supported sensors and configuration +- [Signal Meter](signal-meter) — how signal quality is calculated from SNR and RSSI +- [Discovery](discovery) — traceroute details and neighbor info +- [Units & Locale](units-and-locale) — temperature, distance, and speed display formats + +--- + diff --git a/docs/sk-rSK/user/nodes.md b/docs/sk-rSK/user/nodes.md new file mode 100644 index 000000000..4ed2f0d17 --- /dev/null +++ b/docs/sk-rSK/user/nodes.md @@ -0,0 +1,152 @@ +--- +title: Nodes +nav_order: 4 +last_updated: 2026-05-13 +description: Browse, filter, and sort mesh nodes — view details, signal quality, roles, and quick actions. +aliases: + - node-list + - mesh-nodes + - peers +--- + +# Nodes + +The Nodes screen displays all devices visible on your mesh network. + +## Node List + +The node list shows every node your radio has heard, including: + +- **Node name** — user-configured long name +- **Short name** — 4-character identifier +- **Signal quality** — last heard signal strength +- **Last heard** — time since last communication +- **Distance** — estimated distance (if positions are shared) +- **Battery** — remote node battery level (if telemetry is enabled) + +### Node Status Indicators + +| Badge | Meaning | +| ---------- | ------------------------------------- | +| 🟢 Online | Node heard within the last 15 minutes | +| 🟡 Away | Node heard within the last 2 hours | +| 🔴 Offline | Node not heard for over 2 hours | +| ⭐ Favorite | Node marked as favorite by the user | + +### Node Roles + +Nodes can be configured with different roles that affect their mesh behavior: + +| Rola | Popis | +| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Klient | Standard end-user device | +| Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | +| Stlmený Klient | Receives but doesn't retransmit | +| Skrytý Klient | Like Client Mute, plus hides from node list | +| Smerovač | Prioritizes message forwarding; stays awake to relay | +| Smerovač s Oneskorením | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | +| ~~Router Client~~ | ⚠️ **Deprecated** (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | +| ~~Repeater~~ | ⚠️ **Deprecated** (removed in firmware 2.7.11) — no longer selectable; use Router instead | +| Sledovač | Optimized for position reporting at regular intervals | +| Senzor | Optimized for telemetry reporting | +| TAK | Interoperates with TAK systems (sends/receives CoT) | +| TAK Sledovač | TAK position reporting only | +| Lost & Found | Continuous position beacon for recovery | + +### Choosing a Role + +Most users should keep the default **Client** role. Consider a different role when: + +- **Router** — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don't use Router on battery-powered handheld devices. +- **Router Late** — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. +- **Client Base** — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. +- **Client Mute** — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only devices or to reduce congestion in dense areas. +- **Tracker** — An unattended device whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. +- **Sensor** — An unattended device reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. +- **TAK / TAK Tracker** — Only needed if interoperating with ATAK/WinTAK systems. See [TAK Integration](tak) for details. + +> 💡 **Tip:** The mesh works best when most nodes are **Client** or **Router**. Too many Mute nodes reduces mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. + +### Encryption Indicators + +Nodes display encryption status icons next to their name: + +| Icon | Meaning | +| ----------- | ------------------------------------------------------------------------------------------------------------------- | +| 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | +| 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | +| ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) | + +> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. + +## Quick Actions + +From the node list, you can: + +- **Tap** a node to view its detail page +- **Long-press** for quick actions: + - Send a direct message + - View on map + - Požiadať o pozíciu + - Mark as favorite + - Trasovanie + +## Filtering & Sorting + +### Text Search + +Type in the search field to filter nodes by name or short name. The filter updates in real time as you type. + +### Filter Toggles + +| Filter | Popis | +| -------------------------- | ---------------------------------------------------------------------------------------------- | +| **Only online** | Show only nodes heard within the last 15 minutes | +| **Only direct** | Show only nodes with direct (non-relayed) connections | +| **Include unknown** | Show nodes that haven't sent user info yet | +| **Exclude infrastructure** | Hide infrastructure-role nodes (Router, Repeater, Router Late, Client Base) | +| **Exclude MQTT** | Hide nodes heard only via MQTT internet bridge | +| **Show ignored** | Show nodes you've previously dismissed or muted | + +### Sort Options + +| Sort | Popis | +| ------------------------------------------- | ------------------------------------------------------------------ | +| **Last heard** (default) | Most recently heard nodes first | +| **Alphabetical** | Sorted by node long name | +| **Distance** | Nearest nodes first (requires position sharing) | +| **Hops away** | Fewest relay hops first | +| **Channel** | Grouped by channel index | +| **Via MQTT** | Grouped by MQTT vs. radio-heard | +| **Favorites** | Favorited nodes first | + +## Node Detail + +Tapping a node opens the detail view with comprehensive information. See [Node Metrics](node-metrics) for full details on metrics and telemetry. + +![Node detail view](/assets/screenshots/nodes_node_list.png) + +The detail screen includes device info, position, and action buttons: + +![Node detail section](/assets/screenshots/nodes_detail_section.png) + +Inline status indicators show key metrics at a glance: + +| Indicator | Screenshot | +| --------------- | -------------------------------------------------------- | +| Signal quality | ![Signal](/assets/screenshots/nodes_signal_info.png) | +| Battery level | ![Battery](/assets/screenshots/nodes_battery_info.png) | +| Hop count | ![Hops](/assets/screenshots/nodes_hops_info.png) | +| Posledný príjem | ![Last heard](/assets/screenshots/nodes_last_heard.png) | +| Vzdialenosť | ![Distance](/assets/screenshots/nodes_distance_info.png) | + +## Related Topics + +- [Node Metrics](node-metrics) — detailed telemetry dashboards for each node +- [Messages & Channels](messages-and-channels) — send a direct message to a node +- [Map & Waypoints](map-and-waypoints) — view node positions geographically +- [Discovery](discovery) — traceroute and neighbor info for topology exploration +- [Signal Meter](signal-meter) — understand what the signal bars mean + +--- + diff --git a/docs/sk-rSK/user/onboarding.md b/docs/sk-rSK/user/onboarding.md new file mode 100644 index 000000000..3b910534e --- /dev/null +++ b/docs/sk-rSK/user/onboarding.md @@ -0,0 +1,99 @@ +--- +title: Getting Started +nav_order: 1 +last_updated: 2026-05-13 +description: First-launch setup — permissions, onboarding flow, and next steps after connecting your radio. +aliases: + - first-launch + - setup + - intro +--- + +# Getting Started + +Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app. + +## First Launch + +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. + +### Welcome Screen + +The welcome screen introduces Meshtastic and its core capabilities: + +- Off-grid mesh communication +- No cellular or internet required +- End-to-end encrypted messaging + +Tap **Get Started** to proceed through the setup flow. + +![Welcome screen](/assets/screenshots/onboarding_welcome.png) + +## Permissions + +The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. + +### Bluetooth Permission + +Bluetooth is the primary connection method between your phone and Meshtastic radio: + +- **Bluetooth scanning** — discover nearby Meshtastic radios +- **Bluetooth connect** — establish and maintain connections with paired radios + +Grant both permissions when prompted. Without Bluetooth, you'll need to use USB or TCP connections instead. + +### Location Permission + +> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. + +Meshtastic also uses your location for: + +- Showing your position on the mesh map +- Calculating distances to other nodes +- Sharing your GPS coordinates with other mesh members (if enabled) + +Grant **"While using the app"** or **"Always"** depending on your preference: + +- **While using the app** — position updates only when the app is open +- **Always** — enables background position updates for always-on mesh presence + +If denied, Bluetooth scanning will not function and your node will not report a position. + +### Notifications Permission + +Notifications alert you to: + +- Incoming messages from channels and direct messages +- Connection status changes (connected, disconnected, reconnecting) +- Firmware update availability + +> 💡 **Tip:** You can fine-tune notification preferences later in Android system settings. The app creates separate notification channels for messages, connection events, and background service status. + +### Critical Alerts Permission + +On supported devices, the app may request permission for critical alerts: + +- These are high-priority notifications that can break through Do Not Disturb mode +- Useful for emergency mesh alerts or urgent messages +- You can **skip** this step if you don't need breakthrough notifications +- Configure or revoke later in Android notification settings + +## After Setup + +Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. + +> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. + +## What's Next? + +Once connected to a radio, explore: + +- [Connections](connections) — pair your first radio device +- [Messages & Channels](messages-and-channels) — send your first message +- [Nodes](nodes) — see who's on your mesh +- [Map & Waypoints](map-and-waypoints) — view node positions +- [Settings](settings-radio-user) — configure your radio and user profile + +New to Meshtastic? The [getting started guide](https://meshtastic.org/docs/getting-started) on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup. + +--- diff --git a/docs/sk-rSK/user/settings-module-admin.md b/docs/sk-rSK/user/settings-module-admin.md new file mode 100644 index 000000000..405b79d8e --- /dev/null +++ b/docs/sk-rSK/user/settings-module-admin.md @@ -0,0 +1,246 @@ +--- +title: Settings — Modules & Admin +nav_order: 8 +last_updated: 2026-05-13 +description: Configure optional feature modules (MQTT, telemetry, canned messages, TAK, and more) and perform device administration. +aliases: + - modules + - module-config + - administration +--- + +# Settings — Modules & Admin + +Configure optional feature modules and perform device administration. Modules extend Meshtastic with specialized capabilities — each can be independently enabled or disabled. + +> 💡 **Tip:** You only need to enable the modules you actually use. Disabling unused modules reduces airtime, saves battery, and simplifies your configuration. + +Module settings use a card-based layout with toggle switches, dropdowns, text fields, and sliders: + +![Toggle switch](/assets/screenshots/settings_switch.png) + +![Dropdown selector](/assets/screenshots/settings_dropdown.png) + +![Text field](/assets/screenshots/settings_text_field.png) + +![Settings card layout](/assets/screenshots/settings_titled_card.png) + +## Module Configuration + +### MQTT Module + +Bridges mesh messages to and from an MQTT broker for internet connectivity. This is how you extend your mesh beyond radio range or integrate with home automation systems. + +| Setting | Popis | +| ------------------ | ------------------------------------------------------------------------ | +| Enabled | Toggle MQTT bridge | +| Server | MQTT broker address | +| Používateľské meno | Authentication username | +| Heslo | Authentication password | +| Encryption | Encrypt MQTT payloads | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON support removed from firmware; field is ignored | +| TLS | Use secure connection | +| Root Topic | Base MQTT topic path | +| Map Report | Publish position for public map | + +See [MQTT](mqtt) for a detailed usage guide including encryption, privacy, and broker setup. + +### Serial Module + +Enables serial port communication for external device integrations (GPS modules, sensors, or custom hardware). When enabled, the node's serial port can send and receive protobuf or text data, allowing external microcontrollers or computers to interact with the mesh. + +| Setting | Popis | +| ---------- | ------------------------------- | +| Enabled | Activate serial communication | +| Echo | Echo received serial data back | +| Mode | Text, Protobuf, or NMEA output | +| RX/TX Pins | GPIO pins for serial connection | +| Baud Rate | Serial communication speed | + +### External Notification Module + +Controls buzzer, LED, or vibration alerts on your radio hardware. Useful for devices that need to physically signal when a message arrives — particularly helpful for unattended or outdoor installations. + +| Setting | Popis | +| -------------------------------- | --------------------------- | +| Enabled | Activate notifications | +| Alert Message | Notify on incoming messages | +| Alert Message Buzzer | Use buzzer for messages | +| Alert Message Vibra | Use vibration for messages | +| Alert Bell | Notify on bell character | +| Output (GPIO) | Pin for notification output | +| Active | High or Low active | +| Duration (ms) | Notification length | +| Use I2S as Buzzer | Use I2S audio output | + +### Store & Forward Module + +Buffers messages for nodes that were temporarily offline, then replays them when those nodes reconnect. Essential for meshes where nodes go in and out of range regularly — ensures messages aren't lost during brief disconnections. + +| Setting | Popis | +| ------------------------------------------ | -------------------------- | +| Enabled | Activate store and forward | +| Heartbeat (s) | Announcement interval | +| Records | Maximum stored messages | +| History Return (max) | Max messages to replay | +| History Return (window) | Time window for replay | + +> 💡 **Tip:** Store and Forward works best on nodes with ample memory (ESP32 with PSRAM). Router nodes are ideal candidates since they're typically always-on. + +### Range Test Module + +Automated range testing tool for evaluating link quality between nodes. When enabled, the node periodically transmits test messages with incrementing counters. A receiver node logs these messages, allowing you to walk or drive away and later analyze at what distance messages stopped arriving. + +| Setting | Popis | +| -------------------------------------- | --------------------------------- | +| Enabled | Activate range testing | +| Sender Interval (s) | Time between test transmissions | +| Save CSV | Log received test data to SD card | + +### Telemetry Module + +Controls what telemetry data your node shares with the mesh. Telemetry includes device health (battery, uptime) and environmental sensor data (temperature, humidity, pressure). + +| Setting | Popis | +| ---------------------------- | --------------------------------------- | +| Device Metrics Interval | How often to report device metrics | +| Environment Metrics Interval | How often to report environment sensors | +| Air Quality Enabled | Report particulate sensor data | +| Power Metrics Enabled | Report power usage | + +See [Telemetry & Sensors](telemetry-and-sensors) for supported sensors and configuration recommendations. + +### Canned Message Module + +Pre-configured messages accessible from the device's physical buttons (for radios with rotary encoders, keypads, or similar input hardware). Define a list of quick-send messages that can be transmitted without a phone connected — ideal for field use. + +| Setting | Popis | +| ------------------ | ----------------------------------------------------------- | +| ~~Enabled~~ | ⚠️ **Deprecated** — current firmware may ignore this toggle | +| Správy | Newline-separated list of messages | +| Send Bell | Play bell sound on send | +| Rotary Encoder | Enable rotary encoder input | +| Up/Down/Press Pins | GPIO pin assignments for input | + +### Audio Module + +Codec2 audio support for low-bandwidth voice communication over the mesh. This is an **experimental** feature that encodes voice into very small data packets using the Codec2 codec. + +| Setting | Popis | +| --------------- | -------------------------------- | +| Enabled | Activate audio module | +| Codec2 Rate | Audio quality/bandwidth tradeoff | +| I2S Word Select | GPIO pin for I2S WS | +| I2S Data In | GPIO pin for I2S DIN | +| I2S Data Out | GPIO pin for I2S DOUT | + +> ⚠️ **Note:** Audio requires specific hardware (I2S microphone and speaker). Voice quality is very low-bandwidth — think "understandable radio voice," not phone-call quality. + +### Remote Hardware Module + +GPIO control over the mesh network. Allows a remote node to read or write GPIO pins on another node — useful for activating relays, reading switches, or controlling external hardware from a distance. + +| Setting | Popis | +| -------------------- | --------------------------------------------------------------- | +| Enabled | Activate remote GPIO access | +| Allow Undefined Pins | Allow access to any GPIO pin (security risk) | + +> ⚠️ **Warning:** Enabling "Allow Undefined Pins" gives remote nodes access to all GPIO pins, which could interfere with the radio's own hardware. Only enable on dedicated GPIO nodes. + +### Neighbor Info Module + +Broadcasts information about directly heard neighbors, enabling mesh topology mapping. Each enabled node periodically shares a list of the other nodes it can hear and their signal quality. + +| Setting | Popis | +| -------------------------------------- | ------------------------------------ | +| Enabled | Activate neighbor broadcasting | +| Update Interval (s) | How often to broadcast neighbor list | + +See [Discovery](discovery) for how to use neighbor data for mesh topology exploration. + +### Ambient Lighting Module + +Controls onboard NeoPixel or other addressable RGB LEDs on supported hardware. Can be used for visual status indicators, notification lights, or decorative effects. + +| Setting | Popis | +| ------------------ | ---------------------------------------------------------- | +| Enabled | Activate LED control | +| LED State | On, Off, or set specific color | +| Red / Green / Blue | Individual color channel values (0–255) | + +### Detection Sensor Module + +Turns your node into a motion or door sensor alert system. When a GPIO pin detects a state change (motion detected, door opened), the node broadcasts an alert message over the mesh. + +| Setting | Popis | +| ---------------------------------------- | ----------------------------------------------------------------------- | +| Enabled | Activate detection sensor | +| Monitor Pin | GPIO pin connected to sensor | +| Detection Triggered High | Trigger when pin goes high (vs. low) | +| Minimum Broadcast (s) | Minimum time between alert broadcasts | +| State Broadcast (s) | Periodic state broadcast interval | +| Send Bell | Include bell character in alerts | +| Friendly Name | Custom name for this sensor | + +### Paxcounter Module + +People counter using WiFi and BLE probe requests. Counts nearby devices by passively listening for probe requests that phones and laptops emit when scanning for networks. Available only on ESP32 devices. + +| Setting | Popis | +| -------------------------------------- | -------------------------- | +| Enabled | Activate people counting | +| Update Interval (s) | How often to report counts | + +> 💡 **Tip:** Paxcounter is useful for estimating foot traffic at trailheads, event venues, or other locations. Counts are approximate — one person may carry multiple devices. + +### TAK Module + +Team Awareness Kit integration for interoperability with ATAK and WinTAK. See [TAK Integration](tak) for detailed setup and usage. + +## Administrácia + +### Administrácia na diaľku + +Remotely configure nodes that share your admin key: + +1. Select the target node in the node list. +2. Navigate to **Settings** for that node. +3. Modify configuration. +4. Tap **Save** — changes are sent over the mesh. + +> ⚠️ **Requires:** Admin key configured on both your node and the target node. + +### Clean Node Database + +Removes stale nodes from your local database that haven't been heard in a configurable time window. + +### Factory Reset + +Resets all settings to factory defaults. **This cannot be undone.** + +### Reštartovať + +Remotely reboot a connected or administered node. + +### Debug okno + +View detailed diagnostic information: + +- Protocol buffers debug output +- Mesh packet log +- Connection state details + +### Troubleshooting Remote Admin + +- **"No response from target node"** — the target may be out of range, offline, or have a mismatched admin key. Verify the admin key matches on both nodes. +- **Changes not applying** — some settings require a reboot to take effect. Try the Reboot action after saving. +- **Can't see remote settings** — ensure your node has the admin key for the target node and that Admin Channel is enabled in Security Config. + +## Related Topics + +- [Settings — Radio & User](settings-radio-user) — core radio and user profile settings +- [Module configuration reference](https://meshtastic.org/docs/configuration/module) — detailed module docs on meshtastic.org +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/sk-rSK/user/settings-radio-user.md b/docs/sk-rSK/user/settings-radio-user.md new file mode 100644 index 000000000..02380fba1 --- /dev/null +++ b/docs/sk-rSK/user/settings-radio-user.md @@ -0,0 +1,173 @@ +--- +title: Settings — Radio & User +nav_order: 7 +last_updated: 2026-05-13 +description: Configure your radio hardware, LoRa presets, user profile, position sharing, power management, and security. +aliases: + - nastavenia + - radio-config + - user-config + - lora +--- + +# Settings — Radio & User + +Configure your radio hardware and user identity parameters. + +## User Settings + +### User Profile + +| Setting | Popis | +| ----------------- | ------------------------------------------------------------------------------------- | +| Dlhé Meno | Your display name (up to 39 characters) | +| Krátke Meno | 4-character abbreviated name | +| Licensed Operator | Enable if you hold an amateur radio license (enables higher power) | + +### Applying Changes + +After modifying settings, tap **Save** to write the configuration to your radio. The device may reboot to apply changes. + +## Radio Configuration + +### Konfigurácia Zariadenia + +| Setting | Popis | Predvolené | +| ------------------------------------------ | ----------------------------------------------------------------------- | ---------- | +| Rola | Node behavior (Client, Router, etc.) | Klient | +| Rebroadcast Mode | How the node retransmits messages | Všetky | +| Node Info Broadcast (s) | Interval for broadcasting node info | 10800 | +| Double-tap Button | Action for double-tap button press | Disabled | + +### Konfigurácia LoRa + +| Setting | Popis | Predvolené | +| ----------------- | ----------------------------------------------------------------------- | ----------------------------------------- | +| Región | Regulatory region for frequency bands | Unset (must configure) | +| Modem Preset | Speed/range tradeoff | LongFast | +| Hop Limit | Maximum retransmit hops | 3 | +| TX Power | Transmission power (dBm); 0 = max allowed for region | 0 (region max) | +| Frequency Offset | Fine-tune frequency (MHz) | 0 | +| Channel Bandwidth | Bandwidth setting | Default for preset | + +> ⚠️ **Important:** You **must** set your region before transmitting. Operating without the correct region may violate local radio regulations. See the [region configuration guide](https://meshtastic.org/docs/getting-started/initial-config) on meshtastic.org for details. + +### Modem Presets + +| Preset | Range | Rýchlosť | SNR Limit | Best For | +| ------------------ | ----------------------- | ------------------------- | ------------------------ | -------------------------------------------------------------------------------------------------------- | +| Short Turbo | ~1 km | 21.9 kbps | −5 dB | Dense urban with line-of-sight; data-heavy applications | +| Short Fast | ~3 km | 10.9 kbps | −7.5 dB | Urban neighborhoods; buildings within a few blocks | +| Short Slow | ~5 km | 5.5 kbps | −10 dB | Suburban short-range; moderate building density | +| Medium Fast | ~5 km | 5.5 kbps | −10 dB | Suburban areas; moderate building density | +| Medium Slow | ~8 km | 1.1 kbps | −12.5 dB | Suburban/rural; moderate range with slower speed | +| Long Turbo | ~10 km | 4.4 kbps | −10 dB | Similar range to Long Fast but with 500 kHz bandwidth; faster throughput | +| Long Fast | ~10 km | 1.1 kbps | −12.5 dB | **General use (default)** — balanced range and speed | +| Long Moderate | ~20 km | 0.34 kbps | −15 dB | Rural with some terrain; occasional use | +| Lite Fast | ~5 km | 5.5 kbps | −10 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Medium Fast | +| Lite Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Long Fast | +| Narrow Fast | ~5 km | 2.7 kbps | −10 dB | EU 868 MHz band (62.5 kHz BW); avoids interference with other devices | +| Narrow Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 868 MHz band (62.5 kHz BW); comparable to Long Fast | +| ~~Long Slow~~ | ~30 km | 0.18 kbps | −17.5 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | +| ~~Very Long Slow~~ | ~40+ km | 0.09 kbps | −20 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | + +#### Choosing a Modem Preset + +The modem preset controls the fundamental tradeoff between **range** and **data rate**: + +- **Slower presets** use more spreading, making signals decodable at weaker signal levels (lower SNR limit). This means longer range but fewer bytes per second. +- **Faster presets** pack more data per transmission but require a stronger signal to decode. + +**Practical guidance:** + +- **Urban mesh (many nodes, short distances):** Use **Long Fast** (default) or **Short Fast**. Higher speed means less airtime congestion when many nodes share the channel. +- **Rural/sparse mesh (few nodes, long distances):** Use **Long Moderate**. Range matters more than speed when nodes are far apart. +- **EU 866/868 MHz regulatory compliance:** Use **Lite Fast**, **Lite Slow**, **Narrow Fast**, or **Narrow Slow** — these are optimized for the EU SRD/868 MHz bands with narrower bandwidths. +- **Fixed infrastructure links:** Use **Short Turbo** or **Long Turbo** for dedicated point-to-point links with good antennas and line-of-sight. +- **Mixed environments:** Stick with **Long Fast** — it's the community default and ensures compatibility with others in your area. + +> ⚠️ **Important:** All nodes on the same channel **must** use the same modem preset. Nodes with mismatched presets cannot communicate even if they share the same frequency and encryption key. + +> 💡 **Tip:** The range estimates above assume flat terrain and modest antennas. Elevation advantage (hilltop, rooftop) dramatically increases effective range. A well-placed Router with Long Fast can often outperform a ground-level node with Long Slow. + +### Konfigurácia Displeju + +| Setting | Popis | +| ------------------- | ------------------------------------------------------------------------------------ | +| Screen Timeout | Time before display sleeps | +| Display Units | Metric or Imperial | +| OLED Type | Auto, SSD1306, SH1106, SH1107 | +| Compass Orientation | Rotation offset for compass display (0°, 90°, 180°, 270°) | +| ~~Compass North~~ | ⚠️ **Deprecated** — replaced by Compass Orientation; still visible in older firmware | + +### Position Config + +| Setting | Popis | +| ----------------------------------------- | ---------------------------------- | +| GPS Enabled | Enable/disable GPS | +| GPS Update Interval | How often to acquire GPS fix | +| Position Broadcast (s) | How often to share position | +| Inteligentná poloha | Enable movement-based broadcasting | +| Fixná Pozícia | Use a manually set position | + +### Power Config + +| Setting | Popis | +| --------------------------------------- | --------------------------------------- | +| Power Saving | Enable low-power sleep mode | +| Shutdown After (s) | Auto-shutdown idle timer | +| ADC Multiplier | Battery voltage calibration factor | +| Wait Bluetooth (s) | Time to wait for BLE connection at boot | +| Mesh SDS Timeout (s) | Super-deep-sleep timeout | + +### Konfigurácia siete + +| Setting | Popis | +| ------------- | ---------------------------------------------------- | +| WiFi Enabled | Enable WiFi radio (ESP32 devices) | +| WiFi SSID | Network name to connect to | +| WiFi PSK | Network password | +| NTP Server | Time synchronization server | +| Syslog Server | Remote logging server | + +![IP address field](/assets/screenshots/settings_ipv4_field.png) + +### Konfigurácia Bluetooth + +| Setting | Popis | +| ----------------- | ------------------------------------------------------------------------- | +| Bluetooth Enabled | Enable/disable BLE radio | +| Pairing Mode | Fixed PIN, Random PIN, or No PIN | +| Pevný PIN | PIN code for pairing (default: 123456) | + +### Security Config + +| Setting | Popis | +| --------------------- | -------------------------------------------------------------------------- | +| Verejný kľúč | Your node's public key (read-only) | +| Admin Key | Key for remote administration | +| Súkromný kľúč | Your node's private key (handle securely) | +| Admin Channel Enabled | Allow admin commands via channel | +| Debug Log | Output live debug logging over serial/bluetooth | +| Serial Enabled | Enable serial console access (moved from Device Config) | +| Managed Mode | Restrict non-admin channel changes | + +![Password field](/assets/screenshots/settings_password_field.png) + +Settings use standard preference controls — dropdowns, toggles, and sliders: + +| Control | Screenshot | +| -------- | ------------------------------------------------------ | +| Dropdown | ![Dropdown](/assets/screenshots/settings_dropdown.png) | +| Toggle | ![Toggle](/assets/screenshots/settings_switch.png) | +| Slider | ![Slider](/assets/screenshots/settings_slider.png) | + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — optional feature modules and device administration +- [Signal Meter](signal-meter) — how modem presets affect signal quality thresholds +- [LoRa configuration](https://meshtastic.org/docs/configuration/radio/lora) — detailed LoRa settings reference on meshtastic.org +- [Initial configuration](https://meshtastic.org/docs/getting-started/initial-config) — region setup guide on meshtastic.org + +--- + diff --git a/docs/sk-rSK/user/signal-meter.md b/docs/sk-rSK/user/signal-meter.md new file mode 100644 index 000000000..3f1ed6289 --- /dev/null +++ b/docs/sk-rSK/user/signal-meter.md @@ -0,0 +1,81 @@ +--- +title: How the Meshtastic Signal Meter Works +nav_order: 15 +last_updated: 2026-05-13 +description: How the signal meter calculates quality from RSSI and SNR — LoRa spread spectrum, presets, and what the bars really mean. +aliases: + - signal + - signal-meter + - snr + - rssi +--- + +# How the Meshtastic Signal Meter Works + +The Meshtastic signal meter — the familiar bars or status color in the app — is calculated very differently than the "bars" on a traditional cell phone or Wi-Fi router. + +Most consumer devices simply measure how "loud" a signal is. However, because Meshtastic uses **LoRa (Long Range)** technology, its signal meter measures how **clear** the signal is, relative to the specific settings your mesh is using. + +--- + +## 1. The Two Metrics: "Loudness" vs. "Clarity" + +Every time the LoRa radio chip receives a message, it reports two measurements: + +- **RSSI (Received Signal Strength Indicator):** The **loudness** of the raw power hitting your antenna. +- **SNR (Signal-to-Noise Ratio):** The **clarity** of the signal compared to the background static. + +> **Tip — The Analogy:** Imagine you are trying to hear a friend talking to you. +> +> - **RSSI** is how loud their voice is. +> - **The Noise Floor** is the background noise in the room (air conditioning, other people talking, traffic). +> - **SNR** is how easily you can distinguish your friend's voice from the background noise. + +If your friend shouts at you at a deafening rock concert, the signal is incredibly loud (High RSSI), but you still can't understand them because the background noise is louder (Bad SNR). Conversely, if your friend whispers to you in a dead-silent library, the signal is very weak (Low RSSI), but you can understand them perfectly (Great SNR). + +--- + +## 2. The Magic of LoRa: Hearing "Below the Noise Floor" + +For standard radios (like FM or Wi-Fi), if the background noise is louder than the signal (a negative SNR), the receiver just hears static. + +LoRa is special. It uses **"Spread Spectrum"** modulation, which allows the radio to mathematically pull a signal out of the air even when it is buried deep _underneath_ the background noise. This is why you will frequently see **negative SNR numbers** in Meshtastic (e.g., -10 dB, which means the signal is 10 decibels weaker than the background static). + +Depending on which Meshtastic preset you are using (e.g., `LongFast` vs. `ShortFast`), the radio has a specific **SNR Limit** — the absolute maximum amount of noise it can tolerate before the message is completely lost to the static. + +--- + +## 3. How the Signal Meter Calculates Quality + +The Meshtastic apps take both RSSI and SNR and run them through a specific formula to assign your signal a quality rating (None, Bad, Fair, or Good). It specifically scales these values based on the physical limits of the radio preset you are using. + +Here is exactly how the app decides how many bars (or what color) to show you: + +| Level | Bars | Criteria | Meaning | +| --------- | ---- | ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | +| Dobrý | 3 | RSSI better than `-115 dBm` **AND** SNR better than `-7 dB` | Signal is both loud and clear — healthy connection. | +| Primeraný | 2 | RSSI better than `-126 dBm` with good SNR, **OR** SNR better than `-15 dB` with good RSSI | Signal getting quieter or noisier, but still decodable. | +| Zlý | 1 | Falls between Fair and None thresholds | At the edge of range or experiencing interference. | +| Žiadny | 0 | RSSI worse than `-126 dBm` **AND** SNR worse than `-15 dB` | Transmission completely buried in noise. | + +--- + +## 4. What This Means for You + +Because Meshtastic's meter acts as a **"Clarity Meter"**, it behaves differently than what most people expect: + +> **Tip — Don't panic over low RSSI:** You might see a seemingly terrible RSSI value like `-118 dBm`. On a cell phone, you would have zero bars. But if you have an SNR of `+2 dB`, Meshtastic will still show a strong signal! _The library is quiet, so the whisper is heard perfectly._ + +> **Warning — Watch out for local noise:** If you hook up a massive antenna and see a great RSSI (e.g., `-90 dBm`) but your signal meter is only showing **1 Bar (Bad)**, you have a problem. It means you have local interference — perhaps a cheap power supply, a noisy computer, or a nearby radio tower — creating so much static that it is drowning out your mesh. + +## Where Signal Information Appears + +In the app, signal data is shown in several places: + +- **Node list** — signal bars icon next to each node +- **Node detail** — SNR, RSSI, and signal quality in the device metrics section +- **Traceroute** — per-hop signal quality for each relay node +- **Signal metrics** — historical SNR and RSSI data in the metrics charts + +![Node entry showing SNR, RSSI values and colored signal bars](/assets/screenshots/nodes_signal_info.png) + diff --git a/docs/sk-rSK/user/tak.md b/docs/sk-rSK/user/tak.md new file mode 100644 index 000000000..6b68094ee --- /dev/null +++ b/docs/sk-rSK/user/tak.md @@ -0,0 +1,126 @@ +--- +title: TAK Integration +nav_order: 10 +last_updated: 2026-05-13 +description: Interoperate with ATAK and WinTAK — CoT position sharing, TAK roles, and plugin setup. +aliases: + - tak + - atak + - team-awareness-kit +--- + +# TAK Integration + +Meshtastic integrates with the Team Awareness Kit (TAK) ecosystem, enabling interoperability between Meshtastic mesh devices and TAK applications like ATAK and WinTAK. + +## Overview + +The TAK module allows Meshtastic nodes to: + +- Share position data in TAK-compatible CoT (Cursor on Target) format +- Appear as team members on TAK map displays +- Receive TAK PLI (Position Location Information) messages + +## Setup + +### Prerequisites + +- ATAK (Android Team Awareness Kit) or WinTAK installed +- Meshtastic ATAK Plugin installed +- TAK module enabled on your Meshtastic radio + +### Configuration + +1. Navigate to **Settings → Module Config → TAK**. +2. Enable the TAK module. +3. Configure the TAK team/group settings: + +![Module toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | Popis | +| ------- | -------------------------- | +| Enabled | Activate TAK interop | +| Mode | TAK-compatible output mode | + +### ATAK Plugin Setup + +1. Install the Meshtastic ATAK Plugin from the plugin repository. +2. Open ATAK and enable the Meshtastic plugin. +3. The plugin bridges messages between ATAK and your mesh network. + +## TAK Roles + +Nodes configured with TAK-related roles behave differently from standard clients: + +| Rola | Popis | +| --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **TAK** | Full TAK interoperability — sends and receives CoT data, chat messages, and PLI updates. Functions as a standard client plus TAK bridge. | +| **TAK Tracker** | Position-only TAK output — automatically broadcasts PLI at regular intervals without user interaction. Optimized for unattended position beacons (vehicles, equipment, waypoints). Does not relay chat messages. | + +> 💡 **Tip:** Use **TAK Tracker** for devices that only need to report position (e.g., a radio mounted in a vehicle). Use **TAK** for devices where users actively participate in TAK operations. + +### CoT (Cursor on Target) Format + +TAK messages use the Cursor on Target XML format — a military standard for sharing situational awareness data. Meshtastic converts its internal protobuf messages to CoT format when bridging to TAK systems, so no manual format conversion is needed. + +## TAK Identity + +When using TAK roles, your node broadcasts identity information that appears on TAK maps: + +| Setting | Popis | +| -------- | ---------------------------------------------------------------------------------------------------------------- | +| Team | Your team color on the TAK map (e.g., Blue, Red, Cyan, Green) | +| Rola | Your operational role (Team Member, Team Lead, HQ, Medic, RTO, etc.) | +| Callsign | Your TAK callsign (defaults to your Meshtastic long name) | + +These settings appear in **Settings → Module Config → TAK** when the TAK module is enabled. + +> 💡 **Tip:** Team/role colors are the standard TAK affiliation colors. Coordinate with your TAK team to use consistent team assignments. + +## Wire Format (V1 / V2) + +Meshtastic supports two TAK wire formats: + +| Format | Compatibility | Features | +| ------------------------------- | --------------------------------------------------------------- | --------------------------------------------------------- | +| V1 (Legacy) | ATAK Plugin v1.x, older firmware | Basic CoT position sharing only | +| V2 (Current) | ATAK Plugin v2.x, firmware 2.3+ | Full CoT support including chat, routes, zstd compression | + +The app automatically selects V2 when both sides support it. No manual configuration needed — the TAK module negotiates format based on firmware capabilities. + +## Usage with ATAK + +Once configured: + +- Meshtastic nodes appear as markers on the ATAK map with callsign labels +- Chat messages can bridge between mesh and TAK networks +- Position updates flow bidirectionally between Meshtastic and TAK +- TAK Tracker nodes broadcast PLI automatically — their positions appear on ATAK maps without any ATAK-side configuration + +> ⚠️ **Note:** TAK integration requires specific node roles and module configuration. Standard client nodes don't automatically participate in TAK operations. + +## Troubleshooting + +| Problem | Cause | Solution | +| -------------------------------- | ------------------------------------- | ----------------------------------------------------------------------- | +| Node doesn't appear on ATAK map | TAK module disabled or wrong role | Verify TAK module is enabled and node role is TAK or TAK Tracker | +| Position updates are stale | GPS fix lost or interval too long | Check GPS status; reduce position broadcast interval in Position Config | +| ATAK plugin shows "disconnected" | BLE connection lost or plugin crashed | Reconnect Bluetooth in Meshtastic app, then restart ATAK plugin | +| Chat messages not bridging | V1 format doesn't support chat | Ensure both nodes run firmware 2.3+ for V2 wire format | +| CoT data not flowing | Channel mismatch | All TAK nodes must be on the same channel with matching encryption | + +## Security Considerations + +- TAK data shares your position and callsign information +- Ensure your channel encryption is configured when using TAK in sensitive environments +- The TAK module respects the same channel encryption as other Meshtastic messages + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — TAK module configuration +- [Nodes](nodes) — TAK and TAK Tracker roles in the node list +- [Map & Waypoints](map-and-waypoints) — node positions on the map +- [ATAK plugin guide](https://meshtastic.org/docs/software/integrations/atak-plugin) — detailed ATAK setup on meshtastic.org + +--- + diff --git a/docs/sk-rSK/user/telemetry-and-sensors.md b/docs/sk-rSK/user/telemetry-and-sensors.md new file mode 100644 index 000000000..381c6fe7a --- /dev/null +++ b/docs/sk-rSK/user/telemetry-and-sensors.md @@ -0,0 +1,118 @@ +--- +title: Telemetry & Sensors +nav_order: 9 +last_updated: 2026-05-13 +description: Sensor data on the mesh — supported environment, air quality, and power sensors, plus configuration and viewing guides. +aliases: + - sensors + - environment + - weather + - power-metrics +--- + +# Telemetry & Sensors + +Meshtastic nodes can collect and share sensor data across the mesh network. + +## Overview + +Telemetry allows nodes equipped with sensors to broadcast environmental, power, and device health information. This data is visible on the node detail screen and can be logged over time. + +## Device Telemetry + +All Meshtastic nodes report basic device telemetry: + +| Metric | Popis | Typical Range | +| ------------------ | ------------------------------ | ------------------------------------------------------------------ | +| Battery Level | Charge percentage | 0–100% | +| Napätie | Battery voltage | 3.0–4.2V (LiPo) | +| Využitie kanálu | % of airtime used locally | 0–100% | +| Air Utilization TX | % of airtime used by this node | 0–100% | +| Doba prevádzky | Seconds since last boot | Varies | + +## Environment Sensors + +Supported environmental sensors: + +### Temperature & Humidity + +| Senzor | Teplota | Vlhkosť | Tlak | Notes | +| ------- | ------- | ------- | ---- | ----------------------- | +| BME280 | ✓ | ✓ | ✓ | Recommended all-in-one | +| BME680 | ✓ | ✓ | ✓ | Adds gas resistance/IAQ | +| SHT31 | ✓ | ✓ | — | High accuracy | +| MCP9808 | ✓ | — | — | Precision temperature | +| LPS22 | — | — | ✓ | Pressure only | + +### Air Quality + +| Senzor | Metric | Notes | +| -------- | -------------------------------------------------- | -------------------------- | +| BME680 | Gas Resistance / IAQ | Volatile organic compounds | +| PMSA003I | PM1.0, PM2.5, PM10 | Particulate matter | +| SEN55 | PM, NOx, VOC, Temp, Humidity | Multi-sensor | + +### Light & UV + +| Senzor | Metric | +| -------- | -------------------------------------- | +| OPT3001 | Ambient light (lux) | +| VEML7700 | Ambient light (lux) | +| LTR390 | UV index | + +## Power Metrics + +Nodes with INA-series power sensors can report: + +| Metric | Popis | +| ----------- | ----------------------------------------- | +| Bus Voltage | Supply rail voltage | +| Prúd | Power consumption (mA) | +| Napájanie | Calculated power (mW) | + +Useful for monitoring solar charging or battery health on remote nodes. + +## Configuring Telemetry + +1. Navigate to **Settings → Module Config → Telemetry**. +2. Set reporting intervals: + - **Device Metrics Interval** — how often to broadcast device metrics + - **Environment Metrics Interval** — how often to broadcast sensor data +3. Enable specific sensor types as needed. + +### Recommended Intervals + +| Use Case | Device (s) | Environment (s) | +| ------------------------------------------ | ----------------------------- | ---------------------------------- | +| Urban mesh (many nodes) | 3600 | 3600 | +| Rural mesh (few nodes) | 900 | 900 | +| Weather station | 900 | 300 | +| Battery conservation | 7200 | 7200 | + +> ⚠️ **Note:** Shorter intervals increase airtime usage and battery drain across the mesh. + +## Viewing Telemetry + +1. Navigate to **Nodes** and select a node. +2. Telemetry sections show on the detail screen: + - Device Metrics (always available) + - Environment Metrics (if sensors present) + - Power Metrics (if INA sensor present) +3. Historical graphs show trends over time. + +![Telemetry actions](/assets/screenshots/node-metrics_telemetric_actions.png) + +## Troubleshooting + +- **No environment data showing?** The remote node needs a physical sensor connected (e.g., BME280 on I2C). Device telemetry (battery, uptime) is always available, but environment metrics require hardware. +- **Stale readings?** Check the reporting interval — very long intervals (7200s+) mean data updates infrequently. Also verify the remote node is still online. +- **Sensor conflict on I2C bus?** Some sensors share I2C addresses. If you have multiple sensors on the same bus, check for address collisions in the radio's serial debug output. + +## Related Topics + +- [Node Metrics](node-metrics) — view telemetry data on the node detail screen +- [Settings — Modules & Admin](settings-module-admin) — telemetry module configuration +- [Units & Locale](units-and-locale) — temperature and pressure display units + +--- + diff --git a/docs/sk-rSK/user/translate.md b/docs/sk-rSK/user/translate.md new file mode 100644 index 000000000..b2ed79a34 --- /dev/null +++ b/docs/sk-rSK/user/translate.md @@ -0,0 +1,97 @@ +--- +title: Translate the App +parent: User Guide +nav_order: 17 +last_updated: 2026-05-13 +aliases: + - translate + - crowdin + - localization +--- + +# Translate the App + +Contributing translations helps make Meshtastic accessible to a wider audience. The app uses [Crowdin](https://crowdin.com/) to manage community translations for both the user interface and in-app documentation. + +--- + +## What Gets Translated + +| Resource | Source Location | Notes | +| ----------------- | ------------------------------------- | ---------------------------------------------------------------------- | +| UI strings | `composeResources/values/strings.xml` | Buttons, labels, messages, and all user-visible text | +| User Guide pages | `docs/user/*.md` | In-app documentation shown in Help & Documentation | +| Fastlane metadata | `fastlane/metadata/android/en-US/` | App Store listing title, description, and changelogs | + +> **Note — Developer Guide pages are English-only.** Code-focused documentation targeting contributors is not translated. + +--- + +## How to Contribute + +1. **Visit the Crowdin project.** Open the [Meshtastic Android Crowdin project](https://crowdin.com/project/meshtastic-android) and sign in or create a free account. +2. **Choose your language.** Select an existing language or request a new one by opening a [GitHub issue](https://github.com/meshtastic/Meshtastic-Android/issues/new). +3. **Translate strings.** Crowdin shows the English source on the left and your translation on the right. Translate each string and save. +4. **Review context.** Many strings include screenshots or context comments — check these to understand where the text appears in the app. +5. **Submit.** Approved translations are automatically merged into the next release. + +> **Tip — Keep translations short.** UI strings often appear in buttons, chips, or narrow columns. If a translation is significantly longer than the English original, consider abbreviating where the meaning stays clear. + +--- + +## Adding a New Language + +If your language is not yet listed on Crowdin: + +1. Open an issue on [GitHub](https://github.com/meshtastic/Meshtastic-Android/issues/new) requesting the new locale. +2. A maintainer will add the language to Crowdin and configure `crowdin.yml`. +3. Once added, you can begin translating immediately. + +--- + +## How Translations Are Organized + +The Android app uses **Compose Multiplatform resources** for all user-visible strings: + +``` +core/resources/src/commonMain/composeResources/ +├── values/ ← English (default) +│ └── strings.xml +├── values-de/ ← German +│ └── strings.xml +├── values-fr/ ← French +│ └── strings.xml +└── ... +``` + +In-app documentation follows a similar pattern under `docs/`: + +``` +docs/ +├── user/ ← English source (default) +│ ├── onboarding.md +│ └── ... +├── fr/user/ ← French translations +│ ├── onboarding.md +│ └── ... +└── ... +``` + +The app automatically selects the correct locale based on your device's **Language & Region** settings. + +--- + +## Translation Guidelines + +- **Do not translate** technical terms like "LoRa", "MQTT", "BLE", "TAK", "SNR", or "RSSI" — these are universal. +- **Keep placeholders intact.** Strings like `%1$s` or `%d` are filled in at runtime. Do not remove or reorder them unless the grammar of your language requires it. +- **Match tone.** The app uses a friendly, direct voice. Avoid overly formal language. +- **Test if possible.** Switch your device language and open the app to see how translations look in context. + +--- + +## Questions? + +If you have questions about a specific string's context or need help getting started, open a discussion on the [Meshtastic GitHub Discussions](https://github.com/meshtastic/Meshtastic-Android/discussions) page. + +Thank you for helping expand the reach of Meshtastic! diff --git a/docs/sk-rSK/user/units-and-locale.md b/docs/sk-rSK/user/units-and-locale.md new file mode 100644 index 000000000..18c71b36b --- /dev/null +++ b/docs/sk-rSK/user/units-and-locale.md @@ -0,0 +1,118 @@ +--- +title: Units, Measurement & Locale +parent: User Guide +nav_order: 16 +last_updated: 2026-05-12 +--- + +# Units, Measurement & Locale + +The Meshtastic app automatically displays temperatures, distances, speeds, and times in the units your device is configured to use — no settings to change inside the app. + +--- + +## How It Works + +Meshtastic radios always transmit data in **metric units** (meters, °C, km/h, hPa, etc.). When the app receives this data, it uses the `MetricFormatter` utility to convert and display values in whatever unit system your device's locale specifies. + +On Android, your measurement preferences are determined by your system **Language & Region** settings. On Desktop (JVM), the app uses the JVM's default `Locale`. + +> **Tip — You never need to toggle units inside the app.** Change your system measurement preferences and every screen in Meshtastic updates automatically — node details, telemetry charts, weather, altitude, and more. + +--- + +## Teplota + +Temperature values from environment sensors are transmitted as **°C** and displayed based on your device's temperature unit preference. + +![Environment metrics with temperature](/assets/screenshots/nodes_environment_metrics.png) + +| Your Setting | You See | +| ------------ | ------- | +| Celsius | 22°C | +| Fahrenheit | 72°F | + +This affects all temperature displays throughout the app: node environment telemetry, soil temperature, dew point, and telemetry chart axes. + +## Distance & Altitude + +Distances between nodes and GPS altitudes are transmitted as **meters** and automatically scaled and converted. + +![Distance info display](/assets/screenshots/nodes_distance_info.png) + +| Your Setting | Small Distance | Large Distance | Nadmorská výška | +| -------------------------------- | -------------- | ---------------------- | --------------- | +| Metric | 350 m | 2.5 km | 1,200 m | +| Imperial (US) | 1,148 ft | 1.6 mi | 3,937 ft | + +The app uses natural scaling — short distances stay in meters or feet, while longer distances switch to kilometres or miles automatically. + +### Where these appear + +- **Node list** — distance and bearing to each node +- **Node detail** — altitude, distance from your position +- **Map** — waypoint distances, traceroute hop distances +- **Compass** — distance to selected node + +## Rýchlosť + +GPS ground speed is displayed in your locale's preferred speed unit. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Metric | 12 km/h | +| Imperial (US) | 7 mph | + +## Vietor + +Wind speed and gust data from environment sensors are transmitted as **m/s** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Metric | 5 m/s | +| Imperial (US) | 11 mph | + +Wind readings appear in the **Node Detail** environment section and the **Environment Telemetry** charts. + +## Rainfall + +Rainfall measurements (1-hour and 24-hour totals) are transmitted as **mm** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ---------------------- | +| Metric | 12 mm | +| Imperial (US) | 0.5 in | + +## Units That Never Change + +Some units are international standards and are displayed the same way regardless of your locale: + +| Measurement | Unit | Why | +| -------------------------------- | ------------------------------ | ------------------------------------- | +| Barometric pressure | hPa | International meteorological standard | +| Heading / bearing | ° (degrees) | Universal navigation convention | +| Radiácia | μR/hr | Standard dosimetry unit | +| GPS coordinates | decimal degrees | Universal geographic standard | +| Humidity, battery, soil moisture | % | Universal | + +## Date & Time + +All timestamps throughout the app — last heard, message times, telemetry logs, chart axes — follow your device's date and time preferences. + +| Setting | What It Controls | Example | +| ---------------- | ---------------- | ------------------------------------------------ | +| **24-Hour Time** | Clock format | 14:30 vs 2:30 PM | +| **Date Format** | Date ordering | 09/05/2026 vs 05/09/2026 | + +The app also uses **relative time** where it makes sense — for example, "5 min ago" or "2 hours ago" in the node list — which is automatically localised into your device language. + +## Changing Your Measurement System (Android) + +On Android, your measurement system (metric vs imperial) is tied to your region setting: + +1. Open **Android Settings → System → Language & Region** +2. Change your **Region** or **Measurement units** preference +3. Return to Meshtastic — values update immediately + +> **Tip — The app uses `MetricFormatter` from `core:common`.** All measurement formatting is handled by a shared KMP utility that respects your platform's locale. Developers adding new measurement displays should use `MetricFormatter` rather than hard-coding unit conversions. + diff --git a/docs/sl-rSI/index.md b/docs/sl-rSI/index.md new file mode 100644 index 000000000..0cb3c90e2 --- /dev/null +++ b/docs/sl-rSI/index.md @@ -0,0 +1,30 @@ +--- +title: Home +layout: default +nav_order: 0 +--- + +# Meshtastic Android App Documentation + +User and developer documentation for the Meshtastic Android, Desktop, and iOS applications powered by KMP (Kotlin Multiplatform). + +Use the sidebar navigation to browse the **User Guide** for app features and the **Developer Guide** for contributing to the project. + +--- + +## Quick Links + +| Guide | Opis | +| --------------------------------------------------------------------- | -------------------------------------------------------------- | +| [Getting Started](user/onboarding) | Connect your first radio and send a message | +| [Messages & Channels](user/messages-and-channels) | Channel broadcasts, direct messages, reactions, and encryption | +| [Nodes](user/nodes) | Understanding the mesh network node list | +| [Signal Meter](user/signal-meter) | How the LoRa signal quality meter works | +| [Units & Locale](user/units-and-locale) | How temperatures, distances, and times adapt to your region | +| [Desktop App](user/desktop) | Linux, macOS, and Windows desktop usage | +| [Architecture](developer/architecture) | App architecture overview for contributors | +| [Contributing](developer/contributing) | Branch naming, PR workflow, and verification commands | + +--- + +> This documentation is served from the same markdown source that powers the in-app **Help & Documentation** browser. diff --git a/docs/sl-rSI/user/connections.md b/docs/sl-rSI/user/connections.md new file mode 100644 index 000000000..586122275 --- /dev/null +++ b/docs/sl-rSI/user/connections.md @@ -0,0 +1,125 @@ +--- +title: Connections +nav_order: 2 +last_updated: 2026-05-13 +description: Connect your phone or desktop to a Meshtastic radio via Bluetooth, USB, or TCP/IP. +aliases: + - bluetooth + - usb + - tcp + - pairing +--- + +# Connections + +Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node. + +## Bluetooth (BLE) + +Bluetooth Low Energy is the default and most common connection method on Android. + +### Pairing a Device + +1. Ensure your Meshtastic radio is powered on and in pairing mode. +2. Open the app and navigate to **Connections**. +3. Tap **Scan for Devices** — nearby Meshtastic radios will appear. +4. Select your device from the list. +5. Accept the Bluetooth pairing prompt if shown. + +![Device list item](/assets/screenshots/connections_bluetooth_scan.png) + +You can filter devices by transport type using the filter chips at the top: + +![Transport filter chips](/assets/screenshots/connections_transport_filters.png) + +> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. + +### Connection Status + +| Icon | State | Opis | +| ---- | -------------- | ----------------------------- | +| 🟢 | Connected | Active radio link established | +| 🟡 | Connecting | Handshake in progress | +| 🔴 | Prekinjeno | No active connection | +| ⚪ | Not configured | No device selected | + +When connecting, a status indicator shows the current connection state: + +![Connecting status](/assets/screenshots/connections_connecting.png) + +If no devices are found, the app shows an empty state with instructions: + +![No devices found](/assets/screenshots/connections_empty_state.png) + +### Troubleshooting Bluetooth + +- **Device not found:** Toggle Bluetooth off/on, ensure location is enabled. +- **Connection drops:** Move closer to the radio; check for interference. +- **Pairing rejected:** Forget the device in Android Bluetooth settings and retry. + +## USB Serial + +USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable. + +### Setup + +1. Connect your radio via USB cable to your device. +2. The app will prompt for USB permission — tap **Allow**. +3. The connection is established automatically. + +> ⚠️ **Note:** USB connections require OTG support on Android devices. + +## TCP/IP (WiFi) + +Some Meshtastic radios support WiFi connectivity, allowing TCP-based connections. + +### Configuration + +1. Connect your radio to a WiFi network via the radio's web interface or settings. +2. In the app, go to **Connections → TCP**. +3. Enter the radio's IP address and port (default: 4403). +4. Tap **Connect**. + +![WiFi scanning for devices](/assets/screenshots/connections_wifi_scanning.png) + +When a device is found, it appears in the connection list: + +![WiFi device found](/assets/screenshots/connections_wifi_device_found.png) + +A successful connection is confirmed with a status indicator: + +![WiFi connection success](/assets/screenshots/connections_wifi_success.png) + +### When to Use TCP + +- Radio is on the same local network +- Testing with a simulated radio +- Environments where Bluetooth has interference issues + +## Reconnection Behavior + +The app reconnects to the **last selected device** on startup. You can manually switch transports from the connections screen at any time. + +To disconnect from a radio, use the disconnect button on the connections screen: + +![Disconnect from radio](/assets/screenshots/connections_disconnect.png) + +## Desktop Connections + +On Desktop (Linux/macOS/Windows), the app supports: + +- **Bluetooth (BLE)** — via the Kable library; works on macOS, Linux, and Windows +- **USB Serial** — primary wired connection method +- **TCP/IP** — for network-connected radios + +See [Desktop App](desktop) for platform-specific details and keyboard shortcuts. + +## Related Topics + +- [Getting Started](onboarding) — first-launch setup and permissions +- [Settings — Radio & User](settings-radio-user) — Bluetooth and network configuration +- [Desktop App](desktop) — desktop-specific connection details +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — full list of compatible radios on meshtastic.org + +--- + diff --git a/docs/sl-rSI/user/desktop.md b/docs/sl-rSI/user/desktop.md new file mode 100644 index 000000000..a688679eb --- /dev/null +++ b/docs/sl-rSI/user/desktop.md @@ -0,0 +1,147 @@ +--- +title: Desktop App +nav_order: 14 +last_updated: 2026-05-13 +description: Install and use the Meshtastic Desktop app on Linux, macOS, and Windows — connections, feature parity, and keyboard shortcuts. +aliases: + - desktop + - linux + - macos + - windows + - jvm +--- + +# Desktop App + +The Meshtastic Desktop application provides the same mesh communication features on Linux, macOS, and Windows. + +## Overview + +The Desktop app shares its core codebase with the Android app through Kotlin Multiplatform (KMP). Most features work identically across platforms. + +## Installation + +### Linux + +- Download the `.deb` or `.AppImage` package from the releases page +- Or build from source using `./gradlew :desktopApp:run` + +### macOS + +- Download the `.dmg` package from releases +- Or build from source + +### Windows + +- Download the `.msi` installer from releases +- Or build from source + +## Connecting Your Radio + +### USB Serial (Primary) + +The most reliable connection method on Desktop: + +1. Connect your Meshtastic radio via USB cable. +2. The app should detect the serial port automatically. +3. If not detected, select the correct serial port from the connections menu. + +### TCP/IP + +For network-connected radios: + +1. Enter the radio's IP address and port (default: 4403). +2. Click **Connect**. + +### Bluetooth (BLE) + +Bluetooth Low Energy is supported on Desktop via the [Kable](https://github.com/JuulLabs/kable) library: + +1. Ensure your system has a Bluetooth adapter. +2. The app scans for nearby Meshtastic radios automatically. +3. Select your device from the connections screen. + +## Feature Parity + +| Feature | Android | Desktop | Notes | +| ---------------------------------------- | ------- | ------- | -------------------------- | +| Messaging | ✓ | ✓ | Full parity | +| Node List | ✓ | ✓ | Full parity | +| Map | ✓ | ✓ | Full parity | +| Settings | ✓ | ✓ | Full parity | +| Bluetooth (BLE) | ✓ | ✓ | Via Kable on desktop | +| Firmware Update OTA | ✓ | ✗ | Use web flasher | +| Notifications | ✓ | ✓ | Native OS notifications | +| Widgets | ✓ | ✗ | Android-only | +| AI Assistant (Chirpy) | ✓\* | ✗ | Google flavor Android only | + +\*Chirpy AI requires Android 14+ on Google flavor builds with supported hardware. + +## UI Differences + +The Desktop app uses the same Compose Multiplatform UI with adaptations for larger screens and desktop interaction. + +### Keyboard Shortcuts + +| Shortcut | Action | +| ------------------- | --------------------------- | +| **⌘Q** / **Ctrl+Q** | Quit the application | +| **⌘,** / **Ctrl+,** | Open Settings | +| **⌘1** / **Ctrl+1** | Switch to Conversations tab | +| **⌘2** / **Ctrl+2** | Switch to Nodes tab | +| **⌘3** / **Ctrl+3** | Switch to Map tab | +| **⌘4** / **Ctrl+4** | Switch to Connections tab | + +### Window & System Tray + +- **Window resizing** — responsive layout adapts to window dimensions +- **System tray** — minimize to system tray for background mesh operation +- **Tray menu** — right-click the tray icon to show window or quit +- **Mouse interaction** — hover states and standard desktop navigation + +### Notification Preferences + +The Desktop app provides in-app toggles for controlling which notifications are shown — messages, new nodes, and low battery alerts. Access these from **Settings → Notifications** within the app. + +## Built-in Documentation Browser + +The Desktop app includes a built-in documentation browser for quick access to help content without leaving the application. + +![Docs browser with table of contents](/assets/screenshots/docs-browser_toc.png) + +The browser supports full-text search across all documentation: + +![Searching the docs browser](/assets/screenshots/docs-browser_search.png) + +Individual doc pages render with full formatting: + +![A documentation page](/assets/screenshots/docs-browser_page.png) + +## Building from Source + +```bash +git clone https://github.com/meshtastic/Meshtastic-Android.git +cd Meshtastic-Android +git submodule update --init +./gradlew :desktopApp:run +``` + +Requirements: + +- JDK 21 +- No Android SDK required for desktop-only builds + +## Known Limitations + +- No OTA firmware updates (use web flasher) +- Some Android-specific features (widgets, specific notification channels) are unavailable +- Performance may vary on low-spec hardware running Compose Desktop +- BLE bonding is not yet supported on desktop (pairing works without bonding) + +## Related Topics + +- [Connections](connections) — connection methods overview +- [Firmware Updates](firmware) — use the [Web Flasher](https://flasher.meshtastic.org) for desktop firmware updates + +--- + diff --git a/docs/sl-rSI/user/discovery.md b/docs/sl-rSI/user/discovery.md new file mode 100644 index 000000000..b55d35e86 --- /dev/null +++ b/docs/sl-rSI/user/discovery.md @@ -0,0 +1,114 @@ +--- +title: Discovery +nav_order: 12 +last_updated: 2026-05-13 +description: Explore your mesh network — traceroute paths, neighbor maps, and node discovery tools. +aliases: + - mesh-discovery + - local-discovery + - network-scan + - traceroute + - neighbor-info +--- + +# Discovery + +Discovery tools help you understand **how** your mesh network is connected — which nodes can hear each other, what paths messages take, and where bottlenecks or weak links exist. + +> 💡 **Tip:** You don't need a dedicated "discovery mode" to start exploring your mesh. The tools below are available right now from the node list and node detail screens. + +--- + +## Pot + +Traceroute reveals the exact path a message takes from your node to any other node on the mesh. It's the single most useful tool for debugging connectivity problems. + +### Running a Traceroute + +1. Navigate to **Nodes** and tap the node you want to trace. +2. On the node detail screen, tap **Traceroute**. +3. The app sends a traceroute request and waits for the response. +4. Results display each hop in order, with signal quality at every step. + +### Reading the Results + +A traceroute result looks like this: + +``` +You → Node A (SNR: 8.5, RSSI: -95) → Node B (SNR: 5.2, RSSI: -108) → Target +``` + +Each hop represents a relay node that forwarded the message. The SNR and RSSI values at each hop tell you about the link quality on that specific segment. + +| What to look for | What it means | +| -------------------------------------------------------------------------- | --------------------------------------------------------------------------- | +| All hops show Good SNR (> 5 dB) | Healthy path — messages flow reliably | +| One hop shows Bad SNR (< 0 dB) | Weak link — this relay segment is fragile | +| Many hops (4+) | Long path — consider repositioning a node to shorten it | +| Different path on retry | Mesh is adapting — multiple routes exist (this is good!) | + +> 💡 **Tip:** Run traceroute several times over a few minutes. If the path changes, your mesh has redundant routes — a sign of a well-connected network. + +### Troubleshooting with Traceroute + +- **"No route found"** — The target node may be offline, out of range, or on a different channel. Check that both nodes share at least one channel with the same encryption key. +- **Traceroute times out** — The path may be too long (exceeds hop limit) or a relay node is congested. Try increasing the hop limit in **Settings → LoRa Config**. +- **Asymmetric paths** — A traceroute from A→B may take a different path than B→A. This is normal — radio propagation is not always symmetric. + +--- + +## Neighbor Info + +The Neighbor Info module lets each node broadcast a list of the nodes it can **directly hear** (single-hop). When multiple nodes share their neighbor lists, you can piece together a topology map of the entire mesh. + +### Enabling Neighbor Info + +1. Navigate to **Settings → Module Config → Neighbor Info**. +2. Enable the module. +3. Set the broadcast interval (default: 900 seconds / 15 minutes). + +Once enabled, your node periodically broadcasts its neighbor table. Other nodes with Neighbor Info enabled do the same. + +### Viewing Neighbor Data + +- Open any node's detail screen and look for the **Neighbors** section. +- Each neighbor entry shows the node that was directly heard and its signal quality. +- Combine neighbor data from multiple nodes to understand the full mesh topology. + +> ⚠️ **Note:** Neighbor Info increases airtime usage because every enabled node periodically broadcasts its neighbor list. On busy meshes with many nodes, consider longer broadcast intervals (3600 seconds or more) to avoid congestion. + +--- + +## Node List as a Discovery Tool + +The node list itself is a powerful discovery tool when you use its filtering and sorting features effectively. + +### Finding New Nodes + +- Sort by **Last heard** to see the most recently active nodes at the top. +- Enable **Include unknown** to see nodes that have appeared on the mesh but haven't sent user info yet — these are often newly powered-on devices. + +### Assessing Connectivity + +- Sort by **Hops away** to see which nodes are directly reachable (0 hops) versus relayed. +- Sort by **Distance** to find nearby nodes and verify they're reachable. +- Use **Exclude MQTT** to focus on nodes reachable over radio (not via internet bridge). + +### Infrastructure Audit + +- Disable **Exclude infrastructure** to see Router, Repeater, Router Late, and Client Base nodes. +- Check their signal quality and last-heard times to verify your infrastructure nodes are healthy. + +See [Nodes](nodes) for full details on filtering and sorting options. + +--- + +## Tips for Mesh Exploration + +- **Start with traceroute** — it gives you immediate, actionable information about a specific path. +- **Enable Neighbor Info on key nodes** — especially routers and repeaters, to build a picture of the backbone. +- **Check the map** — node positions on the [Map](map-and-waypoints) combined with signal data help you understand why some links are strong and others are weak. +- **Compare signal over time** — use the [Signal Meter](signal-meter) guide to interpret SNR and RSSI values correctly. + +--- + diff --git a/docs/sl-rSI/user/firmware.md b/docs/sl-rSI/user/firmware.md new file mode 100644 index 000000000..28f6705bf --- /dev/null +++ b/docs/sl-rSI/user/firmware.md @@ -0,0 +1,114 @@ +--- +title: Firmware Updates +nav_order: 13 +last_updated: 2026-05-13 +description: Update your radio firmware over Bluetooth — OTA process, version channels, pre-flight checks, and recovery. +aliases: + - firmware + - update + - ota + - flash +--- + +# Firmware Updates + +Keep your Meshtastic radio up to date with the latest firmware for new features, bug fixes, and security improvements. + +## Checking for Updates + +1. Navigate to **Settings → Firmware Update** or tap the firmware notification if shown. +2. The app checks for available firmware versions. +3. Available updates show the version number and changelog summary. + +## Update Methods + +### OTA (Over-The-Air) via Bluetooth + +The most common update method for Android users: + +1. Ensure your radio is connected via Bluetooth. +2. Navigate to the Firmware Update screen. +3. Select the desired firmware version. +4. Tap **Update** to begin the OTA process. +5. Wait for the update to complete — **do not disconnect** during the update. + +![Firmware checking for updates](/assets/screenshots/firmware_checking.png) + +> ⚠️ **Warning:** Interrupting a firmware update can brick your device. Ensure your radio has sufficient battery (>50% recommended) and maintain Bluetooth proximity during the entire process. + +![Firmware disclaimer](/assets/screenshots/firmware_disclaimer.png) + +### USB Flashing + +For recovery or when OTA is unavailable: + +- Use the [Meshtastic Web Flasher](https://flasher.meshtastic.org) +- Or the [Meshtastic CLI tool](https://meshtastic.org/docs/getting-started/flashing-firmware) on desktop + +## Version Channels + +| Kanal | Opis | +| ------ | ------------------------------------------- | +| Stable | Recommended for most users; tested releases | +| Alpha | Preview releases; may contain bugs | + +## Pre-Update Checklist + +Before updating: + +- [ ] Battery > 50% +- [ ] Stable Bluetooth connection +- [ ] Note your current settings (they may reset on major version changes) +- [ ] Check the release notes for breaking changes + +## Post-Update + +After a successful update: + +- The radio will reboot automatically +- Bluetooth connection will re-establish +- Verify your settings are intact +- Check the firmware version in **Settings → About** + +![Firmware update success](/assets/screenshots/firmware_success.png) + +## Troubleshooting + +### Update Stuck + +If the update appears frozen: + +- Wait at least 5 minutes before intervening +- If truly stuck, power-cycle the radio +- Attempt the update again + +![Firmware update error](/assets/screenshots/firmware_error.png) + +### Device Won't Boot After Update + +If your device fails to boot: + +1. Try connecting via USB to a computer +2. Use the web flasher in recovery/DFU mode +3. Flash a known-good firmware version +4. Check the Meshtastic Discord for device-specific recovery steps + +### Compatibility Warnings + +The app may show warnings when: + +- Connected radio firmware is below minimum supported version +- Major version mismatch between app and firmware +- Deprecated features need migration + +> ⚠️ **Important:** Always update the Meshtastic app before or alongside firmware updates to ensure compatibility. + +## Related Topics + +- [Connections](connections) — reconnecting after a firmware update +- [Flashing firmware guide](https://meshtastic.org/docs/getting-started/flashing-firmware) — full firmware flashing walkthrough on meshtastic.org +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — check firmware compatibility by device +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/sl-rSI/user/map-and-waypoints.md b/docs/sl-rSI/user/map-and-waypoints.md new file mode 100644 index 000000000..0568b93a5 --- /dev/null +++ b/docs/sl-rSI/user/map-and-waypoints.md @@ -0,0 +1,116 @@ +--- +title: Map & Waypoints +nav_order: 6 +last_updated: 2026-05-13 +description: View node positions on the map, create and share waypoints, and manage position sharing and privacy. +aliases: + - map + - waypoints + - gps + - location +--- + +# Map & Waypoints + +The Map screen shows the geographic positions of nodes on your mesh, along with shared waypoints. + +## Map View + +The map displays: + +- **Node positions** — colored markers for each node reporting location +- **Waypoints** — shared points of interest +- **Your position** — your current GPS location + +### Node Markers + +Node markers on the map indicate: + +| Color | Meaning | +| ------ | ---------------------------------------------- | +| Green | Online (heard recently) | +| Yellow | Away (heard within 2 hours) | +| Gray | Offline (stale position) | +| Blue | Your own node | + +### Map Controls + +- **Zoom** — pinch or use +/- buttons +- **Pan** — drag to explore +- **Center** — select the location button to center on your position +- **Node tap** — tap a node marker to view details + +The floating toolbar provides quick access to compass, layer switching, node filters, refresh, and location tracking. Tap the compass to reorient north-up, or tap the location button to center on your current position. + +![Map controls overlay](/assets/screenshots/map_controls_overlay.png) + +## Waypoints + +Waypoints are shared geographic points of interest that all mesh members can see. + +### Creating a Waypoint + +1. Long-press on the map at the desired location. +2. Enter a name and optional description. +3. Choose an icon/emoji for the waypoint. +4. Tap **Send** to share with the mesh. + +### Waypoint Properties + +| Property | Opis | +| ---------- | ------------------------------------------------------- | +| Ime | Short identifier (max 30 characters) | +| Opis | Optional longer description | +| Icon | Visual marker emoji on the map | +| Zaklenjeno | If locked, only the creator can edit or delete | +| Expiration | Optional auto-remove time | + +### Waypoint Expiration + +Waypoints can be set to expire automatically: + +- **Never** (default) — waypoint remains until manually deleted +- **Timed** — waypoint is automatically removed after the specified duration (e.g., "remove after 2 hours"). Useful for temporary markers like rally points, hazards, or meeting locations. + +Expired waypoints are automatically hidden from the map so they don't clutter the display. The expiration countdown begins when the waypoint is created, not when other nodes receive it. + +### Managing Waypoints + +- Tap a waypoint on the map to view its details and coordinates +- Edit or delete waypoints you created +- **Locked waypoints** cannot be modified or deleted by other nodes — only the original creator can change them +- Unlocked waypoints can be edited by any mesh member + +## Position Sharing + +### Enabling Position Sharing + +Your node shares its GPS position based on: + +- **Fixed interval** — broadcast position at regular intervals +- **Smart position** — broadcast when movement exceeds a threshold +- **Manual** — only share when explicitly requested + +Configure position behavior in **Settings → Position**. + +### Privacy Considerations + +> 🔒 **Privacy:** Position data is broadcast to all nodes on your channel. If you don't want your location shared, disable GPS position in settings or use a fixed/fake position. + +## Map Sources + +The app supports multiple map tile sources: + +- OpenStreetMap (default) +- Satellite imagery (where available) +- Offline tiles (download map areas for offline use) + +## Related Topics + +- [Nodes](nodes) — view and filter your node list +- [Node Metrics](node-metrics) — signal quality and position history for individual nodes +- [Discovery](discovery) — traceroute and neighbor info for understanding mesh topology +- [Units & Locale](units-and-locale) — distance and coordinate display formats + +--- + diff --git a/docs/sl-rSI/user/messages-and-channels.md b/docs/sl-rSI/user/messages-and-channels.md new file mode 100644 index 000000000..ae9993759 --- /dev/null +++ b/docs/sl-rSI/user/messages-and-channels.md @@ -0,0 +1,159 @@ +--- +title: Messages & Channels +nav_order: 3 +last_updated: 2026-05-13 +description: Send and receive messages, manage channels, configure encryption, and use quick chat, reactions, and message actions. +aliases: + - channels + - direct-messages + - messaging + - conversations +--- + +# Messages & Channels + +Meshtastic supports two communication modes: **channel broadcasts** and **direct messages**. + +## Channels + +Channels are shared communication groups. All nodes configured with the same channel key can read and send messages on that channel. + +### Default Channel + +Every Meshtastic device comes with a default **LongFast** channel. This is an unencrypted channel used for general mesh communication. + +### Channel Security + +Channels support multiple encryption levels: + +| Icon | Security Level | Opis | +| ---- | ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------- | +| 🔒 | PSK (256-bit AES) | Fully encrypted with a strong pre-shared key. Only nodes with the matching key can read messages. | +| 🔐 | PSK (128-bit AES) | Encrypted with a shorter key. Secure for most uses but 256-bit is preferred for sensitive data. | +| 🔓 | Default / Open | Uses the well-known default key. **Any Meshtastic device** on the same preset can read these messages. | +| ⚠️ | Insecure + Position | Open channel that also broadcasts your GPS position. Use with caution in public meshes. | + +> 🔒 **Security Tip:** 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. + +### Adding a Channel + +1. Navigate to **Settings → Channels**. +2. Tap **Add Channel** or scan a QR code. +3. Configure the channel name and encryption key. +4. Share the channel URL/QR code with others who need access. + +Tapping a channel shows its details and sharing options. + +## Direct Messages + +Direct messages (DMs) are point-to-point encrypted communications between two specific nodes. + +### Sending a Direct Message + +1. Open the **Messages** tab. +2. Select a node from your contacts list or tap a node in the node list. +3. Type your message and tap **Send**. + +### Message States + +| State | Icon | Meaning | +| --------------------------------- | ---- | ----------------------------------------------------------------------------------------------------------------- | +| Queued | ⏳ | Message waiting to be sent | +| En route | ✓ | Delivered to the radio, awaiting acknowledgment | +| Delivered | ✓✓ | Acknowledgment received from recipient | +| Received | ✓ | Message received from the mesh (incoming) | +| S&F Routing | 🔗 | Store & Forward: message being routed through an S&F node | +| S&F Confirmed | 🔗 | Store & Forward: delivery confirmed via S&F node | +| Napaka | ✗ | Delivery failed after retries | + +### Delivery Errors + +When a message fails to deliver, the error indicator shows what went wrong: + +| Napaka | Meaning | What to Do | +| ---------------- | ---------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| No Route | No path exists to the destination node | The recipient may be offline or out of mesh range. Try later or move closer. | +| Got NAK | The next-hop node refused to relay | The relay node may be congested. Wait and retry. | +| Časovna omejitev | No acknowledgment within retry window | The recipient may be just out of range. Try increasing hop limit or moving to a better position. | +| Brez vmesnika | No radio interface available to send | Check that your radio is connected and the channel is configured. | +| Max Retransmit | All retry attempts exhausted | The mesh path is unreliable. Try a different channel or wait for conditions to improve. | +| Brez kanala | The destination channel doesn't exist | Verify both nodes share the same channel configuration. | +| Too Large | Message exceeds maximum payload size | Shorten your message (max ~230 characters). | +| No Response | Node received message but didn't respond | The recipient's radio may be busy or in low-power sleep mode. | +| Duty Cycle Limit | Regional airtime limit reached | Your radio has used its allowed transmit time. Wait for the duty cycle window to reset (typically 1 hour in EU regions). | +| Slaba zahteva | Malformed or invalid message | This usually indicates a software bug. Try restarting the app. | + +> 💡 **Tip:** 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. + +## Message Features + +### Quick Chat + +Pre-configured messages for rapid communication: + +- Access via the Quick Chat button in the message input area +- Choose from built-in phrases or custom messages +- Customize quick chat messages in **Settings → Quick Chat** +- Useful when typing is impractical (gloves, small screen, urgent) + +![Quick chat option](/assets/screenshots/messages_quick_chat.png) + +The channel list shows each channel with its latest message preview. + +### Message Bubbles + +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. + +### Reactions + +React to messages with emoji: + +- **Long-press** a message to open the actions menu +- Tap **Add Reaction** to choose an emoji +- Reactions appear below the message bubble +- Multiple users can react to the same message +- React to your own messages or others' messages + +![Emoji reaction badges displayed beneath a message](/assets/screenshots/messages_reaction.png) + +> 💡 **Tip:** Reactions are lightweight — they use minimal mesh bandwidth compared to full text messages. + +### Message Actions + +Long-press any message to access: + +- **Copy** — copy message text to clipboard +- **Reply** — quote the message in your response +- **React** — add an emoji reaction +- **Delete** — remove a message you sent (local deletion) + +### Message Priority + +Messages are queued and transmitted based on priority: + +1. Emergency/alert messages (highest) +2. Direct messages +3. Channel broadcasts (lowest) + +### Message Limits + +- **Maximum length:** 237 bytes (approximately 230 characters for ASCII text) +- **Rate limiting:** The mesh enforces airtime fairness; heavy message volume may be throttled +- **Delivery:** Messages are retried automatically if no acknowledgment is received + +## Best Practices + +- Use channels for group coordination +- Use direct messages for private person-to-person communication +- Keep messages short — mesh bandwidth is limited +- Configure encryption for sensitive communications + +## Related Topics + +- [Nodes](nodes) — tap a node to start a direct message +- [Settings — Radio & User](settings-radio-user) — configure channel encryption and presets +- [MQTT](mqtt) — bridge channel messages to the internet +- [Channel configuration](https://meshtastic.org/docs/configuration/radio/channels) — detailed channel settings on meshtastic.org + +--- + diff --git a/docs/sl-rSI/user/mqtt.md b/docs/sl-rSI/user/mqtt.md new file mode 100644 index 000000000..8108f2c93 --- /dev/null +++ b/docs/sl-rSI/user/mqtt.md @@ -0,0 +1,137 @@ +--- +title: MQTT +nav_order: 11 +last_updated: 2026-05-13 +description: Bridge your mesh to the internet — MQTT broker setup, encryption layers, and map reporting. +aliases: + - mqtt + - internet-bridge + - broker +--- + +# MQTT + +MQTT bridges your Meshtastic mesh network to the internet, enabling long-range communication beyond radio range. + +## Overview + +The MQTT module connects your node to an MQTT broker, allowing: + +- Messages to reach nodes on different physical meshes via the internet +- Integration with home automation and monitoring systems +- Publishing node positions to the public Meshtastic map +- Custom data pipelines for logging and alerting + +## How It Works + +``` +[Your Node] → Radio → [Gateway Node with WiFi] → MQTT Broker → [Remote Gateway] → Radio → [Remote Node] +``` + +A gateway node with internet access (WiFi or Ethernet) publishes mesh messages to an MQTT topic. Remote gateways subscribed to the same topic inject those messages into their local mesh. + +## Configuration + +### Enabling MQTT + +1. Navigate to **Settings → Module Config → MQTT**. +2. Enable the MQTT module. +3. Configure the broker connection: + +![MQTT toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | Opis | Default | +| --------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------- | +| Server Address | MQTT broker hostname | mqtt.meshtastic.org | +| Username | Broker authentication | meshdev | +| Password | Broker authentication | large4cats | +| Root Topic | Base topic for messages | msh | +| Encryption | Encrypt MQTT payload | Enabled | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON packet support has been removed from firmware; this field is ignored | Disabled | +| TLS | Secure connection to broker | Disabled | +| Map Reporting | Report position to public map | Disabled | + +### Default Meshtastic Broker + +The community maintains a public broker at `mqtt.meshtastic.org`. This is intended for general use and testing. + +> 🔒 **Privacy:** Messages on the public broker are readable by anyone subscribed. Always use channel encryption for private communications. + +### Private Broker + +For better privacy and control, you can run your own MQTT broker: + +- Mosquitto (lightweight, open-source) +- HiveMQ +- EMQX + +Configure your node to point to your private broker with appropriate credentials. + +## Map Reporting + +When Map Reporting is enabled, your node publishes its position to the Meshtastic community map: + +- Visible at [meshmap.net](https://meshmap.net) and similar community map services +- Only position and node info are shared +- Disable this if you don't want your location publicly visible + +## Uplink vs Downlink + +| Direction | Opis | +| ------------ | -------------------------------- | +| **Uplink** | Messages from mesh → MQTT broker | +| **Downlink** | Messages from MQTT broker → mesh | + +Configure per-channel which directions are active to control message flow and airtime usage. + +## Message Formats + +MQTT uses protobuf message format: + +| Format | Opis | Use case | +| ------------ | ----------------------------------- | -------------------------- | +| **Protobuf** | Binary Meshtastic protobuf encoding | Node-to-node mesh bridging | + +> ⚠️ **Note:** JSON output support was removed from firmware. The `json_enabled` setting is still visible in the app for legacy compatibility but has no effect on current firmware versions. + +## Encryption & Privacy + +Understanding the layered encryption model: + +1. **Channel encryption** happens on the mesh _before_ MQTT. If your channel has a PSK, the MQTT payload is already encrypted — the broker and any subscribers see only the ciphertext. +2. **MQTT encryption** (the module setting) adds an additional encryption layer for transit to the broker. This protects metadata and routing information. +3. **TLS** encrypts the TCP connection to the broker itself, preventing network-level eavesdropping. + +> 🔒 **Important:** The default public channel has a well-known key. Messages on the default channel sent via MQTT are effectively **unencrypted** — anyone can decode them. Always use a custom PSK for private communications. + +## Best Practices + +- Use channel-level encryption (PSK) on channels that bridge to MQTT +- Don't enable MQTT on nodes without internet access (it will buffer and waste memory) +- Use a private broker for sensitive deployments +- Be mindful of airtime when downlinking messages from busy MQTT topics — every downlinked message consumes radio airtime on your local mesh +- Consider enabling uplink-only if you only need to monitor your mesh remotely without injecting messages back + +## Troubleshooting + +### MQTT Not Connecting + +- **Check WiFi** — the gateway node must have an active internet connection (WiFi or Ethernet). MQTT does not work over the LoRa radio link itself. +- **Verify credentials** — incorrect username or password will silently fail on most brokers. Double-check for trailing spaces. +- **Firewall** — port 1883 (MQTT) or 8883 (MQTT+TLS) must be open. Some networks block non-standard ports. +- **DNS resolution** — if using a custom broker hostname, verify the node can resolve it. Try the broker's IP address directly. + +### Messages Not Bridging + +- **Check uplink/downlink settings** — if only uplink is enabled, messages flow from mesh to MQTT but not back. Enable downlink on the receiving gateway. +- **Channel mismatch** — both gateways must share the same channel with the same PSK. A mismatch means messages are encrypted with different keys and appear as garbage. +- **Topic mismatch** — ensure both gateways use the same root topic. The default `msh` works for the public broker. + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — MQTT module configuration reference +- [Messages & Channels](messages-and-channels) — channel encryption and PSK setup +- [MQTT integration guide](https://meshtastic.org/docs/software/integrations/mqtt) — detailed MQTT documentation on meshtastic.org + +--- + diff --git a/docs/sl-rSI/user/node-metrics.md b/docs/sl-rSI/user/node-metrics.md new file mode 100644 index 000000000..570843847 --- /dev/null +++ b/docs/sl-rSI/user/node-metrics.md @@ -0,0 +1,130 @@ +--- +title: Node Metrics +nav_order: 5 +last_updated: 2026-05-13 +description: Telemetry dashboards for each mesh node — device health, environment sensors, signal quality, power, traceroute, and position history. +aliases: + - metrics + - telemetry + - device-metrics + - signal +--- + +# Node Metrics + +The node detail screen provides comprehensive telemetry and metrics for each node on your mesh. + +## Device Metrics + +Basic operating information reported by each node: + +| Metric | Opis | +| -------------- | ----------------------------------- | +| Battery Level | Current battery percentage | +| Voltage | Battery voltage reading | +| Uporaba kanala | Percentage of airtime consumed | +| Airtime | Transmission time used by this node | +| Uptime | Time since last reboot | + +Device metrics are displayed as individual cards with trend sparklines showing battery level, voltage, channel utilization, airtime, and uptime over time. + +> 💡 **Tip:** Tap any metric card to expand it into a full chart with historical data points. Pinch to zoom the time axis. + +## Environment Metrics + +Environmental sensor data (requires compatible hardware): + +| Metric | Sensor Examples | +| ------------------------------------ | --------------------- | +| Temperatura | BME280, BME680, SHT31 | +| Vlaga | BME280, BME680, SHT31 | +| Barometric Pressure | BME280, BMP280 | +| Gas Resistance | BME680 | +| IAQ (Air Quality) | BME680 | + +Environment metrics are charted over time for easy trend analysis — temperature, humidity, and pressure each get their own line chart with the measurement unit displayed on the Y axis. + +> 💡 **Tip:** Environment metrics require a sensor connected to the remote node. Not all nodes report environmental data. See [Telemetry & Sensors](telemetry-and-sensors) for a full list of supported sensors. + +## Signal Metrics + +Radio signal quality information: + +| Metric | Opis | +| --------- | ----------------------------------------------------------------------------- | +| SNR | Signal-to-Noise Ratio (higher is better) | +| RSSI | Received Signal Strength Indicator (closer to 0 is better) | +| Hop Count | Number of mesh hops for last message | + +### Signal Quality Reference + +| SNR Range | Quality | +| --------------------------------- | --------- | +| > 10 dB | Excellent | +| 0 to 10 dB | Dober | +| -10 to 0 dB | Precejšen | +| < -10 dB | Poor | + +## Power Metrics + +Power management telemetry (requires INA sensor or compatible hardware): + +| Metric | Opis | +| ----------- | ----------------------- | +| Bus Voltage | Supply voltage | +| Current | Power draw in milliamps | +| Power | Calculated wattage | + +## Pot + +Traceroute shows the path a message takes through the mesh: + +1. From the node detail screen, tap **Traceroute**. +2. The app sends a traceroute request to the target node. +3. Results show each hop with SNR/RSSI values. + +### Reading Traceroute Results + +``` +You → Node A (SNR: 8.5) → Node B (SNR: 5.2) → Target +``` + +Each hop represents a relay node that forwarded the message. + +## Dnevnik lokacije + +Historical position data for nodes that share their location: + +- GPS coordinates +- Altitude +- Speed (if moving) +- Timestamp for each position report + +## Neighbor Info + +Shows which nodes a given node can directly hear, useful for understanding mesh topology. + +## Viewing Metrics + +1. Navigate to **Nodes**. +2. Tap the node you want to inspect. +3. Select the metric category from the detail tabs. + +![Node detail — local device](/assets/screenshots/nodes_detail_local.png) + +The position tab shows location data for nodes that share GPS: + +![Position inline content](/assets/screenshots/nodes_position.png) + +> ⚠️ **Note:** Metrics are only available when they have been reported by the remote node. Metrics update at intervals configured on each node's telemetry settings. + +## Related Topics + +- [Nodes](nodes) — node list, filtering, and sorting +- [Telemetry & Sensors](telemetry-and-sensors) — supported sensors and configuration +- [Signal Meter](signal-meter) — how signal quality is calculated from SNR and RSSI +- [Discovery](discovery) — traceroute details and neighbor info +- [Units & Locale](units-and-locale) — temperature, distance, and speed display formats + +--- + diff --git a/docs/sl-rSI/user/nodes.md b/docs/sl-rSI/user/nodes.md new file mode 100644 index 000000000..d0c0a91f0 --- /dev/null +++ b/docs/sl-rSI/user/nodes.md @@ -0,0 +1,152 @@ +--- +title: Nodes +nav_order: 4 +last_updated: 2026-05-13 +description: Browse, filter, and sort mesh nodes — view details, signal quality, roles, and quick actions. +aliases: + - node-list + - mesh-nodes + - peers +--- + +# Nodes + +The Nodes screen displays all devices visible on your mesh network. + +## Node List + +The node list shows every node your radio has heard, including: + +- **Node name** — user-configured long name +- **Short name** — 4-character identifier +- **Signal quality** — last heard signal strength +- **Last heard** — time since last communication +- **Distance** — estimated distance (if positions are shared) +- **Battery** — remote node battery level (if telemetry is enabled) + +### Node Status Indicators + +| Badge | Meaning | +| ---------- | ------------------------------------- | +| 🟢 Online | Node heard within the last 15 minutes | +| 🟡 Away | Node heard within the last 2 hours | +| 🔴 Offline | Node not heard for over 2 hours | +| ⭐ Favorite | Node marked as favorite by the user | + +### Node Roles + +Nodes can be configured with different roles that affect their mesh behavior: + +| Role | Opis | +| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Client | Standard end-user device | +| Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | +| Client Mute | Receives but doesn't retransmit | +| Client Hidden | Like Client Mute, plus hides from node list | +| Router | Prioritizes message forwarding; stays awake to relay | +| Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | +| ~~Router Client~~ | ⚠️ **Deprecated** (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | +| ~~Repeater~~ | ⚠️ **Deprecated** (removed in firmware 2.7.11) — no longer selectable; use Router instead | +| Tracker | Optimized for position reporting at regular intervals | +| Sensor | Optimized for telemetry reporting | +| TAK | Interoperates with TAK systems (sends/receives CoT) | +| TAK Tracker | TAK position reporting only | +| Lost & Found | Continuous position beacon for recovery | + +### Choosing a Role + +Most users should keep the default **Client** role. Consider a different role when: + +- **Router** — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don't use Router on battery-powered handheld devices. +- **Router Late** — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. +- **Client Base** — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. +- **Client Mute** — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only devices or to reduce congestion in dense areas. +- **Tracker** — An unattended device whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. +- **Sensor** — An unattended device reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. +- **TAK / TAK Tracker** — Only needed if interoperating with ATAK/WinTAK systems. See [TAK Integration](tak) for details. + +> 💡 **Tip:** The mesh works best when most nodes are **Client** or **Router**. Too many Mute nodes reduces mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. + +### Encryption Indicators + +Nodes display encryption status icons next to their name: + +| Icon | Meaning | +| ----------- | ------------------------------------------------------------------------------------------------------------------- | +| 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | +| 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | +| ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) | + +> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. + +## Quick Actions + +From the node list, you can: + +- **Tap** a node to view its detail page +- **Long-press** for quick actions: + - Send a direct message + - View on map + - Zahtevaj položaj + - Mark as favorite + - Pot + +## Filtering & Sorting + +### Text Search + +Type in the search field to filter nodes by name or short name. The filter updates in real time as you type. + +### Filter Toggles + +| Filter | Opis | +| -------------------------- | ---------------------------------------------------------------------------------------------- | +| **Only online** | Show only nodes heard within the last 15 minutes | +| **Only direct** | Show only nodes with direct (non-relayed) connections | +| **Include unknown** | Show nodes that haven't sent user info yet | +| **Exclude infrastructure** | Hide infrastructure-role nodes (Router, Repeater, Router Late, Client Base) | +| **Exclude MQTT** | Hide nodes heard only via MQTT internet bridge | +| **Show ignored** | Show nodes you've previously dismissed or muted | + +### Sort Options + +| Sort | Opis | +| ------------------------------------------- | ------------------------------------------------------------------ | +| **Last heard** (default) | Most recently heard nodes first | +| **Alphabetical** | Sorted by node long name | +| **Distance** | Nearest nodes first (requires position sharing) | +| **Hops away** | Fewest relay hops first | +| **Channel** | Grouped by channel index | +| **Via MQTT** | Grouped by MQTT vs. radio-heard | +| **Favorites** | Favorited nodes first | + +## Node Detail + +Tapping a node opens the detail view with comprehensive information. See [Node Metrics](node-metrics) for full details on metrics and telemetry. + +![Node detail view](/assets/screenshots/nodes_node_list.png) + +The detail screen includes device info, position, and action buttons: + +![Node detail section](/assets/screenshots/nodes_detail_section.png) + +Inline status indicators show key metrics at a glance: + +| Indicator | Screenshot | +| ---------------- | -------------------------------------------------------- | +| Signal quality | ![Signal](/assets/screenshots/nodes_signal_info.png) | +| Battery level | ![Battery](/assets/screenshots/nodes_battery_info.png) | +| Hop count | ![Hops](/assets/screenshots/nodes_hops_info.png) | +| Nazadnje slišano | ![Last heard](/assets/screenshots/nodes_last_heard.png) | +| Razdalja | ![Distance](/assets/screenshots/nodes_distance_info.png) | + +## Related Topics + +- [Node Metrics](node-metrics) — detailed telemetry dashboards for each node +- [Messages & Channels](messages-and-channels) — send a direct message to a node +- [Map & Waypoints](map-and-waypoints) — view node positions geographically +- [Discovery](discovery) — traceroute and neighbor info for topology exploration +- [Signal Meter](signal-meter) — understand what the signal bars mean + +--- + diff --git a/docs/sl-rSI/user/onboarding.md b/docs/sl-rSI/user/onboarding.md new file mode 100644 index 000000000..3b910534e --- /dev/null +++ b/docs/sl-rSI/user/onboarding.md @@ -0,0 +1,99 @@ +--- +title: Getting Started +nav_order: 1 +last_updated: 2026-05-13 +description: First-launch setup — permissions, onboarding flow, and next steps after connecting your radio. +aliases: + - first-launch + - setup + - intro +--- + +# Getting Started + +Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app. + +## First Launch + +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. + +### Welcome Screen + +The welcome screen introduces Meshtastic and its core capabilities: + +- Off-grid mesh communication +- No cellular or internet required +- End-to-end encrypted messaging + +Tap **Get Started** to proceed through the setup flow. + +![Welcome screen](/assets/screenshots/onboarding_welcome.png) + +## Permissions + +The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. + +### Bluetooth Permission + +Bluetooth is the primary connection method between your phone and Meshtastic radio: + +- **Bluetooth scanning** — discover nearby Meshtastic radios +- **Bluetooth connect** — establish and maintain connections with paired radios + +Grant both permissions when prompted. Without Bluetooth, you'll need to use USB or TCP connections instead. + +### Location Permission + +> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. + +Meshtastic also uses your location for: + +- Showing your position on the mesh map +- Calculating distances to other nodes +- Sharing your GPS coordinates with other mesh members (if enabled) + +Grant **"While using the app"** or **"Always"** depending on your preference: + +- **While using the app** — position updates only when the app is open +- **Always** — enables background position updates for always-on mesh presence + +If denied, Bluetooth scanning will not function and your node will not report a position. + +### Notifications Permission + +Notifications alert you to: + +- Incoming messages from channels and direct messages +- Connection status changes (connected, disconnected, reconnecting) +- Firmware update availability + +> 💡 **Tip:** You can fine-tune notification preferences later in Android system settings. The app creates separate notification channels for messages, connection events, and background service status. + +### Critical Alerts Permission + +On supported devices, the app may request permission for critical alerts: + +- These are high-priority notifications that can break through Do Not Disturb mode +- Useful for emergency mesh alerts or urgent messages +- You can **skip** this step if you don't need breakthrough notifications +- Configure or revoke later in Android notification settings + +## After Setup + +Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. + +> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. + +## What's Next? + +Once connected to a radio, explore: + +- [Connections](connections) — pair your first radio device +- [Messages & Channels](messages-and-channels) — send your first message +- [Nodes](nodes) — see who's on your mesh +- [Map & Waypoints](map-and-waypoints) — view node positions +- [Settings](settings-radio-user) — configure your radio and user profile + +New to Meshtastic? The [getting started guide](https://meshtastic.org/docs/getting-started) on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup. + +--- diff --git a/docs/sl-rSI/user/settings-module-admin.md b/docs/sl-rSI/user/settings-module-admin.md new file mode 100644 index 000000000..d8dbbee16 --- /dev/null +++ b/docs/sl-rSI/user/settings-module-admin.md @@ -0,0 +1,246 @@ +--- +title: Settings — Modules & Admin +nav_order: 8 +last_updated: 2026-05-13 +description: Configure optional feature modules (MQTT, telemetry, canned messages, TAK, and more) and perform device administration. +aliases: + - modules + - module-config + - administration +--- + +# Settings — Modules & Admin + +Configure optional feature modules and perform device administration. Modules extend Meshtastic with specialized capabilities — each can be independently enabled or disabled. + +> 💡 **Tip:** You only need to enable the modules you actually use. Disabling unused modules reduces airtime, saves battery, and simplifies your configuration. + +Module settings use a card-based layout with toggle switches, dropdowns, text fields, and sliders: + +![Toggle switch](/assets/screenshots/settings_switch.png) + +![Dropdown selector](/assets/screenshots/settings_dropdown.png) + +![Text field](/assets/screenshots/settings_text_field.png) + +![Settings card layout](/assets/screenshots/settings_titled_card.png) + +## Module Configuration + +### MQTT Module + +Bridges mesh messages to and from an MQTT broker for internet connectivity. This is how you extend your mesh beyond radio range or integrate with home automation systems. + +| Setting | Opis | +| --------------- | ------------------------------------------------------------------------ | +| Enabled | Toggle MQTT bridge | +| Server | MQTT broker address | +| Username | Authentication username | +| Password | Authentication password | +| Encryption | Encrypt MQTT payloads | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON support removed from firmware; field is ignored | +| TLS | Use secure connection | +| Root Topic | Base MQTT topic path | +| Map Report | Publish position for public map | + +See [MQTT](mqtt) for a detailed usage guide including encryption, privacy, and broker setup. + +### Serial Module + +Enables serial port communication for external device integrations (GPS modules, sensors, or custom hardware). When enabled, the node's serial port can send and receive protobuf or text data, allowing external microcontrollers or computers to interact with the mesh. + +| Setting | Opis | +| ---------- | ------------------------------- | +| Enabled | Activate serial communication | +| Echo | Echo received serial data back | +| Mode | Text, Protobuf, or NMEA output | +| RX/TX Pins | GPIO pins for serial connection | +| Baud Rate | Serial communication speed | + +### External Notification Module + +Controls buzzer, LED, or vibration alerts on your radio hardware. Useful for devices that need to physically signal when a message arrives — particularly helpful for unattended or outdoor installations. + +| Setting | Opis | +| -------------------------------- | --------------------------- | +| Enabled | Activate notifications | +| Alert Message | Notify on incoming messages | +| Alert Message Buzzer | Use buzzer for messages | +| Alert Message Vibra | Use vibration for messages | +| Alert Bell | Notify on bell character | +| Output (GPIO) | Pin for notification output | +| Active | High or Low active | +| Duration (ms) | Notification length | +| Use I2S as Buzzer | Use I2S audio output | + +### Store & Forward Module + +Buffers messages for nodes that were temporarily offline, then replays them when those nodes reconnect. Essential for meshes where nodes go in and out of range regularly — ensures messages aren't lost during brief disconnections. + +| Setting | Opis | +| ------------------------------------------ | -------------------------- | +| Enabled | Activate store and forward | +| Heartbeat (s) | Announcement interval | +| Records | Maximum stored messages | +| History Return (max) | Max messages to replay | +| History Return (window) | Time window for replay | + +> 💡 **Tip:** Store and Forward works best on nodes with ample memory (ESP32 with PSRAM). Router nodes are ideal candidates since they're typically always-on. + +### Range Test Module + +Automated range testing tool for evaluating link quality between nodes. When enabled, the node periodically transmits test messages with incrementing counters. A receiver node logs these messages, allowing you to walk or drive away and later analyze at what distance messages stopped arriving. + +| Setting | Opis | +| -------------------------------------- | --------------------------------- | +| Enabled | Activate range testing | +| Sender Interval (s) | Time between test transmissions | +| Save CSV | Log received test data to SD card | + +### Telemetry Module + +Controls what telemetry data your node shares with the mesh. Telemetry includes device health (battery, uptime) and environmental sensor data (temperature, humidity, pressure). + +| Setting | Opis | +| ---------------------------- | --------------------------------------- | +| Device Metrics Interval | How often to report device metrics | +| Environment Metrics Interval | How often to report environment sensors | +| Air Quality Enabled | Report particulate sensor data | +| Power Metrics Enabled | Report power usage | + +See [Telemetry & Sensors](telemetry-and-sensors) for supported sensors and configuration recommendations. + +### Canned Message Module + +Pre-configured messages accessible from the device's physical buttons (for radios with rotary encoders, keypads, or similar input hardware). Define a list of quick-send messages that can be transmitted without a phone connected — ideal for field use. + +| Setting | Opis | +| ------------------ | ----------------------------------------------------------- | +| ~~Enabled~~ | ⚠️ **Deprecated** — current firmware may ignore this toggle | +| Messages | Newline-separated list of messages | +| Send Bell | Play bell sound on send | +| Rotary Encoder | Enable rotary encoder input | +| Up/Down/Press Pins | GPIO pin assignments for input | + +### Audio Module + +Codec2 audio support for low-bandwidth voice communication over the mesh. This is an **experimental** feature that encodes voice into very small data packets using the Codec2 codec. + +| Setting | Opis | +| --------------- | -------------------------------- | +| Enabled | Activate audio module | +| Codec2 Rate | Audio quality/bandwidth tradeoff | +| I2S Word Select | GPIO pin for I2S WS | +| I2S Data In | GPIO pin for I2S DIN | +| I2S Data Out | GPIO pin for I2S DOUT | + +> ⚠️ **Note:** Audio requires specific hardware (I2S microphone and speaker). Voice quality is very low-bandwidth — think "understandable radio voice," not phone-call quality. + +### Remote Hardware Module + +GPIO control over the mesh network. Allows a remote node to read or write GPIO pins on another node — useful for activating relays, reading switches, or controlling external hardware from a distance. + +| Setting | Opis | +| -------------------- | --------------------------------------------------------------- | +| Enabled | Activate remote GPIO access | +| Allow Undefined Pins | Allow access to any GPIO pin (security risk) | + +> ⚠️ **Warning:** Enabling "Allow Undefined Pins" gives remote nodes access to all GPIO pins, which could interfere with the radio's own hardware. Only enable on dedicated GPIO nodes. + +### Neighbor Info Module + +Broadcasts information about directly heard neighbors, enabling mesh topology mapping. Each enabled node periodically shares a list of the other nodes it can hear and their signal quality. + +| Setting | Opis | +| -------------------------------------- | ------------------------------------ | +| Enabled | Activate neighbor broadcasting | +| Update Interval (s) | How often to broadcast neighbor list | + +See [Discovery](discovery) for how to use neighbor data for mesh topology exploration. + +### Ambient Lighting Module + +Controls onboard NeoPixel or other addressable RGB LEDs on supported hardware. Can be used for visual status indicators, notification lights, or decorative effects. + +| Setting | Opis | +| ------------------ | ---------------------------------------------------------- | +| Enabled | Activate LED control | +| LED State | On, Off, or set specific color | +| Red / Green / Blue | Individual color channel values (0–255) | + +### Detection Sensor Module + +Turns your node into a motion or door sensor alert system. When a GPIO pin detects a state change (motion detected, door opened), the node broadcasts an alert message over the mesh. + +| Setting | Opis | +| ---------------------------------------- | ----------------------------------------------------------------------- | +| Enabled | Activate detection sensor | +| Monitor Pin | GPIO pin connected to sensor | +| Detection Triggered High | Trigger when pin goes high (vs. low) | +| Minimum Broadcast (s) | Minimum time between alert broadcasts | +| State Broadcast (s) | Periodic state broadcast interval | +| Send Bell | Include bell character in alerts | +| Friendly Name | Custom name for this sensor | + +### Paxcounter Module + +People counter using WiFi and BLE probe requests. Counts nearby devices by passively listening for probe requests that phones and laptops emit when scanning for networks. Available only on ESP32 devices. + +| Setting | Opis | +| -------------------------------------- | -------------------------- | +| Enabled | Activate people counting | +| Update Interval (s) | How often to report counts | + +> 💡 **Tip:** Paxcounter is useful for estimating foot traffic at trailheads, event venues, or other locations. Counts are approximate — one person may carry multiple devices. + +### TAK Module + +Team Awareness Kit integration for interoperability with ATAK and WinTAK. See [TAK Integration](tak) for detailed setup and usage. + +## Administracija + +### Administracija na daljavo + +Remotely configure nodes that share your admin key: + +1. Select the target node in the node list. +2. Navigate to **Settings** for that node. +3. Modify configuration. +4. Tap **Save** — changes are sent over the mesh. + +> ⚠️ **Requires:** Admin key configured on both your node and the target node. + +### Clean Node Database + +Removes stale nodes from your local database that haven't been heard in a configurable time window. + +### Factory Reset + +Resets all settings to factory defaults. **This cannot be undone.** + +### Ponovni zagon + +Remotely reboot a connected or administered node. + +### Plošča za odpravljanje napak + +View detailed diagnostic information: + +- Protocol buffers debug output +- Mesh packet log +- Connection state details + +### Troubleshooting Remote Admin + +- **"No response from target node"** — the target may be out of range, offline, or have a mismatched admin key. Verify the admin key matches on both nodes. +- **Changes not applying** — some settings require a reboot to take effect. Try the Reboot action after saving. +- **Can't see remote settings** — ensure your node has the admin key for the target node and that Admin Channel is enabled in Security Config. + +## Related Topics + +- [Settings — Radio & User](settings-radio-user) — core radio and user profile settings +- [Module configuration reference](https://meshtastic.org/docs/configuration/module) — detailed module docs on meshtastic.org +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/sl-rSI/user/settings-radio-user.md b/docs/sl-rSI/user/settings-radio-user.md new file mode 100644 index 000000000..7a44ed2bb --- /dev/null +++ b/docs/sl-rSI/user/settings-radio-user.md @@ -0,0 +1,173 @@ +--- +title: Settings — Radio & User +nav_order: 7 +last_updated: 2026-05-13 +description: Configure your radio hardware, LoRa presets, user profile, position sharing, power management, and security. +aliases: + - settings + - radio-config + - user-config + - lora +--- + +# Settings — Radio & User + +Configure your radio hardware and user identity parameters. + +## User Settings + +### User Profile + +| Setting | Opis | +| ----------------- | ------------------------------------------------------------------------------------- | +| Long Name | Your display name (up to 39 characters) | +| Short Name | 4-character abbreviated name | +| Licensed Operator | Enable if you hold an amateur radio license (enables higher power) | + +### Applying Changes + +After modifying settings, tap **Save** to write the configuration to your radio. The device may reboot to apply changes. + +## Radio Configuration + +### Device Config + +| Setting | Opis | Default | +| ------------------------------------------ | ----------------------------------------------------------------------- | -------- | +| Role | Node behavior (Client, Router, etc.) | Client | +| Rebroadcast Mode | How the node retransmits messages | All | +| Node Info Broadcast (s) | Interval for broadcasting node info | 10800 | +| Double-tap Button | Action for double-tap button press | Disabled | + +### LoRa Config + +| Setting | Opis | Default | +| ----------------- | ----------------------------------------------------------------------- | ----------------------------------------- | +| Regija | Regulatory region for frequency bands | Unset (must configure) | +| Modem Preset | Speed/range tradeoff | LongFast | +| Hop Limit | Maximum retransmit hops | 3 | +| TX Power | Transmission power (dBm); 0 = max allowed for region | 0 (region max) | +| Frequency Offset | Fine-tune frequency (MHz) | 0 | +| Channel Bandwidth | Bandwidth setting | Default for preset | + +> ⚠️ **Important:** You **must** set your region before transmitting. Operating without the correct region may violate local radio regulations. See the [region configuration guide](https://meshtastic.org/docs/getting-started/initial-config) on meshtastic.org for details. + +### Modem Presets + +| Preset | Range | Speed | SNR Limit | Best For | +| ------------------ | ----------------------- | ------------------------- | ------------------------ | -------------------------------------------------------------------------------------------------------- | +| Short Turbo | ~1 km | 21.9 kbps | −5 dB | Dense urban with line-of-sight; data-heavy applications | +| Short Fast | ~3 km | 10.9 kbps | −7.5 dB | Urban neighborhoods; buildings within a few blocks | +| Short Slow | ~5 km | 5.5 kbps | −10 dB | Suburban short-range; moderate building density | +| Medium Fast | ~5 km | 5.5 kbps | −10 dB | Suburban areas; moderate building density | +| Medium Slow | ~8 km | 1.1 kbps | −12.5 dB | Suburban/rural; moderate range with slower speed | +| Long Turbo | ~10 km | 4.4 kbps | −10 dB | Similar range to Long Fast but with 500 kHz bandwidth; faster throughput | +| Long Fast | ~10 km | 1.1 kbps | −12.5 dB | **General use (default)** — balanced range and speed | +| Long Moderate | ~20 km | 0.34 kbps | −15 dB | Rural with some terrain; occasional use | +| Lite Fast | ~5 km | 5.5 kbps | −10 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Medium Fast | +| Lite Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Long Fast | +| Narrow Fast | ~5 km | 2.7 kbps | −10 dB | EU 868 MHz band (62.5 kHz BW); avoids interference with other devices | +| Narrow Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 868 MHz band (62.5 kHz BW); comparable to Long Fast | +| ~~Long Slow~~ | ~30 km | 0.18 kbps | −17.5 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | +| ~~Very Long Slow~~ | ~40+ km | 0.09 kbps | −20 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | + +#### Choosing a Modem Preset + +The modem preset controls the fundamental tradeoff between **range** and **data rate**: + +- **Slower presets** use more spreading, making signals decodable at weaker signal levels (lower SNR limit). This means longer range but fewer bytes per second. +- **Faster presets** pack more data per transmission but require a stronger signal to decode. + +**Practical guidance:** + +- **Urban mesh (many nodes, short distances):** Use **Long Fast** (default) or **Short Fast**. Higher speed means less airtime congestion when many nodes share the channel. +- **Rural/sparse mesh (few nodes, long distances):** Use **Long Moderate**. Range matters more than speed when nodes are far apart. +- **EU 866/868 MHz regulatory compliance:** Use **Lite Fast**, **Lite Slow**, **Narrow Fast**, or **Narrow Slow** — these are optimized for the EU SRD/868 MHz bands with narrower bandwidths. +- **Fixed infrastructure links:** Use **Short Turbo** or **Long Turbo** for dedicated point-to-point links with good antennas and line-of-sight. +- **Mixed environments:** Stick with **Long Fast** — it's the community default and ensures compatibility with others in your area. + +> ⚠️ **Important:** All nodes on the same channel **must** use the same modem preset. Nodes with mismatched presets cannot communicate even if they share the same frequency and encryption key. + +> 💡 **Tip:** The range estimates above assume flat terrain and modest antennas. Elevation advantage (hilltop, rooftop) dramatically increases effective range. A well-placed Router with Long Fast can often outperform a ground-level node with Long Slow. + +### Display Config + +| Setting | Opis | +| ------------------- | ------------------------------------------------------------------------------------ | +| Screen Timeout | Time before display sleeps | +| Display Units | Metric or Imperial | +| OLED Type | Auto, SSD1306, SH1106, SH1107 | +| Compass Orientation | Rotation offset for compass display (0°, 90°, 180°, 270°) | +| ~~Compass North~~ | ⚠️ **Deprecated** — replaced by Compass Orientation; still visible in older firmware | + +### Position Config + +| Setting | Opis | +| ----------------------------------------- | ---------------------------------- | +| GPS Enabled | Enable/disable GPS | +| GPS Update Interval | How often to acquire GPS fix | +| Position Broadcast (s) | How often to share position | +| Smart Position | Enable movement-based broadcasting | +| Fixed Position | Use a manually set position | + +### Power Config + +| Setting | Opis | +| --------------------------------------- | --------------------------------------- | +| Power Saving | Enable low-power sleep mode | +| Shutdown After (s) | Auto-shutdown idle timer | +| ADC Multiplier | Battery voltage calibration factor | +| Wait Bluetooth (s) | Time to wait for BLE connection at boot | +| Mesh SDS Timeout (s) | Super-deep-sleep timeout | + +### Network Config + +| Setting | Opis | +| ------------- | ---------------------------------------------------- | +| WiFi Enabled | Enable WiFi radio (ESP32 devices) | +| WiFi SSID | Network name to connect to | +| WiFi PSK | Network password | +| NTP Server | Time synchronization server | +| Syslog Server | Remote logging server | + +![IP address field](/assets/screenshots/settings_ipv4_field.png) + +### Bluetooth Config + +| Setting | Opis | +| ----------------- | ------------------------------------------------------------------------- | +| Bluetooth Enabled | Enable/disable BLE radio | +| Pairing Mode | Fixed PIN, Random PIN, or No PIN | +| Fixed PIN | PIN code for pairing (default: 123456) | + +### Security Config + +| Setting | Opis | +| --------------------- | -------------------------------------------------------------------------- | +| Javni ključ | Your node's public key (read-only) | +| Admin Key | Key for remote administration | +| Zasebni ključ | Your node's private key (handle securely) | +| Admin Channel Enabled | Allow admin commands via channel | +| Debug Log | Output live debug logging over serial/bluetooth | +| Serial Enabled | Enable serial console access (moved from Device Config) | +| Managed Mode | Restrict non-admin channel changes | + +![Password field](/assets/screenshots/settings_password_field.png) + +Settings use standard preference controls — dropdowns, toggles, and sliders: + +| Control | Screenshot | +| -------- | ------------------------------------------------------ | +| Dropdown | ![Dropdown](/assets/screenshots/settings_dropdown.png) | +| Toggle | ![Toggle](/assets/screenshots/settings_switch.png) | +| Slider | ![Slider](/assets/screenshots/settings_slider.png) | + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — optional feature modules and device administration +- [Signal Meter](signal-meter) — how modem presets affect signal quality thresholds +- [LoRa configuration](https://meshtastic.org/docs/configuration/radio/lora) — detailed LoRa settings reference on meshtastic.org +- [Initial configuration](https://meshtastic.org/docs/getting-started/initial-config) — region setup guide on meshtastic.org + +--- + diff --git a/docs/sl-rSI/user/signal-meter.md b/docs/sl-rSI/user/signal-meter.md new file mode 100644 index 000000000..e17238c69 --- /dev/null +++ b/docs/sl-rSI/user/signal-meter.md @@ -0,0 +1,81 @@ +--- +title: How the Meshtastic Signal Meter Works +nav_order: 15 +last_updated: 2026-05-13 +description: How the signal meter calculates quality from RSSI and SNR — LoRa spread spectrum, presets, and what the bars really mean. +aliases: + - signal + - signal-meter + - snr + - rssi +--- + +# How the Meshtastic Signal Meter Works + +The Meshtastic signal meter — the familiar bars or status color in the app — is calculated very differently than the "bars" on a traditional cell phone or Wi-Fi router. + +Most consumer devices simply measure how "loud" a signal is. However, because Meshtastic uses **LoRa (Long Range)** technology, its signal meter measures how **clear** the signal is, relative to the specific settings your mesh is using. + +--- + +## 1. The Two Metrics: "Loudness" vs. "Clarity" + +Every time the LoRa radio chip receives a message, it reports two measurements: + +- **RSSI (Received Signal Strength Indicator):** The **loudness** of the raw power hitting your antenna. +- **SNR (Signal-to-Noise Ratio):** The **clarity** of the signal compared to the background static. + +> **Tip — The Analogy:** Imagine you are trying to hear a friend talking to you. +> +> - **RSSI** is how loud their voice is. +> - **The Noise Floor** is the background noise in the room (air conditioning, other people talking, traffic). +> - **SNR** is how easily you can distinguish your friend's voice from the background noise. + +If your friend shouts at you at a deafening rock concert, the signal is incredibly loud (High RSSI), but you still can't understand them because the background noise is louder (Bad SNR). Conversely, if your friend whispers to you in a dead-silent library, the signal is very weak (Low RSSI), but you can understand them perfectly (Great SNR). + +--- + +## 2. The Magic of LoRa: Hearing "Below the Noise Floor" + +For standard radios (like FM or Wi-Fi), if the background noise is louder than the signal (a negative SNR), the receiver just hears static. + +LoRa is special. It uses **"Spread Spectrum"** modulation, which allows the radio to mathematically pull a signal out of the air even when it is buried deep _underneath_ the background noise. This is why you will frequently see **negative SNR numbers** in Meshtastic (e.g., -10 dB, which means the signal is 10 decibels weaker than the background static). + +Depending on which Meshtastic preset you are using (e.g., `LongFast` vs. `ShortFast`), the radio has a specific **SNR Limit** — the absolute maximum amount of noise it can tolerate before the message is completely lost to the static. + +--- + +## 3. How the Signal Meter Calculates Quality + +The Meshtastic apps take both RSSI and SNR and run them through a specific formula to assign your signal a quality rating (None, Bad, Fair, or Good). It specifically scales these values based on the physical limits of the radio preset you are using. + +Here is exactly how the app decides how many bars (or what color) to show you: + +| Level | Bars | Criteria | Meaning | +| --------- | ---- | ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | +| Dober | 3 | RSSI better than `-115 dBm` **AND** SNR better than `-7 dB` | Signal is both loud and clear — healthy connection. | +| Precejšen | 2 | RSSI better than `-126 dBm` with good SNR, **OR** SNR better than `-15 dB` with good RSSI | Signal getting quieter or noisier, but still decodable. | +| Slab | 1 | Falls between Fair and None thresholds | At the edge of range or experiencing interference. | +| Brez | 0 | RSSI worse than `-126 dBm` **AND** SNR worse than `-15 dB` | Transmission completely buried in noise. | + +--- + +## 4. What This Means for You + +Because Meshtastic's meter acts as a **"Clarity Meter"**, it behaves differently than what most people expect: + +> **Tip — Don't panic over low RSSI:** You might see a seemingly terrible RSSI value like `-118 dBm`. On a cell phone, you would have zero bars. But if you have an SNR of `+2 dB`, Meshtastic will still show a strong signal! _The library is quiet, so the whisper is heard perfectly._ + +> **Warning — Watch out for local noise:** If you hook up a massive antenna and see a great RSSI (e.g., `-90 dBm`) but your signal meter is only showing **1 Bar (Bad)**, you have a problem. It means you have local interference — perhaps a cheap power supply, a noisy computer, or a nearby radio tower — creating so much static that it is drowning out your mesh. + +## Where Signal Information Appears + +In the app, signal data is shown in several places: + +- **Node list** — signal bars icon next to each node +- **Node detail** — SNR, RSSI, and signal quality in the device metrics section +- **Traceroute** — per-hop signal quality for each relay node +- **Signal metrics** — historical SNR and RSSI data in the metrics charts + +![Node entry showing SNR, RSSI values and colored signal bars](/assets/screenshots/nodes_signal_info.png) + diff --git a/docs/sl-rSI/user/tak.md b/docs/sl-rSI/user/tak.md new file mode 100644 index 000000000..f7736efe0 --- /dev/null +++ b/docs/sl-rSI/user/tak.md @@ -0,0 +1,126 @@ +--- +title: TAK Integration +nav_order: 10 +last_updated: 2026-05-13 +description: Interoperate with ATAK and WinTAK — CoT position sharing, TAK roles, and plugin setup. +aliases: + - tak + - atak + - team-awareness-kit +--- + +# TAK Integration + +Meshtastic integrates with the Team Awareness Kit (TAK) ecosystem, enabling interoperability between Meshtastic mesh devices and TAK applications like ATAK and WinTAK. + +## Overview + +The TAK module allows Meshtastic nodes to: + +- Share position data in TAK-compatible CoT (Cursor on Target) format +- Appear as team members on TAK map displays +- Receive TAK PLI (Position Location Information) messages + +## Setup + +### Prerequisites + +- ATAK (Android Team Awareness Kit) or WinTAK installed +- Meshtastic ATAK Plugin installed +- TAK module enabled on your Meshtastic radio + +### Configuration + +1. Navigate to **Settings → Module Config → TAK**. +2. Enable the TAK module. +3. Configure the TAK team/group settings: + +![Module toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | Opis | +| ------- | -------------------------- | +| Enabled | Activate TAK interop | +| Mode | TAK-compatible output mode | + +### ATAK Plugin Setup + +1. Install the Meshtastic ATAK Plugin from the plugin repository. +2. Open ATAK and enable the Meshtastic plugin. +3. The plugin bridges messages between ATAK and your mesh network. + +## TAK Roles + +Nodes configured with TAK-related roles behave differently from standard clients: + +| Role | Opis | +| --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **TAK** | Full TAK interoperability — sends and receives CoT data, chat messages, and PLI updates. Functions as a standard client plus TAK bridge. | +| **TAK Tracker** | Position-only TAK output — automatically broadcasts PLI at regular intervals without user interaction. Optimized for unattended position beacons (vehicles, equipment, waypoints). Does not relay chat messages. | + +> 💡 **Tip:** Use **TAK Tracker** for devices that only need to report position (e.g., a radio mounted in a vehicle). Use **TAK** for devices where users actively participate in TAK operations. + +### CoT (Cursor on Target) Format + +TAK messages use the Cursor on Target XML format — a military standard for sharing situational awareness data. Meshtastic converts its internal protobuf messages to CoT format when bridging to TAK systems, so no manual format conversion is needed. + +## TAK Identity + +When using TAK roles, your node broadcasts identity information that appears on TAK maps: + +| Setting | Opis | +| -------- | ---------------------------------------------------------------------------------------------------------------- | +| Team | Your team color on the TAK map (e.g., Blue, Red, Cyan, Green) | +| Role | Your operational role (Team Member, Team Lead, HQ, Medic, RTO, etc.) | +| Callsign | Your TAK callsign (defaults to your Meshtastic long name) | + +These settings appear in **Settings → Module Config → TAK** when the TAK module is enabled. + +> 💡 **Tip:** Team/role colors are the standard TAK affiliation colors. Coordinate with your TAK team to use consistent team assignments. + +## Wire Format (V1 / V2) + +Meshtastic supports two TAK wire formats: + +| Format | Compatibility | Features | +| ------------------------------- | --------------------------------------------------------------- | --------------------------------------------------------- | +| V1 (Legacy) | ATAK Plugin v1.x, older firmware | Basic CoT position sharing only | +| V2 (Current) | ATAK Plugin v2.x, firmware 2.3+ | Full CoT support including chat, routes, zstd compression | + +The app automatically selects V2 when both sides support it. No manual configuration needed — the TAK module negotiates format based on firmware capabilities. + +## Usage with ATAK + +Once configured: + +- Meshtastic nodes appear as markers on the ATAK map with callsign labels +- Chat messages can bridge between mesh and TAK networks +- Position updates flow bidirectionally between Meshtastic and TAK +- TAK Tracker nodes broadcast PLI automatically — their positions appear on ATAK maps without any ATAK-side configuration + +> ⚠️ **Note:** TAK integration requires specific node roles and module configuration. Standard client nodes don't automatically participate in TAK operations. + +## Troubleshooting + +| Problem | Cause | Solution | +| -------------------------------- | ------------------------------------- | ----------------------------------------------------------------------- | +| Node doesn't appear on ATAK map | TAK module disabled or wrong role | Verify TAK module is enabled and node role is TAK or TAK Tracker | +| Position updates are stale | GPS fix lost or interval too long | Check GPS status; reduce position broadcast interval in Position Config | +| ATAK plugin shows "disconnected" | BLE connection lost or plugin crashed | Reconnect Bluetooth in Meshtastic app, then restart ATAK plugin | +| Chat messages not bridging | V1 format doesn't support chat | Ensure both nodes run firmware 2.3+ for V2 wire format | +| CoT data not flowing | Channel mismatch | All TAK nodes must be on the same channel with matching encryption | + +## Security Considerations + +- TAK data shares your position and callsign information +- Ensure your channel encryption is configured when using TAK in sensitive environments +- The TAK module respects the same channel encryption as other Meshtastic messages + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — TAK module configuration +- [Nodes](nodes) — TAK and TAK Tracker roles in the node list +- [Map & Waypoints](map-and-waypoints) — node positions on the map +- [ATAK plugin guide](https://meshtastic.org/docs/software/integrations/atak-plugin) — detailed ATAK setup on meshtastic.org + +--- + diff --git a/docs/sl-rSI/user/telemetry-and-sensors.md b/docs/sl-rSI/user/telemetry-and-sensors.md new file mode 100644 index 000000000..1c21e4e5c --- /dev/null +++ b/docs/sl-rSI/user/telemetry-and-sensors.md @@ -0,0 +1,118 @@ +--- +title: Telemetry & Sensors +nav_order: 9 +last_updated: 2026-05-13 +description: Sensor data on the mesh — supported environment, air quality, and power sensors, plus configuration and viewing guides. +aliases: + - sensors + - environment + - weather + - power-metrics +--- + +# Telemetry & Sensors + +Meshtastic nodes can collect and share sensor data across the mesh network. + +## Overview + +Telemetry allows nodes equipped with sensors to broadcast environmental, power, and device health information. This data is visible on the node detail screen and can be logged over time. + +## Device Telemetry + +All Meshtastic nodes report basic device telemetry: + +| Metric | Opis | Typical Range | +| ------------------ | ------------------------------ | ------------------------------------------------------------------ | +| Battery Level | Charge percentage | 0–100% | +| Voltage | Battery voltage | 3.0–4.2V (LiPo) | +| Uporaba kanala | % of airtime used locally | 0–100% | +| Air Utilization TX | % of airtime used by this node | 0–100% | +| Uptime | Seconds since last boot | Varies | + +## Environment Sensors + +Supported environmental sensors: + +### Temperature & Humidity + +| Sensor | Temperatura | Vlaga | Pressure | Notes | +| ------- | ----------- | ----- | -------- | ----------------------- | +| BME280 | ✓ | ✓ | ✓ | Recommended all-in-one | +| BME680 | ✓ | ✓ | ✓ | Adds gas resistance/IAQ | +| SHT31 | ✓ | ✓ | — | High accuracy | +| MCP9808 | ✓ | — | — | Precision temperature | +| LPS22 | — | — | ✓ | Pressure only | + +### Air Quality + +| Sensor | Metric | Notes | +| -------- | -------------------------------------------------- | -------------------------- | +| BME680 | Gas Resistance / IAQ | Volatile organic compounds | +| PMSA003I | PM1.0, PM2.5, PM10 | Particulate matter | +| SEN55 | PM, NOx, VOC, Temp, Humidity | Multi-sensor | + +### Light & UV + +| Sensor | Metric | +| -------- | -------------------------------------- | +| OPT3001 | Ambient light (lux) | +| VEML7700 | Ambient light (lux) | +| LTR390 | UV index | + +## Power Metrics + +Nodes with INA-series power sensors can report: + +| Metric | Opis | +| ----------- | ----------------------------------------- | +| Bus Voltage | Supply rail voltage | +| Current | Power consumption (mA) | +| Power | Calculated power (mW) | + +Useful for monitoring solar charging or battery health on remote nodes. + +## Configuring Telemetry + +1. Navigate to **Settings → Module Config → Telemetry**. +2. Set reporting intervals: + - **Device Metrics Interval** — how often to broadcast device metrics + - **Environment Metrics Interval** — how often to broadcast sensor data +3. Enable specific sensor types as needed. + +### Recommended Intervals + +| Use Case | Device (s) | Environment (s) | +| ------------------------------------------ | ----------------------------- | ---------------------------------- | +| Urban mesh (many nodes) | 3600 | 3600 | +| Rural mesh (few nodes) | 900 | 900 | +| Weather station | 900 | 300 | +| Battery conservation | 7200 | 7200 | + +> ⚠️ **Note:** Shorter intervals increase airtime usage and battery drain across the mesh. + +## Viewing Telemetry + +1. Navigate to **Nodes** and select a node. +2. Telemetry sections show on the detail screen: + - Device Metrics (always available) + - Environment Metrics (if sensors present) + - Power Metrics (if INA sensor present) +3. Historical graphs show trends over time. + +![Telemetry actions](/assets/screenshots/node-metrics_telemetric_actions.png) + +## Troubleshooting + +- **No environment data showing?** The remote node needs a physical sensor connected (e.g., BME280 on I2C). Device telemetry (battery, uptime) is always available, but environment metrics require hardware. +- **Stale readings?** Check the reporting interval — very long intervals (7200s+) mean data updates infrequently. Also verify the remote node is still online. +- **Sensor conflict on I2C bus?** Some sensors share I2C addresses. If you have multiple sensors on the same bus, check for address collisions in the radio's serial debug output. + +## Related Topics + +- [Node Metrics](node-metrics) — view telemetry data on the node detail screen +- [Settings — Modules & Admin](settings-module-admin) — telemetry module configuration +- [Units & Locale](units-and-locale) — temperature and pressure display units + +--- + diff --git a/docs/sl-rSI/user/translate.md b/docs/sl-rSI/user/translate.md new file mode 100644 index 000000000..b2ed79a34 --- /dev/null +++ b/docs/sl-rSI/user/translate.md @@ -0,0 +1,97 @@ +--- +title: Translate the App +parent: User Guide +nav_order: 17 +last_updated: 2026-05-13 +aliases: + - translate + - crowdin + - localization +--- + +# Translate the App + +Contributing translations helps make Meshtastic accessible to a wider audience. The app uses [Crowdin](https://crowdin.com/) to manage community translations for both the user interface and in-app documentation. + +--- + +## What Gets Translated + +| Resource | Source Location | Notes | +| ----------------- | ------------------------------------- | ---------------------------------------------------------------------- | +| UI strings | `composeResources/values/strings.xml` | Buttons, labels, messages, and all user-visible text | +| User Guide pages | `docs/user/*.md` | In-app documentation shown in Help & Documentation | +| Fastlane metadata | `fastlane/metadata/android/en-US/` | App Store listing title, description, and changelogs | + +> **Note — Developer Guide pages are English-only.** Code-focused documentation targeting contributors is not translated. + +--- + +## How to Contribute + +1. **Visit the Crowdin project.** Open the [Meshtastic Android Crowdin project](https://crowdin.com/project/meshtastic-android) and sign in or create a free account. +2. **Choose your language.** Select an existing language or request a new one by opening a [GitHub issue](https://github.com/meshtastic/Meshtastic-Android/issues/new). +3. **Translate strings.** Crowdin shows the English source on the left and your translation on the right. Translate each string and save. +4. **Review context.** Many strings include screenshots or context comments — check these to understand where the text appears in the app. +5. **Submit.** Approved translations are automatically merged into the next release. + +> **Tip — Keep translations short.** UI strings often appear in buttons, chips, or narrow columns. If a translation is significantly longer than the English original, consider abbreviating where the meaning stays clear. + +--- + +## Adding a New Language + +If your language is not yet listed on Crowdin: + +1. Open an issue on [GitHub](https://github.com/meshtastic/Meshtastic-Android/issues/new) requesting the new locale. +2. A maintainer will add the language to Crowdin and configure `crowdin.yml`. +3. Once added, you can begin translating immediately. + +--- + +## How Translations Are Organized + +The Android app uses **Compose Multiplatform resources** for all user-visible strings: + +``` +core/resources/src/commonMain/composeResources/ +├── values/ ← English (default) +│ └── strings.xml +├── values-de/ ← German +│ └── strings.xml +├── values-fr/ ← French +│ └── strings.xml +└── ... +``` + +In-app documentation follows a similar pattern under `docs/`: + +``` +docs/ +├── user/ ← English source (default) +│ ├── onboarding.md +│ └── ... +├── fr/user/ ← French translations +│ ├── onboarding.md +│ └── ... +└── ... +``` + +The app automatically selects the correct locale based on your device's **Language & Region** settings. + +--- + +## Translation Guidelines + +- **Do not translate** technical terms like "LoRa", "MQTT", "BLE", "TAK", "SNR", or "RSSI" — these are universal. +- **Keep placeholders intact.** Strings like `%1$s` or `%d` are filled in at runtime. Do not remove or reorder them unless the grammar of your language requires it. +- **Match tone.** The app uses a friendly, direct voice. Avoid overly formal language. +- **Test if possible.** Switch your device language and open the app to see how translations look in context. + +--- + +## Questions? + +If you have questions about a specific string's context or need help getting started, open a discussion on the [Meshtastic GitHub Discussions](https://github.com/meshtastic/Meshtastic-Android/discussions) page. + +Thank you for helping expand the reach of Meshtastic! diff --git a/docs/sl-rSI/user/units-and-locale.md b/docs/sl-rSI/user/units-and-locale.md new file mode 100644 index 000000000..d4efd4ad1 --- /dev/null +++ b/docs/sl-rSI/user/units-and-locale.md @@ -0,0 +1,118 @@ +--- +title: Units, Measurement & Locale +parent: User Guide +nav_order: 16 +last_updated: 2026-05-12 +--- + +# Units, Measurement & Locale + +The Meshtastic app automatically displays temperatures, distances, speeds, and times in the units your device is configured to use — no settings to change inside the app. + +--- + +## How It Works + +Meshtastic radios always transmit data in **metric units** (meters, °C, km/h, hPa, etc.). When the app receives this data, it uses the `MetricFormatter` utility to convert and display values in whatever unit system your device's locale specifies. + +On Android, your measurement preferences are determined by your system **Language & Region** settings. On Desktop (JVM), the app uses the JVM's default `Locale`. + +> **Tip — You never need to toggle units inside the app.** Change your system measurement preferences and every screen in Meshtastic updates automatically — node details, telemetry charts, weather, altitude, and more. + +--- + +## Temperatura + +Temperature values from environment sensors are transmitted as **°C** and displayed based on your device's temperature unit preference. + +![Environment metrics with temperature](/assets/screenshots/nodes_environment_metrics.png) + +| Your Setting | You See | +| ------------ | ------- | +| Celsius | 22°C | +| Fahrenheit | 72°F | + +This affects all temperature displays throughout the app: node environment telemetry, soil temperature, dew point, and telemetry chart axes. + +## Distance & Altitude + +Distances between nodes and GPS altitudes are transmitted as **meters** and automatically scaled and converted. + +![Distance info display](/assets/screenshots/nodes_distance_info.png) + +| Your Setting | Small Distance | Large Distance | Altitude | +| -------------------------------- | -------------- | ---------------------- | -------- | +| Metric | 350 m | 2.5 km | 1,200 m | +| Imperial (US) | 1,148 ft | 1.6 mi | 3,937 ft | + +The app uses natural scaling — short distances stay in meters or feet, while longer distances switch to kilometres or miles automatically. + +### Where these appear + +- **Node list** — distance and bearing to each node +- **Node detail** — altitude, distance from your position +- **Map** — waypoint distances, traceroute hop distances +- **Compass** — distance to selected node + +## Speed + +GPS ground speed is displayed in your locale's preferred speed unit. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Metric | 12 km/h | +| Imperial (US) | 7 mph | + +## Wind + +Wind speed and gust data from environment sensors are transmitted as **m/s** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Metric | 5 m/s | +| Imperial (US) | 11 mph | + +Wind readings appear in the **Node Detail** environment section and the **Environment Telemetry** charts. + +## Rainfall + +Rainfall measurements (1-hour and 24-hour totals) are transmitted as **mm** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ---------------------- | +| Metric | 12 mm | +| Imperial (US) | 0.5 in | + +## Units That Never Change + +Some units are international standards and are displayed the same way regardless of your locale: + +| Measurement | Unit | Why | +| -------------------------------- | ------------------------------ | ------------------------------------- | +| Barometric pressure | hPa | International meteorological standard | +| Heading / bearing | ° (degrees) | Universal navigation convention | +| Radiation | μR/hr | Standard dosimetry unit | +| GPS coordinates | decimal degrees | Universal geographic standard | +| Humidity, battery, soil moisture | % | Universal | + +## Date & Time + +All timestamps throughout the app — last heard, message times, telemetry logs, chart axes — follow your device's date and time preferences. + +| Setting | What It Controls | Example | +| ---------------- | ---------------- | ------------------------------------------------ | +| **24-Hour Time** | Clock format | 14:30 vs 2:30 PM | +| **Date Format** | Date ordering | 09/05/2026 vs 05/09/2026 | + +The app also uses **relative time** where it makes sense — for example, "5 min ago" or "2 hours ago" in the node list — which is automatically localised into your device language. + +## Changing Your Measurement System (Android) + +On Android, your measurement system (metric vs imperial) is tied to your region setting: + +1. Open **Android Settings → System → Language & Region** +2. Change your **Region** or **Measurement units** preference +3. Return to Meshtastic — values update immediately + +> **Tip — The app uses `MetricFormatter` from `core:common`.** All measurement formatting is handled by a shared KMP utility that respects your platform's locale. Developers adding new measurement displays should use `MetricFormatter` rather than hard-coding unit conversions. + diff --git a/docs/sq-rAL/index.md b/docs/sq-rAL/index.md new file mode 100644 index 000000000..708ab106d --- /dev/null +++ b/docs/sq-rAL/index.md @@ -0,0 +1,30 @@ +--- +title: Home +layout: default +nav_order: 0 +--- + +# Meshtastic Android App Documentation + +User and developer documentation for the Meshtastic Android, Desktop, and iOS applications powered by KMP (Kotlin Multiplatform). + +Use the sidebar navigation to browse the **User Guide** for app features and the **Developer Guide** for contributing to the project. + +--- + +## Quick Links + +| Guide | Përshkrimi | +| --------------------------------------------------------------------- | -------------------------------------------------------------- | +| [Getting Started](user/onboarding) | Connect your first radio and send a message | +| [Messages & Channels](user/messages-and-channels) | Channel broadcasts, direct messages, reactions, and encryption | +| [Nodes](user/nodes) | Understanding the mesh network node list | +| [Signal Meter](user/signal-meter) | How the LoRa signal quality meter works | +| [Units & Locale](user/units-and-locale) | How temperatures, distances, and times adapt to your region | +| [Desktop App](user/desktop) | Linux, macOS, and Windows desktop usage | +| [Architecture](developer/architecture) | App architecture overview for contributors | +| [Contributing](developer/contributing) | Branch naming, PR workflow, and verification commands | + +--- + +> This documentation is served from the same markdown source that powers the in-app **Help & Documentation** browser. diff --git a/docs/sq-rAL/user/connections.md b/docs/sq-rAL/user/connections.md new file mode 100644 index 000000000..d79d5c7ff --- /dev/null +++ b/docs/sq-rAL/user/connections.md @@ -0,0 +1,125 @@ +--- +title: Connections +nav_order: 2 +last_updated: 2026-05-13 +description: Connect your phone or desktop to a Meshtastic radio via Bluetooth, USB, or TCP/IP. +aliases: + - bluetooth + - usb + - tcp + - pairing +--- + +# Connections + +Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node. + +## Bluetooth (BLE) + +Bluetooth Low Energy is the default and most common connection method on Android. + +### Pairing a Device + +1. Ensure your Meshtastic radio is powered on and in pairing mode. +2. Open the app and navigate to **Connections**. +3. Tap **Scan for Devices** — nearby Meshtastic radios will appear. +4. Select your device from the list. +5. Accept the Bluetooth pairing prompt if shown. + +![Device list item](/assets/screenshots/connections_bluetooth_scan.png) + +You can filter devices by transport type using the filter chips at the top: + +![Transport filter chips](/assets/screenshots/connections_transport_filters.png) + +> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. + +### Connection Status + +| Icon | State | Përshkrimi | +| ---- | -------------- | ----------------------------- | +| 🟢 | Connected | Active radio link established | +| 🟡 | Connecting | Handshake in progress | +| 🔴 | I shkëputur | No active connection | +| ⚪ | Not configured | No device selected | + +When connecting, a status indicator shows the current connection state: + +![Connecting status](/assets/screenshots/connections_connecting.png) + +If no devices are found, the app shows an empty state with instructions: + +![No devices found](/assets/screenshots/connections_empty_state.png) + +### Troubleshooting Bluetooth + +- **Device not found:** Toggle Bluetooth off/on, ensure location is enabled. +- **Connection drops:** Move closer to the radio; check for interference. +- **Pairing rejected:** Forget the device in Android Bluetooth settings and retry. + +## USB Serial + +USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable. + +### Setup + +1. Connect your radio via USB cable to your device. +2. The app will prompt for USB permission — tap **Allow**. +3. The connection is established automatically. + +> ⚠️ **Note:** USB connections require OTG support on Android devices. + +## TCP/IP (WiFi) + +Some Meshtastic radios support WiFi connectivity, allowing TCP-based connections. + +### Configuration + +1. Connect your radio to a WiFi network via the radio's web interface or settings. +2. In the app, go to **Connections → TCP**. +3. Enter the radio's IP address and port (default: 4403). +4. Tap **Connect**. + +![WiFi scanning for devices](/assets/screenshots/connections_wifi_scanning.png) + +When a device is found, it appears in the connection list: + +![WiFi device found](/assets/screenshots/connections_wifi_device_found.png) + +A successful connection is confirmed with a status indicator: + +![WiFi connection success](/assets/screenshots/connections_wifi_success.png) + +### When to Use TCP + +- Radio is on the same local network +- Testing with a simulated radio +- Environments where Bluetooth has interference issues + +## Reconnection Behavior + +The app reconnects to the **last selected device** on startup. You can manually switch transports from the connections screen at any time. + +To disconnect from a radio, use the disconnect button on the connections screen: + +![Disconnect from radio](/assets/screenshots/connections_disconnect.png) + +## Desktop Connections + +On Desktop (Linux/macOS/Windows), the app supports: + +- **Bluetooth (BLE)** — via the Kable library; works on macOS, Linux, and Windows +- **USB Serial** — primary wired connection method +- **TCP/IP** — for network-connected radios + +See [Desktop App](desktop) for platform-specific details and keyboard shortcuts. + +## Related Topics + +- [Getting Started](onboarding) — first-launch setup and permissions +- [Settings — Radio & User](settings-radio-user) — Bluetooth and network configuration +- [Desktop App](desktop) — desktop-specific connection details +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — full list of compatible radios on meshtastic.org + +--- + diff --git a/docs/sq-rAL/user/desktop.md b/docs/sq-rAL/user/desktop.md new file mode 100644 index 000000000..a688679eb --- /dev/null +++ b/docs/sq-rAL/user/desktop.md @@ -0,0 +1,147 @@ +--- +title: Desktop App +nav_order: 14 +last_updated: 2026-05-13 +description: Install and use the Meshtastic Desktop app on Linux, macOS, and Windows — connections, feature parity, and keyboard shortcuts. +aliases: + - desktop + - linux + - macos + - windows + - jvm +--- + +# Desktop App + +The Meshtastic Desktop application provides the same mesh communication features on Linux, macOS, and Windows. + +## Overview + +The Desktop app shares its core codebase with the Android app through Kotlin Multiplatform (KMP). Most features work identically across platforms. + +## Installation + +### Linux + +- Download the `.deb` or `.AppImage` package from the releases page +- Or build from source using `./gradlew :desktopApp:run` + +### macOS + +- Download the `.dmg` package from releases +- Or build from source + +### Windows + +- Download the `.msi` installer from releases +- Or build from source + +## Connecting Your Radio + +### USB Serial (Primary) + +The most reliable connection method on Desktop: + +1. Connect your Meshtastic radio via USB cable. +2. The app should detect the serial port automatically. +3. If not detected, select the correct serial port from the connections menu. + +### TCP/IP + +For network-connected radios: + +1. Enter the radio's IP address and port (default: 4403). +2. Click **Connect**. + +### Bluetooth (BLE) + +Bluetooth Low Energy is supported on Desktop via the [Kable](https://github.com/JuulLabs/kable) library: + +1. Ensure your system has a Bluetooth adapter. +2. The app scans for nearby Meshtastic radios automatically. +3. Select your device from the connections screen. + +## Feature Parity + +| Feature | Android | Desktop | Notes | +| ---------------------------------------- | ------- | ------- | -------------------------- | +| Messaging | ✓ | ✓ | Full parity | +| Node List | ✓ | ✓ | Full parity | +| Map | ✓ | ✓ | Full parity | +| Settings | ✓ | ✓ | Full parity | +| Bluetooth (BLE) | ✓ | ✓ | Via Kable on desktop | +| Firmware Update OTA | ✓ | ✗ | Use web flasher | +| Notifications | ✓ | ✓ | Native OS notifications | +| Widgets | ✓ | ✗ | Android-only | +| AI Assistant (Chirpy) | ✓\* | ✗ | Google flavor Android only | + +\*Chirpy AI requires Android 14+ on Google flavor builds with supported hardware. + +## UI Differences + +The Desktop app uses the same Compose Multiplatform UI with adaptations for larger screens and desktop interaction. + +### Keyboard Shortcuts + +| Shortcut | Action | +| ------------------- | --------------------------- | +| **⌘Q** / **Ctrl+Q** | Quit the application | +| **⌘,** / **Ctrl+,** | Open Settings | +| **⌘1** / **Ctrl+1** | Switch to Conversations tab | +| **⌘2** / **Ctrl+2** | Switch to Nodes tab | +| **⌘3** / **Ctrl+3** | Switch to Map tab | +| **⌘4** / **Ctrl+4** | Switch to Connections tab | + +### Window & System Tray + +- **Window resizing** — responsive layout adapts to window dimensions +- **System tray** — minimize to system tray for background mesh operation +- **Tray menu** — right-click the tray icon to show window or quit +- **Mouse interaction** — hover states and standard desktop navigation + +### Notification Preferences + +The Desktop app provides in-app toggles for controlling which notifications are shown — messages, new nodes, and low battery alerts. Access these from **Settings → Notifications** within the app. + +## Built-in Documentation Browser + +The Desktop app includes a built-in documentation browser for quick access to help content without leaving the application. + +![Docs browser with table of contents](/assets/screenshots/docs-browser_toc.png) + +The browser supports full-text search across all documentation: + +![Searching the docs browser](/assets/screenshots/docs-browser_search.png) + +Individual doc pages render with full formatting: + +![A documentation page](/assets/screenshots/docs-browser_page.png) + +## Building from Source + +```bash +git clone https://github.com/meshtastic/Meshtastic-Android.git +cd Meshtastic-Android +git submodule update --init +./gradlew :desktopApp:run +``` + +Requirements: + +- JDK 21 +- No Android SDK required for desktop-only builds + +## Known Limitations + +- No OTA firmware updates (use web flasher) +- Some Android-specific features (widgets, specific notification channels) are unavailable +- Performance may vary on low-spec hardware running Compose Desktop +- BLE bonding is not yet supported on desktop (pairing works without bonding) + +## Related Topics + +- [Connections](connections) — connection methods overview +- [Firmware Updates](firmware) — use the [Web Flasher](https://flasher.meshtastic.org) for desktop firmware updates + +--- + diff --git a/docs/sq-rAL/user/discovery.md b/docs/sq-rAL/user/discovery.md new file mode 100644 index 000000000..fe696299b --- /dev/null +++ b/docs/sq-rAL/user/discovery.md @@ -0,0 +1,114 @@ +--- +title: Discovery +nav_order: 12 +last_updated: 2026-05-13 +description: Explore your mesh network — traceroute paths, neighbor maps, and node discovery tools. +aliases: + - mesh-discovery + - local-discovery + - network-scan + - traceroute + - neighbor-info +--- + +# Discovery + +Discovery tools help you understand **how** your mesh network is connected — which nodes can hear each other, what paths messages take, and where bottlenecks or weak links exist. + +> 💡 **Tip:** You don't need a dedicated "discovery mode" to start exploring your mesh. The tools below are available right now from the node list and node detail screens. + +--- + +## Traceroute + +Traceroute reveals the exact path a message takes from your node to any other node on the mesh. It's the single most useful tool for debugging connectivity problems. + +### Running a Traceroute + +1. Navigate to **Nodes** and tap the node you want to trace. +2. On the node detail screen, tap **Traceroute**. +3. The app sends a traceroute request and waits for the response. +4. Results display each hop in order, with signal quality at every step. + +### Reading the Results + +A traceroute result looks like this: + +``` +You → Node A (SNR: 8.5, RSSI: -95) → Node B (SNR: 5.2, RSSI: -108) → Target +``` + +Each hop represents a relay node that forwarded the message. The SNR and RSSI values at each hop tell you about the link quality on that specific segment. + +| What to look for | What it means | +| -------------------------------------------------------------------------- | --------------------------------------------------------------------------- | +| All hops show Good SNR (> 5 dB) | Healthy path — messages flow reliably | +| One hop shows Bad SNR (< 0 dB) | Weak link — this relay segment is fragile | +| Many hops (4+) | Long path — consider repositioning a node to shorten it | +| Different path on retry | Mesh is adapting — multiple routes exist (this is good!) | + +> 💡 **Tip:** Run traceroute several times over a few minutes. If the path changes, your mesh has redundant routes — a sign of a well-connected network. + +### Troubleshooting with Traceroute + +- **"No route found"** — The target node may be offline, out of range, or on a different channel. Check that both nodes share at least one channel with the same encryption key. +- **Traceroute times out** — The path may be too long (exceeds hop limit) or a relay node is congested. Try increasing the hop limit in **Settings → LoRa Config**. +- **Asymmetric paths** — A traceroute from A→B may take a different path than B→A. This is normal — radio propagation is not always symmetric. + +--- + +## Neighbor Info + +The Neighbor Info module lets each node broadcast a list of the nodes it can **directly hear** (single-hop). When multiple nodes share their neighbor lists, you can piece together a topology map of the entire mesh. + +### Enabling Neighbor Info + +1. Navigate to **Settings → Module Config → Neighbor Info**. +2. Enable the module. +3. Set the broadcast interval (default: 900 seconds / 15 minutes). + +Once enabled, your node periodically broadcasts its neighbor table. Other nodes with Neighbor Info enabled do the same. + +### Viewing Neighbor Data + +- Open any node's detail screen and look for the **Neighbors** section. +- Each neighbor entry shows the node that was directly heard and its signal quality. +- Combine neighbor data from multiple nodes to understand the full mesh topology. + +> ⚠️ **Note:** Neighbor Info increases airtime usage because every enabled node periodically broadcasts its neighbor list. On busy meshes with many nodes, consider longer broadcast intervals (3600 seconds or more) to avoid congestion. + +--- + +## Node List as a Discovery Tool + +The node list itself is a powerful discovery tool when you use its filtering and sorting features effectively. + +### Finding New Nodes + +- Sort by **Last heard** to see the most recently active nodes at the top. +- Enable **Include unknown** to see nodes that have appeared on the mesh but haven't sent user info yet — these are often newly powered-on devices. + +### Assessing Connectivity + +- Sort by **Hops away** to see which nodes are directly reachable (0 hops) versus relayed. +- Sort by **Distance** to find nearby nodes and verify they're reachable. +- Use **Exclude MQTT** to focus on nodes reachable over radio (not via internet bridge). + +### Infrastructure Audit + +- Disable **Exclude infrastructure** to see Router, Repeater, Router Late, and Client Base nodes. +- Check their signal quality and last-heard times to verify your infrastructure nodes are healthy. + +See [Nodes](nodes) for full details on filtering and sorting options. + +--- + +## Tips for Mesh Exploration + +- **Start with traceroute** — it gives you immediate, actionable information about a specific path. +- **Enable Neighbor Info on key nodes** — especially routers and repeaters, to build a picture of the backbone. +- **Check the map** — node positions on the [Map](map-and-waypoints) combined with signal data help you understand why some links are strong and others are weak. +- **Compare signal over time** — use the [Signal Meter](signal-meter) guide to interpret SNR and RSSI values correctly. + +--- + diff --git a/docs/sq-rAL/user/firmware.md b/docs/sq-rAL/user/firmware.md new file mode 100644 index 000000000..e67f69e58 --- /dev/null +++ b/docs/sq-rAL/user/firmware.md @@ -0,0 +1,114 @@ +--- +title: Firmware Updates +nav_order: 13 +last_updated: 2026-05-13 +description: Update your radio firmware over Bluetooth — OTA process, version channels, pre-flight checks, and recovery. +aliases: + - firmware + - update + - ota + - flash +--- + +# Firmware Updates + +Keep your Meshtastic radio up to date with the latest firmware for new features, bug fixes, and security improvements. + +## Checking for Updates + +1. Navigate to **Settings → Firmware Update** or tap the firmware notification if shown. +2. The app checks for available firmware versions. +3. Available updates show the version number and changelog summary. + +## Update Methods + +### OTA (Over-The-Air) via Bluetooth + +The most common update method for Android users: + +1. Ensure your radio is connected via Bluetooth. +2. Navigate to the Firmware Update screen. +3. Select the desired firmware version. +4. Tap **Update** to begin the OTA process. +5. Wait for the update to complete — **do not disconnect** during the update. + +![Firmware checking for updates](/assets/screenshots/firmware_checking.png) + +> ⚠️ **Warning:** Interrupting a firmware update can brick your device. Ensure your radio has sufficient battery (>50% recommended) and maintain Bluetooth proximity during the entire process. + +![Firmware disclaimer](/assets/screenshots/firmware_disclaimer.png) + +### USB Flashing + +For recovery or when OTA is unavailable: + +- Use the [Meshtastic Web Flasher](https://flasher.meshtastic.org) +- Or the [Meshtastic CLI tool](https://meshtastic.org/docs/getting-started/flashing-firmware) on desktop + +## Version Channels + +| Kanal | Përshkrimi | +| ------ | ------------------------------------------- | +| Stable | Recommended for most users; tested releases | +| Alpha | Preview releases; may contain bugs | + +## Pre-Update Checklist + +Before updating: + +- [ ] Battery > 50% +- [ ] Stable Bluetooth connection +- [ ] Note your current settings (they may reset on major version changes) +- [ ] Check the release notes for breaking changes + +## Post-Update + +After a successful update: + +- The radio will reboot automatically +- Bluetooth connection will re-establish +- Verify your settings are intact +- Check the firmware version in **Settings → About** + +![Firmware update success](/assets/screenshots/firmware_success.png) + +## Troubleshooting + +### Update Stuck + +If the update appears frozen: + +- Wait at least 5 minutes before intervening +- If truly stuck, power-cycle the radio +- Attempt the update again + +![Firmware update error](/assets/screenshots/firmware_error.png) + +### Device Won't Boot After Update + +If your device fails to boot: + +1. Try connecting via USB to a computer +2. Use the web flasher in recovery/DFU mode +3. Flash a known-good firmware version +4. Check the Meshtastic Discord for device-specific recovery steps + +### Compatibility Warnings + +The app may show warnings when: + +- Connected radio firmware is below minimum supported version +- Major version mismatch between app and firmware +- Deprecated features need migration + +> ⚠️ **Important:** Always update the Meshtastic app before or alongside firmware updates to ensure compatibility. + +## Related Topics + +- [Connections](connections) — reconnecting after a firmware update +- [Flashing firmware guide](https://meshtastic.org/docs/getting-started/flashing-firmware) — full firmware flashing walkthrough on meshtastic.org +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — check firmware compatibility by device +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/sq-rAL/user/map-and-waypoints.md b/docs/sq-rAL/user/map-and-waypoints.md new file mode 100644 index 000000000..366eafc58 --- /dev/null +++ b/docs/sq-rAL/user/map-and-waypoints.md @@ -0,0 +1,116 @@ +--- +title: Map & Waypoints +nav_order: 6 +last_updated: 2026-05-13 +description: View node positions on the map, create and share waypoints, and manage position sharing and privacy. +aliases: + - map + - waypoints + - gps + - location +--- + +# Map & Waypoints + +The Map screen shows the geographic positions of nodes on your mesh, along with shared waypoints. + +## Map View + +The map displays: + +- **Node positions** — colored markers for each node reporting location +- **Waypoints** — shared points of interest +- **Your position** — your current GPS location + +### Node Markers + +Node markers on the map indicate: + +| Color | Meaning | +| ------ | ---------------------------------------------- | +| Green | Online (heard recently) | +| Yellow | Away (heard within 2 hours) | +| Gray | Offline (stale position) | +| Blue | Your own node | + +### Map Controls + +- **Zoom** — pinch or use +/- buttons +- **Pan** — drag to explore +- **Center** — select the location button to center on your position +- **Node tap** — tap a node marker to view details + +The floating toolbar provides quick access to compass, layer switching, node filters, refresh, and location tracking. Tap the compass to reorient north-up, or tap the location button to center on your current position. + +![Map controls overlay](/assets/screenshots/map_controls_overlay.png) + +## Waypoints + +Waypoints are shared geographic points of interest that all mesh members can see. + +### Creating a Waypoint + +1. Long-press on the map at the desired location. +2. Enter a name and optional description. +3. Choose an icon/emoji for the waypoint. +4. Tap **Send** to share with the mesh. + +### Waypoint Properties + +| Property | Përshkrimi | +| ---------- | ------------------------------------------------------- | +| Emri | Short identifier (max 30 characters) | +| Përshkrimi | Optional longer description | +| Icon | Visual marker emoji on the map | +| I bllokuar | If locked, only the creator can edit or delete | +| Expiration | Optional auto-remove time | + +### Waypoint Expiration + +Waypoints can be set to expire automatically: + +- **Never** (default) — waypoint remains until manually deleted +- **Timed** — waypoint is automatically removed after the specified duration (e.g., "remove after 2 hours"). Useful for temporary markers like rally points, hazards, or meeting locations. + +Expired waypoints are automatically hidden from the map so they don't clutter the display. The expiration countdown begins when the waypoint is created, not when other nodes receive it. + +### Managing Waypoints + +- Tap a waypoint on the map to view its details and coordinates +- Edit or delete waypoints you created +- **Locked waypoints** cannot be modified or deleted by other nodes — only the original creator can change them +- Unlocked waypoints can be edited by any mesh member + +## Position Sharing + +### Enabling Position Sharing + +Your node shares its GPS position based on: + +- **Fixed interval** — broadcast position at regular intervals +- **Smart position** — broadcast when movement exceeds a threshold +- **Manual** — only share when explicitly requested + +Configure position behavior in **Settings → Position**. + +### Privacy Considerations + +> 🔒 **Privacy:** Position data is broadcast to all nodes on your channel. If you don't want your location shared, disable GPS position in settings or use a fixed/fake position. + +## Map Sources + +The app supports multiple map tile sources: + +- OpenStreetMap (default) +- Satellite imagery (where available) +- Offline tiles (download map areas for offline use) + +## Related Topics + +- [Nodes](nodes) — view and filter your node list +- [Node Metrics](node-metrics) — signal quality and position history for individual nodes +- [Discovery](discovery) — traceroute and neighbor info for understanding mesh topology +- [Units & Locale](units-and-locale) — distance and coordinate display formats + +--- + diff --git a/docs/sq-rAL/user/messages-and-channels.md b/docs/sq-rAL/user/messages-and-channels.md new file mode 100644 index 000000000..0788a8064 --- /dev/null +++ b/docs/sq-rAL/user/messages-and-channels.md @@ -0,0 +1,159 @@ +--- +title: Messages & Channels +nav_order: 3 +last_updated: 2026-05-13 +description: Send and receive messages, manage channels, configure encryption, and use quick chat, reactions, and message actions. +aliases: + - channels + - direct-messages + - messaging + - conversations +--- + +# Messages & Channels + +Meshtastic supports two communication modes: **channel broadcasts** and **direct messages**. + +## Channels + +Channels are shared communication groups. All nodes configured with the same channel key can read and send messages on that channel. + +### Default Channel + +Every Meshtastic device comes with a default **LongFast** channel. This is an unencrypted channel used for general mesh communication. + +### Channel Security + +Channels support multiple encryption levels: + +| Icon | Security Level | Përshkrimi | +| ---- | ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------- | +| 🔒 | PSK (256-bit AES) | Fully encrypted with a strong pre-shared key. Only nodes with the matching key can read messages. | +| 🔐 | PSK (128-bit AES) | Encrypted with a shorter key. Secure for most uses but 256-bit is preferred for sensitive data. | +| 🔓 | Default / Open | Uses the well-known default key. **Any Meshtastic device** on the same preset can read these messages. | +| ⚠️ | Insecure + Position | Open channel that also broadcasts your GPS position. Use with caution in public meshes. | + +> 🔒 **Security Tip:** 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. + +### Adding a Channel + +1. Navigate to **Settings → Channels**. +2. Tap **Add Channel** or scan a QR code. +3. Configure the channel name and encryption key. +4. Share the channel URL/QR code with others who need access. + +Tapping a channel shows its details and sharing options. + +## Direct Messages + +Direct messages (DMs) are point-to-point encrypted communications between two specific nodes. + +### Sending a Direct Message + +1. Open the **Messages** tab. +2. Select a node from your contacts list or tap a node in the node list. +3. Type your message and tap **Send**. + +### Message States + +| State | Icon | Meaning | +| --------------------------------- | ---- | ----------------------------------------------------------------------------------------------------------------- | +| Queued | ⏳ | Message waiting to be sent | +| En route | ✓ | Delivered to the radio, awaiting acknowledgment | +| Delivered | ✓✓ | Acknowledgment received from recipient | +| Received | ✓ | Message received from the mesh (incoming) | +| S&F Routing | 🔗 | Store & Forward: message being routed through an S&F node | +| S&F Confirmed | 🔗 | Store & Forward: delivery confirmed via S&F node | +| Gabim | ✗ | Delivery failed after retries | + +### Delivery Errors + +When a message fails to deliver, the error indicator shows what went wrong: + +| Gabim | Meaning | What to Do | +| ---------------- | ---------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| No Route | No path exists to the destination node | The recipient may be offline or out of mesh range. Try later or move closer. | +| Got NAK | The next-hop node refused to relay | The relay node may be congested. Wait and retry. | +| Koha e skaduar | No acknowledgment within retry window | The recipient may be just out of range. Try increasing hop limit or moving to a better position. | +| Nuk ka ndërfaqe | No radio interface available to send | Check that your radio is connected and the channel is configured. | +| Max Retransmit | All retry attempts exhausted | The mesh path is unreliable. Try a different channel or wait for conditions to improve. | +| Nuk ka kanal | The destination channel doesn't exist | Verify both nodes share the same channel configuration. | +| Too Large | Message exceeds maximum payload size | Shorten your message (max ~230 characters). | +| No Response | Node received message but didn't respond | The recipient's radio may be busy or in low-power sleep mode. | +| Duty Cycle Limit | Regional airtime limit reached | Your radio has used its allowed transmit time. Wait for the duty cycle window to reset (typically 1 hour in EU regions). | +| Kërkesë e gabuar | Malformed or invalid message | This usually indicates a software bug. Try restarting the app. | + +> 💡 **Tip:** 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. + +## Message Features + +### Quick Chat + +Pre-configured messages for rapid communication: + +- Access via the Quick Chat button in the message input area +- Choose from built-in phrases or custom messages +- Customize quick chat messages in **Settings → Quick Chat** +- Useful when typing is impractical (gloves, small screen, urgent) + +![Quick chat option](/assets/screenshots/messages_quick_chat.png) + +The channel list shows each channel with its latest message preview. + +### Message Bubbles + +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. + +### Reactions + +React to messages with emoji: + +- **Long-press** a message to open the actions menu +- Tap **Add Reaction** to choose an emoji +- Reactions appear below the message bubble +- Multiple users can react to the same message +- React to your own messages or others' messages + +![Emoji reaction badges displayed beneath a message](/assets/screenshots/messages_reaction.png) + +> 💡 **Tip:** Reactions are lightweight — they use minimal mesh bandwidth compared to full text messages. + +### Message Actions + +Long-press any message to access: + +- **Copy** — copy message text to clipboard +- **Reply** — quote the message in your response +- **React** — add an emoji reaction +- **Delete** — remove a message you sent (local deletion) + +### Message Priority + +Messages are queued and transmitted based on priority: + +1. Emergency/alert messages (highest) +2. Direct messages +3. Channel broadcasts (lowest) + +### Message Limits + +- **Maximum length:** 237 bytes (approximately 230 characters for ASCII text) +- **Rate limiting:** The mesh enforces airtime fairness; heavy message volume may be throttled +- **Delivery:** Messages are retried automatically if no acknowledgment is received + +## Best Practices + +- Use channels for group coordination +- Use direct messages for private person-to-person communication +- Keep messages short — mesh bandwidth is limited +- Configure encryption for sensitive communications + +## Related Topics + +- [Nodes](nodes) — tap a node to start a direct message +- [Settings — Radio & User](settings-radio-user) — configure channel encryption and presets +- [MQTT](mqtt) — bridge channel messages to the internet +- [Channel configuration](https://meshtastic.org/docs/configuration/radio/channels) — detailed channel settings on meshtastic.org + +--- + diff --git a/docs/sq-rAL/user/mqtt.md b/docs/sq-rAL/user/mqtt.md new file mode 100644 index 000000000..f662e669a --- /dev/null +++ b/docs/sq-rAL/user/mqtt.md @@ -0,0 +1,137 @@ +--- +title: MQTT +nav_order: 11 +last_updated: 2026-05-13 +description: Bridge your mesh to the internet — MQTT broker setup, encryption layers, and map reporting. +aliases: + - mqtt + - internet-bridge + - broker +--- + +# MQTT + +MQTT bridges your Meshtastic mesh network to the internet, enabling long-range communication beyond radio range. + +## Overview + +The MQTT module connects your node to an MQTT broker, allowing: + +- Messages to reach nodes on different physical meshes via the internet +- Integration with home automation and monitoring systems +- Publishing node positions to the public Meshtastic map +- Custom data pipelines for logging and alerting + +## How It Works + +``` +[Your Node] → Radio → [Gateway Node with WiFi] → MQTT Broker → [Remote Gateway] → Radio → [Remote Node] +``` + +A gateway node with internet access (WiFi or Ethernet) publishes mesh messages to an MQTT topic. Remote gateways subscribed to the same topic inject those messages into their local mesh. + +## Configuration + +### Enabling MQTT + +1. Navigate to **Settings → Module Config → MQTT**. +2. Enable the MQTT module. +3. Configure the broker connection: + +![MQTT toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | Përshkrimi | Default | +| --------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------- | +| Server Address | MQTT broker hostname | mqtt.meshtastic.org | +| Username | Broker authentication | meshdev | +| Password | Broker authentication | large4cats | +| Root Topic | Base topic for messages | msh | +| Encryption | Encrypt MQTT payload | Enabled | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON packet support has been removed from firmware; this field is ignored | Disabled | +| TLS | Secure connection to broker | Disabled | +| Map Reporting | Report position to public map | Disabled | + +### Default Meshtastic Broker + +The community maintains a public broker at `mqtt.meshtastic.org`. This is intended for general use and testing. + +> 🔒 **Privacy:** Messages on the public broker are readable by anyone subscribed. Always use channel encryption for private communications. + +### Private Broker + +For better privacy and control, you can run your own MQTT broker: + +- Mosquitto (lightweight, open-source) +- HiveMQ +- EMQX + +Configure your node to point to your private broker with appropriate credentials. + +## Map Reporting + +When Map Reporting is enabled, your node publishes its position to the Meshtastic community map: + +- Visible at [meshmap.net](https://meshmap.net) and similar community map services +- Only position and node info are shared +- Disable this if you don't want your location publicly visible + +## Uplink vs Downlink + +| Direction | Përshkrimi | +| ------------ | -------------------------------- | +| **Uplink** | Messages from mesh → MQTT broker | +| **Downlink** | Messages from MQTT broker → mesh | + +Configure per-channel which directions are active to control message flow and airtime usage. + +## Message Formats + +MQTT uses protobuf message format: + +| Format | Përshkrimi | Use case | +| ------------ | ----------------------------------- | -------------------------- | +| **Protobuf** | Binary Meshtastic protobuf encoding | Node-to-node mesh bridging | + +> ⚠️ **Note:** JSON output support was removed from firmware. The `json_enabled` setting is still visible in the app for legacy compatibility but has no effect on current firmware versions. + +## Encryption & Privacy + +Understanding the layered encryption model: + +1. **Channel encryption** happens on the mesh _before_ MQTT. If your channel has a PSK, the MQTT payload is already encrypted — the broker and any subscribers see only the ciphertext. +2. **MQTT encryption** (the module setting) adds an additional encryption layer for transit to the broker. This protects metadata and routing information. +3. **TLS** encrypts the TCP connection to the broker itself, preventing network-level eavesdropping. + +> 🔒 **Important:** The default public channel has a well-known key. Messages on the default channel sent via MQTT are effectively **unencrypted** — anyone can decode them. Always use a custom PSK for private communications. + +## Best Practices + +- Use channel-level encryption (PSK) on channels that bridge to MQTT +- Don't enable MQTT on nodes without internet access (it will buffer and waste memory) +- Use a private broker for sensitive deployments +- Be mindful of airtime when downlinking messages from busy MQTT topics — every downlinked message consumes radio airtime on your local mesh +- Consider enabling uplink-only if you only need to monitor your mesh remotely without injecting messages back + +## Troubleshooting + +### MQTT Not Connecting + +- **Check WiFi** — the gateway node must have an active internet connection (WiFi or Ethernet). MQTT does not work over the LoRa radio link itself. +- **Verify credentials** — incorrect username or password will silently fail on most brokers. Double-check for trailing spaces. +- **Firewall** — port 1883 (MQTT) or 8883 (MQTT+TLS) must be open. Some networks block non-standard ports. +- **DNS resolution** — if using a custom broker hostname, verify the node can resolve it. Try the broker's IP address directly. + +### Messages Not Bridging + +- **Check uplink/downlink settings** — if only uplink is enabled, messages flow from mesh to MQTT but not back. Enable downlink on the receiving gateway. +- **Channel mismatch** — both gateways must share the same channel with the same PSK. A mismatch means messages are encrypted with different keys and appear as garbage. +- **Topic mismatch** — ensure both gateways use the same root topic. The default `msh` works for the public broker. + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — MQTT module configuration reference +- [Messages & Channels](messages-and-channels) — channel encryption and PSK setup +- [MQTT integration guide](https://meshtastic.org/docs/software/integrations/mqtt) — detailed MQTT documentation on meshtastic.org + +--- + diff --git a/docs/sq-rAL/user/node-metrics.md b/docs/sq-rAL/user/node-metrics.md new file mode 100644 index 000000000..1bcffcfce --- /dev/null +++ b/docs/sq-rAL/user/node-metrics.md @@ -0,0 +1,130 @@ +--- +title: Node Metrics +nav_order: 5 +last_updated: 2026-05-13 +description: Telemetry dashboards for each mesh node — device health, environment sensors, signal quality, power, traceroute, and position history. +aliases: + - metrics + - telemetry + - device-metrics + - signal +--- + +# Node Metrics + +The node detail screen provides comprehensive telemetry and metrics for each node on your mesh. + +## Device Metrics + +Basic operating information reported by each node: + +| Metric | Përshkrimi | +| ------------------- | ----------------------------------- | +| Battery Level | Current battery percentage | +| Voltage | Battery voltage reading | +| Përdorimi i kanalit | Percentage of airtime consumed | +| Airtime | Transmission time used by this node | +| Uptime | Time since last reboot | + +Device metrics are displayed as individual cards with trend sparklines showing battery level, voltage, channel utilization, airtime, and uptime over time. + +> 💡 **Tip:** Tap any metric card to expand it into a full chart with historical data points. Pinch to zoom the time axis. + +## Environment Metrics + +Environmental sensor data (requires compatible hardware): + +| Metric | Sensor Examples | +| ------------------------------------ | --------------------- | +| Temperatura | BME280, BME680, SHT31 | +| Lagështia | BME280, BME680, SHT31 | +| Barometric Pressure | BME280, BMP280 | +| Gas Resistance | BME680 | +| IAQ (Air Quality) | BME680 | + +Environment metrics are charted over time for easy trend analysis — temperature, humidity, and pressure each get their own line chart with the measurement unit displayed on the Y axis. + +> 💡 **Tip:** Environment metrics require a sensor connected to the remote node. Not all nodes report environmental data. See [Telemetry & Sensors](telemetry-and-sensors) for a full list of supported sensors. + +## Signal Metrics + +Radio signal quality information: + +| Metric | Përshkrimi | +| --------- | ----------------------------------------------------------------------------- | +| SNR | Signal-to-Noise Ratio (higher is better) | +| RSSI | Received Signal Strength Indicator (closer to 0 is better) | +| Hop Count | Number of mesh hops for last message | + +### Signal Quality Reference + +| SNR Range | Quality | +| --------------------------------- | --------- | +| > 10 dB | Excellent | +| 0 to 10 dB | Mirë | +| -10 to 0 dB | Mesatar | +| < -10 dB | Poor | + +## Power Metrics + +Power management telemetry (requires INA sensor or compatible hardware): + +| Metric | Përshkrimi | +| ----------- | ----------------------- | +| Bus Voltage | Supply voltage | +| Current | Power draw in milliamps | +| Power | Calculated wattage | + +## Traceroute + +Traceroute shows the path a message takes through the mesh: + +1. From the node detail screen, tap **Traceroute**. +2. The app sends a traceroute request to the target node. +3. Results show each hop with SNR/RSSI values. + +### Reading Traceroute Results + +``` +You → Node A (SNR: 8.5) → Node B (SNR: 5.2) → Target +``` + +Each hop represents a relay node that forwarded the message. + +## Regjistri i Pozitës + +Historical position data for nodes that share their location: + +- GPS coordinates +- Altitude +- Speed (if moving) +- Timestamp for each position report + +## Neighbor Info + +Shows which nodes a given node can directly hear, useful for understanding mesh topology. + +## Viewing Metrics + +1. Navigate to **Nodes**. +2. Tap the node you want to inspect. +3. Select the metric category from the detail tabs. + +![Node detail — local device](/assets/screenshots/nodes_detail_local.png) + +The position tab shows location data for nodes that share GPS: + +![Position inline content](/assets/screenshots/nodes_position.png) + +> ⚠️ **Note:** Metrics are only available when they have been reported by the remote node. Metrics update at intervals configured on each node's telemetry settings. + +## Related Topics + +- [Nodes](nodes) — node list, filtering, and sorting +- [Telemetry & Sensors](telemetry-and-sensors) — supported sensors and configuration +- [Signal Meter](signal-meter) — how signal quality is calculated from SNR and RSSI +- [Discovery](discovery) — traceroute details and neighbor info +- [Units & Locale](units-and-locale) — temperature, distance, and speed display formats + +--- + diff --git a/docs/sq-rAL/user/nodes.md b/docs/sq-rAL/user/nodes.md new file mode 100644 index 000000000..433f73950 --- /dev/null +++ b/docs/sq-rAL/user/nodes.md @@ -0,0 +1,152 @@ +--- +title: Nodes +nav_order: 4 +last_updated: 2026-05-13 +description: Browse, filter, and sort mesh nodes — view details, signal quality, roles, and quick actions. +aliases: + - node-list + - mesh-nodes + - peers +--- + +# Nodes + +The Nodes screen displays all devices visible on your mesh network. + +## Node List + +The node list shows every node your radio has heard, including: + +- **Node name** — user-configured long name +- **Short name** — 4-character identifier +- **Signal quality** — last heard signal strength +- **Last heard** — time since last communication +- **Distance** — estimated distance (if positions are shared) +- **Battery** — remote node battery level (if telemetry is enabled) + +### Node Status Indicators + +| Badge | Meaning | +| ---------- | ------------------------------------- | +| 🟢 Online | Node heard within the last 15 minutes | +| 🟡 Away | Node heard within the last 2 hours | +| 🔴 Offline | Node not heard for over 2 hours | +| ⭐ Favorite | Node marked as favorite by the user | + +### Node Roles + +Nodes can be configured with different roles that affect their mesh behavior: + +| Role | Përshkrimi | +| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Client | Standard end-user device | +| Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | +| Client Mute | Receives but doesn't retransmit | +| Client Hidden | Like Client Mute, plus hides from node list | +| Router | Prioritizes message forwarding; stays awake to relay | +| Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | +| ~~Router Client~~ | ⚠️ **Deprecated** (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | +| ~~Repeater~~ | ⚠️ **Deprecated** (removed in firmware 2.7.11) — no longer selectable; use Router instead | +| Tracker | Optimized for position reporting at regular intervals | +| Sensor | Optimized for telemetry reporting | +| TAK | Interoperates with TAK systems (sends/receives CoT) | +| TAK Tracker | TAK position reporting only | +| Lost & Found | Continuous position beacon for recovery | + +### Choosing a Role + +Most users should keep the default **Client** role. Consider a different role when: + +- **Router** — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don't use Router on battery-powered handheld devices. +- **Router Late** — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. +- **Client Base** — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. +- **Client Mute** — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only devices or to reduce congestion in dense areas. +- **Tracker** — An unattended device whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. +- **Sensor** — An unattended device reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. +- **TAK / TAK Tracker** — Only needed if interoperating with ATAK/WinTAK systems. See [TAK Integration](tak) for details. + +> 💡 **Tip:** The mesh works best when most nodes are **Client** or **Router**. Too many Mute nodes reduces mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. + +### Encryption Indicators + +Nodes display encryption status icons next to their name: + +| Icon | Meaning | +| ----------- | ------------------------------------------------------------------------------------------------------------------- | +| 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | +| 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | +| ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) | + +> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. + +## Quick Actions + +From the node list, you can: + +- **Tap** a node to view its detail page +- **Long-press** for quick actions: + - Send a direct message + - View on map + - Kërkoni pozicionin + - Mark as favorite + - Traceroute + +## Filtering & Sorting + +### Text Search + +Type in the search field to filter nodes by name or short name. The filter updates in real time as you type. + +### Filter Toggles + +| Filtrimi | Përshkrimi | +| -------------------------- | ---------------------------------------------------------------------------------------------- | +| **Only online** | Show only nodes heard within the last 15 minutes | +| **Only direct** | Show only nodes with direct (non-relayed) connections | +| **Include unknown** | Show nodes that haven't sent user info yet | +| **Exclude infrastructure** | Hide infrastructure-role nodes (Router, Repeater, Router Late, Client Base) | +| **Exclude MQTT** | Hide nodes heard only via MQTT internet bridge | +| **Show ignored** | Show nodes you've previously dismissed or muted | + +### Sort Options + +| Sort | Përshkrimi | +| ------------------------------------------- | ------------------------------------------------------------------ | +| **Last heard** (default) | Most recently heard nodes first | +| **Alphabetical** | Sorted by node long name | +| **Distance** | Nearest nodes first (requires position sharing) | +| **Hops away** | Fewest relay hops first | +| **Channel** | Grouped by channel index | +| **Via MQTT** | Grouped by MQTT vs. radio-heard | +| **Favorites** | Favorited nodes first | + +## Node Detail + +Tapping a node opens the detail view with comprehensive information. See [Node Metrics](node-metrics) for full details on metrics and telemetry. + +![Node detail view](/assets/screenshots/nodes_node_list.png) + +The detail screen includes device info, position, and action buttons: + +![Node detail section](/assets/screenshots/nodes_detail_section.png) + +Inline status indicators show key metrics at a glance: + +| Indicator | Screenshot | +| -------------------- | -------------------------------------------------------- | +| Signal quality | ![Signal](/assets/screenshots/nodes_signal_info.png) | +| Battery level | ![Battery](/assets/screenshots/nodes_battery_info.png) | +| Hop count | ![Hops](/assets/screenshots/nodes_hops_info.png) | +| I fundit që u dëgjua | ![Last heard](/assets/screenshots/nodes_last_heard.png) | +| Distanca | ![Distance](/assets/screenshots/nodes_distance_info.png) | + +## Related Topics + +- [Node Metrics](node-metrics) — detailed telemetry dashboards for each node +- [Messages & Channels](messages-and-channels) — send a direct message to a node +- [Map & Waypoints](map-and-waypoints) — view node positions geographically +- [Discovery](discovery) — traceroute and neighbor info for topology exploration +- [Signal Meter](signal-meter) — understand what the signal bars mean + +--- + diff --git a/docs/sq-rAL/user/onboarding.md b/docs/sq-rAL/user/onboarding.md new file mode 100644 index 000000000..3b910534e --- /dev/null +++ b/docs/sq-rAL/user/onboarding.md @@ -0,0 +1,99 @@ +--- +title: Getting Started +nav_order: 1 +last_updated: 2026-05-13 +description: First-launch setup — permissions, onboarding flow, and next steps after connecting your radio. +aliases: + - first-launch + - setup + - intro +--- + +# Getting Started + +Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app. + +## First Launch + +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. + +### Welcome Screen + +The welcome screen introduces Meshtastic and its core capabilities: + +- Off-grid mesh communication +- No cellular or internet required +- End-to-end encrypted messaging + +Tap **Get Started** to proceed through the setup flow. + +![Welcome screen](/assets/screenshots/onboarding_welcome.png) + +## Permissions + +The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. + +### Bluetooth Permission + +Bluetooth is the primary connection method between your phone and Meshtastic radio: + +- **Bluetooth scanning** — discover nearby Meshtastic radios +- **Bluetooth connect** — establish and maintain connections with paired radios + +Grant both permissions when prompted. Without Bluetooth, you'll need to use USB or TCP connections instead. + +### Location Permission + +> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. + +Meshtastic also uses your location for: + +- Showing your position on the mesh map +- Calculating distances to other nodes +- Sharing your GPS coordinates with other mesh members (if enabled) + +Grant **"While using the app"** or **"Always"** depending on your preference: + +- **While using the app** — position updates only when the app is open +- **Always** — enables background position updates for always-on mesh presence + +If denied, Bluetooth scanning will not function and your node will not report a position. + +### Notifications Permission + +Notifications alert you to: + +- Incoming messages from channels and direct messages +- Connection status changes (connected, disconnected, reconnecting) +- Firmware update availability + +> 💡 **Tip:** You can fine-tune notification preferences later in Android system settings. The app creates separate notification channels for messages, connection events, and background service status. + +### Critical Alerts Permission + +On supported devices, the app may request permission for critical alerts: + +- These are high-priority notifications that can break through Do Not Disturb mode +- Useful for emergency mesh alerts or urgent messages +- You can **skip** this step if you don't need breakthrough notifications +- Configure or revoke later in Android notification settings + +## After Setup + +Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. + +> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. + +## What's Next? + +Once connected to a radio, explore: + +- [Connections](connections) — pair your first radio device +- [Messages & Channels](messages-and-channels) — send your first message +- [Nodes](nodes) — see who's on your mesh +- [Map & Waypoints](map-and-waypoints) — view node positions +- [Settings](settings-radio-user) — configure your radio and user profile + +New to Meshtastic? The [getting started guide](https://meshtastic.org/docs/getting-started) on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup. + +--- diff --git a/docs/sq-rAL/user/settings-module-admin.md b/docs/sq-rAL/user/settings-module-admin.md new file mode 100644 index 000000000..5a370608c --- /dev/null +++ b/docs/sq-rAL/user/settings-module-admin.md @@ -0,0 +1,246 @@ +--- +title: Settings — Modules & Admin +nav_order: 8 +last_updated: 2026-05-13 +description: Configure optional feature modules (MQTT, telemetry, canned messages, TAK, and more) and perform device administration. +aliases: + - modules + - module-config + - administration +--- + +# Settings — Modules & Admin + +Configure optional feature modules and perform device administration. Modules extend Meshtastic with specialized capabilities — each can be independently enabled or disabled. + +> 💡 **Tip:** You only need to enable the modules you actually use. Disabling unused modules reduces airtime, saves battery, and simplifies your configuration. + +Module settings use a card-based layout with toggle switches, dropdowns, text fields, and sliders: + +![Toggle switch](/assets/screenshots/settings_switch.png) + +![Dropdown selector](/assets/screenshots/settings_dropdown.png) + +![Text field](/assets/screenshots/settings_text_field.png) + +![Settings card layout](/assets/screenshots/settings_titled_card.png) + +## Module Configuration + +### MQTT Module + +Bridges mesh messages to and from an MQTT broker for internet connectivity. This is how you extend your mesh beyond radio range or integrate with home automation systems. + +| Setting | Përshkrimi | +| --------------- | ------------------------------------------------------------------------ | +| Enabled | Toggle MQTT bridge | +| Server | MQTT broker address | +| Username | Authentication username | +| Password | Authentication password | +| Encryption | Encrypt MQTT payloads | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON support removed from firmware; field is ignored | +| TLS | Use secure connection | +| Root Topic | Base MQTT topic path | +| Map Report | Publish position for public map | + +See [MQTT](mqtt) for a detailed usage guide including encryption, privacy, and broker setup. + +### Serial Module + +Enables serial port communication for external device integrations (GPS modules, sensors, or custom hardware). When enabled, the node's serial port can send and receive protobuf or text data, allowing external microcontrollers or computers to interact with the mesh. + +| Setting | Përshkrimi | +| ---------- | ------------------------------- | +| Enabled | Activate serial communication | +| Echo | Echo received serial data back | +| Mode | Text, Protobuf, or NMEA output | +| RX/TX Pins | GPIO pins for serial connection | +| Baud Rate | Serial communication speed | + +### External Notification Module + +Controls buzzer, LED, or vibration alerts on your radio hardware. Useful for devices that need to physically signal when a message arrives — particularly helpful for unattended or outdoor installations. + +| Setting | Përshkrimi | +| -------------------------------- | --------------------------- | +| Enabled | Activate notifications | +| Alert Message | Notify on incoming messages | +| Alert Message Buzzer | Use buzzer for messages | +| Alert Message Vibra | Use vibration for messages | +| Alert Bell | Notify on bell character | +| Output (GPIO) | Pin for notification output | +| Active | High or Low active | +| Duration (ms) | Notification length | +| Use I2S as Buzzer | Use I2S audio output | + +### Store & Forward Module + +Buffers messages for nodes that were temporarily offline, then replays them when those nodes reconnect. Essential for meshes where nodes go in and out of range regularly — ensures messages aren't lost during brief disconnections. + +| Setting | Përshkrimi | +| ------------------------------------------ | -------------------------- | +| Enabled | Activate store and forward | +| Heartbeat (s) | Announcement interval | +| Records | Maximum stored messages | +| History Return (max) | Max messages to replay | +| History Return (window) | Time window for replay | + +> 💡 **Tip:** Store and Forward works best on nodes with ample memory (ESP32 with PSRAM). Router nodes are ideal candidates since they're typically always-on. + +### Range Test Module + +Automated range testing tool for evaluating link quality between nodes. When enabled, the node periodically transmits test messages with incrementing counters. A receiver node logs these messages, allowing you to walk or drive away and later analyze at what distance messages stopped arriving. + +| Setting | Përshkrimi | +| -------------------------------------- | --------------------------------- | +| Enabled | Activate range testing | +| Sender Interval (s) | Time between test transmissions | +| Save CSV | Log received test data to SD card | + +### Telemetry Module + +Controls what telemetry data your node shares with the mesh. Telemetry includes device health (battery, uptime) and environmental sensor data (temperature, humidity, pressure). + +| Setting | Përshkrimi | +| ---------------------------- | --------------------------------------- | +| Device Metrics Interval | How often to report device metrics | +| Environment Metrics Interval | How often to report environment sensors | +| Air Quality Enabled | Report particulate sensor data | +| Power Metrics Enabled | Report power usage | + +See [Telemetry & Sensors](telemetry-and-sensors) for supported sensors and configuration recommendations. + +### Canned Message Module + +Pre-configured messages accessible from the device's physical buttons (for radios with rotary encoders, keypads, or similar input hardware). Define a list of quick-send messages that can be transmitted without a phone connected — ideal for field use. + +| Setting | Përshkrimi | +| ------------------ | ----------------------------------------------------------- | +| ~~Enabled~~ | ⚠️ **Deprecated** — current firmware may ignore this toggle | +| 訊息 | Newline-separated list of messages | +| Send Bell | Play bell sound on send | +| Rotary Encoder | Enable rotary encoder input | +| Up/Down/Press Pins | GPIO pin assignments for input | + +### Audio Module + +Codec2 audio support for low-bandwidth voice communication over the mesh. This is an **experimental** feature that encodes voice into very small data packets using the Codec2 codec. + +| Setting | Përshkrimi | +| --------------- | -------------------------------- | +| Enabled | Activate audio module | +| Codec2 Rate | Audio quality/bandwidth tradeoff | +| I2S Word Select | GPIO pin for I2S WS | +| I2S Data In | GPIO pin for I2S DIN | +| I2S Data Out | GPIO pin for I2S DOUT | + +> ⚠️ **Note:** Audio requires specific hardware (I2S microphone and speaker). Voice quality is very low-bandwidth — think "understandable radio voice," not phone-call quality. + +### Remote Hardware Module + +GPIO control over the mesh network. Allows a remote node to read or write GPIO pins on another node — useful for activating relays, reading switches, or controlling external hardware from a distance. + +| Setting | Përshkrimi | +| -------------------- | --------------------------------------------------------------- | +| Enabled | Activate remote GPIO access | +| Allow Undefined Pins | Allow access to any GPIO pin (security risk) | + +> ⚠️ **Warning:** Enabling "Allow Undefined Pins" gives remote nodes access to all GPIO pins, which could interfere with the radio's own hardware. Only enable on dedicated GPIO nodes. + +### Neighbor Info Module + +Broadcasts information about directly heard neighbors, enabling mesh topology mapping. Each enabled node periodically shares a list of the other nodes it can hear and their signal quality. + +| Setting | Përshkrimi | +| -------------------------------------- | ------------------------------------ | +| Enabled | Activate neighbor broadcasting | +| Update Interval (s) | How often to broadcast neighbor list | + +See [Discovery](discovery) for how to use neighbor data for mesh topology exploration. + +### Ambient Lighting Module + +Controls onboard NeoPixel or other addressable RGB LEDs on supported hardware. Can be used for visual status indicators, notification lights, or decorative effects. + +| Setting | Përshkrimi | +| ------------------ | ---------------------------------------------------------- | +| Enabled | Activate LED control | +| LED State | On, Off, or set specific color | +| Red / Green / Blue | Individual color channel values (0–255) | + +### Detection Sensor Module + +Turns your node into a motion or door sensor alert system. When a GPIO pin detects a state change (motion detected, door opened), the node broadcasts an alert message over the mesh. + +| Setting | Përshkrimi | +| ---------------------------------------- | ----------------------------------------------------------------------- | +| Enabled | Activate detection sensor | +| Monitor Pin | GPIO pin connected to sensor | +| Detection Triggered High | Trigger when pin goes high (vs. low) | +| Minimum Broadcast (s) | Minimum time between alert broadcasts | +| State Broadcast (s) | Periodic state broadcast interval | +| Send Bell | Include bell character in alerts | +| Friendly Name | Custom name for this sensor | + +### Paxcounter Module + +People counter using WiFi and BLE probe requests. Counts nearby devices by passively listening for probe requests that phones and laptops emit when scanning for networks. Available only on ESP32 devices. + +| Setting | Përshkrimi | +| -------------------------------------- | -------------------------- | +| Enabled | Activate people counting | +| Update Interval (s) | How often to report counts | + +> 💡 **Tip:** Paxcounter is useful for estimating foot traffic at trailheads, event venues, or other locations. Counts are approximate — one person may carry multiple devices. + +### TAK Module + +Team Awareness Kit integration for interoperability with ATAK and WinTAK. See [TAK Integration](tak) for detailed setup and usage. + +## Administratë + +### Administratë e Largët + +Remotely configure nodes that share your admin key: + +1. Select the target node in the node list. +2. Navigate to **Settings** for that node. +3. Modify configuration. +4. Tap **Save** — changes are sent over the mesh. + +> ⚠️ **Requires:** Admin key configured on both your node and the target node. + +### Clean Node Database + +Removes stale nodes from your local database that haven't been heard in a configurable time window. + +### Factory Reset + +Resets all settings to factory defaults. **This cannot be undone.** + +### Rindiz + +Remotely reboot a connected or administered node. + +### Paneli i debug-ut + +View detailed diagnostic information: + +- Protocol buffers debug output +- Mesh packet log +- Connection state details + +### Troubleshooting Remote Admin + +- **"No response from target node"** — the target may be out of range, offline, or have a mismatched admin key. Verify the admin key matches on both nodes. +- **Changes not applying** — some settings require a reboot to take effect. Try the Reboot action after saving. +- **Can't see remote settings** — ensure your node has the admin key for the target node and that Admin Channel is enabled in Security Config. + +## Related Topics + +- [Settings — Radio & User](settings-radio-user) — core radio and user profile settings +- [Module configuration reference](https://meshtastic.org/docs/configuration/module) — detailed module docs on meshtastic.org +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/sq-rAL/user/settings-radio-user.md b/docs/sq-rAL/user/settings-radio-user.md new file mode 100644 index 000000000..c1921577f --- /dev/null +++ b/docs/sq-rAL/user/settings-radio-user.md @@ -0,0 +1,173 @@ +--- +title: Settings — Radio & User +nav_order: 7 +last_updated: 2026-05-13 +description: Configure your radio hardware, LoRa presets, user profile, position sharing, power management, and security. +aliases: + - settings + - radio-config + - user-config + - lora +--- + +# Settings — Radio & User + +Configure your radio hardware and user identity parameters. + +## User Settings + +### User Profile + +| Setting | Përshkrimi | +| ----------------- | ------------------------------------------------------------------------------------- | +| Long Name | Your display name (up to 39 characters) | +| Short Name | 4-character abbreviated name | +| Licensed Operator | Enable if you hold an amateur radio license (enables higher power) | + +### Applying Changes + +After modifying settings, tap **Save** to write the configuration to your radio. The device may reboot to apply changes. + +## Radio Configuration + +### Device Config + +| Setting | Përshkrimi | Default | +| ------------------------------------------ | ----------------------------------------------------------------------- | -------- | +| Role | Node behavior (Client, Router, etc.) | Client | +| Rebroadcast Mode | How the node retransmits messages | All | +| Node Info Broadcast (s) | Interval for broadcasting node info | 10800 | +| Double-tap Button | Action for double-tap button press | Disabled | + +### LoRa Config + +| Setting | Përshkrimi | Default | +| ----------------- | ----------------------------------------------------------------------- | ----------------------------------------- | +| Rajon | Regulatory region for frequency bands | Unset (must configure) | +| Modem Preset | Speed/range tradeoff | LongFast | +| Hop Limit | Maximum retransmit hops | 3 | +| TX Power | Transmission power (dBm); 0 = max allowed for region | 0 (region max) | +| Frequency Offset | Fine-tune frequency (MHz) | 0 | +| Channel Bandwidth | Bandwidth setting | Default for preset | + +> ⚠️ **Important:** You **must** set your region before transmitting. Operating without the correct region may violate local radio regulations. See the [region configuration guide](https://meshtastic.org/docs/getting-started/initial-config) on meshtastic.org for details. + +### Modem Presets + +| Preset | Range | Speed | SNR Limit | Best For | +| ------------------ | ----------------------- | ------------------------- | ------------------------ | -------------------------------------------------------------------------------------------------------- | +| Short Turbo | ~1 km | 21.9 kbps | −5 dB | Dense urban with line-of-sight; data-heavy applications | +| Short Fast | ~3 km | 10.9 kbps | −7.5 dB | Urban neighborhoods; buildings within a few blocks | +| Short Slow | ~5 km | 5.5 kbps | −10 dB | Suburban short-range; moderate building density | +| Medium Fast | ~5 km | 5.5 kbps | −10 dB | Suburban areas; moderate building density | +| Medium Slow | ~8 km | 1.1 kbps | −12.5 dB | Suburban/rural; moderate range with slower speed | +| Long Turbo | ~10 km | 4.4 kbps | −10 dB | Similar range to Long Fast but with 500 kHz bandwidth; faster throughput | +| Long Fast | ~10 km | 1.1 kbps | −12.5 dB | **General use (default)** — balanced range and speed | +| Long Moderate | ~20 km | 0.34 kbps | −15 dB | Rural with some terrain; occasional use | +| Lite Fast | ~5 km | 5.5 kbps | −10 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Medium Fast | +| Lite Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Long Fast | +| Narrow Fast | ~5 km | 2.7 kbps | −10 dB | EU 868 MHz band (62.5 kHz BW); avoids interference with other devices | +| Narrow Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 868 MHz band (62.5 kHz BW); comparable to Long Fast | +| ~~Long Slow~~ | ~30 km | 0.18 kbps | −17.5 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | +| ~~Very Long Slow~~ | ~40+ km | 0.09 kbps | −20 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | + +#### Choosing a Modem Preset + +The modem preset controls the fundamental tradeoff between **range** and **data rate**: + +- **Slower presets** use more spreading, making signals decodable at weaker signal levels (lower SNR limit). This means longer range but fewer bytes per second. +- **Faster presets** pack more data per transmission but require a stronger signal to decode. + +**Practical guidance:** + +- **Urban mesh (many nodes, short distances):** Use **Long Fast** (default) or **Short Fast**. Higher speed means less airtime congestion when many nodes share the channel. +- **Rural/sparse mesh (few nodes, long distances):** Use **Long Moderate**. Range matters more than speed when nodes are far apart. +- **EU 866/868 MHz regulatory compliance:** Use **Lite Fast**, **Lite Slow**, **Narrow Fast**, or **Narrow Slow** — these are optimized for the EU SRD/868 MHz bands with narrower bandwidths. +- **Fixed infrastructure links:** Use **Short Turbo** or **Long Turbo** for dedicated point-to-point links with good antennas and line-of-sight. +- **Mixed environments:** Stick with **Long Fast** — it's the community default and ensures compatibility with others in your area. + +> ⚠️ **Important:** All nodes on the same channel **must** use the same modem preset. Nodes with mismatched presets cannot communicate even if they share the same frequency and encryption key. + +> 💡 **Tip:** The range estimates above assume flat terrain and modest antennas. Elevation advantage (hilltop, rooftop) dramatically increases effective range. A well-placed Router with Long Fast can often outperform a ground-level node with Long Slow. + +### Display Config + +| Setting | Përshkrimi | +| ------------------- | ------------------------------------------------------------------------------------ | +| Screen Timeout | Time before display sleeps | +| Display Units | Metric or Imperial | +| OLED Type | Auto, SSD1306, SH1106, SH1107 | +| Compass Orientation | Rotation offset for compass display (0°, 90°, 180°, 270°) | +| ~~Compass North~~ | ⚠️ **Deprecated** — replaced by Compass Orientation; still visible in older firmware | + +### Position Config + +| Setting | Përshkrimi | +| ----------------------------------------- | ---------------------------------- | +| GPS Enabled | Enable/disable GPS | +| GPS Update Interval | How often to acquire GPS fix | +| Position Broadcast (s) | How often to share position | +| Smart Position | Enable movement-based broadcasting | +| Fixed Position | Use a manually set position | + +### Power Config + +| Setting | Përshkrimi | +| --------------------------------------- | --------------------------------------- | +| Power Saving | Enable low-power sleep mode | +| Shutdown After (s) | Auto-shutdown idle timer | +| ADC Multiplier | Battery voltage calibration factor | +| Wait Bluetooth (s) | Time to wait for BLE connection at boot | +| Mesh SDS Timeout (s) | Super-deep-sleep timeout | + +### Network Config + +| Setting | Përshkrimi | +| ------------- | ---------------------------------------------------- | +| WiFi Enabled | Enable WiFi radio (ESP32 devices) | +| WiFi SSID | Network name to connect to | +| WiFi PSK | Network password | +| NTP Server | Time synchronization server | +| Syslog Server | Remote logging server | + +![IP address field](/assets/screenshots/settings_ipv4_field.png) + +### Bluetooth Config + +| Setting | Përshkrimi | +| ----------------- | ------------------------------------------------------------------------- | +| Bluetooth Enabled | Enable/disable BLE radio | +| Pairing Mode | Fixed PIN, Random PIN, or No PIN | +| Fixed PIN | PIN code for pairing (default: 123456) | + +### Security Config + +| Setting | Përshkrimi | +| --------------------- | -------------------------------------------------------------------------- | +| Public Key | Your node's public key (read-only) | +| Admin Key | Key for remote administration | +| Private Key | Your node's private key (handle securely) | +| Admin Channel Enabled | Allow admin commands via channel | +| Debug Log | Output live debug logging over serial/bluetooth | +| Serial Enabled | Enable serial console access (moved from Device Config) | +| Managed Mode | Restrict non-admin channel changes | + +![Password field](/assets/screenshots/settings_password_field.png) + +Settings use standard preference controls — dropdowns, toggles, and sliders: + +| Control | Screenshot | +| -------- | ------------------------------------------------------ | +| Dropdown | ![Dropdown](/assets/screenshots/settings_dropdown.png) | +| Toggle | ![Toggle](/assets/screenshots/settings_switch.png) | +| Slider | ![Slider](/assets/screenshots/settings_slider.png) | + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — optional feature modules and device administration +- [Signal Meter](signal-meter) — how modem presets affect signal quality thresholds +- [LoRa configuration](https://meshtastic.org/docs/configuration/radio/lora) — detailed LoRa settings reference on meshtastic.org +- [Initial configuration](https://meshtastic.org/docs/getting-started/initial-config) — region setup guide on meshtastic.org + +--- + diff --git a/docs/sq-rAL/user/signal-meter.md b/docs/sq-rAL/user/signal-meter.md new file mode 100644 index 000000000..9afd86896 --- /dev/null +++ b/docs/sq-rAL/user/signal-meter.md @@ -0,0 +1,81 @@ +--- +title: How the Meshtastic Signal Meter Works +nav_order: 15 +last_updated: 2026-05-13 +description: How the signal meter calculates quality from RSSI and SNR — LoRa spread spectrum, presets, and what the bars really mean. +aliases: + - signal + - signal-meter + - snr + - rssi +--- + +# How the Meshtastic Signal Meter Works + +The Meshtastic signal meter — the familiar bars or status color in the app — is calculated very differently than the "bars" on a traditional cell phone or Wi-Fi router. + +Most consumer devices simply measure how "loud" a signal is. However, because Meshtastic uses **LoRa (Long Range)** technology, its signal meter measures how **clear** the signal is, relative to the specific settings your mesh is using. + +--- + +## 1. The Two Metrics: "Loudness" vs. "Clarity" + +Every time the LoRa radio chip receives a message, it reports two measurements: + +- **RSSI (Received Signal Strength Indicator):** The **loudness** of the raw power hitting your antenna. +- **SNR (Signal-to-Noise Ratio):** The **clarity** of the signal compared to the background static. + +> **Tip — The Analogy:** Imagine you are trying to hear a friend talking to you. +> +> - **RSSI** is how loud their voice is. +> - **The Noise Floor** is the background noise in the room (air conditioning, other people talking, traffic). +> - **SNR** is how easily you can distinguish your friend's voice from the background noise. + +If your friend shouts at you at a deafening rock concert, the signal is incredibly loud (High RSSI), but you still can't understand them because the background noise is louder (Bad SNR). Conversely, if your friend whispers to you in a dead-silent library, the signal is very weak (Low RSSI), but you can understand them perfectly (Great SNR). + +--- + +## 2. The Magic of LoRa: Hearing "Below the Noise Floor" + +For standard radios (like FM or Wi-Fi), if the background noise is louder than the signal (a negative SNR), the receiver just hears static. + +LoRa is special. It uses **"Spread Spectrum"** modulation, which allows the radio to mathematically pull a signal out of the air even when it is buried deep _underneath_ the background noise. This is why you will frequently see **negative SNR numbers** in Meshtastic (e.g., -10 dB, which means the signal is 10 decibels weaker than the background static). + +Depending on which Meshtastic preset you are using (e.g., `LongFast` vs. `ShortFast`), the radio has a specific **SNR Limit** — the absolute maximum amount of noise it can tolerate before the message is completely lost to the static. + +--- + +## 3. How the Signal Meter Calculates Quality + +The Meshtastic apps take both RSSI and SNR and run them through a specific formula to assign your signal a quality rating (None, Bad, Fair, or Good). It specifically scales these values based on the physical limits of the radio preset you are using. + +Here is exactly how the app decides how many bars (or what color) to show you: + +| Level | Bars | Criteria | Meaning | +| ------- | ---- | ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | +| Mirë | 3 | RSSI better than `-115 dBm` **AND** SNR better than `-7 dB` | Signal is both loud and clear — healthy connection. | +| Mesatar | 2 | RSSI better than `-126 dBm` with good SNR, **OR** SNR better than `-15 dB` with good RSSI | Signal getting quieter or noisier, but still decodable. | +| I Keq | 1 | Falls between Fair and None thresholds | At the edge of range or experiencing interference. | +| Asnjë | 0 | RSSI worse than `-126 dBm` **AND** SNR worse than `-15 dB` | Transmission completely buried in noise. | + +--- + +## 4. What This Means for You + +Because Meshtastic's meter acts as a **"Clarity Meter"**, it behaves differently than what most people expect: + +> **Tip — Don't panic over low RSSI:** You might see a seemingly terrible RSSI value like `-118 dBm`. On a cell phone, you would have zero bars. But if you have an SNR of `+2 dB`, Meshtastic will still show a strong signal! _The library is quiet, so the whisper is heard perfectly._ + +> **Warning — Watch out for local noise:** If you hook up a massive antenna and see a great RSSI (e.g., `-90 dBm`) but your signal meter is only showing **1 Bar (Bad)**, you have a problem. It means you have local interference — perhaps a cheap power supply, a noisy computer, or a nearby radio tower — creating so much static that it is drowning out your mesh. + +## Where Signal Information Appears + +In the app, signal data is shown in several places: + +- **Node list** — signal bars icon next to each node +- **Node detail** — SNR, RSSI, and signal quality in the device metrics section +- **Traceroute** — per-hop signal quality for each relay node +- **Signal metrics** — historical SNR and RSSI data in the metrics charts + +![Node entry showing SNR, RSSI values and colored signal bars](/assets/screenshots/nodes_signal_info.png) + diff --git a/docs/sq-rAL/user/tak.md b/docs/sq-rAL/user/tak.md new file mode 100644 index 000000000..a6a2fe63e --- /dev/null +++ b/docs/sq-rAL/user/tak.md @@ -0,0 +1,126 @@ +--- +title: TAK Integration +nav_order: 10 +last_updated: 2026-05-13 +description: Interoperate with ATAK and WinTAK — CoT position sharing, TAK roles, and plugin setup. +aliases: + - tak + - atak + - team-awareness-kit +--- + +# TAK Integration + +Meshtastic integrates with the Team Awareness Kit (TAK) ecosystem, enabling interoperability between Meshtastic mesh devices and TAK applications like ATAK and WinTAK. + +## Overview + +The TAK module allows Meshtastic nodes to: + +- Share position data in TAK-compatible CoT (Cursor on Target) format +- Appear as team members on TAK map displays +- Receive TAK PLI (Position Location Information) messages + +## Setup + +### Prerequisites + +- ATAK (Android Team Awareness Kit) or WinTAK installed +- Meshtastic ATAK Plugin installed +- TAK module enabled on your Meshtastic radio + +### Configuration + +1. Navigate to **Settings → Module Config → TAK**. +2. Enable the TAK module. +3. Configure the TAK team/group settings: + +![Module toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | Përshkrimi | +| ------- | -------------------------- | +| Enabled | Activate TAK interop | +| Mode | TAK-compatible output mode | + +### ATAK Plugin Setup + +1. Install the Meshtastic ATAK Plugin from the plugin repository. +2. Open ATAK and enable the Meshtastic plugin. +3. The plugin bridges messages between ATAK and your mesh network. + +## TAK Roles + +Nodes configured with TAK-related roles behave differently from standard clients: + +| Role | Përshkrimi | +| --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **TAK** | Full TAK interoperability — sends and receives CoT data, chat messages, and PLI updates. Functions as a standard client plus TAK bridge. | +| **TAK Tracker** | Position-only TAK output — automatically broadcasts PLI at regular intervals without user interaction. Optimized for unattended position beacons (vehicles, equipment, waypoints). Does not relay chat messages. | + +> 💡 **Tip:** Use **TAK Tracker** for devices that only need to report position (e.g., a radio mounted in a vehicle). Use **TAK** for devices where users actively participate in TAK operations. + +### CoT (Cursor on Target) Format + +TAK messages use the Cursor on Target XML format — a military standard for sharing situational awareness data. Meshtastic converts its internal protobuf messages to CoT format when bridging to TAK systems, so no manual format conversion is needed. + +## TAK Identity + +When using TAK roles, your node broadcasts identity information that appears on TAK maps: + +| Setting | Përshkrimi | +| -------- | ---------------------------------------------------------------------------------------------------------------- | +| Team | Your team color on the TAK map (e.g., Blue, Red, Cyan, Green) | +| Role | Your operational role (Team Member, Team Lead, HQ, Medic, RTO, etc.) | +| Callsign | Your TAK callsign (defaults to your Meshtastic long name) | + +These settings appear in **Settings → Module Config → TAK** when the TAK module is enabled. + +> 💡 **Tip:** Team/role colors are the standard TAK affiliation colors. Coordinate with your TAK team to use consistent team assignments. + +## Wire Format (V1 / V2) + +Meshtastic supports two TAK wire formats: + +| Format | Compatibility | Features | +| ------------------------------- | --------------------------------------------------------------- | --------------------------------------------------------- | +| V1 (Legacy) | ATAK Plugin v1.x, older firmware | Basic CoT position sharing only | +| V2 (Current) | ATAK Plugin v2.x, firmware 2.3+ | Full CoT support including chat, routes, zstd compression | + +The app automatically selects V2 when both sides support it. No manual configuration needed — the TAK module negotiates format based on firmware capabilities. + +## Usage with ATAK + +Once configured: + +- Meshtastic nodes appear as markers on the ATAK map with callsign labels +- Chat messages can bridge between mesh and TAK networks +- Position updates flow bidirectionally between Meshtastic and TAK +- TAK Tracker nodes broadcast PLI automatically — their positions appear on ATAK maps without any ATAK-side configuration + +> ⚠️ **Note:** TAK integration requires specific node roles and module configuration. Standard client nodes don't automatically participate in TAK operations. + +## Troubleshooting + +| Problem | Cause | Solution | +| -------------------------------- | ------------------------------------- | ----------------------------------------------------------------------- | +| Node doesn't appear on ATAK map | TAK module disabled or wrong role | Verify TAK module is enabled and node role is TAK or TAK Tracker | +| Position updates are stale | GPS fix lost or interval too long | Check GPS status; reduce position broadcast interval in Position Config | +| ATAK plugin shows "disconnected" | BLE connection lost or plugin crashed | Reconnect Bluetooth in Meshtastic app, then restart ATAK plugin | +| Chat messages not bridging | V1 format doesn't support chat | Ensure both nodes run firmware 2.3+ for V2 wire format | +| CoT data not flowing | Channel mismatch | All TAK nodes must be on the same channel with matching encryption | + +## Security Considerations + +- TAK data shares your position and callsign information +- Ensure your channel encryption is configured when using TAK in sensitive environments +- The TAK module respects the same channel encryption as other Meshtastic messages + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — TAK module configuration +- [Nodes](nodes) — TAK and TAK Tracker roles in the node list +- [Map & Waypoints](map-and-waypoints) — node positions on the map +- [ATAK plugin guide](https://meshtastic.org/docs/software/integrations/atak-plugin) — detailed ATAK setup on meshtastic.org + +--- + diff --git a/docs/sq-rAL/user/telemetry-and-sensors.md b/docs/sq-rAL/user/telemetry-and-sensors.md new file mode 100644 index 000000000..e016adf76 --- /dev/null +++ b/docs/sq-rAL/user/telemetry-and-sensors.md @@ -0,0 +1,118 @@ +--- +title: Telemetry & Sensors +nav_order: 9 +last_updated: 2026-05-13 +description: Sensor data on the mesh — supported environment, air quality, and power sensors, plus configuration and viewing guides. +aliases: + - sensors + - environment + - weather + - power-metrics +--- + +# Telemetry & Sensors + +Meshtastic nodes can collect and share sensor data across the mesh network. + +## Overview + +Telemetry allows nodes equipped with sensors to broadcast environmental, power, and device health information. This data is visible on the node detail screen and can be logged over time. + +## Device Telemetry + +All Meshtastic nodes report basic device telemetry: + +| Metric | Përshkrimi | Typical Range | +| ------------------- | ------------------------------ | ------------------------------------------------------------------ | +| Battery Level | Charge percentage | 0–100% | +| Voltage | Battery voltage | 3.0–4.2V (LiPo) | +| Përdorimi i kanalit | % of airtime used locally | 0–100% | +| Air Utilization TX | % of airtime used by this node | 0–100% | +| Uptime | Seconds since last boot | Varies | + +## Environment Sensors + +Supported environmental sensors: + +### Temperature & Humidity + +| Sensor | Temperatura | Lagështia | Pressure | Notes | +| ------- | ----------- | --------- | -------- | ----------------------- | +| BME280 | ✓ | ✓ | ✓ | Recommended all-in-one | +| BME680 | ✓ | ✓ | ✓ | Adds gas resistance/IAQ | +| SHT31 | ✓ | ✓ | — | High accuracy | +| MCP9808 | ✓ | — | — | Precision temperature | +| LPS22 | — | — | ✓ | Pressure only | + +### Air Quality + +| Sensor | Metric | Notes | +| -------- | -------------------------------------------------- | -------------------------- | +| BME680 | Gas Resistance / IAQ | Volatile organic compounds | +| PMSA003I | PM1.0, PM2.5, PM10 | Particulate matter | +| SEN55 | PM, NOx, VOC, Temp, Humidity | Multi-sensor | + +### Light & UV + +| Sensor | Metric | +| -------- | -------------------------------------- | +| OPT3001 | Ambient light (lux) | +| VEML7700 | Ambient light (lux) | +| LTR390 | UV index | + +## Power Metrics + +Nodes with INA-series power sensors can report: + +| Metric | Përshkrimi | +| ----------- | ----------------------------------------- | +| Bus Voltage | Supply rail voltage | +| Current | Power consumption (mA) | +| Power | Calculated power (mW) | + +Useful for monitoring solar charging or battery health on remote nodes. + +## Configuring Telemetry + +1. Navigate to **Settings → Module Config → Telemetry**. +2. Set reporting intervals: + - **Device Metrics Interval** — how often to broadcast device metrics + - **Environment Metrics Interval** — how often to broadcast sensor data +3. Enable specific sensor types as needed. + +### Recommended Intervals + +| Use Case | Device (s) | Environment (s) | +| ------------------------------------------ | ----------------------------- | ---------------------------------- | +| Urban mesh (many nodes) | 3600 | 3600 | +| Rural mesh (few nodes) | 900 | 900 | +| Weather station | 900 | 300 | +| Battery conservation | 7200 | 7200 | + +> ⚠️ **Note:** Shorter intervals increase airtime usage and battery drain across the mesh. + +## Viewing Telemetry + +1. Navigate to **Nodes** and select a node. +2. Telemetry sections show on the detail screen: + - Device Metrics (always available) + - Environment Metrics (if sensors present) + - Power Metrics (if INA sensor present) +3. Historical graphs show trends over time. + +![Telemetry actions](/assets/screenshots/node-metrics_telemetric_actions.png) + +## Troubleshooting + +- **No environment data showing?** The remote node needs a physical sensor connected (e.g., BME280 on I2C). Device telemetry (battery, uptime) is always available, but environment metrics require hardware. +- **Stale readings?** Check the reporting interval — very long intervals (7200s+) mean data updates infrequently. Also verify the remote node is still online. +- **Sensor conflict on I2C bus?** Some sensors share I2C addresses. If you have multiple sensors on the same bus, check for address collisions in the radio's serial debug output. + +## Related Topics + +- [Node Metrics](node-metrics) — view telemetry data on the node detail screen +- [Settings — Modules & Admin](settings-module-admin) — telemetry module configuration +- [Units & Locale](units-and-locale) — temperature and pressure display units + +--- + diff --git a/docs/sq-rAL/user/translate.md b/docs/sq-rAL/user/translate.md new file mode 100644 index 000000000..b2ed79a34 --- /dev/null +++ b/docs/sq-rAL/user/translate.md @@ -0,0 +1,97 @@ +--- +title: Translate the App +parent: User Guide +nav_order: 17 +last_updated: 2026-05-13 +aliases: + - translate + - crowdin + - localization +--- + +# Translate the App + +Contributing translations helps make Meshtastic accessible to a wider audience. The app uses [Crowdin](https://crowdin.com/) to manage community translations for both the user interface and in-app documentation. + +--- + +## What Gets Translated + +| Resource | Source Location | Notes | +| ----------------- | ------------------------------------- | ---------------------------------------------------------------------- | +| UI strings | `composeResources/values/strings.xml` | Buttons, labels, messages, and all user-visible text | +| User Guide pages | `docs/user/*.md` | In-app documentation shown in Help & Documentation | +| Fastlane metadata | `fastlane/metadata/android/en-US/` | App Store listing title, description, and changelogs | + +> **Note — Developer Guide pages are English-only.** Code-focused documentation targeting contributors is not translated. + +--- + +## How to Contribute + +1. **Visit the Crowdin project.** Open the [Meshtastic Android Crowdin project](https://crowdin.com/project/meshtastic-android) and sign in or create a free account. +2. **Choose your language.** Select an existing language or request a new one by opening a [GitHub issue](https://github.com/meshtastic/Meshtastic-Android/issues/new). +3. **Translate strings.** Crowdin shows the English source on the left and your translation on the right. Translate each string and save. +4. **Review context.** Many strings include screenshots or context comments — check these to understand where the text appears in the app. +5. **Submit.** Approved translations are automatically merged into the next release. + +> **Tip — Keep translations short.** UI strings often appear in buttons, chips, or narrow columns. If a translation is significantly longer than the English original, consider abbreviating where the meaning stays clear. + +--- + +## Adding a New Language + +If your language is not yet listed on Crowdin: + +1. Open an issue on [GitHub](https://github.com/meshtastic/Meshtastic-Android/issues/new) requesting the new locale. +2. A maintainer will add the language to Crowdin and configure `crowdin.yml`. +3. Once added, you can begin translating immediately. + +--- + +## How Translations Are Organized + +The Android app uses **Compose Multiplatform resources** for all user-visible strings: + +``` +core/resources/src/commonMain/composeResources/ +├── values/ ← English (default) +│ └── strings.xml +├── values-de/ ← German +│ └── strings.xml +├── values-fr/ ← French +│ └── strings.xml +└── ... +``` + +In-app documentation follows a similar pattern under `docs/`: + +``` +docs/ +├── user/ ← English source (default) +│ ├── onboarding.md +│ └── ... +├── fr/user/ ← French translations +│ ├── onboarding.md +│ └── ... +└── ... +``` + +The app automatically selects the correct locale based on your device's **Language & Region** settings. + +--- + +## Translation Guidelines + +- **Do not translate** technical terms like "LoRa", "MQTT", "BLE", "TAK", "SNR", or "RSSI" — these are universal. +- **Keep placeholders intact.** Strings like `%1$s` or `%d` are filled in at runtime. Do not remove or reorder them unless the grammar of your language requires it. +- **Match tone.** The app uses a friendly, direct voice. Avoid overly formal language. +- **Test if possible.** Switch your device language and open the app to see how translations look in context. + +--- + +## Questions? + +If you have questions about a specific string's context or need help getting started, open a discussion on the [Meshtastic GitHub Discussions](https://github.com/meshtastic/Meshtastic-Android/discussions) page. + +Thank you for helping expand the reach of Meshtastic! diff --git a/docs/sq-rAL/user/units-and-locale.md b/docs/sq-rAL/user/units-and-locale.md new file mode 100644 index 000000000..d4efd4ad1 --- /dev/null +++ b/docs/sq-rAL/user/units-and-locale.md @@ -0,0 +1,118 @@ +--- +title: Units, Measurement & Locale +parent: User Guide +nav_order: 16 +last_updated: 2026-05-12 +--- + +# Units, Measurement & Locale + +The Meshtastic app automatically displays temperatures, distances, speeds, and times in the units your device is configured to use — no settings to change inside the app. + +--- + +## How It Works + +Meshtastic radios always transmit data in **metric units** (meters, °C, km/h, hPa, etc.). When the app receives this data, it uses the `MetricFormatter` utility to convert and display values in whatever unit system your device's locale specifies. + +On Android, your measurement preferences are determined by your system **Language & Region** settings. On Desktop (JVM), the app uses the JVM's default `Locale`. + +> **Tip — You never need to toggle units inside the app.** Change your system measurement preferences and every screen in Meshtastic updates automatically — node details, telemetry charts, weather, altitude, and more. + +--- + +## Temperatura + +Temperature values from environment sensors are transmitted as **°C** and displayed based on your device's temperature unit preference. + +![Environment metrics with temperature](/assets/screenshots/nodes_environment_metrics.png) + +| Your Setting | You See | +| ------------ | ------- | +| Celsius | 22°C | +| Fahrenheit | 72°F | + +This affects all temperature displays throughout the app: node environment telemetry, soil temperature, dew point, and telemetry chart axes. + +## Distance & Altitude + +Distances between nodes and GPS altitudes are transmitted as **meters** and automatically scaled and converted. + +![Distance info display](/assets/screenshots/nodes_distance_info.png) + +| Your Setting | Small Distance | Large Distance | Altitude | +| -------------------------------- | -------------- | ---------------------- | -------- | +| Metric | 350 m | 2.5 km | 1,200 m | +| Imperial (US) | 1,148 ft | 1.6 mi | 3,937 ft | + +The app uses natural scaling — short distances stay in meters or feet, while longer distances switch to kilometres or miles automatically. + +### Where these appear + +- **Node list** — distance and bearing to each node +- **Node detail** — altitude, distance from your position +- **Map** — waypoint distances, traceroute hop distances +- **Compass** — distance to selected node + +## Speed + +GPS ground speed is displayed in your locale's preferred speed unit. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Metric | 12 km/h | +| Imperial (US) | 7 mph | + +## Wind + +Wind speed and gust data from environment sensors are transmitted as **m/s** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Metric | 5 m/s | +| Imperial (US) | 11 mph | + +Wind readings appear in the **Node Detail** environment section and the **Environment Telemetry** charts. + +## Rainfall + +Rainfall measurements (1-hour and 24-hour totals) are transmitted as **mm** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ---------------------- | +| Metric | 12 mm | +| Imperial (US) | 0.5 in | + +## Units That Never Change + +Some units are international standards and are displayed the same way regardless of your locale: + +| Measurement | Unit | Why | +| -------------------------------- | ------------------------------ | ------------------------------------- | +| Barometric pressure | hPa | International meteorological standard | +| Heading / bearing | ° (degrees) | Universal navigation convention | +| Radiation | μR/hr | Standard dosimetry unit | +| GPS coordinates | decimal degrees | Universal geographic standard | +| Humidity, battery, soil moisture | % | Universal | + +## Date & Time + +All timestamps throughout the app — last heard, message times, telemetry logs, chart axes — follow your device's date and time preferences. + +| Setting | What It Controls | Example | +| ---------------- | ---------------- | ------------------------------------------------ | +| **24-Hour Time** | Clock format | 14:30 vs 2:30 PM | +| **Date Format** | Date ordering | 09/05/2026 vs 05/09/2026 | + +The app also uses **relative time** where it makes sense — for example, "5 min ago" or "2 hours ago" in the node list — which is automatically localised into your device language. + +## Changing Your Measurement System (Android) + +On Android, your measurement system (metric vs imperial) is tied to your region setting: + +1. Open **Android Settings → System → Language & Region** +2. Change your **Region** or **Measurement units** preference +3. Return to Meshtastic — values update immediately + +> **Tip — The app uses `MetricFormatter` from `core:common`.** All measurement formatting is handled by a shared KMP utility that respects your platform's locale. Developers adding new measurement displays should use `MetricFormatter` rather than hard-coding unit conversions. + diff --git a/docs/sr-rLatn/index.md b/docs/sr-rLatn/index.md new file mode 100644 index 000000000..1e717192c --- /dev/null +++ b/docs/sr-rLatn/index.md @@ -0,0 +1,30 @@ +--- +title: Home +layout: default +nav_order: 0 +--- + +# Meshtastic Android App Documentation + +User and developer documentation for the Meshtastic Android, Desktop, and iOS applications powered by KMP (Kotlin Multiplatform). + +Use the sidebar navigation to browse the **User Guide** for app features and the **Developer Guide** for contributing to the project. + +--- + +## Quick Links + +| Guide | Опис | +| --------------------------------------------------------------------- | -------------------------------------------------------------- | +| [Getting Started](user/onboarding) | Connect your first radio and send a message | +| [Messages & Channels](user/messages-and-channels) | Channel broadcasts, direct messages, reactions, and encryption | +| [Nodes](user/nodes) | Understanding the mesh network node list | +| [Signal Meter](user/signal-meter) | How the LoRa signal quality meter works | +| [Units & Locale](user/units-and-locale) | How temperatures, distances, and times adapt to your region | +| [Desktop App](user/desktop) | Linux, macOS, and Windows desktop usage | +| [Architecture](developer/architecture) | App architecture overview for contributors | +| [Contributing](developer/contributing) | Branch naming, PR workflow, and verification commands | + +--- + +> This documentation is served from the same markdown source that powers the in-app **Help & Documentation** browser. diff --git a/docs/sr-rLatn/user/connections.md b/docs/sr-rLatn/user/connections.md new file mode 100644 index 000000000..02f4465c8 --- /dev/null +++ b/docs/sr-rLatn/user/connections.md @@ -0,0 +1,125 @@ +--- +title: Connections +nav_order: 2 +last_updated: 2026-05-13 +description: Connect your phone or desktop to a Meshtastic radio via Bluetooth, USB, or TCP/IP. +aliases: + - bluetooth + - usb + - tcp + - pairing +--- + +# Connections + +Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node. + +## Bluetooth (BLE) + +Bluetooth Low Energy is the default and most common connection method on Android. + +### Pairing a Device + +1. Ensure your Meshtastic radio is powered on and in pairing mode. +2. Open the app and navigate to **Connections**. +3. Tap **Scan for Devices** — nearby Meshtastic radios will appear. +4. Select your device from the list. +5. Accept the Bluetooth pairing prompt if shown. + +![Device list item](/assets/screenshots/connections_bluetooth_scan.png) + +You can filter devices by transport type using the filter chips at the top: + +![Transport filter chips](/assets/screenshots/connections_transport_filters.png) + +> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. + +### Connection Status + +| Иконица | State | Опис | +| ------- | -------------- | ----------------------------- | +| 🟢 | Блутут повезан | Active radio link established | +| 🟡 | Connecting | Handshake in progress | +| 🔴 | Raskačeno | No active connection | +| ⚪ | Not configured | No device selected | + +When connecting, a status indicator shows the current connection state: + +![Connecting status](/assets/screenshots/connections_connecting.png) + +If no devices are found, the app shows an empty state with instructions: + +![No devices found](/assets/screenshots/connections_empty_state.png) + +### Troubleshooting Bluetooth + +- **Device not found:** Toggle Bluetooth off/on, ensure location is enabled. +- **Connection drops:** Move closer to the radio; check for interference. +- **Pairing rejected:** Forget the device in Android Bluetooth settings and retry. + +## USB Serial + +USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable. + +### Setup + +1. Connect your radio via USB cable to your device. +2. The app will prompt for USB permission — tap **Allow**. +3. The connection is established automatically. + +> ⚠️ **Note:** USB connections require OTG support on Android devices. + +## TCP/IP (WiFi) + +Some Meshtastic radios support WiFi connectivity, allowing TCP-based connections. + +### Configuration + +1. Connect your radio to a WiFi network via the radio's web interface or settings. +2. In the app, go to **Connections → TCP**. +3. Enter the radio's IP address and port (default: 4403). +4. Tap **Connect**. + +![WiFi scanning for devices](/assets/screenshots/connections_wifi_scanning.png) + +When a device is found, it appears in the connection list: + +![WiFi device found](/assets/screenshots/connections_wifi_device_found.png) + +A successful connection is confirmed with a status indicator: + +![WiFi connection success](/assets/screenshots/connections_wifi_success.png) + +### When to Use TCP + +- Radio is on the same local network +- Testing with a simulated radio +- Environments where Bluetooth has interference issues + +## Reconnection Behavior + +The app reconnects to the **last selected device** on startup. You can manually switch transports from the connections screen at any time. + +To disconnect from a radio, use the disconnect button on the connections screen: + +![Disconnect from radio](/assets/screenshots/connections_disconnect.png) + +## Desktop Connections + +On Desktop (Linux/macOS/Windows), the app supports: + +- **Bluetooth (BLE)** — via the Kable library; works on macOS, Linux, and Windows +- **USB Serial** — primary wired connection method +- **TCP/IP** — for network-connected radios + +See [Desktop App](desktop) for platform-specific details and keyboard shortcuts. + +## Related Topics + +- [Getting Started](onboarding) — first-launch setup and permissions +- [Settings — Radio & User](settings-radio-user) — Bluetooth and network configuration +- [Desktop App](desktop) — desktop-specific connection details +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — full list of compatible radios on meshtastic.org + +--- + diff --git a/docs/sr-rLatn/user/desktop.md b/docs/sr-rLatn/user/desktop.md new file mode 100644 index 000000000..a5d01e7e3 --- /dev/null +++ b/docs/sr-rLatn/user/desktop.md @@ -0,0 +1,147 @@ +--- +title: Desktop App +nav_order: 14 +last_updated: 2026-05-13 +description: Install and use the Meshtastic Desktop app on Linux, macOS, and Windows — connections, feature parity, and keyboard shortcuts. +aliases: + - desktop + - linux + - macos + - windows + - jvm +--- + +# Desktop App + +The Meshtastic Desktop application provides the same mesh communication features on Linux, macOS, and Windows. + +## Overview + +The Desktop app shares its core codebase with the Android app through Kotlin Multiplatform (KMP). Most features work identically across platforms. + +## Installation + +### Linux + +- Download the `.deb` or `.AppImage` package from the releases page +- Or build from source using `./gradlew :desktopApp:run` + +### macOS + +- Download the `.dmg` package from releases +- Or build from source + +### Windows + +- Download the `.msi` installer from releases +- Or build from source + +## Connecting Your Radio + +### USB Serial (Primary) + +The most reliable connection method on Desktop: + +1. Connect your Meshtastic radio via USB cable. +2. The app should detect the serial port automatically. +3. If not detected, select the correct serial port from the connections menu. + +### TCP/IP + +For network-connected radios: + +1. Enter the radio's IP address and port (default: 4403). +2. Click **Connect**. + +### Bluetooth (BLE) + +Bluetooth Low Energy is supported on Desktop via the [Kable](https://github.com/JuulLabs/kable) library: + +1. Ensure your system has a Bluetooth adapter. +2. The app scans for nearby Meshtastic radios automatically. +3. Select your device from the connections screen. + +## Feature Parity + +| Feature | Android | Desktop | Белешке | +| ---------------------------------------- | ------- | ------- | -------------------------- | +| Messaging | ✓ | ✓ | Full parity | +| Node List | ✓ | ✓ | Full parity | +| Мапа | ✓ | ✓ | Full parity | +| Подешавања | ✓ | ✓ | Full parity | +| Bluetooth (BLE) | ✓ | ✓ | Via Kable on desktop | +| Firmware Update OTA | ✓ | ✗ | Use web flasher | +| Notifications | ✓ | ✓ | Native OS notifications | +| Widgets | ✓ | ✗ | Android-only | +| AI Assistant (Chirpy) | ✓\* | ✗ | Google flavor Android only | + +\*Chirpy AI requires Android 14+ on Google flavor builds with supported hardware. + +## UI Differences + +The Desktop app uses the same Compose Multiplatform UI with adaptations for larger screens and desktop interaction. + +### Keyboard Shortcuts + +| Shortcut | Action | +| ------------------- | --------------------------- | +| **⌘Q** / **Ctrl+Q** | Quit the application | +| **⌘,** / **Ctrl+,** | Отвори подешавања | +| **⌘1** / **Ctrl+1** | Switch to Conversations tab | +| **⌘2** / **Ctrl+2** | Switch to Nodes tab | +| **⌘3** / **Ctrl+3** | Switch to Map tab | +| **⌘4** / **Ctrl+4** | Switch to Connections tab | + +### Window & System Tray + +- **Window resizing** — responsive layout adapts to window dimensions +- **System tray** — minimize to system tray for background mesh operation +- **Tray menu** — right-click the tray icon to show window or quit +- **Mouse interaction** — hover states and standard desktop navigation + +### Notification Preferences + +The Desktop app provides in-app toggles for controlling which notifications are shown — messages, new nodes, and low battery alerts. Access these from **Settings → Notifications** within the app. + +## Built-in Documentation Browser + +The Desktop app includes a built-in documentation browser for quick access to help content without leaving the application. + +![Docs browser with table of contents](/assets/screenshots/docs-browser_toc.png) + +The browser supports full-text search across all documentation: + +![Searching the docs browser](/assets/screenshots/docs-browser_search.png) + +Individual doc pages render with full formatting: + +![A documentation page](/assets/screenshots/docs-browser_page.png) + +## Building from Source + +```bash +git clone https://github.com/meshtastic/Meshtastic-Android.git +cd Meshtastic-Android +git submodule update --init +./gradlew :desktopApp:run +``` + +Requirements: + +- JDK 21 +- No Android SDK required for desktop-only builds + +## Known Limitations + +- No OTA firmware updates (use web flasher) +- Some Android-specific features (widgets, specific notification channels) are unavailable +- Performance may vary on low-spec hardware running Compose Desktop +- BLE bonding is not yet supported on desktop (pairing works without bonding) + +## Related Topics + +- [Connections](connections) — connection methods overview +- [Firmware Updates](firmware) — use the [Web Flasher](https://flasher.meshtastic.org) for desktop firmware updates + +--- + diff --git a/docs/sr-rLatn/user/discovery.md b/docs/sr-rLatn/user/discovery.md new file mode 100644 index 000000000..55092187e --- /dev/null +++ b/docs/sr-rLatn/user/discovery.md @@ -0,0 +1,114 @@ +--- +title: Discovery +nav_order: 12 +last_updated: 2026-05-13 +description: Explore your mesh network — traceroute paths, neighbor maps, and node discovery tools. +aliases: + - mesh-discovery + - local-discovery + - network-scan + - traceroute + - neighbor-info +--- + +# Discovery + +Discovery tools help you understand **how** your mesh network is connected — which nodes can hear each other, what paths messages take, and where bottlenecks or weak links exist. + +> 💡 **Tip:** You don't need a dedicated "discovery mode" to start exploring your mesh. The tools below are available right now from the node list and node detail screens. + +--- + +## Праћење руте + +Traceroute reveals the exact path a message takes from your node to any other node on the mesh. It's the single most useful tool for debugging connectivity problems. + +### Running a Traceroute + +1. Navigate to **Nodes** and tap the node you want to trace. +2. On the node detail screen, tap **Traceroute**. +3. The app sends a traceroute request and waits for the response. +4. Results display each hop in order, with signal quality at every step. + +### Reading the Results + +A traceroute result looks like this: + +``` +You → Node A (SNR: 8.5, RSSI: -95) → Node B (SNR: 5.2, RSSI: -108) → Target +``` + +Each hop represents a relay node that forwarded the message. The SNR and RSSI values at each hop tell you about the link quality on that specific segment. + +| What to look for | What it means | +| -------------------------------------------------------------------------- | --------------------------------------------------------------------------- | +| All hops show Good SNR (> 5 dB) | Healthy path — messages flow reliably | +| One hop shows Bad SNR (< 0 dB) | Weak link — this relay segment is fragile | +| Many hops (4+) | Long path — consider repositioning a node to shorten it | +| Different path on retry | Mesh is adapting — multiple routes exist (this is good!) | + +> 💡 **Tip:** Run traceroute several times over a few minutes. If the path changes, your mesh has redundant routes — a sign of a well-connected network. + +### Troubleshooting with Traceroute + +- **"No route found"** — The target node may be offline, out of range, or on a different channel. Check that both nodes share at least one channel with the same encryption key. +- **Traceroute times out** — The path may be too long (exceeds hop limit) or a relay node is congested. Try increasing the hop limit in **Settings → LoRa Config**. +- **Asymmetric paths** — A traceroute from A→B may take a different path than B→A. This is normal — radio propagation is not always symmetric. + +--- + +## Neighbor Info + +The Neighbor Info module lets each node broadcast a list of the nodes it can **directly hear** (single-hop). When multiple nodes share their neighbor lists, you can piece together a topology map of the entire mesh. + +### Enabling Neighbor Info + +1. Navigate to **Settings → Module Config → Neighbor Info**. +2. Enable the module. +3. Set the broadcast interval (default: 900 seconds / 15 minutes). + +Once enabled, your node periodically broadcasts its neighbor table. Other nodes with Neighbor Info enabled do the same. + +### Viewing Neighbor Data + +- Open any node's detail screen and look for the **Neighbors** section. +- Each neighbor entry shows the node that was directly heard and its signal quality. +- Combine neighbor data from multiple nodes to understand the full mesh topology. + +> ⚠️ **Note:** Neighbor Info increases airtime usage because every enabled node periodically broadcasts its neighbor list. On busy meshes with many nodes, consider longer broadcast intervals (3600 seconds or more) to avoid congestion. + +--- + +## Node List as a Discovery Tool + +The node list itself is a powerful discovery tool when you use its filtering and sorting features effectively. + +### Finding New Nodes + +- Sort by **Last heard** to see the most recently active nodes at the top. +- Enable **Include unknown** to see nodes that have appeared on the mesh but haven't sent user info yet — these are often newly powered-on devices. + +### Assessing Connectivity + +- Sort by **Hops away** to see which nodes are directly reachable (0 hops) versus relayed. +- Sort by **Distance** to find nearby nodes and verify they're reachable. +- Use **Exclude MQTT** to focus on nodes reachable over radio (not via internet bridge). + +### Infrastructure Audit + +- Disable **Exclude infrastructure** to see Router, Repeater, Router Late, and Client Base nodes. +- Check their signal quality and last-heard times to verify your infrastructure nodes are healthy. + +See [Nodes](nodes) for full details on filtering and sorting options. + +--- + +## Tips for Mesh Exploration + +- **Start with traceroute** — it gives you immediate, actionable information about a specific path. +- **Enable Neighbor Info on key nodes** — especially routers and repeaters, to build a picture of the backbone. +- **Check the map** — node positions on the [Map](map-and-waypoints) combined with signal data help you understand why some links are strong and others are weak. +- **Compare signal over time** — use the [Signal Meter](signal-meter) guide to interpret SNR and RSSI values correctly. + +--- + diff --git a/docs/sr-rLatn/user/firmware.md b/docs/sr-rLatn/user/firmware.md new file mode 100644 index 000000000..adcf73bf4 --- /dev/null +++ b/docs/sr-rLatn/user/firmware.md @@ -0,0 +1,114 @@ +--- +title: Ажурирања фирмвера +nav_order: 13 +last_updated: 2026-05-13 +description: Update your radio firmware over Bluetooth — OTA process, version channels, pre-flight checks, and recovery. +aliases: + - firmware + - update + - ota + - flash +--- + +# Ажурирања фирмвера + +Keep your Meshtastic radio up to date with the latest firmware for new features, bug fixes, and security improvements. + +## Checking for Updates + +1. Navigate to **Settings → Firmware Update** or tap the firmware notification if shown. +2. The app checks for available firmware versions. +3. Available updates show the version number and changelog summary. + +## Update Methods + +### OTA (Over-The-Air) via Bluetooth + +The most common update method for Android users: + +1. Ensure your radio is connected via Bluetooth. +2. Navigate to the Firmware Update screen. +3. Select the desired firmware version. +4. Tap **Update** to begin the OTA process. +5. Wait for the update to complete — **do not disconnect** during the update. + +![Firmware checking for updates](/assets/screenshots/firmware_checking.png) + +> ⚠️ **Warning:** Interrupting a firmware update can brick your device. Ensure your radio has sufficient battery (>50% recommended) and maintain Bluetooth proximity during the entire process. + +![Firmware disclaimer](/assets/screenshots/firmware_disclaimer.png) + +### USB Flashing + +For recovery or when OTA is unavailable: + +- Use the [Meshtastic Web Flasher](https://flasher.meshtastic.org) +- Or the [Meshtastic CLI tool](https://meshtastic.org/docs/getting-started/flashing-firmware) on desktop + +## Version Channels + +| Kanal | Опис | +| ------ | ------------------------------------------- | +| Stable | Recommended for most users; tested releases | +| Alpha | Preview releases; may contain bugs | + +## Pre-Update Checklist + +Before updating: + +- [ ] Battery > 50% +- [ ] Stable Bluetooth connection +- [ ] Note your current settings (they may reset on major version changes) +- [ ] Check the release notes for breaking changes + +## Post-Update + +After a successful update: + +- The radio will reboot automatically +- Bluetooth connection will re-establish +- Verify your settings are intact +- Check the firmware version in **Settings → About** + +![Firmware update success](/assets/screenshots/firmware_success.png) + +## Troubleshooting + +### Update Stuck + +If the update appears frozen: + +- Wait at least 5 minutes before intervening +- If truly stuck, power-cycle the radio +- Attempt the update again + +![Firmware update error](/assets/screenshots/firmware_error.png) + +### Device Won't Boot After Update + +If your device fails to boot: + +1. Try connecting via USB to a computer +2. Use the web flasher in recovery/DFU mode +3. Flash a known-good firmware version +4. Check the Meshtastic Discord for device-specific recovery steps + +### Compatibility Warnings + +The app may show warnings when: + +- Connected radio firmware is below minimum supported version +- Major version mismatch between app and firmware +- Deprecated features need migration + +> ⚠️ **Important:** Always update the Meshtastic app before or alongside firmware updates to ensure compatibility. + +## Related Topics + +- [Connections](connections) — reconnecting after a firmware update +- [Flashing firmware guide](https://meshtastic.org/docs/getting-started/flashing-firmware) — full firmware flashing walkthrough on meshtastic.org +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — check firmware compatibility by device +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/sr-rLatn/user/map-and-waypoints.md b/docs/sr-rLatn/user/map-and-waypoints.md new file mode 100644 index 000000000..a14f2e439 --- /dev/null +++ b/docs/sr-rLatn/user/map-and-waypoints.md @@ -0,0 +1,116 @@ +--- +title: Map & Waypoints +nav_order: 6 +last_updated: 2026-05-13 +description: View node positions on the map, create and share waypoints, and manage position sharing and privacy. +aliases: + - map + - waypoints + - gps + - location +--- + +# Map & Waypoints + +The Map screen shows the geographic positions of nodes on your mesh, along with shared waypoints. + +## Map View + +The map displays: + +- **Node positions** — colored markers for each node reporting location +- **Waypoints** — shared points of interest +- **Your position** — your current GPS location + +### Node Markers + +Node markers on the map indicate: + +| Боја | Meaning | +| ------ | ---------------------------------------------- | +| Green | Online (heard recently) | +| Yellow | Away (heard within 2 hours) | +| Gray | Offline (stale position) | +| Blue | Your own node | + +### Map Controls + +- **Zoom** — pinch or use +/- buttons +- **Pan** — drag to explore +- **Center** — select the location button to center on your position +- **Node tap** — tap a node marker to view details + +The floating toolbar provides quick access to compass, layer switching, node filters, refresh, and location tracking. Tap the compass to reorient north-up, or tap the location button to center on your current position. + +![Map controls overlay](/assets/screenshots/map_controls_overlay.png) + +## Waypoints + +Waypoints are shared geographic points of interest that all mesh members can see. + +### Creating a Waypoint + +1. Long-press on the map at the desired location. +2. Enter a name and optional description. +3. Choose an icon/emoji for the waypoint. +4. Tap **Send** to share with the mesh. + +### Waypoint Properties + +| Property | Опис | +| ---------- | ------------------------------------------------------- | +| Назив | Short identifier (max 30 characters) | +| Опис | Optional longer description | +| Иконица | Visual marker emoji on the map | +| Закључано | If locked, only the creator can edit or delete | +| Expiration | Optional auto-remove time | + +### Waypoint Expiration + +Waypoints can be set to expire automatically: + +- **Never** (default) — waypoint remains until manually deleted +- **Timed** — waypoint is automatically removed after the specified duration (e.g., "remove after 2 hours"). Useful for temporary markers like rally points, hazards, or meeting locations. + +Expired waypoints are automatically hidden from the map so they don't clutter the display. The expiration countdown begins when the waypoint is created, not when other nodes receive it. + +### Managing Waypoints + +- Tap a waypoint on the map to view its details and coordinates +- Edit or delete waypoints you created +- **Locked waypoints** cannot be modified or deleted by other nodes — only the original creator can change them +- Unlocked waypoints can be edited by any mesh member + +## Position Sharing + +### Enabling Position Sharing + +Your node shares its GPS position based on: + +- **Fixed interval** — broadcast position at regular intervals +- **Smart position** — broadcast when movement exceeds a threshold +- **Manual** — only share when explicitly requested + +Configure position behavior in **Settings → Position**. + +### Privacy Considerations + +> 🔒 **Privacy:** Position data is broadcast to all nodes on your channel. If you don't want your location shared, disable GPS position in settings or use a fixed/fake position. + +## Map Sources + +The app supports multiple map tile sources: + +- OpenStreetMap (default) +- Satellite imagery (where available) +- Offline tiles (download map areas for offline use) + +## Related Topics + +- [Nodes](nodes) — view and filter your node list +- [Node Metrics](node-metrics) — signal quality and position history for individual nodes +- [Discovery](discovery) — traceroute and neighbor info for understanding mesh topology +- [Units & Locale](units-and-locale) — distance and coordinate display formats + +--- + diff --git a/docs/sr-rLatn/user/messages-and-channels.md b/docs/sr-rLatn/user/messages-and-channels.md new file mode 100644 index 000000000..af620a044 --- /dev/null +++ b/docs/sr-rLatn/user/messages-and-channels.md @@ -0,0 +1,159 @@ +--- +title: Messages & Channels +nav_order: 3 +last_updated: 2026-05-13 +description: Send and receive messages, manage channels, configure encryption, and use quick chat, reactions, and message actions. +aliases: + - channels + - direct-messages + - messaging + - conversations +--- + +# Messages & Channels + +Meshtastic supports two communication modes: **channel broadcasts** and **direct messages**. + +## Канали + +Channels are shared communication groups. All nodes configured with the same channel key can read and send messages on that channel. + +### Default Channel + +Every Meshtastic device comes with a default **LongFast** channel. This is an unencrypted channel used for general mesh communication. + +### Channel Security + +Channels support multiple encryption levels: + +| Иконица | Security Level | Опис | +| ------- | ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------- | +| 🔒 | PSK (256-bit AES) | Fully encrypted with a strong pre-shared key. Only nodes with the matching key can read messages. | +| 🔐 | PSK (128-bit AES) | Encrypted with a shorter key. Secure for most uses but 256-bit is preferred for sensitive data. | +| 🔓 | Default / Open | Uses the well-known default key. **Any Meshtastic device** on the same preset can read these messages. | +| ⚠️ | Insecure + Position | Open channel that also broadcasts your GPS position. Use with caution in public meshes. | + +> 🔒 **Security Tip:** 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. + +### Adding a Channel + +1. Navigate to **Settings → Channels**. +2. Tap **Add Channel** or scan a QR code. +3. Configure the channel name and encryption key. +4. Share the channel URL/QR code with others who need access. + +Tapping a channel shows its details and sharing options. + +## Директне поруке + +Direct messages (DMs) are point-to-point encrypted communications between two specific nodes. + +### Sending a Direct Message + +1. Open the **Messages** tab. +2. Select a node from your contacts list or tap a node in the node list. +3. Type your message and tap **Send**. + +### Message States + +| State | Иконица | Meaning | +| --------------------------------- | ------- | ----------------------------------------------------------------------------------------------------------------- | +| Queued | ⏳ | Message waiting to be sent | +| En route | ✓ | Delivered to the radio, awaiting acknowledgment | +| Delivered | ✓✓ | Acknowledgment received from recipient | +| Received | ✓ | Message received from the mesh (incoming) | +| S&F Routing | 🔗 | Store & Forward: message being routed through an S&F node | +| S&F Confirmed | 🔗 | Store & Forward: delivery confirmed via S&F node | +| Грешка | ✗ | Delivery failed after retries | + +### Delivery Errors + +When a message fails to deliver, the error indicator shows what went wrong: + +| Грешка | Meaning | What to Do | +| ---------------- | ---------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Нема руте | No path exists to the destination node | The recipient may be offline or out of mesh range. Try later or move closer. | +| Got NAK | The next-hop node refused to relay | The relay node may be congested. Wait and retry. | +| Isteklo vreme | No acknowledgment within retry window | The recipient may be just out of range. Try increasing hop limit or moving to a better position. | +| Nema interfejsa | No radio interface available to send | Check that your radio is connected and the channel is configured. | +| Max Retransmit | All retry attempts exhausted | The mesh path is unreliable. Try a different channel or wait for conditions to improve. | +| Nema kanala | The destination channel doesn't exist | Verify both nodes share the same channel configuration. | +| Too Large | Message exceeds maximum payload size | Shorten your message (max ~230 characters). | +| Нема одговора | Node received message but didn't respond | The recipient's radio may be busy or in low-power sleep mode. | +| Duty Cycle Limit | Regional airtime limit reached | Your radio has used its allowed transmit time. Wait for the duty cycle window to reset (typically 1 hour in EU regions). | +| Loš zahtev | Malformed or invalid message | This usually indicates a software bug. Try restarting the app. | + +> 💡 **Tip:** 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. + +## Message Features + +### Quick Chat + +Pre-configured messages for rapid communication: + +- Access via the Quick Chat button in the message input area +- Choose from built-in phrases or custom messages +- Customize quick chat messages in **Settings → Quick Chat** +- Useful when typing is impractical (gloves, small screen, urgent) + +![Quick chat option](/assets/screenshots/messages_quick_chat.png) + +The channel list shows each channel with its latest message preview. + +### Message Bubbles + +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. + +### Reactions + +React to messages with emoji: + +- **Long-press** a message to open the actions menu +- Tap **Add Reaction** to choose an emoji +- Reactions appear below the message bubble +- Multiple users can react to the same message +- React to your own messages or others' messages + +![Emoji reaction badges displayed beneath a message](/assets/screenshots/messages_reaction.png) + +> 💡 **Tip:** Reactions are lightweight — they use minimal mesh bandwidth compared to full text messages. + +### Message Actions + +Long-press any message to access: + +- **Copy** — copy message text to clipboard +- **Reply** — quote the message in your response +- **React** — add an emoji reaction +- **Delete** — remove a message you sent (local deletion) + +### Message Priority + +Messages are queued and transmitted based on priority: + +1. Emergency/alert messages (highest) +2. Direct messages +3. Channel broadcasts (lowest) + +### Message Limits + +- **Maximum length:** 237 bytes (approximately 230 characters for ASCII text) +- **Rate limiting:** The mesh enforces airtime fairness; heavy message volume may be throttled +- **Delivery:** Messages are retried automatically if no acknowledgment is received + +## Best Practices + +- Use channels for group coordination +- Use direct messages for private person-to-person communication +- Keep messages short — mesh bandwidth is limited +- Configure encryption for sensitive communications + +## Related Topics + +- [Nodes](nodes) — tap a node to start a direct message +- [Settings — Radio & User](settings-radio-user) — configure channel encryption and presets +- [MQTT](mqtt) — bridge channel messages to the internet +- [Channel configuration](https://meshtastic.org/docs/configuration/radio/channels) — detailed channel settings on meshtastic.org + +--- + diff --git a/docs/sr-rLatn/user/mqtt.md b/docs/sr-rLatn/user/mqtt.md new file mode 100644 index 000000000..27340a59d --- /dev/null +++ b/docs/sr-rLatn/user/mqtt.md @@ -0,0 +1,137 @@ +--- +title: MQTT +nav_order: 11 +last_updated: 2026-05-13 +description: Bridge your mesh to the internet — MQTT broker setup, encryption layers, and map reporting. +aliases: + - mqtt + - internet-bridge + - broker +--- + +# MQTT + +MQTT bridges your Meshtastic mesh network to the internet, enabling long-range communication beyond radio range. + +## Overview + +The MQTT module connects your node to an MQTT broker, allowing: + +- Messages to reach nodes on different physical meshes via the internet +- Integration with home automation and monitoring systems +- Publishing node positions to the public Meshtastic map +- Custom data pipelines for logging and alerting + +## How It Works + +``` +[Your Node] → Radio → [Gateway Node with WiFi] → MQTT Broker → [Remote Gateway] → Radio → [Remote Node] +``` + +A gateway node with internet access (WiFi or Ethernet) publishes mesh messages to an MQTT topic. Remote gateways subscribed to the same topic inject those messages into their local mesh. + +## Configuration + +### Enabling MQTT + +1. Navigate to **Settings → Module Config → MQTT**. +2. Enable the MQTT module. +3. Configure the broker connection: + +![MQTT toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | Опис | Подразумевано | +| --------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------- | +| Адреса сервера | MQTT broker hostname | mqtt.meshtastic.org | +| Корисничко име | Broker authentication | meshdev | +| Лозинка | Broker authentication | large4cats | +| Корен тема | Base topic for messages | msh | +| Encryption | Encrypt MQTT payload | Омогућено | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON packet support has been removed from firmware; this field is ignored | Онемогућено | +| TLS | Secure connection to broker | Онемогућено | +| Map Reporting | Report position to public map | Онемогућено | + +### Default Meshtastic Broker + +The community maintains a public broker at `mqtt.meshtastic.org`. This is intended for general use and testing. + +> 🔒 **Privacy:** Messages on the public broker are readable by anyone subscribed. Always use channel encryption for private communications. + +### Private Broker + +For better privacy and control, you can run your own MQTT broker: + +- Mosquitto (lightweight, open-source) +- HiveMQ +- EMQX + +Configure your node to point to your private broker with appropriate credentials. + +## Map Reporting + +When Map Reporting is enabled, your node publishes its position to the Meshtastic community map: + +- Visible at [meshmap.net](https://meshmap.net) and similar community map services +- Only position and node info are shared +- Disable this if you don't want your location publicly visible + +## Uplink vs Downlink + +| Direction | Опис | +| ------------ | -------------------------------- | +| **Uplink** | Messages from mesh → MQTT broker | +| **Downlink** | Messages from MQTT broker → mesh | + +Configure per-channel which directions are active to control message flow and airtime usage. + +## Message Formats + +MQTT uses protobuf message format: + +| Format | Опис | Use case | +| ------------ | ----------------------------------- | -------------------------- | +| **Protobuf** | Binary Meshtastic protobuf encoding | Node-to-node mesh bridging | + +> ⚠️ **Note:** JSON output support was removed from firmware. The `json_enabled` setting is still visible in the app for legacy compatibility but has no effect on current firmware versions. + +## Encryption & Privacy + +Understanding the layered encryption model: + +1. **Channel encryption** happens on the mesh _before_ MQTT. If your channel has a PSK, the MQTT payload is already encrypted — the broker and any subscribers see only the ciphertext. +2. **MQTT encryption** (the module setting) adds an additional encryption layer for transit to the broker. This protects metadata and routing information. +3. **TLS** encrypts the TCP connection to the broker itself, preventing network-level eavesdropping. + +> 🔒 **Important:** The default public channel has a well-known key. Messages on the default channel sent via MQTT are effectively **unencrypted** — anyone can decode them. Always use a custom PSK for private communications. + +## Best Practices + +- Use channel-level encryption (PSK) on channels that bridge to MQTT +- Don't enable MQTT on nodes without internet access (it will buffer and waste memory) +- Use a private broker for sensitive deployments +- Be mindful of airtime when downlinking messages from busy MQTT topics — every downlinked message consumes radio airtime on your local mesh +- Consider enabling uplink-only if you only need to monitor your mesh remotely without injecting messages back + +## Troubleshooting + +### MQTT Not Connecting + +- **Check WiFi** — the gateway node must have an active internet connection (WiFi or Ethernet). MQTT does not work over the LoRa radio link itself. +- **Verify credentials** — incorrect username or password will silently fail on most brokers. Double-check for trailing spaces. +- **Firewall** — port 1883 (MQTT) or 8883 (MQTT+TLS) must be open. Some networks block non-standard ports. +- **DNS resolution** — if using a custom broker hostname, verify the node can resolve it. Try the broker's IP address directly. + +### Messages Not Bridging + +- **Check uplink/downlink settings** — if only uplink is enabled, messages flow from mesh to MQTT but not back. Enable downlink on the receiving gateway. +- **Channel mismatch** — both gateways must share the same channel with the same PSK. A mismatch means messages are encrypted with different keys and appear as garbage. +- **Topic mismatch** — ensure both gateways use the same root topic. The default `msh` works for the public broker. + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — MQTT module configuration reference +- [Messages & Channels](messages-and-channels) — channel encryption and PSK setup +- [MQTT integration guide](https://meshtastic.org/docs/software/integrations/mqtt) — detailed MQTT documentation on meshtastic.org + +--- + diff --git a/docs/sr-rLatn/user/node-metrics.md b/docs/sr-rLatn/user/node-metrics.md new file mode 100644 index 000000000..f26fc2a24 --- /dev/null +++ b/docs/sr-rLatn/user/node-metrics.md @@ -0,0 +1,130 @@ +--- +title: Node Metrics +nav_order: 5 +last_updated: 2026-05-13 +description: Telemetry dashboards for each mesh node — device health, environment sensors, signal quality, power, traceroute, and position history. +aliases: + - metrics + - telemetry + - device-metrics + - signal +--- + +# Node Metrics + +The node detail screen provides comprehensive telemetry and metrics for each node on your mesh. + +## Метрика уређаја + +Basic operating information reported by each node: + +| Метрика | Опис | +| -------------------- | ----------------------------------- | +| Ниво батерије | Current battery percentage | +| Напон | Battery voltage reading | +| Искоришћеност канала | Percentage of airtime consumed | +| Време емитовања | Transmission time used by this node | +| Време рада | Time since last reboot | + +Device metrics are displayed as individual cards with trend sparklines showing battery level, voltage, channel utilization, airtime, and uptime over time. + +> 💡 **Tip:** Tap any metric card to expand it into a full chart with historical data points. Pinch to zoom the time axis. + +## Метрике сензора + +Environmental sensor data (requires compatible hardware): + +| Метрика | Sensor Examples | +| ------------------------------------ | --------------------- | +| Температура | BME280, BME680, SHT31 | +| Влажност | BME280, BME680, SHT31 | +| Барометарски притисак | BME280, BMP280 | +| Gas Resistance | BME680 | +| IAQ (Air Quality) | BME680 | + +Environment metrics are charted over time for easy trend analysis — temperature, humidity, and pressure each get their own line chart with the measurement unit displayed on the Y axis. + +> 💡 **Tip:** Environment metrics require a sensor connected to the remote node. Not all nodes report environmental data. See [Telemetry & Sensors](telemetry-and-sensors) for a full list of supported sensors. + +## Signal Metrics + +Radio signal quality information: + +| Метрика | Опис | +| --------- | ----------------------------------------------------------------------------- | +| SNR | Signal-to-Noise Ratio (higher is better) | +| RSSI | Received Signal Strength Indicator (closer to 0 is better) | +| Hop Count | Number of mesh hops for last message | + +### Signal Quality Reference + +| SNR Range | Quality | +| --------------------------------- | ----------- | +| > 10 dB | Excellent | +| 0 to 10 dB | Dobro | +| -10 to 0 dB | Prihvatljiv | +| < -10 dB | Poor | + +## Мерни подаци о снази + +Power management telemetry (requires INA sensor or compatible hardware): + +| Метрика | Опис | +| ----------- | ----------------------- | +| Bus Voltage | Supply voltage | +| Струја | Power draw in milliamps | +| Снага | Calculated wattage | + +## Праћење руте + +Traceroute shows the path a message takes through the mesh: + +1. From the node detail screen, tap **Traceroute**. +2. The app sends a traceroute request to the target node. +3. Results show each hop with SNR/RSSI values. + +### Reading Traceroute Results + +``` +You → Node A (SNR: 8.5) → Node B (SNR: 5.2) → Target +``` + +Each hop represents a relay node that forwarded the message. + +## Dnevnik lokacija + +Historical position data for nodes that share their location: + +- GPS coordinates +- Висина +- Speed (if moving) +- Timestamp for each position report + +## Neighbor Info + +Shows which nodes a given node can directly hear, useful for understanding mesh topology. + +## Viewing Metrics + +1. Navigate to **Nodes**. +2. Tap the node you want to inspect. +3. Select the metric category from the detail tabs. + +![Node detail — local device](/assets/screenshots/nodes_detail_local.png) + +The position tab shows location data for nodes that share GPS: + +![Position inline content](/assets/screenshots/nodes_position.png) + +> ⚠️ **Note:** Metrics are only available when they have been reported by the remote node. Metrics update at intervals configured on each node's telemetry settings. + +## Related Topics + +- [Nodes](nodes) — node list, filtering, and sorting +- [Telemetry & Sensors](telemetry-and-sensors) — supported sensors and configuration +- [Signal Meter](signal-meter) — how signal quality is calculated from SNR and RSSI +- [Discovery](discovery) — traceroute details and neighbor info +- [Units & Locale](units-and-locale) — temperature, distance, and speed display formats + +--- + diff --git a/docs/sr-rLatn/user/nodes.md b/docs/sr-rLatn/user/nodes.md new file mode 100644 index 000000000..f08ee1160 --- /dev/null +++ b/docs/sr-rLatn/user/nodes.md @@ -0,0 +1,152 @@ +--- +title: Чворови +nav_order: 4 +last_updated: 2026-05-13 +description: Browse, filter, and sort mesh nodes — view details, signal quality, roles, and quick actions. +aliases: + - node-list + - mesh-nodes + - peers +--- + +# Чворови + +The Nodes screen displays all devices visible on your mesh network. + +## Node List + +The node list shows every node your radio has heard, including: + +- **Node name** — user-configured long name +- **Short name** — 4-character identifier +- **Signal quality** — last heard signal strength +- **Last heard** — time since last communication +- **Distance** — estimated distance (if positions are shared) +- **Battery** — remote node battery level (if telemetry is enabled) + +### Node Status Indicators + +| Badge | Meaning | +| ---------- | ------------------------------------- | +| 🟢 Online | Node heard within the last 15 minutes | +| 🟡 Away | Node heard within the last 2 hours | +| 🔴 Offline | Node not heard for over 2 hours | +| ⭐ Favorite | Node marked as favorite by the user | + +### Node Roles + +Nodes can be configured with different roles that affect their mesh behavior: + +| Улога | Опис | +| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Клијент | Standard end-user device | +| Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | +| Клијент мутиран | Receives but doesn't retransmit | +| Скривени клијент | Like Client Mute, plus hides from node list | +| Рутер | Prioritizes message forwarding; stays awake to relay | +| Рутер са кашњењем | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | +| ~~Router Client~~ | ⚠️ **Deprecated** (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | +| ~~Repeater~~ | ⚠️ **Deprecated** (removed in firmware 2.7.11) — no longer selectable; use Router instead | +| Трекер | Optimized for position reporting at regular intervals | +| Сензор | Optimized for telemetry reporting | +| TAK | Interoperates with TAK systems (sends/receives CoT) | +| ТАК Трекер | TAK position reporting only | +| Lost & Found | Continuous position beacon for recovery | + +### Choosing a Role + +Most users should keep the default **Client** role. Consider a different role when: + +- **Router** — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don't use Router on battery-powered handheld devices. +- **Router Late** — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. +- **Client Base** — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. +- **Client Mute** — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only devices or to reduce congestion in dense areas. +- **Tracker** — An unattended device whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. +- **Sensor** — An unattended device reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. +- **TAK / TAK Tracker** — Only needed if interoperating with ATAK/WinTAK systems. See [TAK Integration](tak) for details. + +> 💡 **Tip:** The mesh works best when most nodes are **Client** or **Router**. Too many Mute nodes reduces mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. + +### Encryption Indicators + +Nodes display encryption status icons next to their name: + +| Иконица | Meaning | +| ----------- | ------------------------------------------------------------------------------------------------------------------- | +| 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | +| 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | +| ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) | + +> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. + +## Quick Actions + +From the node list, you can: + +- **Tap** a node to view its detail page +- **Long-press** for quick actions: + - Send a direct message + - View on map + - Захтевај позицију + - Mark as favorite + - Праћење руте + +## Filtering & Sorting + +### Text Search + +Type in the search field to filter nodes by name or short name. The filter updates in real time as you type. + +### Filter Toggles + +| Filter | Опис | +| -------------------------- | ---------------------------------------------------------------------------------------------- | +| **Only online** | Show only nodes heard within the last 15 minutes | +| **Only direct** | Show only nodes with direct (non-relayed) connections | +| **Include unknown** | Show nodes that haven't sent user info yet | +| **Exclude infrastructure** | Hide infrastructure-role nodes (Router, Repeater, Router Late, Client Base) | +| **Exclude MQTT** | Hide nodes heard only via MQTT internet bridge | +| **Show ignored** | Show nodes you've previously dismissed or muted | + +### Sort Options + +| Sort | Опис | +| ------------------------------------------- | ------------------------------------------------------------------ | +| **Last heard** (default) | Most recently heard nodes first | +| **Alphabetical** | Sorted by node long name | +| **Distance** | Nearest nodes first (requires position sharing) | +| **Hops away** | Fewest relay hops first | +| **Channel** | Grouped by channel index | +| **Via MQTT** | Grouped by MQTT vs. radio-heard | +| **Favorites** | Favorited nodes first | + +## Node Detail + +Tapping a node opens the detail view with comprehensive information. See [Node Metrics](node-metrics) for full details on metrics and telemetry. + +![Node detail view](/assets/screenshots/nodes_node_list.png) + +The detail screen includes device info, position, and action buttons: + +![Node detail section](/assets/screenshots/nodes_detail_section.png) + +Inline status indicators show key metrics at a glance: + +| Indicator | Screenshot | +| -------------------- | -------------------------------------------------------- | +| Signal quality | ![Signal](/assets/screenshots/nodes_signal_info.png) | +| Battery level | ![Battery](/assets/screenshots/nodes_battery_info.png) | +| Hop count | ![Hops](/assets/screenshots/nodes_hops_info.png) | +| Poslednji put viđeno | ![Last heard](/assets/screenshots/nodes_last_heard.png) | +| Udaljenost | ![Distance](/assets/screenshots/nodes_distance_info.png) | + +## Related Topics + +- [Node Metrics](node-metrics) — detailed telemetry dashboards for each node +- [Messages & Channels](messages-and-channels) — send a direct message to a node +- [Map & Waypoints](map-and-waypoints) — view node positions geographically +- [Discovery](discovery) — traceroute and neighbor info for topology exploration +- [Signal Meter](signal-meter) — understand what the signal bars mean + +--- + diff --git a/docs/sr-rLatn/user/onboarding.md b/docs/sr-rLatn/user/onboarding.md new file mode 100644 index 000000000..3b910534e --- /dev/null +++ b/docs/sr-rLatn/user/onboarding.md @@ -0,0 +1,99 @@ +--- +title: Getting Started +nav_order: 1 +last_updated: 2026-05-13 +description: First-launch setup — permissions, onboarding flow, and next steps after connecting your radio. +aliases: + - first-launch + - setup + - intro +--- + +# Getting Started + +Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app. + +## First Launch + +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. + +### Welcome Screen + +The welcome screen introduces Meshtastic and its core capabilities: + +- Off-grid mesh communication +- No cellular or internet required +- End-to-end encrypted messaging + +Tap **Get Started** to proceed through the setup flow. + +![Welcome screen](/assets/screenshots/onboarding_welcome.png) + +## Permissions + +The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. + +### Bluetooth Permission + +Bluetooth is the primary connection method between your phone and Meshtastic radio: + +- **Bluetooth scanning** — discover nearby Meshtastic radios +- **Bluetooth connect** — establish and maintain connections with paired radios + +Grant both permissions when prompted. Without Bluetooth, you'll need to use USB or TCP connections instead. + +### Location Permission + +> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. + +Meshtastic also uses your location for: + +- Showing your position on the mesh map +- Calculating distances to other nodes +- Sharing your GPS coordinates with other mesh members (if enabled) + +Grant **"While using the app"** or **"Always"** depending on your preference: + +- **While using the app** — position updates only when the app is open +- **Always** — enables background position updates for always-on mesh presence + +If denied, Bluetooth scanning will not function and your node will not report a position. + +### Notifications Permission + +Notifications alert you to: + +- Incoming messages from channels and direct messages +- Connection status changes (connected, disconnected, reconnecting) +- Firmware update availability + +> 💡 **Tip:** You can fine-tune notification preferences later in Android system settings. The app creates separate notification channels for messages, connection events, and background service status. + +### Critical Alerts Permission + +On supported devices, the app may request permission for critical alerts: + +- These are high-priority notifications that can break through Do Not Disturb mode +- Useful for emergency mesh alerts or urgent messages +- You can **skip** this step if you don't need breakthrough notifications +- Configure or revoke later in Android notification settings + +## After Setup + +Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. + +> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. + +## What's Next? + +Once connected to a radio, explore: + +- [Connections](connections) — pair your first radio device +- [Messages & Channels](messages-and-channels) — send your first message +- [Nodes](nodes) — see who's on your mesh +- [Map & Waypoints](map-and-waypoints) — view node positions +- [Settings](settings-radio-user) — configure your radio and user profile + +New to Meshtastic? The [getting started guide](https://meshtastic.org/docs/getting-started) on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup. + +--- diff --git a/docs/sr-rLatn/user/settings-module-admin.md b/docs/sr-rLatn/user/settings-module-admin.md new file mode 100644 index 000000000..8bb0227b2 --- /dev/null +++ b/docs/sr-rLatn/user/settings-module-admin.md @@ -0,0 +1,246 @@ +--- +title: Settings — Modules & Admin +nav_order: 8 +last_updated: 2026-05-13 +description: Configure optional feature modules (MQTT, telemetry, canned messages, TAK, and more) and perform device administration. +aliases: + - modules + - module-config + - administration +--- + +# Settings — Modules & Admin + +Configure optional feature modules and perform device administration. Modules extend Meshtastic with specialized capabilities — each can be independently enabled or disabled. + +> 💡 **Tip:** You only need to enable the modules you actually use. Disabling unused modules reduces airtime, saves battery, and simplifies your configuration. + +Module settings use a card-based layout with toggle switches, dropdowns, text fields, and sliders: + +![Toggle switch](/assets/screenshots/settings_switch.png) + +![Dropdown selector](/assets/screenshots/settings_dropdown.png) + +![Text field](/assets/screenshots/settings_text_field.png) + +![Settings card layout](/assets/screenshots/settings_titled_card.png) + +## Конфигурација модула + +### MQTT Module + +Bridges mesh messages to and from an MQTT broker for internet connectivity. This is how you extend your mesh beyond radio range or integrate with home automation systems. + +| Setting | Опис | +| --------------- | ------------------------------------------------------------------------ | +| Омогућено | Toggle MQTT bridge | +| Сервер | MQTT broker address | +| Корисничко име | Authentication username | +| Лозинка | Authentication password | +| Encryption | Encrypt MQTT payloads | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON support removed from firmware; field is ignored | +| TLS | Use secure connection | +| Корен тема | Base MQTT topic path | +| Извештај мапе | Publish position for public map | + +See [MQTT](mqtt) for a detailed usage guide including encryption, privacy, and broker setup. + +### Serial Module + +Enables serial port communication for external device integrations (GPS modules, sensors, or custom hardware). When enabled, the node's serial port can send and receive protobuf or text data, allowing external microcontrollers or computers to interact with the mesh. + +| Setting | Опис | +| ---------- | ------------------------------- | +| Омогућено | Activate serial communication | +| Ехо | Echo received serial data back | +| Мод | Text, Protobuf, or NMEA output | +| RX/TX Pins | GPIO pins for serial connection | +| Baud Rate | Serial communication speed | + +### External Notification Module + +Controls buzzer, LED, or vibration alerts on your radio hardware. Useful for devices that need to physically signal when a message arrives — particularly helpful for unattended or outdoor installations. + +| Setting | Опис | +| -------------------------------- | --------------------------- | +| Омогућено | Activate notifications | +| Alert Message | Notify on incoming messages | +| Alert Message Buzzer | Use buzzer for messages | +| Alert Message Vibra | Use vibration for messages | +| Alert Bell | Notify on bell character | +| Output (GPIO) | Pin for notification output | +| Активан | High or Low active | +| Duration (ms) | Notification length | +| Use I2S as Buzzer | Use I2S audio output | + +### Store & Forward Module + +Buffers messages for nodes that were temporarily offline, then replays them when those nodes reconnect. Essential for meshes where nodes go in and out of range regularly — ensures messages aren't lost during brief disconnections. + +| Setting | Опис | +| ------------------------------------------ | -------------------------- | +| Омогућено | Activate store and forward | +| Heartbeat (s) | Announcement interval | +| Records | Maximum stored messages | +| History Return (max) | Max messages to replay | +| History Return (window) | Time window for replay | + +> 💡 **Tip:** Store and Forward works best on nodes with ample memory (ESP32 with PSRAM). Router nodes are ideal candidates since they're typically always-on. + +### Range Test Module + +Automated range testing tool for evaluating link quality between nodes. When enabled, the node periodically transmits test messages with incrementing counters. A receiver node logs these messages, allowing you to walk or drive away and later analyze at what distance messages stopped arriving. + +| Setting | Опис | +| -------------------------------------- | --------------------------------- | +| Омогућено | Activate range testing | +| Sender Interval (s) | Time between test transmissions | +| Save CSV | Log received test data to SD card | + +### Telemetry Module + +Controls what telemetry data your node shares with the mesh. Telemetry includes device health (battery, uptime) and environmental sensor data (temperature, humidity, pressure). + +| Setting | Опис | +| ---------------------------- | --------------------------------------- | +| Device Metrics Interval | How often to report device metrics | +| Environment Metrics Interval | How often to report environment sensors | +| Air Quality Enabled | Report particulate sensor data | +| Power Metrics Enabled | Report power usage | + +See [Telemetry & Sensors](telemetry-and-sensors) for supported sensors and configuration recommendations. + +### Canned Message Module + +Pre-configured messages accessible from the device's physical buttons (for radios with rotary encoders, keypads, or similar input hardware). Define a list of quick-send messages that can be transmitted without a phone connected — ideal for field use. + +| Setting | Опис | +| ------------------ | ----------------------------------------------------------- | +| ~~Enabled~~ | ⚠️ **Deprecated** — current firmware may ignore this toggle | +| Поруке | Newline-separated list of messages | +| Пошаљи звоно | Play bell sound on send | +| Rotary Encoder | Enable rotary encoder input | +| Up/Down/Press Pins | GPIO pin assignments for input | + +### Audio Module + +Codec2 audio support for low-bandwidth voice communication over the mesh. This is an **experimental** feature that encodes voice into very small data packets using the Codec2 codec. + +| Setting | Опис | +| --------------- | -------------------------------- | +| Омогућено | Activate audio module | +| Codec2 Rate | Audio quality/bandwidth tradeoff | +| I2S Word Select | GPIO pin for I2S WS | +| I2S Data In | GPIO pin for I2S DIN | +| I2S Data Out | GPIO pin for I2S DOUT | + +> ⚠️ **Note:** Audio requires specific hardware (I2S microphone and speaker). Voice quality is very low-bandwidth — think "understandable radio voice," not phone-call quality. + +### Remote Hardware Module + +GPIO control over the mesh network. Allows a remote node to read or write GPIO pins on another node — useful for activating relays, reading switches, or controlling external hardware from a distance. + +| Setting | Опис | +| -------------------- | --------------------------------------------------------------- | +| Омогућено | Activate remote GPIO access | +| Allow Undefined Pins | Allow access to any GPIO pin (security risk) | + +> ⚠️ **Warning:** Enabling "Allow Undefined Pins" gives remote nodes access to all GPIO pins, which could interfere with the radio's own hardware. Only enable on dedicated GPIO nodes. + +### Neighbor Info Module + +Broadcasts information about directly heard neighbors, enabling mesh topology mapping. Each enabled node periodically shares a list of the other nodes it can hear and their signal quality. + +| Setting | Опис | +| -------------------------------------- | ------------------------------------ | +| Омогућено | Activate neighbor broadcasting | +| Update Interval (s) | How often to broadcast neighbor list | + +See [Discovery](discovery) for how to use neighbor data for mesh topology exploration. + +### Ambient Lighting Module + +Controls onboard NeoPixel or other addressable RGB LEDs on supported hardware. Can be used for visual status indicators, notification lights, or decorative effects. + +| Setting | Опис | +| ------------------ | ---------------------------------------------------------- | +| Омогућено | Activate LED control | +| LED статус | On, Off, or set specific color | +| Red / Green / Blue | Individual color channel values (0–255) | + +### Detection Sensor Module + +Turns your node into a motion or door sensor alert system. When a GPIO pin detects a state change (motion detected, door opened), the node broadcasts an alert message over the mesh. + +| Setting | Опис | +| ---------------------------------------- | ----------------------------------------------------------------------- | +| Омогућено | Activate detection sensor | +| Monitor Pin | GPIO pin connected to sensor | +| Detection Triggered High | Trigger when pin goes high (vs. low) | +| Minimum Broadcast (s) | Minimum time between alert broadcasts | +| State Broadcast (s) | Periodic state broadcast interval | +| Пошаљи звоно | Include bell character in alerts | +| Friendly Name | Custom name for this sensor | + +### Paxcounter Module + +People counter using WiFi and BLE probe requests. Counts nearby devices by passively listening for probe requests that phones and laptops emit when scanning for networks. Available only on ESP32 devices. + +| Setting | Опис | +| -------------------------------------- | -------------------------- | +| Омогућено | Activate people counting | +| Update Interval (s) | How often to report counts | + +> 💡 **Tip:** Paxcounter is useful for estimating foot traffic at trailheads, event venues, or other locations. Counts are approximate — one person may carry multiple devices. + +### TAK Module + +Team Awareness Kit integration for interoperability with ATAK and WinTAK. See [TAK Integration](tak) for detailed setup and usage. + +## Administracija + +### Udaljena administracija + +Remotely configure nodes that share your admin key: + +1. Select the target node in the node list. +2. Navigate to **Settings** for that node. +3. Modify configuration. +4. Tap **Save** — changes are sent over the mesh. + +> ⚠️ **Requires:** Admin key configured on both your node and the target node. + +### Clean Node Database + +Removes stale nodes from your local database that haven't been heard in a configurable time window. + +### Ресетовање на фабричка подешавања + +Resets all settings to factory defaults. **This cannot be undone.** + +### Поново покрени + +Remotely reboot a connected or administered node. + +### Panel za otklanjanje grešaka + +View detailed diagnostic information: + +- Protocol buffers debug output +- Mesh packet log +- Connection state details + +### Troubleshooting Remote Admin + +- **"No response from target node"** — the target may be out of range, offline, or have a mismatched admin key. Verify the admin key matches on both nodes. +- **Changes not applying** — some settings require a reboot to take effect. Try the Reboot action after saving. +- **Can't see remote settings** — ensure your node has the admin key for the target node and that Admin Channel is enabled in Security Config. + +## Related Topics + +- [Settings — Radio & User](settings-radio-user) — core radio and user profile settings +- [Module configuration reference](https://meshtastic.org/docs/configuration/module) — detailed module docs on meshtastic.org +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/sr-rLatn/user/settings-radio-user.md b/docs/sr-rLatn/user/settings-radio-user.md new file mode 100644 index 000000000..54b8d1403 --- /dev/null +++ b/docs/sr-rLatn/user/settings-radio-user.md @@ -0,0 +1,173 @@ +--- +title: Settings — Radio & User +nav_order: 7 +last_updated: 2026-05-13 +description: Configure your radio hardware, LoRa presets, user profile, position sharing, power management, and security. +aliases: + - подешавања + - radio-config + - user-config + - lora +--- + +# Settings — Radio & User + +Configure your radio hardware and user identity parameters. + +## User Settings + +### User Profile + +| Setting | Опис | +| -------------------- | ------------------------------------------------------------------------------------- | +| Дуго име | Your display name (up to 39 characters) | +| Кратко име | 4-character abbreviated name | +| Лиценцирани оператор | Enable if you hold an amateur radio license (enables higher power) | + +### Applying Changes + +After modifying settings, tap **Save** to write the configuration to your radio. The device may reboot to apply changes. + +## Конфигурација радио уређаја + +### Подешавања уређаја + +| Setting | Опис | Подразумевано | +| ------------------------------------------ | ----------------------------------------------------------------------- | ------------- | +| Улога | Node behavior (Client, Router, etc.) | Клијент | +| Режим реемитовања | How the node retransmits messages | Сви | +| Node Info Broadcast (s) | Interval for broadcasting node info | 10800 | +| Double-tap Button | Action for double-tap button press | Онемогућено | + +### LoRA подешавања + +| Setting | Опис | Подразумевано | +| ----------------- | ----------------------------------------------------------------------- | ----------------------------------------- | +| Регион | Regulatory region for frequency bands | Unset (must configure) | +| Modem Preset | Speed/range tradeoff | LongFast | +| Hop Limit | Maximum retransmit hops | 3 | +| TX Power | Transmission power (dBm); 0 = max allowed for region | 0 (region max) | +| Frequency Offset | Fine-tune frequency (MHz) | 0 | +| Channel Bandwidth | Bandwidth setting | Default for preset | + +> ⚠️ **Important:** You **must** set your region before transmitting. Operating without the correct region may violate local radio regulations. See the [region configuration guide](https://meshtastic.org/docs/getting-started/initial-config) on meshtastic.org for details. + +### Modem Presets + +| Preset | Range | Брзина | SNR Limit | Best For | +| ------------------ | ----------------------- | ------------------------- | ------------------------ | -------------------------------------------------------------------------------------------------------- | +| Short Turbo | ~1 km | 21.9 kbps | −5 dB | Dense urban with line-of-sight; data-heavy applications | +| Short Fast | ~3 km | 10.9 kbps | −7.5 dB | Urban neighborhoods; buildings within a few blocks | +| Short Slow | ~5 km | 5.5 kbps | −10 dB | Suburban short-range; moderate building density | +| Medium Fast | ~5 km | 5.5 kbps | −10 dB | Suburban areas; moderate building density | +| Medium Slow | ~8 km | 1.1 kbps | −12.5 dB | Suburban/rural; moderate range with slower speed | +| Long Turbo | ~10 km | 4.4 kbps | −10 dB | Similar range to Long Fast but with 500 kHz bandwidth; faster throughput | +| Long Fast | ~10 km | 1.1 kbps | −12.5 dB | **General use (default)** — balanced range and speed | +| Long Moderate | ~20 km | 0.34 kbps | −15 dB | Rural with some terrain; occasional use | +| Lite Fast | ~5 km | 5.5 kbps | −10 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Medium Fast | +| Lite Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Long Fast | +| Narrow Fast | ~5 km | 2.7 kbps | −10 dB | EU 868 MHz band (62.5 kHz BW); avoids interference with other devices | +| Narrow Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 868 MHz band (62.5 kHz BW); comparable to Long Fast | +| ~~Long Slow~~ | ~30 km | 0.18 kbps | −17.5 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | +| ~~Very Long Slow~~ | ~40+ km | 0.09 kbps | −20 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | + +#### Choosing a Modem Preset + +The modem preset controls the fundamental tradeoff between **range** and **data rate**: + +- **Slower presets** use more spreading, making signals decodable at weaker signal levels (lower SNR limit). This means longer range but fewer bytes per second. +- **Faster presets** pack more data per transmission but require a stronger signal to decode. + +**Practical guidance:** + +- **Urban mesh (many nodes, short distances):** Use **Long Fast** (default) or **Short Fast**. Higher speed means less airtime congestion when many nodes share the channel. +- **Rural/sparse mesh (few nodes, long distances):** Use **Long Moderate**. Range matters more than speed when nodes are far apart. +- **EU 866/868 MHz regulatory compliance:** Use **Lite Fast**, **Lite Slow**, **Narrow Fast**, or **Narrow Slow** — these are optimized for the EU SRD/868 MHz bands with narrower bandwidths. +- **Fixed infrastructure links:** Use **Short Turbo** or **Long Turbo** for dedicated point-to-point links with good antennas and line-of-sight. +- **Mixed environments:** Stick with **Long Fast** — it's the community default and ensures compatibility with others in your area. + +> ⚠️ **Important:** All nodes on the same channel **must** use the same modem preset. Nodes with mismatched presets cannot communicate even if they share the same frequency and encryption key. + +> 💡 **Tip:** The range estimates above assume flat terrain and modest antennas. Elevation advantage (hilltop, rooftop) dramatically increases effective range. A well-placed Router with Long Fast can often outperform a ground-level node with Long Slow. + +### Подешавања приказа + +| Setting | Опис | +| ------------------- | ------------------------------------------------------------------------------------ | +| Screen Timeout | Time before display sleeps | +| Јединице приказа | Metric or Imperial | +| Тип OLED-а | Auto, SSD1306, SH1106, SH1107 | +| Compass Orientation | Rotation offset for compass display (0°, 90°, 180°, 270°) | +| ~~Compass North~~ | ⚠️ **Deprecated** — replaced by Compass Orientation; still visible in older firmware | + +### Подешавања позиције + +| Setting | Опис | +| ----------------------------------------- | ---------------------------------- | +| GPS Enabled | Enable/disable GPS | +| GPS Update Interval | How often to acquire GPS fix | +| Position Broadcast (s) | How often to share position | +| Паметно позиционирање | Enable movement-based broadcasting | +| Фиксна локација | Use a manually set position | + +### Подешавања напајња + +| Setting | Опис | +| --------------------------------------- | --------------------------------------- | +| Уштеда енергије | Enable low-power sleep mode | +| Shutdown After (s) | Auto-shutdown idle timer | +| ADC Multiplier | Battery voltage calibration factor | +| Wait Bluetooth (s) | Time to wait for BLE connection at boot | +| Mesh SDS Timeout (s) | Super-deep-sleep timeout | + +### Конфигурација мреже + +| Setting | Опис | +| ------------- | ---------------------------------------------------- | +| WiFi Enabled | Enable WiFi radio (ESP32 devices) | +| WiFi SSID | Network name to connect to | +| WiFi PSK | Network password | +| NTP Server | Time synchronization server | +| Syslog Server | Remote logging server | + +![IP address field](/assets/screenshots/settings_ipv4_field.png) + +### Блутут подешавања + +| Setting | Опис | +| ----------------- | ------------------------------------------------------------------------- | +| Bluetooth Enabled | Enable/disable BLE radio | +| Мод упаривања | Fixed PIN, Random PIN, or No PIN | +| Fixed PIN | PIN code for pairing (default: 123456) | + +### Сигурносна подешавања + +| Setting | Опис | +| --------------------- | -------------------------------------------------------------------------- | +| Javni ključ | Your node's public key (read-only) | +| Admin Key | Key for remote administration | +| Privatni ključ | Your node's private key (handle securely) | +| Admin Channel Enabled | Allow admin commands via channel | +| Debug Log | Output live debug logging over serial/bluetooth | +| Serial Enabled | Enable serial console access (moved from Device Config) | +| Managed Mode | Restrict non-admin channel changes | + +![Password field](/assets/screenshots/settings_password_field.png) + +Settings use standard preference controls — dropdowns, toggles, and sliders: + +| Control | Screenshot | +| -------- | ------------------------------------------------------ | +| Dropdown | ![Dropdown](/assets/screenshots/settings_dropdown.png) | +| Toggle | ![Toggle](/assets/screenshots/settings_switch.png) | +| Slider | ![Slider](/assets/screenshots/settings_slider.png) | + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — optional feature modules and device administration +- [Signal Meter](signal-meter) — how modem presets affect signal quality thresholds +- [LoRa configuration](https://meshtastic.org/docs/configuration/radio/lora) — detailed LoRa settings reference on meshtastic.org +- [Initial configuration](https://meshtastic.org/docs/getting-started/initial-config) — region setup guide on meshtastic.org + +--- + diff --git a/docs/sr-rLatn/user/signal-meter.md b/docs/sr-rLatn/user/signal-meter.md new file mode 100644 index 000000000..472931a08 --- /dev/null +++ b/docs/sr-rLatn/user/signal-meter.md @@ -0,0 +1,81 @@ +--- +title: How the Meshtastic Signal Meter Works +nav_order: 15 +last_updated: 2026-05-13 +description: How the signal meter calculates quality from RSSI and SNR — LoRa spread spectrum, presets, and what the bars really mean. +aliases: + - signal + - signal-meter + - snr + - rssi +--- + +# How the Meshtastic Signal Meter Works + +The Meshtastic signal meter — the familiar bars or status color in the app — is calculated very differently than the "bars" on a traditional cell phone or Wi-Fi router. + +Most consumer devices simply measure how "loud" a signal is. However, because Meshtastic uses **LoRa (Long Range)** technology, its signal meter measures how **clear** the signal is, relative to the specific settings your mesh is using. + +--- + +## 1. The Two Metrics: "Loudness" vs. "Clarity" + +Every time the LoRa radio chip receives a message, it reports two measurements: + +- **RSSI (Received Signal Strength Indicator):** The **loudness** of the raw power hitting your antenna. +- **SNR (Signal-to-Noise Ratio):** The **clarity** of the signal compared to the background static. + +> **Tip — The Analogy:** Imagine you are trying to hear a friend talking to you. +> +> - **RSSI** is how loud their voice is. +> - **The Noise Floor** is the background noise in the room (air conditioning, other people talking, traffic). +> - **SNR** is how easily you can distinguish your friend's voice from the background noise. + +If your friend shouts at you at a deafening rock concert, the signal is incredibly loud (High RSSI), but you still can't understand them because the background noise is louder (Bad SNR). Conversely, if your friend whispers to you in a dead-silent library, the signal is very weak (Low RSSI), but you can understand them perfectly (Great SNR). + +--- + +## 2. The Magic of LoRa: Hearing "Below the Noise Floor" + +For standard radios (like FM or Wi-Fi), if the background noise is louder than the signal (a negative SNR), the receiver just hears static. + +LoRa is special. It uses **"Spread Spectrum"** modulation, which allows the radio to mathematically pull a signal out of the air even when it is buried deep _underneath_ the background noise. This is why you will frequently see **negative SNR numbers** in Meshtastic (e.g., -10 dB, which means the signal is 10 decibels weaker than the background static). + +Depending on which Meshtastic preset you are using (e.g., `LongFast` vs. `ShortFast`), the radio has a specific **SNR Limit** — the absolute maximum amount of noise it can tolerate before the message is completely lost to the static. + +--- + +## 3. How the Signal Meter Calculates Quality + +The Meshtastic apps take both RSSI and SNR and run them through a specific formula to assign your signal a quality rating (None, Bad, Fair, or Good). It specifically scales these values based on the physical limits of the radio preset you are using. + +Here is exactly how the app decides how many bars (or what color) to show you: + +| Ниво | Bars | Criteria | Meaning | +| ----------- | ---- | ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | +| Dobro | 3 | RSSI better than `-115 dBm` **AND** SNR better than `-7 dB` | Signal is both loud and clear — healthy connection. | +| Prihvatljiv | 2 | RSSI better than `-126 dBm` with good SNR, **OR** SNR better than `-15 dB` with good RSSI | Signal getting quieter or noisier, but still decodable. | +| Loš | 1 | Falls between Fair and None thresholds | At the edge of range or experiencing interference. | +| Bez | 0 | RSSI worse than `-126 dBm` **AND** SNR worse than `-15 dB` | Transmission completely buried in noise. | + +--- + +## 4. What This Means for You + +Because Meshtastic's meter acts as a **"Clarity Meter"**, it behaves differently than what most people expect: + +> **Tip — Don't panic over low RSSI:** You might see a seemingly terrible RSSI value like `-118 dBm`. On a cell phone, you would have zero bars. But if you have an SNR of `+2 dB`, Meshtastic will still show a strong signal! _The library is quiet, so the whisper is heard perfectly._ + +> **Warning — Watch out for local noise:** If you hook up a massive antenna and see a great RSSI (e.g., `-90 dBm`) but your signal meter is only showing **1 Bar (Bad)**, you have a problem. It means you have local interference — perhaps a cheap power supply, a noisy computer, or a nearby radio tower — creating so much static that it is drowning out your mesh. + +## Where Signal Information Appears + +In the app, signal data is shown in several places: + +- **Node list** — signal bars icon next to each node +- **Node detail** — SNR, RSSI, and signal quality in the device metrics section +- **Traceroute** — per-hop signal quality for each relay node +- **Signal metrics** — historical SNR and RSSI data in the metrics charts + +![Node entry showing SNR, RSSI values and colored signal bars](/assets/screenshots/nodes_signal_info.png) + diff --git a/docs/sr-rLatn/user/tak.md b/docs/sr-rLatn/user/tak.md new file mode 100644 index 000000000..5544856ef --- /dev/null +++ b/docs/sr-rLatn/user/tak.md @@ -0,0 +1,126 @@ +--- +title: TAK Integration +nav_order: 10 +last_updated: 2026-05-13 +description: Interoperate with ATAK and WinTAK — CoT position sharing, TAK roles, and plugin setup. +aliases: + - tak + - atak + - team-awareness-kit +--- + +# TAK Integration + +Meshtastic integrates with the Team Awareness Kit (TAK) ecosystem, enabling interoperability between Meshtastic mesh devices and TAK applications like ATAK and WinTAK. + +## Overview + +The TAK module allows Meshtastic nodes to: + +- Share position data in TAK-compatible CoT (Cursor on Target) format +- Appear as team members on TAK map displays +- Receive TAK PLI (Position Location Information) messages + +## Setup + +### Prerequisites + +- ATAK (Android Team Awareness Kit) or WinTAK installed +- Meshtastic ATAK Plugin installed +- TAK module enabled on your Meshtastic radio + +### Configuration + +1. Navigate to **Settings → Module Config → TAK**. +2. Enable the TAK module. +3. Configure the TAK team/group settings: + +![Module toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | Опис | +| --------- | -------------------------- | +| Омогућено | Activate TAK interop | +| Мод | TAK-compatible output mode | + +### ATAK Plugin Setup + +1. Install the Meshtastic ATAK Plugin from the plugin repository. +2. Open ATAK and enable the Meshtastic plugin. +3. The plugin bridges messages between ATAK and your mesh network. + +## TAK Roles + +Nodes configured with TAK-related roles behave differently from standard clients: + +| Улога | Опис | +| --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **TAK** | Full TAK interoperability — sends and receives CoT data, chat messages, and PLI updates. Functions as a standard client plus TAK bridge. | +| **TAK Tracker** | Position-only TAK output — automatically broadcasts PLI at regular intervals without user interaction. Optimized for unattended position beacons (vehicles, equipment, waypoints). Does not relay chat messages. | + +> 💡 **Tip:** Use **TAK Tracker** for devices that only need to report position (e.g., a radio mounted in a vehicle). Use **TAK** for devices where users actively participate in TAK operations. + +### CoT (Cursor on Target) Format + +TAK messages use the Cursor on Target XML format — a military standard for sharing situational awareness data. Meshtastic converts its internal protobuf messages to CoT format when bridging to TAK systems, so no manual format conversion is needed. + +## TAK Identity + +When using TAK roles, your node broadcasts identity information that appears on TAK maps: + +| Setting | Опис | +| -------- | ---------------------------------------------------------------------------------------------------------------- | +| Team | Your team color on the TAK map (e.g., Blue, Red, Cyan, Green) | +| Улога | Your operational role (Team Member, Team Lead, HQ, Medic, RTO, etc.) | +| Callsign | Your TAK callsign (defaults to your Meshtastic long name) | + +These settings appear in **Settings → Module Config → TAK** when the TAK module is enabled. + +> 💡 **Tip:** Team/role colors are the standard TAK affiliation colors. Coordinate with your TAK team to use consistent team assignments. + +## Wire Format (V1 / V2) + +Meshtastic supports two TAK wire formats: + +| Format | Compatibility | Features | +| ------------------------------- | --------------------------------------------------------------- | --------------------------------------------------------- | +| V1 (Legacy) | ATAK Plugin v1.x, older firmware | Basic CoT position sharing only | +| V2 (Current) | ATAK Plugin v2.x, firmware 2.3+ | Full CoT support including chat, routes, zstd compression | + +The app automatically selects V2 when both sides support it. No manual configuration needed — the TAK module negotiates format based on firmware capabilities. + +## Usage with ATAK + +Once configured: + +- Meshtastic nodes appear as markers on the ATAK map with callsign labels +- Chat messages can bridge between mesh and TAK networks +- Position updates flow bidirectionally between Meshtastic and TAK +- TAK Tracker nodes broadcast PLI automatically — their positions appear on ATAK maps without any ATAK-side configuration + +> ⚠️ **Note:** TAK integration requires specific node roles and module configuration. Standard client nodes don't automatically participate in TAK operations. + +## Troubleshooting + +| Problem | Cause | Solution | +| -------------------------------- | ------------------------------------- | ----------------------------------------------------------------------- | +| Node doesn't appear on ATAK map | TAK module disabled or wrong role | Verify TAK module is enabled and node role is TAK or TAK Tracker | +| Position updates are stale | GPS fix lost or interval too long | Check GPS status; reduce position broadcast interval in Position Config | +| ATAK plugin shows "disconnected" | BLE connection lost or plugin crashed | Reconnect Bluetooth in Meshtastic app, then restart ATAK plugin | +| Chat messages not bridging | V1 format doesn't support chat | Ensure both nodes run firmware 2.3+ for V2 wire format | +| CoT data not flowing | Channel mismatch | All TAK nodes must be on the same channel with matching encryption | + +## Security Considerations + +- TAK data shares your position and callsign information +- Ensure your channel encryption is configured when using TAK in sensitive environments +- The TAK module respects the same channel encryption as other Meshtastic messages + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — TAK module configuration +- [Nodes](nodes) — TAK and TAK Tracker roles in the node list +- [Map & Waypoints](map-and-waypoints) — node positions on the map +- [ATAK plugin guide](https://meshtastic.org/docs/software/integrations/atak-plugin) — detailed ATAK setup on meshtastic.org + +--- + diff --git a/docs/sr-rLatn/user/telemetry-and-sensors.md b/docs/sr-rLatn/user/telemetry-and-sensors.md new file mode 100644 index 000000000..47a98a875 --- /dev/null +++ b/docs/sr-rLatn/user/telemetry-and-sensors.md @@ -0,0 +1,118 @@ +--- +title: Telemetry & Sensors +nav_order: 9 +last_updated: 2026-05-13 +description: Sensor data on the mesh — supported environment, air quality, and power sensors, plus configuration and viewing guides. +aliases: + - sensors + - окружење + - weather + - power-metrics +--- + +# Telemetry & Sensors + +Meshtastic nodes can collect and share sensor data across the mesh network. + +## Overview + +Telemetry allows nodes equipped with sensors to broadcast environmental, power, and device health information. This data is visible on the node detail screen and can be logged over time. + +## Device Telemetry + +All Meshtastic nodes report basic device telemetry: + +| Метрика | Опис | Typical Range | +| -------------------- | ------------------------------ | ------------------------------------------------------------------ | +| Ниво батерије | Charge percentage | 0–100% | +| Напон | Battery voltage | 3.0–4.2V (LiPo) | +| Искоришћеност канала | % of airtime used locally | 0–100% | +| Air Utilization TX | % of airtime used by this node | 0–100% | +| Време рада | Seconds since last boot | Varies | + +## Environment Sensors + +Supported environmental sensors: + +### Temperature & Humidity + +| Сензор | Температура | Влажност | Pressure | Белешке | +| ------- | ----------- | -------- | -------- | ----------------------- | +| BME280 | ✓ | ✓ | ✓ | Recommended all-in-one | +| BME680 | ✓ | ✓ | ✓ | Adds gas resistance/IAQ | +| SHT31 | ✓ | ✓ | — | High accuracy | +| MCP9808 | ✓ | — | — | Precision temperature | +| LPS22 | — | — | ✓ | Pressure only | + +### Air Quality + +| Сензор | Метрика | Белешке | +| -------- | -------------------------------------------------- | -------------------------- | +| BME680 | Gas Resistance / IAQ | Volatile organic compounds | +| PMSA003I | PM1.0, PM2.5, PM10 | Particulate matter | +| SEN55 | PM, NOx, VOC, Temp, Humidity | Multi-sensor | + +### Light & UV + +| Сензор | Метрика | +| -------- | -------------------------------------- | +| OPT3001 | Ambient light (lux) | +| VEML7700 | Ambient light (lux) | +| LTR390 | UV index | + +## Мерни подаци о снази + +Nodes with INA-series power sensors can report: + +| Метрика | Опис | +| ----------- | ----------------------------------------- | +| Bus Voltage | Supply rail voltage | +| Струја | Power consumption (mA) | +| Снага | Calculated power (mW) | + +Useful for monitoring solar charging or battery health on remote nodes. + +## Configuring Telemetry + +1. Navigate to **Settings → Module Config → Telemetry**. +2. Set reporting intervals: + - **Device Metrics Interval** — how often to broadcast device metrics + - **Environment Metrics Interval** — how often to broadcast sensor data +3. Enable specific sensor types as needed. + +### Recommended Intervals + +| Use Case | Device (s) | Environment (s) | +| ------------------------------------------ | ----------------------------- | ---------------------------------- | +| Urban mesh (many nodes) | 3600 | 3600 | +| Rural mesh (few nodes) | 900 | 900 | +| Weather station | 900 | 300 | +| Battery conservation | 7200 | 7200 | + +> ⚠️ **Note:** Shorter intervals increase airtime usage and battery drain across the mesh. + +## Viewing Telemetry + +1. Navigate to **Nodes** and select a node. +2. Telemetry sections show on the detail screen: + - Device Metrics (always available) + - Environment Metrics (if sensors present) + - Power Metrics (if INA sensor present) +3. Historical graphs show trends over time. + +![Telemetry actions](/assets/screenshots/node-metrics_telemetric_actions.png) + +## Troubleshooting + +- **No environment data showing?** The remote node needs a physical sensor connected (e.g., BME280 on I2C). Device telemetry (battery, uptime) is always available, but environment metrics require hardware. +- **Stale readings?** Check the reporting interval — very long intervals (7200s+) mean data updates infrequently. Also verify the remote node is still online. +- **Sensor conflict on I2C bus?** Some sensors share I2C addresses. If you have multiple sensors on the same bus, check for address collisions in the radio's serial debug output. + +## Related Topics + +- [Node Metrics](node-metrics) — view telemetry data on the node detail screen +- [Settings — Modules & Admin](settings-module-admin) — telemetry module configuration +- [Units & Locale](units-and-locale) — temperature and pressure display units + +--- + diff --git a/docs/sr-rLatn/user/translate.md b/docs/sr-rLatn/user/translate.md new file mode 100644 index 000000000..7914d6092 --- /dev/null +++ b/docs/sr-rLatn/user/translate.md @@ -0,0 +1,97 @@ +--- +title: Translate the App +parent: User Guide +nav_order: 17 +last_updated: 2026-05-13 +aliases: + - translate + - crowdin + - localization +--- + +# Translate the App + +Contributing translations helps make Meshtastic accessible to a wider audience. The app uses [Crowdin](https://crowdin.com/) to manage community translations for both the user interface and in-app documentation. + +--- + +## What Gets Translated + +| Resource | Source Location | Белешке | +| ----------------- | ------------------------------------- | ---------------------------------------------------------------------- | +| UI strings | `composeResources/values/strings.xml` | Buttons, labels, messages, and all user-visible text | +| User Guide pages | `docs/user/*.md` | In-app documentation shown in Help & Documentation | +| Fastlane metadata | `fastlane/metadata/android/en-US/` | App Store listing title, description, and changelogs | + +> **Note — Developer Guide pages are English-only.** Code-focused documentation targeting contributors is not translated. + +--- + +## How to Contribute + +1. **Visit the Crowdin project.** Open the [Meshtastic Android Crowdin project](https://crowdin.com/project/meshtastic-android) and sign in or create a free account. +2. **Choose your language.** Select an existing language or request a new one by opening a [GitHub issue](https://github.com/meshtastic/Meshtastic-Android/issues/new). +3. **Translate strings.** Crowdin shows the English source on the left and your translation on the right. Translate each string and save. +4. **Review context.** Many strings include screenshots or context comments — check these to understand where the text appears in the app. +5. **Submit.** Approved translations are automatically merged into the next release. + +> **Tip — Keep translations short.** UI strings often appear in buttons, chips, or narrow columns. If a translation is significantly longer than the English original, consider abbreviating where the meaning stays clear. + +--- + +## Adding a New Language + +If your language is not yet listed on Crowdin: + +1. Open an issue on [GitHub](https://github.com/meshtastic/Meshtastic-Android/issues/new) requesting the new locale. +2. A maintainer will add the language to Crowdin and configure `crowdin.yml`. +3. Once added, you can begin translating immediately. + +--- + +## How Translations Are Organized + +The Android app uses **Compose Multiplatform resources** for all user-visible strings: + +``` +core/resources/src/commonMain/composeResources/ +├── values/ ← English (default) +│ └── strings.xml +├── values-de/ ← German +│ └── strings.xml +├── values-fr/ ← French +│ └── strings.xml +└── ... +``` + +In-app documentation follows a similar pattern under `docs/`: + +``` +docs/ +├── user/ ← English source (default) +│ ├── onboarding.md +│ └── ... +├── fr/user/ ← French translations +│ ├── onboarding.md +│ └── ... +└── ... +``` + +The app automatically selects the correct locale based on your device's **Language & Region** settings. + +--- + +## Translation Guidelines + +- **Do not translate** technical terms like "LoRa", "MQTT", "BLE", "TAK", "SNR", or "RSSI" — these are universal. +- **Keep placeholders intact.** Strings like `%1$s` or `%d` are filled in at runtime. Do not remove or reorder them unless the grammar of your language requires it. +- **Match tone.** The app uses a friendly, direct voice. Avoid overly formal language. +- **Test if possible.** Switch your device language and open the app to see how translations look in context. + +--- + +## Questions? + +If you have questions about a specific string's context or need help getting started, open a discussion on the [Meshtastic GitHub Discussions](https://github.com/meshtastic/Meshtastic-Android/discussions) page. + +Thank you for helping expand the reach of Meshtastic! diff --git a/docs/sr-rLatn/user/units-and-locale.md b/docs/sr-rLatn/user/units-and-locale.md new file mode 100644 index 000000000..add5204e3 --- /dev/null +++ b/docs/sr-rLatn/user/units-and-locale.md @@ -0,0 +1,118 @@ +--- +title: Units, Measurement & Locale +parent: User Guide +nav_order: 16 +last_updated: 2026-05-12 +--- + +# Units, Measurement & Locale + +The Meshtastic app automatically displays temperatures, distances, speeds, and times in the units your device is configured to use — no settings to change inside the app. + +--- + +## How It Works + +Meshtastic radios always transmit data in **metric units** (meters, °C, km/h, hPa, etc.). When the app receives this data, it uses the `MetricFormatter` utility to convert and display values in whatever unit system your device's locale specifies. + +On Android, your measurement preferences are determined by your system **Language & Region** settings. On Desktop (JVM), the app uses the JVM's default `Locale`. + +> **Tip — You never need to toggle units inside the app.** Change your system measurement preferences and every screen in Meshtastic updates automatically — node details, telemetry charts, weather, altitude, and more. + +--- + +## Температура + +Temperature values from environment sensors are transmitted as **°C** and displayed based on your device's temperature unit preference. + +![Environment metrics with temperature](/assets/screenshots/nodes_environment_metrics.png) + +| Your Setting | You See | +| ------------ | ------- | +| Celsius | 22°C | +| Fahrenheit | 72°F | + +This affects all temperature displays throughout the app: node environment telemetry, soil temperature, dew point, and telemetry chart axes. + +## Distance & Altitude + +Distances between nodes and GPS altitudes are transmitted as **meters** and automatically scaled and converted. + +![Distance info display](/assets/screenshots/nodes_distance_info.png) + +| Your Setting | Small Distance | Large Distance | Висина | +| -------------------------------- | -------------- | ---------------------- | -------- | +| Метрика | 350 m | 2.5 km | 1,200 m | +| Imperial (US) | 1,148 ft | 1.6 mi | 3,937 ft | + +The app uses natural scaling — short distances stay in meters or feet, while longer distances switch to kilometres or miles automatically. + +### Where these appear + +- **Node list** — distance and bearing to each node +- **Node detail** — altitude, distance from your position +- **Map** — waypoint distances, traceroute hop distances +- **Compass** — distance to selected node + +## Брзина + +GPS ground speed is displayed in your locale's preferred speed unit. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Метрика | 12 km/h | +| Imperial (US) | 7 mph | + +## Wind + +Wind speed and gust data from environment sensors are transmitted as **m/s** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Метрика | 5 m/s | +| Imperial (US) | 11 mph | + +Wind readings appear in the **Node Detail** environment section and the **Environment Telemetry** charts. + +## Rainfall + +Rainfall measurements (1-hour and 24-hour totals) are transmitted as **mm** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ---------------------- | +| Метрика | 12 mm | +| Imperial (US) | 0.5 in | + +## Units That Never Change + +Some units are international standards and are displayed the same way regardless of your locale: + +| Measurement | Unit | Why | +| -------------------------------- | ------------------------------ | ------------------------------------- | +| Barometric pressure | hPa | International meteorological standard | +| Heading / bearing | ° (degrees) | Universal navigation convention | +| Radiation | μR/hr | Standard dosimetry unit | +| GPS coordinates | decimal degrees | Universal geographic standard | +| Humidity, battery, soil moisture | % | Universal | + +## Date & Time + +All timestamps throughout the app — last heard, message times, telemetry logs, chart axes — follow your device's date and time preferences. + +| Setting | What It Controls | Example | +| ---------------- | ---------------- | ------------------------------------------------ | +| **24-Hour Time** | Clock format | 14:30 vs 2:30 PM | +| **Date Format** | Date ordering | 09/05/2026 vs 05/09/2026 | + +The app also uses **relative time** where it makes sense — for example, "5 min ago" or "2 hours ago" in the node list — which is automatically localised into your device language. + +## Changing Your Measurement System (Android) + +On Android, your measurement system (metric vs imperial) is tied to your region setting: + +1. Open **Android Settings → System → Language & Region** +2. Change your **Region** or **Measurement units** preference +3. Return to Meshtastic — values update immediately + +> **Tip — The app uses `MetricFormatter` from `core:common`.** All measurement formatting is handled by a shared KMP utility that respects your platform's locale. Developers adding new measurement displays should use `MetricFormatter` rather than hard-coding unit conversions. + diff --git a/docs/srp/index.md b/docs/srp/index.md new file mode 100644 index 000000000..1e717192c --- /dev/null +++ b/docs/srp/index.md @@ -0,0 +1,30 @@ +--- +title: Home +layout: default +nav_order: 0 +--- + +# Meshtastic Android App Documentation + +User and developer documentation for the Meshtastic Android, Desktop, and iOS applications powered by KMP (Kotlin Multiplatform). + +Use the sidebar navigation to browse the **User Guide** for app features and the **Developer Guide** for contributing to the project. + +--- + +## Quick Links + +| Guide | Опис | +| --------------------------------------------------------------------- | -------------------------------------------------------------- | +| [Getting Started](user/onboarding) | Connect your first radio and send a message | +| [Messages & Channels](user/messages-and-channels) | Channel broadcasts, direct messages, reactions, and encryption | +| [Nodes](user/nodes) | Understanding the mesh network node list | +| [Signal Meter](user/signal-meter) | How the LoRa signal quality meter works | +| [Units & Locale](user/units-and-locale) | How temperatures, distances, and times adapt to your region | +| [Desktop App](user/desktop) | Linux, macOS, and Windows desktop usage | +| [Architecture](developer/architecture) | App architecture overview for contributors | +| [Contributing](developer/contributing) | Branch naming, PR workflow, and verification commands | + +--- + +> This documentation is served from the same markdown source that powers the in-app **Help & Documentation** browser. diff --git a/docs/srp/user/connections.md b/docs/srp/user/connections.md new file mode 100644 index 000000000..80a1ac470 --- /dev/null +++ b/docs/srp/user/connections.md @@ -0,0 +1,125 @@ +--- +title: Connections +nav_order: 2 +last_updated: 2026-05-13 +description: Connect your phone or desktop to a Meshtastic radio via Bluetooth, USB, or TCP/IP. +aliases: + - bluetooth + - usb + - tcp + - pairing +--- + +# Connections + +Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node. + +## Bluetooth (BLE) + +Bluetooth Low Energy is the default and most common connection method on Android. + +### Pairing a Device + +1. Ensure your Meshtastic radio is powered on and in pairing mode. +2. Open the app and navigate to **Connections**. +3. Tap **Scan for Devices** — nearby Meshtastic radios will appear. +4. Select your device from the list. +5. Accept the Bluetooth pairing prompt if shown. + +![Device list item](/assets/screenshots/connections_bluetooth_scan.png) + +You can filter devices by transport type using the filter chips at the top: + +![Transport filter chips](/assets/screenshots/connections_transport_filters.png) + +> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. + +### Connection Status + +| Иконица | State | Опис | +| ------- | -------------- | ----------------------------- | +| 🟢 | Блутут повезан | Active radio link established | +| 🟡 | Connecting | Handshake in progress | +| 🔴 | Раскачено | No active connection | +| ⚪ | Not configured | No device selected | + +When connecting, a status indicator shows the current connection state: + +![Connecting status](/assets/screenshots/connections_connecting.png) + +If no devices are found, the app shows an empty state with instructions: + +![No devices found](/assets/screenshots/connections_empty_state.png) + +### Troubleshooting Bluetooth + +- **Device not found:** Toggle Bluetooth off/on, ensure location is enabled. +- **Connection drops:** Move closer to the radio; check for interference. +- **Pairing rejected:** Forget the device in Android Bluetooth settings and retry. + +## USB Serial + +USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable. + +### Setup + +1. Connect your radio via USB cable to your device. +2. The app will prompt for USB permission — tap **Allow**. +3. The connection is established automatically. + +> ⚠️ **Note:** USB connections require OTG support on Android devices. + +## TCP/IP (WiFi) + +Some Meshtastic radios support WiFi connectivity, allowing TCP-based connections. + +### Configuration + +1. Connect your radio to a WiFi network via the radio's web interface or settings. +2. In the app, go to **Connections → TCP**. +3. Enter the radio's IP address and port (default: 4403). +4. Tap **Connect**. + +![WiFi scanning for devices](/assets/screenshots/connections_wifi_scanning.png) + +When a device is found, it appears in the connection list: + +![WiFi device found](/assets/screenshots/connections_wifi_device_found.png) + +A successful connection is confirmed with a status indicator: + +![WiFi connection success](/assets/screenshots/connections_wifi_success.png) + +### When to Use TCP + +- Radio is on the same local network +- Testing with a simulated radio +- Environments where Bluetooth has interference issues + +## Reconnection Behavior + +The app reconnects to the **last selected device** on startup. You can manually switch transports from the connections screen at any time. + +To disconnect from a radio, use the disconnect button on the connections screen: + +![Disconnect from radio](/assets/screenshots/connections_disconnect.png) + +## Desktop Connections + +On Desktop (Linux/macOS/Windows), the app supports: + +- **Bluetooth (BLE)** — via the Kable library; works on macOS, Linux, and Windows +- **USB Serial** — primary wired connection method +- **TCP/IP** — for network-connected radios + +See [Desktop App](desktop) for platform-specific details and keyboard shortcuts. + +## Related Topics + +- [Getting Started](onboarding) — first-launch setup and permissions +- [Settings — Radio & User](settings-radio-user) — Bluetooth and network configuration +- [Desktop App](desktop) — desktop-specific connection details +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — full list of compatible radios on meshtastic.org + +--- + diff --git a/docs/srp/user/desktop.md b/docs/srp/user/desktop.md new file mode 100644 index 000000000..a5d01e7e3 --- /dev/null +++ b/docs/srp/user/desktop.md @@ -0,0 +1,147 @@ +--- +title: Desktop App +nav_order: 14 +last_updated: 2026-05-13 +description: Install and use the Meshtastic Desktop app on Linux, macOS, and Windows — connections, feature parity, and keyboard shortcuts. +aliases: + - desktop + - linux + - macos + - windows + - jvm +--- + +# Desktop App + +The Meshtastic Desktop application provides the same mesh communication features on Linux, macOS, and Windows. + +## Overview + +The Desktop app shares its core codebase with the Android app through Kotlin Multiplatform (KMP). Most features work identically across platforms. + +## Installation + +### Linux + +- Download the `.deb` or `.AppImage` package from the releases page +- Or build from source using `./gradlew :desktopApp:run` + +### macOS + +- Download the `.dmg` package from releases +- Or build from source + +### Windows + +- Download the `.msi` installer from releases +- Or build from source + +## Connecting Your Radio + +### USB Serial (Primary) + +The most reliable connection method on Desktop: + +1. Connect your Meshtastic radio via USB cable. +2. The app should detect the serial port automatically. +3. If not detected, select the correct serial port from the connections menu. + +### TCP/IP + +For network-connected radios: + +1. Enter the radio's IP address and port (default: 4403). +2. Click **Connect**. + +### Bluetooth (BLE) + +Bluetooth Low Energy is supported on Desktop via the [Kable](https://github.com/JuulLabs/kable) library: + +1. Ensure your system has a Bluetooth adapter. +2. The app scans for nearby Meshtastic radios automatically. +3. Select your device from the connections screen. + +## Feature Parity + +| Feature | Android | Desktop | Белешке | +| ---------------------------------------- | ------- | ------- | -------------------------- | +| Messaging | ✓ | ✓ | Full parity | +| Node List | ✓ | ✓ | Full parity | +| Мапа | ✓ | ✓ | Full parity | +| Подешавања | ✓ | ✓ | Full parity | +| Bluetooth (BLE) | ✓ | ✓ | Via Kable on desktop | +| Firmware Update OTA | ✓ | ✗ | Use web flasher | +| Notifications | ✓ | ✓ | Native OS notifications | +| Widgets | ✓ | ✗ | Android-only | +| AI Assistant (Chirpy) | ✓\* | ✗ | Google flavor Android only | + +\*Chirpy AI requires Android 14+ on Google flavor builds with supported hardware. + +## UI Differences + +The Desktop app uses the same Compose Multiplatform UI with adaptations for larger screens and desktop interaction. + +### Keyboard Shortcuts + +| Shortcut | Action | +| ------------------- | --------------------------- | +| **⌘Q** / **Ctrl+Q** | Quit the application | +| **⌘,** / **Ctrl+,** | Отвори подешавања | +| **⌘1** / **Ctrl+1** | Switch to Conversations tab | +| **⌘2** / **Ctrl+2** | Switch to Nodes tab | +| **⌘3** / **Ctrl+3** | Switch to Map tab | +| **⌘4** / **Ctrl+4** | Switch to Connections tab | + +### Window & System Tray + +- **Window resizing** — responsive layout adapts to window dimensions +- **System tray** — minimize to system tray for background mesh operation +- **Tray menu** — right-click the tray icon to show window or quit +- **Mouse interaction** — hover states and standard desktop navigation + +### Notification Preferences + +The Desktop app provides in-app toggles for controlling which notifications are shown — messages, new nodes, and low battery alerts. Access these from **Settings → Notifications** within the app. + +## Built-in Documentation Browser + +The Desktop app includes a built-in documentation browser for quick access to help content without leaving the application. + +![Docs browser with table of contents](/assets/screenshots/docs-browser_toc.png) + +The browser supports full-text search across all documentation: + +![Searching the docs browser](/assets/screenshots/docs-browser_search.png) + +Individual doc pages render with full formatting: + +![A documentation page](/assets/screenshots/docs-browser_page.png) + +## Building from Source + +```bash +git clone https://github.com/meshtastic/Meshtastic-Android.git +cd Meshtastic-Android +git submodule update --init +./gradlew :desktopApp:run +``` + +Requirements: + +- JDK 21 +- No Android SDK required for desktop-only builds + +## Known Limitations + +- No OTA firmware updates (use web flasher) +- Some Android-specific features (widgets, specific notification channels) are unavailable +- Performance may vary on low-spec hardware running Compose Desktop +- BLE bonding is not yet supported on desktop (pairing works without bonding) + +## Related Topics + +- [Connections](connections) — connection methods overview +- [Firmware Updates](firmware) — use the [Web Flasher](https://flasher.meshtastic.org) for desktop firmware updates + +--- + diff --git a/docs/srp/user/discovery.md b/docs/srp/user/discovery.md new file mode 100644 index 000000000..55092187e --- /dev/null +++ b/docs/srp/user/discovery.md @@ -0,0 +1,114 @@ +--- +title: Discovery +nav_order: 12 +last_updated: 2026-05-13 +description: Explore your mesh network — traceroute paths, neighbor maps, and node discovery tools. +aliases: + - mesh-discovery + - local-discovery + - network-scan + - traceroute + - neighbor-info +--- + +# Discovery + +Discovery tools help you understand **how** your mesh network is connected — which nodes can hear each other, what paths messages take, and where bottlenecks or weak links exist. + +> 💡 **Tip:** You don't need a dedicated "discovery mode" to start exploring your mesh. The tools below are available right now from the node list and node detail screens. + +--- + +## Праћење руте + +Traceroute reveals the exact path a message takes from your node to any other node on the mesh. It's the single most useful tool for debugging connectivity problems. + +### Running a Traceroute + +1. Navigate to **Nodes** and tap the node you want to trace. +2. On the node detail screen, tap **Traceroute**. +3. The app sends a traceroute request and waits for the response. +4. Results display each hop in order, with signal quality at every step. + +### Reading the Results + +A traceroute result looks like this: + +``` +You → Node A (SNR: 8.5, RSSI: -95) → Node B (SNR: 5.2, RSSI: -108) → Target +``` + +Each hop represents a relay node that forwarded the message. The SNR and RSSI values at each hop tell you about the link quality on that specific segment. + +| What to look for | What it means | +| -------------------------------------------------------------------------- | --------------------------------------------------------------------------- | +| All hops show Good SNR (> 5 dB) | Healthy path — messages flow reliably | +| One hop shows Bad SNR (< 0 dB) | Weak link — this relay segment is fragile | +| Many hops (4+) | Long path — consider repositioning a node to shorten it | +| Different path on retry | Mesh is adapting — multiple routes exist (this is good!) | + +> 💡 **Tip:** Run traceroute several times over a few minutes. If the path changes, your mesh has redundant routes — a sign of a well-connected network. + +### Troubleshooting with Traceroute + +- **"No route found"** — The target node may be offline, out of range, or on a different channel. Check that both nodes share at least one channel with the same encryption key. +- **Traceroute times out** — The path may be too long (exceeds hop limit) or a relay node is congested. Try increasing the hop limit in **Settings → LoRa Config**. +- **Asymmetric paths** — A traceroute from A→B may take a different path than B→A. This is normal — radio propagation is not always symmetric. + +--- + +## Neighbor Info + +The Neighbor Info module lets each node broadcast a list of the nodes it can **directly hear** (single-hop). When multiple nodes share their neighbor lists, you can piece together a topology map of the entire mesh. + +### Enabling Neighbor Info + +1. Navigate to **Settings → Module Config → Neighbor Info**. +2. Enable the module. +3. Set the broadcast interval (default: 900 seconds / 15 minutes). + +Once enabled, your node periodically broadcasts its neighbor table. Other nodes with Neighbor Info enabled do the same. + +### Viewing Neighbor Data + +- Open any node's detail screen and look for the **Neighbors** section. +- Each neighbor entry shows the node that was directly heard and its signal quality. +- Combine neighbor data from multiple nodes to understand the full mesh topology. + +> ⚠️ **Note:** Neighbor Info increases airtime usage because every enabled node periodically broadcasts its neighbor list. On busy meshes with many nodes, consider longer broadcast intervals (3600 seconds or more) to avoid congestion. + +--- + +## Node List as a Discovery Tool + +The node list itself is a powerful discovery tool when you use its filtering and sorting features effectively. + +### Finding New Nodes + +- Sort by **Last heard** to see the most recently active nodes at the top. +- Enable **Include unknown** to see nodes that have appeared on the mesh but haven't sent user info yet — these are often newly powered-on devices. + +### Assessing Connectivity + +- Sort by **Hops away** to see which nodes are directly reachable (0 hops) versus relayed. +- Sort by **Distance** to find nearby nodes and verify they're reachable. +- Use **Exclude MQTT** to focus on nodes reachable over radio (not via internet bridge). + +### Infrastructure Audit + +- Disable **Exclude infrastructure** to see Router, Repeater, Router Late, and Client Base nodes. +- Check their signal quality and last-heard times to verify your infrastructure nodes are healthy. + +See [Nodes](nodes) for full details on filtering and sorting options. + +--- + +## Tips for Mesh Exploration + +- **Start with traceroute** — it gives you immediate, actionable information about a specific path. +- **Enable Neighbor Info on key nodes** — especially routers and repeaters, to build a picture of the backbone. +- **Check the map** — node positions on the [Map](map-and-waypoints) combined with signal data help you understand why some links are strong and others are weak. +- **Compare signal over time** — use the [Signal Meter](signal-meter) guide to interpret SNR and RSSI values correctly. + +--- + diff --git a/docs/srp/user/firmware.md b/docs/srp/user/firmware.md new file mode 100644 index 000000000..c7c23f47e --- /dev/null +++ b/docs/srp/user/firmware.md @@ -0,0 +1,114 @@ +--- +title: Ажурирања фирмвера +nav_order: 13 +last_updated: 2026-05-13 +description: Update your radio firmware over Bluetooth — OTA process, version channels, pre-flight checks, and recovery. +aliases: + - firmware + - update + - ota + - flash +--- + +# Ажурирања фирмвера + +Keep your Meshtastic radio up to date with the latest firmware for new features, bug fixes, and security improvements. + +## Checking for Updates + +1. Navigate to **Settings → Firmware Update** or tap the firmware notification if shown. +2. The app checks for available firmware versions. +3. Available updates show the version number and changelog summary. + +## Update Methods + +### OTA (Over-The-Air) via Bluetooth + +The most common update method for Android users: + +1. Ensure your radio is connected via Bluetooth. +2. Navigate to the Firmware Update screen. +3. Select the desired firmware version. +4. Tap **Update** to begin the OTA process. +5. Wait for the update to complete — **do not disconnect** during the update. + +![Firmware checking for updates](/assets/screenshots/firmware_checking.png) + +> ⚠️ **Warning:** Interrupting a firmware update can brick your device. Ensure your radio has sufficient battery (>50% recommended) and maintain Bluetooth proximity during the entire process. + +![Firmware disclaimer](/assets/screenshots/firmware_disclaimer.png) + +### USB Flashing + +For recovery or when OTA is unavailable: + +- Use the [Meshtastic Web Flasher](https://flasher.meshtastic.org) +- Or the [Meshtastic CLI tool](https://meshtastic.org/docs/getting-started/flashing-firmware) on desktop + +## Version Channels + +| Канал | Опис | +| ------ | ------------------------------------------- | +| Stable | Recommended for most users; tested releases | +| Alpha | Preview releases; may contain bugs | + +## Pre-Update Checklist + +Before updating: + +- [ ] Battery > 50% +- [ ] Stable Bluetooth connection +- [ ] Note your current settings (they may reset on major version changes) +- [ ] Check the release notes for breaking changes + +## Post-Update + +After a successful update: + +- The radio will reboot automatically +- Bluetooth connection will re-establish +- Verify your settings are intact +- Check the firmware version in **Settings → About** + +![Firmware update success](/assets/screenshots/firmware_success.png) + +## Troubleshooting + +### Update Stuck + +If the update appears frozen: + +- Wait at least 5 minutes before intervening +- If truly stuck, power-cycle the radio +- Attempt the update again + +![Firmware update error](/assets/screenshots/firmware_error.png) + +### Device Won't Boot After Update + +If your device fails to boot: + +1. Try connecting via USB to a computer +2. Use the web flasher in recovery/DFU mode +3. Flash a known-good firmware version +4. Check the Meshtastic Discord for device-specific recovery steps + +### Compatibility Warnings + +The app may show warnings when: + +- Connected radio firmware is below minimum supported version +- Major version mismatch between app and firmware +- Deprecated features need migration + +> ⚠️ **Important:** Always update the Meshtastic app before or alongside firmware updates to ensure compatibility. + +## Related Topics + +- [Connections](connections) — reconnecting after a firmware update +- [Flashing firmware guide](https://meshtastic.org/docs/getting-started/flashing-firmware) — full firmware flashing walkthrough on meshtastic.org +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — check firmware compatibility by device +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/srp/user/map-and-waypoints.md b/docs/srp/user/map-and-waypoints.md new file mode 100644 index 000000000..f3986954d --- /dev/null +++ b/docs/srp/user/map-and-waypoints.md @@ -0,0 +1,116 @@ +--- +title: Map & Waypoints +nav_order: 6 +last_updated: 2026-05-13 +description: View node positions on the map, create and share waypoints, and manage position sharing and privacy. +aliases: + - map + - waypoints + - gps + - location +--- + +# Map & Waypoints + +The Map screen shows the geographic positions of nodes on your mesh, along with shared waypoints. + +## Map View + +The map displays: + +- **Node positions** — colored markers for each node reporting location +- **Waypoints** — shared points of interest +- **Your position** — your current GPS location + +### Node Markers + +Node markers on the map indicate: + +| Боја | Meaning | +| ------ | ---------------------------------------------- | +| Green | Online (heard recently) | +| Yellow | Away (heard within 2 hours) | +| Gray | Offline (stale position) | +| Blue | Your own node | + +### Map Controls + +- **Zoom** — pinch or use +/- buttons +- **Pan** — drag to explore +- **Center** — select the location button to center on your position +- **Node tap** — tap a node marker to view details + +The floating toolbar provides quick access to compass, layer switching, node filters, refresh, and location tracking. Tap the compass to reorient north-up, or tap the location button to center on your current position. + +![Map controls overlay](/assets/screenshots/map_controls_overlay.png) + +## Waypoints + +Waypoints are shared geographic points of interest that all mesh members can see. + +### Creating a Waypoint + +1. Long-press on the map at the desired location. +2. Enter a name and optional description. +3. Choose an icon/emoji for the waypoint. +4. Tap **Send** to share with the mesh. + +### Waypoint Properties + +| Property | Опис | +| ---------- | ------------------------------------------------------- | +| Име | Short identifier (max 30 characters) | +| Опис | Optional longer description | +| Иконица | Visual marker emoji on the map | +| Закључан | If locked, only the creator can edit or delete | +| Expiration | Optional auto-remove time | + +### Waypoint Expiration + +Waypoints can be set to expire automatically: + +- **Never** (default) — waypoint remains until manually deleted +- **Timed** — waypoint is automatically removed after the specified duration (e.g., "remove after 2 hours"). Useful for temporary markers like rally points, hazards, or meeting locations. + +Expired waypoints are automatically hidden from the map so they don't clutter the display. The expiration countdown begins when the waypoint is created, not when other nodes receive it. + +### Managing Waypoints + +- Tap a waypoint on the map to view its details and coordinates +- Edit or delete waypoints you created +- **Locked waypoints** cannot be modified or deleted by other nodes — only the original creator can change them +- Unlocked waypoints can be edited by any mesh member + +## Position Sharing + +### Enabling Position Sharing + +Your node shares its GPS position based on: + +- **Fixed interval** — broadcast position at regular intervals +- **Smart position** — broadcast when movement exceeds a threshold +- **Manual** — only share when explicitly requested + +Configure position behavior in **Settings → Position**. + +### Privacy Considerations + +> 🔒 **Privacy:** Position data is broadcast to all nodes on your channel. If you don't want your location shared, disable GPS position in settings or use a fixed/fake position. + +## Map Sources + +The app supports multiple map tile sources: + +- OpenStreetMap (default) +- Satellite imagery (where available) +- Offline tiles (download map areas for offline use) + +## Related Topics + +- [Nodes](nodes) — view and filter your node list +- [Node Metrics](node-metrics) — signal quality and position history for individual nodes +- [Discovery](discovery) — traceroute and neighbor info for understanding mesh topology +- [Units & Locale](units-and-locale) — distance and coordinate display formats + +--- + diff --git a/docs/srp/user/messages-and-channels.md b/docs/srp/user/messages-and-channels.md new file mode 100644 index 000000000..3af5645f5 --- /dev/null +++ b/docs/srp/user/messages-and-channels.md @@ -0,0 +1,159 @@ +--- +title: Messages & Channels +nav_order: 3 +last_updated: 2026-05-13 +description: Send and receive messages, manage channels, configure encryption, and use quick chat, reactions, and message actions. +aliases: + - channels + - direct-messages + - messaging + - conversations +--- + +# Messages & Channels + +Meshtastic supports two communication modes: **channel broadcasts** and **direct messages**. + +## Канали + +Channels are shared communication groups. All nodes configured with the same channel key can read and send messages on that channel. + +### Default Channel + +Every Meshtastic device comes with a default **LongFast** channel. This is an unencrypted channel used for general mesh communication. + +### Channel Security + +Channels support multiple encryption levels: + +| Иконица | Security Level | Опис | +| ------- | ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------- | +| 🔒 | PSK (256-bit AES) | Fully encrypted with a strong pre-shared key. Only nodes with the matching key can read messages. | +| 🔐 | PSK (128-bit AES) | Encrypted with a shorter key. Secure for most uses but 256-bit is preferred for sensitive data. | +| 🔓 | Default / Open | Uses the well-known default key. **Any Meshtastic device** on the same preset can read these messages. | +| ⚠️ | Insecure + Position | Open channel that also broadcasts your GPS position. Use with caution in public meshes. | + +> 🔒 **Security Tip:** 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. + +### Adding a Channel + +1. Navigate to **Settings → Channels**. +2. Tap **Add Channel** or scan a QR code. +3. Configure the channel name and encryption key. +4. Share the channel URL/QR code with others who need access. + +Tapping a channel shows its details and sharing options. + +## Директне поруке + +Direct messages (DMs) are point-to-point encrypted communications between two specific nodes. + +### Sending a Direct Message + +1. Open the **Messages** tab. +2. Select a node from your contacts list or tap a node in the node list. +3. Type your message and tap **Send**. + +### Message States + +| State | Иконица | Meaning | +| --------------------------------- | ------- | ----------------------------------------------------------------------------------------------------------------- | +| Queued | ⏳ | Message waiting to be sent | +| En route | ✓ | Delivered to the radio, awaiting acknowledgment | +| Delivered | ✓✓ | Acknowledgment received from recipient | +| Received | ✓ | Message received from the mesh (incoming) | +| S&F Routing | 🔗 | Store & Forward: message being routed through an S&F node | +| S&F Confirmed | 🔗 | Store & Forward: delivery confirmed via S&F node | +| Грешка | ✗ | Delivery failed after retries | + +### Delivery Errors + +When a message fails to deliver, the error indicator shows what went wrong: + +| Грешка | Meaning | What to Do | +| -------------------- | ---------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Нема руте | No path exists to the destination node | The recipient may be offline or out of mesh range. Try later or move closer. | +| Got NAK | The next-hop node refused to relay | The relay node may be congested. Wait and retry. | +| Временско ограничење | No acknowledgment within retry window | The recipient may be just out of range. Try increasing hop limit or moving to a better position. | +| Нема интерфејса | No radio interface available to send | Check that your radio is connected and the channel is configured. | +| Max Retransmit | All retry attempts exhausted | The mesh path is unreliable. Try a different channel or wait for conditions to improve. | +| Нема канала | The destination channel doesn't exist | Verify both nodes share the same channel configuration. | +| Too Large | Message exceeds maximum payload size | Shorten your message (max ~230 characters). | +| Нема одговора | Node received message but didn't respond | The recipient's radio may be busy or in low-power sleep mode. | +| Duty Cycle Limit | Regional airtime limit reached | Your radio has used its allowed transmit time. Wait for the duty cycle window to reset (typically 1 hour in EU regions). | +| Лош захтев | Malformed or invalid message | This usually indicates a software bug. Try restarting the app. | + +> 💡 **Tip:** 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. + +## Message Features + +### Quick Chat + +Pre-configured messages for rapid communication: + +- Access via the Quick Chat button in the message input area +- Choose from built-in phrases or custom messages +- Customize quick chat messages in **Settings → Quick Chat** +- Useful when typing is impractical (gloves, small screen, urgent) + +![Quick chat option](/assets/screenshots/messages_quick_chat.png) + +The channel list shows each channel with its latest message preview. + +### Message Bubbles + +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. + +### Reactions + +React to messages with emoji: + +- **Long-press** a message to open the actions menu +- Tap **Add Reaction** to choose an emoji +- Reactions appear below the message bubble +- Multiple users can react to the same message +- React to your own messages or others' messages + +![Emoji reaction badges displayed beneath a message](/assets/screenshots/messages_reaction.png) + +> 💡 **Tip:** Reactions are lightweight — they use minimal mesh bandwidth compared to full text messages. + +### Message Actions + +Long-press any message to access: + +- **Copy** — copy message text to clipboard +- **Reply** — quote the message in your response +- **React** — add an emoji reaction +- **Delete** — remove a message you sent (local deletion) + +### Message Priority + +Messages are queued and transmitted based on priority: + +1. Emergency/alert messages (highest) +2. Direct messages +3. Channel broadcasts (lowest) + +### Message Limits + +- **Maximum length:** 237 bytes (approximately 230 characters for ASCII text) +- **Rate limiting:** The mesh enforces airtime fairness; heavy message volume may be throttled +- **Delivery:** Messages are retried automatically if no acknowledgment is received + +## Best Practices + +- Use channels for group coordination +- Use direct messages for private person-to-person communication +- Keep messages short — mesh bandwidth is limited +- Configure encryption for sensitive communications + +## Related Topics + +- [Nodes](nodes) — tap a node to start a direct message +- [Settings — Radio & User](settings-radio-user) — configure channel encryption and presets +- [MQTT](mqtt) — bridge channel messages to the internet +- [Channel configuration](https://meshtastic.org/docs/configuration/radio/channels) — detailed channel settings on meshtastic.org + +--- + diff --git a/docs/srp/user/mqtt.md b/docs/srp/user/mqtt.md new file mode 100644 index 000000000..27340a59d --- /dev/null +++ b/docs/srp/user/mqtt.md @@ -0,0 +1,137 @@ +--- +title: MQTT +nav_order: 11 +last_updated: 2026-05-13 +description: Bridge your mesh to the internet — MQTT broker setup, encryption layers, and map reporting. +aliases: + - mqtt + - internet-bridge + - broker +--- + +# MQTT + +MQTT bridges your Meshtastic mesh network to the internet, enabling long-range communication beyond radio range. + +## Overview + +The MQTT module connects your node to an MQTT broker, allowing: + +- Messages to reach nodes on different physical meshes via the internet +- Integration with home automation and monitoring systems +- Publishing node positions to the public Meshtastic map +- Custom data pipelines for logging and alerting + +## How It Works + +``` +[Your Node] → Radio → [Gateway Node with WiFi] → MQTT Broker → [Remote Gateway] → Radio → [Remote Node] +``` + +A gateway node with internet access (WiFi or Ethernet) publishes mesh messages to an MQTT topic. Remote gateways subscribed to the same topic inject those messages into their local mesh. + +## Configuration + +### Enabling MQTT + +1. Navigate to **Settings → Module Config → MQTT**. +2. Enable the MQTT module. +3. Configure the broker connection: + +![MQTT toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | Опис | Подразумевано | +| --------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------- | +| Адреса сервера | MQTT broker hostname | mqtt.meshtastic.org | +| Корисничко име | Broker authentication | meshdev | +| Лозинка | Broker authentication | large4cats | +| Корен тема | Base topic for messages | msh | +| Encryption | Encrypt MQTT payload | Омогућено | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON packet support has been removed from firmware; this field is ignored | Онемогућено | +| TLS | Secure connection to broker | Онемогућено | +| Map Reporting | Report position to public map | Онемогућено | + +### Default Meshtastic Broker + +The community maintains a public broker at `mqtt.meshtastic.org`. This is intended for general use and testing. + +> 🔒 **Privacy:** Messages on the public broker are readable by anyone subscribed. Always use channel encryption for private communications. + +### Private Broker + +For better privacy and control, you can run your own MQTT broker: + +- Mosquitto (lightweight, open-source) +- HiveMQ +- EMQX + +Configure your node to point to your private broker with appropriate credentials. + +## Map Reporting + +When Map Reporting is enabled, your node publishes its position to the Meshtastic community map: + +- Visible at [meshmap.net](https://meshmap.net) and similar community map services +- Only position and node info are shared +- Disable this if you don't want your location publicly visible + +## Uplink vs Downlink + +| Direction | Опис | +| ------------ | -------------------------------- | +| **Uplink** | Messages from mesh → MQTT broker | +| **Downlink** | Messages from MQTT broker → mesh | + +Configure per-channel which directions are active to control message flow and airtime usage. + +## Message Formats + +MQTT uses protobuf message format: + +| Format | Опис | Use case | +| ------------ | ----------------------------------- | -------------------------- | +| **Protobuf** | Binary Meshtastic protobuf encoding | Node-to-node mesh bridging | + +> ⚠️ **Note:** JSON output support was removed from firmware. The `json_enabled` setting is still visible in the app for legacy compatibility but has no effect on current firmware versions. + +## Encryption & Privacy + +Understanding the layered encryption model: + +1. **Channel encryption** happens on the mesh _before_ MQTT. If your channel has a PSK, the MQTT payload is already encrypted — the broker and any subscribers see only the ciphertext. +2. **MQTT encryption** (the module setting) adds an additional encryption layer for transit to the broker. This protects metadata and routing information. +3. **TLS** encrypts the TCP connection to the broker itself, preventing network-level eavesdropping. + +> 🔒 **Important:** The default public channel has a well-known key. Messages on the default channel sent via MQTT are effectively **unencrypted** — anyone can decode them. Always use a custom PSK for private communications. + +## Best Practices + +- Use channel-level encryption (PSK) on channels that bridge to MQTT +- Don't enable MQTT on nodes without internet access (it will buffer and waste memory) +- Use a private broker for sensitive deployments +- Be mindful of airtime when downlinking messages from busy MQTT topics — every downlinked message consumes radio airtime on your local mesh +- Consider enabling uplink-only if you only need to monitor your mesh remotely without injecting messages back + +## Troubleshooting + +### MQTT Not Connecting + +- **Check WiFi** — the gateway node must have an active internet connection (WiFi or Ethernet). MQTT does not work over the LoRa radio link itself. +- **Verify credentials** — incorrect username or password will silently fail on most brokers. Double-check for trailing spaces. +- **Firewall** — port 1883 (MQTT) or 8883 (MQTT+TLS) must be open. Some networks block non-standard ports. +- **DNS resolution** — if using a custom broker hostname, verify the node can resolve it. Try the broker's IP address directly. + +### Messages Not Bridging + +- **Check uplink/downlink settings** — if only uplink is enabled, messages flow from mesh to MQTT but not back. Enable downlink on the receiving gateway. +- **Channel mismatch** — both gateways must share the same channel with the same PSK. A mismatch means messages are encrypted with different keys and appear as garbage. +- **Topic mismatch** — ensure both gateways use the same root topic. The default `msh` works for the public broker. + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — MQTT module configuration reference +- [Messages & Channels](messages-and-channels) — channel encryption and PSK setup +- [MQTT integration guide](https://meshtastic.org/docs/software/integrations/mqtt) — detailed MQTT documentation on meshtastic.org + +--- + diff --git a/docs/srp/user/node-metrics.md b/docs/srp/user/node-metrics.md new file mode 100644 index 000000000..e1e76387e --- /dev/null +++ b/docs/srp/user/node-metrics.md @@ -0,0 +1,130 @@ +--- +title: Node Metrics +nav_order: 5 +last_updated: 2026-05-13 +description: Telemetry dashboards for each mesh node — device health, environment sensors, signal quality, power, traceroute, and position history. +aliases: + - metrics + - telemetry + - device-metrics + - signal +--- + +# Node Metrics + +The node detail screen provides comprehensive telemetry and metrics for each node on your mesh. + +## Метрика уређаја + +Basic operating information reported by each node: + +| Метрика | Опис | +| -------------------- | ----------------------------------- | +| Ниво батерије | Current battery percentage | +| Напон | Battery voltage reading | +| Искоришћеност канала | Percentage of airtime consumed | +| Време емитовања | Transmission time used by this node | +| Време рада | Time since last reboot | + +Device metrics are displayed as individual cards with trend sparklines showing battery level, voltage, channel utilization, airtime, and uptime over time. + +> 💡 **Tip:** Tap any metric card to expand it into a full chart with historical data points. Pinch to zoom the time axis. + +## Метрике сензора + +Environmental sensor data (requires compatible hardware): + +| Метрика | Sensor Examples | +| ------------------------------------ | --------------------- | +| Температура | BME280, BME680, SHT31 | +| Влажност | BME280, BME680, SHT31 | +| Барометарски притисак | BME280, BMP280 | +| Gas Resistance | BME680 | +| IAQ (Air Quality) | BME680 | + +Environment metrics are charted over time for easy trend analysis — temperature, humidity, and pressure each get their own line chart with the measurement unit displayed on the Y axis. + +> 💡 **Tip:** Environment metrics require a sensor connected to the remote node. Not all nodes report environmental data. See [Telemetry & Sensors](telemetry-and-sensors) for a full list of supported sensors. + +## Signal Metrics + +Radio signal quality information: + +| Метрика | Опис | +| --------- | ----------------------------------------------------------------------------- | +| SNR | Signal-to-Noise Ratio (higher is better) | +| RSSI | Received Signal Strength Indicator (closer to 0 is better) | +| Hop Count | Number of mesh hops for last message | + +### Signal Quality Reference + +| SNR Range | Quality | +| --------------------------------- | ---------- | +| > 10 dB | Excellent | +| 0 to 10 dB | Добро | +| -10 to 0 dB | Прихватљив | +| < -10 dB | Poor | + +## Мерни подаци о снази + +Power management telemetry (requires INA sensor or compatible hardware): + +| Метрика | Опис | +| ----------- | ----------------------- | +| Bus Voltage | Supply voltage | +| Струја | Power draw in milliamps | +| Снага | Calculated wattage | + +## Праћење руте + +Traceroute shows the path a message takes through the mesh: + +1. From the node detail screen, tap **Traceroute**. +2. The app sends a traceroute request to the target node. +3. Results show each hop with SNR/RSSI values. + +### Reading Traceroute Results + +``` +You → Node A (SNR: 8.5) → Node B (SNR: 5.2) → Target +``` + +Each hop represents a relay node that forwarded the message. + +## Логови позиција + +Historical position data for nodes that share their location: + +- GPS coordinates +- Висина +- Speed (if moving) +- Timestamp for each position report + +## Neighbor Info + +Shows which nodes a given node can directly hear, useful for understanding mesh topology. + +## Viewing Metrics + +1. Navigate to **Nodes**. +2. Tap the node you want to inspect. +3. Select the metric category from the detail tabs. + +![Node detail — local device](/assets/screenshots/nodes_detail_local.png) + +The position tab shows location data for nodes that share GPS: + +![Position inline content](/assets/screenshots/nodes_position.png) + +> ⚠️ **Note:** Metrics are only available when they have been reported by the remote node. Metrics update at intervals configured on each node's telemetry settings. + +## Related Topics + +- [Nodes](nodes) — node list, filtering, and sorting +- [Telemetry & Sensors](telemetry-and-sensors) — supported sensors and configuration +- [Signal Meter](signal-meter) — how signal quality is calculated from SNR and RSSI +- [Discovery](discovery) — traceroute details and neighbor info +- [Units & Locale](units-and-locale) — temperature, distance, and speed display formats + +--- + diff --git a/docs/srp/user/nodes.md b/docs/srp/user/nodes.md new file mode 100644 index 000000000..00b16b535 --- /dev/null +++ b/docs/srp/user/nodes.md @@ -0,0 +1,152 @@ +--- +title: Чворови +nav_order: 4 +last_updated: 2026-05-13 +description: Browse, filter, and sort mesh nodes — view details, signal quality, roles, and quick actions. +aliases: + - node-list + - mesh-nodes + - peers +--- + +# Чворови + +The Nodes screen displays all devices visible on your mesh network. + +## Node List + +The node list shows every node your radio has heard, including: + +- **Node name** — user-configured long name +- **Short name** — 4-character identifier +- **Signal quality** — last heard signal strength +- **Last heard** — time since last communication +- **Distance** — estimated distance (if positions are shared) +- **Battery** — remote node battery level (if telemetry is enabled) + +### Node Status Indicators + +| Badge | Meaning | +| ---------- | ------------------------------------- | +| 🟢 Online | Node heard within the last 15 minutes | +| 🟡 Away | Node heard within the last 2 hours | +| 🔴 Offline | Node not heard for over 2 hours | +| ⭐ Favorite | Node marked as favorite by the user | + +### Node Roles + +Nodes can be configured with different roles that affect their mesh behavior: + +| Улога | Опис | +| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Клијент | Standard end-user device | +| Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | +| Клијент мутиран | Receives but doesn't retransmit | +| Скривени клијент | Like Client Mute, plus hides from node list | +| Рутер | Prioritizes message forwarding; stays awake to relay | +| Рутер са кашњењем | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | +| ~~Router Client~~ | ⚠️ **Deprecated** (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | +| ~~Repeater~~ | ⚠️ **Deprecated** (removed in firmware 2.7.11) — no longer selectable; use Router instead | +| Трекер | Optimized for position reporting at regular intervals | +| Сензор | Optimized for telemetry reporting | +| TAK | Interoperates with TAK systems (sends/receives CoT) | +| ТАК Трекер | TAK position reporting only | +| Lost & Found | Continuous position beacon for recovery | + +### Choosing a Role + +Most users should keep the default **Client** role. Consider a different role when: + +- **Router** — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don't use Router on battery-powered handheld devices. +- **Router Late** — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. +- **Client Base** — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. +- **Client Mute** — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only devices or to reduce congestion in dense areas. +- **Tracker** — An unattended device whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. +- **Sensor** — An unattended device reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. +- **TAK / TAK Tracker** — Only needed if interoperating with ATAK/WinTAK systems. See [TAK Integration](tak) for details. + +> 💡 **Tip:** The mesh works best when most nodes are **Client** or **Router**. Too many Mute nodes reduces mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. + +### Encryption Indicators + +Nodes display encryption status icons next to their name: + +| Иконица | Meaning | +| ----------- | ------------------------------------------------------------------------------------------------------------------- | +| 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | +| 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | +| ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) | + +> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. + +## Quick Actions + +From the node list, you can: + +- **Tap** a node to view its detail page +- **Long-press** for quick actions: + - Send a direct message + - View on map + - Захтевај позицију + - Mark as favorite + - Праћење руте + +## Filtering & Sorting + +### Text Search + +Type in the search field to filter nodes by name or short name. The filter updates in real time as you type. + +### Filter Toggles + +| Филтер | Опис | +| -------------------------- | ---------------------------------------------------------------------------------------------- | +| **Only online** | Show only nodes heard within the last 15 minutes | +| **Only direct** | Show only nodes with direct (non-relayed) connections | +| **Include unknown** | Show nodes that haven't sent user info yet | +| **Exclude infrastructure** | Hide infrastructure-role nodes (Router, Repeater, Router Late, Client Base) | +| **Exclude MQTT** | Hide nodes heard only via MQTT internet bridge | +| **Show ignored** | Show nodes you've previously dismissed or muted | + +### Sort Options + +| Sort | Опис | +| ------------------------------------------- | ------------------------------------------------------------------ | +| **Last heard** (default) | Most recently heard nodes first | +| **Alphabetical** | Sorted by node long name | +| **Distance** | Nearest nodes first (requires position sharing) | +| **Hops away** | Fewest relay hops first | +| **Channel** | Grouped by channel index | +| **Via MQTT** | Grouped by MQTT vs. radio-heard | +| **Favorites** | Favorited nodes first | + +## Node Detail + +Tapping a node opens the detail view with comprehensive information. See [Node Metrics](node-metrics) for full details on metrics and telemetry. + +![Node detail view](/assets/screenshots/nodes_node_list.png) + +The detail screen includes device info, position, and action buttons: + +![Node detail section](/assets/screenshots/nodes_detail_section.png) + +Inline status indicators show key metrics at a glance: + +| Indicator | Screenshot | +| ------------------ | -------------------------------------------------------- | +| Signal quality | ![Signal](/assets/screenshots/nodes_signal_info.png) | +| Battery level | ![Battery](/assets/screenshots/nodes_battery_info.png) | +| Hop count | ![Hops](/assets/screenshots/nodes_hops_info.png) | +| Последње откривање | ![Last heard](/assets/screenshots/nodes_last_heard.png) | +| Раздаљина | ![Distance](/assets/screenshots/nodes_distance_info.png) | + +## Related Topics + +- [Node Metrics](node-metrics) — detailed telemetry dashboards for each node +- [Messages & Channels](messages-and-channels) — send a direct message to a node +- [Map & Waypoints](map-and-waypoints) — view node positions geographically +- [Discovery](discovery) — traceroute and neighbor info for topology exploration +- [Signal Meter](signal-meter) — understand what the signal bars mean + +--- + diff --git a/docs/srp/user/onboarding.md b/docs/srp/user/onboarding.md new file mode 100644 index 000000000..3b910534e --- /dev/null +++ b/docs/srp/user/onboarding.md @@ -0,0 +1,99 @@ +--- +title: Getting Started +nav_order: 1 +last_updated: 2026-05-13 +description: First-launch setup — permissions, onboarding flow, and next steps after connecting your radio. +aliases: + - first-launch + - setup + - intro +--- + +# Getting Started + +Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app. + +## First Launch + +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. + +### Welcome Screen + +The welcome screen introduces Meshtastic and its core capabilities: + +- Off-grid mesh communication +- No cellular or internet required +- End-to-end encrypted messaging + +Tap **Get Started** to proceed through the setup flow. + +![Welcome screen](/assets/screenshots/onboarding_welcome.png) + +## Permissions + +The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. + +### Bluetooth Permission + +Bluetooth is the primary connection method between your phone and Meshtastic radio: + +- **Bluetooth scanning** — discover nearby Meshtastic radios +- **Bluetooth connect** — establish and maintain connections with paired radios + +Grant both permissions when prompted. Without Bluetooth, you'll need to use USB or TCP connections instead. + +### Location Permission + +> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. + +Meshtastic also uses your location for: + +- Showing your position on the mesh map +- Calculating distances to other nodes +- Sharing your GPS coordinates with other mesh members (if enabled) + +Grant **"While using the app"** or **"Always"** depending on your preference: + +- **While using the app** — position updates only when the app is open +- **Always** — enables background position updates for always-on mesh presence + +If denied, Bluetooth scanning will not function and your node will not report a position. + +### Notifications Permission + +Notifications alert you to: + +- Incoming messages from channels and direct messages +- Connection status changes (connected, disconnected, reconnecting) +- Firmware update availability + +> 💡 **Tip:** You can fine-tune notification preferences later in Android system settings. The app creates separate notification channels for messages, connection events, and background service status. + +### Critical Alerts Permission + +On supported devices, the app may request permission for critical alerts: + +- These are high-priority notifications that can break through Do Not Disturb mode +- Useful for emergency mesh alerts or urgent messages +- You can **skip** this step if you don't need breakthrough notifications +- Configure or revoke later in Android notification settings + +## After Setup + +Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. + +> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. + +## What's Next? + +Once connected to a radio, explore: + +- [Connections](connections) — pair your first radio device +- [Messages & Channels](messages-and-channels) — send your first message +- [Nodes](nodes) — see who's on your mesh +- [Map & Waypoints](map-and-waypoints) — view node positions +- [Settings](settings-radio-user) — configure your radio and user profile + +New to Meshtastic? The [getting started guide](https://meshtastic.org/docs/getting-started) on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup. + +--- diff --git a/docs/srp/user/settings-module-admin.md b/docs/srp/user/settings-module-admin.md new file mode 100644 index 000000000..b2cb5c079 --- /dev/null +++ b/docs/srp/user/settings-module-admin.md @@ -0,0 +1,246 @@ +--- +title: Settings — Modules & Admin +nav_order: 8 +last_updated: 2026-05-13 +description: Configure optional feature modules (MQTT, telemetry, canned messages, TAK, and more) and perform device administration. +aliases: + - modules + - module-config + - administration +--- + +# Settings — Modules & Admin + +Configure optional feature modules and perform device administration. Modules extend Meshtastic with specialized capabilities — each can be independently enabled or disabled. + +> 💡 **Tip:** You only need to enable the modules you actually use. Disabling unused modules reduces airtime, saves battery, and simplifies your configuration. + +Module settings use a card-based layout with toggle switches, dropdowns, text fields, and sliders: + +![Toggle switch](/assets/screenshots/settings_switch.png) + +![Dropdown selector](/assets/screenshots/settings_dropdown.png) + +![Text field](/assets/screenshots/settings_text_field.png) + +![Settings card layout](/assets/screenshots/settings_titled_card.png) + +## Конфигурација модула + +### MQTT Module + +Bridges mesh messages to and from an MQTT broker for internet connectivity. This is how you extend your mesh beyond radio range or integrate with home automation systems. + +| Setting | Опис | +| --------------- | ------------------------------------------------------------------------ | +| Омогућено | Toggle MQTT bridge | +| Сервер | MQTT broker address | +| Корисничко име | Authentication username | +| Лозинка | Authentication password | +| Encryption | Encrypt MQTT payloads | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON support removed from firmware; field is ignored | +| TLS | Use secure connection | +| Корен тема | Base MQTT topic path | +| Извештај мапе | Publish position for public map | + +See [MQTT](mqtt) for a detailed usage guide including encryption, privacy, and broker setup. + +### Serial Module + +Enables serial port communication for external device integrations (GPS modules, sensors, or custom hardware). When enabled, the node's serial port can send and receive protobuf or text data, allowing external microcontrollers or computers to interact with the mesh. + +| Setting | Опис | +| ---------- | ------------------------------- | +| Омогућено | Activate serial communication | +| Ехо | Echo received serial data back | +| Мод | Text, Protobuf, or NMEA output | +| RX/TX Pins | GPIO pins for serial connection | +| Baud Rate | Serial communication speed | + +### External Notification Module + +Controls buzzer, LED, or vibration alerts on your radio hardware. Useful for devices that need to physically signal when a message arrives — particularly helpful for unattended or outdoor installations. + +| Setting | Опис | +| -------------------------------- | --------------------------- | +| Омогућено | Activate notifications | +| Alert Message | Notify on incoming messages | +| Alert Message Buzzer | Use buzzer for messages | +| Alert Message Vibra | Use vibration for messages | +| Alert Bell | Notify on bell character | +| Output (GPIO) | Pin for notification output | +| Активан | High or Low active | +| Duration (ms) | Notification length | +| Use I2S as Buzzer | Use I2S audio output | + +### Store & Forward Module + +Buffers messages for nodes that were temporarily offline, then replays them when those nodes reconnect. Essential for meshes where nodes go in and out of range regularly — ensures messages aren't lost during brief disconnections. + +| Setting | Опис | +| ------------------------------------------ | -------------------------- | +| Омогућено | Activate store and forward | +| Heartbeat (s) | Announcement interval | +| Records | Maximum stored messages | +| History Return (max) | Max messages to replay | +| History Return (window) | Time window for replay | + +> 💡 **Tip:** Store and Forward works best on nodes with ample memory (ESP32 with PSRAM). Router nodes are ideal candidates since they're typically always-on. + +### Range Test Module + +Automated range testing tool for evaluating link quality between nodes. When enabled, the node periodically transmits test messages with incrementing counters. A receiver node logs these messages, allowing you to walk or drive away and later analyze at what distance messages stopped arriving. + +| Setting | Опис | +| -------------------------------------- | --------------------------------- | +| Омогућено | Activate range testing | +| Sender Interval (s) | Time between test transmissions | +| Save CSV | Log received test data to SD card | + +### Telemetry Module + +Controls what telemetry data your node shares with the mesh. Telemetry includes device health (battery, uptime) and environmental sensor data (temperature, humidity, pressure). + +| Setting | Опис | +| ---------------------------- | --------------------------------------- | +| Device Metrics Interval | How often to report device metrics | +| Environment Metrics Interval | How often to report environment sensors | +| Air Quality Enabled | Report particulate sensor data | +| Power Metrics Enabled | Report power usage | + +See [Telemetry & Sensors](telemetry-and-sensors) for supported sensors and configuration recommendations. + +### Canned Message Module + +Pre-configured messages accessible from the device's physical buttons (for radios with rotary encoders, keypads, or similar input hardware). Define a list of quick-send messages that can be transmitted without a phone connected — ideal for field use. + +| Setting | Опис | +| ------------------ | ----------------------------------------------------------- | +| ~~Enabled~~ | ⚠️ **Deprecated** — current firmware may ignore this toggle | +| Поруке | Newline-separated list of messages | +| Пошаљи звоно | Play bell sound on send | +| Rotary Encoder | Enable rotary encoder input | +| Up/Down/Press Pins | GPIO pin assignments for input | + +### Audio Module + +Codec2 audio support for low-bandwidth voice communication over the mesh. This is an **experimental** feature that encodes voice into very small data packets using the Codec2 codec. + +| Setting | Опис | +| --------------- | -------------------------------- | +| Омогућено | Activate audio module | +| Codec2 Rate | Audio quality/bandwidth tradeoff | +| I2S Word Select | GPIO pin for I2S WS | +| I2S Data In | GPIO pin for I2S DIN | +| I2S Data Out | GPIO pin for I2S DOUT | + +> ⚠️ **Note:** Audio requires specific hardware (I2S microphone and speaker). Voice quality is very low-bandwidth — think "understandable radio voice," not phone-call quality. + +### Remote Hardware Module + +GPIO control over the mesh network. Allows a remote node to read or write GPIO pins on another node — useful for activating relays, reading switches, or controlling external hardware from a distance. + +| Setting | Опис | +| -------------------- | --------------------------------------------------------------- | +| Омогућено | Activate remote GPIO access | +| Allow Undefined Pins | Allow access to any GPIO pin (security risk) | + +> ⚠️ **Warning:** Enabling "Allow Undefined Pins" gives remote nodes access to all GPIO pins, which could interfere with the radio's own hardware. Only enable on dedicated GPIO nodes. + +### Neighbor Info Module + +Broadcasts information about directly heard neighbors, enabling mesh topology mapping. Each enabled node periodically shares a list of the other nodes it can hear and their signal quality. + +| Setting | Опис | +| -------------------------------------- | ------------------------------------ | +| Омогућено | Activate neighbor broadcasting | +| Update Interval (s) | How often to broadcast neighbor list | + +See [Discovery](discovery) for how to use neighbor data for mesh topology exploration. + +### Ambient Lighting Module + +Controls onboard NeoPixel or other addressable RGB LEDs on supported hardware. Can be used for visual status indicators, notification lights, or decorative effects. + +| Setting | Опис | +| ------------------ | ---------------------------------------------------------- | +| Омогућено | Activate LED control | +| LED статус | On, Off, or set specific color | +| Red / Green / Blue | Individual color channel values (0–255) | + +### Detection Sensor Module + +Turns your node into a motion or door sensor alert system. When a GPIO pin detects a state change (motion detected, door opened), the node broadcasts an alert message over the mesh. + +| Setting | Опис | +| ---------------------------------------- | ----------------------------------------------------------------------- | +| Омогућено | Activate detection sensor | +| Monitor Pin | GPIO pin connected to sensor | +| Detection Triggered High | Trigger when pin goes high (vs. low) | +| Minimum Broadcast (s) | Minimum time between alert broadcasts | +| State Broadcast (s) | Periodic state broadcast interval | +| Пошаљи звоно | Include bell character in alerts | +| Friendly Name | Custom name for this sensor | + +### Paxcounter Module + +People counter using WiFi and BLE probe requests. Counts nearby devices by passively listening for probe requests that phones and laptops emit when scanning for networks. Available only on ESP32 devices. + +| Setting | Опис | +| -------------------------------------- | -------------------------- | +| Омогућено | Activate people counting | +| Update Interval (s) | How often to report counts | + +> 💡 **Tip:** Paxcounter is useful for estimating foot traffic at trailheads, event venues, or other locations. Counts are approximate — one person may carry multiple devices. + +### TAK Module + +Team Awareness Kit integration for interoperability with ATAK and WinTAK. See [TAK Integration](tak) for detailed setup and usage. + +## Администрација + +### Удаљена администрација + +Remotely configure nodes that share your admin key: + +1. Select the target node in the node list. +2. Navigate to **Settings** for that node. +3. Modify configuration. +4. Tap **Save** — changes are sent over the mesh. + +> ⚠️ **Requires:** Admin key configured on both your node and the target node. + +### Clean Node Database + +Removes stale nodes from your local database that haven't been heard in a configurable time window. + +### Ресетовање на фабричка подешавања + +Resets all settings to factory defaults. **This cannot be undone.** + +### Поновно покретање + +Remotely reboot a connected or administered node. + +### Панел за отклањање грешака + +View detailed diagnostic information: + +- Protocol buffers debug output +- Mesh packet log +- Connection state details + +### Troubleshooting Remote Admin + +- **"No response from target node"** — the target may be out of range, offline, or have a mismatched admin key. Verify the admin key matches on both nodes. +- **Changes not applying** — some settings require a reboot to take effect. Try the Reboot action after saving. +- **Can't see remote settings** — ensure your node has the admin key for the target node and that Admin Channel is enabled in Security Config. + +## Related Topics + +- [Settings — Radio & User](settings-radio-user) — core radio and user profile settings +- [Module configuration reference](https://meshtastic.org/docs/configuration/module) — detailed module docs on meshtastic.org +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/srp/user/settings-radio-user.md b/docs/srp/user/settings-radio-user.md new file mode 100644 index 000000000..51d4a4b85 --- /dev/null +++ b/docs/srp/user/settings-radio-user.md @@ -0,0 +1,173 @@ +--- +title: Settings — Radio & User +nav_order: 7 +last_updated: 2026-05-13 +description: Configure your radio hardware, LoRa presets, user profile, position sharing, power management, and security. +aliases: + - подешавања + - radio-config + - user-config + - lora +--- + +# Settings — Radio & User + +Configure your radio hardware and user identity parameters. + +## User Settings + +### User Profile + +| Setting | Опис | +| -------------------- | ------------------------------------------------------------------------------------- | +| Дуго име | Your display name (up to 39 characters) | +| Кратко име | 4-character abbreviated name | +| Лиценцирани оператор | Enable if you hold an amateur radio license (enables higher power) | + +### Applying Changes + +After modifying settings, tap **Save** to write the configuration to your radio. The device may reboot to apply changes. + +## Конфигурација радио уређаја + +### Подешавања уређаја + +| Setting | Опис | Подразумевано | +| ------------------------------------------ | ----------------------------------------------------------------------- | ------------- | +| Улога | Node behavior (Client, Router, etc.) | Клијент | +| Режим реемитовања | How the node retransmits messages | Сви | +| Node Info Broadcast (s) | Interval for broadcasting node info | 10800 | +| Double-tap Button | Action for double-tap button press | Онемогућено | + +### LoRA подешавања + +| Setting | Опис | Подразумевано | +| ----------------- | ----------------------------------------------------------------------- | ----------------------------------------- | +| Регион | Regulatory region for frequency bands | Unset (must configure) | +| Modem Preset | Speed/range tradeoff | LongFast | +| Hop Limit | Maximum retransmit hops | 3 | +| TX Power | Transmission power (dBm); 0 = max allowed for region | 0 (region max) | +| Frequency Offset | Fine-tune frequency (MHz) | 0 | +| Channel Bandwidth | Bandwidth setting | Default for preset | + +> ⚠️ **Important:** You **must** set your region before transmitting. Operating without the correct region may violate local radio regulations. See the [region configuration guide](https://meshtastic.org/docs/getting-started/initial-config) on meshtastic.org for details. + +### Modem Presets + +| Preset | Range | Брзина | SNR Limit | Best For | +| ------------------ | ----------------------- | ------------------------- | ------------------------ | -------------------------------------------------------------------------------------------------------- | +| Short Turbo | ~1 km | 21.9 kbps | −5 dB | Dense urban with line-of-sight; data-heavy applications | +| Short Fast | ~3 km | 10.9 kbps | −7.5 dB | Urban neighborhoods; buildings within a few blocks | +| Short Slow | ~5 km | 5.5 kbps | −10 dB | Suburban short-range; moderate building density | +| Medium Fast | ~5 km | 5.5 kbps | −10 dB | Suburban areas; moderate building density | +| Medium Slow | ~8 km | 1.1 kbps | −12.5 dB | Suburban/rural; moderate range with slower speed | +| Long Turbo | ~10 km | 4.4 kbps | −10 dB | Similar range to Long Fast but with 500 kHz bandwidth; faster throughput | +| Long Fast | ~10 km | 1.1 kbps | −12.5 dB | **General use (default)** — balanced range and speed | +| Long Moderate | ~20 km | 0.34 kbps | −15 dB | Rural with some terrain; occasional use | +| Lite Fast | ~5 km | 5.5 kbps | −10 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Medium Fast | +| Lite Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Long Fast | +| Narrow Fast | ~5 km | 2.7 kbps | −10 dB | EU 868 MHz band (62.5 kHz BW); avoids interference with other devices | +| Narrow Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 868 MHz band (62.5 kHz BW); comparable to Long Fast | +| ~~Long Slow~~ | ~30 km | 0.18 kbps | −17.5 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | +| ~~Very Long Slow~~ | ~40+ km | 0.09 kbps | −20 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | + +#### Choosing a Modem Preset + +The modem preset controls the fundamental tradeoff between **range** and **data rate**: + +- **Slower presets** use more spreading, making signals decodable at weaker signal levels (lower SNR limit). This means longer range but fewer bytes per second. +- **Faster presets** pack more data per transmission but require a stronger signal to decode. + +**Practical guidance:** + +- **Urban mesh (many nodes, short distances):** Use **Long Fast** (default) or **Short Fast**. Higher speed means less airtime congestion when many nodes share the channel. +- **Rural/sparse mesh (few nodes, long distances):** Use **Long Moderate**. Range matters more than speed when nodes are far apart. +- **EU 866/868 MHz regulatory compliance:** Use **Lite Fast**, **Lite Slow**, **Narrow Fast**, or **Narrow Slow** — these are optimized for the EU SRD/868 MHz bands with narrower bandwidths. +- **Fixed infrastructure links:** Use **Short Turbo** or **Long Turbo** for dedicated point-to-point links with good antennas and line-of-sight. +- **Mixed environments:** Stick with **Long Fast** — it's the community default and ensures compatibility with others in your area. + +> ⚠️ **Important:** All nodes on the same channel **must** use the same modem preset. Nodes with mismatched presets cannot communicate even if they share the same frequency and encryption key. + +> 💡 **Tip:** The range estimates above assume flat terrain and modest antennas. Elevation advantage (hilltop, rooftop) dramatically increases effective range. A well-placed Router with Long Fast can often outperform a ground-level node with Long Slow. + +### Подешавања приказа + +| Setting | Опис | +| ------------------- | ------------------------------------------------------------------------------------ | +| Screen Timeout | Time before display sleeps | +| Јединице приказа | Metric or Imperial | +| Тип OLED-а | Auto, SSD1306, SH1106, SH1107 | +| Compass Orientation | Rotation offset for compass display (0°, 90°, 180°, 270°) | +| ~~Compass North~~ | ⚠️ **Deprecated** — replaced by Compass Orientation; still visible in older firmware | + +### Подешавања позиције + +| Setting | Опис | +| ----------------------------------------- | ---------------------------------- | +| GPS Enabled | Enable/disable GPS | +| GPS Update Interval | How often to acquire GPS fix | +| Position Broadcast (s) | How often to share position | +| Паметно позиционирање | Enable movement-based broadcasting | +| Фиксна локација | Use a manually set position | + +### Подешавања напајња + +| Setting | Опис | +| --------------------------------------- | --------------------------------------- | +| Уштеда енергије | Enable low-power sleep mode | +| Shutdown After (s) | Auto-shutdown idle timer | +| ADC Multiplier | Battery voltage calibration factor | +| Wait Bluetooth (s) | Time to wait for BLE connection at boot | +| Mesh SDS Timeout (s) | Super-deep-sleep timeout | + +### Конфигурација мреже + +| Setting | Опис | +| ------------- | ---------------------------------------------------- | +| WiFi Enabled | Enable WiFi radio (ESP32 devices) | +| WiFi SSID | Network name to connect to | +| WiFi PSK | Network password | +| NTP Server | Time synchronization server | +| Syslog Server | Remote logging server | + +![IP address field](/assets/screenshots/settings_ipv4_field.png) + +### Блутут подешавања + +| Setting | Опис | +| ----------------- | ------------------------------------------------------------------------- | +| Bluetooth Enabled | Enable/disable BLE radio | +| Мод упаривања | Fixed PIN, Random PIN, or No PIN | +| Fixed PIN | PIN code for pairing (default: 123456) | + +### Сигурносна подешавања + +| Setting | Опис | +| --------------------- | -------------------------------------------------------------------------- | +| Јавни кључ | Your node's public key (read-only) | +| Admin Key | Key for remote administration | +| Приватни кључ | Your node's private key (handle securely) | +| Admin Channel Enabled | Allow admin commands via channel | +| Debug Log | Output live debug logging over serial/bluetooth | +| Serial Enabled | Enable serial console access (moved from Device Config) | +| Managed Mode | Restrict non-admin channel changes | + +![Password field](/assets/screenshots/settings_password_field.png) + +Settings use standard preference controls — dropdowns, toggles, and sliders: + +| Control | Screenshot | +| -------- | ------------------------------------------------------ | +| Dropdown | ![Dropdown](/assets/screenshots/settings_dropdown.png) | +| Toggle | ![Toggle](/assets/screenshots/settings_switch.png) | +| Slider | ![Slider](/assets/screenshots/settings_slider.png) | + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — optional feature modules and device administration +- [Signal Meter](signal-meter) — how modem presets affect signal quality thresholds +- [LoRa configuration](https://meshtastic.org/docs/configuration/radio/lora) — detailed LoRa settings reference on meshtastic.org +- [Initial configuration](https://meshtastic.org/docs/getting-started/initial-config) — region setup guide on meshtastic.org + +--- + diff --git a/docs/srp/user/signal-meter.md b/docs/srp/user/signal-meter.md new file mode 100644 index 000000000..2204b907a --- /dev/null +++ b/docs/srp/user/signal-meter.md @@ -0,0 +1,81 @@ +--- +title: How the Meshtastic Signal Meter Works +nav_order: 15 +last_updated: 2026-05-13 +description: How the signal meter calculates quality from RSSI and SNR — LoRa spread spectrum, presets, and what the bars really mean. +aliases: + - signal + - signal-meter + - snr + - rssi +--- + +# How the Meshtastic Signal Meter Works + +The Meshtastic signal meter — the familiar bars or status color in the app — is calculated very differently than the "bars" on a traditional cell phone or Wi-Fi router. + +Most consumer devices simply measure how "loud" a signal is. However, because Meshtastic uses **LoRa (Long Range)** technology, its signal meter measures how **clear** the signal is, relative to the specific settings your mesh is using. + +--- + +## 1. The Two Metrics: "Loudness" vs. "Clarity" + +Every time the LoRa radio chip receives a message, it reports two measurements: + +- **RSSI (Received Signal Strength Indicator):** The **loudness** of the raw power hitting your antenna. +- **SNR (Signal-to-Noise Ratio):** The **clarity** of the signal compared to the background static. + +> **Tip — The Analogy:** Imagine you are trying to hear a friend talking to you. +> +> - **RSSI** is how loud their voice is. +> - **The Noise Floor** is the background noise in the room (air conditioning, other people talking, traffic). +> - **SNR** is how easily you can distinguish your friend's voice from the background noise. + +If your friend shouts at you at a deafening rock concert, the signal is incredibly loud (High RSSI), but you still can't understand them because the background noise is louder (Bad SNR). Conversely, if your friend whispers to you in a dead-silent library, the signal is very weak (Low RSSI), but you can understand them perfectly (Great SNR). + +--- + +## 2. The Magic of LoRa: Hearing "Below the Noise Floor" + +For standard radios (like FM or Wi-Fi), if the background noise is louder than the signal (a negative SNR), the receiver just hears static. + +LoRa is special. It uses **"Spread Spectrum"** modulation, which allows the radio to mathematically pull a signal out of the air even when it is buried deep _underneath_ the background noise. This is why you will frequently see **negative SNR numbers** in Meshtastic (e.g., -10 dB, which means the signal is 10 decibels weaker than the background static). + +Depending on which Meshtastic preset you are using (e.g., `LongFast` vs. `ShortFast`), the radio has a specific **SNR Limit** — the absolute maximum amount of noise it can tolerate before the message is completely lost to the static. + +--- + +## 3. How the Signal Meter Calculates Quality + +The Meshtastic apps take both RSSI and SNR and run them through a specific formula to assign your signal a quality rating (None, Bad, Fair, or Good). It specifically scales these values based on the physical limits of the radio preset you are using. + +Here is exactly how the app decides how many bars (or what color) to show you: + +| Ниво | Bars | Criteria | Meaning | +| ---------- | ---- | ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | +| Добро | 3 | RSSI better than `-115 dBm` **AND** SNR better than `-7 dB` | Signal is both loud and clear — healthy connection. | +| Прихватљив | 2 | RSSI better than `-126 dBm` with good SNR, **OR** SNR better than `-15 dB` with good RSSI | Signal getting quieter or noisier, but still decodable. | +| Лош | 1 | Falls between Fair and None thresholds | At the edge of range or experiencing interference. | +| Ништа | 0 | RSSI worse than `-126 dBm` **AND** SNR worse than `-15 dB` | Transmission completely buried in noise. | + +--- + +## 4. What This Means for You + +Because Meshtastic's meter acts as a **"Clarity Meter"**, it behaves differently than what most people expect: + +> **Tip — Don't panic over low RSSI:** You might see a seemingly terrible RSSI value like `-118 dBm`. On a cell phone, you would have zero bars. But if you have an SNR of `+2 dB`, Meshtastic will still show a strong signal! _The library is quiet, so the whisper is heard perfectly._ + +> **Warning — Watch out for local noise:** If you hook up a massive antenna and see a great RSSI (e.g., `-90 dBm`) but your signal meter is only showing **1 Bar (Bad)**, you have a problem. It means you have local interference — perhaps a cheap power supply, a noisy computer, or a nearby radio tower — creating so much static that it is drowning out your mesh. + +## Where Signal Information Appears + +In the app, signal data is shown in several places: + +- **Node list** — signal bars icon next to each node +- **Node detail** — SNR, RSSI, and signal quality in the device metrics section +- **Traceroute** — per-hop signal quality for each relay node +- **Signal metrics** — historical SNR and RSSI data in the metrics charts + +![Node entry showing SNR, RSSI values and colored signal bars](/assets/screenshots/nodes_signal_info.png) + diff --git a/docs/srp/user/tak.md b/docs/srp/user/tak.md new file mode 100644 index 000000000..5544856ef --- /dev/null +++ b/docs/srp/user/tak.md @@ -0,0 +1,126 @@ +--- +title: TAK Integration +nav_order: 10 +last_updated: 2026-05-13 +description: Interoperate with ATAK and WinTAK — CoT position sharing, TAK roles, and plugin setup. +aliases: + - tak + - atak + - team-awareness-kit +--- + +# TAK Integration + +Meshtastic integrates with the Team Awareness Kit (TAK) ecosystem, enabling interoperability between Meshtastic mesh devices and TAK applications like ATAK and WinTAK. + +## Overview + +The TAK module allows Meshtastic nodes to: + +- Share position data in TAK-compatible CoT (Cursor on Target) format +- Appear as team members on TAK map displays +- Receive TAK PLI (Position Location Information) messages + +## Setup + +### Prerequisites + +- ATAK (Android Team Awareness Kit) or WinTAK installed +- Meshtastic ATAK Plugin installed +- TAK module enabled on your Meshtastic radio + +### Configuration + +1. Navigate to **Settings → Module Config → TAK**. +2. Enable the TAK module. +3. Configure the TAK team/group settings: + +![Module toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | Опис | +| --------- | -------------------------- | +| Омогућено | Activate TAK interop | +| Мод | TAK-compatible output mode | + +### ATAK Plugin Setup + +1. Install the Meshtastic ATAK Plugin from the plugin repository. +2. Open ATAK and enable the Meshtastic plugin. +3. The plugin bridges messages between ATAK and your mesh network. + +## TAK Roles + +Nodes configured with TAK-related roles behave differently from standard clients: + +| Улога | Опис | +| --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **TAK** | Full TAK interoperability — sends and receives CoT data, chat messages, and PLI updates. Functions as a standard client plus TAK bridge. | +| **TAK Tracker** | Position-only TAK output — automatically broadcasts PLI at regular intervals without user interaction. Optimized for unattended position beacons (vehicles, equipment, waypoints). Does not relay chat messages. | + +> 💡 **Tip:** Use **TAK Tracker** for devices that only need to report position (e.g., a radio mounted in a vehicle). Use **TAK** for devices where users actively participate in TAK operations. + +### CoT (Cursor on Target) Format + +TAK messages use the Cursor on Target XML format — a military standard for sharing situational awareness data. Meshtastic converts its internal protobuf messages to CoT format when bridging to TAK systems, so no manual format conversion is needed. + +## TAK Identity + +When using TAK roles, your node broadcasts identity information that appears on TAK maps: + +| Setting | Опис | +| -------- | ---------------------------------------------------------------------------------------------------------------- | +| Team | Your team color on the TAK map (e.g., Blue, Red, Cyan, Green) | +| Улога | Your operational role (Team Member, Team Lead, HQ, Medic, RTO, etc.) | +| Callsign | Your TAK callsign (defaults to your Meshtastic long name) | + +These settings appear in **Settings → Module Config → TAK** when the TAK module is enabled. + +> 💡 **Tip:** Team/role colors are the standard TAK affiliation colors. Coordinate with your TAK team to use consistent team assignments. + +## Wire Format (V1 / V2) + +Meshtastic supports two TAK wire formats: + +| Format | Compatibility | Features | +| ------------------------------- | --------------------------------------------------------------- | --------------------------------------------------------- | +| V1 (Legacy) | ATAK Plugin v1.x, older firmware | Basic CoT position sharing only | +| V2 (Current) | ATAK Plugin v2.x, firmware 2.3+ | Full CoT support including chat, routes, zstd compression | + +The app automatically selects V2 when both sides support it. No manual configuration needed — the TAK module negotiates format based on firmware capabilities. + +## Usage with ATAK + +Once configured: + +- Meshtastic nodes appear as markers on the ATAK map with callsign labels +- Chat messages can bridge between mesh and TAK networks +- Position updates flow bidirectionally between Meshtastic and TAK +- TAK Tracker nodes broadcast PLI automatically — their positions appear on ATAK maps without any ATAK-side configuration + +> ⚠️ **Note:** TAK integration requires specific node roles and module configuration. Standard client nodes don't automatically participate in TAK operations. + +## Troubleshooting + +| Problem | Cause | Solution | +| -------------------------------- | ------------------------------------- | ----------------------------------------------------------------------- | +| Node doesn't appear on ATAK map | TAK module disabled or wrong role | Verify TAK module is enabled and node role is TAK or TAK Tracker | +| Position updates are stale | GPS fix lost or interval too long | Check GPS status; reduce position broadcast interval in Position Config | +| ATAK plugin shows "disconnected" | BLE connection lost or plugin crashed | Reconnect Bluetooth in Meshtastic app, then restart ATAK plugin | +| Chat messages not bridging | V1 format doesn't support chat | Ensure both nodes run firmware 2.3+ for V2 wire format | +| CoT data not flowing | Channel mismatch | All TAK nodes must be on the same channel with matching encryption | + +## Security Considerations + +- TAK data shares your position and callsign information +- Ensure your channel encryption is configured when using TAK in sensitive environments +- The TAK module respects the same channel encryption as other Meshtastic messages + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — TAK module configuration +- [Nodes](nodes) — TAK and TAK Tracker roles in the node list +- [Map & Waypoints](map-and-waypoints) — node positions on the map +- [ATAK plugin guide](https://meshtastic.org/docs/software/integrations/atak-plugin) — detailed ATAK setup on meshtastic.org + +--- + diff --git a/docs/srp/user/telemetry-and-sensors.md b/docs/srp/user/telemetry-and-sensors.md new file mode 100644 index 000000000..47a98a875 --- /dev/null +++ b/docs/srp/user/telemetry-and-sensors.md @@ -0,0 +1,118 @@ +--- +title: Telemetry & Sensors +nav_order: 9 +last_updated: 2026-05-13 +description: Sensor data on the mesh — supported environment, air quality, and power sensors, plus configuration and viewing guides. +aliases: + - sensors + - окружење + - weather + - power-metrics +--- + +# Telemetry & Sensors + +Meshtastic nodes can collect and share sensor data across the mesh network. + +## Overview + +Telemetry allows nodes equipped with sensors to broadcast environmental, power, and device health information. This data is visible on the node detail screen and can be logged over time. + +## Device Telemetry + +All Meshtastic nodes report basic device telemetry: + +| Метрика | Опис | Typical Range | +| -------------------- | ------------------------------ | ------------------------------------------------------------------ | +| Ниво батерије | Charge percentage | 0–100% | +| Напон | Battery voltage | 3.0–4.2V (LiPo) | +| Искоришћеност канала | % of airtime used locally | 0–100% | +| Air Utilization TX | % of airtime used by this node | 0–100% | +| Време рада | Seconds since last boot | Varies | + +## Environment Sensors + +Supported environmental sensors: + +### Temperature & Humidity + +| Сензор | Температура | Влажност | Pressure | Белешке | +| ------- | ----------- | -------- | -------- | ----------------------- | +| BME280 | ✓ | ✓ | ✓ | Recommended all-in-one | +| BME680 | ✓ | ✓ | ✓ | Adds gas resistance/IAQ | +| SHT31 | ✓ | ✓ | — | High accuracy | +| MCP9808 | ✓ | — | — | Precision temperature | +| LPS22 | — | — | ✓ | Pressure only | + +### Air Quality + +| Сензор | Метрика | Белешке | +| -------- | -------------------------------------------------- | -------------------------- | +| BME680 | Gas Resistance / IAQ | Volatile organic compounds | +| PMSA003I | PM1.0, PM2.5, PM10 | Particulate matter | +| SEN55 | PM, NOx, VOC, Temp, Humidity | Multi-sensor | + +### Light & UV + +| Сензор | Метрика | +| -------- | -------------------------------------- | +| OPT3001 | Ambient light (lux) | +| VEML7700 | Ambient light (lux) | +| LTR390 | UV index | + +## Мерни подаци о снази + +Nodes with INA-series power sensors can report: + +| Метрика | Опис | +| ----------- | ----------------------------------------- | +| Bus Voltage | Supply rail voltage | +| Струја | Power consumption (mA) | +| Снага | Calculated power (mW) | + +Useful for monitoring solar charging or battery health on remote nodes. + +## Configuring Telemetry + +1. Navigate to **Settings → Module Config → Telemetry**. +2. Set reporting intervals: + - **Device Metrics Interval** — how often to broadcast device metrics + - **Environment Metrics Interval** — how often to broadcast sensor data +3. Enable specific sensor types as needed. + +### Recommended Intervals + +| Use Case | Device (s) | Environment (s) | +| ------------------------------------------ | ----------------------------- | ---------------------------------- | +| Urban mesh (many nodes) | 3600 | 3600 | +| Rural mesh (few nodes) | 900 | 900 | +| Weather station | 900 | 300 | +| Battery conservation | 7200 | 7200 | + +> ⚠️ **Note:** Shorter intervals increase airtime usage and battery drain across the mesh. + +## Viewing Telemetry + +1. Navigate to **Nodes** and select a node. +2. Telemetry sections show on the detail screen: + - Device Metrics (always available) + - Environment Metrics (if sensors present) + - Power Metrics (if INA sensor present) +3. Historical graphs show trends over time. + +![Telemetry actions](/assets/screenshots/node-metrics_telemetric_actions.png) + +## Troubleshooting + +- **No environment data showing?** The remote node needs a physical sensor connected (e.g., BME280 on I2C). Device telemetry (battery, uptime) is always available, but environment metrics require hardware. +- **Stale readings?** Check the reporting interval — very long intervals (7200s+) mean data updates infrequently. Also verify the remote node is still online. +- **Sensor conflict on I2C bus?** Some sensors share I2C addresses. If you have multiple sensors on the same bus, check for address collisions in the radio's serial debug output. + +## Related Topics + +- [Node Metrics](node-metrics) — view telemetry data on the node detail screen +- [Settings — Modules & Admin](settings-module-admin) — telemetry module configuration +- [Units & Locale](units-and-locale) — temperature and pressure display units + +--- + diff --git a/docs/srp/user/translate.md b/docs/srp/user/translate.md new file mode 100644 index 000000000..7914d6092 --- /dev/null +++ b/docs/srp/user/translate.md @@ -0,0 +1,97 @@ +--- +title: Translate the App +parent: User Guide +nav_order: 17 +last_updated: 2026-05-13 +aliases: + - translate + - crowdin + - localization +--- + +# Translate the App + +Contributing translations helps make Meshtastic accessible to a wider audience. The app uses [Crowdin](https://crowdin.com/) to manage community translations for both the user interface and in-app documentation. + +--- + +## What Gets Translated + +| Resource | Source Location | Белешке | +| ----------------- | ------------------------------------- | ---------------------------------------------------------------------- | +| UI strings | `composeResources/values/strings.xml` | Buttons, labels, messages, and all user-visible text | +| User Guide pages | `docs/user/*.md` | In-app documentation shown in Help & Documentation | +| Fastlane metadata | `fastlane/metadata/android/en-US/` | App Store listing title, description, and changelogs | + +> **Note — Developer Guide pages are English-only.** Code-focused documentation targeting contributors is not translated. + +--- + +## How to Contribute + +1. **Visit the Crowdin project.** Open the [Meshtastic Android Crowdin project](https://crowdin.com/project/meshtastic-android) and sign in or create a free account. +2. **Choose your language.** Select an existing language or request a new one by opening a [GitHub issue](https://github.com/meshtastic/Meshtastic-Android/issues/new). +3. **Translate strings.** Crowdin shows the English source on the left and your translation on the right. Translate each string and save. +4. **Review context.** Many strings include screenshots or context comments — check these to understand where the text appears in the app. +5. **Submit.** Approved translations are automatically merged into the next release. + +> **Tip — Keep translations short.** UI strings often appear in buttons, chips, or narrow columns. If a translation is significantly longer than the English original, consider abbreviating where the meaning stays clear. + +--- + +## Adding a New Language + +If your language is not yet listed on Crowdin: + +1. Open an issue on [GitHub](https://github.com/meshtastic/Meshtastic-Android/issues/new) requesting the new locale. +2. A maintainer will add the language to Crowdin and configure `crowdin.yml`. +3. Once added, you can begin translating immediately. + +--- + +## How Translations Are Organized + +The Android app uses **Compose Multiplatform resources** for all user-visible strings: + +``` +core/resources/src/commonMain/composeResources/ +├── values/ ← English (default) +│ └── strings.xml +├── values-de/ ← German +│ └── strings.xml +├── values-fr/ ← French +│ └── strings.xml +└── ... +``` + +In-app documentation follows a similar pattern under `docs/`: + +``` +docs/ +├── user/ ← English source (default) +│ ├── onboarding.md +│ └── ... +├── fr/user/ ← French translations +│ ├── onboarding.md +│ └── ... +└── ... +``` + +The app automatically selects the correct locale based on your device's **Language & Region** settings. + +--- + +## Translation Guidelines + +- **Do not translate** technical terms like "LoRa", "MQTT", "BLE", "TAK", "SNR", or "RSSI" — these are universal. +- **Keep placeholders intact.** Strings like `%1$s` or `%d` are filled in at runtime. Do not remove or reorder them unless the grammar of your language requires it. +- **Match tone.** The app uses a friendly, direct voice. Avoid overly formal language. +- **Test if possible.** Switch your device language and open the app to see how translations look in context. + +--- + +## Questions? + +If you have questions about a specific string's context or need help getting started, open a discussion on the [Meshtastic GitHub Discussions](https://github.com/meshtastic/Meshtastic-Android/discussions) page. + +Thank you for helping expand the reach of Meshtastic! diff --git a/docs/srp/user/units-and-locale.md b/docs/srp/user/units-and-locale.md new file mode 100644 index 000000000..add5204e3 --- /dev/null +++ b/docs/srp/user/units-and-locale.md @@ -0,0 +1,118 @@ +--- +title: Units, Measurement & Locale +parent: User Guide +nav_order: 16 +last_updated: 2026-05-12 +--- + +# Units, Measurement & Locale + +The Meshtastic app automatically displays temperatures, distances, speeds, and times in the units your device is configured to use — no settings to change inside the app. + +--- + +## How It Works + +Meshtastic radios always transmit data in **metric units** (meters, °C, km/h, hPa, etc.). When the app receives this data, it uses the `MetricFormatter` utility to convert and display values in whatever unit system your device's locale specifies. + +On Android, your measurement preferences are determined by your system **Language & Region** settings. On Desktop (JVM), the app uses the JVM's default `Locale`. + +> **Tip — You never need to toggle units inside the app.** Change your system measurement preferences and every screen in Meshtastic updates automatically — node details, telemetry charts, weather, altitude, and more. + +--- + +## Температура + +Temperature values from environment sensors are transmitted as **°C** and displayed based on your device's temperature unit preference. + +![Environment metrics with temperature](/assets/screenshots/nodes_environment_metrics.png) + +| Your Setting | You See | +| ------------ | ------- | +| Celsius | 22°C | +| Fahrenheit | 72°F | + +This affects all temperature displays throughout the app: node environment telemetry, soil temperature, dew point, and telemetry chart axes. + +## Distance & Altitude + +Distances between nodes and GPS altitudes are transmitted as **meters** and automatically scaled and converted. + +![Distance info display](/assets/screenshots/nodes_distance_info.png) + +| Your Setting | Small Distance | Large Distance | Висина | +| -------------------------------- | -------------- | ---------------------- | -------- | +| Метрика | 350 m | 2.5 km | 1,200 m | +| Imperial (US) | 1,148 ft | 1.6 mi | 3,937 ft | + +The app uses natural scaling — short distances stay in meters or feet, while longer distances switch to kilometres or miles automatically. + +### Where these appear + +- **Node list** — distance and bearing to each node +- **Node detail** — altitude, distance from your position +- **Map** — waypoint distances, traceroute hop distances +- **Compass** — distance to selected node + +## Брзина + +GPS ground speed is displayed in your locale's preferred speed unit. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Метрика | 12 km/h | +| Imperial (US) | 7 mph | + +## Wind + +Wind speed and gust data from environment sensors are transmitted as **m/s** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Метрика | 5 m/s | +| Imperial (US) | 11 mph | + +Wind readings appear in the **Node Detail** environment section and the **Environment Telemetry** charts. + +## Rainfall + +Rainfall measurements (1-hour and 24-hour totals) are transmitted as **mm** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ---------------------- | +| Метрика | 12 mm | +| Imperial (US) | 0.5 in | + +## Units That Never Change + +Some units are international standards and are displayed the same way regardless of your locale: + +| Measurement | Unit | Why | +| -------------------------------- | ------------------------------ | ------------------------------------- | +| Barometric pressure | hPa | International meteorological standard | +| Heading / bearing | ° (degrees) | Universal navigation convention | +| Radiation | μR/hr | Standard dosimetry unit | +| GPS coordinates | decimal degrees | Universal geographic standard | +| Humidity, battery, soil moisture | % | Universal | + +## Date & Time + +All timestamps throughout the app — last heard, message times, telemetry logs, chart axes — follow your device's date and time preferences. + +| Setting | What It Controls | Example | +| ---------------- | ---------------- | ------------------------------------------------ | +| **24-Hour Time** | Clock format | 14:30 vs 2:30 PM | +| **Date Format** | Date ordering | 09/05/2026 vs 05/09/2026 | + +The app also uses **relative time** where it makes sense — for example, "5 min ago" or "2 hours ago" in the node list — which is automatically localised into your device language. + +## Changing Your Measurement System (Android) + +On Android, your measurement system (metric vs imperial) is tied to your region setting: + +1. Open **Android Settings → System → Language & Region** +2. Change your **Region** or **Measurement units** preference +3. Return to Meshtastic — values update immediately + +> **Tip — The app uses `MetricFormatter` from `core:common`.** All measurement formatting is handled by a shared KMP utility that respects your platform's locale. Developers adding new measurement displays should use `MetricFormatter` rather than hard-coding unit conversions. + diff --git a/docs/sv-rSE/index.md b/docs/sv-rSE/index.md new file mode 100644 index 000000000..1cb34b05a --- /dev/null +++ b/docs/sv-rSE/index.md @@ -0,0 +1,30 @@ +--- +title: Home +layout: default +nav_order: 0 +--- + +# Meshtastic Android App Documentation + +User and developer documentation for the Meshtastic Android, Desktop, and iOS applications powered by KMP (Kotlin Multiplatform). + +Use the sidebar navigation to browse the **User Guide** for app features and the **Developer Guide** for contributing to the project. + +--- + +## Quick Links + +| Guide | Beskrivning | +| --------------------------------------------------------------------- | -------------------------------------------------------------- | +| [Getting Started](user/onboarding) | Connect your first radio and send a message | +| [Messages & Channels](user/messages-and-channels) | Channel broadcasts, direct messages, reactions, and encryption | +| [Nodes](user/nodes) | Understanding the mesh network node list | +| [Signal Meter](user/signal-meter) | How the LoRa signal quality meter works | +| [Units & Locale](user/units-and-locale) | How temperatures, distances, and times adapt to your region | +| [Desktop App](user/desktop) | Linux, macOS, and Windows desktop usage | +| [Architecture](developer/architecture) | App architecture overview for contributors | +| [Contributing](developer/contributing) | Branch naming, PR workflow, and verification commands | + +--- + +> This documentation is served from the same markdown source that powers the in-app **Help & Documentation** browser. diff --git a/docs/sv-rSE/user/connections.md b/docs/sv-rSE/user/connections.md new file mode 100644 index 000000000..e445825a0 --- /dev/null +++ b/docs/sv-rSE/user/connections.md @@ -0,0 +1,125 @@ +--- +title: Connections +nav_order: 2 +last_updated: 2026-05-13 +description: Connect your phone or desktop to a Meshtastic radio via Bluetooth, USB, or TCP/IP. +aliases: + - bluetooth + - usb + - tcp + - pairing +--- + +# Connections + +Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node. + +## Bluetooth (BLE) + +Bluetooth Low Energy is the default and most common connection method on Android. + +### Pairing a Device + +1. Ensure your Meshtastic radio is powered on and in pairing mode. +2. Open the app and navigate to **Connections**. +3. Tap **Scan for Devices** — nearby Meshtastic radios will appear. +4. Select your device from the list. +5. Accept the Bluetooth pairing prompt if shown. + +![Device list item](/assets/screenshots/connections_bluetooth_scan.png) + +You can filter devices by transport type using the filter chips at the top: + +![Transport filter chips](/assets/screenshots/connections_transport_filters.png) + +> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. + +### Connection Status + +| Icon | State | Beskrivning | +| ---- | -------------- | ----------------------------- | +| 🟢 | Ansluten | Active radio link established | +| 🟡 | Ansluter | Handshake in progress | +| 🔴 | Frånkopplad | No active connection | +| ⚪ | Not configured | Ingen enhet vald | + +When connecting, a status indicator shows the current connection state: + +![Connecting status](/assets/screenshots/connections_connecting.png) + +If no devices are found, the app shows an empty state with instructions: + +![No devices found](/assets/screenshots/connections_empty_state.png) + +### Troubleshooting Bluetooth + +- **Device not found:** Toggle Bluetooth off/on, ensure location is enabled. +- **Connection drops:** Move closer to the radio; check for interference. +- **Pairing rejected:** Forget the device in Android Bluetooth settings and retry. + +## USB Serial + +USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable. + +### Setup + +1. Connect your radio via USB cable to your device. +2. The app will prompt for USB permission — tap **Allow**. +3. The connection is established automatically. + +> ⚠️ **Note:** USB connections require OTG support on Android devices. + +## TCP/IP (WiFi) + +Some Meshtastic radios support WiFi connectivity, allowing TCP-based connections. + +### Konfiguration + +1. Connect your radio to a WiFi network via the radio's web interface or settings. +2. In the app, go to **Connections → TCP**. +3. Enter the radio's IP address and port (default: 4403). +4. Tap **Connect**. + +![WiFi scanning for devices](/assets/screenshots/connections_wifi_scanning.png) + +When a device is found, it appears in the connection list: + +![WiFi device found](/assets/screenshots/connections_wifi_device_found.png) + +A successful connection is confirmed with a status indicator: + +![WiFi connection success](/assets/screenshots/connections_wifi_success.png) + +### When to Use TCP + +- Radio is on the same local network +- Testing with a simulated radio +- Environments where Bluetooth has interference issues + +## Reconnection Behavior + +The app reconnects to the **last selected device** on startup. You can manually switch transports from the connections screen at any time. + +To disconnect from a radio, use the disconnect button on the connections screen: + +![Disconnect from radio](/assets/screenshots/connections_disconnect.png) + +## Desktop Connections + +On Desktop (Linux/macOS/Windows), the app supports: + +- **Bluetooth (BLE)** — via the Kable library; works on macOS, Linux, and Windows +- **USB Serial** — primary wired connection method +- **TCP/IP** — for network-connected radios + +See [Desktop App](desktop) for platform-specific details and keyboard shortcuts. + +## Related Topics + +- [Getting Started](onboarding) — first-launch setup and permissions +- [Settings — Radio & User](settings-radio-user) — Bluetooth and network configuration +- [Desktop App](desktop) — desktop-specific connection details +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — full list of compatible radios on meshtastic.org + +--- + diff --git a/docs/sv-rSE/user/desktop.md b/docs/sv-rSE/user/desktop.md new file mode 100644 index 000000000..f43f5f958 --- /dev/null +++ b/docs/sv-rSE/user/desktop.md @@ -0,0 +1,147 @@ +--- +title: Desktop App +nav_order: 14 +last_updated: 2026-05-13 +description: Install and use the Meshtastic Desktop app on Linux, macOS, and Windows — connections, feature parity, and keyboard shortcuts. +aliases: + - desktop + - linux + - macos + - windows + - jvm +--- + +# Desktop App + +The Meshtastic Desktop application provides the same mesh communication features on Linux, macOS, and Windows. + +## Overview + +The Desktop app shares its core codebase with the Android app through Kotlin Multiplatform (KMP). Most features work identically across platforms. + +## Installation + +### Linux + +- Download the `.deb` or `.AppImage` package from the releases page +- Or build from source using `./gradlew :desktopApp:run` + +### macOS + +- Download the `.dmg` package from releases +- Or build from source + +### Windows + +- Download the `.msi` installer from releases +- Or build from source + +## Connecting Your Radio + +### USB Serial (Primary) + +The most reliable connection method on Desktop: + +1. Connect your Meshtastic radio via USB cable. +2. The app should detect the serial port automatically. +3. If not detected, select the correct serial port from the connections menu. + +### TCP/IP + +For network-connected radios: + +1. Enter the radio's IP address and port (default: 4403). +2. Click **Connect**. + +### Bluetooth (BLE) + +Bluetooth Low Energy is supported on Desktop via the [Kable](https://github.com/JuulLabs/kable) library: + +1. Ensure your system has a Bluetooth adapter. +2. The app scans for nearby Meshtastic radios automatically. +3. Select your device from the connections screen. + +## Feature Parity + +| Feature | Android | Desktop | Anteckningar | +| ---------------------------------------- | ------- | ------- | -------------------------- | +| Messaging | ✓ | ✓ | Full parity | +| Node List | ✓ | ✓ | Full parity | +| Karta | ✓ | ✓ | Full parity | +| Inställningar | ✓ | ✓ | Full parity | +| Bluetooth (BLE) | ✓ | ✓ | Via Kable on desktop | +| Firmware Update OTA | ✓ | ✗ | Use web flasher | +| Notifications | ✓ | ✓ | Native OS notifications | +| Widgets | ✓ | ✗ | Android-only | +| AI Assistant (Chirpy) | ✓\* | ✗ | Google flavor Android only | + +\*Chirpy AI requires Android 14+ on Google flavor builds with supported hardware. + +## UI Differences + +The Desktop app uses the same Compose Multiplatform UI with adaptations for larger screens and desktop interaction. + +### Keyboard Shortcuts + +| Shortcut | Action | +| ------------------- | --------------------------- | +| **⌘Q** / **Ctrl+Q** | Quit the application | +| **⌘,** / **Ctrl+,** | Open Settings | +| **⌘1** / **Ctrl+1** | Switch to Conversations tab | +| **⌘2** / **Ctrl+2** | Switch to Nodes tab | +| **⌘3** / **Ctrl+3** | Switch to Map tab | +| **⌘4** / **Ctrl+4** | Switch to Connections tab | + +### Window & System Tray + +- **Window resizing** — responsive layout adapts to window dimensions +- **System tray** — minimize to system tray for background mesh operation +- **Tray menu** — right-click the tray icon to show window or quit +- **Mouse interaction** — hover states and standard desktop navigation + +### Notification Preferences + +The Desktop app provides in-app toggles for controlling which notifications are shown — messages, new nodes, and low battery alerts. Access these from **Settings → Notifications** within the app. + +## Built-in Documentation Browser + +The Desktop app includes a built-in documentation browser for quick access to help content without leaving the application. + +![Docs browser with table of contents](/assets/screenshots/docs-browser_toc.png) + +The browser supports full-text search across all documentation: + +![Searching the docs browser](/assets/screenshots/docs-browser_search.png) + +Individual doc pages render with full formatting: + +![A documentation page](/assets/screenshots/docs-browser_page.png) + +## Building from Source + +```bash +git clone https://github.com/meshtastic/Meshtastic-Android.git +cd Meshtastic-Android +git submodule update --init +./gradlew :desktopApp:run +``` + +Requirements: + +- JDK 21 +- No Android SDK required for desktop-only builds + +## Known Limitations + +- No OTA firmware updates (use web flasher) +- Some Android-specific features (widgets, specific notification channels) are unavailable +- Performance may vary on low-spec hardware running Compose Desktop +- BLE bonding is not yet supported on desktop (pairing works without bonding) + +## Related Topics + +- [Connections](connections) — connection methods overview +- [Firmware Updates](firmware) — use the [Web Flasher](https://flasher.meshtastic.org) for desktop firmware updates + +--- + diff --git a/docs/sv-rSE/user/discovery.md b/docs/sv-rSE/user/discovery.md new file mode 100644 index 000000000..dbf98efb8 --- /dev/null +++ b/docs/sv-rSE/user/discovery.md @@ -0,0 +1,114 @@ +--- +title: Upptäckt +nav_order: 12 +last_updated: 2026-05-13 +description: Explore your mesh network — traceroute paths, neighbor maps, and node discovery tools. +aliases: + - mesh-discovery + - local-discovery + - network-scan + - traceroute + - neighbor-info +--- + +# Upptäckt + +Discovery tools help you understand **how** your mesh network is connected — which nodes can hear each other, what paths messages take, and where bottlenecks or weak links exist. + +> 💡 **Tip:** You don't need a dedicated "discovery mode" to start exploring your mesh. The tools below are available right now from the node list and node detail screens. + +--- + +## Traceroute (spåra rutt) + +Traceroute reveals the exact path a message takes from your node to any other node on the mesh. It's the single most useful tool for debugging connectivity problems. + +### Running a Traceroute + +1. Navigate to **Nodes** and tap the node you want to trace. +2. On the node detail screen, tap **Traceroute**. +3. The app sends a traceroute request and waits for the response. +4. Results display each hop in order, with signal quality at every step. + +### Reading the Results + +A traceroute result looks like this: + +``` +You → Node A (SNR: 8.5, RSSI: -95) → Node B (SNR: 5.2, RSSI: -108) → Target +``` + +Each hop represents a relay node that forwarded the message. The SNR and RSSI values at each hop tell you about the link quality on that specific segment. + +| What to look for | What it means | +| -------------------------------------------------------------------------- | --------------------------------------------------------------------------- | +| All hops show Good SNR (> 5 dB) | Healthy path — messages flow reliably | +| One hop shows Bad SNR (< 0 dB) | Weak link — this relay segment is fragile | +| Many hops (4+) | Long path — consider repositioning a node to shorten it | +| Different path on retry | Mesh is adapting — multiple routes exist (this is good!) | + +> 💡 **Tip:** Run traceroute several times over a few minutes. If the path changes, your mesh has redundant routes — a sign of a well-connected network. + +### Troubleshooting with Traceroute + +- **"No route found"** — The target node may be offline, out of range, or on a different channel. Check that both nodes share at least one channel with the same encryption key. +- **Traceroute times out** — The path may be too long (exceeds hop limit) or a relay node is congested. Try increasing the hop limit in **Settings → LoRa Config**. +- **Asymmetric paths** — A traceroute from A→B may take a different path than B→A. This is normal — radio propagation is not always symmetric. + +--- + +## Granninformation + +The Neighbor Info module lets each node broadcast a list of the nodes it can **directly hear** (single-hop). When multiple nodes share their neighbor lists, you can piece together a topology map of the entire mesh. + +### Enabling Neighbor Info + +1. Navigate to **Settings → Module Config → Neighbor Info**. +2. Enable the module. +3. Set the broadcast interval (default: 900 seconds / 15 minutes). + +Once enabled, your node periodically broadcasts its neighbor table. Other nodes with Neighbor Info enabled do the same. + +### Viewing Neighbor Data + +- Open any node's detail screen and look for the **Neighbors** section. +- Each neighbor entry shows the node that was directly heard and its signal quality. +- Combine neighbor data from multiple nodes to understand the full mesh topology. + +> ⚠️ **Note:** Neighbor Info increases airtime usage because every enabled node periodically broadcasts its neighbor list. On busy meshes with many nodes, consider longer broadcast intervals (3600 seconds or more) to avoid congestion. + +--- + +## Node List as a Discovery Tool + +The node list itself is a powerful discovery tool when you use its filtering and sorting features effectively. + +### Finding New Nodes + +- Sort by **Last heard** to see the most recently active nodes at the top. +- Enable **Include unknown** to see nodes that have appeared on the mesh but haven't sent user info yet — these are often newly powered-on devices. + +### Assessing Connectivity + +- Sort by **Hops away** to see which nodes are directly reachable (0 hops) versus relayed. +- Sort by **Distance** to find nearby nodes and verify they're reachable. +- Use **Exclude MQTT** to focus on nodes reachable over radio (not via internet bridge). + +### Infrastructure Audit + +- Disable **Exclude infrastructure** to see Router, Repeater, Router Late, and Client Base nodes. +- Check their signal quality and last-heard times to verify your infrastructure nodes are healthy. + +See [Nodes](nodes) for full details on filtering and sorting options. + +--- + +## Tips for Mesh Exploration + +- **Start with traceroute** — it gives you immediate, actionable information about a specific path. +- **Enable Neighbor Info on key nodes** — especially routers and repeaters, to build a picture of the backbone. +- **Check the map** — node positions on the [Map](map-and-waypoints) combined with signal data help you understand why some links are strong and others are weak. +- **Compare signal over time** — use the [Signal Meter](signal-meter) guide to interpret SNR and RSSI values correctly. + +--- + diff --git a/docs/sv-rSE/user/firmware.md b/docs/sv-rSE/user/firmware.md new file mode 100644 index 000000000..333bcd162 --- /dev/null +++ b/docs/sv-rSE/user/firmware.md @@ -0,0 +1,114 @@ +--- +title: Firmware Updates +nav_order: 13 +last_updated: 2026-05-13 +description: Update your radio firmware over Bluetooth — OTA process, version channels, pre-flight checks, and recovery. +aliases: + - firmware + - update + - ota + - flash +--- + +# Firmware Updates + +Keep your Meshtastic radio up to date with the latest firmware for new features, bug fixes, and security improvements. + +## Checking for Updates + +1. Navigate to **Settings → Firmware Update** or tap the firmware notification if shown. +2. The app checks for available firmware versions. +3. Available updates show the version number and changelog summary. + +## Update Methods + +### OTA (Over-The-Air) via Bluetooth + +The most common update method for Android users: + +1. Ensure your radio is connected via Bluetooth. +2. Navigate to the Firmware Update screen. +3. Select the desired firmware version. +4. Tap **Update** to begin the OTA process. +5. Wait for the update to complete — **do not disconnect** during the update. + +![Firmware checking for updates](/assets/screenshots/firmware_checking.png) + +> ⚠️ **Warning:** Interrupting a firmware update can brick your device. Ensure your radio has sufficient battery (>50% recommended) and maintain Bluetooth proximity during the entire process. + +![Firmware disclaimer](/assets/screenshots/firmware_disclaimer.png) + +### USB Flashing + +For recovery or when OTA is unavailable: + +- Use the [Meshtastic Web Flasher](https://flasher.meshtastic.org) +- Or the [Meshtastic CLI tool](https://meshtastic.org/docs/getting-started/flashing-firmware) on desktop + +## Version Channels + +| Kanal | Beskrivning | +| -------------- | ------------------------------------------- | +| Stabil version | Recommended for most users; tested releases | +| Alfa | Preview releases; may contain bugs | + +## Pre-Update Checklist + +Before updating: + +- [ ] Battery > 50% +- [ ] Stable Bluetooth connection +- [ ] Note your current settings (they may reset on major version changes) +- [ ] Check the release notes for breaking changes + +## Post-Update + +After a successful update: + +- The radio will reboot automatically +- Bluetooth connection will re-establish +- Verify your settings are intact +- Check the firmware version in **Settings → About** + +![Firmware update success](/assets/screenshots/firmware_success.png) + +## Felsökning + +### Update Stuck + +If the update appears frozen: + +- Wait at least 5 minutes before intervening +- If truly stuck, power-cycle the radio +- Attempt the update again + +![Firmware update error](/assets/screenshots/firmware_error.png) + +### Device Won't Boot After Update + +If your device fails to boot: + +1. Try connecting via USB to a computer +2. Use the web flasher in recovery/DFU mode +3. Flash a known-good firmware version +4. Check the Meshtastic Discord for device-specific recovery steps + +### Compatibility Warnings + +The app may show warnings when: + +- Connected radio firmware is below minimum supported version +- Major version mismatch between app and firmware +- Deprecated features need migration + +> ⚠️ **Important:** Always update the Meshtastic app before or alongside firmware updates to ensure compatibility. + +## Related Topics + +- [Connections](connections) — reconnecting after a firmware update +- [Flashing firmware guide](https://meshtastic.org/docs/getting-started/flashing-firmware) — full firmware flashing walkthrough on meshtastic.org +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — check firmware compatibility by device +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/sv-rSE/user/map-and-waypoints.md b/docs/sv-rSE/user/map-and-waypoints.md new file mode 100644 index 000000000..b02961c87 --- /dev/null +++ b/docs/sv-rSE/user/map-and-waypoints.md @@ -0,0 +1,116 @@ +--- +title: Map & Waypoints +nav_order: 6 +last_updated: 2026-05-13 +description: View node positions on the map, create and share waypoints, and manage position sharing and privacy. +aliases: + - map + - waypoints + - gps + - location +--- + +# Map & Waypoints + +The Map screen shows the geographic positions of nodes on your mesh, along with shared waypoints. + +## Map View + +The map displays: + +- **Node positions** — colored markers for each node reporting location +- **Waypoints** — shared points of interest +- **Your position** — your current GPS location + +### Node Markers + +Node markers on the map indicate: + +| Color | Meaning | +| ----- | ---------------------------------------------- | +| Grönt | Online (heard recently) | +| Gul | Away (heard within 2 hours) | +| Gray | Offline (stale position) | +| Blått | Your own node | + +### Map Controls + +- **Zoom** — pinch or use +/- buttons +- **Pan** — drag to explore +- **Center** — select the location button to center on your position +- **Node tap** — tap a node marker to view details + +The floating toolbar provides quick access to compass, layer switching, node filters, refresh, and location tracking. Tap the compass to reorient north-up, or tap the location button to center on your current position. + +![Map controls overlay](/assets/screenshots/map_controls_overlay.png) + +## Waypoints + +Waypoints are shared geographic points of interest that all mesh members can see. + +### Creating a Waypoint + +1. Long-press on the map at the desired location. +2. Enter a name and optional description. +3. Choose an icon/emoji for the waypoint. +4. Tap **Send** to share with the mesh. + +### Waypoint Properties + +| Property | Beskrivning | +| ----------- | ------------------------------------------------------- | +| Namn | Short identifier (max 30 characters) | +| Beskrivning | Optional longer description | +| Icon | Visual marker emoji on the map | +| Låst | If locked, only the creator can edit or delete | +| Expiration | Optional auto-remove time | + +### Waypoint Expiration + +Waypoints can be set to expire automatically: + +- **Never** (default) — waypoint remains until manually deleted +- **Timed** — waypoint is automatically removed after the specified duration (e.g., "remove after 2 hours"). Useful for temporary markers like rally points, hazards, or meeting locations. + +Expired waypoints are automatically hidden from the map so they don't clutter the display. The expiration countdown begins when the waypoint is created, not when other nodes receive it. + +### Managing Waypoints + +- Tap a waypoint on the map to view its details and coordinates +- Edit or delete waypoints you created +- **Locked waypoints** cannot be modified or deleted by other nodes — only the original creator can change them +- Unlocked waypoints can be edited by any mesh member + +## Position Sharing + +### Enabling Position Sharing + +Your node shares its GPS position based on: + +- **Fixed interval** — broadcast position at regular intervals +- **Smart position** — broadcast when movement exceeds a threshold +- **Manual** — only share when explicitly requested + +Configure position behavior in **Settings → Position**. + +### Privacy Considerations + +> 🔒 **Privacy:** Position data is broadcast to all nodes on your channel. If you don't want your location shared, disable GPS position in settings or use a fixed/fake position. + +## Map Sources + +The app supports multiple map tile sources: + +- OpenStreetMap (default) +- Satellite imagery (where available) +- Offline tiles (download map areas for offline use) + +## Related Topics + +- [Nodes](nodes) — view and filter your node list +- [Node Metrics](node-metrics) — signal quality and position history for individual nodes +- [Discovery](discovery) — traceroute and neighbor info for understanding mesh topology +- [Units & Locale](units-and-locale) — distance and coordinate display formats + +--- + diff --git a/docs/sv-rSE/user/messages-and-channels.md b/docs/sv-rSE/user/messages-and-channels.md new file mode 100644 index 000000000..ba48008d1 --- /dev/null +++ b/docs/sv-rSE/user/messages-and-channels.md @@ -0,0 +1,159 @@ +--- +title: Messages & Channels +nav_order: 3 +last_updated: 2026-05-13 +description: Send and receive messages, manage channels, configure encryption, and use quick chat, reactions, and message actions. +aliases: + - channels + - direct-messages + - messaging + - conversations +--- + +# Messages & Channels + +Meshtastic supports two communication modes: **channel broadcasts** and **direct messages**. + +## Kanaler + +Channels are shared communication groups. All nodes configured with the same channel key can read and send messages on that channel. + +### Default Channel + +Every Meshtastic device comes with a default **LongFast** channel. This is an unencrypted channel used for general mesh communication. + +### Kanalsäkerhet + +Channels support multiple encryption levels: + +| Icon | Security Level | Beskrivning | +| ---- | ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------- | +| 🔒 | PSK (256-bit AES) | Fully encrypted with a strong pre-shared key. Only nodes with the matching key can read messages. | +| 🔐 | PSK (128-bit AES) | Encrypted with a shorter key. Secure for most uses but 256-bit is preferred for sensitive data. | +| 🔓 | Default / Open | Uses the well-known default key. **Any Meshtastic device** on the same preset can read these messages. | +| ⚠️ | Insecure + Position | Open channel that also broadcasts your GPS position. Use with caution in public meshes. | + +> 🔒 **Security Tip:** 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. + +### Adding a Channel + +1. Navigate to **Settings → Channels**. +2. Tap **Add Channel** or scan a QR code. +3. Configure the channel name and encryption key. +4. Share the channel URL/QR code with others who need access. + +Tapping a channel shows its details and sharing options. + +## Direct Messages + +Direct messages (DMs) are point-to-point encrypted communications between two specific nodes. + +### Sending a Direct Message + +1. Open the **Messages** tab. +2. Select a node from your contacts list or tap a node in the node list. +3. Type your message and tap **Send**. + +### Message States + +| State | Icon | Meaning | +| --------------------------------- | ---- | ----------------------------------------------------------------------------------------------------------------- | +| Queued | ⏳ | Message waiting to be sent | +| En route | ✓ | Delivered to the radio, awaiting acknowledgment | +| Levererad | ✓✓ | Acknowledgment received from recipient | +| Received | ✓ | Message received from the mesh (incoming) | +| S&F Routing | 🔗 | Store & Forward: message being routed through an S&F node | +| S&F Confirmed | 🔗 | Store & Forward: delivery confirmed via S&F node | +| Fel | ✗ | Delivery failed after retries | + +### Delivery Errors + +When a message fails to deliver, the error indicator shows what went wrong: + +| Fel | Meaning | What to Do | +| ---------------- | ---------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| No Route | No path exists to the destination node | The recipient may be offline or out of mesh range. Try later or move closer. | +| Got NAK | The next-hop node refused to relay | The relay node may be congested. Wait and retry. | +| Timeout | No acknowledgment within retry window | The recipient may be just out of range. Try increasing hop limit or moving to a better position. | +| Inget gränssnitt | No radio interface available to send | Check that your radio is connected and the channel is configured. | +| Max Retransmit | All retry attempts exhausted | The mesh path is unreliable. Try a different channel or wait for conditions to improve. | +| Ingen kanal | The destination channel doesn't exist | Verify both nodes share the same channel configuration. | +| Too Large | Message exceeds maximum payload size | Shorten your message (max ~230 characters). | +| Inget svar | Node received message but didn't respond | The recipient's radio may be busy or in low-power sleep mode. | +| Duty Cycle Limit | Regional airtime limit reached | Your radio has used its allowed transmit time. Wait for the duty cycle window to reset (typically 1 hour in EU regions). | +| Misslyckad | Malformed or invalid message | This usually indicates a software bug. Try restarting the app. | + +> 💡 **Tip:** 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. + +## Message Features + +### Quick Chat + +Pre-configured messages for rapid communication: + +- Access via the Quick Chat button in the message input area +- Choose from built-in phrases or custom messages +- Customize quick chat messages in **Settings → Quick Chat** +- Useful when typing is impractical (gloves, small screen, urgent) + +![Quick chat option](/assets/screenshots/messages_quick_chat.png) + +The channel list shows each channel with its latest message preview. + +### Message Bubbles + +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. + +### Reactions + +React to messages with emoji: + +- **Long-press** a message to open the actions menu +- Tap **Add Reaction** to choose an emoji +- Reactions appear below the message bubble +- Multiple users can react to the same message +- React to your own messages or others' messages + +![Emoji reaction badges displayed beneath a message](/assets/screenshots/messages_reaction.png) + +> 💡 **Tip:** Reactions are lightweight — they use minimal mesh bandwidth compared to full text messages. + +### Message Actions + +Long-press any message to access: + +- **Copy** — copy message text to clipboard +- **Reply** — quote the message in your response +- **React** — add an emoji reaction +- **Delete** — remove a message you sent (local deletion) + +### Message Priority + +Messages are queued and transmitted based on priority: + +1. Emergency/alert messages (highest) +2. Direct messages +3. Channel broadcasts (lowest) + +### Message Limits + +- **Maximum length:** 237 bytes (approximately 230 characters for ASCII text) +- **Rate limiting:** The mesh enforces airtime fairness; heavy message volume may be throttled +- **Delivery:** Messages are retried automatically if no acknowledgment is received + +## Best Practices + +- Use channels for group coordination +- Use direct messages for private person-to-person communication +- Keep messages short — mesh bandwidth is limited +- Configure encryption for sensitive communications + +## Related Topics + +- [Nodes](nodes) — tap a node to start a direct message +- [Settings — Radio & User](settings-radio-user) — configure channel encryption and presets +- [MQTT](mqtt) — bridge channel messages to the internet +- [Channel configuration](https://meshtastic.org/docs/configuration/radio/channels) — detailed channel settings on meshtastic.org + +--- + diff --git a/docs/sv-rSE/user/mqtt.md b/docs/sv-rSE/user/mqtt.md new file mode 100644 index 000000000..bdeadc5bf --- /dev/null +++ b/docs/sv-rSE/user/mqtt.md @@ -0,0 +1,137 @@ +--- +title: MQTT +nav_order: 11 +last_updated: 2026-05-13 +description: Bridge your mesh to the internet — MQTT broker setup, encryption layers, and map reporting. +aliases: + - mqtt + - internet-bridge + - broker +--- + +# MQTT + +MQTT bridges your Meshtastic mesh network to the internet, enabling long-range communication beyond radio range. + +## Overview + +The MQTT module connects your node to an MQTT broker, allowing: + +- Messages to reach nodes on different physical meshes via the internet +- Integration with home automation and monitoring systems +- Publishing node positions to the public Meshtastic map +- Custom data pipelines for logging and alerting + +## How It Works + +``` +[Your Node] → Radio → [Gateway Node with WiFi] → MQTT Broker → [Remote Gateway] → Radio → [Remote Node] +``` + +A gateway node with internet access (WiFi or Ethernet) publishes mesh messages to an MQTT topic. Remote gateways subscribed to the same topic inject those messages into their local mesh. + +## Konfiguration + +### Enabling MQTT + +1. Navigate to **Settings → Module Config → MQTT**. +2. Enable the MQTT module. +3. Configure the broker connection: + +![MQTT toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | Beskrivning | Förvald | +| --------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------- | +| Server Address | MQTT broker hostname | mqtt.meshtastic.org | +| Användarnamn | Broker authentication | meshdev | +| Lösenord | Broker authentication | large4cats | +| Root Topic | Base topic for messages | msh | +| Kryptering | Encrypt MQTT payload | Aktiverad | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON packet support has been removed from firmware; this field is ignored | Disabled | +| TLS | Secure connection to broker | Disabled | +| Map Reporting | Report position to public map | Disabled | + +### Default Meshtastic Broker + +The community maintains a public broker at `mqtt.meshtastic.org`. This is intended for general use and testing. + +> 🔒 **Privacy:** Messages on the public broker are readable by anyone subscribed. Always use channel encryption for private communications. + +### Private Broker + +For better privacy and control, you can run your own MQTT broker: + +- Mosquitto (lightweight, open-source) +- HiveMQ +- EMQX + +Configure your node to point to your private broker with appropriate credentials. + +## Map Reporting + +When Map Reporting is enabled, your node publishes its position to the Meshtastic community map: + +- Visible at [meshmap.net](https://meshmap.net) and similar community map services +- Only position and node info are shared +- Disable this if you don't want your location publicly visible + +## Uplink vs Downlink + +| Direction | Beskrivning | +| ------------ | -------------------------------- | +| **Uplink** | Messages from mesh → MQTT broker | +| **Downlink** | Messages from MQTT broker → mesh | + +Configure per-channel which directions are active to control message flow and airtime usage. + +## Message Formats + +MQTT uses protobuf message format: + +| Format | Beskrivning | Use case | +| ------------ | ----------------------------------- | -------------------------- | +| **Protobuf** | Binary Meshtastic protobuf encoding | Node-to-node mesh bridging | + +> ⚠️ **Note:** JSON output support was removed from firmware. The `json_enabled` setting is still visible in the app for legacy compatibility but has no effect on current firmware versions. + +## Encryption & Privacy + +Understanding the layered encryption model: + +1. **Channel encryption** happens on the mesh _before_ MQTT. If your channel has a PSK, the MQTT payload is already encrypted — the broker and any subscribers see only the ciphertext. +2. **MQTT encryption** (the module setting) adds an additional encryption layer for transit to the broker. This protects metadata and routing information. +3. **TLS** encrypts the TCP connection to the broker itself, preventing network-level eavesdropping. + +> 🔒 **Important:** The default public channel has a well-known key. Messages on the default channel sent via MQTT are effectively **unencrypted** — anyone can decode them. Always use a custom PSK for private communications. + +## Best Practices + +- Use channel-level encryption (PSK) on channels that bridge to MQTT +- Don't enable MQTT on nodes without internet access (it will buffer and waste memory) +- Use a private broker for sensitive deployments +- Be mindful of airtime when downlinking messages from busy MQTT topics — every downlinked message consumes radio airtime on your local mesh +- Consider enabling uplink-only if you only need to monitor your mesh remotely without injecting messages back + +## Felsökning + +### MQTT Not Connecting + +- **Check WiFi** — the gateway node must have an active internet connection (WiFi or Ethernet). MQTT does not work over the LoRa radio link itself. +- **Verify credentials** — incorrect username or password will silently fail on most brokers. Double-check for trailing spaces. +- **Firewall** — port 1883 (MQTT) or 8883 (MQTT+TLS) must be open. Some networks block non-standard ports. +- **DNS resolution** — if using a custom broker hostname, verify the node can resolve it. Try the broker's IP address directly. + +### Messages Not Bridging + +- **Check uplink/downlink settings** — if only uplink is enabled, messages flow from mesh to MQTT but not back. Enable downlink on the receiving gateway. +- **Channel mismatch** — both gateways must share the same channel with the same PSK. A mismatch means messages are encrypted with different keys and appear as garbage. +- **Topic mismatch** — ensure both gateways use the same root topic. The default `msh` works for the public broker. + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — MQTT module configuration reference +- [Messages & Channels](messages-and-channels) — channel encryption and PSK setup +- [MQTT integration guide](https://meshtastic.org/docs/software/integrations/mqtt) — detailed MQTT documentation on meshtastic.org + +--- + diff --git a/docs/sv-rSE/user/node-metrics.md b/docs/sv-rSE/user/node-metrics.md new file mode 100644 index 000000000..1875f997c --- /dev/null +++ b/docs/sv-rSE/user/node-metrics.md @@ -0,0 +1,130 @@ +--- +title: Node Metrics +nav_order: 5 +last_updated: 2026-05-13 +description: Telemetry dashboards for each mesh node — device health, environment sensors, signal quality, power, traceroute, and position history. +aliases: + - metrics + - telemetry + - device-metrics + - signal +--- + +# Node Metrics + +The node detail screen provides comprehensive telemetry and metrics for each node on your mesh. + +## Enhetens mätvärden + +Basic operating information reported by each node: + +| Metric | Beskrivning | +| ---------------- | ----------------------------------- | +| Battery Level | Current battery percentage | +| Spänning | Battery voltage reading | +| Kanalutnyttjande | Percentage of airtime consumed | +| Airtime | Transmission time used by this node | +| Upptid | Time since last reboot | + +Device metrics are displayed as individual cards with trend sparklines showing battery level, voltage, channel utilization, airtime, and uptime over time. + +> 💡 **Tip:** Tap any metric card to expand it into a full chart with historical data points. Pinch to zoom the time axis. + +## Miljövärden + +Environmental sensor data (requires compatible hardware): + +| Metric | Sensor Examples | +| ------------------------------------ | --------------------- | +| Temperatur | BME280, BME680, SHT31 | +| Luftfuktighet | BME280, BME680, SHT31 | +| Lufttryck | BME280, BMP280 | +| Gasmotstånd | BME680 | +| IAQ (Air Quality) | BME680 | + +Environment metrics are charted over time for easy trend analysis — temperature, humidity, and pressure each get their own line chart with the measurement unit displayed on the Y axis. + +> 💡 **Tip:** Environment metrics require a sensor connected to the remote node. Not all nodes report environmental data. See [Telemetry & Sensors](telemetry-and-sensors) for a full list of supported sensors. + +## Signal Metrics + +Radio signal quality information: + +| Metric | Beskrivning | +| --------- | ----------------------------------------------------------------------------- | +| SNR | Signal-to-Noise Ratio (higher is better) | +| RSSI | Received Signal Strength Indicator (closer to 0 is better) | +| Hop Count | Number of mesh hops for last message | + +### Signal Quality Reference + +| SNR Range | Quality | +| --------------------------------- | --------- | +| > 10 dB | Excellent | +| 0 to 10 dB | Bra | +| -10 to 0 dB | Ok | +| < -10 dB | Poor | + +## Strömdata + +Power management telemetry (requires INA sensor or compatible hardware): + +| Metric | Beskrivning | +| ----------- | ----------------------- | +| Bus Voltage | Supply voltage | +| Ström | Power draw in milliamps | +| Ström | Calculated wattage | + +## Traceroute (spåra rutt) + +Traceroute shows the path a message takes through the mesh: + +1. From the node detail screen, tap **Traceroute**. +2. The app sends a traceroute request to the target node. +3. Results show each hop with SNR/RSSI values. + +### Reading Traceroute Results + +``` +You → Node A (SNR: 8.5) → Node B (SNR: 5.2) → Target +``` + +Each hop represents a relay node that forwarded the message. + +## Position Loggbok + +Historical position data for nodes that share their location: + +- GPS coordinates +- Altitud +- Speed (if moving) +- Timestamp for each position report + +## Granninformation + +Shows which nodes a given node can directly hear, useful for understanding mesh topology. + +## Viewing Metrics + +1. Navigate to **Nodes**. +2. Tap the node you want to inspect. +3. Select the metric category from the detail tabs. + +![Node detail — local device](/assets/screenshots/nodes_detail_local.png) + +The position tab shows location data for nodes that share GPS: + +![Position inline content](/assets/screenshots/nodes_position.png) + +> ⚠️ **Note:** Metrics are only available when they have been reported by the remote node. Metrics update at intervals configured on each node's telemetry settings. + +## Related Topics + +- [Nodes](nodes) — node list, filtering, and sorting +- [Telemetry & Sensors](telemetry-and-sensors) — supported sensors and configuration +- [Signal Meter](signal-meter) — how signal quality is calculated from SNR and RSSI +- [Discovery](discovery) — traceroute details and neighbor info +- [Units & Locale](units-and-locale) — temperature, distance, and speed display formats + +--- + diff --git a/docs/sv-rSE/user/nodes.md b/docs/sv-rSE/user/nodes.md new file mode 100644 index 000000000..d248541df --- /dev/null +++ b/docs/sv-rSE/user/nodes.md @@ -0,0 +1,152 @@ +--- +title: Noder +nav_order: 4 +last_updated: 2026-05-13 +description: Browse, filter, and sort mesh nodes — view details, signal quality, roles, and quick actions. +aliases: + - node-list + - mesh-nodes + - peers +--- + +# Noder + +The Nodes screen displays all devices visible on your mesh network. + +## Node List + +The node list shows every node your radio has heard, including: + +- **Node name** — user-configured long name +- **Short name** — 4-character identifier +- **Signal quality** — last heard signal strength +- **Last heard** — time since last communication +- **Distance** — estimated distance (if positions are shared) +- **Battery** — remote node battery level (if telemetry is enabled) + +### Node Status Indicators + +| Badge | Meaning | +| ---------- | ------------------------------------- | +| 🟢 Online | Node heard within the last 15 minutes | +| 🟡 Away | Node heard within the last 2 hours | +| 🔴 Offline | Node not heard for over 2 hours | +| ⭐ Favorite | Node marked as favorite by the user | + +### Node Roles + +Nodes can be configured with different roles that affect their mesh behavior: + +| Roll | Beskrivning | +| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Client | Standard end-user device | +| Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | +| Client Mute | Receives but doesn't retransmit | +| Client Hidden | Like Client Mute, plus hides from node list | +| Router | Prioritizes message forwarding; stays awake to relay | +| Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | +| ~~Router Client~~ | ⚠️ **Deprecated** (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | +| ~~Repeater~~ | ⚠️ **Deprecated** (removed in firmware 2.7.11) — no longer selectable; use Router instead | +| Tracker | Optimized for position reporting at regular intervals | +| Sensor | Optimized for telemetry reporting | +| TAK | Interoperates with TAK systems (sends/receives CoT) | +| TAK Tracker | TAK position reporting only | +| Lost & Found | Continuous position beacon for recovery | + +### Choosing a Role + +Most users should keep the default **Client** role. Consider a different role when: + +- **Router** — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don't use Router on battery-powered handheld devices. +- **Router Late** — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. +- **Client Base** — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. +- **Client Mute** — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only devices or to reduce congestion in dense areas. +- **Tracker** — An unattended device whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. +- **Sensor** — An unattended device reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. +- **TAK / TAK Tracker** — Only needed if interoperating with ATAK/WinTAK systems. See [TAK Integration](tak) for details. + +> 💡 **Tip:** The mesh works best when most nodes are **Client** or **Router**. Too many Mute nodes reduces mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. + +### Encryption Indicators + +Nodes display encryption status icons next to their name: + +| Icon | Meaning | +| ----------- | ------------------------------------------------------------------------------------------------------------------- | +| 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | +| 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | +| ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) | + +> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. + +## Quick Actions + +From the node list, you can: + +- **Tap** a node to view its detail page +- **Long-press** for quick actions: + - Send a direct message + - Visa på karta + - Begär position + - Mark as favorite + - Traceroute (spåra rutt) + +## Filtering & Sorting + +### Text Search + +Type in the search field to filter nodes by name or short name. The filter updates in real time as you type. + +### Filter Toggles + +| Filter | Beskrivning | +| -------------------------- | ---------------------------------------------------------------------------------------------- | +| **Only online** | Show only nodes heard within the last 15 minutes | +| **Only direct** | Show only nodes with direct (non-relayed) connections | +| **Include unknown** | Show nodes that haven't sent user info yet | +| **Exclude infrastructure** | Hide infrastructure-role nodes (Router, Repeater, Router Late, Client Base) | +| **Exclude MQTT** | Hide nodes heard only via MQTT internet bridge | +| **Show ignored** | Show nodes you've previously dismissed or muted | + +### Sort Options + +| Sort | Beskrivning | +| ------------------------------------------- | ------------------------------------------------------------------ | +| **Last heard** (default) | Most recently heard nodes first | +| **Alphabetical** | Sorted by node long name | +| **Distance** | Nearest nodes first (requires position sharing) | +| **Hops away** | Fewest relay hops first | +| **Channel** | Grouped by channel index | +| **Via MQTT** | Grouped by MQTT vs. radio-heard | +| **Favorites** | Favorited nodes first | + +## Node Detail + +Tapping a node opens the detail view with comprehensive information. See [Node Metrics](node-metrics) for full details on metrics and telemetry. + +![Node detail view](/assets/screenshots/nodes_node_list.png) + +The detail screen includes device info, position, and action buttons: + +![Node detail section](/assets/screenshots/nodes_detail_section.png) + +Inline status indicators show key metrics at a glance: + +| Indicator | Screenshot | +| -------------- | -------------------------------------------------------- | +| Signal quality | ![Signal](/assets/screenshots/nodes_signal_info.png) | +| Batterinivå | ![Battery](/assets/screenshots/nodes_battery_info.png) | +| Hop count | ![Hops](/assets/screenshots/nodes_hops_info.png) | +| Senast hörd | ![Last heard](/assets/screenshots/nodes_last_heard.png) | +| Avstånd | ![Distance](/assets/screenshots/nodes_distance_info.png) | + +## Related Topics + +- [Node Metrics](node-metrics) — detailed telemetry dashboards for each node +- [Messages & Channels](messages-and-channels) — send a direct message to a node +- [Map & Waypoints](map-and-waypoints) — view node positions geographically +- [Discovery](discovery) — traceroute and neighbor info for topology exploration +- [Signal Meter](signal-meter) — understand what the signal bars mean + +--- + diff --git a/docs/sv-rSE/user/onboarding.md b/docs/sv-rSE/user/onboarding.md new file mode 100644 index 000000000..b73399ed9 --- /dev/null +++ b/docs/sv-rSE/user/onboarding.md @@ -0,0 +1,99 @@ +--- +title: Kom igång +nav_order: 1 +last_updated: 2026-05-13 +description: First-launch setup — permissions, onboarding flow, and next steps after connecting your radio. +aliases: + - first-launch + - setup + - intro +--- + +# Kom igång + +Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app. + +## First Launch + +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. + +### Welcome Screen + +The welcome screen introduces Meshtastic and its core capabilities: + +- Off-grid mesh communication +- No cellular or internet required +- End-to-end encrypted messaging + +Tap **Get Started** to proceed through the setup flow. + +![Welcome screen](/assets/screenshots/onboarding_welcome.png) + +## Permissions + +The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. + +### Bluetooth Permission + +Bluetooth is the primary connection method between your phone and Meshtastic radio: + +- **Bluetooth scanning** — discover nearby Meshtastic radios +- **Bluetooth connect** — establish and maintain connections with paired radios + +Grant both permissions when prompted. Without Bluetooth, you'll need to use USB or TCP connections instead. + +### Location Permission + +> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. + +Meshtastic also uses your location for: + +- Showing your position on the mesh map +- Calculating distances to other nodes +- Sharing your GPS coordinates with other mesh members (if enabled) + +Grant **"While using the app"** or **"Always"** depending on your preference: + +- **While using the app** — position updates only when the app is open +- **Always** — enables background position updates for always-on mesh presence + +If denied, Bluetooth scanning will not function and your node will not report a position. + +### Notifications Permission + +Notifications alert you to: + +- Incoming messages from channels and direct messages +- Connection status changes (connected, disconnected, reconnecting) +- Firmware update availability + +> 💡 **Tip:** You can fine-tune notification preferences later in Android system settings. The app creates separate notification channels for messages, connection events, and background service status. + +### Critical Alerts Permission + +On supported devices, the app may request permission for critical alerts: + +- These are high-priority notifications that can break through Do Not Disturb mode +- Useful for emergency mesh alerts or urgent messages +- You can **skip** this step if you don't need breakthrough notifications +- Configure or revoke later in Android notification settings + +## After Setup + +Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. + +> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. + +## What's Next? + +Once connected to a radio, explore: + +- [Connections](connections) — pair your first radio device +- [Messages & Channels](messages-and-channels) — send your first message +- [Nodes](nodes) — see who's on your mesh +- [Map & Waypoints](map-and-waypoints) — view node positions +- [Settings](settings-radio-user) — configure your radio and user profile + +New to Meshtastic? The [getting started guide](https://meshtastic.org/docs/getting-started) on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup. + +--- diff --git a/docs/sv-rSE/user/settings-module-admin.md b/docs/sv-rSE/user/settings-module-admin.md new file mode 100644 index 000000000..61810ece3 --- /dev/null +++ b/docs/sv-rSE/user/settings-module-admin.md @@ -0,0 +1,246 @@ +--- +title: Settings — Modules & Admin +nav_order: 8 +last_updated: 2026-05-13 +description: Configure optional feature modules (MQTT, telemetry, canned messages, TAK, and more) and perform device administration. +aliases: + - modules + - module-config + - administration +--- + +# Settings — Modules & Admin + +Configure optional feature modules and perform device administration. Modules extend Meshtastic with specialized capabilities — each can be independently enabled or disabled. + +> 💡 **Tip:** You only need to enable the modules you actually use. Disabling unused modules reduces airtime, saves battery, and simplifies your configuration. + +Module settings use a card-based layout with toggle switches, dropdowns, text fields, and sliders: + +![Toggle switch](/assets/screenshots/settings_switch.png) + +![Dropdown selector](/assets/screenshots/settings_dropdown.png) + +![Text field](/assets/screenshots/settings_text_field.png) + +![Settings card layout](/assets/screenshots/settings_titled_card.png) + +## Module Configuration + +### MQTT Module + +Bridges mesh messages to and from an MQTT broker for internet connectivity. This is how you extend your mesh beyond radio range or integrate with home automation systems. + +| Setting | Beskrivning | +| --------------- | ------------------------------------------------------------------------ | +| Aktiverad | Toggle MQTT bridge | +| Server | MQTT broker address | +| Användarnamn | Authentication username | +| Lösenord | Authentication password | +| Kryptering | Encrypt MQTT payloads | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON support removed from firmware; field is ignored | +| TLS | Use secure connection | +| Root Topic | Base MQTT topic path | +| Map Report | Publish position for public map | + +See [MQTT](mqtt) for a detailed usage guide including encryption, privacy, and broker setup. + +### Serial Module + +Enables serial port communication for external device integrations (GPS modules, sensors, or custom hardware). When enabled, the node's serial port can send and receive protobuf or text data, allowing external microcontrollers or computers to interact with the mesh. + +| Setting | Beskrivning | +| ---------- | ------------------------------- | +| Aktiverad | Activate serial communication | +| Eko | Echo received serial data back | +| Typ | Text, Protobuf, or NMEA output | +| RX/TX Pins | GPIO pins for serial connection | +| Hastighet | Serial communication speed | + +### External Notification Module + +Controls buzzer, LED, or vibration alerts on your radio hardware. Useful for devices that need to physically signal when a message arrives — particularly helpful for unattended or outdoor installations. + +| Setting | Beskrivning | +| -------------------------------- | --------------------------- | +| Aktiverad | Activate notifications | +| Meddelande-utgång | Notify on incoming messages | +| Meddelande-summer | Use buzzer for messages | +| Alert Message Vibra | Use vibration for messages | +| Klock-tecken-utgång | Notify on bell character | +| Output (GPIO) | Pin for notification output | +| Aktiv | High or Low active | +| Duration (ms) | Notification length | +| Use I2S as Buzzer | Use I2S audio output | + +### Store & Forward Module + +Buffers messages for nodes that were temporarily offline, then replays them when those nodes reconnect. Essential for meshes where nodes go in and out of range regularly — ensures messages aren't lost during brief disconnections. + +| Setting | Beskrivning | +| ------------------------------------------ | -------------------------- | +| Aktiverad | Activate store and forward | +| Heartbeat (s) | Announcement interval | +| Post | Maximum stored messages | +| History Return (max) | Max messages to replay | +| History Return (window) | Time window for replay | + +> 💡 **Tip:** Store and Forward works best on nodes with ample memory (ESP32 with PSRAM). Router nodes are ideal candidates since they're typically always-on. + +### Range Test Module + +Automated range testing tool for evaluating link quality between nodes. When enabled, the node periodically transmits test messages with incrementing counters. A receiver node logs these messages, allowing you to walk or drive away and later analyze at what distance messages stopped arriving. + +| Setting | Beskrivning | +| -------------------------------------- | --------------------------------- | +| Aktiverad | Activate range testing | +| Sender Interval (s) | Time between test transmissions | +| Save CSV | Log received test data to SD card | + +### Telemetry Module + +Controls what telemetry data your node shares with the mesh. Telemetry includes device health (battery, uptime) and environmental sensor data (temperature, humidity, pressure). + +| Setting | Beskrivning | +| ---------------------------- | --------------------------------------- | +| Device Metrics Interval | How often to report device metrics | +| Environment Metrics Interval | How often to report environment sensors | +| Aktivera luftkvalitet | Report particulate sensor data | +| Power Metrics Enabled | Report power usage | + +See [Telemetry & Sensors](telemetry-and-sensors) for supported sensors and configuration recommendations. + +### Canned Message Module + +Pre-configured messages accessible from the device's physical buttons (for radios with rotary encoders, keypads, or similar input hardware). Define a list of quick-send messages that can be transmitted without a phone connected — ideal for field use. + +| Setting | Beskrivning | +| ------------------ | ----------------------------------------------------------- | +| ~~Enabled~~ | ⚠️ **Deprecated** — current firmware may ignore this toggle | +| Meddelanden | Newline-separated list of messages | +| Skicka klocka | Play bell sound on send | +| Rotary Encoder | Enable rotary encoder input | +| Up/Down/Press Pins | GPIO pin assignments for input | + +### Audio Module + +Codec2 audio support for low-bandwidth voice communication over the mesh. This is an **experimental** feature that encodes voice into very small data packets using the Codec2 codec. + +| Setting | Beskrivning | +| --------------- | -------------------------------- | +| Aktiverad | Activate audio module | +| Codec2 Rate | Audio quality/bandwidth tradeoff | +| I2S Word Select | GPIO pin for I2S WS | +| I2S Data In | GPIO pin for I2S DIN | +| I2S Data Out | GPIO pin for I2S DOUT | + +> ⚠️ **Note:** Audio requires specific hardware (I2S microphone and speaker). Voice quality is very low-bandwidth — think "understandable radio voice," not phone-call quality. + +### Remote Hardware Module + +GPIO control over the mesh network. Allows a remote node to read or write GPIO pins on another node — useful for activating relays, reading switches, or controlling external hardware from a distance. + +| Setting | Beskrivning | +| -------------------- | --------------------------------------------------------------- | +| Aktiverad | Activate remote GPIO access | +| Allow Undefined Pins | Allow access to any GPIO pin (security risk) | + +> ⚠️ **Warning:** Enabling "Allow Undefined Pins" gives remote nodes access to all GPIO pins, which could interfere with the radio's own hardware. Only enable on dedicated GPIO nodes. + +### Neighbor Info Module + +Broadcasts information about directly heard neighbors, enabling mesh topology mapping. Each enabled node periodically shares a list of the other nodes it can hear and their signal quality. + +| Setting | Beskrivning | +| -------------------------------------- | ------------------------------------ | +| Aktiverad | Activate neighbor broadcasting | +| Update Interval (s) | How often to broadcast neighbor list | + +See [Discovery](discovery) for how to use neighbor data for mesh topology exploration. + +### Ambient Lighting Module + +Controls onboard NeoPixel or other addressable RGB LEDs on supported hardware. Can be used for visual status indicators, notification lights, or decorative effects. + +| Setting | Beskrivning | +| ------------------ | ---------------------------------------------------------- | +| Aktiverad | Activate LED control | +| LED-läge | On, Off, or set specific color | +| Red / Green / Blue | Individual color channel values (0–255) | + +### Detection Sensor Module + +Turns your node into a motion or door sensor alert system. When a GPIO pin detects a state change (motion detected, door opened), the node broadcasts an alert message over the mesh. + +| Setting | Beskrivning | +| ---------------------------------------- | ----------------------------------------------------------------------- | +| Aktiverad | Activate detection sensor | +| Stift att övervaka | GPIO pin connected to sensor | +| Logiknivå för detektion | Trigger when pin goes high (vs. low) | +| Minimum Broadcast (s) | Minimum time between alert broadcasts | +| State Broadcast (s) | Periodic state broadcast interval | +| Skicka klocka | Include bell character in alerts | +| Visningsnamn | Custom name for this sensor | + +### Paxcounter Module + +People counter using WiFi and BLE probe requests. Counts nearby devices by passively listening for probe requests that phones and laptops emit when scanning for networks. Available only on ESP32 devices. + +| Setting | Beskrivning | +| -------------------------------------- | -------------------------- | +| Aktiverad | Activate people counting | +| Update Interval (s) | How often to report counts | + +> 💡 **Tip:** Paxcounter is useful for estimating foot traffic at trailheads, event venues, or other locations. Counts are approximate — one person may carry multiple devices. + +### TAK Module + +Team Awareness Kit integration for interoperability with ATAK and WinTAK. See [TAK Integration](tak) for detailed setup and usage. + +## Administration + +### Fjärradministration + +Remotely configure nodes that share your admin key: + +1. Select the target node in the node list. +2. Navigate to **Settings** for that node. +3. Modify configuration. +4. Tap **Save** — changes are sent over the mesh. + +> ⚠️ **Requires:** Admin key configured on both your node and the target node. + +### Rensa noddatabas + +Removes stale nodes from your local database that haven't been heard in a configurable time window. + +### Factory Reset + +Resets all settings to factory defaults. **This cannot be undone.** + +### Starta om + +Remotely reboot a connected or administered node. + +### Felsökningspanel + +View detailed diagnostic information: + +- Protocol buffers debug output +- Mesh packet log +- Connection state details + +### Troubleshooting Remote Admin + +- **"No response from target node"** — the target may be out of range, offline, or have a mismatched admin key. Verify the admin key matches on both nodes. +- **Changes not applying** — some settings require a reboot to take effect. Try the Reboot action after saving. +- **Can't see remote settings** — ensure your node has the admin key for the target node and that Admin Channel is enabled in Security Config. + +## Related Topics + +- [Settings — Radio & User](settings-radio-user) — core radio and user profile settings +- [Module configuration reference](https://meshtastic.org/docs/configuration/module) — detailed module docs on meshtastic.org +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/sv-rSE/user/settings-radio-user.md b/docs/sv-rSE/user/settings-radio-user.md new file mode 100644 index 000000000..10e2c55fa --- /dev/null +++ b/docs/sv-rSE/user/settings-radio-user.md @@ -0,0 +1,173 @@ +--- +title: Settings — Radio & User +nav_order: 7 +last_updated: 2026-05-13 +description: Configure your radio hardware, LoRa presets, user profile, position sharing, power management, and security. +aliases: + - inställningar + - radio-config + - user-config + - lora +--- + +# Settings — Radio & User + +Configure your radio hardware and user identity parameters. + +## Användarinställningar + +### User Profile + +| Setting | Beskrivning | +| ----------------- | ------------------------------------------------------------------------------------- | +| Långt namn | Your display name (up to 39 characters) | +| Kort namn | 4-character abbreviated name | +| Licensed Operator | Enable if you hold an amateur radio license (enables higher power) | + +### Applying Changes + +After modifying settings, tap **Save** to write the configuration to your radio. The device may reboot to apply changes. + +## Radio Configuration + +### Enhetskonfiguration + +| Setting | Beskrivning | Förvald | +| ------------------------------------------ | ----------------------------------------------------------------------- | -------- | +| Roll | Node behavior (Client, Router, etc.) | Client | +| Återutsändningsläge | How the node retransmits messages | Alla | +| Node Info Broadcast (s) | Interval for broadcasting node info | 10800 | +| Double-tap Button | Action for double-tap button press | Disabled | + +### LoRa Config + +| Setting | Beskrivning | Förvald | +| ---------------------- | ----------------------------------------------------------------------- | ----------------------------------------- | +| Region | Regulatory region for frequency bands | Unset (must configure) | +| Modem-förinställningar | Speed/range tradeoff | LongFast | +| Hoppgräns | Maximum retransmit hops | 3 | +| TX Power | Transmission power (dBm); 0 = max allowed for region | 0 (region max) | +| Frekvensförskjutning | Fine-tune frequency (MHz) | 0 | +| Channel Bandwidth | Bandwidth setting | Default for preset | + +> ⚠️ **Important:** You **must** set your region before transmitting. Operating without the correct region may violate local radio regulations. See the [region configuration guide](https://meshtastic.org/docs/getting-started/initial-config) on meshtastic.org for details. + +### Modem Presets + +| Preset | Range | Hastighet | SNR Limit | Best For | +| ------------------ | ----------------------- | ------------------------- | ------------------------ | -------------------------------------------------------------------------------------------------------- | +| Short Turbo | ~1 km | 21.9 kbps | −5 dB | Dense urban with line-of-sight; data-heavy applications | +| Short Fast | ~3 km | 10.9 kbps | −7.5 dB | Urban neighborhoods; buildings within a few blocks | +| Short Slow | ~5 km | 5.5 kbps | −10 dB | Suburban short-range; moderate building density | +| Medium Fast | ~5 km | 5.5 kbps | −10 dB | Suburban areas; moderate building density | +| Medium Slow | ~8 km | 1.1 kbps | −12.5 dB | Suburban/rural; moderate range with slower speed | +| Long Turbo | ~10 km | 4.4 kbps | −10 dB | Similar range to Long Fast but with 500 kHz bandwidth; faster throughput | +| Long Fast | ~10 km | 1.1 kbps | −12.5 dB | **General use (default)** — balanced range and speed | +| Long Moderate | ~20 km | 0.34 kbps | −15 dB | Rural with some terrain; occasional use | +| Lite Fast | ~5 km | 5.5 kbps | −10 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Medium Fast | +| Lite Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Long Fast | +| Narrow Fast | ~5 km | 2.7 kbps | −10 dB | EU 868 MHz band (62.5 kHz BW); avoids interference with other devices | +| Narrow Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 868 MHz band (62.5 kHz BW); comparable to Long Fast | +| ~~Long Slow~~ | ~30 km | 0.18 kbps | −17.5 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | +| ~~Very Long Slow~~ | ~40+ km | 0.09 kbps | −20 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | + +#### Choosing a Modem Preset + +The modem preset controls the fundamental tradeoff between **range** and **data rate**: + +- **Slower presets** use more spreading, making signals decodable at weaker signal levels (lower SNR limit). This means longer range but fewer bytes per second. +- **Faster presets** pack more data per transmission but require a stronger signal to decode. + +**Practical guidance:** + +- **Urban mesh (many nodes, short distances):** Use **Long Fast** (default) or **Short Fast**. Higher speed means less airtime congestion when many nodes share the channel. +- **Rural/sparse mesh (few nodes, long distances):** Use **Long Moderate**. Range matters more than speed when nodes are far apart. +- **EU 866/868 MHz regulatory compliance:** Use **Lite Fast**, **Lite Slow**, **Narrow Fast**, or **Narrow Slow** — these are optimized for the EU SRD/868 MHz bands with narrower bandwidths. +- **Fixed infrastructure links:** Use **Short Turbo** or **Long Turbo** for dedicated point-to-point links with good antennas and line-of-sight. +- **Mixed environments:** Stick with **Long Fast** — it's the community default and ensures compatibility with others in your area. + +> ⚠️ **Important:** All nodes on the same channel **must** use the same modem preset. Nodes with mismatched presets cannot communicate even if they share the same frequency and encryption key. + +> 💡 **Tip:** The range estimates above assume flat terrain and modest antennas. Elevation advantage (hilltop, rooftop) dramatically increases effective range. A well-placed Router with Long Fast can often outperform a ground-level node with Long Slow. + +### Display Config + +| Setting | Beskrivning | +| --------------------- | ------------------------------------------------------------------------------------ | +| Tidsgräns för display | Time before display sleeps | +| Enheter | Metric or Imperial | +| OLED-typ | Auto, SSD1306, SH1106, SH1107 | +| Compass Orientation | Rotation offset for compass display (0°, 90°, 180°, 270°) | +| ~~Compass North~~ | ⚠️ **Deprecated** — replaced by Compass Orientation; still visible in older firmware | + +### Position Config + +| Setting | Beskrivning | +| ----------------------------------------- | ---------------------------------- | +| GPS Enabled | Enable/disable GPS | +| Intervall för GPS-uppdatering | How often to acquire GPS fix | +| Position Broadcast (s) | How often to share position | +| Smart position | Enable movement-based broadcasting | +| Fast plats | Use a manually set position | + +### Ströminställningar + +| Setting | Beskrivning | +| --------------------------------------- | --------------------------------------- | +| Power Saving | Enable low-power sleep mode | +| Shutdown After (s) | Auto-shutdown idle timer | +| ADC Multiplier | Battery voltage calibration factor | +| Wait Bluetooth (s) | Time to wait for BLE connection at boot | +| Mesh SDS Timeout (s) | Super-deep-sleep timeout | + +### Network Config + +| Setting | Beskrivning | +| ------------- | ---------------------------------------------------- | +| WiFi Enabled | Enable WiFi radio (ESP32 devices) | +| WiFi SSID | Network name to connect to | +| WiFi PSK | Nätverkslösenord | +| NTP-server | Time synchronization server | +| Syslog Server | Remote logging server | + +![IP address field](/assets/screenshots/settings_ipv4_field.png) + +### Bluetooth-inställningar + +| Setting | Beskrivning | +| ----------------- | ------------------------------------------------------------------------- | +| Bluetooth Enabled | Enable/disable BLE radio | +| Pairing Mode | Fixed PIN, Random PIN, or No PIN | +| Fast PIN | PIN code for pairing (default: 123456) | + +### Security Config + +| Setting | Beskrivning | +| --------------------- | -------------------------------------------------------------------------- | +| Publik nyckel | Your node's public key (read-only) | +| Admin-nyckel | Key for remote administration | +| Privat nyckel | Your node's private key (handle securely) | +| Admin Channel Enabled | Allow admin commands via channel | +| Debug Log | Output live debug logging over serial/bluetooth | +| Serial Enabled | Enable serial console access (moved from Device Config) | +| Hanterat läge | Restrict non-admin channel changes | + +![Password field](/assets/screenshots/settings_password_field.png) + +Settings use standard preference controls — dropdowns, toggles, and sliders: + +| Control | Screenshot | +| -------- | ------------------------------------------------------ | +| Dropdown | ![Dropdown](/assets/screenshots/settings_dropdown.png) | +| Toggle | ![Toggle](/assets/screenshots/settings_switch.png) | +| Slider | ![Slider](/assets/screenshots/settings_slider.png) | + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — optional feature modules and device administration +- [Signal Meter](signal-meter) — how modem presets affect signal quality thresholds +- [LoRa configuration](https://meshtastic.org/docs/configuration/radio/lora) — detailed LoRa settings reference on meshtastic.org +- [Initial configuration](https://meshtastic.org/docs/getting-started/initial-config) — region setup guide on meshtastic.org + +--- + diff --git a/docs/sv-rSE/user/signal-meter.md b/docs/sv-rSE/user/signal-meter.md new file mode 100644 index 000000000..ecee00499 --- /dev/null +++ b/docs/sv-rSE/user/signal-meter.md @@ -0,0 +1,81 @@ +--- +title: How the Meshtastic Signal Meter Works +nav_order: 15 +last_updated: 2026-05-13 +description: How the signal meter calculates quality from RSSI and SNR — LoRa spread spectrum, presets, and what the bars really mean. +aliases: + - signal + - signal-meter + - snr + - rssi +--- + +# How the Meshtastic Signal Meter Works + +The Meshtastic signal meter — the familiar bars or status color in the app — is calculated very differently than the "bars" on a traditional cell phone or Wi-Fi router. + +Most consumer devices simply measure how "loud" a signal is. However, because Meshtastic uses **LoRa (Long Range)** technology, its signal meter measures how **clear** the signal is, relative to the specific settings your mesh is using. + +--- + +## 1. The Two Metrics: "Loudness" vs. "Clarity" + +Every time the LoRa radio chip receives a message, it reports two measurements: + +- **RSSI (Received Signal Strength Indicator):** The **loudness** of the raw power hitting your antenna. +- **SNR (Signal-to-Noise Ratio):** The **clarity** of the signal compared to the background static. + +> **Tip — The Analogy:** Imagine you are trying to hear a friend talking to you. +> +> - **RSSI** is how loud their voice is. +> - **The Noise Floor** is the background noise in the room (air conditioning, other people talking, traffic). +> - **SNR** is how easily you can distinguish your friend's voice from the background noise. + +If your friend shouts at you at a deafening rock concert, the signal is incredibly loud (High RSSI), but you still can't understand them because the background noise is louder (Bad SNR). Conversely, if your friend whispers to you in a dead-silent library, the signal is very weak (Low RSSI), but you can understand them perfectly (Great SNR). + +--- + +## 2. The Magic of LoRa: Hearing "Below the Noise Floor" + +For standard radios (like FM or Wi-Fi), if the background noise is louder than the signal (a negative SNR), the receiver just hears static. + +LoRa is special. It uses **"Spread Spectrum"** modulation, which allows the radio to mathematically pull a signal out of the air even when it is buried deep _underneath_ the background noise. This is why you will frequently see **negative SNR numbers** in Meshtastic (e.g., -10 dB, which means the signal is 10 decibels weaker than the background static). + +Depending on which Meshtastic preset you are using (e.g., `LongFast` vs. `ShortFast`), the radio has a specific **SNR Limit** — the absolute maximum amount of noise it can tolerate before the message is completely lost to the static. + +--- + +## 3. How the Signal Meter Calculates Quality + +The Meshtastic apps take both RSSI and SNR and run them through a specific formula to assign your signal a quality rating (None, Bad, Fair, or Good). It specifically scales these values based on the physical limits of the radio preset you are using. + +Here is exactly how the app decides how many bars (or what color) to show you: + +| Level | Bars | Criteria | Meaning | +| ----- | ---- | ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | +| Bra | 3 | RSSI better than `-115 dBm` **AND** SNR better than `-7 dB` | Signal is both loud and clear — healthy connection. | +| Ok | 2 | RSSI better than `-126 dBm` with good SNR, **OR** SNR better than `-15 dB` with good RSSI | Signal getting quieter or noisier, but still decodable. | +| Dålig | 1 | Falls between Fair and None thresholds | At the edge of range or experiencing interference. | +| Ingen | 0 | RSSI worse than `-126 dBm` **AND** SNR worse than `-15 dB` | Transmission completely buried in noise. | + +--- + +## 4. What This Means for You + +Because Meshtastic's meter acts as a **"Clarity Meter"**, it behaves differently than what most people expect: + +> **Tip — Don't panic over low RSSI:** You might see a seemingly terrible RSSI value like `-118 dBm`. On a cell phone, you would have zero bars. But if you have an SNR of `+2 dB`, Meshtastic will still show a strong signal! _The library is quiet, so the whisper is heard perfectly._ + +> **Warning — Watch out for local noise:** If you hook up a massive antenna and see a great RSSI (e.g., `-90 dBm`) but your signal meter is only showing **1 Bar (Bad)**, you have a problem. It means you have local interference — perhaps a cheap power supply, a noisy computer, or a nearby radio tower — creating so much static that it is drowning out your mesh. + +## Where Signal Information Appears + +In the app, signal data is shown in several places: + +- **Node list** — signal bars icon next to each node +- **Node detail** — SNR, RSSI, and signal quality in the device metrics section +- **Traceroute** — per-hop signal quality for each relay node +- **Signal metrics** — historical SNR and RSSI data in the metrics charts + +![Node entry showing SNR, RSSI values and colored signal bars](/assets/screenshots/nodes_signal_info.png) + diff --git a/docs/sv-rSE/user/tak.md b/docs/sv-rSE/user/tak.md new file mode 100644 index 000000000..7f4a4be7b --- /dev/null +++ b/docs/sv-rSE/user/tak.md @@ -0,0 +1,126 @@ +--- +title: TAK Integration +nav_order: 10 +last_updated: 2026-05-13 +description: Interoperate with ATAK and WinTAK — CoT position sharing, TAK roles, and plugin setup. +aliases: + - tak + - atak + - team-awareness-kit +--- + +# TAK Integration + +Meshtastic integrates with the Team Awareness Kit (TAK) ecosystem, enabling interoperability between Meshtastic mesh devices and TAK applications like ATAK and WinTAK. + +## Overview + +The TAK module allows Meshtastic nodes to: + +- Share position data in TAK-compatible CoT (Cursor on Target) format +- Appear as team members on TAK map displays +- Receive TAK PLI (Position Location Information) messages + +## Setup + +### Prerequisites + +- ATAK (Android Team Awareness Kit) or WinTAK installed +- Meshtastic ATAK Plugin installed +- TAK module enabled on your Meshtastic radio + +### Konfiguration + +1. Navigate to **Settings → Module Config → TAK**. +2. Enable the TAK module. +3. Configure the TAK team/group settings: + +![Module toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | Beskrivning | +| --------- | -------------------------- | +| Aktiverad | Activate TAK interop | +| Typ | TAK-compatible output mode | + +### ATAK Plugin Setup + +1. Install the Meshtastic ATAK Plugin from the plugin repository. +2. Open ATAK and enable the Meshtastic plugin. +3. The plugin bridges messages between ATAK and your mesh network. + +## TAK Roles + +Nodes configured with TAK-related roles behave differently from standard clients: + +| Roll | Beskrivning | +| --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **TAK** | Full TAK interoperability — sends and receives CoT data, chat messages, and PLI updates. Functions as a standard client plus TAK bridge. | +| **TAK Tracker** | Position-only TAK output — automatically broadcasts PLI at regular intervals without user interaction. Optimized for unattended position beacons (vehicles, equipment, waypoints). Does not relay chat messages. | + +> 💡 **Tip:** Use **TAK Tracker** for devices that only need to report position (e.g., a radio mounted in a vehicle). Use **TAK** for devices where users actively participate in TAK operations. + +### CoT (Cursor on Target) Format + +TAK messages use the Cursor on Target XML format — a military standard for sharing situational awareness data. Meshtastic converts its internal protobuf messages to CoT format when bridging to TAK systems, so no manual format conversion is needed. + +## TAK Identity + +When using TAK roles, your node broadcasts identity information that appears on TAK maps: + +| Setting | Beskrivning | +| -------- | ---------------------------------------------------------------------------------------------------------------- | +| Team | Your team color on the TAK map (e.g., Blue, Red, Cyan, Green) | +| Roll | Your operational role (Team Member, Team Lead, HQ, Medic, RTO, etc.) | +| Callsign | Your TAK callsign (defaults to your Meshtastic long name) | + +These settings appear in **Settings → Module Config → TAK** when the TAK module is enabled. + +> 💡 **Tip:** Team/role colors are the standard TAK affiliation colors. Coordinate with your TAK team to use consistent team assignments. + +## Wire Format (V1 / V2) + +Meshtastic supports two TAK wire formats: + +| Format | Compatibility | Features | +| ------------------------------- | --------------------------------------------------------------- | --------------------------------------------------------- | +| V1 (Legacy) | ATAK Plugin v1.x, older firmware | Basic CoT position sharing only | +| V2 (Current) | ATAK Plugin v2.x, firmware 2.3+ | Full CoT support including chat, routes, zstd compression | + +The app automatically selects V2 when both sides support it. No manual configuration needed — the TAK module negotiates format based on firmware capabilities. + +## Usage with ATAK + +Once configured: + +- Meshtastic nodes appear as markers on the ATAK map with callsign labels +- Chat messages can bridge between mesh and TAK networks +- Position updates flow bidirectionally between Meshtastic and TAK +- TAK Tracker nodes broadcast PLI automatically — their positions appear on ATAK maps without any ATAK-side configuration + +> ⚠️ **Note:** TAK integration requires specific node roles and module configuration. Standard client nodes don't automatically participate in TAK operations. + +## Felsökning + +| Problem | Cause | Solution | +| -------------------------------- | ------------------------------------- | ----------------------------------------------------------------------- | +| Node doesn't appear on ATAK map | TAK module disabled or wrong role | Verify TAK module is enabled and node role is TAK or TAK Tracker | +| Position updates are stale | GPS fix lost or interval too long | Check GPS status; reduce position broadcast interval in Position Config | +| ATAK plugin shows "disconnected" | BLE connection lost or plugin crashed | Reconnect Bluetooth in Meshtastic app, then restart ATAK plugin | +| Chat messages not bridging | V1 format doesn't support chat | Ensure both nodes run firmware 2.3+ for V2 wire format | +| CoT data not flowing | Channel mismatch | All TAK nodes must be on the same channel with matching encryption | + +## Security Considerations + +- TAK data shares your position and callsign information +- Ensure your channel encryption is configured when using TAK in sensitive environments +- The TAK module respects the same channel encryption as other Meshtastic messages + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — TAK module configuration +- [Nodes](nodes) — TAK and TAK Tracker roles in the node list +- [Map & Waypoints](map-and-waypoints) — node positions on the map +- [ATAK plugin guide](https://meshtastic.org/docs/software/integrations/atak-plugin) — detailed ATAK setup on meshtastic.org + +--- + diff --git a/docs/sv-rSE/user/telemetry-and-sensors.md b/docs/sv-rSE/user/telemetry-and-sensors.md new file mode 100644 index 000000000..8dab15dcb --- /dev/null +++ b/docs/sv-rSE/user/telemetry-and-sensors.md @@ -0,0 +1,118 @@ +--- +title: Telemetry & Sensors +nav_order: 9 +last_updated: 2026-05-13 +description: Sensor data on the mesh — supported environment, air quality, and power sensors, plus configuration and viewing guides. +aliases: + - sensors + - environment + - weather + - power-metrics +--- + +# Telemetry & Sensors + +Meshtastic nodes can collect and share sensor data across the mesh network. + +## Overview + +Telemetry allows nodes equipped with sensors to broadcast environmental, power, and device health information. This data is visible on the node detail screen and can be logged over time. + +## Device Telemetry + +All Meshtastic nodes report basic device telemetry: + +| Metric | Beskrivning | Typical Range | +| ------------------ | ------------------------------ | ------------------------------------------------------------------ | +| Battery Level | Charge percentage | 0–100% | +| Spänning | Battery voltage | 3.0–4.2V (LiPo) | +| Kanalutnyttjande | % of airtime used locally | 0–100% | +| Air Utilization TX | % of airtime used by this node | 0–100% | +| Upptid | Seconds since last boot | Varies | + +## Environment Sensors + +Supported environmental sensors: + +### Temperature & Humidity + +| Sensor | Temperatur | Luftfuktighet | Tryck | Anteckningar | +| ------- | ---------- | ------------- | ----- | ----------------------- | +| BME280 | ✓ | ✓ | ✓ | Recommended all-in-one | +| BME680 | ✓ | ✓ | ✓ | Adds gas resistance/IAQ | +| SHT31 | ✓ | ✓ | — | High accuracy | +| MCP9808 | ✓ | — | — | Precision temperature | +| LPS22 | — | — | ✓ | Pressure only | + +### Air Quality + +| Sensor | Metric | Anteckningar | +| -------- | -------------------------------------------------- | -------------------------- | +| BME680 | Gas Resistance / IAQ | Volatile organic compounds | +| PMSA003I | PM1.0, PM2.5, PM10 | Particulate matter | +| SEN55 | PM, NOx, VOC, Temp, Humidity | Multi-sensor | + +### Light & UV + +| Sensor | Metric | +| -------- | -------------------------------------- | +| OPT3001 | Ambient light (lux) | +| VEML7700 | Ambient light (lux) | +| LTR390 | UV index | + +## Strömdata + +Nodes with INA-series power sensors can report: + +| Metric | Beskrivning | +| ----------- | ----------------------------------------- | +| Bus Voltage | Supply rail voltage | +| Ström | Power consumption (mA) | +| Ström | Calculated power (mW) | + +Useful for monitoring solar charging or battery health on remote nodes. + +## Configuring Telemetry + +1. Navigate to **Settings → Module Config → Telemetry**. +2. Set reporting intervals: + - **Device Metrics Interval** — how often to broadcast device metrics + - **Environment Metrics Interval** — how often to broadcast sensor data +3. Enable specific sensor types as needed. + +### Recommended Intervals + +| Use Case | Device (s) | Environment (s) | +| ------------------------------------------ | ----------------------------- | ---------------------------------- | +| Urban mesh (many nodes) | 3600 | 3600 | +| Rural mesh (few nodes) | 900 | 900 | +| Weather station | 900 | 300 | +| Battery conservation | 7200 | 7200 | + +> ⚠️ **Note:** Shorter intervals increase airtime usage and battery drain across the mesh. + +## Viewing Telemetry + +1. Navigate to **Nodes** and select a node. +2. Telemetry sections show on the detail screen: + - Device Metrics (always available) + - Environment Metrics (if sensors present) + - Power Metrics (if INA sensor present) +3. Historical graphs show trends over time. + +![Telemetry actions](/assets/screenshots/node-metrics_telemetric_actions.png) + +## Felsökning + +- **No environment data showing?** The remote node needs a physical sensor connected (e.g., BME280 on I2C). Device telemetry (battery, uptime) is always available, but environment metrics require hardware. +- **Stale readings?** Check the reporting interval — very long intervals (7200s+) mean data updates infrequently. Also verify the remote node is still online. +- **Sensor conflict on I2C bus?** Some sensors share I2C addresses. If you have multiple sensors on the same bus, check for address collisions in the radio's serial debug output. + +## Related Topics + +- [Node Metrics](node-metrics) — view telemetry data on the node detail screen +- [Settings — Modules & Admin](settings-module-admin) — telemetry module configuration +- [Units & Locale](units-and-locale) — temperature and pressure display units + +--- + diff --git a/docs/sv-rSE/user/translate.md b/docs/sv-rSE/user/translate.md new file mode 100644 index 000000000..14a037743 --- /dev/null +++ b/docs/sv-rSE/user/translate.md @@ -0,0 +1,97 @@ +--- +title: Translate the App +parent: User Guide +nav_order: 17 +last_updated: 2026-05-13 +aliases: + - translate + - crowdin + - localization +--- + +# Translate the App + +Contributing translations helps make Meshtastic accessible to a wider audience. The app uses [Crowdin](https://crowdin.com/) to manage community translations for both the user interface and in-app documentation. + +--- + +## What Gets Translated + +| Resource | Source Location | Anteckningar | +| ----------------- | ------------------------------------- | ---------------------------------------------------------------------- | +| UI strings | `composeResources/values/strings.xml` | Buttons, labels, messages, and all user-visible text | +| User Guide pages | `docs/user/*.md` | In-app documentation shown in Help & Documentation | +| Fastlane metadata | `fastlane/metadata/android/en-US/` | App Store listing title, description, and changelogs | + +> **Note — Developer Guide pages are English-only.** Code-focused documentation targeting contributors is not translated. + +--- + +## How to Contribute + +1. **Visit the Crowdin project.** Open the [Meshtastic Android Crowdin project](https://crowdin.com/project/meshtastic-android) and sign in or create a free account. +2. **Choose your language.** Select an existing language or request a new one by opening a [GitHub issue](https://github.com/meshtastic/Meshtastic-Android/issues/new). +3. **Translate strings.** Crowdin shows the English source on the left and your translation on the right. Translate each string and save. +4. **Review context.** Many strings include screenshots or context comments — check these to understand where the text appears in the app. +5. **Submit.** Approved translations are automatically merged into the next release. + +> **Tip — Keep translations short.** UI strings often appear in buttons, chips, or narrow columns. If a translation is significantly longer than the English original, consider abbreviating where the meaning stays clear. + +--- + +## Adding a New Language + +If your language is not yet listed on Crowdin: + +1. Open an issue on [GitHub](https://github.com/meshtastic/Meshtastic-Android/issues/new) requesting the new locale. +2. A maintainer will add the language to Crowdin and configure `crowdin.yml`. +3. Once added, you can begin translating immediately. + +--- + +## How Translations Are Organized + +The Android app uses **Compose Multiplatform resources** for all user-visible strings: + +``` +core/resources/src/commonMain/composeResources/ +├── values/ ← English (default) +│ └── strings.xml +├── values-de/ ← German +│ └── strings.xml +├── values-fr/ ← French +│ └── strings.xml +└── ... +``` + +In-app documentation follows a similar pattern under `docs/`: + +``` +docs/ +├── user/ ← English source (default) +│ ├── onboarding.md +│ └── ... +├── fr/user/ ← French translations +│ ├── onboarding.md +│ └── ... +└── ... +``` + +The app automatically selects the correct locale based on your device's **Language & Region** settings. + +--- + +## Translation Guidelines + +- **Do not translate** technical terms like "LoRa", "MQTT", "BLE", "TAK", "SNR", or "RSSI" — these are universal. +- **Keep placeholders intact.** Strings like `%1$s` or `%d` are filled in at runtime. Do not remove or reorder them unless the grammar of your language requires it. +- **Match tone.** The app uses a friendly, direct voice. Avoid overly formal language. +- **Test if possible.** Switch your device language and open the app to see how translations look in context. + +--- + +## Questions? + +If you have questions about a specific string's context or need help getting started, open a discussion on the [Meshtastic GitHub Discussions](https://github.com/meshtastic/Meshtastic-Android/discussions) page. + +Thank you for helping expand the reach of Meshtastic! diff --git a/docs/sv-rSE/user/units-and-locale.md b/docs/sv-rSE/user/units-and-locale.md new file mode 100644 index 000000000..593b86bcd --- /dev/null +++ b/docs/sv-rSE/user/units-and-locale.md @@ -0,0 +1,118 @@ +--- +title: Units, Measurement & Locale +parent: User Guide +nav_order: 16 +last_updated: 2026-05-12 +--- + +# Units, Measurement & Locale + +The Meshtastic app automatically displays temperatures, distances, speeds, and times in the units your device is configured to use — no settings to change inside the app. + +--- + +## How It Works + +Meshtastic radios always transmit data in **metric units** (meters, °C, km/h, hPa, etc.). When the app receives this data, it uses the `MetricFormatter` utility to convert and display values in whatever unit system your device's locale specifies. + +On Android, your measurement preferences are determined by your system **Language & Region** settings. On Desktop (JVM), the app uses the JVM's default `Locale`. + +> **Tip — You never need to toggle units inside the app.** Change your system measurement preferences and every screen in Meshtastic updates automatically — node details, telemetry charts, weather, altitude, and more. + +--- + +## Temperatur + +Temperature values from environment sensors are transmitted as **°C** and displayed based on your device's temperature unit preference. + +![Environment metrics with temperature](/assets/screenshots/nodes_environment_metrics.png) + +| Your Setting | You See | +| ------------ | ------- | +| Celsius | 22°C | +| Fahrenheit | 72°F | + +This affects all temperature displays throughout the app: node environment telemetry, soil temperature, dew point, and telemetry chart axes. + +## Distance & Altitude + +Distances between nodes and GPS altitudes are transmitted as **meters** and automatically scaled and converted. + +![Distance info display](/assets/screenshots/nodes_distance_info.png) + +| Your Setting | Small Distance | Large Distance | Altitud | +| -------------------------------- | -------------- | ---------------------- | -------- | +| Metric | 350 m | 2.5 km | 1,200 m | +| Imperial (US) | 1,148 ft | 1.6 mi | 3,937 ft | + +The app uses natural scaling — short distances stay in meters or feet, while longer distances switch to kilometres or miles automatically. + +### Where these appear + +- **Node list** — distance and bearing to each node +- **Node detail** — altitude, distance from your position +- **Map** — waypoint distances, traceroute hop distances +- **Compass** — distance to selected node + +## Hastighet + +GPS ground speed is displayed in your locale's preferred speed unit. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Metric | 12 km/h | +| Imperial (US) | 7 mph | + +## Vind + +Wind speed and gust data from environment sensors are transmitted as **m/s** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Metric | 5 m/s | +| Imperial (US) | 11 mph | + +Wind readings appear in the **Node Detail** environment section and the **Environment Telemetry** charts. + +## Rainfall + +Rainfall measurements (1-hour and 24-hour totals) are transmitted as **mm** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ---------------------- | +| Metric | 12 mm | +| Imperial (US) | 0.5 in | + +## Units That Never Change + +Some units are international standards and are displayed the same way regardless of your locale: + +| Measurement | Unit | Why | +| -------------------------------- | ------------------------------ | ------------------------------------- | +| Barometric pressure | hPa | International meteorological standard | +| Heading / bearing | ° (degrees) | Universal navigation convention | +| Strålning | μR/hr | Standard dosimetry unit | +| GPS coordinates | decimal degrees | Universal geographic standard | +| Humidity, battery, soil moisture | % | Universal | + +## Date & Time + +All timestamps throughout the app — last heard, message times, telemetry logs, chart axes — follow your device's date and time preferences. + +| Setting | What It Controls | Example | +| ---------------- | ---------------- | ------------------------------------------------ | +| **24-Hour Time** | Clock format | 14:30 vs 2:30 PM | +| **Date Format** | Date ordering | 09/05/2026 vs 05/09/2026 | + +The app also uses **relative time** where it makes sense — for example, "5 min ago" or "2 hours ago" in the node list — which is automatically localised into your device language. + +## Changing Your Measurement System (Android) + +On Android, your measurement system (metric vs imperial) is tied to your region setting: + +1. Open **Android Settings → System → Language & Region** +2. Change your **Region** or **Measurement units** preference +3. Return to Meshtastic — values update immediately + +> **Tip — The app uses `MetricFormatter` from `core:common`.** All measurement formatting is handled by a shared KMP utility that respects your platform's locale. Developers adding new measurement displays should use `MetricFormatter` rather than hard-coding unit conversions. + diff --git a/docs/tr-rTR/index.md b/docs/tr-rTR/index.md new file mode 100644 index 000000000..68c490a51 --- /dev/null +++ b/docs/tr-rTR/index.md @@ -0,0 +1,30 @@ +--- +title: Home +layout: default +nav_order: 0 +--- + +# Meshtastic Android App Documentation + +User and developer documentation for the Meshtastic Android, Desktop, and iOS applications powered by KMP (Kotlin Multiplatform). + +Use the sidebar navigation to browse the **User Guide** for app features and the **Developer Guide** for contributing to the project. + +--- + +## Quick Links + +| Guide | Açıklaması | +| --------------------------------------------------------------------- | -------------------------------------------------------------- | +| [Getting Started](user/onboarding) | Connect your first radio and send a message | +| [Messages & Channels](user/messages-and-channels) | Channel broadcasts, direct messages, reactions, and encryption | +| [Nodes](user/nodes) | Understanding the mesh network node list | +| [Signal Meter](user/signal-meter) | How the LoRa signal quality meter works | +| [Units & Locale](user/units-and-locale) | How temperatures, distances, and times adapt to your region | +| [Desktop App](user/desktop) | Linux, macOS, and Windows desktop usage | +| [Architecture](developer/architecture) | App architecture overview for contributors | +| [Contributing](developer/contributing) | Branch naming, PR workflow, and verification commands | + +--- + +> This documentation is served from the same markdown source that powers the in-app **Help & Documentation** browser. diff --git a/docs/tr-rTR/user/connections.md b/docs/tr-rTR/user/connections.md new file mode 100644 index 000000000..480732ae6 --- /dev/null +++ b/docs/tr-rTR/user/connections.md @@ -0,0 +1,125 @@ +--- +title: Bağlantılar +nav_order: 2 +last_updated: 2026-05-13 +description: Connect your phone or desktop to a Meshtastic radio via Bluetooth, USB, or TCP/IP. +aliases: + - bluetooth + - usb + - tcp + - pairing +--- + +# Bağlantılar + +Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node. + +## Bluetooth (BLE) + +Bluetooth Low Energy is the default and most common connection method on Android. + +### Pairing a Device + +1. Ensure your Meshtastic radio is powered on and in pairing mode. +2. Open the app and navigate to **Connections**. +3. Tap **Scan for Devices** — nearby Meshtastic radios will appear. +4. Select your device from the list. +5. Accept the Bluetooth pairing prompt if shown. + +![Device list item](/assets/screenshots/connections_bluetooth_scan.png) + +You can filter devices by transport type using the filter chips at the top: + +![Transport filter chips](/assets/screenshots/connections_transport_filters.png) + +> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. + +### Connection Status + +| Icon | State | Açıklaması | +| ---- | ---------------- | ----------------------------- | +| 🟢 | Bağlandı | Active radio link established | +| 🟡 | Bağlanıyor | Handshake in progress | +| 🔴 | Bağlantı kesildi | No active connection | +| ⚪ | Not configured | No device selected | + +When connecting, a status indicator shows the current connection state: + +![Connecting status](/assets/screenshots/connections_connecting.png) + +If no devices are found, the app shows an empty state with instructions: + +![No devices found](/assets/screenshots/connections_empty_state.png) + +### Troubleshooting Bluetooth + +- **Device not found:** Toggle Bluetooth off/on, ensure location is enabled. +- **Connection drops:** Move closer to the radio; check for interference. +- **Pairing rejected:** Forget the device in Android Bluetooth settings and retry. + +## USB Serial + +USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable. + +### Setup + +1. Connect your radio via USB cable to your device. +2. The app will prompt for USB permission — tap **Allow**. +3. The connection is established automatically. + +> ⚠️ **Note:** USB connections require OTG support on Android devices. + +## TCP/IP (WiFi) + +Some Meshtastic radios support WiFi connectivity, allowing TCP-based connections. + +### Yapılandırma + +1. Connect your radio to a WiFi network via the radio's web interface or settings. +2. In the app, go to **Connections → TCP**. +3. Enter the radio's IP address and port (default: 4403). +4. Tap **Connect**. + +![WiFi scanning for devices](/assets/screenshots/connections_wifi_scanning.png) + +When a device is found, it appears in the connection list: + +![WiFi device found](/assets/screenshots/connections_wifi_device_found.png) + +A successful connection is confirmed with a status indicator: + +![WiFi connection success](/assets/screenshots/connections_wifi_success.png) + +### When to Use TCP + +- Radio is on the same local network +- Testing with a simulated radio +- Environments where Bluetooth has interference issues + +## Reconnection Behavior + +The app reconnects to the **last selected device** on startup. You can manually switch transports from the connections screen at any time. + +To disconnect from a radio, use the disconnect button on the connections screen: + +![Disconnect from radio](/assets/screenshots/connections_disconnect.png) + +## Desktop Connections + +On Desktop (Linux/macOS/Windows), the app supports: + +- **Bluetooth (BLE)** — via the Kable library; works on macOS, Linux, and Windows +- **USB Serial** — primary wired connection method +- **TCP/IP** — for network-connected radios + +See [Desktop App](desktop) for platform-specific details and keyboard shortcuts. + +## Related Topics + +- [Getting Started](onboarding) — first-launch setup and permissions +- [Settings — Radio & User](settings-radio-user) — Bluetooth and network configuration +- [Desktop App](desktop) — desktop-specific connection details +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — full list of compatible radios on meshtastic.org + +--- + diff --git a/docs/tr-rTR/user/desktop.md b/docs/tr-rTR/user/desktop.md new file mode 100644 index 000000000..4271ca403 --- /dev/null +++ b/docs/tr-rTR/user/desktop.md @@ -0,0 +1,147 @@ +--- +title: Desktop App +nav_order: 14 +last_updated: 2026-05-13 +description: Install and use the Meshtastic Desktop app on Linux, macOS, and Windows — connections, feature parity, and keyboard shortcuts. +aliases: + - desktop + - linux + - macos + - windows + - jvm +--- + +# Desktop App + +The Meshtastic Desktop application provides the same mesh communication features on Linux, macOS, and Windows. + +## Genel Bakış + +The Desktop app shares its core codebase with the Android app through Kotlin Multiplatform (KMP). Most features work identically across platforms. + +## Installation + +### Linux + +- Download the `.deb` or `.AppImage` package from the releases page +- Or build from source using `./gradlew :desktopApp:run` + +### macOS + +- Download the `.dmg` package from releases +- Or build from source + +### Windows + +- Download the `.msi` installer from releases +- Or build from source + +## Connecting Your Radio + +### USB Serial (Primary) + +The most reliable connection method on Desktop: + +1. Connect your Meshtastic radio via USB cable. +2. The app should detect the serial port automatically. +3. If not detected, select the correct serial port from the connections menu. + +### TCP/IP + +For network-connected radios: + +1. Enter the radio's IP address and port (default: 4403). +2. Click **Connect**. + +### Bluetooth (BLE) + +Bluetooth Low Energy is supported on Desktop via the [Kable](https://github.com/JuulLabs/kable) library: + +1. Ensure your system has a Bluetooth adapter. +2. The app scans for nearby Meshtastic radios automatically. +3. Select your device from the connections screen. + +## Feature Parity + +| Feature | Android | Desktop | Notes | +| ---------------------------------------- | ------- | ------- | -------------------------- | +| Messaging | ✓ | ✓ | Full parity | +| Node List | ✓ | ✓ | Full parity | +| Harita | ✓ | ✓ | Full parity | +| Ayarlar | ✓ | ✓ | Full parity | +| Bluetooth (BLE) | ✓ | ✓ | Via Kable on desktop | +| Firmware Update OTA | ✓ | ✗ | Use web flasher | +| Notifications | ✓ | ✓ | Native OS notifications | +| Widgets | ✓ | ✗ | Android-only | +| AI Assistant (Chirpy) | ✓\* | ✗ | Google flavor Android only | + +\*Chirpy AI requires Android 14+ on Google flavor builds with supported hardware. + +## UI Differences + +The Desktop app uses the same Compose Multiplatform UI with adaptations for larger screens and desktop interaction. + +### Keyboard Shortcuts + +| Shortcut | Action | +| ------------------- | --------------------------- | +| **⌘Q** / **Ctrl+Q** | Quit the application | +| **⌘,** / **Ctrl+,** | Open Settings | +| **⌘1** / **Ctrl+1** | Switch to Conversations tab | +| **⌘2** / **Ctrl+2** | Switch to Nodes tab | +| **⌘3** / **Ctrl+3** | Switch to Map tab | +| **⌘4** / **Ctrl+4** | Switch to Connections tab | + +### Window & System Tray + +- **Window resizing** — responsive layout adapts to window dimensions +- **System tray** — minimize to system tray for background mesh operation +- **Tray menu** — right-click the tray icon to show window or quit +- **Mouse interaction** — hover states and standard desktop navigation + +### Notification Preferences + +The Desktop app provides in-app toggles for controlling which notifications are shown — messages, new nodes, and low battery alerts. Access these from **Settings → Notifications** within the app. + +## Built-in Documentation Browser + +The Desktop app includes a built-in documentation browser for quick access to help content without leaving the application. + +![Docs browser with table of contents](/assets/screenshots/docs-browser_toc.png) + +The browser supports full-text search across all documentation: + +![Searching the docs browser](/assets/screenshots/docs-browser_search.png) + +Individual doc pages render with full formatting: + +![A documentation page](/assets/screenshots/docs-browser_page.png) + +## Building from Source + +```bash +git clone https://github.com/meshtastic/Meshtastic-Android.git +cd Meshtastic-Android +git submodule update --init +./gradlew :desktopApp:run +``` + +Requirements: + +- JDK 21 +- No Android SDK required for desktop-only builds + +## Known Limitations + +- No OTA firmware updates (use web flasher) +- Some Android-specific features (widgets, specific notification channels) are unavailable +- Performance may vary on low-spec hardware running Compose Desktop +- BLE bonding is not yet supported on desktop (pairing works without bonding) + +## Related Topics + +- [Connections](connections) — connection methods overview +- [Firmware Updates](firmware) — use the [Web Flasher](https://flasher.meshtastic.org) for desktop firmware updates + +--- + diff --git a/docs/tr-rTR/user/discovery.md b/docs/tr-rTR/user/discovery.md new file mode 100644 index 000000000..41d3c587b --- /dev/null +++ b/docs/tr-rTR/user/discovery.md @@ -0,0 +1,114 @@ +--- +title: Discovery +nav_order: 12 +last_updated: 2026-05-13 +description: Explore your mesh network — traceroute paths, neighbor maps, and node discovery tools. +aliases: + - mesh-discovery + - local-discovery + - network-scan + - traceroute + - neighbor-info +--- + +# Discovery + +Discovery tools help you understand **how** your mesh network is connected — which nodes can hear each other, what paths messages take, and where bottlenecks or weak links exist. + +> 💡 **Tip:** You don't need a dedicated "discovery mode" to start exploring your mesh. The tools below are available right now from the node list and node detail screens. + +--- + +## Yol izle + +Traceroute reveals the exact path a message takes from your node to any other node on the mesh. It's the single most useful tool for debugging connectivity problems. + +### Running a Traceroute + +1. Navigate to **Nodes** and tap the node you want to trace. +2. On the node detail screen, tap **Traceroute**. +3. The app sends a traceroute request and waits for the response. +4. Results display each hop in order, with signal quality at every step. + +### Reading the Results + +A traceroute result looks like this: + +``` +You → Node A (SNR: 8.5, RSSI: -95) → Node B (SNR: 5.2, RSSI: -108) → Target +``` + +Each hop represents a relay node that forwarded the message. The SNR and RSSI values at each hop tell you about the link quality on that specific segment. + +| What to look for | What it means | +| -------------------------------------------------------------------------- | --------------------------------------------------------------------------- | +| All hops show Good SNR (> 5 dB) | Healthy path — messages flow reliably | +| One hop shows Bad SNR (< 0 dB) | Weak link — this relay segment is fragile | +| Many hops (4+) | Long path — consider repositioning a node to shorten it | +| Different path on retry | Mesh is adapting — multiple routes exist (this is good!) | + +> 💡 **Tip:** Run traceroute several times over a few minutes. If the path changes, your mesh has redundant routes — a sign of a well-connected network. + +### Troubleshooting with Traceroute + +- **"No route found"** — The target node may be offline, out of range, or on a different channel. Check that both nodes share at least one channel with the same encryption key. +- **Traceroute times out** — The path may be too long (exceeds hop limit) or a relay node is congested. Try increasing the hop limit in **Settings → LoRa Config**. +- **Asymmetric paths** — A traceroute from A→B may take a different path than B→A. This is normal — radio propagation is not always symmetric. + +--- + +## Komşu Bilgisi + +The Neighbor Info module lets each node broadcast a list of the nodes it can **directly hear** (single-hop). When multiple nodes share their neighbor lists, you can piece together a topology map of the entire mesh. + +### Enabling Neighbor Info + +1. Navigate to **Settings → Module Config → Neighbor Info**. +2. Enable the module. +3. Set the broadcast interval (default: 900 seconds / 15 minutes). + +Once enabled, your node periodically broadcasts its neighbor table. Other nodes with Neighbor Info enabled do the same. + +### Viewing Neighbor Data + +- Open any node's detail screen and look for the **Neighbors** section. +- Each neighbor entry shows the node that was directly heard and its signal quality. +- Combine neighbor data from multiple nodes to understand the full mesh topology. + +> ⚠️ **Note:** Neighbor Info increases airtime usage because every enabled node periodically broadcasts its neighbor list. On busy meshes with many nodes, consider longer broadcast intervals (3600 seconds or more) to avoid congestion. + +--- + +## Node List as a Discovery Tool + +The node list itself is a powerful discovery tool when you use its filtering and sorting features effectively. + +### Finding New Nodes + +- Sort by **Last heard** to see the most recently active nodes at the top. +- Enable **Include unknown** to see nodes that have appeared on the mesh but haven't sent user info yet — these are often newly powered-on devices. + +### Assessing Connectivity + +- Sort by **Hops away** to see which nodes are directly reachable (0 hops) versus relayed. +- Sort by **Distance** to find nearby nodes and verify they're reachable. +- Use **Exclude MQTT** to focus on nodes reachable over radio (not via internet bridge). + +### Infrastructure Audit + +- Disable **Exclude infrastructure** to see Router, Repeater, Router Late, and Client Base nodes. +- Check their signal quality and last-heard times to verify your infrastructure nodes are healthy. + +See [Nodes](nodes) for full details on filtering and sorting options. + +--- + +## Tips for Mesh Exploration + +- **Start with traceroute** — it gives you immediate, actionable information about a specific path. +- **Enable Neighbor Info on key nodes** — especially routers and repeaters, to build a picture of the backbone. +- **Check the map** — node positions on the [Map](map-and-waypoints) combined with signal data help you understand why some links are strong and others are weak. +- **Compare signal over time** — use the [Signal Meter](signal-meter) guide to interpret SNR and RSSI values correctly. + +--- + diff --git a/docs/tr-rTR/user/firmware.md b/docs/tr-rTR/user/firmware.md new file mode 100644 index 000000000..b2ab14c04 --- /dev/null +++ b/docs/tr-rTR/user/firmware.md @@ -0,0 +1,114 @@ +--- +title: Firmware Updates +nav_order: 13 +last_updated: 2026-05-13 +description: Update your radio firmware over Bluetooth — OTA process, version channels, pre-flight checks, and recovery. +aliases: + - firmware + - update + - Kablosuz Güncelleme + - flash +--- + +# Firmware Updates + +Keep your Meshtastic radio up to date with the latest firmware for new features, bug fixes, and security improvements. + +## Checking for Updates + +1. Navigate to **Settings → Firmware Update** or tap the firmware notification if shown. +2. The app checks for available firmware versions. +3. Available updates show the version number and changelog summary. + +## Update Methods + +### OTA (Over-The-Air) via Bluetooth + +The most common update method for Android users: + +1. Ensure your radio is connected via Bluetooth. +2. Navigate to the Firmware Update screen. +3. Select the desired firmware version. +4. Tap **Update** to begin the OTA process. +5. Wait for the update to complete — **do not disconnect** during the update. + +![Firmware checking for updates](/assets/screenshots/firmware_checking.png) + +> ⚠️ **Warning:** Interrupting a firmware update can brick your device. Ensure your radio has sufficient battery (>50% recommended) and maintain Bluetooth proximity during the entire process. + +![Firmware disclaimer](/assets/screenshots/firmware_disclaimer.png) + +### USB Flashing + +For recovery or when OTA is unavailable: + +- Use the [Meshtastic Web Flasher](https://flasher.meshtastic.org) +- Or the [Meshtastic CLI tool](https://meshtastic.org/docs/getting-started/flashing-firmware) on desktop + +## Version Channels + +| Kanal | Açıklaması | +| ------ | ------------------------------------------- | +| Stable | Recommended for most users; tested releases | +| Alpha | Preview releases; may contain bugs | + +## Pre-Update Checklist + +Before updating: + +- [ ] Battery > 50% +- [ ] Stable Bluetooth connection +- [ ] Note your current settings (they may reset on major version changes) +- [ ] Check the release notes for breaking changes + +## Post-Update + +After a successful update: + +- The radio will reboot automatically +- Bluetooth connection will re-establish +- Verify your settings are intact +- Check the firmware version in **Settings → About** + +![Firmware update success](/assets/screenshots/firmware_success.png) + +## Troubleshooting + +### Update Stuck + +If the update appears frozen: + +- Wait at least 5 minutes before intervening +- If truly stuck, power-cycle the radio +- Attempt the update again + +![Firmware update error](/assets/screenshots/firmware_error.png) + +### Device Won't Boot After Update + +If your device fails to boot: + +1. Try connecting via USB to a computer +2. Use the web flasher in recovery/DFU mode +3. Flash a known-good firmware version +4. Check the Meshtastic Discord for device-specific recovery steps + +### Compatibility Warnings + +The app may show warnings when: + +- Connected radio firmware is below minimum supported version +- Major version mismatch between app and firmware +- Deprecated features need migration + +> ⚠️ **Important:** Always update the Meshtastic app before or alongside firmware updates to ensure compatibility. + +## Related Topics + +- [Connections](connections) — reconnecting after a firmware update +- [Flashing firmware guide](https://meshtastic.org/docs/getting-started/flashing-firmware) — full firmware flashing walkthrough on meshtastic.org +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — check firmware compatibility by device +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/tr-rTR/user/map-and-waypoints.md b/docs/tr-rTR/user/map-and-waypoints.md new file mode 100644 index 000000000..ef167cb38 --- /dev/null +++ b/docs/tr-rTR/user/map-and-waypoints.md @@ -0,0 +1,116 @@ +--- +title: Map & Waypoints +nav_order: 6 +last_updated: 2026-05-13 +description: View node positions on the map, create and share waypoints, and manage position sharing and privacy. +aliases: + - map + - waypoints + - gps + - location +--- + +# Map & Waypoints + +The Map screen shows the geographic positions of nodes on your mesh, along with shared waypoints. + +## Map View + +The map displays: + +- **Node positions** — colored markers for each node reporting location +- **Waypoints** — shared points of interest +- **Your position** — your current GPS location + +### Node Markers + +Node markers on the map indicate: + +| Color | Meaning | +| ------ | ---------------------------------------------- | +| Yeşil | Online (heard recently) | +| Yellow | Away (heard within 2 hours) | +| Gray | Offline (stale position) | +| Mavi | Your own node | + +### Map Controls + +- **Zoom** — pinch or use +/- buttons +- **Pan** — drag to explore +- **Center** — select the location button to center on your position +- **Node tap** — tap a node marker to view details + +The floating toolbar provides quick access to compass, layer switching, node filters, refresh, and location tracking. Tap the compass to reorient north-up, or tap the location button to center on your current position. + +![Map controls overlay](/assets/screenshots/map_controls_overlay.png) + +## Waypoints + +Waypoints are shared geographic points of interest that all mesh members can see. + +### Creating a Waypoint + +1. Long-press on the map at the desired location. +2. Enter a name and optional description. +3. Choose an icon/emoji for the waypoint. +4. Tap **Send** to share with the mesh. + +### Waypoint Properties + +| Property | Açıklaması | +| ---------- | ------------------------------------------------------- | +| İsmi | Short identifier (max 30 characters) | +| Açıklaması | Optional longer description | +| Icon | Visual marker emoji on the map | +| Kilitli | If locked, only the creator can edit or delete | +| Expiration | Optional auto-remove time | + +### Waypoint Expiration + +Waypoints can be set to expire automatically: + +- **Never** (default) — waypoint remains until manually deleted +- **Timed** — waypoint is automatically removed after the specified duration (e.g., "remove after 2 hours"). Useful for temporary markers like rally points, hazards, or meeting locations. + +Expired waypoints are automatically hidden from the map so they don't clutter the display. The expiration countdown begins when the waypoint is created, not when other nodes receive it. + +### Managing Waypoints + +- Tap a waypoint on the map to view its details and coordinates +- Edit or delete waypoints you created +- **Locked waypoints** cannot be modified or deleted by other nodes — only the original creator can change them +- Unlocked waypoints can be edited by any mesh member + +## Position Sharing + +### Enabling Position Sharing + +Your node shares its GPS position based on: + +- **Fixed interval** — broadcast position at regular intervals +- **Smart position** — broadcast when movement exceeds a threshold +- **Manual** — only share when explicitly requested + +Configure position behavior in **Settings → Position**. + +### Privacy Considerations + +> 🔒 **Privacy:** Position data is broadcast to all nodes on your channel. If you don't want your location shared, disable GPS position in settings or use a fixed/fake position. + +## Map Sources + +The app supports multiple map tile sources: + +- OpenStreetMap (default) +- Satellite imagery (where available) +- Offline tiles (download map areas for offline use) + +## Related Topics + +- [Nodes](nodes) — view and filter your node list +- [Node Metrics](node-metrics) — signal quality and position history for individual nodes +- [Discovery](discovery) — traceroute and neighbor info for understanding mesh topology +- [Units & Locale](units-and-locale) — distance and coordinate display formats + +--- + diff --git a/docs/tr-rTR/user/messages-and-channels.md b/docs/tr-rTR/user/messages-and-channels.md new file mode 100644 index 000000000..63cb71290 --- /dev/null +++ b/docs/tr-rTR/user/messages-and-channels.md @@ -0,0 +1,159 @@ +--- +title: Messages & Channels +nav_order: 3 +last_updated: 2026-05-13 +description: Send and receive messages, manage channels, configure encryption, and use quick chat, reactions, and message actions. +aliases: + - channels + - direct-messages + - messaging + - conversations +--- + +# Messages & Channels + +Meshtastic supports two communication modes: **channel broadcasts** and **direct messages**. + +## Kanallar + +Channels are shared communication groups. All nodes configured with the same channel key can read and send messages on that channel. + +### Default Channel + +Every Meshtastic device comes with a default **LongFast** channel. This is an unencrypted channel used for general mesh communication. + +### Channel Security + +Channels support multiple encryption levels: + +| Icon | Security Level | Açıklaması | +| ---- | ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------- | +| 🔒 | PSK (256-bit AES) | Fully encrypted with a strong pre-shared key. Only nodes with the matching key can read messages. | +| 🔐 | PSK (128-bit AES) | Encrypted with a shorter key. Secure for most uses but 256-bit is preferred for sensitive data. | +| 🔓 | Default / Open | Uses the well-known default key. **Any Meshtastic device** on the same preset can read these messages. | +| ⚠️ | Insecure + Position | Open channel that also broadcasts your GPS position. Use with caution in public meshes. | + +> 🔒 **Security Tip:** 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. + +### Adding a Channel + +1. Navigate to **Settings → Channels**. +2. Tap **Add Channel** or scan a QR code. +3. Configure the channel name and encryption key. +4. Share the channel URL/QR code with others who need access. + +Tapping a channel shows its details and sharing options. + +## Direct Messages + +Direct messages (DMs) are point-to-point encrypted communications between two specific nodes. + +### Sending a Direct Message + +1. Open the **Messages** tab. +2. Select a node from your contacts list or tap a node in the node list. +3. Type your message and tap **Send**. + +### Message States + +| State | Icon | Meaning | +| --------------------------------- | ---- | ----------------------------------------------------------------------------------------------------------------- | +| Queued | ⏳ | Message waiting to be sent | +| En route | ✓ | Delivered to the radio, awaiting acknowledgment | +| Delivered | ✓✓ | Acknowledgment received from recipient | +| Received | ✓ | Message received from the mesh (incoming) | +| S&F Routing | 🔗 | Store & Forward: message being routed through an S&F node | +| S&F Confirmed | 🔗 | Store & Forward: delivery confirmed via S&F node | +| Hata | ✗ | Delivery failed after retries | + +### Delivery Errors + +When a message fails to deliver, the error indicator shows what went wrong: + +| Hata | Meaning | What to Do | +| ---------------- | ---------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| No Route | No path exists to the destination node | The recipient may be offline or out of mesh range. Try later or move closer. | +| Got NAK | The next-hop node refused to relay | The relay node may be congested. Wait and retry. | +| Zaman Aşımı | No acknowledgment within retry window | The recipient may be just out of range. Try increasing hop limit or moving to a better position. | +| Arayüz Yok | No radio interface available to send | Check that your radio is connected and the channel is configured. | +| Max Retransmit | All retry attempts exhausted | The mesh path is unreliable. Try a different channel or wait for conditions to improve. | +| Kanal yok | The destination channel doesn't exist | Verify both nodes share the same channel configuration. | +| Too Large | Message exceeds maximum payload size | Shorten your message (max ~230 characters). | +| No Response | Node received message but didn't respond | The recipient's radio may be busy or in low-power sleep mode. | +| Duty Cycle Limit | Regional airtime limit reached | Your radio has used its allowed transmit time. Wait for the duty cycle window to reset (typically 1 hour in EU regions). | +| Geçersiz İstek | Malformed or invalid message | This usually indicates a software bug. Try restarting the app. | + +> 💡 **Tip:** 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. + +## Message Features + +### Quick Chat + +Pre-configured messages for rapid communication: + +- Access via the Quick Chat button in the message input area +- Choose from built-in phrases or custom messages +- Customize quick chat messages in **Settings → Quick Chat** +- Useful when typing is impractical (gloves, small screen, urgent) + +![Quick chat option](/assets/screenshots/messages_quick_chat.png) + +The channel list shows each channel with its latest message preview. + +### Message Bubbles + +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. + +### Reactions + +React to messages with emoji: + +- **Long-press** a message to open the actions menu +- Tap **Add Reaction** to choose an emoji +- Reactions appear below the message bubble +- Multiple users can react to the same message +- React to your own messages or others' messages + +![Emoji reaction badges displayed beneath a message](/assets/screenshots/messages_reaction.png) + +> 💡 **Tip:** Reactions are lightweight — they use minimal mesh bandwidth compared to full text messages. + +### Message Actions + +Long-press any message to access: + +- **Copy** — copy message text to clipboard +- **Reply** — quote the message in your response +- **React** — add an emoji reaction +- **Delete** — remove a message you sent (local deletion) + +### Message Priority + +Messages are queued and transmitted based on priority: + +1. Emergency/alert messages (highest) +2. Direct messages +3. Channel broadcasts (lowest) + +### Message Limits + +- **Maximum length:** 237 bytes (approximately 230 characters for ASCII text) +- **Rate limiting:** The mesh enforces airtime fairness; heavy message volume may be throttled +- **Delivery:** Messages are retried automatically if no acknowledgment is received + +## Best Practices + +- Use channels for group coordination +- Use direct messages for private person-to-person communication +- Keep messages short — mesh bandwidth is limited +- Configure encryption for sensitive communications + +## Related Topics + +- [Nodes](nodes) — tap a node to start a direct message +- [Settings — Radio & User](settings-radio-user) — configure channel encryption and presets +- [MQTT](mqtt) — bridge channel messages to the internet +- [Channel configuration](https://meshtastic.org/docs/configuration/radio/channels) — detailed channel settings on meshtastic.org + +--- + diff --git a/docs/tr-rTR/user/mqtt.md b/docs/tr-rTR/user/mqtt.md new file mode 100644 index 000000000..baad01bf7 --- /dev/null +++ b/docs/tr-rTR/user/mqtt.md @@ -0,0 +1,137 @@ +--- +title: MQTT +nav_order: 11 +last_updated: 2026-05-13 +description: Bridge your mesh to the internet — MQTT broker setup, encryption layers, and map reporting. +aliases: + - mqtt + - internet-bridge + - broker +--- + +# MQTT + +MQTT bridges your Meshtastic mesh network to the internet, enabling long-range communication beyond radio range. + +## Genel Bakış + +The MQTT module connects your node to an MQTT broker, allowing: + +- Messages to reach nodes on different physical meshes via the internet +- Integration with home automation and monitoring systems +- Publishing node positions to the public Meshtastic map +- Custom data pipelines for logging and alerting + +## How It Works + +``` +[Your Node] → Radio → [Gateway Node with WiFi] → MQTT Broker → [Remote Gateway] → Radio → [Remote Node] +``` + +A gateway node with internet access (WiFi or Ethernet) publishes mesh messages to an MQTT topic. Remote gateways subscribed to the same topic inject those messages into their local mesh. + +## Yapılandırma + +### Enabling MQTT + +1. Navigate to **Settings → Module Config → MQTT**. +2. Enable the MQTT module. +3. Configure the broker connection: + +![MQTT toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | Açıklaması | Varsayılan | +| --------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------- | +| Server Address | MQTT broker hostname | mqtt.meshtastic.org | +| Kullanıcı adı | Broker authentication | meshdev | +| Şifre | Broker authentication | large4cats | +| Root Topic | Base topic for messages | msh | +| Encryption | Encrypt MQTT payload | Açık | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON packet support has been removed from firmware; this field is ignored | Disabled | +| TLS | Secure connection to broker | Disabled | +| Map Reporting | Report position to public map | Disabled | + +### Default Meshtastic Broker + +The community maintains a public broker at `mqtt.meshtastic.org`. This is intended for general use and testing. + +> 🔒 **Privacy:** Messages on the public broker are readable by anyone subscribed. Always use channel encryption for private communications. + +### Private Broker + +For better privacy and control, you can run your own MQTT broker: + +- Mosquitto (lightweight, open-source) +- HiveMQ +- EMQX + +Configure your node to point to your private broker with appropriate credentials. + +## Map Reporting + +When Map Reporting is enabled, your node publishes its position to the Meshtastic community map: + +- Visible at [meshmap.net](https://meshmap.net) and similar community map services +- Only position and node info are shared +- Disable this if you don't want your location publicly visible + +## Uplink vs Downlink + +| Direction | Açıklaması | +| ------------ | -------------------------------- | +| **Uplink** | Messages from mesh → MQTT broker | +| **Downlink** | Messages from MQTT broker → mesh | + +Configure per-channel which directions are active to control message flow and airtime usage. + +## Message Formats + +MQTT uses protobuf message format: + +| Format | Açıklaması | Use case | +| ------------ | ----------------------------------- | -------------------------- | +| **Protobuf** | Binary Meshtastic protobuf encoding | Node-to-node mesh bridging | + +> ⚠️ **Note:** JSON output support was removed from firmware. The `json_enabled` setting is still visible in the app for legacy compatibility but has no effect on current firmware versions. + +## Encryption & Privacy + +Understanding the layered encryption model: + +1. **Channel encryption** happens on the mesh _before_ MQTT. If your channel has a PSK, the MQTT payload is already encrypted — the broker and any subscribers see only the ciphertext. +2. **MQTT encryption** (the module setting) adds an additional encryption layer for transit to the broker. This protects metadata and routing information. +3. **TLS** encrypts the TCP connection to the broker itself, preventing network-level eavesdropping. + +> 🔒 **Important:** The default public channel has a well-known key. Messages on the default channel sent via MQTT are effectively **unencrypted** — anyone can decode them. Always use a custom PSK for private communications. + +## Best Practices + +- Use channel-level encryption (PSK) on channels that bridge to MQTT +- Don't enable MQTT on nodes without internet access (it will buffer and waste memory) +- Use a private broker for sensitive deployments +- Be mindful of airtime when downlinking messages from busy MQTT topics — every downlinked message consumes radio airtime on your local mesh +- Consider enabling uplink-only if you only need to monitor your mesh remotely without injecting messages back + +## Troubleshooting + +### MQTT Not Connecting + +- **Check WiFi** — the gateway node must have an active internet connection (WiFi or Ethernet). MQTT does not work over the LoRa radio link itself. +- **Verify credentials** — incorrect username or password will silently fail on most brokers. Double-check for trailing spaces. +- **Firewall** — port 1883 (MQTT) or 8883 (MQTT+TLS) must be open. Some networks block non-standard ports. +- **DNS resolution** — if using a custom broker hostname, verify the node can resolve it. Try the broker's IP address directly. + +### Messages Not Bridging + +- **Check uplink/downlink settings** — if only uplink is enabled, messages flow from mesh to MQTT but not back. Enable downlink on the receiving gateway. +- **Channel mismatch** — both gateways must share the same channel with the same PSK. A mismatch means messages are encrypted with different keys and appear as garbage. +- **Topic mismatch** — ensure both gateways use the same root topic. The default `msh` works for the public broker. + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — MQTT module configuration reference +- [Messages & Channels](messages-and-channels) — channel encryption and PSK setup +- [MQTT integration guide](https://meshtastic.org/docs/software/integrations/mqtt) — detailed MQTT documentation on meshtastic.org + +--- + diff --git a/docs/tr-rTR/user/node-metrics.md b/docs/tr-rTR/user/node-metrics.md new file mode 100644 index 000000000..51f1c2db1 --- /dev/null +++ b/docs/tr-rTR/user/node-metrics.md @@ -0,0 +1,130 @@ +--- +title: Node Metrics +nav_order: 5 +last_updated: 2026-05-13 +description: Telemetry dashboards for each mesh node — device health, environment sensors, signal quality, power, traceroute, and position history. +aliases: + - metrics + - telemetry + - device-metrics + - signal +--- + +# Node Metrics + +The node detail screen provides comprehensive telemetry and metrics for each node on your mesh. + +## Device Metrics + +Basic operating information reported by each node: + +| Metric | Açıklaması | +| --------------- | ----------------------------------- | +| Battery Level | Current battery percentage | +| Voltaj | Battery voltage reading | +| Kanal Kullanımı | Percentage of airtime consumed | +| Airtime | Transmission time used by this node | +| Çalışma Süresi | Time since last reboot | + +Device metrics are displayed as individual cards with trend sparklines showing battery level, voltage, channel utilization, airtime, and uptime over time. + +> 💡 **Tip:** Tap any metric card to expand it into a full chart with historical data points. Pinch to zoom the time axis. + +## Environment Metrics + +Environmental sensor data (requires compatible hardware): + +| Metric | Sensor Examples | +| ------------------------------------ | --------------------- | +| Sıcaklık | BME280, BME680, SHT31 | +| Nem | BME280, BME680, SHT31 | +| Barometrik Basınç | BME280, BMP280 | +| Gaz Direnci | BME680 | +| IAQ (Air Quality) | BME680 | + +Environment metrics are charted over time for easy trend analysis — temperature, humidity, and pressure each get their own line chart with the measurement unit displayed on the Y axis. + +> 💡 **Tip:** Environment metrics require a sensor connected to the remote node. Not all nodes report environmental data. See [Telemetry & Sensors](telemetry-and-sensors) for a full list of supported sensors. + +## Signal Metrics + +Radio signal quality information: + +| Metric | Açıklaması | +| --------- | ----------------------------------------------------------------------------- | +| SNR | Signal-to-Noise Ratio (higher is better) | +| RSSI | Received Signal Strength Indicator (closer to 0 is better) | +| Hop Count | Number of mesh hops for last message | + +### Signal Quality Reference + +| SNR Range | Quality | +| --------------------------------- | ---------- | +| > 10 dB | Excellent | +| 0 to 10 dB | İyi | +| -10 to 0 dB | İdare Eder | +| < -10 dB | Poor | + +## Power Metrics + +Power management telemetry (requires INA sensor or compatible hardware): + +| Metric | Açıklaması | +| ----------- | ----------------------- | +| Bus Voltage | Supply voltage | +| Akım | Power draw in milliamps | +| Güç | Calculated wattage | + +## Yol izle + +Traceroute shows the path a message takes through the mesh: + +1. From the node detail screen, tap **Traceroute**. +2. The app sends a traceroute request to the target node. +3. Results show each hop with SNR/RSSI values. + +### Reading Traceroute Results + +``` +You → Node A (SNR: 8.5) → Node B (SNR: 5.2) → Target +``` + +Each hop represents a relay node that forwarded the message. + +## Konum Kayıtları + +Historical position data for nodes that share their location: + +- GPS coordinates +- Rakım +- Speed (if moving) +- Timestamp for each position report + +## Komşu Bilgisi + +Shows which nodes a given node can directly hear, useful for understanding mesh topology. + +## Viewing Metrics + +1. Navigate to **Nodes**. +2. Tap the node you want to inspect. +3. Select the metric category from the detail tabs. + +![Node detail — local device](/assets/screenshots/nodes_detail_local.png) + +The position tab shows location data for nodes that share GPS: + +![Position inline content](/assets/screenshots/nodes_position.png) + +> ⚠️ **Note:** Metrics are only available when they have been reported by the remote node. Metrics update at intervals configured on each node's telemetry settings. + +## Related Topics + +- [Nodes](nodes) — node list, filtering, and sorting +- [Telemetry & Sensors](telemetry-and-sensors) — supported sensors and configuration +- [Signal Meter](signal-meter) — how signal quality is calculated from SNR and RSSI +- [Discovery](discovery) — traceroute details and neighbor info +- [Units & Locale](units-and-locale) — temperature, distance, and speed display formats + +--- + diff --git a/docs/tr-rTR/user/nodes.md b/docs/tr-rTR/user/nodes.md new file mode 100644 index 000000000..366fa6600 --- /dev/null +++ b/docs/tr-rTR/user/nodes.md @@ -0,0 +1,152 @@ +--- +title: Nodelar +nav_order: 4 +last_updated: 2026-05-13 +description: Browse, filter, and sort mesh nodes — view details, signal quality, roles, and quick actions. +aliases: + - node-list + - mesh-nodes + - peers +--- + +# Nodelar + +The Nodes screen displays all devices visible on your mesh network. + +## Node List + +The node list shows every node your radio has heard, including: + +- **Node name** — user-configured long name +- **Short name** — 4-character identifier +- **Signal quality** — last heard signal strength +- **Last heard** — time since last communication +- **Distance** — estimated distance (if positions are shared) +- **Battery** — remote node battery level (if telemetry is enabled) + +### Node Status Indicators + +| Badge | Meaning | +| ---------- | ------------------------------------- | +| 🟢 Online | Node heard within the last 15 minutes | +| 🟡 Away | Node heard within the last 2 hours | +| 🔴 Offline | Node not heard for over 2 hours | +| ⭐ Favorite | Node marked as favorite by the user | + +### Node Roles + +Nodes can be configured with different roles that affect their mesh behavior: + +| Rol | Açıklaması | +| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Client | Standard end-user device | +| Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | +| Client Mute | Receives but doesn't retransmit | +| Client Hidden | Like Client Mute, plus hides from node list | +| Router | Prioritizes message forwarding; stays awake to relay | +| Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | +| ~~Router Client~~ | ⚠️ **Deprecated** (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | +| ~~Repeater~~ | ⚠️ **Deprecated** (removed in firmware 2.7.11) — no longer selectable; use Router instead | +| Tracker | Optimized for position reporting at regular intervals | +| Sensor | Optimized for telemetry reporting | +| TAK | Interoperates with TAK systems (sends/receives CoT) | +| TAK Tracker | TAK position reporting only | +| Lost & Found | Continuous position beacon for recovery | + +### Choosing a Role + +Most users should keep the default **Client** role. Consider a different role when: + +- **Router** — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don't use Router on battery-powered handheld devices. +- **Router Late** — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. +- **Client Base** — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. +- **Client Mute** — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only devices or to reduce congestion in dense areas. +- **Tracker** — An unattended device whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. +- **Sensor** — An unattended device reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. +- **TAK / TAK Tracker** — Only needed if interoperating with ATAK/WinTAK systems. See [TAK Integration](tak) for details. + +> 💡 **Tip:** The mesh works best when most nodes are **Client** or **Router**. Too many Mute nodes reduces mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. + +### Encryption Indicators + +Nodes display encryption status icons next to their name: + +| Icon | Meaning | +| ----------- | ------------------------------------------------------------------------------------------------------------------- | +| 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | +| 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | +| ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) | + +> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. + +## Quick Actions + +From the node list, you can: + +- **Tap** a node to view its detail page +- **Long-press** for quick actions: + - Send a direct message + - View on map + - Konum iste + - Mark as favorite + - Yol izle + +## Filtering & Sorting + +### Text Search + +Type in the search field to filter nodes by name or short name. The filter updates in real time as you type. + +### Filter Toggles + +| Filtre | Açıklaması | +| -------------------------- | ---------------------------------------------------------------------------------------------- | +| **Only online** | Show only nodes heard within the last 15 minutes | +| **Only direct** | Show only nodes with direct (non-relayed) connections | +| **Include unknown** | Show nodes that haven't sent user info yet | +| **Exclude infrastructure** | Hide infrastructure-role nodes (Router, Repeater, Router Late, Client Base) | +| **Exclude MQTT** | Hide nodes heard only via MQTT internet bridge | +| **Show ignored** | Show nodes you've previously dismissed or muted | + +### Sort Options + +| Sort | Açıklaması | +| ------------------------------------------- | ------------------------------------------------------------------ | +| **Last heard** (default) | Most recently heard nodes first | +| **Alphabetical** | Sorted by node long name | +| **Distance** | Nearest nodes first (requires position sharing) | +| **Hops away** | Fewest relay hops first | +| **Channel** | Grouped by channel index | +| **Via MQTT** | Grouped by MQTT vs. radio-heard | +| **Favorites** | Favorited nodes first | + +## Node Detail + +Tapping a node opens the detail view with comprehensive information. See [Node Metrics](node-metrics) for full details on metrics and telemetry. + +![Node detail view](/assets/screenshots/nodes_node_list.png) + +The detail screen includes device info, position, and action buttons: + +![Node detail section](/assets/screenshots/nodes_detail_section.png) + +Inline status indicators show key metrics at a glance: + +| Indicator | Screenshot | +| -------------- | -------------------------------------------------------- | +| Signal quality | ![Signal](/assets/screenshots/nodes_signal_info.png) | +| Battery level | ![Battery](/assets/screenshots/nodes_battery_info.png) | +| Hop count | ![Hops](/assets/screenshots/nodes_hops_info.png) | +| Son duyulma | ![Last heard](/assets/screenshots/nodes_last_heard.png) | +| Mesafe | ![Distance](/assets/screenshots/nodes_distance_info.png) | + +## Related Topics + +- [Node Metrics](node-metrics) — detailed telemetry dashboards for each node +- [Messages & Channels](messages-and-channels) — send a direct message to a node +- [Map & Waypoints](map-and-waypoints) — view node positions geographically +- [Discovery](discovery) — traceroute and neighbor info for topology exploration +- [Signal Meter](signal-meter) — understand what the signal bars mean + +--- + diff --git a/docs/tr-rTR/user/onboarding.md b/docs/tr-rTR/user/onboarding.md new file mode 100644 index 000000000..3b910534e --- /dev/null +++ b/docs/tr-rTR/user/onboarding.md @@ -0,0 +1,99 @@ +--- +title: Getting Started +nav_order: 1 +last_updated: 2026-05-13 +description: First-launch setup — permissions, onboarding flow, and next steps after connecting your radio. +aliases: + - first-launch + - setup + - intro +--- + +# Getting Started + +Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app. + +## First Launch + +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. + +### Welcome Screen + +The welcome screen introduces Meshtastic and its core capabilities: + +- Off-grid mesh communication +- No cellular or internet required +- End-to-end encrypted messaging + +Tap **Get Started** to proceed through the setup flow. + +![Welcome screen](/assets/screenshots/onboarding_welcome.png) + +## Permissions + +The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. + +### Bluetooth Permission + +Bluetooth is the primary connection method between your phone and Meshtastic radio: + +- **Bluetooth scanning** — discover nearby Meshtastic radios +- **Bluetooth connect** — establish and maintain connections with paired radios + +Grant both permissions when prompted. Without Bluetooth, you'll need to use USB or TCP connections instead. + +### Location Permission + +> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. + +Meshtastic also uses your location for: + +- Showing your position on the mesh map +- Calculating distances to other nodes +- Sharing your GPS coordinates with other mesh members (if enabled) + +Grant **"While using the app"** or **"Always"** depending on your preference: + +- **While using the app** — position updates only when the app is open +- **Always** — enables background position updates for always-on mesh presence + +If denied, Bluetooth scanning will not function and your node will not report a position. + +### Notifications Permission + +Notifications alert you to: + +- Incoming messages from channels and direct messages +- Connection status changes (connected, disconnected, reconnecting) +- Firmware update availability + +> 💡 **Tip:** You can fine-tune notification preferences later in Android system settings. The app creates separate notification channels for messages, connection events, and background service status. + +### Critical Alerts Permission + +On supported devices, the app may request permission for critical alerts: + +- These are high-priority notifications that can break through Do Not Disturb mode +- Useful for emergency mesh alerts or urgent messages +- You can **skip** this step if you don't need breakthrough notifications +- Configure or revoke later in Android notification settings + +## After Setup + +Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. + +> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. + +## What's Next? + +Once connected to a radio, explore: + +- [Connections](connections) — pair your first radio device +- [Messages & Channels](messages-and-channels) — send your first message +- [Nodes](nodes) — see who's on your mesh +- [Map & Waypoints](map-and-waypoints) — view node positions +- [Settings](settings-radio-user) — configure your radio and user profile + +New to Meshtastic? The [getting started guide](https://meshtastic.org/docs/getting-started) on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup. + +--- diff --git a/docs/tr-rTR/user/settings-module-admin.md b/docs/tr-rTR/user/settings-module-admin.md new file mode 100644 index 000000000..d24d7fa03 --- /dev/null +++ b/docs/tr-rTR/user/settings-module-admin.md @@ -0,0 +1,246 @@ +--- +title: Settings — Modules & Admin +nav_order: 8 +last_updated: 2026-05-13 +description: Configure optional feature modules (MQTT, telemetry, canned messages, TAK, and more) and perform device administration. +aliases: + - modules + - module-config + - administration +--- + +# Settings — Modules & Admin + +Configure optional feature modules and perform device administration. Modules extend Meshtastic with specialized capabilities — each can be independently enabled or disabled. + +> 💡 **Tip:** You only need to enable the modules you actually use. Disabling unused modules reduces airtime, saves battery, and simplifies your configuration. + +Module settings use a card-based layout with toggle switches, dropdowns, text fields, and sliders: + +![Toggle switch](/assets/screenshots/settings_switch.png) + +![Dropdown selector](/assets/screenshots/settings_dropdown.png) + +![Text field](/assets/screenshots/settings_text_field.png) + +![Settings card layout](/assets/screenshots/settings_titled_card.png) + +## Module Configuration + +### MQTT Module + +Bridges mesh messages to and from an MQTT broker for internet connectivity. This is how you extend your mesh beyond radio range or integrate with home automation systems. + +| Setting | Açıklaması | +| --------------- | ------------------------------------------------------------------------ | +| Açık | Toggle MQTT bridge | +| Sunucu | MQTT broker address | +| Kullanıcı adı | Authentication username | +| Şifre | Authentication password | +| Encryption | Encrypt MQTT payloads | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON support removed from firmware; field is ignored | +| TLS | Use secure connection | +| Root Topic | Base MQTT topic path | +| Map Report | Publish position for public map | + +See [MQTT](mqtt) for a detailed usage guide including encryption, privacy, and broker setup. + +### Serial Module + +Enables serial port communication for external device integrations (GPS modules, sensors, or custom hardware). When enabled, the node's serial port can send and receive protobuf or text data, allowing external microcontrollers or computers to interact with the mesh. + +| Setting | Açıklaması | +| ---------- | ------------------------------- | +| Açık | Activate serial communication | +| Echo | Echo received serial data back | +| Mod | Text, Protobuf, or NMEA output | +| RX/TX Pins | GPIO pins for serial connection | +| Baud Rate | Serial communication speed | + +### External Notification Module + +Controls buzzer, LED, or vibration alerts on your radio hardware. Useful for devices that need to physically signal when a message arrives — particularly helpful for unattended or outdoor installations. + +| Setting | Açıklaması | +| -------------------------------- | --------------------------- | +| Açık | Activate notifications | +| Uyarı Mesajı | Notify on incoming messages | +| Alert Message Buzzer | Use buzzer for messages | +| Alert Message Vibra | Use vibration for messages | +| Alert Bell | Notify on bell character | +| Output (GPIO) | Pin for notification output | +| Aktif | High or Low active | +| Duration (ms) | Notification length | +| Use I2S as Buzzer | Use I2S audio output | + +### Store & Forward Module + +Buffers messages for nodes that were temporarily offline, then replays them when those nodes reconnect. Essential for meshes where nodes go in and out of range regularly — ensures messages aren't lost during brief disconnections. + +| Setting | Açıklaması | +| ------------------------------------------ | -------------------------- | +| Açık | Activate store and forward | +| Heartbeat (s) | Announcement interval | +| Records | Maximum stored messages | +| History Return (max) | Max messages to replay | +| History Return (window) | Time window for replay | + +> 💡 **Tip:** Store and Forward works best on nodes with ample memory (ESP32 with PSRAM). Router nodes are ideal candidates since they're typically always-on. + +### Range Test Module + +Automated range testing tool for evaluating link quality between nodes. When enabled, the node periodically transmits test messages with incrementing counters. A receiver node logs these messages, allowing you to walk or drive away and later analyze at what distance messages stopped arriving. + +| Setting | Açıklaması | +| -------------------------------------- | --------------------------------- | +| Açık | Activate range testing | +| Sender Interval (s) | Time between test transmissions | +| Save CSV | Log received test data to SD card | + +### Telemetry Module + +Controls what telemetry data your node shares with the mesh. Telemetry includes device health (battery, uptime) and environmental sensor data (temperature, humidity, pressure). + +| Setting | Açıklaması | +| ---------------------------- | --------------------------------------- | +| Device Metrics Interval | How often to report device metrics | +| Environment Metrics Interval | How often to report environment sensors | +| Air Quality Enabled | Report particulate sensor data | +| Power Metrics Enabled | Report power usage | + +See [Telemetry & Sensors](telemetry-and-sensors) for supported sensors and configuration recommendations. + +### Canned Message Module + +Pre-configured messages accessible from the device's physical buttons (for radios with rotary encoders, keypads, or similar input hardware). Define a list of quick-send messages that can be transmitted without a phone connected — ideal for field use. + +| Setting | Açıklaması | +| ------------------ | ----------------------------------------------------------- | +| ~~Enabled~~ | ⚠️ **Deprecated** — current firmware may ignore this toggle | +| Mesajlar | Newline-separated list of messages | +| Send Bell | Play bell sound on send | +| Rotary Encoder | Enable rotary encoder input | +| Up/Down/Press Pins | GPIO pin assignments for input | + +### Audio Module + +Codec2 audio support for low-bandwidth voice communication over the mesh. This is an **experimental** feature that encodes voice into very small data packets using the Codec2 codec. + +| Setting | Açıklaması | +| --------------- | -------------------------------- | +| Açık | Activate audio module | +| Codec2 Rate | Audio quality/bandwidth tradeoff | +| I2S Word Select | GPIO pin for I2S WS | +| I2S Data In | GPIO pin for I2S DIN | +| I2S Data Out | GPIO pin for I2S DOUT | + +> ⚠️ **Note:** Audio requires specific hardware (I2S microphone and speaker). Voice quality is very low-bandwidth — think "understandable radio voice," not phone-call quality. + +### Remote Hardware Module + +GPIO control over the mesh network. Allows a remote node to read or write GPIO pins on another node — useful for activating relays, reading switches, or controlling external hardware from a distance. + +| Setting | Açıklaması | +| -------------------- | --------------------------------------------------------------- | +| Açık | Activate remote GPIO access | +| Allow Undefined Pins | Allow access to any GPIO pin (security risk) | + +> ⚠️ **Warning:** Enabling "Allow Undefined Pins" gives remote nodes access to all GPIO pins, which could interfere with the radio's own hardware. Only enable on dedicated GPIO nodes. + +### Neighbor Info Module + +Broadcasts information about directly heard neighbors, enabling mesh topology mapping. Each enabled node periodically shares a list of the other nodes it can hear and their signal quality. + +| Setting | Açıklaması | +| -------------------------------------- | ------------------------------------ | +| Açık | Activate neighbor broadcasting | +| Update Interval (s) | How often to broadcast neighbor list | + +See [Discovery](discovery) for how to use neighbor data for mesh topology exploration. + +### Ambient Lighting Module + +Controls onboard NeoPixel or other addressable RGB LEDs on supported hardware. Can be used for visual status indicators, notification lights, or decorative effects. + +| Setting | Açıklaması | +| ------------------ | ---------------------------------------------------------- | +| Açık | Activate LED control | +| LED State | On, Off, or set specific color | +| Red / Green / Blue | Individual color channel values (0–255) | + +### Detection Sensor Module + +Turns your node into a motion or door sensor alert system. When a GPIO pin detects a state change (motion detected, door opened), the node broadcasts an alert message over the mesh. + +| Setting | Açıklaması | +| ---------------------------------------- | ----------------------------------------------------------------------- | +| Açık | Activate detection sensor | +| Monitor Pin | GPIO pin connected to sensor | +| Detection Triggered High | Trigger when pin goes high (vs. low) | +| Minimum Broadcast (s) | Minimum time between alert broadcasts | +| State Broadcast (s) | Periodic state broadcast interval | +| Send Bell | Include bell character in alerts | +| Friendly Name | Custom name for this sensor | + +### Paxcounter Module + +People counter using WiFi and BLE probe requests. Counts nearby devices by passively listening for probe requests that phones and laptops emit when scanning for networks. Available only on ESP32 devices. + +| Setting | Açıklaması | +| -------------------------------------- | -------------------------- | +| Açık | Activate people counting | +| Update Interval (s) | How often to report counts | + +> 💡 **Tip:** Paxcounter is useful for estimating foot traffic at trailheads, event venues, or other locations. Counts are approximate — one person may carry multiple devices. + +### TAK Module + +Team Awareness Kit integration for interoperability with ATAK and WinTAK. See [TAK Integration](tak) for detailed setup and usage. + +## Yönetim + +### Uzaktan Yönetim + +Remotely configure nodes that share your admin key: + +1. Select the target node in the node list. +2. Navigate to **Settings** for that node. +3. Modify configuration. +4. Tap **Save** — changes are sent over the mesh. + +> ⚠️ **Requires:** Admin key configured on both your node and the target node. + +### Clean Node Database + +Removes stale nodes from your local database that haven't been heard in a configurable time window. + +### Factory Reset + +Resets all settings to factory defaults. **This cannot be undone.** + +### Yeniden başlat + +Remotely reboot a connected or administered node. + +### Hata Ayıklama Paneli + +View detailed diagnostic information: + +- Protocol buffers debug output +- Mesh packet log +- Connection state details + +### Troubleshooting Remote Admin + +- **"No response from target node"** — the target may be out of range, offline, or have a mismatched admin key. Verify the admin key matches on both nodes. +- **Changes not applying** — some settings require a reboot to take effect. Try the Reboot action after saving. +- **Can't see remote settings** — ensure your node has the admin key for the target node and that Admin Channel is enabled in Security Config. + +## Related Topics + +- [Settings — Radio & User](settings-radio-user) — core radio and user profile settings +- [Module configuration reference](https://meshtastic.org/docs/configuration/module) — detailed module docs on meshtastic.org +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/tr-rTR/user/settings-radio-user.md b/docs/tr-rTR/user/settings-radio-user.md new file mode 100644 index 000000000..ae51f8f98 --- /dev/null +++ b/docs/tr-rTR/user/settings-radio-user.md @@ -0,0 +1,173 @@ +--- +title: Settings — Radio & User +nav_order: 7 +last_updated: 2026-05-13 +description: Configure your radio hardware, LoRa presets, user profile, position sharing, power management, and security. +aliases: + - ayarlar + - radio-config + - user-config + - lora +--- + +# Settings — Radio & User + +Configure your radio hardware and user identity parameters. + +## User Settings + +### User Profile + +| Setting | Açıklaması | +| ----------------- | ------------------------------------------------------------------------------------- | +| Uzun Ad | Your display name (up to 39 characters) | +| Kısa Ad | 4-character abbreviated name | +| Licensed Operator | Enable if you hold an amateur radio license (enables higher power) | + +### Applying Changes + +After modifying settings, tap **Save** to write the configuration to your radio. The device may reboot to apply changes. + +## Radio Configuration + +### Cihaz Ayarı + +| Setting | Açıklaması | Varsayılan | +| ------------------------------------------ | ----------------------------------------------------------------------- | ---------- | +| Rol | Node behavior (Client, Router, etc.) | Client | +| Rebroadcast Mode | How the node retransmits messages | Hepsi | +| Node Info Broadcast (s) | Interval for broadcasting node info | 10800 | +| Double-tap Button | Action for double-tap button press | Disabled | + +### LoRa Ayarı + +| Setting | Açıklaması | Varsayılan | +| ----------------- | ----------------------------------------------------------------------- | ----------------------------------------- | +| Bölge | Regulatory region for frequency bands | Unset (must configure) | +| Modem Ön Ayarı | Speed/range tradeoff | LongFast | +| Hop Limiti | Maximum retransmit hops | 3 | +| TX Power | Transmission power (dBm); 0 = max allowed for region | 0 (region max) | +| Frequency Offset | Fine-tune frequency (MHz) | 0 | +| Channel Bandwidth | Bandwidth setting | Default for preset | + +> ⚠️ **Important:** You **must** set your region before transmitting. Operating without the correct region may violate local radio regulations. See the [region configuration guide](https://meshtastic.org/docs/getting-started/initial-config) on meshtastic.org for details. + +### Modem Presets + +| Preset | Range | Speed | SNR Limit | Best For | +| ------------------ | ----------------------- | ------------------------- | ------------------------ | -------------------------------------------------------------------------------------------------------- | +| Short Turbo | ~1 km | 21.9 kbps | −5 dB | Dense urban with line-of-sight; data-heavy applications | +| Short Fast | ~3 km | 10.9 kbps | −7.5 dB | Urban neighborhoods; buildings within a few blocks | +| Short Slow | ~5 km | 5.5 kbps | −10 dB | Suburban short-range; moderate building density | +| Medium Fast | ~5 km | 5.5 kbps | −10 dB | Suburban areas; moderate building density | +| Medium Slow | ~8 km | 1.1 kbps | −12.5 dB | Suburban/rural; moderate range with slower speed | +| Long Turbo | ~10 km | 4.4 kbps | −10 dB | Similar range to Long Fast but with 500 kHz bandwidth; faster throughput | +| Long Fast | ~10 km | 1.1 kbps | −12.5 dB | **General use (default)** — balanced range and speed | +| Long Moderate | ~20 km | 0.34 kbps | −15 dB | Rural with some terrain; occasional use | +| Lite Fast | ~5 km | 5.5 kbps | −10 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Medium Fast | +| Lite Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Long Fast | +| Narrow Fast | ~5 km | 2.7 kbps | −10 dB | EU 868 MHz band (62.5 kHz BW); avoids interference with other devices | +| Narrow Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 868 MHz band (62.5 kHz BW); comparable to Long Fast | +| ~~Long Slow~~ | ~30 km | 0.18 kbps | −17.5 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | +| ~~Very Long Slow~~ | ~40+ km | 0.09 kbps | −20 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | + +#### Choosing a Modem Preset + +The modem preset controls the fundamental tradeoff between **range** and **data rate**: + +- **Slower presets** use more spreading, making signals decodable at weaker signal levels (lower SNR limit). This means longer range but fewer bytes per second. +- **Faster presets** pack more data per transmission but require a stronger signal to decode. + +**Practical guidance:** + +- **Urban mesh (many nodes, short distances):** Use **Long Fast** (default) or **Short Fast**. Higher speed means less airtime congestion when many nodes share the channel. +- **Rural/sparse mesh (few nodes, long distances):** Use **Long Moderate**. Range matters more than speed when nodes are far apart. +- **EU 866/868 MHz regulatory compliance:** Use **Lite Fast**, **Lite Slow**, **Narrow Fast**, or **Narrow Slow** — these are optimized for the EU SRD/868 MHz bands with narrower bandwidths. +- **Fixed infrastructure links:** Use **Short Turbo** or **Long Turbo** for dedicated point-to-point links with good antennas and line-of-sight. +- **Mixed environments:** Stick with **Long Fast** — it's the community default and ensures compatibility with others in your area. + +> ⚠️ **Important:** All nodes on the same channel **must** use the same modem preset. Nodes with mismatched presets cannot communicate even if they share the same frequency and encryption key. + +> 💡 **Tip:** The range estimates above assume flat terrain and modest antennas. Elevation advantage (hilltop, rooftop) dramatically increases effective range. A well-placed Router with Long Fast can often outperform a ground-level node with Long Slow. + +### Akran Ayarı + +| Setting | Açıklaması | +| ------------------- | ------------------------------------------------------------------------------------ | +| Screen Timeout | Time before display sleeps | +| Display Units | Metric or Imperial | +| OLED Tipi | Auto, SSD1306, SH1106, SH1107 | +| Compass Orientation | Rotation offset for compass display (0°, 90°, 180°, 270°) | +| ~~Compass North~~ | ⚠️ **Deprecated** — replaced by Compass Orientation; still visible in older firmware | + +### Konum Ayarı + +| Setting | Açıklaması | +| ----------------------------------------- | ---------------------------------- | +| GPS Enabled | Enable/disable GPS | +| GPS Update Interval | How often to acquire GPS fix | +| Position Broadcast (s) | How often to share position | +| Smart Position | Enable movement-based broadcasting | +| Fixed Position | Use a manually set position | + +### Güç Ayarı + +| Setting | Açıklaması | +| --------------------------------------- | --------------------------------------- | +| Power Saving | Enable low-power sleep mode | +| Shutdown After (s) | Auto-shutdown idle timer | +| ADC Multiplier | Battery voltage calibration factor | +| Wait Bluetooth (s) | Time to wait for BLE connection at boot | +| Mesh SDS Timeout (s) | Super-deep-sleep timeout | + +### Ağ Ayarı + +| Setting | Açıklaması | +| ------------- | ---------------------------------------------------- | +| WiFi Enabled | Enable WiFi radio (ESP32 devices) | +| WiFi SSID | Network name to connect to | +| WiFi PSK | Ağ şifresi | +| NTP Sunucusu | Time synchronization server | +| Syslog Server | Remote logging server | + +![IP address field](/assets/screenshots/settings_ipv4_field.png) + +### Bluetooth Ayarı + +| Setting | Açıklaması | +| ----------------- | ------------------------------------------------------------------------- | +| Bluetooth Enabled | Enable/disable BLE radio | +| Pairing Mode | Fixed PIN, Random PIN, or No PIN | +| Sabit PIN | PIN code for pairing (default: 123456) | + +### Güvenlik Ayarı + +| Setting | Açıklaması | +| --------------------- | -------------------------------------------------------------------------- | +| Genel Anahtar | Your node's public key (read-only) | +| Yönetici Anahtarı | Key for remote administration | +| Özel Anahtar | Your node's private key (handle securely) | +| Admin Channel Enabled | Allow admin commands via channel | +| Debug Log | Output live debug logging over serial/bluetooth | +| Serial Enabled | Enable serial console access (moved from Device Config) | +| Yönetilen Mod | Restrict non-admin channel changes | + +![Password field](/assets/screenshots/settings_password_field.png) + +Settings use standard preference controls — dropdowns, toggles, and sliders: + +| Control | Screenshot | +| -------- | ------------------------------------------------------ | +| Dropdown | ![Dropdown](/assets/screenshots/settings_dropdown.png) | +| Toggle | ![Toggle](/assets/screenshots/settings_switch.png) | +| Slider | ![Slider](/assets/screenshots/settings_slider.png) | + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — optional feature modules and device administration +- [Signal Meter](signal-meter) — how modem presets affect signal quality thresholds +- [LoRa configuration](https://meshtastic.org/docs/configuration/radio/lora) — detailed LoRa settings reference on meshtastic.org +- [Initial configuration](https://meshtastic.org/docs/getting-started/initial-config) — region setup guide on meshtastic.org + +--- + diff --git a/docs/tr-rTR/user/signal-meter.md b/docs/tr-rTR/user/signal-meter.md new file mode 100644 index 000000000..fb0850b1e --- /dev/null +++ b/docs/tr-rTR/user/signal-meter.md @@ -0,0 +1,81 @@ +--- +title: How the Meshtastic Signal Meter Works +nav_order: 15 +last_updated: 2026-05-13 +description: How the signal meter calculates quality from RSSI and SNR — LoRa spread spectrum, presets, and what the bars really mean. +aliases: + - signal + - signal-meter + - snr + - rssi +--- + +# How the Meshtastic Signal Meter Works + +The Meshtastic signal meter — the familiar bars or status color in the app — is calculated very differently than the "bars" on a traditional cell phone or Wi-Fi router. + +Most consumer devices simply measure how "loud" a signal is. However, because Meshtastic uses **LoRa (Long Range)** technology, its signal meter measures how **clear** the signal is, relative to the specific settings your mesh is using. + +--- + +## 1. The Two Metrics: "Loudness" vs. "Clarity" + +Every time the LoRa radio chip receives a message, it reports two measurements: + +- **RSSI (Received Signal Strength Indicator):** The **loudness** of the raw power hitting your antenna. +- **SNR (Signal-to-Noise Ratio):** The **clarity** of the signal compared to the background static. + +> **Tip — The Analogy:** Imagine you are trying to hear a friend talking to you. +> +> - **RSSI** is how loud their voice is. +> - **The Noise Floor** is the background noise in the room (air conditioning, other people talking, traffic). +> - **SNR** is how easily you can distinguish your friend's voice from the background noise. + +If your friend shouts at you at a deafening rock concert, the signal is incredibly loud (High RSSI), but you still can't understand them because the background noise is louder (Bad SNR). Conversely, if your friend whispers to you in a dead-silent library, the signal is very weak (Low RSSI), but you can understand them perfectly (Great SNR). + +--- + +## 2. The Magic of LoRa: Hearing "Below the Noise Floor" + +For standard radios (like FM or Wi-Fi), if the background noise is louder than the signal (a negative SNR), the receiver just hears static. + +LoRa is special. It uses **"Spread Spectrum"** modulation, which allows the radio to mathematically pull a signal out of the air even when it is buried deep _underneath_ the background noise. This is why you will frequently see **negative SNR numbers** in Meshtastic (e.g., -10 dB, which means the signal is 10 decibels weaker than the background static). + +Depending on which Meshtastic preset you are using (e.g., `LongFast` vs. `ShortFast`), the radio has a specific **SNR Limit** — the absolute maximum amount of noise it can tolerate before the message is completely lost to the static. + +--- + +## 3. How the Signal Meter Calculates Quality + +The Meshtastic apps take both RSSI and SNR and run them through a specific formula to assign your signal a quality rating (None, Bad, Fair, or Good). It specifically scales these values based on the physical limits of the radio preset you are using. + +Here is exactly how the app decides how many bars (or what color) to show you: + +| Level | Bars | Criteria | Meaning | +| ---------- | ---- | ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | +| İyi | 3 | RSSI better than `-115 dBm` **AND** SNR better than `-7 dB` | Signal is both loud and clear — healthy connection. | +| İdare Eder | 2 | RSSI better than `-126 dBm` with good SNR, **OR** SNR better than `-15 dB` with good RSSI | Signal getting quieter or noisier, but still decodable. | +| Kötü | 1 | Falls between Fair and None thresholds | At the edge of range or experiencing interference. | +| Yok | 0 | RSSI worse than `-126 dBm` **AND** SNR worse than `-15 dB` | Transmission completely buried in noise. | + +--- + +## 4. What This Means for You + +Because Meshtastic's meter acts as a **"Clarity Meter"**, it behaves differently than what most people expect: + +> **Tip — Don't panic over low RSSI:** You might see a seemingly terrible RSSI value like `-118 dBm`. On a cell phone, you would have zero bars. But if you have an SNR of `+2 dB`, Meshtastic will still show a strong signal! _The library is quiet, so the whisper is heard perfectly._ + +> **Warning — Watch out for local noise:** If you hook up a massive antenna and see a great RSSI (e.g., `-90 dBm`) but your signal meter is only showing **1 Bar (Bad)**, you have a problem. It means you have local interference — perhaps a cheap power supply, a noisy computer, or a nearby radio tower — creating so much static that it is drowning out your mesh. + +## Where Signal Information Appears + +In the app, signal data is shown in several places: + +- **Node list** — signal bars icon next to each node +- **Node detail** — SNR, RSSI, and signal quality in the device metrics section +- **Traceroute** — per-hop signal quality for each relay node +- **Signal metrics** — historical SNR and RSSI data in the metrics charts + +![Node entry showing SNR, RSSI values and colored signal bars](/assets/screenshots/nodes_signal_info.png) + diff --git a/docs/tr-rTR/user/tak.md b/docs/tr-rTR/user/tak.md new file mode 100644 index 000000000..c62ac0ef5 --- /dev/null +++ b/docs/tr-rTR/user/tak.md @@ -0,0 +1,126 @@ +--- +title: TAK Integration +nav_order: 10 +last_updated: 2026-05-13 +description: Interoperate with ATAK and WinTAK — CoT position sharing, TAK roles, and plugin setup. +aliases: + - tak + - atak + - team-awareness-kit +--- + +# TAK Integration + +Meshtastic integrates with the Team Awareness Kit (TAK) ecosystem, enabling interoperability between Meshtastic mesh devices and TAK applications like ATAK and WinTAK. + +## Genel Bakış + +The TAK module allows Meshtastic nodes to: + +- Share position data in TAK-compatible CoT (Cursor on Target) format +- Appear as team members on TAK map displays +- Receive TAK PLI (Position Location Information) messages + +## Setup + +### Prerequisites + +- ATAK (Android Team Awareness Kit) or WinTAK installed +- Meshtastic ATAK Plugin installed +- TAK module enabled on your Meshtastic radio + +### Yapılandırma + +1. Navigate to **Settings → Module Config → TAK**. +2. Enable the TAK module. +3. Configure the TAK team/group settings: + +![Module toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | Açıklaması | +| ------- | -------------------------- | +| Açık | Activate TAK interop | +| Mod | TAK-compatible output mode | + +### ATAK Plugin Setup + +1. Install the Meshtastic ATAK Plugin from the plugin repository. +2. Open ATAK and enable the Meshtastic plugin. +3. The plugin bridges messages between ATAK and your mesh network. + +## TAK Roles + +Nodes configured with TAK-related roles behave differently from standard clients: + +| Rol | Açıklaması | +| --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **TAK** | Full TAK interoperability — sends and receives CoT data, chat messages, and PLI updates. Functions as a standard client plus TAK bridge. | +| **TAK Tracker** | Position-only TAK output — automatically broadcasts PLI at regular intervals without user interaction. Optimized for unattended position beacons (vehicles, equipment, waypoints). Does not relay chat messages. | + +> 💡 **Tip:** Use **TAK Tracker** for devices that only need to report position (e.g., a radio mounted in a vehicle). Use **TAK** for devices where users actively participate in TAK operations. + +### CoT (Cursor on Target) Format + +TAK messages use the Cursor on Target XML format — a military standard for sharing situational awareness data. Meshtastic converts its internal protobuf messages to CoT format when bridging to TAK systems, so no manual format conversion is needed. + +## TAK Identity + +When using TAK roles, your node broadcasts identity information that appears on TAK maps: + +| Setting | Açıklaması | +| -------- | ---------------------------------------------------------------------------------------------------------------- | +| Team | Your team color on the TAK map (e.g., Blue, Red, Cyan, Green) | +| Rol | Your operational role (Team Member, Team Lead, HQ, Medic, RTO, etc.) | +| Callsign | Your TAK callsign (defaults to your Meshtastic long name) | + +These settings appear in **Settings → Module Config → TAK** when the TAK module is enabled. + +> 💡 **Tip:** Team/role colors are the standard TAK affiliation colors. Coordinate with your TAK team to use consistent team assignments. + +## Wire Format (V1 / V2) + +Meshtastic supports two TAK wire formats: + +| Format | Compatibility | Özellikler | +| ------------------------------- | --------------------------------------------------------------- | --------------------------------------------------------- | +| V1 (Legacy) | ATAK Plugin v1.x, older firmware | Basic CoT position sharing only | +| V2 (Current) | ATAK Plugin v2.x, firmware 2.3+ | Full CoT support including chat, routes, zstd compression | + +The app automatically selects V2 when both sides support it. No manual configuration needed — the TAK module negotiates format based on firmware capabilities. + +## Usage with ATAK + +Once configured: + +- Meshtastic nodes appear as markers on the ATAK map with callsign labels +- Chat messages can bridge between mesh and TAK networks +- Position updates flow bidirectionally between Meshtastic and TAK +- TAK Tracker nodes broadcast PLI automatically — their positions appear on ATAK maps without any ATAK-side configuration + +> ⚠️ **Note:** TAK integration requires specific node roles and module configuration. Standard client nodes don't automatically participate in TAK operations. + +## Troubleshooting + +| Problem | Cause | Solution | +| -------------------------------- | ------------------------------------- | ----------------------------------------------------------------------- | +| Node doesn't appear on ATAK map | TAK module disabled or wrong role | Verify TAK module is enabled and node role is TAK or TAK Tracker | +| Position updates are stale | GPS fix lost or interval too long | Check GPS status; reduce position broadcast interval in Position Config | +| ATAK plugin shows "disconnected" | BLE connection lost or plugin crashed | Reconnect Bluetooth in Meshtastic app, then restart ATAK plugin | +| Chat messages not bridging | V1 format doesn't support chat | Ensure both nodes run firmware 2.3+ for V2 wire format | +| CoT data not flowing | Channel mismatch | All TAK nodes must be on the same channel with matching encryption | + +## Security Considerations + +- TAK data shares your position and callsign information +- Ensure your channel encryption is configured when using TAK in sensitive environments +- The TAK module respects the same channel encryption as other Meshtastic messages + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — TAK module configuration +- [Nodes](nodes) — TAK and TAK Tracker roles in the node list +- [Map & Waypoints](map-and-waypoints) — node positions on the map +- [ATAK plugin guide](https://meshtastic.org/docs/software/integrations/atak-plugin) — detailed ATAK setup on meshtastic.org + +--- + diff --git a/docs/tr-rTR/user/telemetry-and-sensors.md b/docs/tr-rTR/user/telemetry-and-sensors.md new file mode 100644 index 000000000..627ca4b98 --- /dev/null +++ b/docs/tr-rTR/user/telemetry-and-sensors.md @@ -0,0 +1,118 @@ +--- +title: Telemetry & Sensors +nav_order: 9 +last_updated: 2026-05-13 +description: Sensor data on the mesh — supported environment, air quality, and power sensors, plus configuration and viewing guides. +aliases: + - sensors + - environment + - weather + - power-metrics +--- + +# Telemetry & Sensors + +Meshtastic nodes can collect and share sensor data across the mesh network. + +## Genel Bakış + +Telemetry allows nodes equipped with sensors to broadcast environmental, power, and device health information. This data is visible on the node detail screen and can be logged over time. + +## Device Telemetry + +All Meshtastic nodes report basic device telemetry: + +| Metric | Açıklaması | Typical Range | +| ------------------ | ------------------------------ | ------------------------------------------------------------------ | +| Battery Level | Charge percentage | 0–100% | +| Voltaj | Battery voltage | 3.0–4.2V (LiPo) | +| Kanal Kullanımı | % of airtime used locally | 0–100% | +| Air Utilization TX | % of airtime used by this node | 0–100% | +| Çalışma Süresi | Seconds since last boot | Varies | + +## Environment Sensors + +Supported environmental sensors: + +### Temperature & Humidity + +| Sensor | Sıcaklık | Nem | Basınç | Notes | +| ------- | -------- | --- | ------ | ----------------------- | +| BME280 | ✓ | ✓ | ✓ | Recommended all-in-one | +| BME680 | ✓ | ✓ | ✓ | Adds gas resistance/IAQ | +| SHT31 | ✓ | ✓ | — | High accuracy | +| MCP9808 | ✓ | — | — | Precision temperature | +| LPS22 | — | — | ✓ | Pressure only | + +### Air Quality + +| Sensor | Metric | Notes | +| -------- | -------------------------------------------------- | -------------------------- | +| BME680 | Gas Resistance / IAQ | Volatile organic compounds | +| PMSA003I | PM1.0, PM2.5, PM10 | Particulate matter | +| SEN55 | PM, NOx, VOC, Temp, Humidity | Multi-sensor | + +### Light & UV + +| Sensor | Metric | +| -------- | -------------------------------------- | +| OPT3001 | Ambient light (lux) | +| VEML7700 | Ambient light (lux) | +| LTR390 | UV index | + +## Power Metrics + +Nodes with INA-series power sensors can report: + +| Metric | Açıklaması | +| ----------- | ----------------------------------------- | +| Bus Voltage | Supply rail voltage | +| Akım | Power consumption (mA) | +| Güç | Calculated power (mW) | + +Useful for monitoring solar charging or battery health on remote nodes. + +## Configuring Telemetry + +1. Navigate to **Settings → Module Config → Telemetry**. +2. Set reporting intervals: + - **Device Metrics Interval** — how often to broadcast device metrics + - **Environment Metrics Interval** — how often to broadcast sensor data +3. Enable specific sensor types as needed. + +### Recommended Intervals + +| Use Case | Device (s) | Environment (s) | +| ------------------------------------------ | ----------------------------- | ---------------------------------- | +| Urban mesh (many nodes) | 3600 | 3600 | +| Rural mesh (few nodes) | 900 | 900 | +| Weather station | 900 | 300 | +| Battery conservation | 7200 | 7200 | + +> ⚠️ **Note:** Shorter intervals increase airtime usage and battery drain across the mesh. + +## Viewing Telemetry + +1. Navigate to **Nodes** and select a node. +2. Telemetry sections show on the detail screen: + - Device Metrics (always available) + - Environment Metrics (if sensors present) + - Power Metrics (if INA sensor present) +3. Historical graphs show trends over time. + +![Telemetry actions](/assets/screenshots/node-metrics_telemetric_actions.png) + +## Troubleshooting + +- **No environment data showing?** The remote node needs a physical sensor connected (e.g., BME280 on I2C). Device telemetry (battery, uptime) is always available, but environment metrics require hardware. +- **Stale readings?** Check the reporting interval — very long intervals (7200s+) mean data updates infrequently. Also verify the remote node is still online. +- **Sensor conflict on I2C bus?** Some sensors share I2C addresses. If you have multiple sensors on the same bus, check for address collisions in the radio's serial debug output. + +## Related Topics + +- [Node Metrics](node-metrics) — view telemetry data on the node detail screen +- [Settings — Modules & Admin](settings-module-admin) — telemetry module configuration +- [Units & Locale](units-and-locale) — temperature and pressure display units + +--- + diff --git a/docs/tr-rTR/user/translate.md b/docs/tr-rTR/user/translate.md new file mode 100644 index 000000000..fe77da81f --- /dev/null +++ b/docs/tr-rTR/user/translate.md @@ -0,0 +1,97 @@ +--- +title: Translate the App +parent: User Guide +nav_order: 17 +last_updated: 2026-05-13 +aliases: + - translate + - crowdin + - localization +--- + +# Translate the App + +Contributing translations helps make Meshtastic accessible to a wider audience. The app uses [Crowdin](https://crowdin.com/) to manage community translations for both the user interface and in-app documentation. + +--- + +## What Gets Translated + +| Resource | Source Location | Notes | +| ----------------- | ------------------------------------- | ---------------------------------------------------------------------- | +| UI strings | `composeResources/values/strings.xml` | Buttons, labels, messages, and all user-visible text | +| User Guide pages | `docs/user/*.md` | In-app documentation shown in Help & Documentation | +| Fastlane metadata | `fastlane/metadata/android/en-US/` | App Store listing title, description, and changelogs | + +> **Note — Developer Guide pages are English-only.** Code-focused documentation targeting contributors is not translated. + +--- + +## Nasıl Katkıda Bulunulur + +1. **Visit the Crowdin project.** Open the [Meshtastic Android Crowdin project](https://crowdin.com/project/meshtastic-android) and sign in or create a free account. +2. **Choose your language.** Select an existing language or request a new one by opening a [GitHub issue](https://github.com/meshtastic/Meshtastic-Android/issues/new). +3. **Translate strings.** Crowdin shows the English source on the left and your translation on the right. Translate each string and save. +4. **Review context.** Many strings include screenshots or context comments — check these to understand where the text appears in the app. +5. **Submit.** Approved translations are automatically merged into the next release. + +> **Tip — Keep translations short.** UI strings often appear in buttons, chips, or narrow columns. If a translation is significantly longer than the English original, consider abbreviating where the meaning stays clear. + +--- + +## Adding a New Language + +If your language is not yet listed on Crowdin: + +1. Open an issue on [GitHub](https://github.com/meshtastic/Meshtastic-Android/issues/new) requesting the new locale. +2. A maintainer will add the language to Crowdin and configure `crowdin.yml`. +3. Once added, you can begin translating immediately. + +--- + +## How Translations Are Organized + +The Android app uses **Compose Multiplatform resources** for all user-visible strings: + +``` +core/resources/src/commonMain/composeResources/ +├── values/ ← English (default) +│ └── strings.xml +├── values-de/ ← German +│ └── strings.xml +├── values-fr/ ← French +│ └── strings.xml +└── ... +``` + +In-app documentation follows a similar pattern under `docs/`: + +``` +docs/ +├── user/ ← English source (default) +│ ├── onboarding.md +│ └── ... +├── fr/user/ ← French translations +│ ├── onboarding.md +│ └── ... +└── ... +``` + +The app automatically selects the correct locale based on your device's **Language & Region** settings. + +--- + +## Translation Guidelines + +- **Do not translate** technical terms like "LoRa", "MQTT", "BLE", "TAK", "SNR", or "RSSI" — these are universal. +- **Keep placeholders intact.** Strings like `%1$s` or `%d` are filled in at runtime. Do not remove or reorder them unless the grammar of your language requires it. +- **Match tone.** The app uses a friendly, direct voice. Avoid overly formal language. +- **Test if possible.** Switch your device language and open the app to see how translations look in context. + +--- + +## Questions? + +If you have questions about a specific string's context or need help getting started, open a discussion on the [Meshtastic GitHub Discussions](https://github.com/meshtastic/Meshtastic-Android/discussions) page. + +Meshtastic'in erişimini genişletmemize yardımcı olduğunuz için teşekkür ederiz! diff --git a/docs/tr-rTR/user/units-and-locale.md b/docs/tr-rTR/user/units-and-locale.md new file mode 100644 index 000000000..1cda28685 --- /dev/null +++ b/docs/tr-rTR/user/units-and-locale.md @@ -0,0 +1,118 @@ +--- +title: Units, Measurement & Locale +parent: User Guide +nav_order: 16 +last_updated: 2026-05-12 +--- + +# Units, Measurement & Locale + +The Meshtastic app automatically displays temperatures, distances, speeds, and times in the units your device is configured to use — no settings to change inside the app. + +--- + +## How It Works + +Meshtastic radios always transmit data in **metric units** (meters, °C, km/h, hPa, etc.). When the app receives this data, it uses the `MetricFormatter` utility to convert and display values in whatever unit system your device's locale specifies. + +On Android, your measurement preferences are determined by your system **Language & Region** settings. On Desktop (JVM), the app uses the JVM's default `Locale`. + +> **Tip — You never need to toggle units inside the app.** Change your system measurement preferences and every screen in Meshtastic updates automatically — node details, telemetry charts, weather, altitude, and more. + +--- + +## Sıcaklık + +Temperature values from environment sensors are transmitted as **°C** and displayed based on your device's temperature unit preference. + +![Environment metrics with temperature](/assets/screenshots/nodes_environment_metrics.png) + +| Your Setting | You See | +| ------------ | ------- | +| Celsius | 22°C | +| Fahrenheit | 72°F | + +This affects all temperature displays throughout the app: node environment telemetry, soil temperature, dew point, and telemetry chart axes. + +## Distance & Altitude + +Distances between nodes and GPS altitudes are transmitted as **meters** and automatically scaled and converted. + +![Distance info display](/assets/screenshots/nodes_distance_info.png) + +| Your Setting | Small Distance | Large Distance | Rakım | +| -------------------------------- | -------------- | ---------------------- | -------- | +| Metric | 350 m | 2.5 km | 1,200 m | +| Imperial (US) | 1,148 ft | 1.6 mi | 3,937 ft | + +The app uses natural scaling — short distances stay in meters or feet, while longer distances switch to kilometres or miles automatically. + +### Where these appear + +- **Node list** — distance and bearing to each node +- **Node detail** — altitude, distance from your position +- **Map** — waypoint distances, traceroute hop distances +- **Compass** — distance to selected node + +## Speed + +GPS ground speed is displayed in your locale's preferred speed unit. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Metric | 12 km/h | +| Imperial (US) | 7 mph | + +## Rüzgar + +Wind speed and gust data from environment sensors are transmitted as **m/s** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Metric | 5 m/s | +| Imperial (US) | 11 mph | + +Wind readings appear in the **Node Detail** environment section and the **Environment Telemetry** charts. + +## Rainfall + +Rainfall measurements (1-hour and 24-hour totals) are transmitted as **mm** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ---------------------- | +| Metric | 12 mm | +| Imperial (US) | 0.5 in | + +## Units That Never Change + +Some units are international standards and are displayed the same way regardless of your locale: + +| Measurement | Unit | Why | +| -------------------------------- | ------------------------------ | ------------------------------------- | +| Barometric pressure | hPa | International meteorological standard | +| Heading / bearing | ° (degrees) | Universal navigation convention | +| Radyasyon | μR/hr | Standard dosimetry unit | +| GPS coordinates | decimal degrees | Universal geographic standard | +| Humidity, battery, soil moisture | % | Universal | + +## Date & Time + +All timestamps throughout the app — last heard, message times, telemetry logs, chart axes — follow your device's date and time preferences. + +| Setting | What It Controls | Example | +| ---------------- | ---------------- | ------------------------------------------------ | +| **24-Hour Time** | Clock format | 14:30 vs 2:30 PM | +| **Date Format** | Date ordering | 09/05/2026 vs 05/09/2026 | + +The app also uses **relative time** where it makes sense — for example, "5 min ago" or "2 hours ago" in the node list — which is automatically localised into your device language. + +## Changing Your Measurement System (Android) + +On Android, your measurement system (metric vs imperial) is tied to your region setting: + +1. Open **Android Settings → System → Language & Region** +2. Change your **Region** or **Measurement units** preference +3. Return to Meshtastic — values update immediately + +> **Tip — The app uses `MetricFormatter` from `core:common`.** All measurement formatting is handled by a shared KMP utility that respects your platform's locale. Developers adding new measurement displays should use `MetricFormatter` rather than hard-coding unit conversions. + diff --git a/docs/uk-rUA/index.md b/docs/uk-rUA/index.md new file mode 100644 index 000000000..1e717192c --- /dev/null +++ b/docs/uk-rUA/index.md @@ -0,0 +1,30 @@ +--- +title: Home +layout: default +nav_order: 0 +--- + +# Meshtastic Android App Documentation + +User and developer documentation for the Meshtastic Android, Desktop, and iOS applications powered by KMP (Kotlin Multiplatform). + +Use the sidebar navigation to browse the **User Guide** for app features and the **Developer Guide** for contributing to the project. + +--- + +## Quick Links + +| Guide | Опис | +| --------------------------------------------------------------------- | -------------------------------------------------------------- | +| [Getting Started](user/onboarding) | Connect your first radio and send a message | +| [Messages & Channels](user/messages-and-channels) | Channel broadcasts, direct messages, reactions, and encryption | +| [Nodes](user/nodes) | Understanding the mesh network node list | +| [Signal Meter](user/signal-meter) | How the LoRa signal quality meter works | +| [Units & Locale](user/units-and-locale) | How temperatures, distances, and times adapt to your region | +| [Desktop App](user/desktop) | Linux, macOS, and Windows desktop usage | +| [Architecture](developer/architecture) | App architecture overview for contributors | +| [Contributing](developer/contributing) | Branch naming, PR workflow, and verification commands | + +--- + +> This documentation is served from the same markdown source that powers the in-app **Help & Documentation** browser. diff --git a/docs/uk-rUA/user/connections.md b/docs/uk-rUA/user/connections.md new file mode 100644 index 000000000..8daf8b49c --- /dev/null +++ b/docs/uk-rUA/user/connections.md @@ -0,0 +1,125 @@ +--- +title: Connections +nav_order: 2 +last_updated: 2026-05-13 +description: Connect your phone or desktop to a Meshtastic radio via Bluetooth, USB, or TCP/IP. +aliases: + - bluetooth + - usb + - tcp + - pairing +--- + +# Connections + +Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node. + +## Bluetooth (BLE) + +Bluetooth Low Energy is the default and most common connection method on Android. + +### Pairing a Device + +1. Ensure your Meshtastic radio is powered on and in pairing mode. +2. Open the app and navigate to **Connections**. +3. Tap **Scan for Devices** — nearby Meshtastic radios will appear. +4. Select your device from the list. +5. Accept the Bluetooth pairing prompt if shown. + +![Device list item](/assets/screenshots/connections_bluetooth_scan.png) + +You can filter devices by transport type using the filter chips at the top: + +![Transport filter chips](/assets/screenshots/connections_transport_filters.png) + +> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. + +### Connection Status + +| Icon | State | Опис | +| ---- | -------------- | ----------------------------- | +| 🟢 | Під’єднано | Active radio link established | +| 🟡 | Під’єднання | Handshake in progress | +| 🔴 | Відключено | No active connection | +| ⚪ | Not configured | Не вибраний пристрій | + +When connecting, a status indicator shows the current connection state: + +![Connecting status](/assets/screenshots/connections_connecting.png) + +If no devices are found, the app shows an empty state with instructions: + +![No devices found](/assets/screenshots/connections_empty_state.png) + +### Troubleshooting Bluetooth + +- **Device not found:** Toggle Bluetooth off/on, ensure location is enabled. +- **Connection drops:** Move closer to the radio; check for interference. +- **Pairing rejected:** Forget the device in Android Bluetooth settings and retry. + +## USB Serial + +USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable. + +### Setup + +1. Connect your radio via USB cable to your device. +2. The app will prompt for USB permission — tap **Allow**. +3. The connection is established automatically. + +> ⚠️ **Note:** USB connections require OTG support on Android devices. + +## TCP/IP (WiFi) + +Some Meshtastic radios support WiFi connectivity, allowing TCP-based connections. + +### Налаштування + +1. Connect your radio to a WiFi network via the radio's web interface or settings. +2. In the app, go to **Connections → TCP**. +3. Enter the radio's IP address and port (default: 4403). +4. Tap **Connect**. + +![WiFi scanning for devices](/assets/screenshots/connections_wifi_scanning.png) + +When a device is found, it appears in the connection list: + +![WiFi device found](/assets/screenshots/connections_wifi_device_found.png) + +A successful connection is confirmed with a status indicator: + +![WiFi connection success](/assets/screenshots/connections_wifi_success.png) + +### When to Use TCP + +- Radio is on the same local network +- Testing with a simulated radio +- Environments where Bluetooth has interference issues + +## Reconnection Behavior + +The app reconnects to the **last selected device** on startup. You can manually switch transports from the connections screen at any time. + +To disconnect from a radio, use the disconnect button on the connections screen: + +![Disconnect from radio](/assets/screenshots/connections_disconnect.png) + +## Desktop Connections + +On Desktop (Linux/macOS/Windows), the app supports: + +- **Bluetooth (BLE)** — via the Kable library; works on macOS, Linux, and Windows +- **USB Serial** — primary wired connection method +- **TCP/IP** — for network-connected radios + +See [Desktop App](desktop) for platform-specific details and keyboard shortcuts. + +## Related Topics + +- [Getting Started](onboarding) — first-launch setup and permissions +- [Settings — Radio & User](settings-radio-user) — Bluetooth and network configuration +- [Desktop App](desktop) — desktop-specific connection details +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — full list of compatible radios on meshtastic.org + +--- + diff --git a/docs/uk-rUA/user/desktop.md b/docs/uk-rUA/user/desktop.md new file mode 100644 index 000000000..1b4882a48 --- /dev/null +++ b/docs/uk-rUA/user/desktop.md @@ -0,0 +1,147 @@ +--- +title: Desktop App +nav_order: 14 +last_updated: 2026-05-13 +description: Install and use the Meshtastic Desktop app on Linux, macOS, and Windows — connections, feature parity, and keyboard shortcuts. +aliases: + - desktop + - linux + - macos + - windows + - jvm +--- + +# Desktop App + +The Meshtastic Desktop application provides the same mesh communication features on Linux, macOS, and Windows. + +## Overview + +The Desktop app shares its core codebase with the Android app through Kotlin Multiplatform (KMP). Most features work identically across platforms. + +## Installation + +### Linux + +- Download the `.deb` or `.AppImage` package from the releases page +- Or build from source using `./gradlew :desktopApp:run` + +### macOS + +- Download the `.dmg` package from releases +- Or build from source + +### Windows + +- Download the `.msi` installer from releases +- Or build from source + +## Connecting Your Radio + +### USB Serial (Primary) + +The most reliable connection method on Desktop: + +1. Connect your Meshtastic radio via USB cable. +2. The app should detect the serial port automatically. +3. If not detected, select the correct serial port from the connections menu. + +### TCP/IP + +For network-connected radios: + +1. Enter the radio's IP address and port (default: 4403). +2. Click **Connect**. + +### Bluetooth (BLE) + +Bluetooth Low Energy is supported on Desktop via the [Kable](https://github.com/JuulLabs/kable) library: + +1. Ensure your system has a Bluetooth adapter. +2. The app scans for nearby Meshtastic radios automatically. +3. Select your device from the connections screen. + +## Feature Parity + +| Feature | Android | Desktop | Нотатки | +| ---------------------------------------- | ------- | ------- | -------------------------- | +| Messaging | ✓ | ✓ | Full parity | +| Node List | ✓ | ✓ | Full parity | +| Мапа | ✓ | ✓ | Full parity | +| Налаштування | ✓ | ✓ | Full parity | +| Bluetooth (BLE) | ✓ | ✓ | Via Kable on desktop | +| Firmware Update OTA | ✓ | ✗ | Use web flasher | +| Notifications | ✓ | ✓ | Native OS notifications | +| Widgets | ✓ | ✗ | Android-only | +| AI Assistant (Chirpy) | ✓\* | ✗ | Google flavor Android only | + +\*Chirpy AI requires Android 14+ on Google flavor builds with supported hardware. + +## UI Differences + +The Desktop app uses the same Compose Multiplatform UI with adaptations for larger screens and desktop interaction. + +### Keyboard Shortcuts + +| Shortcut | Action | +| ------------------- | --------------------------- | +| **⌘Q** / **Ctrl+Q** | Quit the application | +| **⌘,** / **Ctrl+,** | Open Settings | +| **⌘1** / **Ctrl+1** | Switch to Conversations tab | +| **⌘2** / **Ctrl+2** | Switch to Nodes tab | +| **⌘3** / **Ctrl+3** | Switch to Map tab | +| **⌘4** / **Ctrl+4** | Switch to Connections tab | + +### Window & System Tray + +- **Window resizing** — responsive layout adapts to window dimensions +- **System tray** — minimize to system tray for background mesh operation +- **Tray menu** — right-click the tray icon to show window or quit +- **Mouse interaction** — hover states and standard desktop navigation + +### Notification Preferences + +The Desktop app provides in-app toggles for controlling which notifications are shown — messages, new nodes, and low battery alerts. Access these from **Settings → Notifications** within the app. + +## Built-in Documentation Browser + +The Desktop app includes a built-in documentation browser for quick access to help content without leaving the application. + +![Docs browser with table of contents](/assets/screenshots/docs-browser_toc.png) + +The browser supports full-text search across all documentation: + +![Searching the docs browser](/assets/screenshots/docs-browser_search.png) + +Individual doc pages render with full formatting: + +![A documentation page](/assets/screenshots/docs-browser_page.png) + +## Building from Source + +```bash +git clone https://github.com/meshtastic/Meshtastic-Android.git +cd Meshtastic-Android +git submodule update --init +./gradlew :desktopApp:run +``` + +Requirements: + +- JDK 21 +- No Android SDK required for desktop-only builds + +## Known Limitations + +- No OTA firmware updates (use web flasher) +- Some Android-specific features (widgets, specific notification channels) are unavailable +- Performance may vary on low-spec hardware running Compose Desktop +- BLE bonding is not yet supported on desktop (pairing works without bonding) + +## Related Topics + +- [Connections](connections) — connection methods overview +- [Firmware Updates](firmware) — use the [Web Flasher](https://flasher.meshtastic.org) for desktop firmware updates + +--- + diff --git a/docs/uk-rUA/user/discovery.md b/docs/uk-rUA/user/discovery.md new file mode 100644 index 000000000..8992b44bf --- /dev/null +++ b/docs/uk-rUA/user/discovery.md @@ -0,0 +1,114 @@ +--- +title: Discovery +nav_order: 12 +last_updated: 2026-05-13 +description: Explore your mesh network — traceroute paths, neighbor maps, and node discovery tools. +aliases: + - mesh-discovery + - local-discovery + - network-scan + - traceroute + - neighbor-info +--- + +# Discovery + +Discovery tools help you understand **how** your mesh network is connected — which nodes can hear each other, what paths messages take, and where bottlenecks or weak links exist. + +> 💡 **Tip:** You don't need a dedicated "discovery mode" to start exploring your mesh. The tools below are available right now from the node list and node detail screens. + +--- + +## Маршрут + +Traceroute reveals the exact path a message takes from your node to any other node on the mesh. It's the single most useful tool for debugging connectivity problems. + +### Running a Traceroute + +1. Navigate to **Nodes** and tap the node you want to trace. +2. On the node detail screen, tap **Traceroute**. +3. The app sends a traceroute request and waits for the response. +4. Results display each hop in order, with signal quality at every step. + +### Reading the Results + +A traceroute result looks like this: + +``` +You → Node A (SNR: 8.5, RSSI: -95) → Node B (SNR: 5.2, RSSI: -108) → Target +``` + +Each hop represents a relay node that forwarded the message. The SNR and RSSI values at each hop tell you about the link quality on that specific segment. + +| What to look for | What it means | +| -------------------------------------------------------------------------- | --------------------------------------------------------------------------- | +| All hops show Good SNR (> 5 dB) | Healthy path — messages flow reliably | +| One hop shows Bad SNR (< 0 dB) | Weak link — this relay segment is fragile | +| Many hops (4+) | Long path — consider repositioning a node to shorten it | +| Different path on retry | Mesh is adapting — multiple routes exist (this is good!) | + +> 💡 **Tip:** Run traceroute several times over a few minutes. If the path changes, your mesh has redundant routes — a sign of a well-connected network. + +### Troubleshooting with Traceroute + +- **"No route found"** — The target node may be offline, out of range, or on a different channel. Check that both nodes share at least one channel with the same encryption key. +- **Traceroute times out** — The path may be too long (exceeds hop limit) or a relay node is congested. Try increasing the hop limit in **Settings → LoRa Config**. +- **Asymmetric paths** — A traceroute from A→B may take a different path than B→A. This is normal — radio propagation is not always symmetric. + +--- + +## Інформація про сусідів + +The Neighbor Info module lets each node broadcast a list of the nodes it can **directly hear** (single-hop). When multiple nodes share their neighbor lists, you can piece together a topology map of the entire mesh. + +### Enabling Neighbor Info + +1. Navigate to **Settings → Module Config → Neighbor Info**. +2. Enable the module. +3. Set the broadcast interval (default: 900 seconds / 15 minutes). + +Once enabled, your node periodically broadcasts its neighbor table. Other nodes with Neighbor Info enabled do the same. + +### Viewing Neighbor Data + +- Open any node's detail screen and look for the **Neighbors** section. +- Each neighbor entry shows the node that was directly heard and its signal quality. +- Combine neighbor data from multiple nodes to understand the full mesh topology. + +> ⚠️ **Note:** Neighbor Info increases airtime usage because every enabled node periodically broadcasts its neighbor list. On busy meshes with many nodes, consider longer broadcast intervals (3600 seconds or more) to avoid congestion. + +--- + +## Node List as a Discovery Tool + +The node list itself is a powerful discovery tool when you use its filtering and sorting features effectively. + +### Finding New Nodes + +- Sort by **Last heard** to see the most recently active nodes at the top. +- Enable **Include unknown** to see nodes that have appeared on the mesh but haven't sent user info yet — these are often newly powered-on devices. + +### Assessing Connectivity + +- Sort by **Hops away** to see which nodes are directly reachable (0 hops) versus relayed. +- Sort by **Distance** to find nearby nodes and verify they're reachable. +- Use **Exclude MQTT** to focus on nodes reachable over radio (not via internet bridge). + +### Infrastructure Audit + +- Disable **Exclude infrastructure** to see Router, Repeater, Router Late, and Client Base nodes. +- Check their signal quality and last-heard times to verify your infrastructure nodes are healthy. + +See [Nodes](nodes) for full details on filtering and sorting options. + +--- + +## Tips for Mesh Exploration + +- **Start with traceroute** — it gives you immediate, actionable information about a specific path. +- **Enable Neighbor Info on key nodes** — especially routers and repeaters, to build a picture of the backbone. +- **Check the map** — node positions on the [Map](map-and-waypoints) combined with signal data help you understand why some links are strong and others are weak. +- **Compare signal over time** — use the [Signal Meter](signal-meter) guide to interpret SNR and RSSI values correctly. + +--- + diff --git a/docs/uk-rUA/user/firmware.md b/docs/uk-rUA/user/firmware.md new file mode 100644 index 000000000..efb0d84a5 --- /dev/null +++ b/docs/uk-rUA/user/firmware.md @@ -0,0 +1,114 @@ +--- +title: Firmware Updates +nav_order: 13 +last_updated: 2026-05-13 +description: Update your radio firmware over Bluetooth — OTA process, version channels, pre-flight checks, and recovery. +aliases: + - firmware + - update + - ota + - flash +--- + +# Firmware Updates + +Keep your Meshtastic radio up to date with the latest firmware for new features, bug fixes, and security improvements. + +## Checking for Updates + +1. Navigate to **Settings → Firmware Update** or tap the firmware notification if shown. +2. The app checks for available firmware versions. +3. Available updates show the version number and changelog summary. + +## Update Methods + +### OTA (Over-The-Air) via Bluetooth + +The most common update method for Android users: + +1. Ensure your radio is connected via Bluetooth. +2. Navigate to the Firmware Update screen. +3. Select the desired firmware version. +4. Tap **Update** to begin the OTA process. +5. Wait for the update to complete — **do not disconnect** during the update. + +![Firmware checking for updates](/assets/screenshots/firmware_checking.png) + +> ⚠️ **Warning:** Interrupting a firmware update can brick your device. Ensure your radio has sufficient battery (>50% recommended) and maintain Bluetooth proximity during the entire process. + +![Firmware disclaimer](/assets/screenshots/firmware_disclaimer.png) + +### USB Flashing + +For recovery or when OTA is unavailable: + +- Use the [Meshtastic Web Flasher](https://flasher.meshtastic.org) +- Or the [Meshtastic CLI tool](https://meshtastic.org/docs/getting-started/flashing-firmware) on desktop + +## Version Channels + +| Канал | Опис | +| --------- | ------------------------------------------- | +| Стабільна | Recommended for most users; tested releases | +| Альфа | Preview releases; may contain bugs | + +## Pre-Update Checklist + +Before updating: + +- [ ] Battery > 50% +- [ ] Stable Bluetooth connection +- [ ] Note your current settings (they may reset on major version changes) +- [ ] Check the release notes for breaking changes + +## Post-Update + +After a successful update: + +- The radio will reboot automatically +- Bluetooth connection will re-establish +- Verify your settings are intact +- Check the firmware version in **Settings → About** + +![Firmware update success](/assets/screenshots/firmware_success.png) + +## Troubleshooting + +### Update Stuck + +If the update appears frozen: + +- Wait at least 5 minutes before intervening +- If truly stuck, power-cycle the radio +- Attempt the update again + +![Firmware update error](/assets/screenshots/firmware_error.png) + +### Device Won't Boot After Update + +If your device fails to boot: + +1. Try connecting via USB to a computer +2. Use the web flasher in recovery/DFU mode +3. Flash a known-good firmware version +4. Check the Meshtastic Discord for device-specific recovery steps + +### Compatibility Warnings + +The app may show warnings when: + +- Connected radio firmware is below minimum supported version +- Major version mismatch between app and firmware +- Deprecated features need migration + +> ⚠️ **Important:** Always update the Meshtastic app before or alongside firmware updates to ensure compatibility. + +## Related Topics + +- [Connections](connections) — reconnecting after a firmware update +- [Flashing firmware guide](https://meshtastic.org/docs/getting-started/flashing-firmware) — full firmware flashing walkthrough on meshtastic.org +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — check firmware compatibility by device +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/uk-rUA/user/map-and-waypoints.md b/docs/uk-rUA/user/map-and-waypoints.md new file mode 100644 index 000000000..52d60ac65 --- /dev/null +++ b/docs/uk-rUA/user/map-and-waypoints.md @@ -0,0 +1,116 @@ +--- +title: Map & Waypoints +nav_order: 6 +last_updated: 2026-05-13 +description: View node positions on the map, create and share waypoints, and manage position sharing and privacy. +aliases: + - map + - waypoints + - gps + - location +--- + +# Map & Waypoints + +The Map screen shows the geographic positions of nodes on your mesh, along with shared waypoints. + +## Map View + +The map displays: + +- **Node positions** — colored markers for each node reporting location +- **Waypoints** — shared points of interest +- **Your position** — your current GPS location + +### Node Markers + +Node markers on the map indicate: + +| Color | Meaning | +| ------- | ---------------------------------------------- | +| Зелений | Online (heard recently) | +| Жовтий | Away (heard within 2 hours) | +| Gray | Offline (stale position) | +| Синій | Your own node | + +### Map Controls + +- **Zoom** — pinch or use +/- buttons +- **Pan** — drag to explore +- **Center** — select the location button to center on your position +- **Node tap** — tap a node marker to view details + +The floating toolbar provides quick access to compass, layer switching, node filters, refresh, and location tracking. Tap the compass to reorient north-up, or tap the location button to center on your current position. + +![Map controls overlay](/assets/screenshots/map_controls_overlay.png) + +## Waypoints + +Waypoints are shared geographic points of interest that all mesh members can see. + +### Creating a Waypoint + +1. Long-press on the map at the desired location. +2. Enter a name and optional description. +3. Choose an icon/emoji for the waypoint. +4. Tap **Send** to share with the mesh. + +### Waypoint Properties + +| Property | Опис | +| ---------- | ------------------------------------------------------- | +| Ім'я | Short identifier (max 30 characters) | +| Опис | Optional longer description | +| Icon | Visual marker emoji on the map | +| Блоковано | If locked, only the creator can edit or delete | +| Expiration | Optional auto-remove time | + +### Waypoint Expiration + +Waypoints can be set to expire automatically: + +- **Never** (default) — waypoint remains until manually deleted +- **Timed** — waypoint is automatically removed after the specified duration (e.g., "remove after 2 hours"). Useful for temporary markers like rally points, hazards, or meeting locations. + +Expired waypoints are automatically hidden from the map so they don't clutter the display. The expiration countdown begins when the waypoint is created, not when other nodes receive it. + +### Managing Waypoints + +- Tap a waypoint on the map to view its details and coordinates +- Edit or delete waypoints you created +- **Locked waypoints** cannot be modified or deleted by other nodes — only the original creator can change them +- Unlocked waypoints can be edited by any mesh member + +## Position Sharing + +### Enabling Position Sharing + +Your node shares its GPS position based on: + +- **Fixed interval** — broadcast position at regular intervals +- **Smart position** — broadcast when movement exceeds a threshold +- **Manual** — only share when explicitly requested + +Configure position behavior in **Settings → Position**. + +### Privacy Considerations + +> 🔒 **Privacy:** Position data is broadcast to all nodes on your channel. If you don't want your location shared, disable GPS position in settings or use a fixed/fake position. + +## Map Sources + +The app supports multiple map tile sources: + +- OpenStreetMap (default) +- Satellite imagery (where available) +- Offline tiles (download map areas for offline use) + +## Related Topics + +- [Nodes](nodes) — view and filter your node list +- [Node Metrics](node-metrics) — signal quality and position history for individual nodes +- [Discovery](discovery) — traceroute and neighbor info for understanding mesh topology +- [Units & Locale](units-and-locale) — distance and coordinate display formats + +--- + diff --git a/docs/uk-rUA/user/messages-and-channels.md b/docs/uk-rUA/user/messages-and-channels.md new file mode 100644 index 000000000..b69f23537 --- /dev/null +++ b/docs/uk-rUA/user/messages-and-channels.md @@ -0,0 +1,159 @@ +--- +title: Messages & Channels +nav_order: 3 +last_updated: 2026-05-13 +description: Send and receive messages, manage channels, configure encryption, and use quick chat, reactions, and message actions. +aliases: + - channels + - direct-messages + - messaging + - conversations +--- + +# Messages & Channels + +Meshtastic supports two communication modes: **channel broadcasts** and **direct messages**. + +## Канали + +Channels are shared communication groups. All nodes configured with the same channel key can read and send messages on that channel. + +### Default Channel + +Every Meshtastic device comes with a default **LongFast** channel. This is an unencrypted channel used for general mesh communication. + +### Безпека каналу + +Channels support multiple encryption levels: + +| Icon | Security Level | Опис | +| ---- | ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------- | +| 🔒 | PSK (256-bit AES) | Fully encrypted with a strong pre-shared key. Only nodes with the matching key can read messages. | +| 🔐 | PSK (128-bit AES) | Encrypted with a shorter key. Secure for most uses but 256-bit is preferred for sensitive data. | +| 🔓 | Default / Open | Uses the well-known default key. **Any Meshtastic device** on the same preset can read these messages. | +| ⚠️ | Insecure + Position | Open channel that also broadcasts your GPS position. Use with caution in public meshes. | + +> 🔒 **Security Tip:** 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. + +### Adding a Channel + +1. Navigate to **Settings → Channels**. +2. Tap **Add Channel** or scan a QR code. +3. Configure the channel name and encryption key. +4. Share the channel URL/QR code with others who need access. + +Tapping a channel shows its details and sharing options. + +## Direct Messages + +Direct messages (DMs) are point-to-point encrypted communications between two specific nodes. + +### Sending a Direct Message + +1. Open the **Messages** tab. +2. Select a node from your contacts list or tap a node in the node list. +3. Type your message and tap **Send**. + +### Message States + +| State | Icon | Meaning | +| --------------------------------- | ---- | ----------------------------------------------------------------------------------------------------------------- | +| Queued | ⏳ | Message waiting to be sent | +| En route | ✓ | Delivered to the radio, awaiting acknowledgment | +| Доставлено | ✓✓ | Acknowledgment received from recipient | +| Received | ✓ | Message received from the mesh (incoming) | +| S&F Routing | 🔗 | Store & Forward: message being routed through an S&F node | +| S&F Confirmed | 🔗 | Store & Forward: delivery confirmed via S&F node | +| Error | ✗ | Delivery failed after retries | + +### Delivery Errors + +When a message fails to deliver, the error indicator shows what went wrong: + +| Error | Meaning | What to Do | +| ------------------- | ---------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| No Route | No path exists to the destination node | The recipient may be offline or out of mesh range. Try later or move closer. | +| Got NAK | The next-hop node refused to relay | The relay node may be congested. Wait and retry. | +| Таймаут | No acknowledgment within retry window | The recipient may be just out of range. Try increasing hop limit or moving to a better position. | +| Інтерфейс відсутній | No radio interface available to send | Check that your radio is connected and the channel is configured. | +| Max Retransmit | All retry attempts exhausted | The mesh path is unreliable. Try a different channel or wait for conditions to improve. | +| Канал відсутній | The destination channel doesn't exist | Verify both nodes share the same channel configuration. | +| Too Large | Message exceeds maximum payload size | Shorten your message (max ~230 characters). | +| Немає відповіді | Node received message but didn't respond | The recipient's radio may be busy or in low-power sleep mode. | +| Duty Cycle Limit | Regional airtime limit reached | Your radio has used its allowed transmit time. Wait for the duty cycle window to reset (typically 1 hour in EU regions). | +| Невірний запит | Malformed or invalid message | This usually indicates a software bug. Try restarting the app. | + +> 💡 **Tip:** 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. + +## Message Features + +### Quick Chat + +Pre-configured messages for rapid communication: + +- Access via the Quick Chat button in the message input area +- Choose from built-in phrases or custom messages +- Customize quick chat messages in **Settings → Quick Chat** +- Useful when typing is impractical (gloves, small screen, urgent) + +![Quick chat option](/assets/screenshots/messages_quick_chat.png) + +The channel list shows each channel with its latest message preview. + +### Message Bubbles + +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. + +### Reactions + +React to messages with emoji: + +- **Long-press** a message to open the actions menu +- Tap **Add Reaction** to choose an emoji +- Reactions appear below the message bubble +- Multiple users can react to the same message +- React to your own messages or others' messages + +![Emoji reaction badges displayed beneath a message](/assets/screenshots/messages_reaction.png) + +> 💡 **Tip:** Reactions are lightweight — they use minimal mesh bandwidth compared to full text messages. + +### Message Actions + +Long-press any message to access: + +- **Copy** — copy message text to clipboard +- **Reply** — quote the message in your response +- **React** — add an emoji reaction +- **Delete** — remove a message you sent (local deletion) + +### Message Priority + +Messages are queued and transmitted based on priority: + +1. Emergency/alert messages (highest) +2. Direct messages +3. Channel broadcasts (lowest) + +### Message Limits + +- **Maximum length:** 237 bytes (approximately 230 characters for ASCII text) +- **Rate limiting:** The mesh enforces airtime fairness; heavy message volume may be throttled +- **Delivery:** Messages are retried automatically if no acknowledgment is received + +## Best Practices + +- Use channels for group coordination +- Use direct messages for private person-to-person communication +- Keep messages short — mesh bandwidth is limited +- Configure encryption for sensitive communications + +## Related Topics + +- [Nodes](nodes) — tap a node to start a direct message +- [Settings — Radio & User](settings-radio-user) — configure channel encryption and presets +- [MQTT](mqtt) — bridge channel messages to the internet +- [Channel configuration](https://meshtastic.org/docs/configuration/radio/channels) — detailed channel settings on meshtastic.org + +--- + diff --git a/docs/uk-rUA/user/mqtt.md b/docs/uk-rUA/user/mqtt.md new file mode 100644 index 000000000..a758ecfe5 --- /dev/null +++ b/docs/uk-rUA/user/mqtt.md @@ -0,0 +1,137 @@ +--- +title: MQTT +nav_order: 11 +last_updated: 2026-05-13 +description: Bridge your mesh to the internet — MQTT broker setup, encryption layers, and map reporting. +aliases: + - mqtt + - internet-bridge + - broker +--- + +# MQTT + +MQTT bridges your Meshtastic mesh network to the internet, enabling long-range communication beyond radio range. + +## Overview + +The MQTT module connects your node to an MQTT broker, allowing: + +- Messages to reach nodes on different physical meshes via the internet +- Integration with home automation and monitoring systems +- Publishing node positions to the public Meshtastic map +- Custom data pipelines for logging and alerting + +## How It Works + +``` +[Your Node] → Radio → [Gateway Node with WiFi] → MQTT Broker → [Remote Gateway] → Radio → [Remote Node] +``` + +A gateway node with internet access (WiFi or Ethernet) publishes mesh messages to an MQTT topic. Remote gateways subscribed to the same topic inject those messages into their local mesh. + +## Налаштування + +### Enabling MQTT + +1. Navigate to **Settings → Module Config → MQTT**. +2. Enable the MQTT module. +3. Configure the broker connection: + +![MQTT toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | Опис | За замовчуванням | +| ---------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------- | +| Server Address | MQTT broker hostname | mqtt.meshtastic.org | +| Ім'я користувача | Broker authentication | meshdev | +| Пароль | Broker authentication | large4cats | +| Root Topic | Base topic for messages | msh | +| Шифрування | Encrypt MQTT payload | Увімкнено | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON packet support has been removed from firmware; this field is ignored | Disabled | +| TLS | Secure connection to broker | Disabled | +| Map Reporting | Report position to public map | Disabled | + +### Default Meshtastic Broker + +The community maintains a public broker at `mqtt.meshtastic.org`. This is intended for general use and testing. + +> 🔒 **Privacy:** Messages on the public broker are readable by anyone subscribed. Always use channel encryption for private communications. + +### Private Broker + +For better privacy and control, you can run your own MQTT broker: + +- Mosquitto (lightweight, open-source) +- HiveMQ +- EMQX + +Configure your node to point to your private broker with appropriate credentials. + +## Map Reporting + +When Map Reporting is enabled, your node publishes its position to the Meshtastic community map: + +- Visible at [meshmap.net](https://meshmap.net) and similar community map services +- Only position and node info are shared +- Disable this if you don't want your location publicly visible + +## Uplink vs Downlink + +| Direction | Опис | +| ------------ | -------------------------------- | +| **Uplink** | Messages from mesh → MQTT broker | +| **Downlink** | Messages from MQTT broker → mesh | + +Configure per-channel which directions are active to control message flow and airtime usage. + +## Message Formats + +MQTT uses protobuf message format: + +| Format | Опис | Use case | +| ------------ | ----------------------------------- | -------------------------- | +| **Protobuf** | Binary Meshtastic protobuf encoding | Node-to-node mesh bridging | + +> ⚠️ **Note:** JSON output support was removed from firmware. The `json_enabled` setting is still visible in the app for legacy compatibility but has no effect on current firmware versions. + +## Encryption & Privacy + +Understanding the layered encryption model: + +1. **Channel encryption** happens on the mesh _before_ MQTT. If your channel has a PSK, the MQTT payload is already encrypted — the broker and any subscribers see only the ciphertext. +2. **MQTT encryption** (the module setting) adds an additional encryption layer for transit to the broker. This protects metadata and routing information. +3. **TLS** encrypts the TCP connection to the broker itself, preventing network-level eavesdropping. + +> 🔒 **Important:** The default public channel has a well-known key. Messages on the default channel sent via MQTT are effectively **unencrypted** — anyone can decode them. Always use a custom PSK for private communications. + +## Best Practices + +- Use channel-level encryption (PSK) on channels that bridge to MQTT +- Don't enable MQTT on nodes without internet access (it will buffer and waste memory) +- Use a private broker for sensitive deployments +- Be mindful of airtime when downlinking messages from busy MQTT topics — every downlinked message consumes radio airtime on your local mesh +- Consider enabling uplink-only if you only need to monitor your mesh remotely without injecting messages back + +## Troubleshooting + +### MQTT Not Connecting + +- **Check WiFi** — the gateway node must have an active internet connection (WiFi or Ethernet). MQTT does not work over the LoRa radio link itself. +- **Verify credentials** — incorrect username or password will silently fail on most brokers. Double-check for trailing spaces. +- **Firewall** — port 1883 (MQTT) or 8883 (MQTT+TLS) must be open. Some networks block non-standard ports. +- **DNS resolution** — if using a custom broker hostname, verify the node can resolve it. Try the broker's IP address directly. + +### Messages Not Bridging + +- **Check uplink/downlink settings** — if only uplink is enabled, messages flow from mesh to MQTT but not back. Enable downlink on the receiving gateway. +- **Channel mismatch** — both gateways must share the same channel with the same PSK. A mismatch means messages are encrypted with different keys and appear as garbage. +- **Topic mismatch** — ensure both gateways use the same root topic. The default `msh` works for the public broker. + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — MQTT module configuration reference +- [Messages & Channels](messages-and-channels) — channel encryption and PSK setup +- [MQTT integration guide](https://meshtastic.org/docs/software/integrations/mqtt) — detailed MQTT documentation on meshtastic.org + +--- + diff --git a/docs/uk-rUA/user/node-metrics.md b/docs/uk-rUA/user/node-metrics.md new file mode 100644 index 000000000..69c8f62c0 --- /dev/null +++ b/docs/uk-rUA/user/node-metrics.md @@ -0,0 +1,130 @@ +--- +title: Node Metrics +nav_order: 5 +last_updated: 2026-05-13 +description: Telemetry dashboards for each mesh node — device health, environment sensors, signal quality, power, traceroute, and position history. +aliases: + - metrics + - telemetry + - device-metrics + - signal +--- + +# Node Metrics + +The node detail screen provides comprehensive telemetry and metrics for each node on your mesh. + +## Показники пристрою + +Basic operating information reported by each node: + +| Metric | Опис | +| ------------------- | ----------------------------------- | +| Battery Level | Current battery percentage | +| Напруга | Battery voltage reading | +| Channel Utilization | Percentage of airtime consumed | +| Airtime | Transmission time used by this node | +| Час роботи | Time since last reboot | + +Device metrics are displayed as individual cards with trend sparklines showing battery level, voltage, channel utilization, airtime, and uptime over time. + +> 💡 **Tip:** Tap any metric card to expand it into a full chart with historical data points. Pinch to zoom the time axis. + +## Показники довкілля + +Environmental sensor data (requires compatible hardware): + +| Metric | Sensor Examples | +| ------------------------------------ | --------------------- | +| Температура | BME280, BME680, SHT31 | +| Вологість | BME280, BME680, SHT31 | +| Атмосферний тиск | BME280, BMP280 | +| Опір газового сенсора | BME680 | +| IAQ (Air Quality) | BME680 | + +Environment metrics are charted over time for easy trend analysis — temperature, humidity, and pressure each get their own line chart with the measurement unit displayed on the Y axis. + +> 💡 **Tip:** Environment metrics require a sensor connected to the remote node. Not all nodes report environmental data. See [Telemetry & Sensors](telemetry-and-sensors) for a full list of supported sensors. + +## Signal Metrics + +Radio signal quality information: + +| Metric | Опис | +| --------- | ----------------------------------------------------------------------------- | +| SNR | Signal-to-Noise Ratio (higher is better) | +| RSSI | Received Signal Strength Indicator (closer to 0 is better) | +| Hop Count | Number of mesh hops for last message | + +### Signal Quality Reference + +| SNR Range | Quality | +| --------------------------------- | ----------- | +| > 10 dB | Excellent | +| 0 to 10 dB | Хороший | +| -10 to 0 dB | Задовільний | +| < -10 dB | Poor | + +## Показники живлення + +Power management telemetry (requires INA sensor or compatible hardware): + +| Metric | Опис | +| ----------- | ----------------------- | +| Bus Voltage | Supply voltage | +| Поточний | Power draw in milliamps | +| Живлення | Calculated wattage | + +## Маршрут + +Traceroute shows the path a message takes through the mesh: + +1. From the node detail screen, tap **Traceroute**. +2. The app sends a traceroute request to the target node. +3. Results show each hop with SNR/RSSI values. + +### Reading Traceroute Results + +``` +You → Node A (SNR: 8.5) → Node B (SNR: 5.2) → Target +``` + +Each hop represents a relay node that forwarded the message. + +## Position Log + +Historical position data for nodes that share their location: + +- GPS coordinates +- Висота +- Speed (if moving) +- Timestamp for each position report + +## Інформація про сусідів + +Shows which nodes a given node can directly hear, useful for understanding mesh topology. + +## Viewing Metrics + +1. Navigate to **Nodes**. +2. Tap the node you want to inspect. +3. Select the metric category from the detail tabs. + +![Node detail — local device](/assets/screenshots/nodes_detail_local.png) + +The position tab shows location data for nodes that share GPS: + +![Position inline content](/assets/screenshots/nodes_position.png) + +> ⚠️ **Note:** Metrics are only available when they have been reported by the remote node. Metrics update at intervals configured on each node's telemetry settings. + +## Related Topics + +- [Nodes](nodes) — node list, filtering, and sorting +- [Telemetry & Sensors](telemetry-and-sensors) — supported sensors and configuration +- [Signal Meter](signal-meter) — how signal quality is calculated from SNR and RSSI +- [Discovery](discovery) — traceroute details and neighbor info +- [Units & Locale](units-and-locale) — temperature, distance, and speed display formats + +--- + diff --git a/docs/uk-rUA/user/nodes.md b/docs/uk-rUA/user/nodes.md new file mode 100644 index 000000000..62c1c10d8 --- /dev/null +++ b/docs/uk-rUA/user/nodes.md @@ -0,0 +1,152 @@ +--- +title: Вузли +nav_order: 4 +last_updated: 2026-05-13 +description: Browse, filter, and sort mesh nodes — view details, signal quality, roles, and quick actions. +aliases: + - node-list + - mesh-nodes + - peers +--- + +# Вузли + +The Nodes screen displays all devices visible on your mesh network. + +## Node List + +The node list shows every node your radio has heard, including: + +- **Node name** — user-configured long name +- **Short name** — 4-character identifier +- **Signal quality** — last heard signal strength +- **Last heard** — time since last communication +- **Distance** — estimated distance (if positions are shared) +- **Battery** — remote node battery level (if telemetry is enabled) + +### Node Status Indicators + +| Badge | Meaning | +| ---------- | ------------------------------------- | +| 🟢 Online | Node heard within the last 15 minutes | +| 🟡 Away | Node heard within the last 2 hours | +| 🔴 Offline | Node not heard for over 2 hours | +| ⭐ Favorite | Node marked as favorite by the user | + +### Node Roles + +Nodes can be configured with different roles that affect their mesh behavior: + +| Роль | Опис | +| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Клієнт | Standard end-user device | +| Client Base | Treats favorited-node traffic as Router Late priority; all other traffic as Client | +| Client Mute | Receives but doesn't retransmit | +| Client Hidden | Like Client Mute, plus hides from node list | +| Router | Prioritizes message forwarding; stays awake to relay | +| Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | +| ~~Router Client~~ | ⚠️ **Deprecated** (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | +| ~~Repeater~~ | ⚠️ **Deprecated** (removed in firmware 2.7.11) — no longer selectable; use Router instead | +| Трекер | Optimized for position reporting at regular intervals | +| Датчик | Optimized for telemetry reporting | +| ТАК | Interoperates with TAK systems (sends/receives CoT) | +| TAK Tracker | TAK position reporting only | +| Lost & Found | Continuous position beacon for recovery | + +### Choosing a Role + +Most users should keep the default **Client** role. Consider a different role when: + +- **Router** — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don't use Router on battery-powered handheld devices. +- **Router Late** — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. +- **Client Base** — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. +- **Client Mute** — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only devices or to reduce congestion in dense areas. +- **Tracker** — An unattended device whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. +- **Sensor** — An unattended device reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. +- **TAK / TAK Tracker** — Only needed if interoperating with ATAK/WinTAK systems. See [TAK Integration](tak) for details. + +> 💡 **Tip:** The mesh works best when most nodes are **Client** or **Router**. Too many Mute nodes reduces mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. + +### Encryption Indicators + +Nodes display encryption status icons next to their name: + +| Icon | Meaning | +| ----------- | ------------------------------------------------------------------------------------------------------------------- | +| 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | +| 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | +| ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) | + +> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. + +## Quick Actions + +From the node list, you can: + +- **Tap** a node to view its detail page +- **Long-press** for quick actions: + - Send a direct message + - Переглянути на мапі + - Запит місцезнаходження + - Mark as favorite + - Маршрут + +## Filtering & Sorting + +### Text Search + +Type in the search field to filter nodes by name or short name. The filter updates in real time as you type. + +### Filter Toggles + +| Фільтри | Опис | +| -------------------------- | ---------------------------------------------------------------------------------------------- | +| **Only online** | Show only nodes heard within the last 15 minutes | +| **Only direct** | Show only nodes with direct (non-relayed) connections | +| **Include unknown** | Show nodes that haven't sent user info yet | +| **Exclude infrastructure** | Hide infrastructure-role nodes (Router, Repeater, Router Late, Client Base) | +| **Exclude MQTT** | Hide nodes heard only via MQTT internet bridge | +| **Show ignored** | Show nodes you've previously dismissed or muted | + +### Sort Options + +| Sort | Опис | +| ------------------------------------------- | ------------------------------------------------------------------ | +| **Last heard** (default) | Most recently heard nodes first | +| **Alphabetical** | Sorted by node long name | +| **Distance** | Nearest nodes first (requires position sharing) | +| **Hops away** | Fewest relay hops first | +| **Channel** | Grouped by channel index | +| **Via MQTT** | Grouped by MQTT vs. radio-heard | +| **Favorites** | Favorited nodes first | + +## Node Detail + +Tapping a node opens the detail view with comprehensive information. See [Node Metrics](node-metrics) for full details on metrics and telemetry. + +![Node detail view](/assets/screenshots/nodes_node_list.png) + +The detail screen includes device info, position, and action buttons: + +![Node detail section](/assets/screenshots/nodes_detail_section.png) + +Inline status indicators show key metrics at a glance: + +| Indicator | Screenshot | +| --------------------- | -------------------------------------------------------- | +| Signal quality | ![Signal](/assets/screenshots/nodes_signal_info.png) | +| Рівень заряду батареї | ![Battery](/assets/screenshots/nodes_battery_info.png) | +| Hop count | ![Hops](/assets/screenshots/nodes_hops_info.png) | +| Востаннє в мережі | ![Last heard](/assets/screenshots/nodes_last_heard.png) | +| Відстань | ![Distance](/assets/screenshots/nodes_distance_info.png) | + +## Related Topics + +- [Node Metrics](node-metrics) — detailed telemetry dashboards for each node +- [Messages & Channels](messages-and-channels) — send a direct message to a node +- [Map & Waypoints](map-and-waypoints) — view node positions geographically +- [Discovery](discovery) — traceroute and neighbor info for topology exploration +- [Signal Meter](signal-meter) — understand what the signal bars mean + +--- + diff --git a/docs/uk-rUA/user/onboarding.md b/docs/uk-rUA/user/onboarding.md new file mode 100644 index 000000000..3b910534e --- /dev/null +++ b/docs/uk-rUA/user/onboarding.md @@ -0,0 +1,99 @@ +--- +title: Getting Started +nav_order: 1 +last_updated: 2026-05-13 +description: First-launch setup — permissions, onboarding flow, and next steps after connecting your radio. +aliases: + - first-launch + - setup + - intro +--- + +# Getting Started + +Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app. + +## First Launch + +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. + +### Welcome Screen + +The welcome screen introduces Meshtastic and its core capabilities: + +- Off-grid mesh communication +- No cellular or internet required +- End-to-end encrypted messaging + +Tap **Get Started** to proceed through the setup flow. + +![Welcome screen](/assets/screenshots/onboarding_welcome.png) + +## Permissions + +The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. + +### Bluetooth Permission + +Bluetooth is the primary connection method between your phone and Meshtastic radio: + +- **Bluetooth scanning** — discover nearby Meshtastic radios +- **Bluetooth connect** — establish and maintain connections with paired radios + +Grant both permissions when prompted. Without Bluetooth, you'll need to use USB or TCP connections instead. + +### Location Permission + +> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. + +Meshtastic also uses your location for: + +- Showing your position on the mesh map +- Calculating distances to other nodes +- Sharing your GPS coordinates with other mesh members (if enabled) + +Grant **"While using the app"** or **"Always"** depending on your preference: + +- **While using the app** — position updates only when the app is open +- **Always** — enables background position updates for always-on mesh presence + +If denied, Bluetooth scanning will not function and your node will not report a position. + +### Notifications Permission + +Notifications alert you to: + +- Incoming messages from channels and direct messages +- Connection status changes (connected, disconnected, reconnecting) +- Firmware update availability + +> 💡 **Tip:** You can fine-tune notification preferences later in Android system settings. The app creates separate notification channels for messages, connection events, and background service status. + +### Critical Alerts Permission + +On supported devices, the app may request permission for critical alerts: + +- These are high-priority notifications that can break through Do Not Disturb mode +- Useful for emergency mesh alerts or urgent messages +- You can **skip** this step if you don't need breakthrough notifications +- Configure or revoke later in Android notification settings + +## After Setup + +Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. + +> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. + +## What's Next? + +Once connected to a radio, explore: + +- [Connections](connections) — pair your first radio device +- [Messages & Channels](messages-and-channels) — send your first message +- [Nodes](nodes) — see who's on your mesh +- [Map & Waypoints](map-and-waypoints) — view node positions +- [Settings](settings-radio-user) — configure your radio and user profile + +New to Meshtastic? The [getting started guide](https://meshtastic.org/docs/getting-started) on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup. + +--- diff --git a/docs/uk-rUA/user/settings-module-admin.md b/docs/uk-rUA/user/settings-module-admin.md new file mode 100644 index 000000000..b9c934b59 --- /dev/null +++ b/docs/uk-rUA/user/settings-module-admin.md @@ -0,0 +1,246 @@ +--- +title: Settings — Modules & Admin +nav_order: 8 +last_updated: 2026-05-13 +description: Configure optional feature modules (MQTT, telemetry, canned messages, TAK, and more) and perform device administration. +aliases: + - modules + - module-config + - administration +--- + +# Settings — Modules & Admin + +Configure optional feature modules and perform device administration. Modules extend Meshtastic with specialized capabilities — each can be independently enabled or disabled. + +> 💡 **Tip:** You only need to enable the modules you actually use. Disabling unused modules reduces airtime, saves battery, and simplifies your configuration. + +Module settings use a card-based layout with toggle switches, dropdowns, text fields, and sliders: + +![Toggle switch](/assets/screenshots/settings_switch.png) + +![Dropdown selector](/assets/screenshots/settings_dropdown.png) + +![Text field](/assets/screenshots/settings_text_field.png) + +![Settings card layout](/assets/screenshots/settings_titled_card.png) + +## Module Configuration + +### MQTT Module + +Bridges mesh messages to and from an MQTT broker for internet connectivity. This is how you extend your mesh beyond radio range or integrate with home automation systems. + +| Setting | Опис | +| ---------------- | ------------------------------------------------------------------------ | +| Увімкнено | Toggle MQTT bridge | +| Сервер | MQTT broker address | +| Ім'я користувача | Authentication username | +| Пароль | Authentication password | +| Шифрування | Encrypt MQTT payloads | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON support removed from firmware; field is ignored | +| TLS | Use secure connection | +| Root Topic | Base MQTT topic path | +| Map Report | Publish position for public map | + +See [MQTT](mqtt) for a detailed usage guide including encryption, privacy, and broker setup. + +### Serial Module + +Enables serial port communication for external device integrations (GPS modules, sensors, or custom hardware). When enabled, the node's serial port can send and receive protobuf or text data, allowing external microcontrollers or computers to interact with the mesh. + +| Setting | Опис | +| ---------- | ------------------------------- | +| Увімкнено | Activate serial communication | +| Echo | Echo received serial data back | +| Режим | Text, Protobuf, or NMEA output | +| RX/TX Pins | GPIO pins for serial connection | +| Baud Rate | Serial communication speed | + +### External Notification Module + +Controls buzzer, LED, or vibration alerts on your radio hardware. Useful for devices that need to physically signal when a message arrives — particularly helpful for unattended or outdoor installations. + +| Setting | Опис | +| -------------------------------- | --------------------------- | +| Увімкнено | Activate notifications | +| Alert Message | Notify on incoming messages | +| Alert Message Buzzer | Use buzzer for messages | +| Alert Message Vibra | Use vibration for messages | +| Alert Bell | Notify on bell character | +| Output (GPIO) | Pin for notification output | +| Active | High or Low active | +| Duration (ms) | Notification length | +| Use I2S as Buzzer | Use I2S audio output | + +### Store & Forward Module + +Buffers messages for nodes that were temporarily offline, then replays them when those nodes reconnect. Essential for meshes where nodes go in and out of range regularly — ensures messages aren't lost during brief disconnections. + +| Setting | Опис | +| ------------------------------------------ | -------------------------- | +| Увімкнено | Activate store and forward | +| Heartbeat (s) | Announcement interval | +| Records | Maximum stored messages | +| History Return (max) | Max messages to replay | +| History Return (window) | Time window for replay | + +> 💡 **Tip:** Store and Forward works best on nodes with ample memory (ESP32 with PSRAM). Router nodes are ideal candidates since they're typically always-on. + +### Range Test Module + +Automated range testing tool for evaluating link quality between nodes. When enabled, the node periodically transmits test messages with incrementing counters. A receiver node logs these messages, allowing you to walk or drive away and later analyze at what distance messages stopped arriving. + +| Setting | Опис | +| -------------------------------------- | --------------------------------- | +| Увімкнено | Activate range testing | +| Sender Interval (s) | Time between test transmissions | +| Save CSV | Log received test data to SD card | + +### Telemetry Module + +Controls what telemetry data your node shares with the mesh. Telemetry includes device health (battery, uptime) and environmental sensor data (temperature, humidity, pressure). + +| Setting | Опис | +| ---------------------------- | --------------------------------------- | +| Device Metrics Interval | How often to report device metrics | +| Environment Metrics Interval | How often to report environment sensors | +| Air Quality Enabled | Report particulate sensor data | +| Power Metrics Enabled | Report power usage | + +See [Telemetry & Sensors](telemetry-and-sensors) for supported sensors and configuration recommendations. + +### Canned Message Module + +Pre-configured messages accessible from the device's physical buttons (for radios with rotary encoders, keypads, or similar input hardware). Define a list of quick-send messages that can be transmitted without a phone connected — ideal for field use. + +| Setting | Опис | +| ------------------ | ----------------------------------------------------------- | +| ~~Enabled~~ | ⚠️ **Deprecated** — current firmware may ignore this toggle | +| Повідомлення | Newline-separated list of messages | +| Send Bell | Play bell sound on send | +| Rotary Encoder | Enable rotary encoder input | +| Up/Down/Press Pins | GPIO pin assignments for input | + +### Audio Module + +Codec2 audio support for low-bandwidth voice communication over the mesh. This is an **experimental** feature that encodes voice into very small data packets using the Codec2 codec. + +| Setting | Опис | +| --------------- | -------------------------------- | +| Увімкнено | Activate audio module | +| Codec2 Rate | Audio quality/bandwidth tradeoff | +| I2S Word Select | GPIO pin for I2S WS | +| I2S Data In | GPIO pin for I2S DIN | +| I2S Data Out | GPIO pin for I2S DOUT | + +> ⚠️ **Note:** Audio requires specific hardware (I2S microphone and speaker). Voice quality is very low-bandwidth — think "understandable radio voice," not phone-call quality. + +### Remote Hardware Module + +GPIO control over the mesh network. Allows a remote node to read or write GPIO pins on another node — useful for activating relays, reading switches, or controlling external hardware from a distance. + +| Setting | Опис | +| -------------------- | --------------------------------------------------------------- | +| Увімкнено | Activate remote GPIO access | +| Allow Undefined Pins | Allow access to any GPIO pin (security risk) | + +> ⚠️ **Warning:** Enabling "Allow Undefined Pins" gives remote nodes access to all GPIO pins, which could interfere with the radio's own hardware. Only enable on dedicated GPIO nodes. + +### Neighbor Info Module + +Broadcasts information about directly heard neighbors, enabling mesh topology mapping. Each enabled node periodically shares a list of the other nodes it can hear and their signal quality. + +| Setting | Опис | +| -------------------------------------- | ------------------------------------ | +| Увімкнено | Activate neighbor broadcasting | +| Update Interval (s) | How often to broadcast neighbor list | + +See [Discovery](discovery) for how to use neighbor data for mesh topology exploration. + +### Ambient Lighting Module + +Controls onboard NeoPixel or other addressable RGB LEDs on supported hardware. Can be used for visual status indicators, notification lights, or decorative effects. + +| Setting | Опис | +| ------------------ | ---------------------------------------------------------- | +| Увімкнено | Activate LED control | +| LED State | On, Off, or set specific color | +| Red / Green / Blue | Individual color channel values (0–255) | + +### Detection Sensor Module + +Turns your node into a motion or door sensor alert system. When a GPIO pin detects a state change (motion detected, door opened), the node broadcasts an alert message over the mesh. + +| Setting | Опис | +| ---------------------------------------- | ----------------------------------------------------------------------- | +| Увімкнено | Activate detection sensor | +| Monitor Pin | GPIO pin connected to sensor | +| Detection Triggered High | Trigger when pin goes high (vs. low) | +| Minimum Broadcast (s) | Minimum time between alert broadcasts | +| State Broadcast (s) | Periodic state broadcast interval | +| Send Bell | Include bell character in alerts | +| Friendly Name | Custom name for this sensor | + +### Paxcounter Module + +People counter using WiFi and BLE probe requests. Counts nearby devices by passively listening for probe requests that phones and laptops emit when scanning for networks. Available only on ESP32 devices. + +| Setting | Опис | +| -------------------------------------- | -------------------------- | +| Увімкнено | Activate people counting | +| Update Interval (s) | How often to report counts | + +> 💡 **Tip:** Paxcounter is useful for estimating foot traffic at trailheads, event venues, or other locations. Counts are approximate — one person may carry multiple devices. + +### TAK Module + +Team Awareness Kit integration for interoperability with ATAK and WinTAK. See [TAK Integration](tak) for detailed setup and usage. + +## Адміністрування + +### Віддалене керування + +Remotely configure nodes that share your admin key: + +1. Select the target node in the node list. +2. Navigate to **Settings** for that node. +3. Modify configuration. +4. Tap **Save** — changes are sent over the mesh. + +> ⚠️ **Requires:** Admin key configured on both your node and the target node. + +### Очистити базу даних вузлів + +Removes stale nodes from your local database that haven't been heard in a configurable time window. + +### Factory Reset + +Resets all settings to factory defaults. **This cannot be undone.** + +### Перевантажити + +Remotely reboot a connected or administered node. + +### Панель налагодження + +View detailed diagnostic information: + +- Protocol buffers debug output +- Mesh packet log +- Connection state details + +### Troubleshooting Remote Admin + +- **"No response from target node"** — the target may be out of range, offline, or have a mismatched admin key. Verify the admin key matches on both nodes. +- **Changes not applying** — some settings require a reboot to take effect. Try the Reboot action after saving. +- **Can't see remote settings** — ensure your node has the admin key for the target node and that Admin Channel is enabled in Security Config. + +## Related Topics + +- [Settings — Radio & User](settings-radio-user) — core radio and user profile settings +- [Module configuration reference](https://meshtastic.org/docs/configuration/module) — detailed module docs on meshtastic.org +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/uk-rUA/user/settings-radio-user.md b/docs/uk-rUA/user/settings-radio-user.md new file mode 100644 index 000000000..7a6c89465 --- /dev/null +++ b/docs/uk-rUA/user/settings-radio-user.md @@ -0,0 +1,173 @@ +--- +title: Settings — Radio & User +nav_order: 7 +last_updated: 2026-05-13 +description: Configure your radio hardware, LoRa presets, user profile, position sharing, power management, and security. +aliases: + - налаштування + - radio-config + - user-config + - lora +--- + +# Settings — Radio & User + +Configure your radio hardware and user identity parameters. + +## User Settings + +### User Profile + +| Setting | Опис | +| ----------------- | ------------------------------------------------------------------------------------- | +| Довга назва | Your display name (up to 39 characters) | +| Коротка назва | 4-character abbreviated name | +| Licensed Operator | Enable if you hold an amateur radio license (enables higher power) | + +### Applying Changes + +After modifying settings, tap **Save** to write the configuration to your radio. The device may reboot to apply changes. + +## Radio Configuration + +### Налаштування пристрою + +| Setting | Опис | За замовчуванням | +| ------------------------------------------ | ----------------------------------------------------------------------- | ---------------- | +| Роль | Node behavior (Client, Router, etc.) | Клієнт | +| Режим ретрансляції | How the node retransmits messages | Усі | +| Node Info Broadcast (s) | Interval for broadcasting node info | 10800 | +| Double-tap Button | Action for double-tap button press | Disabled | + +### Налаштування LoRa + +| Setting | Опис | За замовчуванням | +| ----------------- | ----------------------------------------------------------------------- | ----------------------------------------- | +| Регіон | Regulatory region for frequency bands | Unset (must configure) | +| Modem Preset | Speed/range tradeoff | LongFast | +| Hop Limit | Maximum retransmit hops | 3 | +| TX Power | Transmission power (dBm); 0 = max allowed for region | 0 (region max) | +| Frequency Offset | Fine-tune frequency (MHz) | 0 | +| Channel Bandwidth | Bandwidth setting | Default for preset | + +> ⚠️ **Important:** You **must** set your region before transmitting. Operating without the correct region may violate local radio regulations. See the [region configuration guide](https://meshtastic.org/docs/getting-started/initial-config) on meshtastic.org for details. + +### Modem Presets + +| Preset | Range | Швидкість | SNR Limit | Best For | +| ------------------ | ----------------------- | ------------------------- | ------------------------ | -------------------------------------------------------------------------------------------------------- | +| Short Turbo | ~1 km | 21.9 kbps | −5 dB | Dense urban with line-of-sight; data-heavy applications | +| Short Fast | ~3 km | 10.9 kbps | −7.5 dB | Urban neighborhoods; buildings within a few blocks | +| Short Slow | ~5 km | 5.5 kbps | −10 dB | Suburban short-range; moderate building density | +| Medium Fast | ~5 km | 5.5 kbps | −10 dB | Suburban areas; moderate building density | +| Medium Slow | ~8 km | 1.1 kbps | −12.5 dB | Suburban/rural; moderate range with slower speed | +| Long Turbo | ~10 km | 4.4 kbps | −10 dB | Similar range to Long Fast but with 500 kHz bandwidth; faster throughput | +| Long Fast | ~10 km | 1.1 kbps | −12.5 dB | **General use (default)** — balanced range and speed | +| Long Moderate | ~20 km | 0.34 kbps | −15 dB | Rural with some terrain; occasional use | +| Lite Fast | ~5 km | 5.5 kbps | −10 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Medium Fast | +| Lite Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Long Fast | +| Narrow Fast | ~5 km | 2.7 kbps | −10 dB | EU 868 MHz band (62.5 kHz BW); avoids interference with other devices | +| Narrow Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 868 MHz band (62.5 kHz BW); comparable to Long Fast | +| ~~Long Slow~~ | ~30 km | 0.18 kbps | −17.5 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | +| ~~Very Long Slow~~ | ~40+ km | 0.09 kbps | −20 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | + +#### Choosing a Modem Preset + +The modem preset controls the fundamental tradeoff between **range** and **data rate**: + +- **Slower presets** use more spreading, making signals decodable at weaker signal levels (lower SNR limit). This means longer range but fewer bytes per second. +- **Faster presets** pack more data per transmission but require a stronger signal to decode. + +**Practical guidance:** + +- **Urban mesh (many nodes, short distances):** Use **Long Fast** (default) or **Short Fast**. Higher speed means less airtime congestion when many nodes share the channel. +- **Rural/sparse mesh (few nodes, long distances):** Use **Long Moderate**. Range matters more than speed when nodes are far apart. +- **EU 866/868 MHz regulatory compliance:** Use **Lite Fast**, **Lite Slow**, **Narrow Fast**, or **Narrow Slow** — these are optimized for the EU SRD/868 MHz bands with narrower bandwidths. +- **Fixed infrastructure links:** Use **Short Turbo** or **Long Turbo** for dedicated point-to-point links with good antennas and line-of-sight. +- **Mixed environments:** Stick with **Long Fast** — it's the community default and ensures compatibility with others in your area. + +> ⚠️ **Important:** All nodes on the same channel **must** use the same modem preset. Nodes with mismatched presets cannot communicate even if they share the same frequency and encryption key. + +> 💡 **Tip:** The range estimates above assume flat terrain and modest antennas. Elevation advantage (hilltop, rooftop) dramatically increases effective range. A well-placed Router with Long Fast can often outperform a ground-level node with Long Slow. + +### Налаштування дисплею + +| Setting | Опис | +| ------------------- | ------------------------------------------------------------------------------------ | +| Screen Timeout | Time before display sleeps | +| Одиниці виміру | Metric or Imperial | +| Тип OLED | Auto, SSD1306, SH1106, SH1107 | +| Compass Orientation | Rotation offset for compass display (0°, 90°, 180°, 270°) | +| ~~Compass North~~ | ⚠️ **Deprecated** — replaced by Compass Orientation; still visible in older firmware | + +### Position Config + +| Setting | Опис | +| ----------------------------------------- | ---------------------------------- | +| GPS Enabled | Enable/disable GPS | +| GPS Update Interval | How often to acquire GPS fix | +| Position Broadcast (s) | How often to share position | +| Інтелектуальне передавання позиції | Enable movement-based broadcasting | +| Фіксована позиція | Use a manually set position | + +### Налаштування живлення + +| Setting | Опис | +| --------------------------------------- | --------------------------------------- | +| Power Saving | Enable low-power sleep mode | +| Shutdown After (s) | Auto-shutdown idle timer | +| ADC Multiplier | Battery voltage calibration factor | +| Wait Bluetooth (s) | Time to wait for BLE connection at boot | +| Mesh SDS Timeout (s) | Super-deep-sleep timeout | + +### Налаштування мережі + +| Setting | Опис | +| ------------- | ---------------------------------------------------- | +| WiFi Enabled | Enable WiFi radio (ESP32 devices) | +| WiFi SSID | Network name to connect to | +| WiFi PSK | Network password | +| NTP-сервер | Time synchronization server | +| Syslog Server | Remote logging server | + +![IP address field](/assets/screenshots/settings_ipv4_field.png) + +### Налаштування Bluetooth + +| Setting | Опис | +| ----------------- | ------------------------------------------------------------------------- | +| Bluetooth Enabled | Enable/disable BLE radio | +| Pairing Mode | Fixed PIN, Random PIN, or No PIN | +| Фіксований PIN | PIN code for pairing (default: 123456) | + +### Налаштування безпеки + +| Setting | Опис | +| --------------------- | -------------------------------------------------------------------------- | +| Відкритий ключ | Your node's public key (read-only) | +| Ключ адміністратора | Key for remote administration | +| Приватний ключ | Your node's private key (handle securely) | +| Admin Channel Enabled | Allow admin commands via channel | +| Debug Log | Output live debug logging over serial/bluetooth | +| Serial Enabled | Enable serial console access (moved from Device Config) | +| Керований режим | Restrict non-admin channel changes | + +![Password field](/assets/screenshots/settings_password_field.png) + +Settings use standard preference controls — dropdowns, toggles, and sliders: + +| Control | Screenshot | +| -------- | ------------------------------------------------------ | +| Dropdown | ![Dropdown](/assets/screenshots/settings_dropdown.png) | +| Toggle | ![Toggle](/assets/screenshots/settings_switch.png) | +| Slider | ![Slider](/assets/screenshots/settings_slider.png) | + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — optional feature modules and device administration +- [Signal Meter](signal-meter) — how modem presets affect signal quality thresholds +- [LoRa configuration](https://meshtastic.org/docs/configuration/radio/lora) — detailed LoRa settings reference on meshtastic.org +- [Initial configuration](https://meshtastic.org/docs/getting-started/initial-config) — region setup guide on meshtastic.org + +--- + diff --git a/docs/uk-rUA/user/signal-meter.md b/docs/uk-rUA/user/signal-meter.md new file mode 100644 index 000000000..6b28b8a6b --- /dev/null +++ b/docs/uk-rUA/user/signal-meter.md @@ -0,0 +1,81 @@ +--- +title: How the Meshtastic Signal Meter Works +nav_order: 15 +last_updated: 2026-05-13 +description: How the signal meter calculates quality from RSSI and SNR — LoRa spread spectrum, presets, and what the bars really mean. +aliases: + - signal + - signal-meter + - snr + - rssi +--- + +# How the Meshtastic Signal Meter Works + +The Meshtastic signal meter — the familiar bars or status color in the app — is calculated very differently than the "bars" on a traditional cell phone or Wi-Fi router. + +Most consumer devices simply measure how "loud" a signal is. However, because Meshtastic uses **LoRa (Long Range)** technology, its signal meter measures how **clear** the signal is, relative to the specific settings your mesh is using. + +--- + +## 1. The Two Metrics: "Loudness" vs. "Clarity" + +Every time the LoRa radio chip receives a message, it reports two measurements: + +- **RSSI (Received Signal Strength Indicator):** The **loudness** of the raw power hitting your antenna. +- **SNR (Signal-to-Noise Ratio):** The **clarity** of the signal compared to the background static. + +> **Tip — The Analogy:** Imagine you are trying to hear a friend talking to you. +> +> - **RSSI** is how loud their voice is. +> - **The Noise Floor** is the background noise in the room (air conditioning, other people talking, traffic). +> - **SNR** is how easily you can distinguish your friend's voice from the background noise. + +If your friend shouts at you at a deafening rock concert, the signal is incredibly loud (High RSSI), but you still can't understand them because the background noise is louder (Bad SNR). Conversely, if your friend whispers to you in a dead-silent library, the signal is very weak (Low RSSI), but you can understand them perfectly (Great SNR). + +--- + +## 2. The Magic of LoRa: Hearing "Below the Noise Floor" + +For standard radios (like FM or Wi-Fi), if the background noise is louder than the signal (a negative SNR), the receiver just hears static. + +LoRa is special. It uses **"Spread Spectrum"** modulation, which allows the radio to mathematically pull a signal out of the air even when it is buried deep _underneath_ the background noise. This is why you will frequently see **negative SNR numbers** in Meshtastic (e.g., -10 dB, which means the signal is 10 decibels weaker than the background static). + +Depending on which Meshtastic preset you are using (e.g., `LongFast` vs. `ShortFast`), the radio has a specific **SNR Limit** — the absolute maximum amount of noise it can tolerate before the message is completely lost to the static. + +--- + +## 3. How the Signal Meter Calculates Quality + +The Meshtastic apps take both RSSI and SNR and run them through a specific formula to assign your signal a quality rating (None, Bad, Fair, or Good). It specifically scales these values based on the physical limits of the radio preset you are using. + +Here is exactly how the app decides how many bars (or what color) to show you: + +| Level | Bars | Criteria | Meaning | +| ----------- | ---- | ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | +| Хороший | 3 | RSSI better than `-115 dBm` **AND** SNR better than `-7 dB` | Signal is both loud and clear — healthy connection. | +| Задовільний | 2 | RSSI better than `-126 dBm` with good SNR, **OR** SNR better than `-15 dB` with good RSSI | Signal getting quieter or noisier, but still decodable. | +| Поганий | 1 | Falls between Fair and None thresholds | At the edge of range or experiencing interference. | +| Жоден | 0 | RSSI worse than `-126 dBm` **AND** SNR worse than `-15 dB` | Transmission completely buried in noise. | + +--- + +## 4. What This Means for You + +Because Meshtastic's meter acts as a **"Clarity Meter"**, it behaves differently than what most people expect: + +> **Tip — Don't panic over low RSSI:** You might see a seemingly terrible RSSI value like `-118 dBm`. On a cell phone, you would have zero bars. But if you have an SNR of `+2 dB`, Meshtastic will still show a strong signal! _The library is quiet, so the whisper is heard perfectly._ + +> **Warning — Watch out for local noise:** If you hook up a massive antenna and see a great RSSI (e.g., `-90 dBm`) but your signal meter is only showing **1 Bar (Bad)**, you have a problem. It means you have local interference — perhaps a cheap power supply, a noisy computer, or a nearby radio tower — creating so much static that it is drowning out your mesh. + +## Where Signal Information Appears + +In the app, signal data is shown in several places: + +- **Node list** — signal bars icon next to each node +- **Node detail** — SNR, RSSI, and signal quality in the device metrics section +- **Traceroute** — per-hop signal quality for each relay node +- **Signal metrics** — historical SNR and RSSI data in the metrics charts + +![Node entry showing SNR, RSSI values and colored signal bars](/assets/screenshots/nodes_signal_info.png) + diff --git a/docs/uk-rUA/user/tak.md b/docs/uk-rUA/user/tak.md new file mode 100644 index 000000000..0c34cad87 --- /dev/null +++ b/docs/uk-rUA/user/tak.md @@ -0,0 +1,126 @@ +--- +title: TAK Integration +nav_order: 10 +last_updated: 2026-05-13 +description: Interoperate with ATAK and WinTAK — CoT position sharing, TAK roles, and plugin setup. +aliases: + - tak + - atak + - team-awareness-kit +--- + +# TAK Integration + +Meshtastic integrates with the Team Awareness Kit (TAK) ecosystem, enabling interoperability between Meshtastic mesh devices and TAK applications like ATAK and WinTAK. + +## Overview + +The TAK module allows Meshtastic nodes to: + +- Share position data in TAK-compatible CoT (Cursor on Target) format +- Appear as team members on TAK map displays +- Receive TAK PLI (Position Location Information) messages + +## Setup + +### Prerequisites + +- ATAK (Android Team Awareness Kit) or WinTAK installed +- Meshtastic ATAK Plugin installed +- TAK module enabled on your Meshtastic radio + +### Налаштування + +1. Navigate to **Settings → Module Config → TAK**. +2. Enable the TAK module. +3. Configure the TAK team/group settings: + +![Module toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | Опис | +| --------- | -------------------------- | +| Увімкнено | Activate TAK interop | +| Режим | TAK-compatible output mode | + +### ATAK Plugin Setup + +1. Install the Meshtastic ATAK Plugin from the plugin repository. +2. Open ATAK and enable the Meshtastic plugin. +3. The plugin bridges messages between ATAK and your mesh network. + +## TAK Roles + +Nodes configured with TAK-related roles behave differently from standard clients: + +| Роль | Опис | +| --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **TAK** | Full TAK interoperability — sends and receives CoT data, chat messages, and PLI updates. Functions as a standard client plus TAK bridge. | +| **TAK Tracker** | Position-only TAK output — automatically broadcasts PLI at regular intervals without user interaction. Optimized for unattended position beacons (vehicles, equipment, waypoints). Does not relay chat messages. | + +> 💡 **Tip:** Use **TAK Tracker** for devices that only need to report position (e.g., a radio mounted in a vehicle). Use **TAK** for devices where users actively participate in TAK operations. + +### CoT (Cursor on Target) Format + +TAK messages use the Cursor on Target XML format — a military standard for sharing situational awareness data. Meshtastic converts its internal protobuf messages to CoT format when bridging to TAK systems, so no manual format conversion is needed. + +## TAK Identity + +When using TAK roles, your node broadcasts identity information that appears on TAK maps: + +| Setting | Опис | +| -------- | ---------------------------------------------------------------------------------------------------------------- | +| Team | Your team color on the TAK map (e.g., Blue, Red, Cyan, Green) | +| Роль | Your operational role (Team Member, Team Lead, HQ, Medic, RTO, etc.) | +| Callsign | Your TAK callsign (defaults to your Meshtastic long name) | + +These settings appear in **Settings → Module Config → TAK** when the TAK module is enabled. + +> 💡 **Tip:** Team/role colors are the standard TAK affiliation colors. Coordinate with your TAK team to use consistent team assignments. + +## Wire Format (V1 / V2) + +Meshtastic supports two TAK wire formats: + +| Format | Compatibility | Features | +| ------------------------------- | --------------------------------------------------------------- | --------------------------------------------------------- | +| V1 (Legacy) | ATAK Plugin v1.x, older firmware | Basic CoT position sharing only | +| V2 (Current) | ATAK Plugin v2.x, firmware 2.3+ | Full CoT support including chat, routes, zstd compression | + +The app automatically selects V2 when both sides support it. No manual configuration needed — the TAK module negotiates format based on firmware capabilities. + +## Usage with ATAK + +Once configured: + +- Meshtastic nodes appear as markers on the ATAK map with callsign labels +- Chat messages can bridge between mesh and TAK networks +- Position updates flow bidirectionally between Meshtastic and TAK +- TAK Tracker nodes broadcast PLI automatically — their positions appear on ATAK maps without any ATAK-side configuration + +> ⚠️ **Note:** TAK integration requires specific node roles and module configuration. Standard client nodes don't automatically participate in TAK operations. + +## Troubleshooting + +| Problem | Cause | Solution | +| -------------------------------- | ------------------------------------- | ----------------------------------------------------------------------- | +| Node doesn't appear on ATAK map | TAK module disabled or wrong role | Verify TAK module is enabled and node role is TAK or TAK Tracker | +| Position updates are stale | GPS fix lost or interval too long | Check GPS status; reduce position broadcast interval in Position Config | +| ATAK plugin shows "disconnected" | BLE connection lost or plugin crashed | Reconnect Bluetooth in Meshtastic app, then restart ATAK plugin | +| Chat messages not bridging | V1 format doesn't support chat | Ensure both nodes run firmware 2.3+ for V2 wire format | +| CoT data not flowing | Channel mismatch | All TAK nodes must be on the same channel with matching encryption | + +## Security Considerations + +- TAK data shares your position and callsign information +- Ensure your channel encryption is configured when using TAK in sensitive environments +- The TAK module respects the same channel encryption as other Meshtastic messages + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — TAK module configuration +- [Nodes](nodes) — TAK and TAK Tracker roles in the node list +- [Map & Waypoints](map-and-waypoints) — node positions on the map +- [ATAK plugin guide](https://meshtastic.org/docs/software/integrations/atak-plugin) — detailed ATAK setup on meshtastic.org + +--- + diff --git a/docs/uk-rUA/user/telemetry-and-sensors.md b/docs/uk-rUA/user/telemetry-and-sensors.md new file mode 100644 index 000000000..e6215523f --- /dev/null +++ b/docs/uk-rUA/user/telemetry-and-sensors.md @@ -0,0 +1,118 @@ +--- +title: Telemetry & Sensors +nav_order: 9 +last_updated: 2026-05-13 +description: Sensor data on the mesh — supported environment, air quality, and power sensors, plus configuration and viewing guides. +aliases: + - sensors + - environment + - weather + - power-metrics +--- + +# Telemetry & Sensors + +Meshtastic nodes can collect and share sensor data across the mesh network. + +## Overview + +Telemetry allows nodes equipped with sensors to broadcast environmental, power, and device health information. This data is visible on the node detail screen and can be logged over time. + +## Device Telemetry + +All Meshtastic nodes report basic device telemetry: + +| Metric | Опис | Typical Range | +| ------------------- | ------------------------------ | ------------------------------------------------------------------ | +| Battery Level | Charge percentage | 0–100% | +| Напруга | Battery voltage | 3.0–4.2V (LiPo) | +| Channel Utilization | % of airtime used locally | 0–100% | +| Air Utilization TX | % of airtime used by this node | 0–100% | +| Час роботи | Seconds since last boot | Varies | + +## Environment Sensors + +Supported environmental sensors: + +### Temperature & Humidity + +| Датчик | Температура | Вологість | Атмосферний тиск | Нотатки | +| ------- | ----------- | --------- | ---------------- | ----------------------- | +| BME280 | ✓ | ✓ | ✓ | Recommended all-in-one | +| BME680 | ✓ | ✓ | ✓ | Adds gas resistance/IAQ | +| SHT31 | ✓ | ✓ | — | High accuracy | +| MCP9808 | ✓ | — | — | Precision temperature | +| LPS22 | — | — | ✓ | Pressure only | + +### Air Quality + +| Датчик | Metric | Нотатки | +| -------- | -------------------------------------------------- | -------------------------- | +| BME680 | Gas Resistance / IAQ | Volatile organic compounds | +| PMSA003I | PM1.0, PM2.5, PM10 | Particulate matter | +| SEN55 | PM, NOx, VOC, Temp, Humidity | Multi-sensor | + +### Light & UV + +| Датчик | Metric | +| -------- | -------------------------------------- | +| OPT3001 | Ambient light (lux) | +| VEML7700 | Ambient light (lux) | +| LTR390 | UV index | + +## Показники живлення + +Nodes with INA-series power sensors can report: + +| Metric | Опис | +| ----------- | ----------------------------------------- | +| Bus Voltage | Supply rail voltage | +| Поточний | Power consumption (mA) | +| Живлення | Calculated power (mW) | + +Useful for monitoring solar charging or battery health on remote nodes. + +## Configuring Telemetry + +1. Navigate to **Settings → Module Config → Telemetry**. +2. Set reporting intervals: + - **Device Metrics Interval** — how often to broadcast device metrics + - **Environment Metrics Interval** — how often to broadcast sensor data +3. Enable specific sensor types as needed. + +### Recommended Intervals + +| Use Case | Device (s) | Environment (s) | +| ------------------------------------------ | ----------------------------- | ---------------------------------- | +| Urban mesh (many nodes) | 3600 | 3600 | +| Rural mesh (few nodes) | 900 | 900 | +| Weather station | 900 | 300 | +| Battery conservation | 7200 | 7200 | + +> ⚠️ **Note:** Shorter intervals increase airtime usage and battery drain across the mesh. + +## Viewing Telemetry + +1. Navigate to **Nodes** and select a node. +2. Telemetry sections show on the detail screen: + - Device Metrics (always available) + - Environment Metrics (if sensors present) + - Power Metrics (if INA sensor present) +3. Historical graphs show trends over time. + +![Telemetry actions](/assets/screenshots/node-metrics_telemetric_actions.png) + +## Troubleshooting + +- **No environment data showing?** The remote node needs a physical sensor connected (e.g., BME280 on I2C). Device telemetry (battery, uptime) is always available, but environment metrics require hardware. +- **Stale readings?** Check the reporting interval — very long intervals (7200s+) mean data updates infrequently. Also verify the remote node is still online. +- **Sensor conflict on I2C bus?** Some sensors share I2C addresses. If you have multiple sensors on the same bus, check for address collisions in the radio's serial debug output. + +## Related Topics + +- [Node Metrics](node-metrics) — view telemetry data on the node detail screen +- [Settings — Modules & Admin](settings-module-admin) — telemetry module configuration +- [Units & Locale](units-and-locale) — temperature and pressure display units + +--- + diff --git a/docs/uk-rUA/user/translate.md b/docs/uk-rUA/user/translate.md new file mode 100644 index 000000000..cb9e62891 --- /dev/null +++ b/docs/uk-rUA/user/translate.md @@ -0,0 +1,97 @@ +--- +title: Translate the App +parent: User Guide +nav_order: 17 +last_updated: 2026-05-13 +aliases: + - translate + - crowdin + - localization +--- + +# Translate the App + +Contributing translations helps make Meshtastic accessible to a wider audience. The app uses [Crowdin](https://crowdin.com/) to manage community translations for both the user interface and in-app documentation. + +--- + +## What Gets Translated + +| Resource | Source Location | Нотатки | +| ----------------- | ------------------------------------- | ---------------------------------------------------------------------- | +| UI strings | `composeResources/values/strings.xml` | Buttons, labels, messages, and all user-visible text | +| User Guide pages | `docs/user/*.md` | In-app documentation shown in Help & Documentation | +| Fastlane metadata | `fastlane/metadata/android/en-US/` | App Store listing title, description, and changelogs | + +> **Note — Developer Guide pages are English-only.** Code-focused documentation targeting contributors is not translated. + +--- + +## How to Contribute + +1. **Visit the Crowdin project.** Open the [Meshtastic Android Crowdin project](https://crowdin.com/project/meshtastic-android) and sign in or create a free account. +2. **Choose your language.** Select an existing language or request a new one by opening a [GitHub issue](https://github.com/meshtastic/Meshtastic-Android/issues/new). +3. **Translate strings.** Crowdin shows the English source on the left and your translation on the right. Translate each string and save. +4. **Review context.** Many strings include screenshots or context comments — check these to understand where the text appears in the app. +5. **Submit.** Approved translations are automatically merged into the next release. + +> **Tip — Keep translations short.** UI strings often appear in buttons, chips, or narrow columns. If a translation is significantly longer than the English original, consider abbreviating where the meaning stays clear. + +--- + +## Adding a New Language + +If your language is not yet listed on Crowdin: + +1. Open an issue on [GitHub](https://github.com/meshtastic/Meshtastic-Android/issues/new) requesting the new locale. +2. A maintainer will add the language to Crowdin and configure `crowdin.yml`. +3. Once added, you can begin translating immediately. + +--- + +## How Translations Are Organized + +The Android app uses **Compose Multiplatform resources** for all user-visible strings: + +``` +core/resources/src/commonMain/composeResources/ +├── values/ ← English (default) +│ └── strings.xml +├── values-de/ ← German +│ └── strings.xml +├── values-fr/ ← French +│ └── strings.xml +└── ... +``` + +In-app documentation follows a similar pattern under `docs/`: + +``` +docs/ +├── user/ ← English source (default) +│ ├── onboarding.md +│ └── ... +├── fr/user/ ← French translations +│ ├── onboarding.md +│ └── ... +└── ... +``` + +The app automatically selects the correct locale based on your device's **Language & Region** settings. + +--- + +## Translation Guidelines + +- **Do not translate** technical terms like "LoRa", "MQTT", "BLE", "TAK", "SNR", or "RSSI" — these are universal. +- **Keep placeholders intact.** Strings like `%1$s` or `%d` are filled in at runtime. Do not remove or reorder them unless the grammar of your language requires it. +- **Match tone.** The app uses a friendly, direct voice. Avoid overly formal language. +- **Test if possible.** Switch your device language and open the app to see how translations look in context. + +--- + +## Questions? + +If you have questions about a specific string's context or need help getting started, open a discussion on the [Meshtastic GitHub Discussions](https://github.com/meshtastic/Meshtastic-Android/discussions) page. + +Thank you for helping expand the reach of Meshtastic! diff --git a/docs/uk-rUA/user/units-and-locale.md b/docs/uk-rUA/user/units-and-locale.md new file mode 100644 index 000000000..54d5c0f2d --- /dev/null +++ b/docs/uk-rUA/user/units-and-locale.md @@ -0,0 +1,118 @@ +--- +title: Units, Measurement & Locale +parent: User Guide +nav_order: 16 +last_updated: 2026-05-12 +--- + +# Units, Measurement & Locale + +The Meshtastic app automatically displays temperatures, distances, speeds, and times in the units your device is configured to use — no settings to change inside the app. + +--- + +## How It Works + +Meshtastic radios always transmit data in **metric units** (meters, °C, km/h, hPa, etc.). When the app receives this data, it uses the `MetricFormatter` utility to convert and display values in whatever unit system your device's locale specifies. + +On Android, your measurement preferences are determined by your system **Language & Region** settings. On Desktop (JVM), the app uses the JVM's default `Locale`. + +> **Tip — You never need to toggle units inside the app.** Change your system measurement preferences and every screen in Meshtastic updates automatically — node details, telemetry charts, weather, altitude, and more. + +--- + +## Температура + +Temperature values from environment sensors are transmitted as **°C** and displayed based on your device's temperature unit preference. + +![Environment metrics with temperature](/assets/screenshots/nodes_environment_metrics.png) + +| Your Setting | You See | +| ------------ | ------- | +| Celsius | 22°C | +| Fahrenheit | 72°F | + +This affects all temperature displays throughout the app: node environment telemetry, soil temperature, dew point, and telemetry chart axes. + +## Distance & Altitude + +Distances between nodes and GPS altitudes are transmitted as **meters** and automatically scaled and converted. + +![Distance info display](/assets/screenshots/nodes_distance_info.png) + +| Your Setting | Small Distance | Large Distance | Висота | +| -------------------------------- | -------------- | ---------------------- | -------- | +| Metric | 350 m | 2.5 km | 1,200 m | +| Imperial (US) | 1,148 ft | 1.6 mi | 3,937 ft | + +The app uses natural scaling — short distances stay in meters or feet, while longer distances switch to kilometres or miles automatically. + +### Where these appear + +- **Node list** — distance and bearing to each node +- **Node detail** — altitude, distance from your position +- **Map** — waypoint distances, traceroute hop distances +- **Compass** — distance to selected node + +## Швидкість + +GPS ground speed is displayed in your locale's preferred speed unit. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Metric | 12 km/h | +| Imperial (US) | 7 mph | + +## Вітер + +Wind speed and gust data from environment sensors are transmitted as **m/s** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ------- | +| Metric | 5 m/s | +| Imperial (US) | 11 mph | + +Wind readings appear in the **Node Detail** environment section and the **Environment Telemetry** charts. + +## Rainfall + +Rainfall measurements (1-hour and 24-hour totals) are transmitted as **mm** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ---------------------- | +| Metric | 12 mm | +| Imperial (US) | 0.5 in | + +## Units That Never Change + +Some units are international standards and are displayed the same way regardless of your locale: + +| Measurement | Unit | Why | +| -------------------------------- | ------------------------------ | ------------------------------------- | +| Barometric pressure | hPa | International meteorological standard | +| Heading / bearing | ° (degrees) | Universal navigation convention | +| Радіація | μR/hr | Standard dosimetry unit | +| GPS coordinates | decimal degrees | Universal geographic standard | +| Humidity, battery, soil moisture | % | Universal | + +## Date & Time + +All timestamps throughout the app — last heard, message times, telemetry logs, chart axes — follow your device's date and time preferences. + +| Setting | What It Controls | Example | +| ---------------- | ---------------- | ------------------------------------------------ | +| **24-Hour Time** | Clock format | 14:30 vs 2:30 PM | +| **Date Format** | Date ordering | 09/05/2026 vs 05/09/2026 | + +The app also uses **relative time** where it makes sense — for example, "5 min ago" or "2 hours ago" in the node list — which is automatically localised into your device language. + +## Changing Your Measurement System (Android) + +On Android, your measurement system (metric vs imperial) is tied to your region setting: + +1. Open **Android Settings → System → Language & Region** +2. Change your **Region** or **Measurement units** preference +3. Return to Meshtastic — values update immediately + +> **Tip — The app uses `MetricFormatter` from `core:common`.** All measurement formatting is handled by a shared KMP utility that respects your platform's locale. Developers adding new measurement displays should use `MetricFormatter` rather than hard-coding unit conversions. + diff --git a/docs/zh-rCN/index.md b/docs/zh-rCN/index.md new file mode 100644 index 000000000..0e04bb3a9 --- /dev/null +++ b/docs/zh-rCN/index.md @@ -0,0 +1,30 @@ +--- +title: Home +layout: default +nav_order: 0 +--- + +# Meshtastic Android App Documentation + +User and developer documentation for the Meshtastic Android, Desktop, and iOS applications powered by KMP (Kotlin Multiplatform). + +Use the sidebar navigation to browse the **User Guide** for app features and the **Developer Guide** for contributing to the project. + +--- + +## Quick Links + +| Guide | 说明 | +| --------------------------------------------------------------------- | -------------------------------------------------------------- | +| [Getting Started](user/onboarding) | Connect your first radio and send a message | +| [Messages & Channels](user/messages-and-channels) | Channel broadcasts, direct messages, reactions, and encryption | +| [Nodes](user/nodes) | Understanding the mesh network node list | +| [Signal Meter](user/signal-meter) | How the LoRa signal quality meter works | +| [Units & Locale](user/units-and-locale) | How temperatures, distances, and times adapt to your region | +| [Desktop App](user/desktop) | Linux, macOS, and Windows desktop usage | +| [Architecture](developer/architecture) | App architecture overview for contributors | +| [Contributing](developer/contributing) | Branch naming, PR workflow, and verification commands | + +--- + +> This documentation is served from the same markdown source that powers the in-app **Help & Documentation** browser. diff --git a/docs/zh-rCN/user/connections.md b/docs/zh-rCN/user/connections.md new file mode 100644 index 000000000..30c21611b --- /dev/null +++ b/docs/zh-rCN/user/connections.md @@ -0,0 +1,125 @@ +--- +title: 连接数 +nav_order: 2 +last_updated: 2026-05-13 +description: Connect your phone or desktop to a Meshtastic radio via Bluetooth, USB, or TCP/IP. +aliases: + - bluetooth + - usb + - tcp + - pairing +--- + +# 连接数 + +Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node. + +## Bluetooth (BLE) + +Bluetooth Low Energy is the default and most common connection method on Android. + +### Pairing a Device + +1. Ensure your Meshtastic radio is powered on and in pairing mode. +2. Open the app and navigate to **Connections**. +3. Tap **Scan for Devices** — nearby Meshtastic radios will appear. +4. Select your device from the list. +5. Accept the Bluetooth pairing prompt if shown. + +![Device list item](/assets/screenshots/connections_bluetooth_scan.png) + +You can filter devices by transport type using the filter chips at the top: + +![Transport filter chips](/assets/screenshots/connections_transport_filters.png) + +> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. + +### Connection Status + +| 图标 | State | 说明 | +| -- | -------------- | ----------------------------- | +| 🟢 | 已连接 | Active radio link established | +| 🟡 | 正在连接 | Handshake in progress | +| 🔴 | 已断开连接 | No active connection | +| ⚪ | Not configured | 未选择设备 | + +When connecting, a status indicator shows the current connection state: + +![Connecting status](/assets/screenshots/connections_connecting.png) + +If no devices are found, the app shows an empty state with instructions: + +![No devices found](/assets/screenshots/connections_empty_state.png) + +### Troubleshooting Bluetooth + +- **Device not found:** Toggle Bluetooth off/on, ensure location is enabled. +- **Connection drops:** Move closer to the radio; check for interference. +- **Pairing rejected:** Forget the device in Android Bluetooth settings and retry. + +## USB Serial + +USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable. + +### Setup + +1. Connect your radio via USB cable to your device. +2. The app will prompt for USB permission — tap **Allow**. +3. The connection is established automatically. + +> ⚠️ **Note:** USB connections require OTG support on Android devices. + +## TCP/IP (WiFi) + +Some Meshtastic radios support WiFi connectivity, allowing TCP-based connections. + +### Configuration + +1. Connect your radio to a WiFi network via the radio's web interface or settings. +2. In the app, go to **Connections → TCP**. +3. Enter the radio's IP address and port (default: 4403). +4. Tap **Connect**. + +![WiFi scanning for devices](/assets/screenshots/connections_wifi_scanning.png) + +When a device is found, it appears in the connection list: + +![WiFi device found](/assets/screenshots/connections_wifi_device_found.png) + +A successful connection is confirmed with a status indicator: + +![WiFi connection success](/assets/screenshots/connections_wifi_success.png) + +### When to Use TCP + +- Radio is on the same local network +- Testing with a simulated radio +- Environments where Bluetooth has interference issues + +## Reconnection Behavior + +The app reconnects to the **last selected device** on startup. You can manually switch transports from the connections screen at any time. + +To disconnect from a radio, use the disconnect button on the connections screen: + +![Disconnect from radio](/assets/screenshots/connections_disconnect.png) + +## Desktop Connections + +On Desktop (Linux/macOS/Windows), the app supports: + +- **Bluetooth (BLE)** — via the Kable library; works on macOS, Linux, and Windows +- **USB Serial** — primary wired connection method +- **TCP/IP** — for network-connected radios + +See [Desktop App](desktop) for platform-specific details and keyboard shortcuts. + +## Related Topics + +- [Getting Started](onboarding) — first-launch setup and permissions +- [Settings — Radio & User](settings-radio-user) — Bluetooth and network configuration +- [Desktop App](desktop) — desktop-specific connection details +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — full list of compatible radios on meshtastic.org + +--- + diff --git a/docs/zh-rCN/user/desktop.md b/docs/zh-rCN/user/desktop.md new file mode 100644 index 000000000..51f0915af --- /dev/null +++ b/docs/zh-rCN/user/desktop.md @@ -0,0 +1,147 @@ +--- +title: Desktop App +nav_order: 14 +last_updated: 2026-05-13 +description: Install and use the Meshtastic Desktop app on Linux, macOS, and Windows — connections, feature parity, and keyboard shortcuts. +aliases: + - desktop + - linux + - macos + - windows + - jvm +--- + +# Desktop App + +The Meshtastic Desktop application provides the same mesh communication features on Linux, macOS, and Windows. + +## 总览 + +The Desktop app shares its core codebase with the Android app through Kotlin Multiplatform (KMP). Most features work identically across platforms. + +## 安装 + +### Linux + +- Download the `.deb` or `.AppImage` package from the releases page +- Or build from source using `./gradlew :desktopApp:run` + +### macOS + +- Download the `.dmg` package from releases +- Or build from source + +### Windows + +- Download the `.msi` installer from releases +- Or build from source + +## Connecting Your Radio + +### USB Serial (Primary) + +The most reliable connection method on Desktop: + +1. Connect your Meshtastic radio via USB cable. +2. The app should detect the serial port automatically. +3. If not detected, select the correct serial port from the connections menu. + +### TCP/IP + +For network-connected radios: + +1. Enter the radio's IP address and port (default: 4403). +2. Click **Connect**. + +### Bluetooth (BLE) + +Bluetooth Low Energy is supported on Desktop via the [Kable](https://github.com/JuulLabs/kable) library: + +1. Ensure your system has a Bluetooth adapter. +2. The app scans for nearby Meshtastic radios automatically. +3. Select your device from the connections screen. + +## Feature Parity + +| Feature | Android | Desktop | 注 | +| ---------------------------------------- | ------- | ------- | -------------------------- | +| Messaging | ✓ | ✓ | Full parity | +| Node List | ✓ | ✓ | Full parity | +| 地图 | ✓ | ✓ | Full parity | +| 设置 | ✓ | ✓ | Full parity | +| Bluetooth (BLE) | ✓ | ✓ | Via Kable on desktop | +| Firmware Update OTA | ✓ | ✗ | Use web flasher | +| Notifications | ✓ | ✓ | Native OS notifications | +| Widgets | ✓ | ✗ | Android-only | +| AI Assistant (Chirpy) | ✓\* | ✗ | Google flavor Android only | + +\*Chirpy AI requires Android 14+ on Google flavor builds with supported hardware. + +## UI Differences + +The Desktop app uses the same Compose Multiplatform UI with adaptations for larger screens and desktop interaction. + +### Keyboard Shortcuts + +| Shortcut | Action | +| ------------------- | --------------------------- | +| **⌘Q** / **Ctrl+Q** | Quit the application | +| **⌘,** / **Ctrl+,** | 打开设置 | +| **⌘1** / **Ctrl+1** | Switch to Conversations tab | +| **⌘2** / **Ctrl+2** | Switch to Nodes tab | +| **⌘3** / **Ctrl+3** | Switch to Map tab | +| **⌘4** / **Ctrl+4** | Switch to Connections tab | + +### Window & System Tray + +- **Window resizing** — responsive layout adapts to window dimensions +- **System tray** — minimize to system tray for background mesh operation +- **Tray menu** — right-click the tray icon to show window or quit +- **Mouse interaction** — hover states and standard desktop navigation + +### Notification Preferences + +The Desktop app provides in-app toggles for controlling which notifications are shown — messages, new nodes, and low battery alerts. Access these from **Settings → Notifications** within the app. + +## Built-in Documentation Browser + +The Desktop app includes a built-in documentation browser for quick access to help content without leaving the application. + +![Docs browser with table of contents](/assets/screenshots/docs-browser_toc.png) + +The browser supports full-text search across all documentation: + +![Searching the docs browser](/assets/screenshots/docs-browser_search.png) + +Individual doc pages render with full formatting: + +![A documentation page](/assets/screenshots/docs-browser_page.png) + +## Building from Source + +```bash +git clone https://github.com/meshtastic/Meshtastic-Android.git +cd Meshtastic-Android +git submodule update --init +./gradlew :desktopApp:run +``` + +Requirements: + +- JDK 21 +- No Android SDK required for desktop-only builds + +## Known Limitations + +- No OTA firmware updates (use web flasher) +- Some Android-specific features (widgets, specific notification channels) are unavailable +- Performance may vary on low-spec hardware running Compose Desktop +- BLE bonding is not yet supported on desktop (pairing works without bonding) + +## Related Topics + +- [Connections](connections) — connection methods overview +- [Firmware Updates](firmware) — use the [Web Flasher](https://flasher.meshtastic.org) for desktop firmware updates + +--- + diff --git a/docs/zh-rCN/user/discovery.md b/docs/zh-rCN/user/discovery.md new file mode 100644 index 000000000..752ba4fad --- /dev/null +++ b/docs/zh-rCN/user/discovery.md @@ -0,0 +1,114 @@ +--- +title: 发现 +nav_order: 12 +last_updated: 2026-05-13 +description: Explore your mesh network — traceroute paths, neighbor maps, and node discovery tools. +aliases: + - mesh-discovery + - local-discovery + - network-scan + - traceroute + - neighbor-info +--- + +# 发现 + +Discovery tools help you understand **how** your mesh network is connected — which nodes can hear each other, what paths messages take, and where bottlenecks or weak links exist. + +> 💡 **Tip:** You don't need a dedicated "discovery mode" to start exploring your mesh. The tools below are available right now from the node list and node detail screens. + +--- + +## 追踪器 + +Traceroute reveals the exact path a message takes from your node to any other node on the mesh. It's the single most useful tool for debugging connectivity problems. + +### Running a Traceroute + +1. Navigate to **Nodes** and tap the node you want to trace. +2. On the node detail screen, tap **Traceroute**. +3. The app sends a traceroute request and waits for the response. +4. Results display each hop in order, with signal quality at every step. + +### Reading the Results + +A traceroute result looks like this: + +``` +You → Node A (SNR: 8.5, RSSI: -95) → Node B (SNR: 5.2, RSSI: -108) → Target +``` + +Each hop represents a relay node that forwarded the message. The SNR and RSSI values at each hop tell you about the link quality on that specific segment. + +| What to look for | What it means | +| -------------------------------------------------------------------------- | --------------------------------------------------------------------------- | +| All hops show Good SNR (> 5 dB) | Healthy path — messages flow reliably | +| One hop shows Bad SNR (< 0 dB) | Weak link — this relay segment is fragile | +| Many hops (4+) | Long path — consider repositioning a node to shorten it | +| Different path on retry | Mesh is adapting — multiple routes exist (this is good!) | + +> 💡 **Tip:** Run traceroute several times over a few minutes. If the path changes, your mesh has redundant routes — a sign of a well-connected network. + +### Troubleshooting with Traceroute + +- **"No route found"** — The target node may be offline, out of range, or on a different channel. Check that both nodes share at least one channel with the same encryption key. +- **Traceroute times out** — The path may be too long (exceeds hop limit) or a relay node is congested. Try increasing the hop limit in **Settings → LoRa Config**. +- **Asymmetric paths** — A traceroute from A→B may take a different path than B→A. This is normal — radio propagation is not always symmetric. + +--- + +## 邻居信息 + +The Neighbor Info module lets each node broadcast a list of the nodes it can **directly hear** (single-hop). When multiple nodes share their neighbor lists, you can piece together a topology map of the entire mesh. + +### Enabling Neighbor Info + +1. Navigate to **Settings → Module Config → Neighbor Info**. +2. Enable the module. +3. Set the broadcast interval (default: 900 seconds / 15 minutes). + +Once enabled, your node periodically broadcasts its neighbor table. Other nodes with Neighbor Info enabled do the same. + +### Viewing Neighbor Data + +- Open any node's detail screen and look for the **Neighbors** section. +- Each neighbor entry shows the node that was directly heard and its signal quality. +- Combine neighbor data from multiple nodes to understand the full mesh topology. + +> ⚠️ **Note:** Neighbor Info increases airtime usage because every enabled node periodically broadcasts its neighbor list. On busy meshes with many nodes, consider longer broadcast intervals (3600 seconds or more) to avoid congestion. + +--- + +## Node List as a Discovery Tool + +The node list itself is a powerful discovery tool when you use its filtering and sorting features effectively. + +### Finding New Nodes + +- Sort by **Last heard** to see the most recently active nodes at the top. +- Enable **Include unknown** to see nodes that have appeared on the mesh but haven't sent user info yet — these are often newly powered-on devices. + +### Assessing Connectivity + +- Sort by **Hops away** to see which nodes are directly reachable (0 hops) versus relayed. +- Sort by **Distance** to find nearby nodes and verify they're reachable. +- Use **Exclude MQTT** to focus on nodes reachable over radio (not via internet bridge). + +### Infrastructure Audit + +- Disable **Exclude infrastructure** to see Router, Repeater, Router Late, and Client Base nodes. +- Check their signal quality and last-heard times to verify your infrastructure nodes are healthy. + +See [Nodes](nodes) for full details on filtering and sorting options. + +--- + +## Tips for Mesh Exploration + +- **Start with traceroute** — it gives you immediate, actionable information about a specific path. +- **Enable Neighbor Info on key nodes** — especially routers and repeaters, to build a picture of the backbone. +- **Check the map** — node positions on the [Map](map-and-waypoints) combined with signal data help you understand why some links are strong and others are weak. +- **Compare signal over time** — use the [Signal Meter](signal-meter) guide to interpret SNR and RSSI values correctly. + +--- + diff --git a/docs/zh-rCN/user/firmware.md b/docs/zh-rCN/user/firmware.md new file mode 100644 index 000000000..9a18af210 --- /dev/null +++ b/docs/zh-rCN/user/firmware.md @@ -0,0 +1,114 @@ +--- +title: 固件升级 +nav_order: 13 +last_updated: 2026-05-13 +description: Update your radio firmware over Bluetooth — OTA process, version channels, pre-flight checks, and recovery. +aliases: + - firmware + - update + - OTA(空中升级) + - flash +--- + +# 固件升级 + +Keep your Meshtastic radio up to date with the latest firmware for new features, bug fixes, and security improvements. + +## Checking for Updates + +1. Navigate to **Settings → Firmware Update** or tap the firmware notification if shown. +2. The app checks for available firmware versions. +3. Available updates show the version number and changelog summary. + +## Update Methods + +### OTA (Over-The-Air) via Bluetooth + +The most common update method for Android users: + +1. Ensure your radio is connected via Bluetooth. +2. Navigate to the Firmware Update screen. +3. Select the desired firmware version. +4. Tap **Update** to begin the OTA process. +5. Wait for the update to complete — **do not disconnect** during the update. + +![Firmware checking for updates](/assets/screenshots/firmware_checking.png) + +> ⚠️ **Warning:** Interrupting a firmware update can brick your device. Ensure your radio has sufficient battery (>50% recommended) and maintain Bluetooth proximity during the entire process. + +![Firmware disclaimer](/assets/screenshots/firmware_disclaimer.png) + +### USB Flashing + +For recovery or when OTA is unavailable: + +- Use the [Meshtastic Web Flasher](https://flasher.meshtastic.org) +- Or the [Meshtastic CLI tool](https://meshtastic.org/docs/getting-started/flashing-firmware) on desktop + +## Version Channels + +| 频道 | 说明 | +| ---- | ------------------------------------------- | +| 稳定版本 | Recommended for most users; tested releases | +| 开发版本 | Preview releases; may contain bugs | + +## Pre-Update Checklist + +Before updating: + +- [ ] Battery > 50% +- [ ] Stable Bluetooth connection +- [ ] Note your current settings (they may reset on major version changes) +- [ ] Check the release notes for breaking changes + +## Post-Update + +After a successful update: + +- The radio will reboot automatically +- Bluetooth connection will re-establish +- Verify your settings are intact +- Check the firmware version in **Settings → About** + +![Firmware update success](/assets/screenshots/firmware_success.png) + +## 问题排查 + +### Update Stuck + +If the update appears frozen: + +- Wait at least 5 minutes before intervening +- If truly stuck, power-cycle the radio +- Attempt the update again + +![Firmware update error](/assets/screenshots/firmware_error.png) + +### Device Won't Boot After Update + +If your device fails to boot: + +1. Try connecting via USB to a computer +2. Use the web flasher in recovery/DFU mode +3. Flash a known-good firmware version +4. Check the Meshtastic Discord for device-specific recovery steps + +### Compatibility Warnings + +The app may show warnings when: + +- Connected radio firmware is below minimum supported version +- Major version mismatch between app and firmware +- Deprecated features need migration + +> ⚠️ **Important:** Always update the Meshtastic app before or alongside firmware updates to ensure compatibility. + +## Related Topics + +- [Connections](connections) — reconnecting after a firmware update +- [Flashing firmware guide](https://meshtastic.org/docs/getting-started/flashing-firmware) — full firmware flashing walkthrough on meshtastic.org +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — check firmware compatibility by device +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/zh-rCN/user/map-and-waypoints.md b/docs/zh-rCN/user/map-and-waypoints.md new file mode 100644 index 000000000..d776cd4e7 --- /dev/null +++ b/docs/zh-rCN/user/map-and-waypoints.md @@ -0,0 +1,116 @@ +--- +title: Map & Waypoints +nav_order: 6 +last_updated: 2026-05-13 +description: View node positions on the map, create and share waypoints, and manage position sharing and privacy. +aliases: + - map + - waypoints + - gps + - location +--- + +# Map & Waypoints + +The Map screen shows the geographic positions of nodes on your mesh, along with shared waypoints. + +## Map View + +The map displays: + +- **Node positions** — colored markers for each node reporting location +- **Waypoints** — shared points of interest +- **Your position** — your current GPS location + +### Node Markers + +Node markers on the map indicate: + +| 颜色 | Meaning | +| ---- | ---------------------------------------------- | +| 绿 | Online (heard recently) | +| 黄色 | Away (heard within 2 hours) | +| Gray | Offline (stale position) | +| 蓝 | Your own node | + +### Map Controls + +- **Zoom** — pinch or use +/- buttons +- **Pan** — drag to explore +- **Center** — select the location button to center on your position +- **Node tap** — tap a node marker to view details + +The floating toolbar provides quick access to compass, layer switching, node filters, refresh, and location tracking. Tap the compass to reorient north-up, or tap the location button to center on your current position. + +![Map controls overlay](/assets/screenshots/map_controls_overlay.png) + +## Waypoints + +Waypoints are shared geographic points of interest that all mesh members can see. + +### Creating a Waypoint + +1. Long-press on the map at the desired location. +2. Enter a name and optional description. +3. Choose an icon/emoji for the waypoint. +4. Tap **Send** to share with the mesh. + +### Waypoint Properties + +| Property | 说明 | +| ---------- | ------------------------------------------------------- | +| 名称 | Short identifier (max 30 characters) | +| 说明 | Optional longer description | +| 图标 | Visual marker emoji on the map | +| 锁定 | If locked, only the creator can edit or delete | +| Expiration | Optional auto-remove time | + +### Waypoint Expiration + +Waypoints can be set to expire automatically: + +- **Never** (default) — waypoint remains until manually deleted +- **Timed** — waypoint is automatically removed after the specified duration (e.g., "remove after 2 hours"). Useful for temporary markers like rally points, hazards, or meeting locations. + +Expired waypoints are automatically hidden from the map so they don't clutter the display. The expiration countdown begins when the waypoint is created, not when other nodes receive it. + +### Managing Waypoints + +- Tap a waypoint on the map to view its details and coordinates +- Edit or delete waypoints you created +- **Locked waypoints** cannot be modified or deleted by other nodes — only the original creator can change them +- Unlocked waypoints can be edited by any mesh member + +## Position Sharing + +### Enabling Position Sharing + +Your node shares its GPS position based on: + +- **Fixed interval** — broadcast position at regular intervals +- **Smart position** — broadcast when movement exceeds a threshold +- **Manual** — only share when explicitly requested + +Configure position behavior in **Settings → Position**. + +### Privacy Considerations + +> 🔒 **Privacy:** Position data is broadcast to all nodes on your channel. If you don't want your location shared, disable GPS position in settings or use a fixed/fake position. + +## Map Sources + +The app supports multiple map tile sources: + +- OpenStreetMap (default) +- Satellite imagery (where available) +- Offline tiles (download map areas for offline use) + +## Related Topics + +- [Nodes](nodes) — view and filter your node list +- [Node Metrics](node-metrics) — signal quality and position history for individual nodes +- [Discovery](discovery) — traceroute and neighbor info for understanding mesh topology +- [Units & Locale](units-and-locale) — distance and coordinate display formats + +--- + diff --git a/docs/zh-rCN/user/messages-and-channels.md b/docs/zh-rCN/user/messages-and-channels.md new file mode 100644 index 000000000..04cb6c5e5 --- /dev/null +++ b/docs/zh-rCN/user/messages-and-channels.md @@ -0,0 +1,159 @@ +--- +title: Messages & Channels +nav_order: 3 +last_updated: 2026-05-13 +description: Send and receive messages, manage channels, configure encryption, and use quick chat, reactions, and message actions. +aliases: + - channels + - direct-messages + - messaging + - conversations +--- + +# Messages & Channels + +Meshtastic supports two communication modes: **channel broadcasts** and **direct messages**. + +## 频道 + +Channels are shared communication groups. All nodes configured with the same channel key can read and send messages on that channel. + +### Default Channel + +Every Meshtastic device comes with a default **LongFast** channel. This is an unencrypted channel used for general mesh communication. + +### 频道安全 + +Channels support multiple encryption levels: + +| 图标 | Security Level | 说明 | +| -- | ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------- | +| 🔒 | PSK (256-bit AES) | Fully encrypted with a strong pre-shared key. Only nodes with the matching key can read messages. | +| 🔐 | PSK (128-bit AES) | Encrypted with a shorter key. Secure for most uses but 256-bit is preferred for sensitive data. | +| 🔓 | Default / Open | Uses the well-known default key. **Any Meshtastic device** on the same preset can read these messages. | +| ⚠️ | Insecure + Position | Open channel that also broadcasts your GPS position. Use with caution in public meshes. | + +> 🔒 **Security Tip:** 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. + +### Adding a Channel + +1. Navigate to **Settings → Channels**. +2. Tap **Add Channel** or scan a QR code. +3. Configure the channel name and encryption key. +4. Share the channel URL/QR code with others who need access. + +Tapping a channel shows its details and sharing options. + +## 私聊 + +Direct messages (DMs) are point-to-point encrypted communications between two specific nodes. + +### Sending a Direct Message + +1. Open the **Messages** tab. +2. Select a node from your contacts list or tap a node in the node list. +3. Type your message and tap **Send**. + +### Message States + +| State | 图标 | Meaning | +| --------------------------------- | -- | ----------------------------------------------------------------------------------------------------------------- | +| Queued | ⏳ | Message waiting to be sent | +| En route | ✓ | Delivered to the radio, awaiting acknowledgment | +| 已发送 | ✓✓ | Acknowledgment received from recipient | +| Received | ✓ | Message received from the mesh (incoming) | +| S&F Routing | 🔗 | Store & Forward: message being routed through an S&F node | +| S&F Confirmed | 🔗 | Store & Forward: delivery confirmed via S&F node | +| 错误 | ✗ | Delivery failed after retries | + +### Delivery Errors + +When a message fails to deliver, the error indicator shows what went wrong: + +| 错误 | Meaning | What to Do | +| ---------------- | ---------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 找不到目标 | No path exists to the destination node | The recipient may be offline or out of mesh range. Try later or move closer. | +| Got NAK | The next-hop node refused to relay | The relay node may be congested. Wait and retry. | +| 超时 | No acknowledgment within retry window | The recipient may be just out of range. Try increasing hop limit or moving to a better position. | +| 无连接 | No radio interface available to send | Check that your radio is connected and the channel is configured. | +| Max Retransmit | All retry attempts exhausted | The mesh path is unreliable. Try a different channel or wait for conditions to improve. | +| 没有频道 | The destination channel doesn't exist | Verify both nodes share the same channel configuration. | +| Too Large | Message exceeds maximum payload size | Shorten your message (max ~230 characters). | +| 无响应 | Node received message but didn't respond | The recipient's radio may be busy or in low-power sleep mode. | +| Duty Cycle Limit | Regional airtime limit reached | Your radio has used its allowed transmit time. Wait for the duty cycle window to reset (typically 1 hour in EU regions). | +| 错误请求 | Malformed or invalid message | This usually indicates a software bug. Try restarting the app. | + +> 💡 **Tip:** 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. + +## Message Features + +### Quick Chat + +Pre-configured messages for rapid communication: + +- Access via the Quick Chat button in the message input area +- Choose from built-in phrases or custom messages +- Customize quick chat messages in **Settings → Quick Chat** +- Useful when typing is impractical (gloves, small screen, urgent) + +![Quick chat option](/assets/screenshots/messages_quick_chat.png) + +The channel list shows each channel with its latest message preview. + +### Message Bubbles + +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. + +### Reactions + +React to messages with emoji: + +- **Long-press** a message to open the actions menu +- Tap **Add Reaction** to choose an emoji +- Reactions appear below the message bubble +- Multiple users can react to the same message +- React to your own messages or others' messages + +![Emoji reaction badges displayed beneath a message](/assets/screenshots/messages_reaction.png) + +> 💡 **Tip:** Reactions are lightweight — they use minimal mesh bandwidth compared to full text messages. + +### Message Actions + +Long-press any message to access: + +- **Copy** — copy message text to clipboard +- **Reply** — quote the message in your response +- **React** — add an emoji reaction +- **Delete** — remove a message you sent (local deletion) + +### Message Priority + +Messages are queued and transmitted based on priority: + +1. Emergency/alert messages (highest) +2. Direct messages +3. Channel broadcasts (lowest) + +### Message Limits + +- **Maximum length:** 237 bytes (approximately 230 characters for ASCII text) +- **Rate limiting:** The mesh enforces airtime fairness; heavy message volume may be throttled +- **Delivery:** Messages are retried automatically if no acknowledgment is received + +## Best Practices + +- Use channels for group coordination +- Use direct messages for private person-to-person communication +- Keep messages short — mesh bandwidth is limited +- Configure encryption for sensitive communications + +## Related Topics + +- [Nodes](nodes) — tap a node to start a direct message +- [Settings — Radio & User](settings-radio-user) — configure channel encryption and presets +- [MQTT](mqtt) — bridge channel messages to the internet +- [Channel configuration](https://meshtastic.org/docs/configuration/radio/channels) — detailed channel settings on meshtastic.org + +--- + diff --git a/docs/zh-rCN/user/mqtt.md b/docs/zh-rCN/user/mqtt.md new file mode 100644 index 000000000..145e7c937 --- /dev/null +++ b/docs/zh-rCN/user/mqtt.md @@ -0,0 +1,137 @@ +--- +title: MQTT +nav_order: 11 +last_updated: 2026-05-13 +description: Bridge your mesh to the internet — MQTT broker setup, encryption layers, and map reporting. +aliases: + - mqtt + - internet-bridge + - broker +--- + +# MQTT + +MQTT bridges your Meshtastic mesh network to the internet, enabling long-range communication beyond radio range. + +## 总览 + +The MQTT module connects your node to an MQTT broker, allowing: + +- Messages to reach nodes on different physical meshes via the internet +- Integration with home automation and monitoring systems +- Publishing node positions to the public Meshtastic map +- Custom data pipelines for logging and alerting + +## How It Works + +``` +[Your Node] → Radio → [Gateway Node with WiFi] → MQTT Broker → [Remote Gateway] → Radio → [Remote Node] +``` + +A gateway node with internet access (WiFi or Ethernet) publishes mesh messages to an MQTT topic. Remote gateways subscribed to the same topic inject those messages into their local mesh. + +## Configuration + +### Enabling MQTT + +1. Navigate to **Settings → Module Config → MQTT**. +2. Enable the MQTT module. +3. Configure the broker connection: + +![MQTT toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | 说明 | 默认 | +| --------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------- | +| Server Address | MQTT broker hostname | mqtt.meshtastic.org | +| 用户名称 | Broker authentication | meshdev | +| 密码 | Broker authentication | large4cats | +| Root Topic | Base topic for messages | msh | +| 加密 | Encrypt MQTT payload | Enabled | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON packet support has been removed from firmware; this field is ignored | 禁用 | +| TLS | Secure connection to broker | 禁用 | +| Map Reporting | Report position to public map | 禁用 | + +### Default Meshtastic Broker + +The community maintains a public broker at `mqtt.meshtastic.org`. This is intended for general use and testing. + +> 🔒 **Privacy:** Messages on the public broker are readable by anyone subscribed. Always use channel encryption for private communications. + +### Private Broker + +For better privacy and control, you can run your own MQTT broker: + +- Mosquitto (lightweight, open-source) +- HiveMQ +- EMQX + +Configure your node to point to your private broker with appropriate credentials. + +## Map Reporting + +When Map Reporting is enabled, your node publishes its position to the Meshtastic community map: + +- Visible at [meshmap.net](https://meshmap.net) and similar community map services +- Only position and node info are shared +- Disable this if you don't want your location publicly visible + +## Uplink vs Downlink + +| Direction | 说明 | +| ------------ | -------------------------------- | +| **Uplink** | Messages from mesh → MQTT broker | +| **Downlink** | Messages from MQTT broker → mesh | + +Configure per-channel which directions are active to control message flow and airtime usage. + +## Message Formats + +MQTT uses protobuf message format: + +| Format | 说明 | Use case | +| ------------ | ----------------------------------- | -------------------------- | +| **Protobuf** | Binary Meshtastic protobuf encoding | Node-to-node mesh bridging | + +> ⚠️ **Note:** JSON output support was removed from firmware. The `json_enabled` setting is still visible in the app for legacy compatibility but has no effect on current firmware versions. + +## Encryption & Privacy + +Understanding the layered encryption model: + +1. **Channel encryption** happens on the mesh _before_ MQTT. If your channel has a PSK, the MQTT payload is already encrypted — the broker and any subscribers see only the ciphertext. +2. **MQTT encryption** (the module setting) adds an additional encryption layer for transit to the broker. This protects metadata and routing information. +3. **TLS** encrypts the TCP connection to the broker itself, preventing network-level eavesdropping. + +> 🔒 **Important:** The default public channel has a well-known key. Messages on the default channel sent via MQTT are effectively **unencrypted** — anyone can decode them. Always use a custom PSK for private communications. + +## Best Practices + +- Use channel-level encryption (PSK) on channels that bridge to MQTT +- Don't enable MQTT on nodes without internet access (it will buffer and waste memory) +- Use a private broker for sensitive deployments +- Be mindful of airtime when downlinking messages from busy MQTT topics — every downlinked message consumes radio airtime on your local mesh +- Consider enabling uplink-only if you only need to monitor your mesh remotely without injecting messages back + +## 问题排查 + +### MQTT Not Connecting + +- **Check WiFi** — the gateway node must have an active internet connection (WiFi or Ethernet). MQTT does not work over the LoRa radio link itself. +- **Verify credentials** — incorrect username or password will silently fail on most brokers. Double-check for trailing spaces. +- **Firewall** — port 1883 (MQTT) or 8883 (MQTT+TLS) must be open. Some networks block non-standard ports. +- **DNS resolution** — if using a custom broker hostname, verify the node can resolve it. Try the broker's IP address directly. + +### Messages Not Bridging + +- **Check uplink/downlink settings** — if only uplink is enabled, messages flow from mesh to MQTT but not back. Enable downlink on the receiving gateway. +- **Channel mismatch** — both gateways must share the same channel with the same PSK. A mismatch means messages are encrypted with different keys and appear as garbage. +- **Topic mismatch** — ensure both gateways use the same root topic. The default `msh` works for the public broker. + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — MQTT module configuration reference +- [Messages & Channels](messages-and-channels) — channel encryption and PSK setup +- [MQTT integration guide](https://meshtastic.org/docs/software/integrations/mqtt) — detailed MQTT documentation on meshtastic.org + +--- + diff --git a/docs/zh-rCN/user/node-metrics.md b/docs/zh-rCN/user/node-metrics.md new file mode 100644 index 000000000..52b98ce5d --- /dev/null +++ b/docs/zh-rCN/user/node-metrics.md @@ -0,0 +1,130 @@ +--- +title: Node Metrics +nav_order: 5 +last_updated: 2026-05-13 +description: Telemetry dashboards for each mesh node — device health, environment sensors, signal quality, power, traceroute, and position history. +aliases: + - metrics + - telemetry + - device-metrics + - signal +--- + +# Node Metrics + +The node detail screen provides comprehensive telemetry and metrics for each node on your mesh. + +## 设备数据 + +Basic operating information reported by each node: + +| 公制 | 说明 | +| ------ | ----------------------------------- | +| 电池电量 | Current battery percentage | +| 电压 | Battery voltage reading | +| 频道利用率 | Percentage of airtime consumed | +| 广播时间 | Transmission time used by this node | +| 正常运行时间 | Time since last reboot | + +Device metrics are displayed as individual cards with trend sparklines showing battery level, voltage, channel utilization, airtime, and uptime over time. + +> 💡 **Tip:** Tap any metric card to expand it into a full chart with historical data points. Pinch to zoom the time axis. + +## 传感器指标 + +Environmental sensor data (requires compatible hardware): + +| 公制 | Sensor Examples | +| ------------------------------------ | --------------------- | +| 温度 | BME280, BME680, SHT31 | +| 湿度 | BME280, BME680, SHT31 | +| 气压 | BME280, BMP280 | +| 气体电阻性 | BME680 | +| IAQ (Air Quality) | BME680 | + +Environment metrics are charted over time for easy trend analysis — temperature, humidity, and pressure each get their own line chart with the measurement unit displayed on the Y axis. + +> 💡 **Tip:** Environment metrics require a sensor connected to the remote node. Not all nodes report environmental data. See [Telemetry & Sensors](telemetry-and-sensors) for a full list of supported sensors. + +## 信号强度 + +Radio signal quality information: + +| 公制 | 说明 | +| --------- | ----------------------------------------------------------------------------- | +| SNR | Signal-to-Noise Ratio (higher is better) | +| RSSI | Received Signal Strength Indicator (closer to 0 is better) | +| Hop Count | Number of mesh hops for last message | + +### Signal Quality Reference + +| SNR Range | Quality | +| --------------------------------- | --------- | +| > 10 dB | Excellent | +| 0 to 10 dB | 良好 | +| -10 to 0 dB | 一般 | +| < -10 dB | Poor | + +## 电源计量 + +Power management telemetry (requires INA sensor or compatible hardware): + +| 公制 | 说明 | +| ----------- | ----------------------- | +| Bus Voltage | Supply voltage | +| 电流 | Power draw in milliamps | +| 电源 | Calculated wattage | + +## 追踪器 + +Traceroute shows the path a message takes through the mesh: + +1. From the node detail screen, tap **Traceroute**. +2. The app sends a traceroute request to the target node. +3. Results show each hop with SNR/RSSI values. + +### Reading Traceroute Results + +``` +You → Node A (SNR: 8.5) → Node B (SNR: 5.2) → Target +``` + +Each hop represents a relay node that forwarded the message. + +## 定位日志 + +Historical position data for nodes that share their location: + +- GPS coordinates +- 海拔高度 +- Speed (if moving) +- Timestamp for each position report + +## 邻居信息 + +Shows which nodes a given node can directly hear, useful for understanding mesh topology. + +## Viewing Metrics + +1. Navigate to **Nodes**. +2. Tap the node you want to inspect. +3. Select the metric category from the detail tabs. + +![Node detail — local device](/assets/screenshots/nodes_detail_local.png) + +The position tab shows location data for nodes that share GPS: + +![Position inline content](/assets/screenshots/nodes_position.png) + +> ⚠️ **Note:** Metrics are only available when they have been reported by the remote node. Metrics update at intervals configured on each node's telemetry settings. + +## Related Topics + +- [Nodes](nodes) — node list, filtering, and sorting +- [Telemetry & Sensors](telemetry-and-sensors) — supported sensors and configuration +- [Signal Meter](signal-meter) — how signal quality is calculated from SNR and RSSI +- [Discovery](discovery) — traceroute details and neighbor info +- [Units & Locale](units-and-locale) — temperature, distance, and speed display formats + +--- + diff --git a/docs/zh-rCN/user/nodes.md b/docs/zh-rCN/user/nodes.md new file mode 100644 index 000000000..5fd9cfa50 --- /dev/null +++ b/docs/zh-rCN/user/nodes.md @@ -0,0 +1,152 @@ +--- +title: 节点 +nav_order: 4 +last_updated: 2026-05-13 +description: Browse, filter, and sort mesh nodes — view details, signal quality, roles, and quick actions. +aliases: + - node-list + - mesh-nodes + - peers +--- + +# 节点 + +The Nodes screen displays all devices visible on your mesh network. + +## Node List + +The node list shows every node your radio has heard, including: + +- **Node name** — user-configured long name +- **Short name** — 4-character identifier +- **Signal quality** — last heard signal strength +- **Last heard** — time since last communication +- **Distance** — estimated distance (if positions are shared) +- **Battery** — remote node battery level (if telemetry is enabled) + +### Node Status Indicators + +| Badge | Meaning | +| ---------- | ------------------------------------- | +| 🟢 Online | Node heard within the last 15 minutes | +| 🟡 Away | Node heard within the last 2 hours | +| 🔴 Offline | Node not heard for over 2 hours | +| ⭐ Favorite | Node marked as favorite by the user | + +### Node Roles + +Nodes can be configured with different roles that affect their mesh behavior: + +| 角色 | 说明 | +| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | +| 客户端 | Standard end-user device | +| 客户群 | Treats favorited-node traffic as Router Late priority; all other traffic as Client | +| 客户端静默 | Receives but doesn't retransmit | +| 客户端隐藏 | Like Client Mute, plus hides from node list | +| 路由 | Prioritizes message forwarding; stays awake to relay | +| 延迟时间 | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | +| ~~Router Client~~ | ⚠️ **Deprecated** (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | +| ~~Repeater~~ | ⚠️ **Deprecated** (removed in firmware 2.7.11) — no longer selectable; use Router instead | +| 追踪器 | Optimized for position reporting at regular intervals | +| 传感器 | Optimized for telemetry reporting | +| TAK | Interoperates with TAK systems (sends/receives CoT) | +| TAK 追踪器 | TAK position reporting only | +| Lost & Found | Continuous position beacon for recovery | + +### Choosing a Role + +Most users should keep the default **Client** role. Consider a different role when: + +- **Router** — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don't use Router on battery-powered handheld devices. +- **Router Late** — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. +- **Client Base** — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. +- **Client Mute** — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only devices or to reduce congestion in dense areas. +- **Tracker** — An unattended device whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. +- **Sensor** — An unattended device reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. +- **TAK / TAK Tracker** — Only needed if interoperating with ATAK/WinTAK systems. See [TAK Integration](tak) for details. + +> 💡 **Tip:** The mesh works best when most nodes are **Client** or **Router**. Too many Mute nodes reduces mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. + +### Encryption Indicators + +Nodes display encryption status icons next to their name: + +| 图标 | Meaning | +| ----------- | ------------------------------------------------------------------------------------------------------------------- | +| 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | +| 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | +| ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) | + +> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. + +## Quick Actions + +From the node list, you can: + +- **Tap** a node to view its detail page +- **Long-press** for quick actions: + - Send a direct message + - 查看地图 + - 请求位置 + - Mark as favorite + - 追踪器 + +## Filtering & Sorting + +### Text Search + +Type in the search field to filter nodes by name or short name. The filter updates in real time as you type. + +### Filter Toggles + +| 搜索节点 | 说明 | +| -------------------------- | ---------------------------------------------------------------------------------------------- | +| **Only online** | Show only nodes heard within the last 15 minutes | +| **Only direct** | Show only nodes with direct (non-relayed) connections | +| **Include unknown** | Show nodes that haven't sent user info yet | +| **Exclude infrastructure** | Hide infrastructure-role nodes (Router, Repeater, Router Late, Client Base) | +| **Exclude MQTT** | Hide nodes heard only via MQTT internet bridge | +| **Show ignored** | Show nodes you've previously dismissed or muted | + +### Sort Options + +| Sort | 说明 | +| ------------------------------------------- | ------------------------------------------------------------------ | +| **Last heard** (default) | Most recently heard nodes first | +| **Alphabetical** | Sorted by node long name | +| **Distance** | Nearest nodes first (requires position sharing) | +| **Hops away** | Fewest relay hops first | +| **Channel** | Grouped by channel index | +| **Via MQTT** | Grouped by MQTT vs. radio-heard | +| **Favorites** | Favorited nodes first | + +## Node Detail + +Tapping a node opens the detail view with comprehensive information. See [Node Metrics](node-metrics) for full details on metrics and telemetry. + +![Node detail view](/assets/screenshots/nodes_node_list.png) + +The detail screen includes device info, position, and action buttons: + +![Node detail section](/assets/screenshots/nodes_detail_section.png) + +Inline status indicators show key metrics at a glance: + +| Indicator | Screenshot | +| -------------- | -------------------------------------------------------- | +| Signal quality | ![Signal](/assets/screenshots/nodes_signal_info.png) | +| 电池电量 | ![Battery](/assets/screenshots/nodes_battery_info.png) | +| Hop count | ![Hops](/assets/screenshots/nodes_hops_info.png) | +| 最后听到 | ![Last heard](/assets/screenshots/nodes_last_heard.png) | +| 距离 | ![Distance](/assets/screenshots/nodes_distance_info.png) | + +## Related Topics + +- [Node Metrics](node-metrics) — detailed telemetry dashboards for each node +- [Messages & Channels](messages-and-channels) — send a direct message to a node +- [Map & Waypoints](map-and-waypoints) — view node positions geographically +- [Discovery](discovery) — traceroute and neighbor info for topology exploration +- [Signal Meter](signal-meter) — understand what the signal bars mean + +--- + diff --git a/docs/zh-rCN/user/onboarding.md b/docs/zh-rCN/user/onboarding.md new file mode 100644 index 000000000..3b910534e --- /dev/null +++ b/docs/zh-rCN/user/onboarding.md @@ -0,0 +1,99 @@ +--- +title: Getting Started +nav_order: 1 +last_updated: 2026-05-13 +description: First-launch setup — permissions, onboarding flow, and next steps after connecting your radio. +aliases: + - first-launch + - setup + - intro +--- + +# Getting Started + +Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app. + +## First Launch + +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. + +### Welcome Screen + +The welcome screen introduces Meshtastic and its core capabilities: + +- Off-grid mesh communication +- No cellular or internet required +- End-to-end encrypted messaging + +Tap **Get Started** to proceed through the setup flow. + +![Welcome screen](/assets/screenshots/onboarding_welcome.png) + +## Permissions + +The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. + +### Bluetooth Permission + +Bluetooth is the primary connection method between your phone and Meshtastic radio: + +- **Bluetooth scanning** — discover nearby Meshtastic radios +- **Bluetooth connect** — establish and maintain connections with paired radios + +Grant both permissions when prompted. Without Bluetooth, you'll need to use USB or TCP connections instead. + +### Location Permission + +> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. + +Meshtastic also uses your location for: + +- Showing your position on the mesh map +- Calculating distances to other nodes +- Sharing your GPS coordinates with other mesh members (if enabled) + +Grant **"While using the app"** or **"Always"** depending on your preference: + +- **While using the app** — position updates only when the app is open +- **Always** — enables background position updates for always-on mesh presence + +If denied, Bluetooth scanning will not function and your node will not report a position. + +### Notifications Permission + +Notifications alert you to: + +- Incoming messages from channels and direct messages +- Connection status changes (connected, disconnected, reconnecting) +- Firmware update availability + +> 💡 **Tip:** You can fine-tune notification preferences later in Android system settings. The app creates separate notification channels for messages, connection events, and background service status. + +### Critical Alerts Permission + +On supported devices, the app may request permission for critical alerts: + +- These are high-priority notifications that can break through Do Not Disturb mode +- Useful for emergency mesh alerts or urgent messages +- You can **skip** this step if you don't need breakthrough notifications +- Configure or revoke later in Android notification settings + +## After Setup + +Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. + +> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. + +## What's Next? + +Once connected to a radio, explore: + +- [Connections](connections) — pair your first radio device +- [Messages & Channels](messages-and-channels) — send your first message +- [Nodes](nodes) — see who's on your mesh +- [Map & Waypoints](map-and-waypoints) — view node positions +- [Settings](settings-radio-user) — configure your radio and user profile + +New to Meshtastic? The [getting started guide](https://meshtastic.org/docs/getting-started) on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup. + +--- diff --git a/docs/zh-rCN/user/settings-module-admin.md b/docs/zh-rCN/user/settings-module-admin.md new file mode 100644 index 000000000..22034190e --- /dev/null +++ b/docs/zh-rCN/user/settings-module-admin.md @@ -0,0 +1,246 @@ +--- +title: Settings — Modules & Admin +nav_order: 8 +last_updated: 2026-05-13 +description: Configure optional feature modules (MQTT, telemetry, canned messages, TAK, and more) and perform device administration. +aliases: + - modules + - module-config + - administration +--- + +# Settings — Modules & Admin + +Configure optional feature modules and perform device administration. Modules extend Meshtastic with specialized capabilities — each can be independently enabled or disabled. + +> 💡 **Tip:** You only need to enable the modules you actually use. Disabling unused modules reduces airtime, saves battery, and simplifies your configuration. + +Module settings use a card-based layout with toggle switches, dropdowns, text fields, and sliders: + +![Toggle switch](/assets/screenshots/settings_switch.png) + +![Dropdown selector](/assets/screenshots/settings_dropdown.png) + +![Text field](/assets/screenshots/settings_text_field.png) + +![Settings card layout](/assets/screenshots/settings_titled_card.png) + +## 模块配置 + +### MQTT Module + +Bridges mesh messages to and from an MQTT broker for internet connectivity. This is how you extend your mesh beyond radio range or integrate with home automation systems. + +| Setting | 说明 | +| --------------- | ------------------------------------------------------------------------ | +| Enabled | Toggle MQTT bridge | +| 服务器 | MQTT broker address | +| 用户名称 | Authentication username | +| 密码 | Authentication password | +| 加密 | Encrypt MQTT payloads | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON support removed from firmware; field is ignored | +| TLS | Use secure connection | +| Root Topic | Base MQTT topic path | +| 地图报告 | Publish position for public map | + +See [MQTT](mqtt) for a detailed usage guide including encryption, privacy, and broker setup. + +### Serial Module + +Enables serial port communication for external device integrations (GPS modules, sensors, or custom hardware). When enabled, the node's serial port can send and receive protobuf or text data, allowing external microcontrollers or computers to interact with the mesh. + +| Setting | 说明 | +| ---------- | ------------------------------- | +| Enabled | Activate serial communication | +| 回声 | Echo received serial data back | +| 模式 | Text, Protobuf, or NMEA output | +| RX/TX Pins | GPIO pins for serial connection | +| 波特率 | Serial communication speed | + +### External Notification Module + +Controls buzzer, LED, or vibration alerts on your radio hardware. Useful for devices that need to physically signal when a message arrives — particularly helpful for unattended or outdoor installations. + +| Setting | 说明 | +| -------------------------------- | --------------------------- | +| Enabled | Activate notifications | +| 提醒消息 | Notify on incoming messages | +| 警告消息蜂鸣 | Use buzzer for messages | +| Alert Message Vibra | Use vibration for messages | +| 提醒铃声 | Notify on bell character | +| Output (GPIO) | Pin for notification output | +| 启用 | High or Low active | +| Duration (ms) | Notification length | +| Use I2S as Buzzer | Use I2S audio output | + +### Store & Forward Module + +Buffers messages for nodes that were temporarily offline, then replays them when those nodes reconnect. Essential for meshes where nodes go in and out of range regularly — ensures messages aren't lost during brief disconnections. + +| Setting | 说明 | +| ------------------------------------------ | -------------------------- | +| Enabled | Activate store and forward | +| Heartbeat (s) | Announcement interval | +| Records | Maximum stored messages | +| History Return (max) | Max messages to replay | +| History Return (window) | Time window for replay | + +> 💡 **Tip:** Store and Forward works best on nodes with ample memory (ESP32 with PSRAM). Router nodes are ideal candidates since they're typically always-on. + +### Range Test Module + +Automated range testing tool for evaluating link quality between nodes. When enabled, the node periodically transmits test messages with incrementing counters. A receiver node logs these messages, allowing you to walk or drive away and later analyze at what distance messages stopped arriving. + +| Setting | 说明 | +| -------------------------------------- | --------------------------------- | +| Enabled | Activate range testing | +| Sender Interval (s) | Time between test transmissions | +| Save CSV | Log received test data to SD card | + +### Telemetry Module + +Controls what telemetry data your node shares with the mesh. Telemetry includes device health (battery, uptime) and environmental sensor data (temperature, humidity, pressure). + +| Setting | 说明 | +| ---------------------------- | --------------------------------------- | +| Device Metrics Interval | How often to report device metrics | +| Environment Metrics Interval | How often to report environment sensors | +| 启用空气质量检测 | Report particulate sensor data | +| Power Metrics Enabled | Report power usage | + +See [Telemetry & Sensors](telemetry-and-sensors) for supported sensors and configuration recommendations. + +### Canned Message Module + +Pre-configured messages accessible from the device's physical buttons (for radios with rotary encoders, keypads, or similar input hardware). Define a list of quick-send messages that can be transmitted without a phone connected — ideal for field use. + +| Setting | 说明 | +| ------------------ | ----------------------------------------------------------- | +| ~~Enabled~~ | ⚠️ **Deprecated** — current firmware may ignore this toggle | +| 消息 | Newline-separated list of messages | +| 发送铃声 | Play bell sound on send | +| Rotary Encoder | Enable rotary encoder input | +| Up/Down/Press Pins | GPIO pin assignments for input | + +### Audio Module + +Codec2 audio support for low-bandwidth voice communication over the mesh. This is an **experimental** feature that encodes voice into very small data packets using the Codec2 codec. + +| Setting | 说明 | +| --------------- | -------------------------------- | +| Enabled | Activate audio module | +| Codec2 Rate | Audio quality/bandwidth tradeoff | +| I2S Word Select | GPIO pin for I2S WS | +| I2S Data In | GPIO pin for I2S DIN | +| I2S Data Out | GPIO pin for I2S DOUT | + +> ⚠️ **Note:** Audio requires specific hardware (I2S microphone and speaker). Voice quality is very low-bandwidth — think "understandable radio voice," not phone-call quality. + +### Remote Hardware Module + +GPIO control over the mesh network. Allows a remote node to read or write GPIO pins on another node — useful for activating relays, reading switches, or controlling external hardware from a distance. + +| Setting | 说明 | +| -------------------- | --------------------------------------------------------------- | +| Enabled | Activate remote GPIO access | +| Allow Undefined Pins | Allow access to any GPIO pin (security risk) | + +> ⚠️ **Warning:** Enabling "Allow Undefined Pins" gives remote nodes access to all GPIO pins, which could interfere with the radio's own hardware. Only enable on dedicated GPIO nodes. + +### Neighbor Info Module + +Broadcasts information about directly heard neighbors, enabling mesh topology mapping. Each enabled node periodically shares a list of the other nodes it can hear and their signal quality. + +| Setting | 说明 | +| -------------------------------------- | ------------------------------------ | +| Enabled | Activate neighbor broadcasting | +| Update Interval (s) | How often to broadcast neighbor list | + +See [Discovery](discovery) for how to use neighbor data for mesh topology exploration. + +### Ambient Lighting Module + +Controls onboard NeoPixel or other addressable RGB LEDs on supported hardware. Can be used for visual status indicators, notification lights, or decorative effects. + +| Setting | 说明 | +| ------------------ | ---------------------------------------------------------- | +| Enabled | Activate LED control | +| LED 状态 | On, Off, or set specific color | +| Red / Green / Blue | Individual color channel values (0–255) | + +### Detection Sensor Module + +Turns your node into a motion or door sensor alert system. When a GPIO pin detects a state change (motion detected, door opened), the node broadcasts an alert message over the mesh. + +| Setting | 说明 | +| ---------------------------------------- | ----------------------------------------------------------------------- | +| Enabled | Activate detection sensor | +| 监视器 | GPIO pin connected to sensor | +| Detection Triggered High | Trigger when pin goes high (vs. low) | +| Minimum Broadcast (s) | Minimum time between alert broadcasts | +| State Broadcast (s) | Periodic state broadcast interval | +| 发送铃声 | Include bell character in alerts | +| 友好名称 | Custom name for this sensor | + +### Paxcounter Module + +People counter using WiFi and BLE probe requests. Counts nearby devices by passively listening for probe requests that phones and laptops emit when scanning for networks. Available only on ESP32 devices. + +| Setting | 说明 | +| -------------------------------------- | -------------------------- | +| Enabled | Activate people counting | +| Update Interval (s) | How often to report counts | + +> 💡 **Tip:** Paxcounter is useful for estimating foot traffic at trailheads, event venues, or other locations. Counts are approximate — one person may carry multiple devices. + +### TAK Module + +Team Awareness Kit integration for interoperability with ATAK and WinTAK. See [TAK Integration](tak) for detailed setup and usage. + +## 管理员 + +### 远程管理 + +Remotely configure nodes that share your admin key: + +1. Select the target node in the node list. +2. Navigate to **Settings** for that node. +3. Modify configuration. +4. Tap **Save** — changes are sent over the mesh. + +> ⚠️ **Requires:** Admin key configured on both your node and the target node. + +### 清理节点数据库 + +Removes stale nodes from your local database that haven't been heard in a configurable time window. + +### Factory Reset + +Resets all settings to factory defaults. **This cannot be undone.** + +### 重启 + +Remotely reboot a connected or administered node. + +### 调试面板 + +View detailed diagnostic information: + +- Protocol buffers debug output +- Mesh packet log +- Connection state details + +### Troubleshooting Remote Admin + +- **"No response from target node"** — the target may be out of range, offline, or have a mismatched admin key. Verify the admin key matches on both nodes. +- **Changes not applying** — some settings require a reboot to take effect. Try the Reboot action after saving. +- **Can't see remote settings** — ensure your node has the admin key for the target node and that Admin Channel is enabled in Security Config. + +## Related Topics + +- [Settings — Radio & User](settings-radio-user) — core radio and user profile settings +- [Module configuration reference](https://meshtastic.org/docs/configuration/module) — detailed module docs on meshtastic.org +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/zh-rCN/user/settings-radio-user.md b/docs/zh-rCN/user/settings-radio-user.md new file mode 100644 index 000000000..0bb0e5e9d --- /dev/null +++ b/docs/zh-rCN/user/settings-radio-user.md @@ -0,0 +1,173 @@ +--- +title: Settings — Radio & User +nav_order: 7 +last_updated: 2026-05-13 +description: Configure your radio hardware, LoRa presets, user profile, position sharing, power management, and security. +aliases: + - 设置 + - radio-config + - user-config + - lora +--- + +# Settings — Radio & User + +Configure your radio hardware and user identity parameters. + +## 用户设置 + +### User Profile + +| Setting | 说明 | +| ------- | ------------------------------------------------------------------------------------- | +| 长名称 | Your display name (up to 39 characters) | +| 短名称 | 4-character abbreviated name | +| 持证操作员 | Enable if you hold an amateur radio license (enables higher power) | + +### Applying Changes + +After modifying settings, tap **Save** to write the configuration to your radio. The device may reboot to apply changes. + +## 电台配置 + +### 设备配置 + +| Setting | 说明 | 默认 | +| ------------------------------------------ | ----------------------------------------------------------------------- | ----- | +| 角色 | Node behavior (Client, Router, etc.) | 客户端 | +| 转播模式 | How the node retransmits messages | 全部 | +| Node Info Broadcast (s) | Interval for broadcasting node info | 10800 | +| Double-tap Button | Action for double-tap button press | 禁用 | + +### LoRa 配置 + +| Setting | 说明 | 默认 | +| --------------------------- | ----------------------------------------------------------------------- | ----------------------------------------- | +| 区域 | Regulatory region for frequency bands | Unset (must configure) | +| 调制解调器预设 | Speed/range tradeoff | LongFast | +| 跳跃数限制 | Maximum retransmit hops | 3 | +| TX Power | Transmission power (dBm); 0 = max allowed for region | 0 (region max) | +| 频率偏移(MHz | Fine-tune frequency (MHz) | 0 | +| Channel Bandwidth | Bandwidth setting | Default for preset | + +> ⚠️ **Important:** You **must** set your region before transmitting. Operating without the correct region may violate local radio regulations. See the [region configuration guide](https://meshtastic.org/docs/getting-started/initial-config) on meshtastic.org for details. + +### Modem Presets + +| Preset | Range | 速度 | SNR Limit | Best For | +| ------------------ | ----------------------- | ------------------------- | ------------------------ | -------------------------------------------------------------------------------------------------------- | +| Short Turbo | ~1 km | 21.9 kbps | −5 dB | Dense urban with line-of-sight; data-heavy applications | +| Short Fast | ~3 km | 10.9 kbps | −7.5 dB | Urban neighborhoods; buildings within a few blocks | +| Short Slow | ~5 km | 5.5 kbps | −10 dB | Suburban short-range; moderate building density | +| Medium Fast | ~5 km | 5.5 kbps | −10 dB | Suburban areas; moderate building density | +| Medium Slow | ~8 km | 1.1 kbps | −12.5 dB | Suburban/rural; moderate range with slower speed | +| Long Turbo | ~10 km | 4.4 kbps | −10 dB | Similar range to Long Fast but with 500 kHz bandwidth; faster throughput | +| Long Fast | ~10 km | 1.1 kbps | −12.5 dB | **General use (default)** — balanced range and speed | +| Long Moderate | ~20 km | 0.34 kbps | −15 dB | Rural with some terrain; occasional use | +| Lite Fast | ~5 km | 5.5 kbps | −10 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Medium Fast | +| Lite Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Long Fast | +| Narrow Fast | ~5 km | 2.7 kbps | −10 dB | EU 868 MHz band (62.5 kHz BW); avoids interference with other devices | +| Narrow Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 868 MHz band (62.5 kHz BW); comparable to Long Fast | +| ~~Long Slow~~ | ~30 km | 0.18 kbps | −17.5 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | +| ~~Very Long Slow~~ | ~40+ km | 0.09 kbps | −20 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | + +#### Choosing a Modem Preset + +The modem preset controls the fundamental tradeoff between **range** and **data rate**: + +- **Slower presets** use more spreading, making signals decodable at weaker signal levels (lower SNR limit). This means longer range but fewer bytes per second. +- **Faster presets** pack more data per transmission but require a stronger signal to decode. + +**Practical guidance:** + +- **Urban mesh (many nodes, short distances):** Use **Long Fast** (default) or **Short Fast**. Higher speed means less airtime congestion when many nodes share the channel. +- **Rural/sparse mesh (few nodes, long distances):** Use **Long Moderate**. Range matters more than speed when nodes are far apart. +- **EU 866/868 MHz regulatory compliance:** Use **Lite Fast**, **Lite Slow**, **Narrow Fast**, or **Narrow Slow** — these are optimized for the EU SRD/868 MHz bands with narrower bandwidths. +- **Fixed infrastructure links:** Use **Short Turbo** or **Long Turbo** for dedicated point-to-point links with good antennas and line-of-sight. +- **Mixed environments:** Stick with **Long Fast** — it's the community default and ensures compatibility with others in your area. + +> ⚠️ **Important:** All nodes on the same channel **must** use the same modem preset. Nodes with mismatched presets cannot communicate even if they share the same frequency and encryption key. + +> 💡 **Tip:** The range estimates above assume flat terrain and modest antennas. Elevation advantage (hilltop, rooftop) dramatically increases effective range. A well-placed Router with Long Fast can often outperform a ground-level node with Long Slow. + +### 屏幕配置 + +| Setting | 说明 | +| ------------------- | ------------------------------------------------------------------------------------ | +| 屏幕超时时间 | Time before display sleeps | +| 显示单位 | Metric or Imperial | +| OLED 类型 | Auto, SSD1306, SH1106, SH1107 | +| Compass Orientation | Rotation offset for compass display (0°, 90°, 180°, 270°) | +| ~~Compass North~~ | ⚠️ **Deprecated** — replaced by Compass Orientation; still visible in older firmware | + +### 定位配置 + +| Setting | 说明 | +| ----------------------------------------- | ---------------------------------- | +| GPS Enabled | Enable/disable GPS | +| GPS更新间隔 | How often to acquire GPS fix | +| Position Broadcast (s) | How often to share position | +| 智能位置 | Enable movement-based broadcasting | +| 固定位置 | Use a manually set position | + +### 电源配置 + +| Setting | 说明 | +| --------------------------------------- | --------------------------------------- | +| 省电模式 | Enable low-power sleep mode | +| Shutdown After (s) | Auto-shutdown idle timer | +| ADC Multiplier | Battery voltage calibration factor | +| Wait Bluetooth (s) | Time to wait for BLE connection at boot | +| Mesh SDS Timeout (s) | Super-deep-sleep timeout | + +### 网络配置 + +| Setting | 说明 | +| ------------- | ---------------------------------------------------- | +| WiFi Enabled | Enable WiFi radio (ESP32 devices) | +| WiFi SSID | Network name to connect to | +| WiFi PSK | 网络密码 | +| NTP 服务器地址 | Time synchronization server | +| Syslog Server | Remote logging server | + +![IP address field](/assets/screenshots/settings_ipv4_field.png) + +### 蓝牙配置 + +| Setting | 说明 | +| ----------------- | ------------------------------------------------------------------------- | +| Bluetooth Enabled | Enable/disable BLE radio | +| 配对模式 | Fixed PIN, Random PIN, or No PIN | +| 固定PIN码 | PIN code for pairing (default: 123456) | + +### 安全配置 + +| Setting | 说明 | +| --------------------- | -------------------------------------------------------------------------- | +| 公钥 | Your node's public key (read-only) | +| 管理员密钥 | Key for remote administration | +| 私钥 | Your node's private key (handle securely) | +| Admin Channel Enabled | Allow admin commands via channel | +| Debug Log | Output live debug logging over serial/bluetooth | +| Serial Enabled | Enable serial console access (moved from Device Config) | +| 管理模式 | Restrict non-admin channel changes | + +![Password field](/assets/screenshots/settings_password_field.png) + +Settings use standard preference controls — dropdowns, toggles, and sliders: + +| Control | Screenshot | +| -------- | ------------------------------------------------------ | +| Dropdown | ![Dropdown](/assets/screenshots/settings_dropdown.png) | +| Toggle | ![Toggle](/assets/screenshots/settings_switch.png) | +| Slider | ![Slider](/assets/screenshots/settings_slider.png) | + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — optional feature modules and device administration +- [Signal Meter](signal-meter) — how modem presets affect signal quality thresholds +- [LoRa configuration](https://meshtastic.org/docs/configuration/radio/lora) — detailed LoRa settings reference on meshtastic.org +- [Initial configuration](https://meshtastic.org/docs/getting-started/initial-config) — region setup guide on meshtastic.org + +--- + diff --git a/docs/zh-rCN/user/signal-meter.md b/docs/zh-rCN/user/signal-meter.md new file mode 100644 index 000000000..af2a09726 --- /dev/null +++ b/docs/zh-rCN/user/signal-meter.md @@ -0,0 +1,81 @@ +--- +title: How the Meshtastic Signal Meter Works +nav_order: 15 +last_updated: 2026-05-13 +description: How the signal meter calculates quality from RSSI and SNR — LoRa spread spectrum, presets, and what the bars really mean. +aliases: + - signal + - signal-meter + - snr + - rssi +--- + +# How the Meshtastic Signal Meter Works + +The Meshtastic signal meter — the familiar bars or status color in the app — is calculated very differently than the "bars" on a traditional cell phone or Wi-Fi router. + +Most consumer devices simply measure how "loud" a signal is. However, because Meshtastic uses **LoRa (Long Range)** technology, its signal meter measures how **clear** the signal is, relative to the specific settings your mesh is using. + +--- + +## 1. The Two Metrics: "Loudness" vs. "Clarity" + +Every time the LoRa radio chip receives a message, it reports two measurements: + +- **RSSI (Received Signal Strength Indicator):** The **loudness** of the raw power hitting your antenna. +- **SNR (Signal-to-Noise Ratio):** The **clarity** of the signal compared to the background static. + +> **Tip — The Analogy:** Imagine you are trying to hear a friend talking to you. +> +> - **RSSI** is how loud their voice is. +> - **The Noise Floor** is the background noise in the room (air conditioning, other people talking, traffic). +> - **SNR** is how easily you can distinguish your friend's voice from the background noise. + +If your friend shouts at you at a deafening rock concert, the signal is incredibly loud (High RSSI), but you still can't understand them because the background noise is louder (Bad SNR). Conversely, if your friend whispers to you in a dead-silent library, the signal is very weak (Low RSSI), but you can understand them perfectly (Great SNR). + +--- + +## 2. The Magic of LoRa: Hearing "Below the Noise Floor" + +For standard radios (like FM or Wi-Fi), if the background noise is louder than the signal (a negative SNR), the receiver just hears static. + +LoRa is special. It uses **"Spread Spectrum"** modulation, which allows the radio to mathematically pull a signal out of the air even when it is buried deep _underneath_ the background noise. This is why you will frequently see **negative SNR numbers** in Meshtastic (e.g., -10 dB, which means the signal is 10 decibels weaker than the background static). + +Depending on which Meshtastic preset you are using (e.g., `LongFast` vs. `ShortFast`), the radio has a specific **SNR Limit** — the absolute maximum amount of noise it can tolerate before the message is completely lost to the static. + +--- + +## 3. How the Signal Meter Calculates Quality + +The Meshtastic apps take both RSSI and SNR and run them through a specific formula to assign your signal a quality rating (None, Bad, Fair, or Good). It specifically scales these values based on the physical limits of the radio preset you are using. + +Here is exactly how the app decides how many bars (or what color) to show you: + +| Level | Bars | Criteria | Meaning | +| ----- | ---- | ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | +| 良好 | 3 | RSSI better than `-115 dBm` **AND** SNR better than `-7 dB` | Signal is both loud and clear — healthy connection. | +| 一般 | 2 | RSSI better than `-126 dBm` with good SNR, **OR** SNR better than `-15 dB` with good RSSI | Signal getting quieter or noisier, but still decodable. | +| 差 | 1 | Falls between Fair and None thresholds | At the edge of range or experiencing interference. | +| 无 | 0 | RSSI worse than `-126 dBm` **AND** SNR worse than `-15 dB` | Transmission completely buried in noise. | + +--- + +## 4. What This Means for You + +Because Meshtastic's meter acts as a **"Clarity Meter"**, it behaves differently than what most people expect: + +> **Tip — Don't panic over low RSSI:** You might see a seemingly terrible RSSI value like `-118 dBm`. On a cell phone, you would have zero bars. But if you have an SNR of `+2 dB`, Meshtastic will still show a strong signal! _The library is quiet, so the whisper is heard perfectly._ + +> **Warning — Watch out for local noise:** If you hook up a massive antenna and see a great RSSI (e.g., `-90 dBm`) but your signal meter is only showing **1 Bar (Bad)**, you have a problem. It means you have local interference — perhaps a cheap power supply, a noisy computer, or a nearby radio tower — creating so much static that it is drowning out your mesh. + +## Where Signal Information Appears + +In the app, signal data is shown in several places: + +- **Node list** — signal bars icon next to each node +- **Node detail** — SNR, RSSI, and signal quality in the device metrics section +- **Traceroute** — per-hop signal quality for each relay node +- **Signal metrics** — historical SNR and RSSI data in the metrics charts + +![Node entry showing SNR, RSSI values and colored signal bars](/assets/screenshots/nodes_signal_info.png) + diff --git a/docs/zh-rCN/user/tak.md b/docs/zh-rCN/user/tak.md new file mode 100644 index 000000000..c5ecfdc49 --- /dev/null +++ b/docs/zh-rCN/user/tak.md @@ -0,0 +1,126 @@ +--- +title: TAK Integration +nav_order: 10 +last_updated: 2026-05-13 +description: Interoperate with ATAK and WinTAK — CoT position sharing, TAK roles, and plugin setup. +aliases: + - tak + - atak + - team-awareness-kit +--- + +# TAK Integration + +Meshtastic integrates with the Team Awareness Kit (TAK) ecosystem, enabling interoperability between Meshtastic mesh devices and TAK applications like ATAK and WinTAK. + +## 总览 + +The TAK module allows Meshtastic nodes to: + +- Share position data in TAK-compatible CoT (Cursor on Target) format +- Appear as team members on TAK map displays +- Receive TAK PLI (Position Location Information) messages + +## Setup + +### 前置条件 + +- ATAK (Android Team Awareness Kit) or WinTAK installed +- Meshtastic ATAK Plugin installed +- TAK module enabled on your Meshtastic radio + +### Configuration + +1. Navigate to **Settings → Module Config → TAK**. +2. Enable the TAK module. +3. Configure the TAK team/group settings: + +![Module toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | 说明 | +| ------- | -------------------------- | +| Enabled | Activate TAK interop | +| 模式 | TAK-compatible output mode | + +### ATAK Plugin Setup + +1. Install the Meshtastic ATAK Plugin from the plugin repository. +2. Open ATAK and enable the Meshtastic plugin. +3. The plugin bridges messages between ATAK and your mesh network. + +## TAK Roles + +Nodes configured with TAK-related roles behave differently from standard clients: + +| 角色 | 说明 | +| --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **TAK** | Full TAK interoperability — sends and receives CoT data, chat messages, and PLI updates. Functions as a standard client plus TAK bridge. | +| **TAK Tracker** | Position-only TAK output — automatically broadcasts PLI at regular intervals without user interaction. Optimized for unattended position beacons (vehicles, equipment, waypoints). Does not relay chat messages. | + +> 💡 **Tip:** Use **TAK Tracker** for devices that only need to report position (e.g., a radio mounted in a vehicle). Use **TAK** for devices where users actively participate in TAK operations. + +### CoT (Cursor on Target) Format + +TAK messages use the Cursor on Target XML format — a military standard for sharing situational awareness data. Meshtastic converts its internal protobuf messages to CoT format when bridging to TAK systems, so no manual format conversion is needed. + +## TAK Identity + +When using TAK roles, your node broadcasts identity information that appears on TAK maps: + +| Setting | 说明 | +| -------- | ---------------------------------------------------------------------------------------------------------------- | +| Team | Your team color on the TAK map (e.g., Blue, Red, Cyan, Green) | +| 角色 | Your operational role (Team Member, Team Lead, HQ, Medic, RTO, etc.) | +| Callsign | Your TAK callsign (defaults to your Meshtastic long name) | + +These settings appear in **Settings → Module Config → TAK** when the TAK module is enabled. + +> 💡 **Tip:** Team/role colors are the standard TAK affiliation colors. Coordinate with your TAK team to use consistent team assignments. + +## Wire Format (V1 / V2) + +Meshtastic supports two TAK wire formats: + +| Format | Compatibility | 特性 | +| ------------------------------- | --------------------------------------------------------------- | --------------------------------------------------------- | +| V1 (Legacy) | ATAK Plugin v1.x, older firmware | Basic CoT position sharing only | +| V2 (Current) | ATAK Plugin v2.x, firmware 2.3+ | Full CoT support including chat, routes, zstd compression | + +The app automatically selects V2 when both sides support it. No manual configuration needed — the TAK module negotiates format based on firmware capabilities. + +## Usage with ATAK + +Once configured: + +- Meshtastic nodes appear as markers on the ATAK map with callsign labels +- Chat messages can bridge between mesh and TAK networks +- Position updates flow bidirectionally between Meshtastic and TAK +- TAK Tracker nodes broadcast PLI automatically — their positions appear on ATAK maps without any ATAK-side configuration + +> ⚠️ **Note:** TAK integration requires specific node roles and module configuration. Standard client nodes don't automatically participate in TAK operations. + +## 问题排查 + +| Problem | Cause | Solution | +| -------------------------------- | ------------------------------------- | ----------------------------------------------------------------------- | +| Node doesn't appear on ATAK map | TAK module disabled or wrong role | Verify TAK module is enabled and node role is TAK or TAK Tracker | +| Position updates are stale | GPS fix lost or interval too long | Check GPS status; reduce position broadcast interval in Position Config | +| ATAK plugin shows "disconnected" | BLE connection lost or plugin crashed | Reconnect Bluetooth in Meshtastic app, then restart ATAK plugin | +| Chat messages not bridging | V1 format doesn't support chat | Ensure both nodes run firmware 2.3+ for V2 wire format | +| CoT data not flowing | Channel mismatch | All TAK nodes must be on the same channel with matching encryption | + +## Security Considerations + +- TAK data shares your position and callsign information +- Ensure your channel encryption is configured when using TAK in sensitive environments +- The TAK module respects the same channel encryption as other Meshtastic messages + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — TAK module configuration +- [Nodes](nodes) — TAK and TAK Tracker roles in the node list +- [Map & Waypoints](map-and-waypoints) — node positions on the map +- [ATAK plugin guide](https://meshtastic.org/docs/software/integrations/atak-plugin) — detailed ATAK setup on meshtastic.org + +--- + diff --git a/docs/zh-rCN/user/telemetry-and-sensors.md b/docs/zh-rCN/user/telemetry-and-sensors.md new file mode 100644 index 000000000..bbd80e8a4 --- /dev/null +++ b/docs/zh-rCN/user/telemetry-and-sensors.md @@ -0,0 +1,118 @@ +--- +title: Telemetry & Sensors +nav_order: 9 +last_updated: 2026-05-13 +description: Sensor data on the mesh — supported environment, air quality, and power sensors, plus configuration and viewing guides. +aliases: + - sensors + - 环境 + - weather + - power-metrics +--- + +# Telemetry & Sensors + +Meshtastic nodes can collect and share sensor data across the mesh network. + +## 总览 + +Telemetry allows nodes equipped with sensors to broadcast environmental, power, and device health information. This data is visible on the node detail screen and can be logged over time. + +## Device Telemetry + +All Meshtastic nodes report basic device telemetry: + +| 公制 | 说明 | Typical Range | +| ------------------ | ------------------------------ | ------------------------------------------------------------------ | +| 电池电量 | Charge percentage | 0–100% | +| 电压 | Battery voltage | 3.0–4.2V (LiPo) | +| 频道利用率 | % of airtime used locally | 0–100% | +| Air Utilization TX | % of airtime used by this node | 0–100% | +| 正常运行时间 | Seconds since last boot | Varies | + +## Environment Sensors + +Supported environmental sensors: + +### Temperature & Humidity + +| 传感器 | 温度 | 湿度 | 气压 | 注 | +| ------- | -- | -- | -- | ----------------------- | +| BME280 | ✓ | ✓ | ✓ | Recommended all-in-one | +| BME680 | ✓ | ✓ | ✓ | Adds gas resistance/IAQ | +| SHT31 | ✓ | ✓ | — | High accuracy | +| MCP9808 | ✓ | — | — | Precision temperature | +| LPS22 | — | — | ✓ | Pressure only | + +### Air Quality + +| 传感器 | 公制 | 注 | +| -------- | -------------------------------------------------- | -------------------------- | +| BME680 | Gas Resistance / IAQ | Volatile organic compounds | +| PMSA003I | PM1.0, PM2.5, PM10 | Particulate matter | +| SEN55 | PM, NOx, VOC, Temp, Humidity | Multi-sensor | + +### Light & UV + +| 传感器 | 公制 | +| -------- | -------------------------------------- | +| OPT3001 | Ambient light (lux) | +| VEML7700 | Ambient light (lux) | +| LTR390 | UV index | + +## 电源计量 + +Nodes with INA-series power sensors can report: + +| 公制 | 说明 | +| ----------- | ----------------------------------------- | +| Bus Voltage | Supply rail voltage | +| 电流 | Power consumption (mA) | +| 电源 | Calculated power (mW) | + +Useful for monitoring solar charging or battery health on remote nodes. + +## Configuring Telemetry + +1. Navigate to **Settings → Module Config → Telemetry**. +2. Set reporting intervals: + - **Device Metrics Interval** — how often to broadcast device metrics + - **Environment Metrics Interval** — how often to broadcast sensor data +3. Enable specific sensor types as needed. + +### Recommended Intervals + +| Use Case | Device (s) | Environment (s) | +| ------------------------------------------ | ----------------------------- | ---------------------------------- | +| Urban mesh (many nodes) | 3600 | 3600 | +| Rural mesh (few nodes) | 900 | 900 | +| Weather station | 900 | 300 | +| Battery conservation | 7200 | 7200 | + +> ⚠️ **Note:** Shorter intervals increase airtime usage and battery drain across the mesh. + +## Viewing Telemetry + +1. Navigate to **Nodes** and select a node. +2. Telemetry sections show on the detail screen: + - Device Metrics (always available) + - Environment Metrics (if sensors present) + - Power Metrics (if INA sensor present) +3. Historical graphs show trends over time. + +![Telemetry actions](/assets/screenshots/node-metrics_telemetric_actions.png) + +## 问题排查 + +- **No environment data showing?** The remote node needs a physical sensor connected (e.g., BME280 on I2C). Device telemetry (battery, uptime) is always available, but environment metrics require hardware. +- **Stale readings?** Check the reporting interval — very long intervals (7200s+) mean data updates infrequently. Also verify the remote node is still online. +- **Sensor conflict on I2C bus?** Some sensors share I2C addresses. If you have multiple sensors on the same bus, check for address collisions in the radio's serial debug output. + +## Related Topics + +- [Node Metrics](node-metrics) — view telemetry data on the node detail screen +- [Settings — Modules & Admin](settings-module-admin) — telemetry module configuration +- [Units & Locale](units-and-locale) — temperature and pressure display units + +--- + diff --git a/docs/zh-rCN/user/translate.md b/docs/zh-rCN/user/translate.md new file mode 100644 index 000000000..c80c943b6 --- /dev/null +++ b/docs/zh-rCN/user/translate.md @@ -0,0 +1,97 @@ +--- +title: Translate the App +parent: User Guide +nav_order: 17 +last_updated: 2026-05-13 +aliases: + - translate + - crowdin + - localization +--- + +# Translate the App + +Contributing translations helps make Meshtastic accessible to a wider audience. The app uses [Crowdin](https://crowdin.com/) to manage community translations for both the user interface and in-app documentation. + +--- + +## What Gets Translated + +| Resource | Source Location | 注 | +| ----------------- | ------------------------------------- | ---------------------------------------------------------------------- | +| UI strings | `composeResources/values/strings.xml` | Buttons, labels, messages, and all user-visible text | +| User Guide pages | `docs/user/*.md` | In-app documentation shown in Help & Documentation | +| Fastlane metadata | `fastlane/metadata/android/en-US/` | App Store listing title, description, and changelogs | + +> **Note — Developer Guide pages are English-only.** Code-focused documentation targeting contributors is not translated. + +--- + +## How to Contribute + +1. **Visit the Crowdin project.** Open the [Meshtastic Android Crowdin project](https://crowdin.com/project/meshtastic-android) and sign in or create a free account. +2. **Choose your language.** Select an existing language or request a new one by opening a [GitHub issue](https://github.com/meshtastic/Meshtastic-Android/issues/new). +3. **Translate strings.** Crowdin shows the English source on the left and your translation on the right. Translate each string and save. +4. **Review context.** Many strings include screenshots or context comments — check these to understand where the text appears in the app. +5. **Submit.** Approved translations are automatically merged into the next release. + +> **Tip — Keep translations short.** UI strings often appear in buttons, chips, or narrow columns. If a translation is significantly longer than the English original, consider abbreviating where the meaning stays clear. + +--- + +## Adding a New Language + +If your language is not yet listed on Crowdin: + +1. Open an issue on [GitHub](https://github.com/meshtastic/Meshtastic-Android/issues/new) requesting the new locale. +2. A maintainer will add the language to Crowdin and configure `crowdin.yml`. +3. Once added, you can begin translating immediately. + +--- + +## How Translations Are Organized + +The Android app uses **Compose Multiplatform resources** for all user-visible strings: + +``` +core/resources/src/commonMain/composeResources/ +├── values/ ← English (default) +│ └── strings.xml +├── values-de/ ← German +│ └── strings.xml +├── values-fr/ ← French +│ └── strings.xml +└── ... +``` + +In-app documentation follows a similar pattern under `docs/`: + +``` +docs/ +├── user/ ← English source (default) +│ ├── onboarding.md +│ └── ... +├── fr/user/ ← French translations +│ ├── onboarding.md +│ └── ... +└── ... +``` + +The app automatically selects the correct locale based on your device's **Language & Region** settings. + +--- + +## Translation Guidelines + +- **Do not translate** technical terms like "LoRa", "MQTT", "BLE", "TAK", "SNR", or "RSSI" — these are universal. +- **Keep placeholders intact.** Strings like `%1$s` or `%d` are filled in at runtime. Do not remove or reorder them unless the grammar of your language requires it. +- **Match tone.** The app uses a friendly, direct voice. Avoid overly formal language. +- **Test if possible.** Switch your device language and open the app to see how translations look in context. + +--- + +## Questions? + +If you have questions about a specific string's context or need help getting started, open a discussion on the [Meshtastic GitHub Discussions](https://github.com/meshtastic/Meshtastic-Android/discussions) page. + +Thank you for helping expand the reach of Meshtastic! diff --git a/docs/zh-rCN/user/units-and-locale.md b/docs/zh-rCN/user/units-and-locale.md new file mode 100644 index 000000000..8eca4badd --- /dev/null +++ b/docs/zh-rCN/user/units-and-locale.md @@ -0,0 +1,118 @@ +--- +title: Units, Measurement & Locale +parent: User Guide +nav_order: 16 +last_updated: 2026-05-12 +--- + +# Units, Measurement & Locale + +The Meshtastic app automatically displays temperatures, distances, speeds, and times in the units your device is configured to use — no settings to change inside the app. + +--- + +## How It Works + +Meshtastic radios always transmit data in **metric units** (meters, °C, km/h, hPa, etc.). When the app receives this data, it uses the `MetricFormatter` utility to convert and display values in whatever unit system your device's locale specifies. + +On Android, your measurement preferences are determined by your system **Language & Region** settings. On Desktop (JVM), the app uses the JVM's default `Locale`. + +> **Tip — You never need to toggle units inside the app.** Change your system measurement preferences and every screen in Meshtastic updates automatically — node details, telemetry charts, weather, altitude, and more. + +--- + +## 温度 + +Temperature values from environment sensors are transmitted as **°C** and displayed based on your device's temperature unit preference. + +![Environment metrics with temperature](/assets/screenshots/nodes_environment_metrics.png) + +| Your Setting | You See | +| ------------ | ------- | +| Celsius | 22°C | +| Fahrenheit | 72°F | + +This affects all temperature displays throughout the app: node environment telemetry, soil temperature, dew point, and telemetry chart axes. + +## Distance & Altitude + +Distances between nodes and GPS altitudes are transmitted as **meters** and automatically scaled and converted. + +![Distance info display](/assets/screenshots/nodes_distance_info.png) + +| Your Setting | Small Distance | Large Distance | 海拔高度 | +| -------------------------------- | -------------- | ---------------------- | -------- | +| 公制 | 350 m | 2.5 km | 1,200 m | +| Imperial (US) | 1,148 ft | 1.6 mi | 3,937 ft | + +The app uses natural scaling — short distances stay in meters or feet, while longer distances switch to kilometres or miles automatically. + +### Where these appear + +- **Node list** — distance and bearing to each node +- **Node detail** — altitude, distance from your position +- **Map** — waypoint distances, traceroute hop distances +- **Compass** — distance to selected node + +## 速度 + +GPS ground speed is displayed in your locale's preferred speed unit. + +| Your Setting | You See | +| -------------------------------- | ------- | +| 公制 | 12 km/h | +| Imperial (US) | 7 mph | + +## 风 + +Wind speed and gust data from environment sensors are transmitted as **m/s** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ------- | +| 公制 | 5 m/s | +| Imperial (US) | 11 mph | + +Wind readings appear in the **Node Detail** environment section and the **Environment Telemetry** charts. + +## Rainfall + +Rainfall measurements (1-hour and 24-hour totals) are transmitted as **mm** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ---------------------- | +| 公制 | 12 mm | +| Imperial (US) | 0.5 in | + +## Units That Never Change + +Some units are international standards and are displayed the same way regardless of your locale: + +| Measurement | Unit | Why | +| -------------------------------- | ------------------------------ | ------------------------------------- | +| Barometric pressure | hPa | International meteorological standard | +| Heading / bearing | ° (degrees) | Universal navigation convention | +| 辐射 | μR/hr | Standard dosimetry unit | +| GPS coordinates | decimal degrees | Universal geographic standard | +| Humidity, battery, soil moisture | % | Universal | + +## Date & Time + +All timestamps throughout the app — last heard, message times, telemetry logs, chart axes — follow your device's date and time preferences. + +| Setting | What It Controls | Example | +| ---------------- | ---------------- | ------------------------------------------------ | +| **24-Hour Time** | Clock format | 14:30 vs 2:30 PM | +| **Date Format** | Date ordering | 09/05/2026 vs 05/09/2026 | + +The app also uses **relative time** where it makes sense — for example, "5 min ago" or "2 hours ago" in the node list — which is automatically localised into your device language. + +## Changing Your Measurement System (Android) + +On Android, your measurement system (metric vs imperial) is tied to your region setting: + +1. Open **Android Settings → System → Language & Region** +2. Change your **Region** or **Measurement units** preference +3. Return to Meshtastic — values update immediately + +> **Tip — The app uses `MetricFormatter` from `core:common`.** All measurement formatting is handled by a shared KMP utility that respects your platform's locale. Developers adding new measurement displays should use `MetricFormatter` rather than hard-coding unit conversions. + diff --git a/docs/zh-rTW/index.md b/docs/zh-rTW/index.md new file mode 100644 index 000000000..2c919a7e8 --- /dev/null +++ b/docs/zh-rTW/index.md @@ -0,0 +1,30 @@ +--- +title: Home +layout: default +nav_order: 0 +--- + +# Meshtastic Android App Documentation + +User and developer documentation for the Meshtastic Android, Desktop, and iOS applications powered by KMP (Kotlin Multiplatform). + +Use the sidebar navigation to browse the **User Guide** for app features and the **Developer Guide** for contributing to the project. + +--- + +## Quick Links + +| Guide | 描述說明 | +| --------------------------------------------------------------------- | -------------------------------------------------------------- | +| [Getting Started](user/onboarding) | Connect your first radio and send a message | +| [Messages & Channels](user/messages-and-channels) | Channel broadcasts, direct messages, reactions, and encryption | +| [Nodes](user/nodes) | Understanding the mesh network node list | +| [Signal Meter](user/signal-meter) | How the LoRa signal quality meter works | +| [Units & Locale](user/units-and-locale) | How temperatures, distances, and times adapt to your region | +| [Desktop App](user/desktop) | Linux, macOS, and Windows desktop usage | +| [Architecture](developer/architecture) | App architecture overview for contributors | +| [Contributing](developer/contributing) | Branch naming, PR workflow, and verification commands | + +--- + +> This documentation is served from the same markdown source that powers the in-app **Help & Documentation** browser. diff --git a/docs/zh-rTW/user/connections.md b/docs/zh-rTW/user/connections.md new file mode 100644 index 000000000..7bc4b59ce --- /dev/null +++ b/docs/zh-rTW/user/connections.md @@ -0,0 +1,125 @@ +--- +title: 連線 +nav_order: 2 +last_updated: 2026-05-13 +description: Connect your phone or desktop to a Meshtastic radio via Bluetooth, USB, or TCP/IP. +aliases: + - 藍牙 + - usb + - tcp + - pairing +--- + +# 連線 + +Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node. + +## Bluetooth (BLE) + +Bluetooth Low Energy is the default and most common connection method on Android. + +### Pairing a Device + +1. Ensure your Meshtastic radio is powered on and in pairing mode. +2. Open the app and navigate to **Connections**. +3. Tap **Scan for Devices** — nearby Meshtastic radios will appear. +4. Select your device from the list. +5. Accept the Bluetooth pairing prompt if shown. + +![Device list item](/assets/screenshots/connections_bluetooth_scan.png) + +You can filter devices by transport type using the filter chips at the top: + +![Transport filter chips](/assets/screenshots/connections_transport_filters.png) + +> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. + +### Connection Status + +| Icon | State | 描述說明 | +| ---- | -------------- | ----------------------------- | +| 🟢 | 已連線 | Active radio link established | +| 🟡 | 正在連線 | Handshake in progress | +| 🔴 | 已中斷連線 | No active connection | +| ⚪ | Not configured | 未選擇裝置 | + +When connecting, a status indicator shows the current connection state: + +![Connecting status](/assets/screenshots/connections_connecting.png) + +If no devices are found, the app shows an empty state with instructions: + +![No devices found](/assets/screenshots/connections_empty_state.png) + +### Troubleshooting Bluetooth + +- **Device not found:** Toggle Bluetooth off/on, ensure location is enabled. +- **Connection drops:** Move closer to the radio; check for interference. +- **Pairing rejected:** Forget the device in Android Bluetooth settings and retry. + +## USB Serial + +USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable. + +### 設定 + +1. Connect your radio via USB cable to your device. +2. The app will prompt for USB permission — tap **Allow**. +3. The connection is established automatically. + +> ⚠️ **Note:** USB connections require OTG support on Android devices. + +## TCP/IP (WiFi) + +Some Meshtastic radios support WiFi connectivity, allowing TCP-based connections. + +### 設定 + +1. Connect your radio to a WiFi network via the radio's web interface or settings. +2. In the app, go to **Connections → TCP**. +3. Enter the radio's IP address and port (default: 4403). +4. Tap **Connect**. + +![WiFi scanning for devices](/assets/screenshots/connections_wifi_scanning.png) + +When a device is found, it appears in the connection list: + +![WiFi device found](/assets/screenshots/connections_wifi_device_found.png) + +A successful connection is confirmed with a status indicator: + +![WiFi connection success](/assets/screenshots/connections_wifi_success.png) + +### When to Use TCP + +- Radio is on the same local network +- Testing with a simulated radio +- Environments where Bluetooth has interference issues + +## Reconnection Behavior + +The app reconnects to the **last selected device** on startup. You can manually switch transports from the connections screen at any time. + +To disconnect from a radio, use the disconnect button on the connections screen: + +![Disconnect from radio](/assets/screenshots/connections_disconnect.png) + +## Desktop Connections + +On Desktop (Linux/macOS/Windows), the app supports: + +- **Bluetooth (BLE)** — via the Kable library; works on macOS, Linux, and Windows +- **USB Serial** — primary wired connection method +- **TCP/IP** — for network-connected radios + +See [Desktop App](desktop) for platform-specific details and keyboard shortcuts. + +## Related Topics + +- [Getting Started](onboarding) — first-launch setup and permissions +- [Settings — Radio & User](settings-radio-user) — Bluetooth and network configuration +- [Desktop App](desktop) — desktop-specific connection details +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — full list of compatible radios on meshtastic.org + +--- + diff --git a/docs/zh-rTW/user/desktop.md b/docs/zh-rTW/user/desktop.md new file mode 100644 index 000000000..f68a656a3 --- /dev/null +++ b/docs/zh-rTW/user/desktop.md @@ -0,0 +1,147 @@ +--- +title: Desktop App +nav_order: 14 +last_updated: 2026-05-13 +description: Install and use the Meshtastic Desktop app on Linux, macOS, and Windows — connections, feature parity, and keyboard shortcuts. +aliases: + - desktop + - linux + - macos + - windows + - jvm +--- + +# Desktop App + +The Meshtastic Desktop application provides the same mesh communication features on Linux, macOS, and Windows. + +## 概觀 + +The Desktop app shares its core codebase with the Android app through Kotlin Multiplatform (KMP). Most features work identically across platforms. + +## 安裝 + +### Linux + +- Download the `.deb` or `.AppImage` package from the releases page +- Or build from source using `./gradlew :desktopApp:run` + +### macOS + +- Download the `.dmg` package from releases +- Or build from source + +### Windows + +- Download the `.msi` installer from releases +- Or build from source + +## Connecting Your Radio + +### USB Serial (Primary) + +The most reliable connection method on Desktop: + +1. Connect your Meshtastic radio via USB cable. +2. The app should detect the serial port automatically. +3. If not detected, select the correct serial port from the connections menu. + +### TCP/IP + +For network-connected radios: + +1. Enter the radio's IP address and port (default: 4403). +2. Click **Connect**. + +### Bluetooth (BLE) + +Bluetooth Low Energy is supported on Desktop via the [Kable](https://github.com/JuulLabs/kable) library: + +1. Ensure your system has a Bluetooth adapter. +2. The app scans for nearby Meshtastic radios automatically. +3. Select your device from the connections screen. + +## Feature Parity + +| Feature | Android | Desktop | 備註 | +| ---------------------------------------- | ------- | ------- | -------------------------- | +| Messaging | ✓ | ✓ | Full parity | +| Node List | ✓ | ✓ | Full parity | +| 地圖 | ✓ | ✓ | Full parity | +| 設定 | ✓ | ✓ | Full parity | +| Bluetooth (BLE) | ✓ | ✓ | Via Kable on desktop | +| Firmware Update OTA | ✓ | ✗ | Use web flasher | +| 通知 | ✓ | ✓ | Native OS notifications | +| Widgets | ✓ | ✗ | Android-only | +| AI Assistant (Chirpy) | ✓\* | ✗ | Google flavor Android only | + +\*Chirpy AI requires Android 14+ on Google flavor builds with supported hardware. + +## UI Differences + +The Desktop app uses the same Compose Multiplatform UI with adaptations for larger screens and desktop interaction. + +### Keyboard Shortcuts + +| Shortcut | Action | +| ------------------- | --------------------------- | +| **⌘Q** / **Ctrl+Q** | Quit the application | +| **⌘,** / **Ctrl+,** | Open Settings | +| **⌘1** / **Ctrl+1** | Switch to Conversations tab | +| **⌘2** / **Ctrl+2** | Switch to Nodes tab | +| **⌘3** / **Ctrl+3** | Switch to Map tab | +| **⌘4** / **Ctrl+4** | Switch to Connections tab | + +### Window & System Tray + +- **Window resizing** — responsive layout adapts to window dimensions +- **System tray** — minimize to system tray for background mesh operation +- **Tray menu** — right-click the tray icon to show window or quit +- **Mouse interaction** — hover states and standard desktop navigation + +### Notification Preferences + +The Desktop app provides in-app toggles for controlling which notifications are shown — messages, new nodes, and low battery alerts. Access these from **Settings → Notifications** within the app. + +## Built-in Documentation Browser + +The Desktop app includes a built-in documentation browser for quick access to help content without leaving the application. + +![Docs browser with table of contents](/assets/screenshots/docs-browser_toc.png) + +The browser supports full-text search across all documentation: + +![Searching the docs browser](/assets/screenshots/docs-browser_search.png) + +Individual doc pages render with full formatting: + +![A documentation page](/assets/screenshots/docs-browser_page.png) + +## Building from Source + +```bash +git clone https://github.com/meshtastic/Meshtastic-Android.git +cd Meshtastic-Android +git submodule update --init +./gradlew :desktopApp:run +``` + +需求: + +- JDK 21 +- No Android SDK required for desktop-only builds + +## 已知限制 + +- No OTA firmware updates (use web flasher) +- Some Android-specific features (widgets, specific notification channels) are unavailable +- Performance may vary on low-spec hardware running Compose Desktop +- BLE bonding is not yet supported on desktop (pairing works without bonding) + +## Related Topics + +- [Connections](connections) — connection methods overview +- [Firmware Updates](firmware) — use the [Web Flasher](https://flasher.meshtastic.org) for desktop firmware updates + +--- + diff --git a/docs/zh-rTW/user/discovery.md b/docs/zh-rTW/user/discovery.md new file mode 100644 index 000000000..c0c43d9b4 --- /dev/null +++ b/docs/zh-rTW/user/discovery.md @@ -0,0 +1,114 @@ +--- +title: 尋找 +nav_order: 12 +last_updated: 2026-05-13 +description: Explore your mesh network — traceroute paths, neighbor maps, and node discovery tools. +aliases: + - mesh-discovery + - local-discovery + - network-scan + - traceroute + - 鄰居資訊 +--- + +# 尋找 + +Discovery tools help you understand **how** your mesh network is connected — which nodes can hear each other, what paths messages take, and where bottlenecks or weak links exist. + +> 💡 **Tip:** You don't need a dedicated "discovery mode" to start exploring your mesh. The tools below are available right now from the node list and node detail screens. + +--- + +## 路由追蹤 + +Traceroute reveals the exact path a message takes from your node to any other node on the mesh. It's the single most useful tool for debugging connectivity problems. + +### Running a Traceroute + +1. Navigate to **Nodes** and tap the node you want to trace. +2. On the node detail screen, tap **Traceroute**. +3. The app sends a traceroute request and waits for the response. +4. Results display each hop in order, with signal quality at every step. + +### Reading the Results + +A traceroute result looks like this: + +``` +You → Node A (SNR: 8.5, RSSI: -95) → Node B (SNR: 5.2, RSSI: -108) → Target +``` + +Each hop represents a relay node that forwarded the message. The SNR and RSSI values at each hop tell you about the link quality on that specific segment. + +| What to look for | What it means | +| -------------------------------------------------------------------------- | --------------------------------------------------------------------------- | +| All hops show Good SNR (> 5 dB) | Healthy path — messages flow reliably | +| One hop shows Bad SNR (< 0 dB) | Weak link — this relay segment is fragile | +| Many hops (4+) | Long path — consider repositioning a node to shorten it | +| Different path on retry | Mesh is adapting — multiple routes exist (this is good!) | + +> 💡 **Tip:** Run traceroute several times over a few minutes. If the path changes, your mesh has redundant routes — a sign of a well-connected network. + +### Troubleshooting with Traceroute + +- **"No route found"** — The target node may be offline, out of range, or on a different channel. Check that both nodes share at least one channel with the same encryption key. +- **Traceroute times out** — The path may be too long (exceeds hop limit) or a relay node is congested. Try increasing the hop limit in **Settings → LoRa Config**. +- **Asymmetric paths** — A traceroute from A→B may take a different path than B→A. This is normal — radio propagation is not always symmetric. + +--- + +## 鄰近節點資訊 + +The Neighbor Info module lets each node broadcast a list of the nodes it can **directly hear** (single-hop). When multiple nodes share their neighbor lists, you can piece together a topology map of the entire mesh. + +### Enabling Neighbor Info + +1. Navigate to **Settings → Module Config → Neighbor Info**. +2. Enable the module. +3. Set the broadcast interval (default: 900 seconds / 15 minutes). + +Once enabled, your node periodically broadcasts its neighbor table. Other nodes with Neighbor Info enabled do the same. + +### Viewing Neighbor Data + +- Open any node's detail screen and look for the **Neighbors** section. +- Each neighbor entry shows the node that was directly heard and its signal quality. +- Combine neighbor data from multiple nodes to understand the full mesh topology. + +> ⚠️ **Note:** Neighbor Info increases airtime usage because every enabled node periodically broadcasts its neighbor list. On busy meshes with many nodes, consider longer broadcast intervals (3600 seconds or more) to avoid congestion. + +--- + +## Node List as a Discovery Tool + +The node list itself is a powerful discovery tool when you use its filtering and sorting features effectively. + +### Finding New Nodes + +- Sort by **Last heard** to see the most recently active nodes at the top. +- Enable **Include unknown** to see nodes that have appeared on the mesh but haven't sent user info yet — these are often newly powered-on devices. + +### Assessing Connectivity + +- Sort by **Hops away** to see which nodes are directly reachable (0 hops) versus relayed. +- Sort by **Distance** to find nearby nodes and verify they're reachable. +- Use **Exclude MQTT** to focus on nodes reachable over radio (not via internet bridge). + +### Infrastructure Audit + +- Disable **Exclude infrastructure** to see Router, Repeater, Router Late, and Client Base nodes. +- Check their signal quality and last-heard times to verify your infrastructure nodes are healthy. + +See [Nodes](nodes) for full details on filtering and sorting options. + +--- + +## Tips for Mesh Exploration + +- **Start with traceroute** — it gives you immediate, actionable information about a specific path. +- **Enable Neighbor Info on key nodes** — especially routers and repeaters, to build a picture of the backbone. +- **Check the map** — node positions on the [Map](map-and-waypoints) combined with signal data help you understand why some links are strong and others are weak. +- **Compare signal over time** — use the [Signal Meter](signal-meter) guide to interpret SNR and RSSI values correctly. + +--- + diff --git a/docs/zh-rTW/user/firmware.md b/docs/zh-rTW/user/firmware.md new file mode 100644 index 000000000..e1cdf4838 --- /dev/null +++ b/docs/zh-rTW/user/firmware.md @@ -0,0 +1,114 @@ +--- +title: Firmware Updates +nav_order: 13 +last_updated: 2026-05-13 +description: Update your radio firmware over Bluetooth — OTA process, version channels, pre-flight checks, and recovery. +aliases: + - firmware + - update + - OTA(空中升级) + - flash +--- + +# Firmware Updates + +Keep your Meshtastic radio up to date with the latest firmware for new features, bug fixes, and security improvements. + +## Checking for Updates + +1. Navigate to **Settings → Firmware Update** or tap the firmware notification if shown. +2. The app checks for available firmware versions. +3. Available updates show the version number and changelog summary. + +## Update Methods + +### OTA (Over-The-Air) via Bluetooth + +The most common update method for Android users: + +1. Ensure your radio is connected via Bluetooth. +2. Navigate to the Firmware Update screen. +3. Select the desired firmware version. +4. Tap **Update** to begin the OTA process. +5. Wait for the update to complete — **do not disconnect** during the update. + +![Firmware checking for updates](/assets/screenshots/firmware_checking.png) + +> ⚠️ **Warning:** Interrupting a firmware update can brick your device. Ensure your radio has sufficient battery (>50% recommended) and maintain Bluetooth proximity during the entire process. + +![Firmware disclaimer](/assets/screenshots/firmware_disclaimer.png) + +### USB Flashing + +For recovery or when OTA is unavailable: + +- Use the [Meshtastic Web Flasher](https://flasher.meshtastic.org) +- Or the [Meshtastic CLI tool](https://meshtastic.org/docs/getting-started/flashing-firmware) on desktop + +## Version Channels + +| 頻道 | 描述說明 | +| --------- | ------------------------------------------- | +| 穩定版 | Recommended for most users; tested releases | +| Alpha 測試版 | Preview releases; may contain bugs | + +## Pre-Update Checklist + +Before updating: + +- [ ] Battery > 50% +- [ ] Stable Bluetooth connection +- [ ] Note your current settings (they may reset on major version changes) +- [ ] Check the release notes for breaking changes + +## Post-Update + +After a successful update: + +- The radio will reboot automatically +- Bluetooth connection will re-establish +- Verify your settings are intact +- Check the firmware version in **Settings → About** + +![Firmware update success](/assets/screenshots/firmware_success.png) + +## 故障排除 + +### Update Stuck + +If the update appears frozen: + +- Wait at least 5 minutes before intervening +- If truly stuck, power-cycle the radio +- Attempt the update again + +![Firmware update error](/assets/screenshots/firmware_error.png) + +### Device Won't Boot After Update + +If your device fails to boot: + +1. Try connecting via USB to a computer +2. Use the web flasher in recovery/DFU mode +3. Flash a known-good firmware version +4. Check the Meshtastic Discord for device-specific recovery steps + +### Compatibility Warnings + +The app may show warnings when: + +- Connected radio firmware is below minimum supported version +- Major version mismatch between app and firmware +- Deprecated features need migration + +> ⚠️ **Important:** Always update the Meshtastic app before or alongside firmware updates to ensure compatibility. + +## Related Topics + +- [Connections](connections) — reconnecting after a firmware update +- [Flashing firmware guide](https://meshtastic.org/docs/getting-started/flashing-firmware) — full firmware flashing walkthrough on meshtastic.org +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — check firmware compatibility by device +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/zh-rTW/user/map-and-waypoints.md b/docs/zh-rTW/user/map-and-waypoints.md new file mode 100644 index 000000000..4fc7eb7f8 --- /dev/null +++ b/docs/zh-rTW/user/map-and-waypoints.md @@ -0,0 +1,116 @@ +--- +title: Map & Waypoints +nav_order: 6 +last_updated: 2026-05-13 +description: View node positions on the map, create and share waypoints, and manage position sharing and privacy. +aliases: + - map + - waypoints + - gps + - location +--- + +# Map & Waypoints + +The Map screen shows the geographic positions of nodes on your mesh, along with shared waypoints. + +## Map View + +The map displays: + +- **Node positions** — colored markers for each node reporting location +- **Waypoints** — shared points of interest +- **Your position** — your current GPS location + +### Node Markers + +Node markers on the map indicate: + +| Color | Meaning | +| ---------- | ---------------------------------------------- | +| Green - 綠色 | Online (heard recently) | +| 黃色 | Away (heard within 2 hours) | +| Gray | Offline (stale position) | +| Blue - 藍色 | 你自己的節點 | + +### 地圖控制項 + +- **Zoom** — pinch or use +/- buttons +- **Pan** — drag to explore +- **Center** — select the location button to center on your position +- **Node tap** — tap a node marker to view details + +The floating toolbar provides quick access to compass, layer switching, node filters, refresh, and location tracking. Tap the compass to reorient north-up, or tap the location button to center on your current position. + +![Map controls overlay](/assets/screenshots/map_controls_overlay.png) + +## Waypoints + +Waypoints are shared geographic points of interest that all mesh members can see. + +### Creating a Waypoint + +1. Long-press on the map at the desired location. +2. Enter a name and optional description. +3. Choose an icon/emoji for the waypoint. +4. Tap **Send** to share with the mesh. + +### Waypoint Properties + +| Property | 描述說明 | +| ---------- | ------------------------------------------------------- | +| 名稱 | Short identifier (max 30 characters) | +| 描述說明 | Optional longer description | +| Icon | Visual marker emoji on the map | +| 鎖定 | If locked, only the creator can edit or delete | +| Expiration | Optional auto-remove time | + +### Waypoint Expiration + +Waypoints can be set to expire automatically: + +- **Never** (default) — waypoint remains until manually deleted +- **Timed** — waypoint is automatically removed after the specified duration (e.g., "remove after 2 hours"). Useful for temporary markers like rally points, hazards, or meeting locations. + +Expired waypoints are automatically hidden from the map so they don't clutter the display. The expiration countdown begins when the waypoint is created, not when other nodes receive it. + +### Managing Waypoints + +- Tap a waypoint on the map to view its details and coordinates +- Edit or delete waypoints you created +- **Locked waypoints** cannot be modified or deleted by other nodes — only the original creator can change them +- Unlocked waypoints can be edited by any mesh member + +## Position Sharing + +### Enabling Position Sharing + +Your node shares its GPS position based on: + +- **Fixed interval** — broadcast position at regular intervals +- **Smart position** — broadcast when movement exceeds a threshold +- **Manual** — only share when explicitly requested + +Configure position behavior in **Settings → Position**. + +### Privacy Considerations + +> 🔒 **Privacy:** Position data is broadcast to all nodes on your channel. If you don't want your location shared, disable GPS position in settings or use a fixed/fake position. + +## Map Sources + +The app supports multiple map tile sources: + +- OpenStreetMap (default) +- Satellite imagery (where available) +- Offline tiles (download map areas for offline use) + +## Related Topics + +- [Nodes](nodes) — view and filter your node list +- [Node Metrics](node-metrics) — signal quality and position history for individual nodes +- [Discovery](discovery) — traceroute and neighbor info for understanding mesh topology +- [Units & Locale](units-and-locale) — distance and coordinate display formats + +--- + diff --git a/docs/zh-rTW/user/messages-and-channels.md b/docs/zh-rTW/user/messages-and-channels.md new file mode 100644 index 000000000..3b26e0732 --- /dev/null +++ b/docs/zh-rTW/user/messages-and-channels.md @@ -0,0 +1,159 @@ +--- +title: Messages & Channels +nav_order: 3 +last_updated: 2026-05-13 +description: Send and receive messages, manage channels, configure encryption, and use quick chat, reactions, and message actions. +aliases: + - 頻道 + - direct-messages + - messaging + - conversations +--- + +# Messages & Channels + +Meshtastic supports two communication modes: **channel broadcasts** and **direct messages**. + +## 頻道 + +Channels are shared communication groups. All nodes configured with the same channel key can read and send messages on that channel. + +### Default Channel + +Every Meshtastic device comes with a default **LongFast** channel. This is an unencrypted channel used for general mesh communication. + +### 頻道安全性 + +Channels support multiple encryption levels: + +| Icon | Security Level | 描述說明 | +| ---- | ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------- | +| 🔒 | PSK (256-bit AES) | Fully encrypted with a strong pre-shared key. Only nodes with the matching key can read messages. | +| 🔐 | PSK (128-bit AES) | Encrypted with a shorter key. Secure for most uses but 256-bit is preferred for sensitive data. | +| 🔓 | Default / Open | Uses the well-known default key. **Any Meshtastic device** on the same preset can read these messages. | +| ⚠️ | Insecure + Position | Open channel that also broadcasts your GPS position. Use with caution in public meshes. | + +> 🔒 **Security Tip:** 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. + +### Adding a Channel + +1. Navigate to **Settings → Channels**. +2. Tap **Add Channel** or scan a QR code. +3. Configure the channel name and encryption key. +4. Share the channel URL/QR code with others who need access. + +Tapping a channel shows its details and sharing options. + +## 私訊 + +Direct messages (DMs) are point-to-point encrypted communications between two specific nodes. + +### Sending a Direct Message + +1. Open the **Messages** tab. +2. Select a node from your contacts list or tap a node in the node list. +3. Type your message and tap **Send**. + +### Message States + +| State | Icon | Meaning | +| --------------------------------- | ---- | ----------------------------------------------------------------------------------------------------------------- | +| Queued | ⏳ | Message waiting to be sent | +| En route | ✓ | Delivered to the radio, awaiting acknowledgment | +| 已送達 | ✓✓ | Acknowledgment received from recipient | +| Received | ✓ | Message received from the mesh (incoming) | +| S&F Routing | 🔗 | Store & Forward: message being routed through an S&F node | +| S&F Confirmed | 🔗 | Store & Forward: delivery confirmed via S&F node | +| 錯誤 | ✗ | Delivery failed after retries | + +### Delivery Errors + +When a message fails to deliver, the error indicator shows what went wrong: + +| 錯誤 | Meaning | What to Do | +| ---------------- | ---------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| No Route | No path exists to the destination node | The recipient may be offline or out of mesh range. Try later or move closer. | +| Got NAK | The next-hop node refused to relay | The relay node may be congested. Wait and retry. | +| Timeout - 超時 | No acknowledgment within retry window | The recipient may be just out of range. Try increasing hop limit or moving to a better position. | +| 無介面 | No radio interface available to send | Check that your radio is connected and the channel is configured. | +| Max Retransmit | All retry attempts exhausted | The mesh path is unreliable. Try a different channel or wait for conditions to improve. | +| 無頻道 | The destination channel doesn't exist | Verify both nodes share the same channel configuration. | +| Too Large | Message exceeds maximum payload size | Shorten your message (max ~230 characters). | +| 無回應 | Node received message but didn't respond | The recipient's radio may be busy or in low-power sleep mode. | +| Duty Cycle Limit | Regional airtime limit reached | Your radio has used its allowed transmit time. Wait for the duty cycle window to reset (typically 1 hour in EU regions). | +| 錯誤請求 | Malformed or invalid message | This usually indicates a software bug. Try restarting the app. | + +> 💡 **Tip:** 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. + +## Message Features + +### Quick Chat + +Pre-configured messages for rapid communication: + +- Access via the Quick Chat button in the message input area +- Choose from built-in phrases or custom messages +- Customize quick chat messages in **Settings → Quick Chat** +- Useful when typing is impractical (gloves, small screen, urgent) + +![Quick chat option](/assets/screenshots/messages_quick_chat.png) + +The channel list shows each channel with its latest message preview. + +### Message Bubbles + +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. + +### Reactions + +React to messages with emoji: + +- **Long-press** a message to open the actions menu +- Tap **Add Reaction** to choose an emoji +- Reactions appear below the message bubble +- Multiple users can react to the same message +- React to your own messages or others' messages + +![Emoji reaction badges displayed beneath a message](/assets/screenshots/messages_reaction.png) + +> 💡 **Tip:** Reactions are lightweight — they use minimal mesh bandwidth compared to full text messages. + +### Message Actions + +Long-press any message to access: + +- **Copy** — copy message text to clipboard +- **Reply** — quote the message in your response +- **React** — add an emoji reaction +- **Delete** — remove a message you sent (local deletion) + +### Message Priority + +Messages are queued and transmitted based on priority: + +1. Emergency/alert messages (highest) +2. Direct messages +3. Channel broadcasts (lowest) + +### Message Limits + +- **Maximum length:** 237 bytes (approximately 230 characters for ASCII text) +- **Rate limiting:** The mesh enforces airtime fairness; heavy message volume may be throttled +- **Delivery:** Messages are retried automatically if no acknowledgment is received + +## 最佳實踐 + +- Use channels for group coordination +- Use direct messages for private person-to-person communication +- Keep messages short — mesh bandwidth is limited +- Configure encryption for sensitive communications + +## Related Topics + +- [Nodes](nodes) — tap a node to start a direct message +- [Settings — Radio & User](settings-radio-user) — configure channel encryption and presets +- [MQTT](mqtt) — bridge channel messages to the internet +- [Channel configuration](https://meshtastic.org/docs/configuration/radio/channels) — detailed channel settings on meshtastic.org + +--- + diff --git a/docs/zh-rTW/user/mqtt.md b/docs/zh-rTW/user/mqtt.md new file mode 100644 index 000000000..9395201ee --- /dev/null +++ b/docs/zh-rTW/user/mqtt.md @@ -0,0 +1,137 @@ +--- +title: MQTT +nav_order: 11 +last_updated: 2026-05-13 +description: Bridge your mesh to the internet — MQTT broker setup, encryption layers, and map reporting. +aliases: + - MQTT + - internet-bridge + - broker +--- + +# MQTT + +MQTT bridges your Meshtastic mesh network to the internet, enabling long-range communication beyond radio range. + +## 概觀 + +The MQTT module connects your node to an MQTT broker, allowing: + +- Messages to reach nodes on different physical meshes via the internet +- Integration with home automation and monitoring systems +- Publishing node positions to the public Meshtastic map +- Custom data pipelines for logging and alerting + +## 運作方式 + +``` +[Your Node] → Radio → [Gateway Node with WiFi] → MQTT Broker → [Remote Gateway] → Radio → [Remote Node] +``` + +A gateway node with internet access (WiFi or Ethernet) publishes mesh messages to an MQTT topic. Remote gateways subscribed to the same topic inject those messages into their local mesh. + +## 設定 + +### 啟用 MQTT + +1. Navigate to **Settings → Module Config → MQTT**. +2. Enable the MQTT module. +3. Configure the broker connection: + +![MQTT toggle switch](/assets/screenshots/settings_switch.png) + +| 設定 | 描述說明 | 默認 | +| --------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------- | +| 伺服器位址 | MQTT broker hostname | mqtt.meshtastic.org | +| 使用者名稱 | Broker authentication | meshdev | +| 密碼 | Broker authentication | large4cats | +| 根主題 | Base topic for messages | msh | +| 加密 | Encrypt MQTT payload | 已啟用 | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON packet support has been removed from firmware; this field is ignored | Disabled | +| TLS | Secure connection to broker | Disabled | +| Map Reporting | Report position to public map | Disabled | + +### Default Meshtastic Broker + +The community maintains a public broker at `mqtt.meshtastic.org`. This is intended for general use and testing. + +> 🔒 **Privacy:** Messages on the public broker are readable by anyone subscribed. Always use channel encryption for private communications. + +### Private Broker + +For better privacy and control, you can run your own MQTT broker: + +- Mosquitto (lightweight, open-source) +- HiveMQ +- EMQX + +Configure your node to point to your private broker with appropriate credentials. + +## Map Reporting + +When Map Reporting is enabled, your node publishes its position to the Meshtastic community map: + +- Visible at [meshmap.net](https://meshmap.net) and similar community map services +- Only position and node info are shared +- Disable this if you don't want your location publicly visible + +## Uplink vs Downlink + +| Direction | 描述說明 | +| ------------ | -------------------------------- | +| **Uplink** | Messages from mesh → MQTT broker | +| **Downlink** | Messages from MQTT broker → mesh | + +Configure per-channel which directions are active to control message flow and airtime usage. + +## Message Formats + +MQTT uses protobuf message format: + +| Format | 描述說明 | Use case | +| ------------ | ----------------------------------- | -------------------------- | +| **Protobuf** | Binary Meshtastic protobuf encoding | Node-to-node mesh bridging | + +> ⚠️ **Note:** JSON output support was removed from firmware. The `json_enabled` setting is still visible in the app for legacy compatibility but has no effect on current firmware versions. + +## Encryption & Privacy + +Understanding the layered encryption model: + +1. **Channel encryption** happens on the mesh _before_ MQTT. If your channel has a PSK, the MQTT payload is already encrypted — the broker and any subscribers see only the ciphertext. +2. **MQTT encryption** (the module setting) adds an additional encryption layer for transit to the broker. This protects metadata and routing information. +3. **TLS** encrypts the TCP connection to the broker itself, preventing network-level eavesdropping. + +> 🔒 **Important:** The default public channel has a well-known key. Messages on the default channel sent via MQTT are effectively **unencrypted** — anyone can decode them. Always use a custom PSK for private communications. + +## 最佳實踐 + +- Use channel-level encryption (PSK) on channels that bridge to MQTT +- Don't enable MQTT on nodes without internet access (it will buffer and waste memory) +- Use a private broker for sensitive deployments +- Be mindful of airtime when downlinking messages from busy MQTT topics — every downlinked message consumes radio airtime on your local mesh +- Consider enabling uplink-only if you only need to monitor your mesh remotely without injecting messages back + +## 故障排除 + +### MQTT Not Connecting + +- **Check WiFi** — the gateway node must have an active internet connection (WiFi or Ethernet). MQTT does not work over the LoRa radio link itself. +- **Verify credentials** — incorrect username or password will silently fail on most brokers. Double-check for trailing spaces. +- **Firewall** — port 1883 (MQTT) or 8883 (MQTT+TLS) must be open. Some networks block non-standard ports. +- **DNS resolution** — if using a custom broker hostname, verify the node can resolve it. Try the broker's IP address directly. + +### Messages Not Bridging + +- **Check uplink/downlink settings** — if only uplink is enabled, messages flow from mesh to MQTT but not back. Enable downlink on the receiving gateway. +- **Channel mismatch** — both gateways must share the same channel with the same PSK. A mismatch means messages are encrypted with different keys and appear as garbage. +- **Topic mismatch** — ensure both gateways use the same root topic. The default `msh` works for the public broker. + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — MQTT module configuration reference +- [Messages & Channels](messages-and-channels) — channel encryption and PSK setup +- [MQTT integration guide](https://meshtastic.org/docs/software/integrations/mqtt) — detailed MQTT documentation on meshtastic.org + +--- + diff --git a/docs/zh-rTW/user/node-metrics.md b/docs/zh-rTW/user/node-metrics.md new file mode 100644 index 000000000..e0c57ca84 --- /dev/null +++ b/docs/zh-rTW/user/node-metrics.md @@ -0,0 +1,130 @@ +--- +title: Node Metrics +nav_order: 5 +last_updated: 2026-05-13 +description: Telemetry dashboards for each mesh node — device health, environment sensors, signal quality, power, traceroute, and position history. +aliases: + - metrics + - 遙測 + - device-metrics + - signal +--- + +# Node Metrics + +The node detail screen provides comprehensive telemetry and metrics for each node on your mesh. + +## 裝置計量資料 + +Basic operating information reported by each node: + +| 公制(公里/公尺) | 描述說明 | +| ------------- | ----------------------------------- | +| Battery Level | Current battery percentage | +| 電壓 | Battery voltage reading | +| 頻道使用量 | Percentage of airtime consumed | +| Airtime | Transmission time used by this node | +| 運行時間 | Time since last reboot | + +Device metrics are displayed as individual cards with trend sparklines showing battery level, voltage, channel utilization, airtime, and uptime over time. + +> 💡 **Tip:** Tap any metric card to expand it into a full chart with historical data points. Pinch to zoom the time axis. + +## 環境計量資料 + +Environmental sensor data (requires compatible hardware): + +| 公制(公里/公尺) | Sensor Examples | +| ------------------------------------ | --------------------- | +| 溫度 | BME280, BME680, SHT31 | +| 濕度 | BME280, BME680, SHT31 | +| 大氣壓力 | BME280, BMP280 | +| 氣體感測器 | BME680 | +| IAQ (Air Quality) | BME680 | + +Environment metrics are charted over time for easy trend analysis — temperature, humidity, and pressure each get their own line chart with the measurement unit displayed on the Y axis. + +> 💡 **Tip:** Environment metrics require a sensor connected to the remote node. Not all nodes report environmental data. See [Telemetry & Sensors](telemetry-and-sensors) for a full list of supported sensors. + +## Signal Metrics + +Radio signal quality information: + +| 公制(公里/公尺) | 描述說明 | +| --------- | ----------------------------------------------------------------------------- | +| SNR | Signal-to-Noise Ratio (higher is better) | +| RSSI | Received Signal Strength Indicator (closer to 0 is better) | +| 跳躍次數 | Number of mesh hops for last message | + +### Signal Quality Reference + +| SNR Range | Quality | +| --------------------------------- | --------- | +| > 10 dB | Excellent | +| 0 to 10 dB | 良好 | +| -10 to 0 dB | 普通 | +| < -10 dB | Poor | + +## 電源計量資料 + +Power management telemetry (requires INA sensor or compatible hardware): + +| 公制(公里/公尺) | 描述說明 | +| ----------- | ----------------------- | +| Bus Voltage | Supply voltage | +| 目前 | Power draw in milliamps | +| 電力 | Calculated wattage | + +## 路由追蹤 + +Traceroute shows the path a message takes through the mesh: + +1. From the node detail screen, tap **Traceroute**. +2. The app sends a traceroute request to the target node. +3. Results show each hop with SNR/RSSI values. + +### Reading Traceroute Results + +``` +You → Node A (SNR: 8.5) → Node B (SNR: 5.2) → Target +``` + +Each hop represents a relay node that forwarded the message. + +## 定位日誌 + +Historical position data for nodes that share their location: + +- GPS coordinates +- 海拔高度 +- Speed (if moving) +- Timestamp for each position report + +## 鄰近節點資訊 + +Shows which nodes a given node can directly hear, useful for understanding mesh topology. + +## Viewing Metrics + +1. Navigate to **Nodes**. +2. Tap the node you want to inspect. +3. Select the metric category from the detail tabs. + +![Node detail — local device](/assets/screenshots/nodes_detail_local.png) + +The position tab shows location data for nodes that share GPS: + +![Position inline content](/assets/screenshots/nodes_position.png) + +> ⚠️ **Note:** Metrics are only available when they have been reported by the remote node. Metrics update at intervals configured on each node's telemetry settings. + +## Related Topics + +- [Nodes](nodes) — node list, filtering, and sorting +- [Telemetry & Sensors](telemetry-and-sensors) — supported sensors and configuration +- [Signal Meter](signal-meter) — how signal quality is calculated from SNR and RSSI +- [Discovery](discovery) — traceroute details and neighbor info +- [Units & Locale](units-and-locale) — temperature, distance, and speed display formats + +--- + diff --git a/docs/zh-rTW/user/nodes.md b/docs/zh-rTW/user/nodes.md new file mode 100644 index 000000000..bc8f095cb --- /dev/null +++ b/docs/zh-rTW/user/nodes.md @@ -0,0 +1,152 @@ +--- +title: 節點 +nav_order: 4 +last_updated: 2026-05-13 +description: Browse, filter, and sort mesh nodes — view details, signal quality, roles, and quick actions. +aliases: + - node-list + - mesh-nodes + - peers +--- + +# 節點 + +The Nodes screen displays all devices visible on your mesh network. + +## Node List + +The node list shows every node your radio has heard, including: + +- **Node name** — user-configured long name +- **Short name** — 4-character identifier +- **Signal quality** — last heard signal strength +- **Last heard** — time since last communication +- **Distance** — estimated distance (if positions are shared) +- **Battery** — remote node battery level (if telemetry is enabled) + +### Node Status Indicators + +| Badge | Meaning | +| ---------- | ------------------------------------- | +| 🟢 Online | Node heard within the last 15 minutes | +| 🟡 Away | Node heard within the last 2 hours | +| 🔴 Offline | Node not heard for over 2 hours | +| ⭐ Favorite | Node marked as favorite by the user | + +### Node Roles + +Nodes can be configured with different roles that affect their mesh behavior: + +| 角色 | 描述說明 | +| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | +| 用戶端 | Standard end-user device | +| 客戶端基礎模式 | Treats favorited-node traffic as Router Late priority; all other traffic as Client | +| Client Mute | Receives but doesn't retransmit | +| Client Hidden | Like Client Mute, plus hides from node list | +| Router | Prioritizes message forwarding; stays awake to relay | +| Router Late | Infrastructure node that rebroadcasts once, but only after all other modes (provides supplemental coverage) | +| ~~Router Client~~ | ⚠️ **Deprecated** (removed in firmware 2.3.15) — no longer selectable; use Router or Client instead | +| ~~Repeater~~ | ⚠️ **Deprecated** (removed in firmware 2.7.11) — no longer selectable; use Router instead | +| Repeater | Optimized for position reporting at regular intervals | +| 感測器 | Optimized for telemetry reporting | +| TAK | Interoperates with TAK systems (sends/receives CoT) | +| TAK Tracker | TAK position reporting only | +| Lost & Found | Continuous position beacon for recovery | + +### Choosing a Role + +Most users should keep the default **Client** role. Consider a different role when: + +- **Router** — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don't use Router on battery-powered handheld devices. +- **Router Late** — An infrastructure node that always rebroadcasts packets once but only after all other routing modes have had their turn. Provides supplemental coverage for local clusters without competing with primary routers. +- **Client Base** — Treats traffic from/to your favorited nodes with Router Late priority (ensuring those messages get extra relay coverage) while handling everything else as a normal Client. +- **Client Mute** — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only devices or to reduce congestion in dense areas. +- **Tracker** — An unattended device whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. +- **Sensor** — An unattended device reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. +- **TAK / TAK Tracker** — Only needed if interoperating with ATAK/WinTAK systems. See [TAK Integration](tak) for details. + +> 💡 **Tip:** The mesh works best when most nodes are **Client** or **Router**. Too many Mute nodes reduces mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. + +### Encryption Indicators + +Nodes display encryption status icons next to their name: + +| Icon | Meaning | +| ----------- | ------------------------------------------------------------------------------------------------------------------- | +| 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | +| 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | +| ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) | + +> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. + +## Quick Actions + +From the node list, you can: + +- **Tap** a node to view its detail page +- **Long-press** for quick actions: + - Send a direct message + - 在地圖上檢視 + - 要求位置 + - Mark as favorite + - 路由追蹤 + +## Filtering & Sorting + +### Text Search + +Type in the search field to filter nodes by name or short name. The filter updates in real time as you type. + +### Filter Toggles + +| 過濾器 | 描述說明 | +| -------------------------- | ---------------------------------------------------------------------------------------------- | +| **Only online** | Show only nodes heard within the last 15 minutes | +| **Only direct** | Show only nodes with direct (non-relayed) connections | +| **Include unknown** | Show nodes that haven't sent user info yet | +| **Exclude infrastructure** | Hide infrastructure-role nodes (Router, Repeater, Router Late, Client Base) | +| **Exclude MQTT** | Hide nodes heard only via MQTT internet bridge | +| **Show ignored** | Show nodes you've previously dismissed or muted | + +### Sort Options + +| Sort | 描述說明 | +| ------------------------------------------- | ------------------------------------------------------------------ | +| **Last heard** (default) | Most recently heard nodes first | +| **Alphabetical** | Sorted by node long name | +| **Distance** | Nearest nodes first (requires position sharing) | +| **Hops away** | Fewest relay hops first | +| **Channel** | Grouped by channel index | +| **Via MQTT** | Grouped by MQTT vs. radio-heard | +| **Favorites** | Favorited nodes first | + +## Node Detail + +Tapping a node opens the detail view with comprehensive information. See [Node Metrics](node-metrics) for full details on metrics and telemetry. + +![Node detail view](/assets/screenshots/nodes_node_list.png) + +The detail screen includes device info, position, and action buttons: + +![Node detail section](/assets/screenshots/nodes_detail_section.png) + +Inline status indicators show key metrics at a glance: + +| Indicator | 螢幕截圖 | +| -------------- | -------------------------------------------------------- | +| Signal quality | ![Signal](/assets/screenshots/nodes_signal_info.png) | +| 電池電量 | ![Battery](/assets/screenshots/nodes_battery_info.png) | +| Hop count | ![Hops](/assets/screenshots/nodes_hops_info.png) | +| 最近一次收到排序 | ![Last heard](/assets/screenshots/nodes_last_heard.png) | +| 距離 | ![Distance](/assets/screenshots/nodes_distance_info.png) | + +## Related Topics + +- [Node Metrics](node-metrics) — detailed telemetry dashboards for each node +- [Messages & Channels](messages-and-channels) — send a direct message to a node +- [Map & Waypoints](map-and-waypoints) — view node positions geographically +- [Discovery](discovery) — traceroute and neighbor info for topology exploration +- [Signal Meter](signal-meter) — understand what the signal bars mean + +--- + diff --git a/docs/zh-rTW/user/onboarding.md b/docs/zh-rTW/user/onboarding.md new file mode 100644 index 000000000..69d93ed9d --- /dev/null +++ b/docs/zh-rTW/user/onboarding.md @@ -0,0 +1,237 @@ +--- +title: 新手入門 +nav_order: |- + 1. **Overview** + + Meshtastic is a project that allows you to use inexpensive LoRa radios as a long range, off-grid, decentralized communication platform. These radios, combined with readily available and very affordable microcontrollers like the ESP32, nRF52, and RP2040, create a network that can be used to send text messages, share locations, and more without relying on cellular or WiFi infrastructure. It's perfect for hiking, camping, or any situation where you need to stay connected beyond the reach of traditional networks. + + 2. **Key Components** + + * **LoRa Radios:** These radios provide the long-range communication capabilities. The RAK Wireless modules are a popular choice. + * **Microcontrollers:** The brains of the operation. ESP32, nRF52, and RP2040 are commonly used due to their low cost and capabilities. + * **GPS (Optional):** For location sharing. Many devices, like the T-Beam, have built-in GPS. + * **Battery (Optional):** For portable use. + * **Enclosure (Optional):** To protect the hardware. + + 3. **Popular Devices** + + * **T-Beam:** A popular board with ESP32, LoRa, and GPS. + * **Heltec WiFi LoRa 32:** Another popular ESP32-based board with LoRa. + * **LilyGo Boards:** LilyGo offers a variety of ESP32 and nRF52 based boards with LoRa. + + 4. **Features** + + * **Text Messaging:** Send and receive text messages over the LoRa network. + * **Location Sharing:** Share your location with other users on the network (requires GPS). + * **Encryption:** Messages can be encrypted for privacy. + * **Mesh Networking:** The network automatically routes messages through other nodes to reach the destination. + * **Off-Grid Communication:** No cellular or WiFi required. + * **Channel Settings:** Customize channel settings for different regions and use cases (Long Fast, Mid Slow, etc.). + + 5. **Software & Firmware** + + * **Meshtastic Firmware:** The core software that runs on the microcontrollers. + * **Meshtastic Mobile App:** For configuring and interacting with the devices. Available on Android and iOS. + * **CLI (Command Line Interface):** For advanced configuration and debugging. + * **API (Application Programming Interface):** For integrating Meshtastic with other applications. + + 6. **Hardware Setup** + + * **Flashing Firmware:** You'll need to flash the Meshtastic firmware onto your microcontroller. This is typically done using a USB connection and a flashing tool. + * **Connecting Peripherals:** Connect the LoRa radio and any other peripherals (GPS, battery) to the microcontroller. + * **Antenna:** Attach an appropriate antenna to the LoRa radio. + + 7. **Configuration** + + * **Region Settings:** Configure the correct region settings for your location. + * **Channel Settings:** Choose a channel or create a custom channel. + * **Encryption:** Enable encryption for secure communication. + * **Power Settings:** Adjust power settings to optimize battery life. + + 8. **Technical Details** + + * **LoRa Modulation:** Uses LoRa modulation for long-range communication. + * **Frequency Bands:** Operates on various frequency bands depending on the region (e.g., 915 MHz in North America, 868 MHz in Europe). + * **Microcontroller Interfaces:** Uses various interfaces for communication between the microcontroller and peripherals, including GPIO, USB, UART, SPI, and I2C. + * **BLE (Bluetooth Low Energy):** Used for initial configuration and communication with the mobile app. + * **WiFi:** Some devices support WiFi for OTA (Over-The-Air) firmware updates. + * **MQTT:** Supports MQTT for integration with other systems. + + 9. **Use Cases** + + * **Hiking and Camping:** Stay connected with your group in areas without cellular coverage. + * **Emergency Communication:** Provide a backup communication system in case of emergencies. + * **Disaster Relief:** Establish communication networks in areas affected by disasters. + * **Rural Communication:** Connect communities in remote areas. + * **IoT Applications:** Use Meshtastic for various IoT applications that require long-range communication. + + 10. **Resources** + + * **Meshtastic Website:** [https://meshtastic.org/](https://meshtastic.org/) + * **Meshtastic Documentation:** [https://meshtastic.org/docs/](https://meshtastic.org/docs/) + * **Meshtastic Forums:** [https://meshtastic.discourse.group/](https://meshtastic.discourse.group/) + 1. **概觀** + + Meshtastic 是一個專案,讓你可以使用便宜的 LoRa 無線電作為長距離、離線、去中心化的通訊平台。這些無線電,結合了容易取得且非常實惠的微控制器,像是 ESP32、nRF52 和 RP2040,創建了一個網路,可以用來傳送簡訊、分享位置等等,而不需要依賴行動網路或 WiFi 基礎設施。它非常適合健行、露營,或任何你需要保持連線,但又超出傳統網路覆蓋範圍的情況。 + + 2. **主要組件** + + * **LoRa 無線電:** 提供長距離通訊能力。 RAK Wireless 模組是一個很受歡迎的選擇。 + * **微控制器:** 運作的大腦。 ESP32、nRF52 和 RP2040 因為它們的低成本和功能而被廣泛使用。 + * **GPS (可選):** 用於位置分享。 許多裝置,像是 T-Beam,都有內建 GPS。 + * **電池 (可選):** 用於攜帶型使用。 + * **外殼 (可選):** 保護硬體。 + + 3. **熱門裝置** + + * **T-Beam:** 一個受歡迎的板子,具有 ESP32、LoRa 和 GPS。 + * **Heltec WiFi LoRa 32:** 另一個受歡迎的基於 ESP32 的板子,具有 LoRa。 + * **LilyGo Boards:** LilyGo 提供各種基於 ESP32 和 nRF52 的板子,具有 LoRa。 + + 4. **功能** + + * **簡訊傳輸:** 透過 LoRa 網路傳送和接收簡訊。 + * **位置分享:** 與網路上其他使用者分享你的位置 (需要 GPS)。 + * **加密:** 可以加密訊息以保護隱私。 + * **網狀網路:** 網路會自動透過其他節點路由訊息,以到達目的地。 + * **離線通訊:** 不需要行動網路或 WiFi。 + * **頻道設定:** 客製化不同地區和使用案例的頻道設定 (Long Fast、Mid Slow 等)。 + + 5. **軟體與 Firmware** + + * **Meshtastic Firmware:** 在微控制器上執行的核心軟體。 + * **Meshtastic Mobile App:** 用於配置和與裝置互動。 可在 Android 和 iOS 上使用。 + * **CLI (Command Line Interface):** 用於進階配置和除錯。 + * **API (Application Programming Interface):** 用於將 Meshtastic 與其他應用程式整合。 + + 6. **硬體設定** + + * **刷入 Firmware:** 你需要將 Meshtastic firmware 刷入你的微控制器。 這通常是使用 USB 連線和刷入工具來完成的。 + * **連接週邊設備:** 將 LoRa 無線電和任何其他週邊設備 (GPS、電池) 連接到微控制器。 + * **天線:** 將適當的天線連接到 LoRa 無線電。 + + 7. **配置** + + * **區域設定:** 為你的位置配置正確的區域設定。 + * **頻道設定:** 選擇一個頻道或創建一個自定義頻道。 + * **加密:** 啟用加密以進行安全通訊。 + * **電源設定:** 調整電源設定以優化電池壽命。 + + 8. **技術細節** + + * **LoRa 調變:** 使用 LoRa 調變進行長距離通訊。 + * **頻率範圍:** 根據地區在不同的頻率範圍上運作 (例如,北美為 915 MHz,歐洲為 868 MHz)。 + * **微控制器介面:** 使用各種介面在微控制器和週邊設備之間進行通訊,包括 GPIO、USB、UART、SPI 和 I2C。 + * **BLE (Bluetooth Low Energy):** 用於初始配置和與行動應用程式的通訊。 + * **WiFi:** 某些裝置支援 WiFi 用於 OTA (Over-The-Air) firmware 更新。 + * **MQTT:** 支援 MQTT 用於與其他系統整合。 + + 9. **使用案例** + + * **健行和露營:** 在沒有行動網路覆蓋的地區與你的團隊保持聯繫。 + * **緊急通訊:** 在緊急情況下提供備份通訊系統。 + * **災害救援:** 在受災害影響的地區建立通訊網路。 + * **農村通訊:** 連接偏遠地區的社群。 + * **IoT 應用:** 將 Meshtastic 用於各種需要長距離通訊的 IoT 應用。 + + 10. **資源** + + * **Meshtastic Website:** [https://meshtastic.org/](https://meshtastic.org/) + * **Meshtastic Documentation:** [https://meshtastic.org/docs/](https://meshtastic.org/docs/) + * **Meshtastic Forums:** [https://meshtastic.discourse.group/](https://meshtastic.discourse.group/) +last_updated: 2026-05-13 +description: First-launch setup — permissions, onboarding flow, and next steps after connecting your radio. +aliases: + - first-launch + - setup + - intro +--- + +# # 入門指南 + +Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app. + +## First Launch + +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. + +### Welcome Screen + +The welcome screen introduces Meshtastic and its core capabilities: + +- Off-grid mesh communication +- No cellular or internet required +- End-to-end encrypted messaging + +Tap **Get Started** to proceed through the setup flow. + +![Welcome screen](/assets/screenshots/onboarding_welcome.png) + +## Permissions + +The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. + +### Bluetooth Permission + +Bluetooth is the primary connection method between your phone and Meshtastic radio: + +- **Bluetooth scanning** — discover nearby Meshtastic radios +- **Bluetooth connect** — establish and maintain connections with paired radios + +Grant both permissions when prompted. Without Bluetooth, you'll need to use USB or TCP connections instead. + +### Location Permission + +> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. + +Meshtastic also uses your location for: + +- Showing your position on the mesh map +- Calculating distances to other nodes +- Sharing your GPS coordinates with other mesh members (if enabled) + +Grant **"While using the app"** or **"Always"** depending on your preference: + +- **While using the app** — position updates only when the app is open +- **Always** — enables background position updates for always-on mesh presence + +If denied, Bluetooth scanning will not function and your node will not report a position. + +### Notifications Permission + +Notifications alert you to: + +- Incoming messages from channels and direct messages +- Connection status changes (connected, disconnected, reconnecting) +- Firmware update availability + +> 💡 **Tip:** You can fine-tune notification preferences later in Android system settings. The app creates separate notification channels for messages, connection events, and background service status. + +### Critical Alerts Permission + +On supported devices, the app may request permission for critical alerts: + +- These are high-priority notifications that can break through Do Not Disturb mode +- Useful for emergency mesh alerts or urgent messages +- You can **skip** this step if you don't need breakthrough notifications +- Configure or revoke later in Android notification settings + +## After Setup + +Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. + +> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. + +## What's Next? + +Once connected to a radio, explore: + +- [Connections](connections) — pair your first radio device +- [Messages & Channels](messages-and-channels) — send your first message +- [Nodes](nodes) — see who's on your mesh +- [Map & Waypoints](map-and-waypoints) — view node positions +- [Settings](settings-radio-user) — configure your radio and user profile + +New to Meshtastic? The [getting started guide](https://meshtastic.org/docs/getting-started) on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup. + +--- diff --git a/docs/zh-rTW/user/settings-module-admin.md b/docs/zh-rTW/user/settings-module-admin.md new file mode 100644 index 000000000..5ceb802e6 --- /dev/null +++ b/docs/zh-rTW/user/settings-module-admin.md @@ -0,0 +1,246 @@ +--- +title: Settings — Modules & Admin +nav_order: 8 +last_updated: 2026-05-13 +description: Configure optional feature modules (MQTT, telemetry, canned messages, TAK, and more) and perform device administration. +aliases: + - modules + - 模組設定 + - administration +--- + +# Settings — Modules & Admin + +Configure optional feature modules and perform device administration. Modules extend Meshtastic with specialized capabilities — each can be independently enabled or disabled. + +> 💡 **Tip:** You only need to enable the modules you actually use. Disabling unused modules reduces airtime, saves battery, and simplifies your configuration. + +Module settings use a card-based layout with toggle switches, dropdowns, text fields, and sliders: + +![Toggle switch](/assets/screenshots/settings_switch.png) + +![Dropdown selector](/assets/screenshots/settings_dropdown.png) + +![Text field](/assets/screenshots/settings_text_field.png) + +![Settings card layout](/assets/screenshots/settings_titled_card.png) + +## 模組設定 + +### MQTT Module + +Bridges mesh messages to and from an MQTT broker for internet connectivity. This is how you extend your mesh beyond radio range or integrate with home automation systems. + +| 設定 | 描述說明 | +| --------------- | ------------------------------------------------------------------------ | +| 已啟用 | Toggle MQTT bridge | +| 伺服器 | MQTT broker address | +| 使用者名稱 | Authentication username | +| 密碼 | Authentication password | +| 加密 | Encrypt MQTT payloads | +| ~~JSON Output~~ | ⚠️ **Deprecated** — JSON support removed from firmware; field is ignored | +| TLS | Use secure connection | +| 根主題 | Base MQTT topic path | +| Map Report | Publish position for public map | + +See [MQTT](mqtt) for a detailed usage guide including encryption, privacy, and broker setup. + +### Serial Module + +Enables serial port communication for external device integrations (GPS modules, sensors, or custom hardware). When enabled, the node's serial port can send and receive protobuf or text data, allowing external microcontrollers or computers to interact with the mesh. + +| 設定 | 描述說明 | +| ---------- | ------------------------------- | +| 已啟用 | Activate serial communication | +| Echo | Echo received serial data back | +| 模式 | Text, Protobuf, or NMEA output | +| RX/TX Pins | GPIO pins for serial connection | +| 鮑率 | Serial communication speed | + +### External Notification Module + +Controls buzzer, LED, or vibration alerts on your radio hardware. Useful for devices that need to physically signal when a message arrives — particularly helpful for unattended or outdoor installations. + +| 設定 | 描述說明 | +| -------------------------------- | --------------------------- | +| 已啟用 | Activate notifications | +| Alert Message | Notify on incoming messages | +| Alert Message Buzzer | Use buzzer for messages | +| Alert Message Vibra | Use vibration for messages | +| Alert Bell | Notify on bell character | +| Output (GPIO) | Pin for notification output | +| Active | High or Low active | +| Duration (ms) | Notification length | +| Use I2S as Buzzer | Use I2S audio output | + +### Store & Forward Module + +Buffers messages for nodes that were temporarily offline, then replays them when those nodes reconnect. Essential for meshes where nodes go in and out of range regularly — ensures messages aren't lost during brief disconnections. + +| 設定 | 描述說明 | +| ------------------------------------------ | -------------------------- | +| 已啟用 | Activate store and forward | +| Heartbeat (s) | Announcement interval | +| 紀錄 | Maximum stored messages | +| History Return (max) | Max messages to replay | +| History Return (window) | Time window for replay | + +> 💡 **Tip:** Store and Forward works best on nodes with ample memory (ESP32 with PSRAM). Router nodes are ideal candidates since they're typically always-on. + +### Range Test Module + +Automated range testing tool for evaluating link quality between nodes. When enabled, the node periodically transmits test messages with incrementing counters. A receiver node logs these messages, allowing you to walk or drive away and later analyze at what distance messages stopped arriving. + +| 設定 | 描述說明 | +| -------------------------------------- | --------------------------------- | +| 已啟用 | Activate range testing | +| Sender Interval (s) | Time between test transmissions | +| Save CSV | Log received test data to SD card | + +### Telemetry Module + +Controls what telemetry data your node shares with the mesh. Telemetry includes device health (battery, uptime) and environmental sensor data (temperature, humidity, pressure). + +| 設定 | 描述說明 | +| ---------------------------- | --------------------------------------- | +| Device Metrics Interval | How often to report device metrics | +| Environment Metrics Interval | How often to report environment sensors | +| 空氣品質已啟用 | Report particulate sensor data | +| 已啟用電源量測指標 | Report power usage | + +See [Telemetry & Sensors](telemetry-and-sensors) for supported sensors and configuration recommendations. + +### Canned Message Module + +Pre-configured messages accessible from the device's physical buttons (for radios with rotary encoders, keypads, or similar input hardware). Define a list of quick-send messages that can be transmitted without a phone connected — ideal for field use. + +| 設定 | 描述說明 | +| ------------------ | ----------------------------------------------------------- | +| ~~Enabled~~ | ⚠️ **Deprecated** — current firmware may ignore this toggle | +| 訊息 | Newline-separated list of messages | +| 傳送 Bell | Play bell sound on send | +| Rotary Encoder | Enable rotary encoder input | +| Up/Down/Press Pins | GPIO pin assignments for input | + +### Audio Module + +Codec2 audio support for low-bandwidth voice communication over the mesh. This is an **experimental** feature that encodes voice into very small data packets using the Codec2 codec. + +| 設定 | 描述說明 | +| ------------ | -------------------------------- | +| 已啟用 | Activate audio module | +| Codec2 Rate | Audio quality/bandwidth tradeoff | +| I2S 字元選擇 | GPIO pin for I2S WS | +| I2S Data In | GPIO pin for I2S DIN | +| I2S Data Out | GPIO pin for I2S DOUT | + +> ⚠️ **Note:** Audio requires specific hardware (I2S microphone and speaker). Voice quality is very low-bandwidth — think "understandable radio voice," not phone-call quality. + +### Remote Hardware Module + +GPIO control over the mesh network. Allows a remote node to read or write GPIO pins on another node — useful for activating relays, reading switches, or controlling external hardware from a distance. + +| 設定 | 描述說明 | +| -------------------- | --------------------------------------------------------------- | +| 已啟用 | Activate remote GPIO access | +| Allow Undefined Pins | Allow access to any GPIO pin (security risk) | + +> ⚠️ **Warning:** Enabling "Allow Undefined Pins" gives remote nodes access to all GPIO pins, which could interfere with the radio's own hardware. Only enable on dedicated GPIO nodes. + +### Neighbor Info Module + +Broadcasts information about directly heard neighbors, enabling mesh topology mapping. Each enabled node periodically shares a list of the other nodes it can hear and their signal quality. + +| 設定 | 描述說明 | +| -------------------------------------- | ------------------------------------ | +| 已啟用 | Activate neighbor broadcasting | +| Update Interval (s) | How often to broadcast neighbor list | + +See [Discovery](discovery) for how to use neighbor data for mesh topology exploration. + +### Ambient Lighting Module + +Controls onboard NeoPixel or other addressable RGB LEDs on supported hardware. Can be used for visual status indicators, notification lights, or decorative effects. + +| 設定 | 描述說明 | +| ------------------ | ---------------------------------------------------------- | +| 已啟用 | Activate LED control | +| LED 狀態 | On, Off, or set specific color | +| Red / Green / Blue | Individual color channel values (0–255) | + +### Detection Sensor Module + +Turns your node into a motion or door sensor alert system. When a GPIO pin detects a state change (motion detected, door opened), the node broadcasts an alert message over the mesh. + +| 設定 | 描述說明 | +| ---------------------------------------- | ----------------------------------------------------------------------- | +| 已啟用 | Activate detection sensor | +| 監控腳位 | GPIO pin connected to sensor | +| 偵測觸發高電位 | Trigger when pin goes high (vs. low) | +| Minimum Broadcast (s) | Minimum time between alert broadcasts | +| State Broadcast (s) | Periodic state broadcast interval | +| 傳送 Bell | Include bell character in alerts | +| 友善名稱 | Custom name for this sensor | + +### Paxcounter Module + +People counter using WiFi and BLE probe requests. Counts nearby devices by passively listening for probe requests that phones and laptops emit when scanning for networks. Available only on ESP32 devices. + +| Setting 設定 | 描述說明 | +| -------------------------------------- | -------------------------- | +| 已啟用 | Activate people counting | +| Update Interval (s) | How often to report counts | + +> 💡 **Tip:** Paxcounter is useful for estimating foot traffic at trailheads, event venues, or other locations. Counts are approximate — one person may carry multiple devices. + +### TAK Module + +Team Awareness Kit integration for interoperability with ATAK and WinTAK. See [TAK Integration](tak) for detailed setup and usage. + +## 管理 + +### 遠端管理 + +Remotely configure nodes that share your admin key: + +1. Select the target node in the node list. +2. Navigate to **Settings** for that node. +3. Modify configuration. +4. Tap **Save** — changes are sent over the mesh. + +> ⚠️ **Requires:** Admin key configured on both your node and the target node. + +### 清除節點資料庫 + +Removes stale nodes from your local database that haven't been heard in a configurable time window. + +### 恢復原廠設定 + +Resets all settings to factory defaults. **This cannot be undone.** + +### 重新開機 + +Remotely reboot a connected or administered node. + +### 偵錯面板 + +View detailed diagnostic information: + +- Protocol buffers debug output +- Mesh packet log +- Connection state details + +### Troubleshooting Remote Admin + +- **"No response from target node"** — the target may be out of range, offline, or have a mismatched admin key. Verify the admin key matches on both nodes. +- **Changes not applying** — some settings require a reboot to take effect. Try the Reboot action after saving. +- **Can't see remote settings** — ensure your node has the admin key for the target node and that Admin Channel is enabled in Security Config. + +## Related Topics + +- [Settings — Radio & User](settings-radio-user) — core radio and user profile settings +- [Module configuration reference](https://meshtastic.org/docs/configuration/module) — detailed module docs on meshtastic.org +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/zh-rTW/user/settings-radio-user.md b/docs/zh-rTW/user/settings-radio-user.md new file mode 100644 index 000000000..a53676730 --- /dev/null +++ b/docs/zh-rTW/user/settings-radio-user.md @@ -0,0 +1,173 @@ +--- +title: Settings — Radio & User +nav_order: 7 +last_updated: 2026-05-13 +description: Configure your radio hardware, LoRa presets, user profile, position sharing, power management, and security. +aliases: + - 設定 + - radio-config + - user-config + - LoRa +--- + +# Settings — Radio & User + +Configure your radio hardware and user identity parameters. + +## 使用者設定 + +### User Profile + +| 設定 | 描述說明 | +| ----------------- | ------------------------------------------------------------------------------------- | +| 長名稱 | Your display name (up to 39 characters) | +| 簡短名稱 | 4-character abbreviated name | +| Licensed Operator | Enable if you hold an amateur radio license (enables higher power) | + +### Applying Changes + +After modifying settings, tap **Save** to write the configuration to your radio. The device may reboot to apply changes. + +## 無線電配置 + +### 設備設置 + +| 設定 | 描述說明 | 默認 | +| ------------------------------------------ | ----------------------------------------------------------------------- | -------- | +| 角色 | Node behavior (Client, Router, etc.) | 用戶端 | +| ## Rebroadcast Mode轉發廣播模式 | How the node retransmits messages | 全部 | +| Node Info Broadcast (s) | Interval for broadcasting node info | 10800 | +| Double-tap Button | Action for double-tap button press | Disabled | + +### LoRa規劃 + +| 設定 | 描述說明 | 默認 | +| ---------------------------------------- | ----------------------------------------------------------------------- | ----------------------------------------- | +| 地區 | Regulatory region for frequency bands | Unset (must configure) | +| 數據機預設值 (Modem Preset) | Speed/range tradeoff | LongFast | +| 躍點限制 | Maximum retransmit hops | 3 | +| TX Power | Transmission power (dBm); 0 = max allowed for region | 0 (region max) | +| 頻率偏移量 | Fine-tune frequency (MHz) | 0 | +| Channel Bandwidth | Bandwidth setting | Default for preset | + +> ⚠️ **Important:** You **must** set your region before transmitting. Operating without the correct region may violate local radio regulations. See the [region configuration guide](https://meshtastic.org/docs/getting-started/initial-config) on meshtastic.org for details. + +### Modem Presets + +| Preset | 範圍 | 速度 | SNR Limit | Best For | +| ------------------ | ----------------------- | ------------------------- | ------------------------ | -------------------------------------------------------------------------------------------------------- | +| 短 Turbo | ~1 km | 21.9 kbps | −5 dB | Dense urban with line-of-sight; data-heavy applications | +| 短 快 | ~3 km | 10.9 kbps | −7.5 dB | Urban neighborhoods; buildings within a few blocks | +| 短 慢 | ~5 km | 5.5 kbps | −10 dB | Suburban short-range; moderate building density | +| 中等快 | ~5 km | 5.5 kbps | −10 dB | Suburban areas; moderate building density | +| 中等慢 | ~8 km | 1.1 kbps | −12.5 dB | Suburban/rural; moderate range with slower speed | +| Long Turbo | ~10 km | 4.4 kbps | −10 dB | Similar range to Long Fast but with 500 kHz bandwidth; faster throughput | +| Long Fast | ~10 km | 1.1 kbps | −12.5 dB | **General use (default)** — balanced range and speed | +| 長度中等的 | ~20 km | 0.34 kbps | −15 dB | Rural with some terrain; occasional use | +| Lite Fast | ~5 km | 5.5 kbps | −10 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Medium Fast | +| Lite Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Long Fast | +| Narrow Fast | ~5 km | 2.7 kbps | −10 dB | EU 868 MHz band (62.5 kHz BW); avoids interference with other devices | +| Narrow Slow | ~10 km | 1.1 kbps | −12.5 dB | EU 868 MHz band (62.5 kHz BW); comparable to Long Fast | +| ~~Long Slow~~ | ~30 km | 0.18 kbps | −17.5 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | +| ~~Very Long Slow~~ | ~40+ km | 0.09 kbps | −20 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release | + +#### Choosing a Modem Preset + +The modem preset controls the fundamental tradeoff between **range** and **data rate**: + +- **Slower presets** use more spreading, making signals decodable at weaker signal levels (lower SNR limit). This means longer range but fewer bytes per second. +- **Faster presets** pack more data per transmission but require a stronger signal to decode. + +**Practical guidance:** + +- **Urban mesh (many nodes, short distances):** Use **Long Fast** (default) or **Short Fast**. Higher speed means less airtime congestion when many nodes share the channel. +- **Rural/sparse mesh (few nodes, long distances):** Use **Long Moderate**. Range matters more than speed when nodes are far apart. +- **EU 866/868 MHz regulatory compliance:** Use **Lite Fast**, **Lite Slow**, **Narrow Fast**, or **Narrow Slow** — these are optimized for the EU SRD/868 MHz bands with narrower bandwidths. +- **Fixed infrastructure links:** Use **Short Turbo** or **Long Turbo** for dedicated point-to-point links with good antennas and line-of-sight. +- **Mixed environments:** Stick with **Long Fast** — it's the community default and ensures compatibility with others in your area. + +> ⚠️ **Important:** All nodes on the same channel **must** use the same modem preset. Nodes with mismatched presets cannot communicate even if they share the same frequency and encryption key. + +> 💡 **Tip:** The range estimates above assume flat terrain and modest antennas. Elevation advantage (hilltop, rooftop) dramatically increases effective range. A well-placed Router with Long Fast can often outperform a ground-level node with Long Slow. + +### 顯示設置 + +| 設定 | 描述說明 | +| ----------------- | ------------------------------------------------------------------------------------ | +| 螢幕逾時 | Time before display sleeps | +| 顯示單位 | Metric or Imperial | +| OLED類型 | Auto, SSD1306, SH1106, SH1107 | +| 羅盤方位 | Rotation offset for compass display (0°, 90°, 180°, 270°) | +| ~~Compass North~~ | ⚠️ **Deprecated** — replaced by Compass Orientation; still visible in older firmware | + +### 位置設定 + +| 設定 | 描述說明 | +| ----------------------------------------- | ---------------------------------- | +| GPS Enabled | Enable/disable GPS | +| GPS 更新間隔 | How often to acquire GPS fix | +| Position Broadcast (s) | How often to share position | +| 智慧定位 | Enable movement-based broadcasting | +| 固定位置 | Use a manually set position | + +### 電源設定 + +| 設定 | 描述說明 | +| --------------------------------------- | --------------------------------------- | +| 省電模式 | Enable low-power sleep mode | +| Shutdown After (s) | Auto-shutdown idle timer | +| ADC Multiplier | Battery voltage calibration factor | +| Wait Bluetooth (s) | Time to wait for BLE connection at boot | +| Mesh SDS Timeout (s) | Super-deep-sleep timeout | + +### 網路配置 + +| 設定 | 描述說明 | +| ------------- | ---------------------------------------------------- | +| 啟用 WiFi | Enable WiFi radio (ESP32 devices) | +| WiFi SSID | Network name to connect to | +| WiFi PSK | 網路密碼 | +| NTP 伺服器 | Time synchronization server | +| Syslog Server | Remote logging server | + +![IP address field](/assets/screenshots/settings_ipv4_field.png) + +### 藍牙配置 + +| 設定 | 描述說明 | +| ----------------- | ------------------------------------------------------------------------- | +| Bluetooth Enabled | Enable/disable BLE radio | +| 配對模式 | Fixed PIN, Random PIN, or No PIN | +| 固定 PIN | PIN code for pairing (default: 123456) | + +### 安全性設定 + +| 設定 | 描述說明 | +| -------------------------------- | -------------------------------------------------------------------------- | +| 公鑰 | Your node's public key (read-only) | +| 管理金鑰 | Key for remote administration | +| 私鑰 | Your node's private key (handle securely) | +| Admin Channel Enabled - 管理員頻道已啟用 | Allow admin commands via channel | +| 除錯日誌 | Output live debug logging over serial/bluetooth | +| Serial Enabled | Enable serial console access (moved from Device Config) | +| 管理模式 | Restrict non-admin channel changes | + +![Password field](/assets/screenshots/settings_password_field.png) + +Settings use standard preference controls — dropdowns, toggles, and sliders: + +| Control | 螢幕截圖 | +| -------- | ------------------------------------------------------ | +| Dropdown | ![Dropdown](/assets/screenshots/settings_dropdown.png) | +| Toggle | ![Toggle](/assets/screenshots/settings_switch.png) | +| Slider | ![Slider](/assets/screenshots/settings_slider.png) | + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — optional feature modules and device administration +- [Signal Meter](signal-meter) — how modem presets affect signal quality thresholds +- [LoRa configuration](https://meshtastic.org/docs/configuration/radio/lora) — detailed LoRa settings reference on meshtastic.org +- [Initial configuration](https://meshtastic.org/docs/getting-started/initial-config) — region setup guide on meshtastic.org + +--- + diff --git a/docs/zh-rTW/user/signal-meter.md b/docs/zh-rTW/user/signal-meter.md new file mode 100644 index 000000000..d3337a428 --- /dev/null +++ b/docs/zh-rTW/user/signal-meter.md @@ -0,0 +1,225 @@ +--- +title: How the Meshtastic Signal Meter Works +nav_order: 15 +last_updated: 2026-05-13 +description: How the signal meter calculates quality from RSSI and SNR — LoRa spread spectrum, presets, and what the bars really mean. +aliases: + - signal + - signal-meter + - snr + - rssi +--- + +# How the Meshtastic Signal Meter Works + +The Meshtastic signal meter — the familiar bars or status color in the app — is calculated very differently than the "bars" on a traditional cell phone or Wi-Fi router. + +Most consumer devices simply measure how "loud" a signal is. However, because Meshtastic uses **LoRa (Long Range)** technology, its signal meter measures how **clear** the signal is, relative to the specific settings your mesh is using. + +--- + +## 1. Meshtastic is an open source, decentralized, off-grid, privacy-respecting, encrypted communications platform built on affordable, readily available hardware. It enables you and your friends to communicate securely with text messages, share locations, and more over long ranges. + +2. It's built on top of a software defined radio platform called LoRa, enabling inexpensive radios (based on popular chips like the ESP32, nRF52, and RP2040) to operate as long range, low power, and secure communicators. + +3. Common hardware includes devices like the RAK WisBlock series, T-Beam, Heltec, and LilyGo boards. + +4. Meshtastic supports communication over several radio channels, allowing you to separate traffic or experiment with different settings. You can configure parameters like the spreading factor, bandwidth, and coding rate to optimize for range, data rate, and reliability. These settings are often referred to as radio profiles, with common examples being "Long Fast" or "Mid Slow". + +5. Besides LoRa, Meshtastic devices can also communicate using BLE for short-range communication with smartphones and other devices. + +6. Meshtastic devices can be configured using a variety of methods, including: + - A mobile app (available for Android and iOS) + - A web-based interface + - A CLI + - An API + +7. Meshtastic can also be integrated with other systems using protocols like MQTT. + +8. You can extend the functionality of Meshtastic devices by writing your own firmware or connecting external sensors and devices using the GPIO, USB, UART, SPI, and I2C interfaces. + +9. Meshtastic devices can be powered by batteries, USB, or other power sources. + +10. Meshtastic supports Over-The-Air (OTA) firmware updates via LoRa, WiFi or Bluetooth. + +11. Meshtastic allows for end-to-end encryption of messages. + +12. Meshtastic devices can act as repeaters, extending the range of the network. The Two Metrics: "Loudness" vs. "Clarity" + +Every time the LoRa radio chip receives a message, it reports two measurements: + +- **RSSI (Received Signal Strength Indicator):** The **loudness** of the raw power hitting your antenna. +- **SNR (Signal-to-Noise Ratio):** The **clarity** of the signal compared to the background static. + +> **Tip — The Analogy:** Imagine you are trying to hear a friend talking to you. +> +> - **RSSI** is how loud their voice is. +> - **The Noise Floor** is the background noise in the room (air conditioning, other people talking, traffic). +> - **SNR** is how easily you can distinguish your friend's voice from the background noise. + +If your friend shouts at you at a deafening rock concert, the signal is incredibly loud (High RSSI), but you still can't understand them because the background noise is louder (Bad SNR). Conversely, if your friend whispers to you in a dead-silent library, the signal is very weak (Low RSSI), but you can understand them perfectly (Great SNR). + +--- + +## 2. The Magic of LoRa: Hearing "Below the Noise Floor" + +For standard radios (like FM or Wi-Fi), if the background noise is louder than the signal (a negative SNR), the receiver just hears static. + +LoRa is special. It uses **"Spread Spectrum"** modulation, which allows the radio to mathematically pull a signal out of the air even when it is buried deep _underneath_ the background noise. This is why you will frequently see **negative SNR numbers** in Meshtastic (e.g., -10 dB, which means the signal is 10 decibels weaker than the background static). + +Depending on which Meshtastic preset you are using (e.g., `LongFast` vs. `ShortFast`), the radio has a specific **SNR Limit** — the absolute maximum amount of noise it can tolerate before the message is completely lost to the static. + +--- + +## 3. How the Signal Meter Calculates Quality + +The Meshtastic apps take both RSSI and SNR and run them through a specific formula to assign your signal a quality rating (None, Bad, Fair, or Good). It specifically scales these values based on the physical limits of the radio preset you are using. + +Here is exactly how the app decides how many bars (or what color) to show you: + +| Level | Bars | Criteria | Meaning | +| ----- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | +| 良好 | 3 | RSSI better than `-115 dBm` **AND** SNR better than `-7 dB` | Signal is both loud and clear — healthy connection. | +| 普通 | 2 | RSSI better than `-126 dBm` with good SNR, **OR** SNR better than `-15 dB` with good RSSI | Signal getting quieter or noisier, but still decodable. | +| 不良 | 1. **Overview**``` +Meshtastic is a project that allows you to use inexpensive LoRa radios as a long range, off-grid, decentralized communication platform. These radios, combined with readily available and very affordable microcontrollers like the ESP32, nRF52, and RP2040, create a network that can be used to send text messages, share locations, and more without relying on cellular or WiFi infrastructure. It's perfect for hiking, camping, or any situation where you need to stay connected beyond the reach of traditional networks. +```2. **Key Components**``` +* **LoRa Radios:** These radios provide the long-range communication capabilities. The RAK Wireless modules are a popular choice. +* **Microcontrollers:** The brains of the operation. ESP32, nRF52, and RP2040 are commonly used due to their low cost and capabilities. +* **GPS (Optional):** For location sharing. Many devices, like the T-Beam, have built-in GPS. +* **Battery (Optional):** For portable use. +* **Enclosure (Optional):** To protect the hardware. +```3. **Popular Devices**``` +* **T-Beam:** A popular board with ESP32, LoRa, and GPS. +* **Heltec WiFi LoRa 32:** Another popular ESP32-based board with LoRa. +* **LilyGo Boards:** LilyGo offers a variety of ESP32 and nRF52 based boards with LoRa. +```4. **Features**``` +* **Text Messaging:** Send and receive text messages over the LoRa network. +* **Location Sharing:** Share your location with other users on the network (requires GPS). +* **Encryption:** Messages can be encrypted for privacy. +* **Mesh Networking:** The network automatically routes messages through other nodes to reach the destination. +* **Off-Grid Communication:** No cellular or WiFi required. +* **Channel Settings:** Customize channel settings for different regions and use cases (Long Fast, Mid Slow, etc.). +```5. **Software & Firmware**``` +* **Meshtastic Firmware:** The core software that runs on the microcontrollers. +* **Meshtastic Mobile App:** For configuring and interacting with the devices. Available on Android and iOS. +* **CLI (Command Line Interface):** For advanced configuration and debugging. +* **API (Application Programming Interface):** For integrating Meshtastic with other applications. +```6. **Hardware Setup**``` +* **Flashing Firmware:** You'll need to flash the Meshtastic firmware onto your microcontroller. This is typically done using a USB connection and a flashing tool. +* **Connecting Peripherals:** Connect the LoRa radio and any other peripherals (GPS, battery) to the microcontroller. +* **Antenna:** Attach an appropriate antenna to the LoRa radio. +```7. **Configuration**``` +* **Region Settings:** Configure the correct region settings for your location. +* **Channel Settings:** Choose a channel or create a custom channel. +* **Encryption:** Enable encryption for secure communication. +* **Power Settings:** Adjust power settings to optimize battery life. +```8. **Technical Details**``` +* **LoRa Modulation:** Uses LoRa modulation for long-range communication. +* **Frequency Bands:** Operates on various frequency bands depending on the region (e.g., 915 MHz in North America, 868 MHz in Europe). +* **Microcontroller Interfaces:** Uses various interfaces for communication between the microcontroller and peripherals, including GPIO, USB, UART, SPI, and I2C. +* **BLE (Bluetooth Low Energy):** Used for initial configuration and communication with the mobile app. +* **WiFi:** Some devices support WiFi for OTA (Over-The-Air) firmware updates. +* **MQTT:** Supports MQTT for integration with other systems. +```9. **Use Cases**``` +* **Hiking and Camping:** Stay connected with your group in areas without cellular coverage. +* **Emergency Communication:** Provide a backup communication system in case of emergencies. +* **Disaster Relief:** Establish communication networks in areas affected by disasters. +* **Rural Communication:** Connect communities in remote areas. +* **IoT Applications:** Use Meshtastic for various IoT applications that require long-range communication. +```10. **Resources**``` +* **Meshtastic Website:** [https://meshtastic.org/](https://meshtastic.org/) +* **Meshtastic Documentation:** [https://meshtastic.org/docs/](https://meshtastic.org/docs/) +* **Meshtastic Forums:** [https://meshtastic.discourse.group/](https://meshtastic.discourse.group/) +```1) **概觀** + + Meshtastic 是一個專案,讓你可以使用便宜的 LoRa 無線電作為長距離、離線、去中心化的通訊平台。這些無線電,結合了容易取得且非常實惠的微控制器,像是 ESP32、nRF52 和 RP2040,創建了一個網路,可以用來傳送簡訊、分享位置等等,而不需要依賴行動網路或 WiFi 基礎設施。它非常適合健行、露營,或任何你需要保持連線,但又超出傳統網路覆蓋範圍的情況。 + +2) **主要組件** + + - **LoRa 無線電:** 提供長距離通訊能力。 RAK Wireless 模組是一個很受歡迎的選擇。 + - **微控制器:** 運作的大腦。 ESP32、nRF52 和 RP2040 因為它們的低成本和功能而被廣泛使用。 + - **GPS (可選):** 用於位置分享。 許多裝置,像是 T-Beam,都有內建 GPS。 + - **電池 (可選):** 用於攜帶型使用。 + - **外殼 (可選):** 保護硬體。 + +3) **熱門裝置** + + - **T-Beam:** 一個受歡迎的板子,具有 ESP32、LoRa 和 GPS。 + - **Heltec WiFi LoRa 32:** 另一個受歡迎的基於 ESP32 的板子,具有 LoRa。 + - **LilyGo Boards:** LilyGo 提供各種基於 ESP32 和 nRF52 的板子,具有 LoRa。 + +4) **功能** + + - **簡訊傳輸:** 透過 LoRa 網路傳送和接收簡訊。 + - **位置分享:** 與網路上其他使用者分享你的位置 (需要 GPS)。 + - **加密:** 可以加密訊息以保護隱私。 + - **網狀網路:** 網路會自動透過其他節點路由訊息,以到達目的地。 + - **離線通訊:** 不需要行動網路或 WiFi。 + - **頻道設定:** 客製化不同地區和使用案例的頻道設定 (Long Fast、Mid Slow 等)。 + +5) **軟體與 Firmware** + + - **Meshtastic Firmware:** 在微控制器上執行的核心軟體。 + - **Meshtastic Mobile App:** 用於配置和與裝置互動。 可在 Android 和 iOS 上使用。 + - **CLI (Command Line Interface):** 用於進階配置和除錯。 + - **API (Application Programming Interface):** 用於將 Meshtastic 與其他應用程式整合。 + +6) **硬體設定** + + - **刷入 Firmware:** 你需要將 Meshtastic firmware 刷入你的微控制器。 這通常是使用 USB 連線和刷入工具來完成的。 + - **連接週邊設備:** 將 LoRa 無線電和任何其他週邊設備 (GPS、電池) 連接到微控制器。 + - **天線:** 將適當的天線連接到 LoRa 無線電。 + +7) **配置** + + - **區域設定:** 為你的位置配置正確的區域設定。 + - **頻道設定:** 選擇一個頻道或創建一個自定義頻道。 + - **加密:** 啟用加密以進行安全通訊。 + - **電源設定:** 調整電源設定以優化電池壽命。 + +8) **技術細節** + + - **LoRa 調變:** 使用 LoRa 調變進行長距離通訊。 + - **頻率範圍:** 根據地區在不同的頻率範圍上運作 (例如,北美為 915 MHz,歐洲為 868 MHz)。 + - **微控制器介面:** 使用各種介面在微控制器和週邊設備之間進行通訊,包括 GPIO、USB、UART、SPI 和 I2C。 + - **BLE (Bluetooth Low Energy):** 用於初始配置和與行動應用程式的通訊。 + - **WiFi:** 某些裝置支援 WiFi 用於 OTA (Over-The-Air) firmware 更新。 + - **MQTT:** 支援 MQTT 用於與其他系統整合。 + +9) **使用案例** + + - **健行和露營:** 在沒有行動網路覆蓋的地區與你的團隊保持聯繫。 + - **緊急通訊:** 在緊急情況下提供備份通訊系統。 + - **災害救援:** 在受災害影響的地區建立通訊網路。 + - **農村通訊:** 連接偏遠地區的社群。 + - **IoT 應用:** 將 Meshtastic 用於各種需要長距離通訊的 IoT 應用。 + +10) **資源** + + - **Meshtastic Website:** [https://meshtastic.org/](https://meshtastic.org/) + - **Meshtastic Documentation:** [https://meshtastic.org/docs/](https://meshtastic.org/docs/) + - **Meshtastic Forums:** [https://meshtastic.discourse.group/](https://meshtastic.discourse.group/) | Falls between Fair and None thresholds | At the edge of range or experiencing interference. | +| 無 | 0 | RSSI worse than `-126 dBm` **AND** SNR worse than `-15 dB` | Transmission completely buried in noise. | + +--- + +## 4. What This Means for You + +Because Meshtastic's meter acts as a **"Clarity Meter"**, it behaves differently than what most people expect: + +> **Tip — Don't panic over low RSSI:** You might see a seemingly terrible RSSI value like `-118 dBm`. On a cell phone, you would have zero bars. But if you have an SNR of `+2 dB`, Meshtastic will still show a strong signal! _The library is quiet, so the whisper is heard perfectly._ + +> **Warning — Watch out for local noise:** If you hook up a massive antenna and see a great RSSI (e.g., `-90 dBm`) but your signal meter is only showing **1 Bar (Bad)**, you have a problem. It means you have local interference — perhaps a cheap power supply, a noisy computer, or a nearby radio tower — creating so much static that it is drowning out your mesh. + +## Where Signal Information Appears + +In the app, signal data is shown in several places: + +- **Node list** — signal bars icon next to each node +- **Node detail** — SNR, RSSI, and signal quality in the device metrics section +- **Traceroute** — per-hop signal quality for each relay node +- **Signal metrics** — historical SNR and RSSI data in the metrics charts + +![Node entry showing SNR, RSSI values and colored signal bars](/assets/screenshots/nodes_signal_info.png) + diff --git a/docs/zh-rTW/user/tak.md b/docs/zh-rTW/user/tak.md new file mode 100644 index 000000000..c0009aab8 --- /dev/null +++ b/docs/zh-rTW/user/tak.md @@ -0,0 +1,126 @@ +--- +title: TAK Integration +nav_order: 10 +last_updated: 2026-05-13 +description: Interoperate with ATAK and WinTAK — CoT position sharing, TAK roles, and plugin setup. +aliases: + - tak + - atak + - team-awareness-kit +--- + +# TAK Integration + +Meshtastic integrates with the Team Awareness Kit (TAK) ecosystem, enabling interoperability between Meshtastic mesh devices and TAK applications like ATAK and WinTAK. + +## 概觀 + +The TAK module allows Meshtastic nodes to: + +- Share position data in TAK-compatible CoT (Cursor on Target) format +- Appear as team members on TAK map displays +- Receive TAK PLI (Position Location Information) messages + +## 設定 + +### 先決條件 + +- ATAK (Android Team Awareness Kit) or WinTAK installed +- Meshtastic ATAK Plugin installed +- TAK module enabled on your Meshtastic radio + +### 設定 + +1. Navigate to **Settings → Module Config → TAK**. +2. Enable the TAK module. +3. Configure the TAK team/group settings: + +![Module toggle switch](/assets/screenshots/settings_switch.png) + +| 設定 | 描述說明 | +| --- | -------------------------- | +| 已啟用 | Activate TAK interop | +| 模式 | TAK-compatible output mode | + +### ATAK Plugin Setup + +1. Install the Meshtastic ATAK Plugin from the plugin repository. +2. Open ATAK and enable the Meshtastic plugin. +3. The plugin bridges messages between ATAK and your mesh network. + +## TAK Roles + +Nodes configured with TAK-related roles behave differently from standard clients: + +| 角色 | 描述說明 | +| --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **TAK** | Full TAK interoperability — sends and receives CoT data, chat messages, and PLI updates. Functions as a standard client plus TAK bridge. | +| **TAK Tracker** | Position-only TAK output — automatically broadcasts PLI at regular intervals without user interaction. Optimized for unattended position beacons (vehicles, equipment, waypoints). Does not relay chat messages. | + +> 💡 **Tip:** Use **TAK Tracker** for devices that only need to report position (e.g., a radio mounted in a vehicle). Use **TAK** for devices where users actively participate in TAK operations. + +### CoT (Cursor on Target) Format + +TAK messages use the Cursor on Target XML format — a military standard for sharing situational awareness data. Meshtastic converts its internal protobuf messages to CoT format when bridging to TAK systems, so no manual format conversion is needed. + +## TAK Identity + +When using TAK roles, your node broadcasts identity information that appears on TAK maps: + +| 設定 | 描述說明 | +| -------- | ---------------------------------------------------------------------------------------------------------------- | +| Team | Your team color on the TAK map (e.g., Blue, Red, Cyan, Green) | +| 角色 | Your operational role (Team Member, Team Lead, HQ, Medic, RTO, etc.) | +| Callsign | Your TAK callsign (defaults to your Meshtastic long name) | + +These settings appear in **Settings → Module Config → TAK** when the TAK module is enabled. + +> 💡 **Tip:** Team/role colors are the standard TAK affiliation colors. Coordinate with your TAK team to use consistent team assignments. + +## Wire Format (V1 / V2) + +Meshtastic supports two TAK wire formats: + +| Format | 相容性 | 特色 | +| ------------------------------- | --------------------------------------------------------------- | --------------------------------------------------------- | +| V1 (Legacy) | ATAK Plugin v1.x, older firmware | Basic CoT position sharing only | +| V2 (Current) | ATAK Plugin v2.x, firmware 2.3+ | Full CoT support including chat, routes, zstd compression | + +The app automatically selects V2 when both sides support it. No manual configuration needed — the TAK module negotiates format based on firmware capabilities. + +## Usage with ATAK + +Once configured: + +- Meshtastic nodes appear as markers on the ATAK map with callsign labels +- Chat messages can bridge between mesh and TAK networks +- Position updates flow bidirectionally between Meshtastic and TAK +- TAK Tracker nodes broadcast PLI automatically — their positions appear on ATAK maps without any ATAK-side configuration + +> ⚠️ **Note:** TAK integration requires specific node roles and module configuration. Standard client nodes don't automatically participate in TAK operations. + +## 故障排除 + +| Problem | Cause | Solution | +| -------------------------------- | ------------------------------------- | ----------------------------------------------------------------------- | +| Node doesn't appear on ATAK map | TAK module disabled or wrong role | Verify TAK module is enabled and node role is TAK or TAK Tracker | +| Position updates are stale | GPS fix lost or interval too long | Check GPS status; reduce position broadcast interval in Position Config | +| ATAK plugin shows "disconnected" | BLE connection lost or plugin crashed | Reconnect Bluetooth in Meshtastic app, then restart ATAK plugin | +| Chat messages not bridging | V1 format doesn't support chat | Ensure both nodes run firmware 2.3+ for V2 wire format | +| CoT data not flowing | Channel mismatch | All TAK nodes must be on the same channel with matching encryption | + +## Security Considerations + +- TAK data shares your position and callsign information +- Ensure your channel encryption is configured when using TAK in sensitive environments +- The TAK module respects the same channel encryption as other Meshtastic messages + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — TAK module configuration +- [Nodes](nodes) — TAK and TAK Tracker roles in the node list +- [Map & Waypoints](map-and-waypoints) — node positions on the map +- [ATAK plugin guide](https://meshtastic.org/docs/software/integrations/atak-plugin) — detailed ATAK setup on meshtastic.org + +--- + diff --git a/docs/zh-rTW/user/telemetry-and-sensors.md b/docs/zh-rTW/user/telemetry-and-sensors.md new file mode 100644 index 000000000..a44efe485 --- /dev/null +++ b/docs/zh-rTW/user/telemetry-and-sensors.md @@ -0,0 +1,118 @@ +--- +title: Telemetry & Sensors +nav_order: 9 +last_updated: 2026-05-13 +description: Sensor data on the mesh — supported environment, air quality, and power sensors, plus configuration and viewing guides. +aliases: + - sensors + - environment + - weather + - power-metrics +--- + +# Telemetry & Sensors + +Meshtastic nodes can collect and share sensor data across the mesh network. + +## 概觀 + +Telemetry allows nodes equipped with sensors to broadcast environmental, power, and device health information. This data is visible on the node detail screen and can be logged over time. + +## 裝置遙測 + +All Meshtastic nodes report basic device telemetry: + +| 公制(公里/公尺) | 描述說明 | Typical Range | +| ------------------ | ------------------------------ | ------------------------------------------------------------------ | +| Battery Level | Charge percentage | 0–100% | +| 電壓 | Battery voltage | 3.0–4.2V (LiPo) | +| 頻道使用量 | % of airtime used locally | 0–100% | +| Air Utilization TX | % of airtime used by this node | 0–100% | +| 運行時間 | Seconds since last boot | Varies | + +## Environment Sensors + +Supported environmental sensors: + +### Temperature & Humidity + +| 感測器 | 溫度 | 濕度 | 氣壓 | 備註 | +| ------- | -- | -- | -- | ----------------------- | +| BME280 | ✓ | ✓ | ✓ | Recommended all-in-one | +| BME680 | ✓ | ✓ | ✓ | Adds gas resistance/IAQ | +| SHT31 | ✓ | ✓ | — | High accuracy | +| MCP9808 | ✓ | — | — | Precision temperature | +| LPS22 | — | — | ✓ | Pressure only | + +### Air Quality + +| 感測器 | 公制(公里/公尺) | 備註 | +| -------- | -------------------------------------------------- | -------------------------- | +| BME680 | Gas Resistance / IAQ | Volatile organic compounds | +| PMSA003I | PM1.0, PM2.5, PM10 | Particulate matter | +| SEN55 | PM, NOx, VOC, Temp, Humidity | Multi-sensor | + +### Light & UV + +| 感測器 | 公制(公里/公尺) | +| -------- | -------------------------------------- | +| OPT3001 | Ambient light (lux) | +| VEML7700 | Ambient light (lux) | +| LTR390 | UV index | + +## 電源計量資料 + +Nodes with INA-series power sensors can report: + +| 公制(公里/公尺) | 描述說明 | +| ----------- | ----------------------------------------- | +| Bus Voltage | Supply rail voltage | +| 目前 | Power consumption (mA) | +| 電力 | Calculated power (mW) | + +Useful for monitoring solar charging or battery health on remote nodes. + +## Configuring Telemetry + +1. Navigate to **Settings → Module Config → Telemetry**. +2. Set reporting intervals: + - **Device Metrics Interval** — how often to broadcast device metrics + - **Environment Metrics Interval** — how often to broadcast sensor data +3. Enable specific sensor types as needed. + +### Recommended Intervals + +| Use Case | Device (s) | Environment (s) | +| ------------------------------------------ | ----------------------------- | ---------------------------------- | +| Urban mesh (many nodes) | 3600 | 3600 | +| Rural mesh (few nodes) | 900 | 900 | +| Weather station | 900 | 300 | +| Battery conservation | 7200 | 7200 | + +> ⚠️ **Note:** Shorter intervals increase airtime usage and battery drain across the mesh. + +## Viewing Telemetry + +1. Navigate to **Nodes** and select a node. +2. Telemetry sections show on the detail screen: + - Device Metrics (always available) + - Environment Metrics (if sensors present) + - Power Metrics (if INA sensor present) +3. Historical graphs show trends over time. + +![Telemetry actions](/assets/screenshots/node-metrics_telemetric_actions.png) + +## 故障排除 + +- **No environment data showing?** The remote node needs a physical sensor connected (e.g., BME280 on I2C). Device telemetry (battery, uptime) is always available, but environment metrics require hardware. +- **Stale readings?** Check the reporting interval — very long intervals (7200s+) mean data updates infrequently. Also verify the remote node is still online. +- **Sensor conflict on I2C bus?** Some sensors share I2C addresses. If you have multiple sensors on the same bus, check for address collisions in the radio's serial debug output. + +## Related Topics + +- [Node Metrics](node-metrics) — view telemetry data on the node detail screen +- [Settings — Modules & Admin](settings-module-admin) — telemetry module configuration +- [Units & Locale](units-and-locale) — temperature and pressure display units + +--- + diff --git a/docs/zh-rTW/user/translate.md b/docs/zh-rTW/user/translate.md new file mode 100644 index 000000000..a39793573 --- /dev/null +++ b/docs/zh-rTW/user/translate.md @@ -0,0 +1,97 @@ +--- +title: Translate the App +parent: User Guide +nav_order: 17 +last_updated: 2026-05-13 +aliases: + - translate + - crowdin + - localization +--- + +# Translate the App + +Contributing translations helps make Meshtastic accessible to a wider audience. The app uses [Crowdin](https://crowdin.com/) to manage community translations for both the user interface and in-app documentation. + +--- + +## What Gets Translated + +| Resource | Source Location | 備註 | +| ----------------- | ------------------------------------- | ---------------------------------------------------------------------- | +| UI strings | `composeResources/values/strings.xml` | Buttons, labels, messages, and all user-visible text | +| User Guide pages | `docs/user/*.md` | In-app documentation shown in Help & Documentation | +| Fastlane metadata | `fastlane/metadata/android/en-US/` | App Store listing title, description, and changelogs | + +> **Note — Developer Guide pages are English-only.** Code-focused documentation targeting contributors is not translated. + +--- + +## 如何貢獻 + +1. **Visit the Crowdin project.** Open the [Meshtastic Android Crowdin project](https://crowdin.com/project/meshtastic-android) and sign in or create a free account. +2. **Choose your language.** Select an existing language or request a new one by opening a [GitHub issue](https://github.com/meshtastic/Meshtastic-Android/issues/new). +3. **Translate strings.** Crowdin shows the English source on the left and your translation on the right. Translate each string and save. +4. **Review context.** Many strings include screenshots or context comments — check these to understand where the text appears in the app. +5. **Submit.** Approved translations are automatically merged into the next release. + +> **Tip — Keep translations short.** UI strings often appear in buttons, chips, or narrow columns. If a translation is significantly longer than the English original, consider abbreviating where the meaning stays clear. + +--- + +## Adding a New Language + +If your language is not yet listed on Crowdin: + +1. Open an issue on [GitHub](https://github.com/meshtastic/Meshtastic-Android/issues/new) requesting the new locale. +2. A maintainer will add the language to Crowdin and configure `crowdin.yml`. +3. Once added, you can begin translating immediately. + +--- + +## How Translations Are Organized + +The Android app uses **Compose Multiplatform resources** for all user-visible strings: + +``` +core/resources/src/commonMain/composeResources/ +├── values/ ← English (default) +│ └── strings.xml +├── values-de/ ← German +│ └── strings.xml +├── values-fr/ ← French +│ └── strings.xml +└── ... +``` + +In-app documentation follows a similar pattern under `docs/`: + +``` +docs/ +├── user/ ← English source (default) +│ ├── onboarding.md +│ └── ... +├── fr/user/ ← French translations +│ ├── onboarding.md +│ └── ... +└── ... +``` + +The app automatically selects the correct locale based on your device's **Language & Region** settings. + +--- + +## Translation Guidelines + +- **Do not translate** technical terms like "LoRa", "MQTT", "BLE", "TAK", "SNR", or "RSSI" — these are universal. +- **Keep placeholders intact.** Strings like `%1$s` or `%d` are filled in at runtime. Do not remove or reorder them unless the grammar of your language requires it. +- **Match tone.** The app uses a friendly, direct voice. Avoid overly formal language. +- **Test if possible.** Switch your device language and open the app to see how translations look in context. + +--- + +## Questions? + +If you have questions about a specific string's context or need help getting started, open a discussion on the [Meshtastic GitHub Discussions](https://github.com/meshtastic/Meshtastic-Android/discussions) page. + +感謝您協助擴展 Meshtastic 的觸及範圍! diff --git a/docs/zh-rTW/user/units-and-locale.md b/docs/zh-rTW/user/units-and-locale.md new file mode 100644 index 000000000..967dd25e6 --- /dev/null +++ b/docs/zh-rTW/user/units-and-locale.md @@ -0,0 +1,118 @@ +--- +title: Units, Measurement & Locale +parent: User Guide +nav_order: 16 +last_updated: 2026-05-12 +--- + +# Units, Measurement & Locale + +The Meshtastic app automatically displays temperatures, distances, speeds, and times in the units your device is configured to use — no settings to change inside the app. + +--- + +## 運作方式 + +Meshtastic radios always transmit data in **metric units** (meters, °C, km/h, hPa, etc.). When the app receives this data, it uses the `MetricFormatter` utility to convert and display values in whatever unit system your device's locale specifies. + +On Android, your measurement preferences are determined by your system **Language & Region** settings. On Desktop (JVM), the app uses the JVM's default `Locale`. + +> **Tip — You never need to toggle units inside the app.** Change your system measurement preferences and every screen in Meshtastic updates automatically — node details, telemetry charts, weather, altitude, and more. + +--- + +## 溫度 + +Temperature values from environment sensors are transmitted as **°C** and displayed based on your device's temperature unit preference. + +![Environment metrics with temperature](/assets/screenshots/nodes_environment_metrics.png) + +| Your Setting | You See | +| ------------ | ------- | +| Celsius | 22°C | +| Fahrenheit | 72°F | + +This affects all temperature displays throughout the app: node environment telemetry, soil temperature, dew point, and telemetry chart axes. + +## Distance & Altitude + +Distances between nodes and GPS altitudes are transmitted as **meters** and automatically scaled and converted. + +![Distance info display](/assets/screenshots/nodes_distance_info.png) + +| Your Setting | Small Distance | Large Distance | 海拔高度 | +| -------------------------------- | -------------- | ---------------------- | -------- | +| 公制(公里/公尺) | 350 m | 2.5 km | 1,200 m | +| Imperial (US) | 1,148 ft | 1.6 mi | 3,937 ft | + +The app uses natural scaling — short distances stay in meters or feet, while longer distances switch to kilometres or miles automatically. + +### Where these appear + +- **Node list** — distance and bearing to each node +- **Node detail** — altitude, distance from your position +- **Map** — waypoint distances, traceroute hop distances +- **Compass** — distance to selected node + +## 速度 + +GPS ground speed is displayed in your locale's preferred speed unit. + +| Your Setting | You See | +| -------------------------------- | ------- | +| 公制(公里/公尺) | 12 km/h | +| Imperial (US) | 7 mph | + +## 風速 + +Wind speed and gust data from environment sensors are transmitted as **m/s** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ------- | +| 公制(公里/公尺) | 5 m/s | +| Imperial (US) | 11 mph | + +Wind readings appear in the **Node Detail** environment section and the **Environment Telemetry** charts. + +## Rainfall + +Rainfall measurements (1-hour and 24-hour totals) are transmitted as **mm** and converted for display. + +| Your Setting | You See | +| -------------------------------- | ---------------------- | +| 公制(公里/公尺) | 12 mm | +| Imperial (US) | 0.5 in | + +## Units That Never Change + +Some units are international standards and are displayed the same way regardless of your locale: + +| Measurement | Unit | Why | +| -------------------------------- | ------------------------------ | ------------------------------------- | +| 氣壓 | hPa | International meteorological standard | +| Heading / bearing | ° (degrees) | Universal navigation convention | +| 輻射 | μR/hr | Standard dosimetry unit | +| GPS coordinates | decimal degrees | Universal geographic standard | +| Humidity, battery, soil moisture | % | Universal | + +## Date & Time + +All timestamps throughout the app — last heard, message times, telemetry logs, chart axes — follow your device's date and time preferences. + +| 設定 | What It Controls | 範例 | +| ---------------- | ---------------- | ------------------------------------------------ | +| **24-Hour Time** | Clock format | 14:30 vs 2:30 PM | +| **Date Format** | Date ordering | 09/05/2026 vs 05/09/2026 | + +The app also uses **relative time** where it makes sense — for example, "5 min ago" or "2 hours ago" in the node list — which is automatically localised into your device language. + +## Changing Your Measurement System (Android) + +On Android, your measurement system (metric vs imperial) is tied to your region setting: + +1. Open **Android Settings → System → Language & Region** +2. Change your **Region** or **Measurement units** preference +3. Return to Meshtastic — values update immediately + +> **Tip — The app uses `MetricFormatter` from `core:common`.** All measurement formatting is handled by a shared KMP utility that respects your platform's locale. Developers adding new measurement displays should use `MetricFormatter` rather than hard-coding unit conversions. + From 3121ea09a3abb43713f0a090dac5147b6ae76f84 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 19 May 2026 10:14:43 -0500 Subject: [PATCH 45/78] docs: update CHANGELOG.md (#5473) --- CHANGELOG.md | 118 ++++++++++++++++----------------------------------- 1 file changed, 36 insertions(+), 82 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a7a11f355..a02b41c4e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,89 +9,34 @@ See [GitHub Releases](https://github.com/meshtastic/Meshtastic-Android/releases) ### Unreleased (not yet in any build) -* chore(deps): update spotless to v8.5.0 (#5458) by @renovate[bot] in [`cfa9206de`](https://github.com/meshtastic/Meshtastic-Android/commit/cfa9206de96fe5323d5882cd0bf59820403c90c1) -* chore(deps): update takpacket.sdk to v0.2.3 (#5464) by @renovate[bot] in [`427471c51`](https://github.com/meshtastic/Meshtastic-Android/commit/427471c51e200a6753c9a1e131ae8fb71e04738c) -* chore: Scheduled updates (Firmware, Hardware, Translations, Graphs) (#5460) by @James Rich in [`b32aa1b9f`](https://github.com/meshtastic/Meshtastic-Android/commit/b32aa1b9f20d4c742a162921a6c22c2546d88861) -* docs: update CHANGELOG.md (#5462) by @github-actions[bot] in [`dc1c93e12`](https://github.com/meshtastic/Meshtastic-Android/commit/dc1c93e12c7df0137dd5125834f7353021156efc) -* fix: TAKPacket-SDK proto ownership and desktop/flatpak CI fixes (#5459) by @James Rich in [`6edac97d5`](https://github.com/meshtastic/Meshtastic-Android/commit/6edac97d5fcee38eabdd43f2898c11873807d78f) -* docs: update CHANGELOG.md (#5456) by @github-actions[bot] in [`d8b183a41`](https://github.com/meshtastic/Meshtastic-Android/commit/d8b183a41408f53c74595e16ac40fc9bb780ec58) -* chore(deps): update ktor to v3.5.0 (#5450) by @renovate[bot] in [`63e8f1587`](https://github.com/meshtastic/Meshtastic-Android/commit/63e8f15872ff0a0ccc4429108f8c1f77567bdbe3) -* chore: Scheduled updates (Firmware, Hardware, Translations, Graphs) (#5455) by @James Rich in [`33184fef9`](https://github.com/meshtastic/Meshtastic-Android/commit/33184fef99befdac1ad7d1aea1706a9e142dba85) -* docs: update CHANGELOG.md (#5453) by @github-actions[bot] in [`6a9391022`](https://github.com/meshtastic/Meshtastic-Android/commit/6a939102213dcbf4bcbc4718f334a28fd0e346e7) -* chore(deps): update com.github.luben:zstd-jni to v1.5.7-8 (#5454) by @renovate[bot] in [`f1c793db5`](https://github.com/meshtastic/Meshtastic-Android/commit/f1c793db5de3df9e987de16ddcda23f3757ba3db) -* feat: TAK v2 protocol integration with zstd compression and full CoT type support (#5434) by @Ben Meadors in [`a04a261b8`](https://github.com/meshtastic/Meshtastic-Android/commit/a04a261b80b7d617447651af1fd67ec623775efa) -* docs: update CHANGELOG.md (#5452) by @github-actions[bot] in [`0ef3072f3`](https://github.com/meshtastic/Meshtastic-Android/commit/0ef3072f3c28a44c1f0e18ad4b1c617aaff706b0) -* chore(deps): update dd.sdk.android to v3.10.0 (#5451) by @renovate[bot] in [`a71ac210f`](https://github.com/meshtastic/Meshtastic-Android/commit/a71ac210f76a28a133056bec4502fc4b0984cb1d) -* docs: update CHANGELOG.md (#5448) by @github-actions[bot] in [`c0b690974`](https://github.com/meshtastic/Meshtastic-Android/commit/c0b69097419a7d9c90527729747fc91135628282) -* chore: Scheduled updates (Firmware, Hardware, Translations, Graphs) (#5438) by @James Rich in [`13865e7c8`](https://github.com/meshtastic/Meshtastic-Android/commit/13865e7c8b7f9a47cd3b572bd44d8ec355b2d3a9) -* chore(deps): update com.juul.kable:kable-core to v0.43.0 (#5449) by @renovate[bot] in [`8d61d22e9`](https://github.com/meshtastic/Meshtastic-Android/commit/8d61d22e93bec5afae021fdf2d64bca58dc57d67) -* chore(deps): batch bump KSP, Wire, CMP, Material (#5447) by @James Rich in [`550c517d7`](https://github.com/meshtastic/Meshtastic-Android/commit/550c517d70ca2ed472ac1a5c3b203c69e12a1707) +* chore: Scheduled updates (Firmware, Hardware, Translations, Graphs) (#5465) by @James Rich in [`83bb1a31f`](https://github.com/meshtastic/Meshtastic-Android/commit/83bb1a31f75bfd2717428f2fed287eb1e830302f) +* chore(deps): update peter-evans/create-pull-request action to v8 (#5493) by @renovate[bot] in [`a141df437`](https://github.com/meshtastic/Meshtastic-Android/commit/a141df437298b039086e9084ec234f925ffa09b2) +* chore(deps): update node to v24 (#5491) by @renovate[bot] in [`cdf57ced8`](https://github.com/meshtastic/Meshtastic-Android/commit/cdf57ced8e9d6a6ce66a88f10da304a41b0ab4c1) +* chore(deps): update compose-multiplatform to v1.3.0-beta01 (#5490) by @renovate[bot] in [`3bfaa466a`](https://github.com/meshtastic/Meshtastic-Android/commit/3bfaa466afc01fe03cc69ba7437610441ba8bcf7) +* fix(ci): disable configuration cache for Dokka build (#5492) by @James Rich in [`fe2cbae87`](https://github.com/meshtastic/Meshtastic-Android/commit/fe2cbae8756c4af9f1daacd842ab0fde097ffab6) +* docs: comprehensive accuracy audit and CI fix (#5489) by @James Rich in [`ece771edb`](https://github.com/meshtastic/Meshtastic-Android/commit/ece771edb06f0110050baac322a093214b89f6c8) +* chore(deps): update actions/setup-java action to v5 (#5484) by @renovate[bot] in [`bbdc4a300`](https://github.com/meshtastic/Meshtastic-Android/commit/bbdc4a300406ae417ad7a70fb4cdd826debb5cb3) +* chore(deps): update actions/upload-pages-artifact action to v5 (#5487) by @renovate[bot] in [`4afa1a032`](https://github.com/meshtastic/Meshtastic-Android/commit/4afa1a032fc465464e7408ef36d0505876ce9d61) +* chore(deps): update gradle/actions action to v6 (#5488) by @renovate[bot] in [`21993b6cc`](https://github.com/meshtastic/Meshtastic-Android/commit/21993b6cc7eba8776262c3805942ddc460ab0c5b) +* chore(deps): update actions/setup-node action to v6 (#5486) by @renovate[bot] in [`733cb92ae`](https://github.com/meshtastic/Meshtastic-Android/commit/733cb92aecb51deab11edb2e9c3e198f9579304c) +* chore(deps): update io.nlopez.compose.rules:detekt to v0.5.9 (#5485) by @renovate[bot] in [`4eb7ed8fe`](https://github.com/meshtastic/Meshtastic-Android/commit/4eb7ed8fe0853850a8056524403d4da3d8c36de3) +* chore(deps): update actions/github-script action to v9 (#5483) by @renovate[bot] in [`f8a5f894a`](https://github.com/meshtastic/Meshtastic-Android/commit/f8a5f894a86b6145b86143888f7ea1fe3d9ccbb6) +* chore(deps): update actions/deploy-pages action to v5 (#5482) by @renovate[bot] in [`d7cccd0db`](https://github.com/meshtastic/Meshtastic-Android/commit/d7cccd0dba442d8c8892a4aac8124f565563434a) +* chore(deps): update actions/checkout action to v6 (#5481) by @renovate[bot] in [`2e484e219`](https://github.com/meshtastic/Meshtastic-Android/commit/2e484e219c132b89597ffa939e1801765a5d5352) +* feat(docs): In-app documentation browser with Jekyll site and Docusaurus sync (#5445) by @James Rich in [`fc0df1a79`](https://github.com/meshtastic/Meshtastic-Android/commit/fc0df1a79ad1d8ce355803f5ac6eb4a1f2ec78c3) +* feat: adopt Material 3 Expressive design system (M3-native APIs only) (#5479) by @James Rich in [`f5128798a`](https://github.com/meshtastic/Meshtastic-Android/commit/f5128798a808219a28e9ee0916c079edcb203744) +* chore(deps): update core/proto/src/main/proto digest to 59cb394 (#5480) by @renovate[bot] in [`72436e70b`](https://github.com/meshtastic/Meshtastic-Android/commit/72436e70bc1db9373581bc53e8cc62548e596744) +* fix(nav): remote admin nodenum + Nav3 consolidation and improvements (#5478) by @James Rich in [`df4f10c4d`](https://github.com/meshtastic/Meshtastic-Android/commit/df4f10c4d64a273688aa9dbe5284ac3737756310) +* chore(deps): update markdownrenderer to v0.41.0 (#5471) by @renovate[bot] in [`f6587a123`](https://github.com/meshtastic/Meshtastic-Android/commit/f6587a12364cc490b5872ed7bc77cfeed9e414a6) +* fix(settings): add input validation for BLE PIN, LoRa modem, and ambient lighting (#5477) by @James Rich in [`1dd47bc09`](https://github.com/meshtastic/Meshtastic-Android/commit/1dd47bc09032fe0972af7eed6a7554e61be7a02b) +* refactor(build): rename entry modules and remove DESKTOP_ONLY mode (#5476) by @James Rich in [`f4b6b02ac`](https://github.com/meshtastic/Meshtastic-Android/commit/f4b6b02acecdd8855408db7d92757f2495fbc11f) +* ci: remove desktop build job from reusable-check to cut macOS runner costs (#5475) by @James Rich in [`d24fc9ac9`](https://github.com/meshtastic/Meshtastic-Android/commit/d24fc9ac9245b69718e2cb2a6c3a872e36d8c28c) +* fix(database): make withDb retry logic resilient to varying close messages (#5474) by @James Rich in [`057d5bb77`](https://github.com/meshtastic/Meshtastic-Android/commit/057d5bb778a72cf4359abc7fae904d587cdc90a2) +* chore(deps): update wire to v6.4.0 (#5466) by @renovate[bot] in [`f0e12695b`](https://github.com/meshtastic/Meshtastic-Android/commit/f0e12695bbf3df16b043476ff98856b727d6a2f7) +* chore(deps): update spotless to v8.5.1 (#5468) by @renovate[bot] in [`c91219d8b`](https://github.com/meshtastic/Meshtastic-Android/commit/c91219d8b0411975c059c7a5ae6eb370386954f6) +* chore(deps): update vico to v3.2.0-next.5 (#5470) by @renovate[bot] in [`4bacff81c`](https://github.com/meshtastic/Meshtastic-Android/commit/4bacff81c5abad536b40f7370ae5d302b74a11fe) -### Internal (v2.7.14-internal.91) -Changes since [`v2.7.14-open.8`](https://github.com/meshtastic/Meshtastic-Android/releases/tag/v2.7.14-open.8): - -* docs: update CHANGELOG.md (#5437) by @github-actions[bot] in [`fc8f3bff3`](https://github.com/meshtastic/Meshtastic-Android/commit/fc8f3bff3c9e582ea1f434a760981ee523a25262) -* refactor: use immutable destNum in RadioConfigViewModel (#5436) by @James Rich in [`1976808a3`](https://github.com/meshtastic/Meshtastic-Android/commit/1976808a361942f2c358329807d3605b8898e36d) -* docs: update CHANGELOG.md (#5431) by @github-actions[bot] in [`57b0200b6`](https://github.com/meshtastic/Meshtastic-Android/commit/57b0200b6123e87f5037b12128411b69eee2ad23) -* Flatpak: Add Maven/Gradle mirror URLs (#5433) by @Austin in [`ada16f4f5`](https://github.com/meshtastic/Meshtastic-Android/commit/ada16f4f5f2e859624ad8588ff07cdbff945aac0) -* fix: update screenshots (#5435) by @James Rich in [`cf0a7cdab`](https://github.com/meshtastic/Meshtastic-Android/commit/cf0a7cdabff85e97accf4522709dfcb0fd5d4298) -* chore: clean up brownfield specs and migrate to timestamp naming (#5432) by @James Rich in [`73469b415`](https://github.com/meshtastic/Meshtastic-Android/commit/73469b415e742a6601790b9574e1cf8a4a43a52c) -* revert: Update retry settings in gradle-wrapper.properties (#5430) by @James Rich in [`ff9d6881c`](https://github.com/meshtastic/Meshtastic-Android/commit/ff9d6881c01b8e9ec7654179bfa559e93bea9974) -* docs: update CHANGELOG.md (#5427) by @github-actions[bot] in [`1b902ba07`](https://github.com/meshtastic/Meshtastic-Android/commit/1b902ba07c7a6f5b41bba9f4cb439e7de0925e4c) -* chore(deps): update gradle to v9.5.1 (#5429) by @renovate[bot] in [`010ff358d`](https://github.com/meshtastic/Meshtastic-Android/commit/010ff358d0cf5c586b557af186ffdd1ef719be81) -* fix: clarify position precision as ± radius (#5428) by @James Rich in [`dcb147163`](https://github.com/meshtastic/Meshtastic-Android/commit/dcb147163c3a5c8dada885ee6e84790fcc24f651) -* fix(desktop): keep Vico package to prevent bytecode verification errors (#5424) by @James Rich in [`ab4589c06`](https://github.com/meshtastic/Meshtastic-Android/commit/ab4589c06a849743268f926bbe52723c833add3d) -* build: conditionalize JitPack repository for desktop-only builds (#5426) by @James Rich in [`fcf0b5074`](https://github.com/meshtastic/Meshtastic-Android/commit/fcf0b507461796ff2e84265de728283ed5537073) -* docs: update CHANGELOG.md (#5422) by @github-actions[bot] in [`3bfc66eb2`](https://github.com/meshtastic/Meshtastic-Android/commit/3bfc66eb29c438c3f2d68a9225eba9fb3d2c2e25) -* fix: enhance uniqueness check for Flatpak source files in release workflow. (#5423) by @Austin in [`a2dd4d18a`](https://github.com/meshtastic/Meshtastic-Android/commit/a2dd4d18aab2ed1a9000e4ac3ed53260658a4734) -* chore(deps): update core/proto/src/main/proto digest to 1c62540 (#5421) by @renovate[bot] in [`05b1ea918`](https://github.com/meshtastic/Meshtastic-Android/commit/05b1ea918ef3f14b48f1777402e645df900dd337) -* docs: update CHANGELOG.md (#5420) by @github-actions[bot] in [`827535ad4`](https://github.com/meshtastic/Meshtastic-Android/commit/827535ad45778e1eb5b369be70c955b300678a37) -* fix: clamp future lastHeard timestamps to current time on ingestion (#5418) by @James Rich in [`0f2b1c064`](https://github.com/meshtastic/Meshtastic-Android/commit/0f2b1c064aa9b77685ac8a7d05fe81af89655027) -* fix(ci): resolve flatpak source merge race condition (#5419) by @James Rich in [`6f42f0788`](https://github.com/meshtastic/Meshtastic-Android/commit/6f42f078878258b334ae5b234c08caf76d2fa817) -* docs: update CHANGELOG.md (#5417) by @github-actions[bot] in [`b96515e7d`](https://github.com/meshtastic/Meshtastic-Android/commit/b96515e7d048a0850f29cc5381326fd796a07e2c) -* chore: Scheduled updates (Firmware, Hardware, Translations, Graphs) (#5416) by @James Rich in [`09a0d123b`](https://github.com/meshtastic/Meshtastic-Android/commit/09a0d123bed0e79415a8297c5cba92bab636d79e) -* chore(deps): update core/proto/src/main/proto digest to 1c62540 (#5413) by @renovate[bot] in [`56077db6d`](https://github.com/meshtastic/Meshtastic-Android/commit/56077db6d93fd76ca2fa585f49eb63d2e91ad400) -* chore(deps): update actions/checkout action to v6 (#5414) by @renovate[bot] in [`d4ff10ef3`](https://github.com/meshtastic/Meshtastic-Android/commit/d4ff10ef3b1551637e016e1f4bee4e5c2a98d645) -* Actions: fix Flatpak source file patterns for jq (#5415) by @Austin in [`1c418a57e`](https://github.com/meshtastic/Meshtastic-Android/commit/1c418a57ea09b0c6af6fde22e9d0ddee16b53e7a) -* docs: update CHANGELOG.md (#5412) by @github-actions[bot] in [`bce8bba90`](https://github.com/meshtastic/Meshtastic-Android/commit/bce8bba90a74bdc64353e28b5abeb11474017b74) -* feat: add Compose Preview Screenshot Testing infrastructure (#5410) by @James Rich in [`85c840de3`](https://github.com/meshtastic/Meshtastic-Android/commit/85c840de32096a00aa7fac42fca0d3a5417d3961) -* fix(ci): prevent literal 'false' task name in desktop release build (#5411) by @James Rich in [`7202994ab`](https://github.com/meshtastic/Meshtastic-Android/commit/7202994abee99dc16a54f38d34a7607c2a573663) -* docs: update CHANGELOG.md (#5409) by @github-actions[bot] in [`1373bd330`](https://github.com/meshtastic/Meshtastic-Android/commit/1373bd330b4829ac29d37b0e1e088d21b66dc037) -* feat(api): add hasAnyEntries method to local data sources and improve… (#5406) by @James Rich in [`10c5b5db2`](https://github.com/meshtastic/Meshtastic-Android/commit/10c5b5db2e5b23c52a3a5689205bfc42285b7b0a) -* Update notification intents and deep link URI format (#5408) by @James Rich in [`82135df86`](https://github.com/meshtastic/Meshtastic-Android/commit/82135df865c4595d3ee509ac3535b86e343874b6) -* docs: update CHANGELOG.md (#5399) by @github-actions[bot] in [`fd0e2c090`](https://github.com/meshtastic/Meshtastic-Android/commit/fd0e2c0904d21df2a962bd18ee138afabf869e98) -* chore(deps): update core/proto/src/main/proto digest to 1c62540 (#5404) by @renovate[bot] in [`d84781848`](https://github.com/meshtastic/Meshtastic-Android/commit/d847818487787a854b59e06e29b7831aef45b514) -* chore(deps): update ruby to v4.0.4 (#5407) by @renovate[bot] in [`84cc8ad0d`](https://github.com/meshtastic/Meshtastic-Android/commit/84cc8ad0debf620c614617cf32fcce971d48a87d) -* chore: Scheduled updates (Firmware, Hardware, Translations, Graphs) (#5400) by @James Rich in [`313dc1c2f`](https://github.com/meshtastic/Meshtastic-Android/commit/313dc1c2f7734284a2c6822e2a62dc10c597bfb1) -* fix: graceful HTTP error handling in scheduled-updates workflow (#5405) by @Copilot in [`b33738728`](https://github.com/meshtastic/Meshtastic-Android/commit/b337387287c8c4e0e3ec3c48cbf19ca39de1ea36) -* feat(desktop): fix mac notifications, new desktop icons (#5403) by @James Rich in [`c77e03c5c`](https://github.com/meshtastic/Meshtastic-Android/commit/c77e03c5c1b49d9ce6684042dca684fca68a1e99) -* Brownfield gap remediation: 28 tasks + intro commonMain migration (#5401) by @James Rich in [`95c3bc0bc`](https://github.com/meshtastic/Meshtastic-Android/commit/95c3bc0bce4a0d30228d9c411c76cedb818afc91) -* ci: disable Flatpak source generation for PR and merge queue checks (#5402) by @James Rich in [`6eacee626`](https://github.com/meshtastic/Meshtastic-Android/commit/6eacee626b42133c742d8ca935590d7a4c94e3ee) -* chore(deps): update core/proto/src/main/proto digest to b302d92 (#5398) by @renovate[bot] in [`f89fdaf99`](https://github.com/meshtastic/Meshtastic-Android/commit/f89fdaf99dccb46517458e7fecf840bcc9c86f44) -* docs: update CHANGELOG.md (#5387) by @github-actions[bot] in [`8c0ced2ad`](https://github.com/meshtastic/Meshtastic-Android/commit/8c0ced2adcbd7a93aba109aeaab7405df57b03dd) -* Gradle: Add flatpakGradleGenerator task (#5369) by @Austin in [`484518195`](https://github.com/meshtastic/Meshtastic-Android/commit/484518195e7dbf980de6b951410f23ebac11c237) -* chore(deps): update core/proto/src/main/proto digest to 03eb534 (#5397) by @renovate[bot] in [`2d5bcc1e5`](https://github.com/meshtastic/Meshtastic-Android/commit/2d5bcc1e5093f21dbd73befe6dcfad4dac6b1cb6) -* Release: Add MacOS ReleaseUberJar target (#5389) by @Austin in [`234a78a56`](https://github.com/meshtastic/Meshtastic-Android/commit/234a78a5640eb3979172b8523d49a1b35750e49c) -* chore(deps): update vico to v3.2.0-next.4 (#5395) by @renovate[bot] in [`39c765c63`](https://github.com/meshtastic/Meshtastic-Android/commit/39c765c63e35afafb1b788d4ca3150b35c814348) -* chore(deps): update fastlane to v2.234.0 (#5396) by @renovate[bot] in [`880e98abf`](https://github.com/meshtastic/Meshtastic-Android/commit/880e98abf05300a01f678bdee472b22b52d78058) -* chore(deps): update org.jetbrains.kotlinx:kotlinx-datetime to v0.8.0-0.6.x-compat (#5382) by @renovate[bot] in [`879e147ef`](https://github.com/meshtastic/Meshtastic-Android/commit/879e147ef0a018b9d7b5214b70ec8e36a80e3d11) -* chore(deps): update kotlinx.coroutines.android to v1.11.0 (#5393) by @renovate[bot] in [`78f9a8940`](https://github.com/meshtastic/Meshtastic-Android/commit/78f9a8940cdf4cbd83d78796ccc3a8aef4c4e5ac) -* chore: Scheduled updates (Firmware, Hardware, Translations, Graphs) (#5383) by @James Rich in [`443de4a34`](https://github.com/meshtastic/Meshtastic-Android/commit/443de4a34d54d33a8e7d7ec46606b5fa70921a36) -* docs: Update specs and governance for Android M3 accessibility (#5392) by @James Rich in [`0d195ead5`](https://github.com/meshtastic/Meshtastic-Android/commit/0d195ead53d5f88f73e581a7ee005f65bdceccfa) -* docs(specs): add feature specs for discovery, node-list-layout, and app-docs (#5388) by @James Rich in [`c0d95d6ac`](https://github.com/meshtastic/Meshtastic-Android/commit/c0d95d6ac4196fcbc705f2d3f174c7d9c46a77b2) -* chore(deps): update com.google.firebase:firebase-bom to v34.13.0 (#5385) by @renovate[bot] in [`934e687bc`](https://github.com/meshtastic/Meshtastic-Android/commit/934e687bc5c14b605797d2ca8f78c231fdfd5210) -* docs: comprehensive copilot instructions & spec-kit setup (#5386) by @James Rich in [`031f25ced`](https://github.com/meshtastic/Meshtastic-Android/commit/031f25cedaf994b09bff014245ee8ab448aafa2a) -* docs: update CHANGELOG.md (#5381) by @github-actions[bot] in [`aeff0a6ce`](https://github.com/meshtastic/Meshtastic-Android/commit/aeff0a6ce1b3a61669d55029ee04863c94711bc6) -* chore: Scheduled updates (Firmware, Hardware, Translations, Graphs) (#5378) by @James Rich in [`924f8a507`](https://github.com/meshtastic/Meshtastic-Android/commit/924f8a507b257829ec15ac446ff31c26f1ecb6ac) -* chore(deps): update aboutlibraries to v14.2.0 (#5380) by @renovate[bot] in [`d68aada1b`](https://github.com/meshtastic/Meshtastic-Android/commit/d68aada1ba9142efd088d9e205341322e267936d) -* docs: update CHANGELOG.md (#5377) by @github-actions[bot] in [`3dd985d7d`](https://github.com/meshtastic/Meshtastic-Android/commit/3dd985d7dfaa53891eca4dcdc90f0330044d5106) -* refactor(firmware): replace PlatformBackHandler with NavigationBackHandler (#5376) by @James Rich in [`213c38051`](https://github.com/meshtastic/Meshtastic-Android/commit/213c380514438e1e208f0a0439437d6e62b041f1) -* docs: update CHANGELOG.md (#5374) by @github-actions[bot] in [`8d621bc6f`](https://github.com/meshtastic/Meshtastic-Android/commit/8d621bc6f48e167c3bdda1add22e2938dadf0bd5) -* chore(deps): update paging to v3.5.0 (#5375) by @renovate[bot] in [`0b75fd414`](https://github.com/meshtastic/Meshtastic-Android/commit/0b75fd4140ed5643806fc8f1a6eb8c3dfaaeb049) -* chore(deps): update compose-multiplatform to v1.11.1 (#5371) by @renovate[bot] in [`d28d684d0`](https://github.com/meshtastic/Meshtastic-Android/commit/d28d684d054fa1d82ec84ed0c2ecb3ddf4705766) -* chore(deps): update androidx.camera.viewfinder:viewfinder-compose to v1.6.1 (#5370) by @renovate[bot] in [`2f2a71587`](https://github.com/meshtastic/Meshtastic-Android/commit/2f2a71587dd5ff36da025e5761159ff182371b81) - -### Open Beta (v2.7.14-open.8) +### Open Beta (v2.7.14-open.9) Changes since [`v2.7.13`](https://github.com/meshtastic/Meshtastic-Android/releases/tag/v2.7.13): #### 🏗️ Features @@ -172,6 +117,12 @@ Changes since [`v2.7.13`](https://github.com/meshtastic/Meshtastic-Android/relea * fix(connections): improve BLE scan reliability and UI lifecycle by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5329 * feat: event firmware easter egg with ambient branding by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5354 * feat: align theme with Design Standards v1.3, remove contrast setting by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5355 +* feat(desktop): fix mac notifications, new desktop icons by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5403 +* Update notification intents and deep link URI format by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5408 +* fix: clarify position precision as ± radius by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5428 +* feat: TAK v2 protocol integration with zstd compression and full CoT type support by @thebentern in https://github.com/meshtastic/Meshtastic-Android/pull/5434 +#### 🖥️ Desktop +* fix(desktop): keep Vico package to prevent bytecode verification errors by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5424 #### 🛠️ Fixes * fix(strings): replace plurals by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4596 * fix: replace fdroid map_style_selection string by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4598 @@ -277,6 +228,9 @@ Changes since [`v2.7.13`](https://github.com/meshtastic/Meshtastic-Android/relea * fix(data): default new-node notifications off for event firmware by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5323 * fix(network): resolve empty MQTT address and enforce TLS on default server by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5333 * fix(mqtt): harden TLS enforcement, add user CA trust, and improve error diagnostics by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5365 +* fix: clamp future lastHeard timestamps to current time on ingestion by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5418 +* revert: Update retry settings in gradle-wrapper.properties by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5430 +* fix: update screenshots by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5435 #### 📝 Other Changes * refactor(ui): compose resources, domain layer by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4628 * Add per-message transport method icons for new message format by @Kealper in https://github.com/meshtastic/Meshtastic-Android/pull/4643 From 418861d356f1edf5ac0c4b00f3bfc761ad34e609 Mon Sep 17 00:00:00 2001 From: James Rich <2199651+jamesarich@users.noreply.github.com> Date: Tue, 19 May 2026 11:53:09 -0500 Subject: [PATCH 46/78] fix(docs): use locale subdirectory inside files/ instead of qualifier (#5494) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- feature/docs/build.gradle.kts | 8 ++++---- .../org/meshtastic/feature/docs/data/DocBundleLoader.kt | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/feature/docs/build.gradle.kts b/feature/docs/build.gradle.kts index 58406478f..1f1a72b72 100644 --- a/feature/docs/build.gradle.kts +++ b/feature/docs/build.gradle.kts @@ -112,7 +112,7 @@ val syncTranslatedDocsToComposeResources by group = "docs" val docsDir = rootProject.layout.projectDirectory.dir("docs") - val targetBase = layout.projectDirectory.dir("src/commonMain/composeResources") + val targetBase = layout.projectDirectory.dir("src/commonMain/composeResources/files") from(docsDir) { // Crowdin outputs dirs in Android qualifier format (fr, pt-rBR, zh-rCN) @@ -126,14 +126,14 @@ val syncTranslatedDocsToComposeResources by into(targetBase) - // Crowdin %android_code% already outputs CMP qualifier format (pt-rBR), - // so we just need to prepend "files-" and nest under docs/ + // Crowdin %android_code% already outputs CMP qualifier format (pt-rBR). + // Locale goes as a subdirectory *inside* files/ (CMP doesn't support qualifiers on files/). eachFile { val segments = relativePath.segments if (segments.size >= 3) { val qualifier = segments[0] val rest = segments.drop(1).joinToString("/") - path = "files-$qualifier/docs/$rest" + path = "$qualifier/docs/$rest" } } includeEmptyDirs = false diff --git a/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/data/DocBundleLoader.kt b/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/data/DocBundleLoader.kt index baeb10af1..20af93b8c 100644 --- a/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/data/DocBundleLoader.kt +++ b/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/data/DocBundleLoader.kt @@ -142,7 +142,7 @@ class DefaultDocBundleLoader : DocBundleLoader { // Try qualifiers in specificity order (mirrors Android resource resolution): // "pt-rBR" → "pt" → give up for (qualifier in localeQualifiers(locale)) { - val localePath = "files-$qualifier/docs/$section/${page.id}.md" + val localePath = "files/$qualifier/docs/$section/${page.id}.md" try { val bytes = Res.readBytes(localePath) return stripFrontmatter(bytes.decodeToString()) @@ -162,7 +162,7 @@ class DefaultDocBundleLoader : DocBundleLoader { DocSection.DeveloperGuide -> "developer" } return localeQualifiers(locale).any { qualifier -> - val localePath = "files-$qualifier/docs/$section/${page.id}.md" + val localePath = "files/$qualifier/docs/$section/${page.id}.md" try { Res.readBytes(localePath) true From 228765a159b6f1498566d3fe6005f91b470761b4 Mon Sep 17 00:00:00 2001 From: James Rich <2199651+jamesarich@users.noreply.github.com> Date: Tue, 19 May 2026 13:00:45 -0500 Subject: [PATCH 47/78] fix(ci): unblock Dokka documentation generation (#5496) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .gitignore | 6 +++--- .../org/meshtastic/app/di/GoogleAiModule.kt | 3 ++- .../src/main/kotlin/RootConventionPlugin.kt | 9 ++++++++- .../org/meshtastic/buildlogic/KotlinAndroid.kt | 16 ++++++++++++++++ .../core/takserver/TAKMeshIntegration.kt | 2 +- .../docs/translation/DocTranslationCache.kt | 2 +- 6 files changed, 31 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index 77738d14b..faa540dfa 100644 --- a/.gitignore +++ b/.gitignore @@ -70,9 +70,9 @@ firebase-debug.log /kable/ .opencode/ # Synced docs in composeResources (generated from docs/ source by syncDocsToComposeResources task) -feature/docs/src/commonMain/composeResources/files/docs/user/ -feature/docs/src/commonMain/composeResources/files/docs/developer/ -feature/docs/src/commonMain/composeResources/files/docs/assets/ +feature/docs/src/commonMain/composeResources/files/docs/ +# Synced translated docs (generated from docs/{locale}/ by syncTranslatedDocsToComposeResources task) +feature/docs/src/commonMain/composeResources/files/*/docs/ /desktop/bin/ /build-logic/convention/bin/ diff --git a/androidApp/src/google/kotlin/org/meshtastic/app/di/GoogleAiModule.kt b/androidApp/src/google/kotlin/org/meshtastic/app/di/GoogleAiModule.kt index 12e623599..a61c930ad 100644 --- a/androidApp/src/google/kotlin/org/meshtastic/app/di/GoogleAiModule.kt +++ b/androidApp/src/google/kotlin/org/meshtastic/app/di/GoogleAiModule.kt @@ -17,6 +17,7 @@ package org.meshtastic.app.di import android.content.Context +import okio.FileSystem import okio.Path.Companion.toOkioPath import org.koin.core.annotation.Module import org.koin.core.annotation.Single @@ -37,7 +38,7 @@ class GoogleAiModule { @Single fun docTranslationCache(context: Context): DocTranslationCache = - DocTranslationCache(cacheDir = context.cacheDir.toOkioPath()) + DocTranslationCache(cacheDir = context.cacheDir.toOkioPath(), fileSystem = FileSystem.SYSTEM) @Single fun docTranslationService(cache: DocTranslationCache): DocTranslationService = MlKitDocTranslator(cache) } diff --git a/build-logic/convention/src/main/kotlin/RootConventionPlugin.kt b/build-logic/convention/src/main/kotlin/RootConventionPlugin.kt index 140f3eaef..27014599f 100644 --- a/build-logic/convention/src/main/kotlin/RootConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/RootConventionPlugin.kt @@ -37,7 +37,7 @@ class RootConventionPlugin : Plugin { val modules = allModules() apply(plugin = "org.jetbrains.dokka") - configureDokkaAggregation(modules) + configureDokkaAggregation(modules.filter { it !in DOKKA_EXCLUDED_MODULES }) apply(plugin = "org.jetbrains.kotlinx.kover") configureKover() @@ -117,6 +117,13 @@ private val ALL_MODULES_FULL = /** Android-only modules that don't apply the KMP plugin. */ private val ANDROID_ONLY_MODULES = setOf(":androidApp", ":core:api", ":core:barcode", ":feature:widget") +/** + * Modules excluded from Dokka aggregation. :core:proto contains only auto-generated Wire classes (no KDoc value) and + * its TAKPacket-SDK dependency doesn't publish iOS metadata JARs to JitPack, causing + * `transformCommonMainDependenciesMetadata` to fail during Dokka resolution. + */ +private val DOKKA_EXCLUDED_MODULES = setOf(":core:proto") + private fun allModules(): List = ALL_MODULES_FULL /** diff --git a/build-logic/convention/src/main/kotlin/org/meshtastic/buildlogic/KotlinAndroid.kt b/build-logic/convention/src/main/kotlin/org/meshtastic/buildlogic/KotlinAndroid.kt index 5229e42f1..735d5e79a 100644 --- a/build-logic/convention/src/main/kotlin/org/meshtastic/buildlogic/KotlinAndroid.kt +++ b/build-logic/convention/src/main/kotlin/org/meshtastic/buildlogic/KotlinAndroid.kt @@ -122,6 +122,22 @@ internal fun Project.configureKotlinMultiplatform() { } } + // TAKPacket-SDK doesn't publish iOS metadata JARs on JitPack (the .klib exists but + // the metadata .jar returns 404). iOS native compilation resolves fine via .klib, but + // `transformCommonMainDependenciesMetadata` (triggered by Dokka/publishing) fails. + // Exclude the SDK only from the CompilationDependenciesMetadata configs that feed + // the metadata transform — NOT from Implementation/Resolvable configs which feed the + // actual compiler classpath. + val iosMetadataConfigs = setOf( + "iosArm64CompilationDependenciesMetadata", + "iosSimulatorArm64CompilationDependenciesMetadata", + ) + configurations.configureEach { + if (name in iosMetadataConfigs) { + exclude(mapOf("group" to "com.github.meshtastic.TAKPacket-SDK", "module" to "takpacket-sdk")) + } + } + configureMokkery() configureKotlin() } diff --git a/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TAKMeshIntegration.kt b/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TAKMeshIntegration.kt index 4db83f5c3..ce14df9cd 100644 --- a/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TAKMeshIntegration.kt +++ b/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TAKMeshIntegration.kt @@ -509,7 +509,7 @@ class TAKMeshIntegration( """]*/>""", // iTAK camelCase variant """]*>.*?""", ) - .map { Regex(it, RegexOption.DOT_MATCHES_ALL) } + .map { Regex("(?s)$it") } // Strip any attribute with value "???" — unknown/placeholder metadata private val UNKNOWN_ATTR_PATTERN = Regex("""\s+\w+\s*=\s*"[?]{3}"""") diff --git a/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/translation/DocTranslationCache.kt b/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/translation/DocTranslationCache.kt index 690a03810..51f74047f 100644 --- a/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/translation/DocTranslationCache.kt +++ b/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/translation/DocTranslationCache.kt @@ -33,7 +33,7 @@ import okio.buffer */ class DocTranslationCache( private val cacheDir: Path, - private val fileSystem: FileSystem = FileSystem.SYSTEM, + private val fileSystem: FileSystem, private val maxCacheSizeBytes: Long = MAX_CACHE_SIZE_BYTES, ) { companion object { From 619897de85616eb9bebedf850970abd24571f705 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 19 May 2026 13:01:05 -0500 Subject: [PATCH 48/78] chore(deps): update compose-multiplatform to v1.11.2 (#5497) --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 70009a10c..796019ff7 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -46,7 +46,7 @@ compose-multiplatform-material3 = "1.11.0-alpha07" # current `compose-multiplatform` release maps to (see CMP release notes). # AndroidCompose.kt's resolutionStrategy force-aligns these groups to *this* version # at resolution time, so it is the source of truth for the Android target. -androidx-compose-bom-aligned = "1.11.1" +androidx-compose-bom-aligned = "1.11.2" # `androidx-compose-material` (M2) is independent of CMP. Pinned because # maps-compose-widgets requests `androidx.compose.material:material` without # a version (relying on a BOM that we exclude). M2 is frozen at 1.7.8. From 51d2c7b15cf1b3520cfbef13b8dbcff0b72748e4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 19 May 2026 13:24:33 -0500 Subject: [PATCH 49/78] docs: update CHANGELOG.md (#5495) --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a02b41c4e..2af7e69b4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,10 @@ See [GitHub Releases](https://github.com/meshtastic/Meshtastic-Android/releases) ### Unreleased (not yet in any build) +* chore(deps): update compose-multiplatform to v1.11.2 (#5497) by @renovate[bot] in [`619897de8`](https://github.com/meshtastic/Meshtastic-Android/commit/619897de85616eb9bebedf850970abd24571f705) +* fix(ci): unblock Dokka documentation generation (#5496) by @James Rich in [`228765a15`](https://github.com/meshtastic/Meshtastic-Android/commit/228765a159b6f1498566d3fe6005f91b470761b4) +* fix(docs): use locale subdirectory inside files/ instead of qualifier (#5494) by @James Rich in [`418861d35`](https://github.com/meshtastic/Meshtastic-Android/commit/418861d356f1edf5ac0c4b00f3bfc761ad34e609) +* docs: update CHANGELOG.md (#5473) by @github-actions[bot] in [`3121ea09a`](https://github.com/meshtastic/Meshtastic-Android/commit/3121ea09a3abb43713f0a090dac5147b6ae76f84) * chore: Scheduled updates (Firmware, Hardware, Translations, Graphs) (#5465) by @James Rich in [`83bb1a31f`](https://github.com/meshtastic/Meshtastic-Android/commit/83bb1a31f75bfd2717428f2fed287eb1e830302f) * chore(deps): update peter-evans/create-pull-request action to v8 (#5493) by @renovate[bot] in [`a141df437`](https://github.com/meshtastic/Meshtastic-Android/commit/a141df437298b039086e9084ec234f925ffa09b2) * chore(deps): update node to v24 (#5491) by @renovate[bot] in [`cdf57ced8`](https://github.com/meshtastic/Meshtastic-Android/commit/cdf57ced8e9d6a6ce66a88f10da304a41b0ab4c1) From 92cfbaee9b8819804571ae15fd0815b8ab785bce Mon Sep 17 00:00:00 2001 From: James Rich <2199651+jamesarich@users.noreply.github.com> Date: Tue, 19 May 2026 13:33:25 -0500 Subject: [PATCH 50/78] fix(ci): exclude pre-release tags from docs-release workflow (#5499) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/workflows/docs-release.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/docs-release.yml b/.github/workflows/docs-release.yml index 6aa59308d..3e5160e1a 100644 --- a/.github/workflows/docs-release.yml +++ b/.github/workflows/docs-release.yml @@ -4,6 +4,7 @@ on: push: tags: - 'v*.*.*' + - '!v*-*' permissions: contents: write From 11bc37c96878cd1d9a822c1dad658f43c9be6604 Mon Sep 17 00:00:00 2001 From: James Rich <2199651+jamesarich@users.noreply.github.com> Date: Tue, 19 May 2026 12:06:44 -0700 Subject: [PATCH 51/78] docs: move English sources into docs/en/ locale folder (#5501) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/workflows/docs-governance.yml | 34 ++++---- .../org/meshtastic/buildlogic/DocsTasks.kt | 12 +-- crowdin.yml | 5 +- docs/README.md | 45 +++++++++++ docs/_config.yml | 81 ++++++++++--------- docs/_layouts/locale_page.html | 3 +- docs/{ => en}/developer.md | 0 .../developer/adding-a-feature-module.md | 0 docs/{ => en}/developer/architecture.md | 0 docs/{ => en}/developer/codebase.md | 0 docs/{ => en}/developer/contributing.md | 0 docs/{ => en}/developer/measurement.md | 0 .../developer/navigation-and-deep-links.md | 0 docs/{ => en}/developer/persistence.md | 0 docs/{ => en}/developer/testing.md | 0 docs/{ => en}/developer/transport.md | 0 docs/{ => en}/index.md | 0 docs/{ => en}/translations.md | 0 docs/{ => en}/user.md | 0 docs/{ => en}/user/connections.md | 0 docs/{ => en}/user/desktop.md | 0 docs/{ => en}/user/discovery.md | 0 docs/{ => en}/user/firmware.md | 0 docs/{ => en}/user/map-and-waypoints.md | 0 docs/{ => en}/user/messages-and-channels.md | 0 docs/{ => en}/user/mqtt.md | 0 docs/{ => en}/user/node-metrics.md | 0 docs/{ => en}/user/nodes.md | 0 docs/{ => en}/user/onboarding.md | 0 docs/{ => en}/user/settings-module-admin.md | 0 docs/{ => en}/user/settings-radio-user.md | 0 docs/{ => en}/user/signal-meter.md | 0 docs/{ => en}/user/tak.md | 0 docs/{ => en}/user/telemetry-and-sensors.md | 0 docs/{ => en}/user/translate.md | 0 docs/{ => en}/user/units-and-locale.md | 0 feature/docs/build.gradle.kts | 19 ++--- .../feature/docs/data/DocBundleLoader.kt | 52 ++++++------ scripts/check-doc-coverage.js | 2 +- scripts/check-doc-freshness.js | 2 +- scripts/sync-android-docs.js | 4 +- scripts/validate-doc-links.js | 6 +- 42 files changed, 155 insertions(+), 110 deletions(-) create mode 100644 docs/README.md rename docs/{ => en}/developer.md (100%) rename docs/{ => en}/developer/adding-a-feature-module.md (100%) rename docs/{ => en}/developer/architecture.md (100%) rename docs/{ => en}/developer/codebase.md (100%) rename docs/{ => en}/developer/contributing.md (100%) rename docs/{ => en}/developer/measurement.md (100%) rename docs/{ => en}/developer/navigation-and-deep-links.md (100%) rename docs/{ => en}/developer/persistence.md (100%) rename docs/{ => en}/developer/testing.md (100%) rename docs/{ => en}/developer/transport.md (100%) rename docs/{ => en}/index.md (100%) rename docs/{ => en}/translations.md (100%) rename docs/{ => en}/user.md (100%) rename docs/{ => en}/user/connections.md (100%) rename docs/{ => en}/user/desktop.md (100%) rename docs/{ => en}/user/discovery.md (100%) rename docs/{ => en}/user/firmware.md (100%) rename docs/{ => en}/user/map-and-waypoints.md (100%) rename docs/{ => en}/user/messages-and-channels.md (100%) rename docs/{ => en}/user/mqtt.md (100%) rename docs/{ => en}/user/node-metrics.md (100%) rename docs/{ => en}/user/nodes.md (100%) rename docs/{ => en}/user/onboarding.md (100%) rename docs/{ => en}/user/settings-module-admin.md (100%) rename docs/{ => en}/user/settings-radio-user.md (100%) rename docs/{ => en}/user/signal-meter.md (100%) rename docs/{ => en}/user/tak.md (100%) rename docs/{ => en}/user/telemetry-and-sensors.md (100%) rename docs/{ => en}/user/translate.md (100%) rename docs/{ => en}/user/units-and-locale.md (100%) diff --git a/.github/workflows/docs-governance.yml b/.github/workflows/docs-governance.yml index 4b526c996..a10ed89b8 100644 --- a/.github/workflows/docs-governance.yml +++ b/.github/workflows/docs-governance.yml @@ -39,7 +39,7 @@ jobs: '^feature/.*/src/commonMain/.*/(ui|component|screen)/|^feature/.*/src/androidMain/.*/ui/|^core/ui/src/commonMain/' \ | grep -v 'Test\|Preview\|__Snapshots__' || true) - docs_changed=$(echo "$changed" | grep -E '^docs/(user|developer)/' || true) + docs_changed=$(echo "$changed" | grep -E '^docs/en/(user|developer)/' || true) echo "views_changed<> "$GITHUB_OUTPUT" echo "$views_changed" >> "$GITHUB_OUTPUT" @@ -64,9 +64,9 @@ jobs: const body = [ '## 📄 Docs staleness check — advisory', '', - 'This PR modifies user-facing UI source files but does not update any page under `docs/user/` or `docs/developer/`.', + 'This PR modifies user-facing UI source files but does not update any page under `docs/en/user/` or `docs/en/developer/`.', '', - '> ⚠️ Doc changes propagate to **3 consumers**: in-app docs browser, Jekyll site (GitHub Pages), and meshtastic.org (Docusaurus sync). Updating a page in `docs/` automatically flows to all three.', + '> ⚠️ Doc changes propagate to **3 consumers**: in-app docs browser, Jekyll site (GitHub Pages), and meshtastic.org (Docusaurus sync). Updating a page in `docs/en/` automatically flows to all three.', '', '**Changed source files:**', '```', @@ -76,19 +76,19 @@ jobs: '**What to check:**', '| Changed area | Likely doc page |', '|---|---|', - '| `feature/messaging/` | `docs/user/messages-and-channels.md` |', - '| `feature/node/` | `docs/user/nodes.md` or `docs/user/node-metrics.md` |', - '| `feature/map/` | `docs/user/map-and-waypoints.md` |', - '| `feature/connections/` | `docs/user/connections.md` |', - '| `feature/settings/` | `docs/user/settings-radio-user.md` or `docs/user/settings-module-admin.md` |', - '| `feature/firmware/` | `docs/user/firmware.md` |', - '| `feature/intro/` | `docs/user/onboarding.md` |', - '| `feature/discovery/` | `docs/user/discovery.md` |', + '| `feature/messaging/` | `docs/en/user/messages-and-channels.md` |', + '| `feature/node/` | `docs/en/user/nodes.md` or `docs/en/user/node-metrics.md` |', + '| `feature/map/` | `docs/en/user/map-and-waypoints.md` |', + '| `feature/connections/` | `docs/en/user/connections.md` |', + '| `feature/settings/` | `docs/en/user/settings-radio-user.md` or `docs/en/user/settings-module-admin.md` |', + '| `feature/firmware/` | `docs/en/user/firmware.md` |', + '| `feature/intro/` | `docs/en/user/onboarding.md` |', + '| `feature/discovery/` | `docs/en/user/discovery.md` |', '| `feature/docs/` | Internal docs infrastructure |', - '| `core/ui/` | `docs/developer/codebase.md` or component-specific user pages |', + '| `core/ui/` | `docs/en/developer/codebase.md` or component-specific user pages |', '', '**New page checklist** (if adding a new doc page):', - '1. Create the `.md` file in `docs/user/` or `docs/developer/` with `last_updated` frontmatter', + '1. Create the `.md` file in `docs/en/user/` or `docs/en/developer/` with `last_updated` frontmatter', '2. Register in `DocBundleLoader.kt` with string resources (in-app browser)', '3. Jekyll and Docusaurus sync pick up new pages automatically — no config change needed', '', @@ -141,14 +141,14 @@ jobs: owner: context.repo.owner, repo: context.repo.repo, comment_id: existing.id, - body: '## ✅ Docs staleness check passed\n\nThis PR includes updates to `docs/` alongside the source changes. Thank you!', + body: '## ✅ Docs staleness check passed\n\nThis PR includes updates to `docs/en/` alongside the source changes. Thank you!', }); } - name: Advisory status if: steps.changed.outputs.stale == 'true' run: | - echo "::warning::UI source files changed without corresponding docs/ updates." + echo "::warning::UI source files changed without corresponding docs/en/ updates." echo "Add the 'skip-docs-check' label if this PR does not require a doc update." echo "NOTE: This check is advisory while docs coverage matures across platforms." echo "To upgrade to blocking, change this step to 'exit 1'." @@ -170,7 +170,7 @@ jobs: node-version: "24" - name: Validate internal links - run: node scripts/validate-doc-links.js docs + run: node scripts/validate-doc-links.js docs/en - name: Check doc coverage run: node scripts/check-doc-coverage.js . @@ -179,7 +179,7 @@ jobs: run: | loader="feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/data/DocBundleLoader.kt" missing=0 - for f in docs/user/*.md docs/developer/*.md; do + for f in docs/en/user/*.md docs/en/developer/*.md; do slug=$(basename "$f" .md) if ! grep -q "\"$slug\"" "$loader"; then echo "ERROR: $slug not registered in DocBundleLoader.kt" diff --git a/build-logic/convention/src/main/kotlin/org/meshtastic/buildlogic/DocsTasks.kt b/build-logic/convention/src/main/kotlin/org/meshtastic/buildlogic/DocsTasks.kt index 15cbdca9e..4e9745934 100644 --- a/build-logic/convention/src/main/kotlin/org/meshtastic/buildlogic/DocsTasks.kt +++ b/build-logic/convention/src/main/kotlin/org/meshtastic/buildlogic/DocsTasks.kt @@ -100,9 +100,10 @@ abstract class GenerateDocsBundleTask : DefaultTask() { val indexEntries = mutableListOf() var pageCount = 0 - // Process English user and developer directories + // Process English user and developer directories (under docs/en/) + val enDir = File(src, "en") listOf("user", "developer").forEach { section -> - val sectionDir = File(src, section) + val sectionDir = File(enDir, section) if (!sectionDir.exists()) return@forEach sectionDir.listFiles { f -> f.extension == "md" }?.sortedBy { it.name }?.forEach { mdFile -> @@ -143,8 +144,9 @@ abstract class GenerateDocsBundleTask : DefaultTask() { // Process Crowdin locale directories: docs/{qualifier}/user/*.md // Crowdin %android_code% produces: fr, pt-rBR, zh-rCN, zh-rTW + // Skip "en" since English sources are handled above. val localePattern = Regex("^[a-z]{2,3}(-r[A-Z]{2})?$") - src.listFiles { f -> f.isDirectory && localePattern.matches(f.name) } + src.listFiles { f -> f.isDirectory && localePattern.matches(f.name) && f.name != "en" } ?.sortedBy { it.name } ?.forEach { localeDir -> val locale = localeDir.name @@ -198,7 +200,7 @@ abstract class GenerateDocsBundleTask : DefaultTask() { File(cssDir, "docs.css").writeText(generateCss()) // Write locales manifest (for consumers that need to know available translations) - val localesManifest = src.listFiles { f -> f.isDirectory && localePattern.matches(f.name) } + val localesManifest = src.listFiles { f -> f.isDirectory && localePattern.matches(f.name) && f.name != "en" } ?.map { it.name }?.sorted() ?: emptyList() val manifestFile = File(out, "locales.json") manifestFile.writeText(localesManifest.joinToString(", ", "[", "]") { "\"$it\"" }) @@ -258,7 +260,7 @@ abstract class GenerateDocsBundleTask : DefaultTask() { .replace(Regex("^---[\\s\\S]*?---\\s*", RegexOption.MULTILINE), "") .replace("&", "&").replace("<", "<").replace(">", ">") val dir = if (locale == "ar") "rtl" else "ltr" - // Locale pages are one level deeper: docs/{locale}/user/foo.html vs docs/user/foo.html + // Locale pages are one level deeper: docs/{locale}/user/foo.html vs docs/en/user/foo.html val cssPath = if (locale != "en") "../../styles/docs.css" else "../styles/docs.css" return """ | diff --git a/crowdin.yml b/crowdin.yml index 64a130ca7..6fa9688fe 100644 --- a/crowdin.yml +++ b/crowdin.yml @@ -11,10 +11,11 @@ files: - source: /fastlane/metadata/android/en-US/changelogs/default.txt translation: /fastlane/metadata/android/%locale%/changelogs/%original_file_name% # In-app docs — user guide only (developer guide is English-only) + # English sources live under docs/en/; translations land at docs/{android_code}/ # Uses %android_code% to output Android/CMP qualifier format directly (pt-rBR, zh-rCN, fr) - - source: /docs/user/*.md + - source: /docs/en/user/*.md translation: /docs/%android_code%/user/%original_file_name% type: md - - source: /docs/index.md + - source: /docs/en/index.md translation: /docs/%android_code%/%original_file_name% type: md diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 000000000..35461fd8d --- /dev/null +++ b/docs/README.md @@ -0,0 +1,45 @@ +# Documentation Structure + +This directory contains the source documentation for the Meshtastic Android/Desktop/iOS app. +It serves three consumers: + +1. **In-app docs browser** — bundled via Compose Resources at build time +2. **Jekyll site** — GitHub Pages (this directory is the Jekyll source root) +3. **meshtastic.org** — Docusaurus sync (upstream consumption) + +## Locale Layout + +``` +docs/ +├── _config.yml, _data/, _layouts/, _sass/ ← Jekyll site infrastructure +├── en/ ← English source (edit here) +│ ├── user/ ← User Guide pages +│ ├── developer/ ← Developer Guide pages +│ ├── index.md ← Site home page +│ ├── user.md ← User Guide nav parent +│ ├── developer.md ← Developer Guide nav parent +│ └── translations.md ← Translations landing page +├── fr-rFR/ ← French (Crowdin-generated) +│ └── user/ ← Translated user guide +├── de-rDE/ ← German (Crowdin-generated) +│ └── user/ +└── ... ← Other locales +``` + +## Editing Guidelines + +- **English source**: Edit files under `docs/en/`. These are the authoritative source. +- **Translations**: Do **not** edit files in locale folders directly. They are auto-generated + by [Crowdin](https://crowdin.com/project/meshtastic-android) and will be overwritten on sync. + Contribute translations via Crowdin instead. +- **Adding a page**: Create the `.md` file in `docs/en/user/` or `docs/en/developer/`, then + register it in `feature/docs/.../DocBundleLoader.kt` for in-app bundling. + +## How Translations Work + +1. English source files (`docs/en/user/*.md`) are uploaded to Crowdin as translation sources +2. Volunteers translate via the Crowdin web UI +3. Crowdin PRs land translated files at `docs/{android_code}/user/*.md` (e.g., `fr-rFR`, `pt-rBR`) +4. At build time, the Gradle `syncTranslatedDocsToComposeResources` task bundles them into + locale-qualified Compose Resources for the in-app reader +5. The in-app `DocBundleLoader` tries the user's locale first, then falls back to English diff --git a/docs/_config.yml b/docs/_config.yml index bd7c6dc00..d29e8509e 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -28,12 +28,12 @@ color_scheme: meshtastic # Default front-matter for pages in subdirectories defaults: - scope: - path: "user/" + path: "en/user/" values: parent: User Guide layout: default - scope: - path: "developer/" + path: "en/developer/" values: parent: Developer Guide layout: default @@ -41,229 +41,229 @@ defaults: # They use a dedicated locale layout with a back-link to the English version. # Auto-generated from Android app locales (values-* resource dirs). - scope: - path: "ar/" + path: "ar" values: layout: locale_page locale: ar nav_exclude: true - scope: - path: "be/" + path: "be" values: layout: locale_page locale: be nav_exclude: true - scope: - path: "bg/" + path: "bg" values: layout: locale_page locale: bg nav_exclude: true - scope: - path: "ca/" + path: "ca" values: layout: locale_page locale: ca nav_exclude: true - scope: - path: "cs/" + path: "cs" values: layout: locale_page locale: cs nav_exclude: true - scope: - path: "de/" + path: "de" values: layout: locale_page locale: de nav_exclude: true - scope: - path: "el/" + path: "el" values: layout: locale_page locale: el nav_exclude: true - scope: - path: "es/" + path: "es" values: layout: locale_page locale: es nav_exclude: true - scope: - path: "et/" + path: "et" values: layout: locale_page locale: et nav_exclude: true - scope: - path: "fi/" + path: "fi" values: layout: locale_page locale: fi nav_exclude: true - scope: - path: "fr/" + path: "fr" values: layout: locale_page locale: fr nav_exclude: true - scope: - path: "ga/" + path: "ga" values: layout: locale_page locale: ga nav_exclude: true - scope: - path: "gl/" + path: "gl" values: layout: locale_page locale: gl nav_exclude: true - scope: - path: "he/" + path: "he" values: layout: locale_page locale: he nav_exclude: true - scope: - path: "hr/" + path: "hr" values: layout: locale_page locale: hr nav_exclude: true - scope: - path: "ht/" + path: "ht" values: layout: locale_page locale: ht nav_exclude: true - scope: - path: "hu/" + path: "hu" values: layout: locale_page locale: hu nav_exclude: true - scope: - path: "is/" + path: "is" values: layout: locale_page locale: is nav_exclude: true - scope: - path: "it/" + path: "it" values: layout: locale_page locale: it nav_exclude: true - scope: - path: "ja/" + path: "ja" values: layout: locale_page locale: ja nav_exclude: true - scope: - path: "ko/" + path: "ko" values: layout: locale_page locale: ko nav_exclude: true - scope: - path: "lt/" + path: "lt" values: layout: locale_page locale: lt nav_exclude: true - scope: - path: "nl/" + path: "nl" values: layout: locale_page locale: nl nav_exclude: true - scope: - path: "no/" + path: "no" values: layout: locale_page locale: no nav_exclude: true - scope: - path: "pl/" + path: "pl" values: layout: locale_page locale: pl nav_exclude: true - scope: - path: "pt/" + path: "pt" values: layout: locale_page locale: pt nav_exclude: true - scope: - path: "pt-rBR/" + path: "pt-rBR" values: layout: locale_page locale: pt-rBR nav_exclude: true - scope: - path: "ro/" + path: "ro" values: layout: locale_page locale: ro nav_exclude: true - scope: - path: "ru/" + path: "ru" values: layout: locale_page locale: ru nav_exclude: true - scope: - path: "sk/" + path: "sk" values: layout: locale_page locale: sk nav_exclude: true - scope: - path: "sl/" + path: "sl" values: layout: locale_page locale: sl nav_exclude: true - scope: - path: "sq/" + path: "sq" values: layout: locale_page locale: sq nav_exclude: true - scope: - path: "sr/" + path: "sr" values: layout: locale_page locale: sr nav_exclude: true - scope: - path: "sv/" + path: "sv" values: layout: locale_page locale: sv nav_exclude: true - scope: - path: "tr/" + path: "tr" values: layout: locale_page locale: tr nav_exclude: true - scope: - path: "uk/" + path: "uk" values: layout: locale_page locale: uk nav_exclude: true - scope: - path: "zh-rCN/" + path: "zh-rCN" values: layout: locale_page locale: zh-rCN nav_exclude: true - scope: - path: "zh-rTW/" + path: "zh-rTW" values: layout: locale_page locale: zh-rTW @@ -285,5 +285,6 @@ exclude: - Gemfile - Gemfile.lock - assets/screenshots/.gitkeep + - README.md - "*.sh" diff --git a/docs/_layouts/locale_page.html b/docs/_layouts/locale_page.html index 167e80b09..b8e958245 100644 --- a/docs/_layouts/locale_page.html +++ b/docs/_layouts/locale_page.html @@ -7,7 +7,8 @@ layout: default {% assign page_path = page.path %} {% assign path_parts = page_path | split: "/" %} {% assign remaining_parts = path_parts | slice: 1, path_parts.size %} -{% assign en_path = remaining_parts | join: "/" | replace: ".md", "" %} +{% assign en_relative = remaining_parts | join: "/" | replace: ".md", "" %} +{% assign en_path = "en/" | append: en_relative %}

diff --git a/docs/developer.md b/docs/en/developer.md similarity index 100% rename from docs/developer.md rename to docs/en/developer.md diff --git a/docs/developer/adding-a-feature-module.md b/docs/en/developer/adding-a-feature-module.md similarity index 100% rename from docs/developer/adding-a-feature-module.md rename to docs/en/developer/adding-a-feature-module.md diff --git a/docs/developer/architecture.md b/docs/en/developer/architecture.md similarity index 100% rename from docs/developer/architecture.md rename to docs/en/developer/architecture.md diff --git a/docs/developer/codebase.md b/docs/en/developer/codebase.md similarity index 100% rename from docs/developer/codebase.md rename to docs/en/developer/codebase.md diff --git a/docs/developer/contributing.md b/docs/en/developer/contributing.md similarity index 100% rename from docs/developer/contributing.md rename to docs/en/developer/contributing.md diff --git a/docs/developer/measurement.md b/docs/en/developer/measurement.md similarity index 100% rename from docs/developer/measurement.md rename to docs/en/developer/measurement.md diff --git a/docs/developer/navigation-and-deep-links.md b/docs/en/developer/navigation-and-deep-links.md similarity index 100% rename from docs/developer/navigation-and-deep-links.md rename to docs/en/developer/navigation-and-deep-links.md diff --git a/docs/developer/persistence.md b/docs/en/developer/persistence.md similarity index 100% rename from docs/developer/persistence.md rename to docs/en/developer/persistence.md diff --git a/docs/developer/testing.md b/docs/en/developer/testing.md similarity index 100% rename from docs/developer/testing.md rename to docs/en/developer/testing.md diff --git a/docs/developer/transport.md b/docs/en/developer/transport.md similarity index 100% rename from docs/developer/transport.md rename to docs/en/developer/transport.md diff --git a/docs/index.md b/docs/en/index.md similarity index 100% rename from docs/index.md rename to docs/en/index.md diff --git a/docs/translations.md b/docs/en/translations.md similarity index 100% rename from docs/translations.md rename to docs/en/translations.md diff --git a/docs/user.md b/docs/en/user.md similarity index 100% rename from docs/user.md rename to docs/en/user.md diff --git a/docs/user/connections.md b/docs/en/user/connections.md similarity index 100% rename from docs/user/connections.md rename to docs/en/user/connections.md diff --git a/docs/user/desktop.md b/docs/en/user/desktop.md similarity index 100% rename from docs/user/desktop.md rename to docs/en/user/desktop.md diff --git a/docs/user/discovery.md b/docs/en/user/discovery.md similarity index 100% rename from docs/user/discovery.md rename to docs/en/user/discovery.md diff --git a/docs/user/firmware.md b/docs/en/user/firmware.md similarity index 100% rename from docs/user/firmware.md rename to docs/en/user/firmware.md diff --git a/docs/user/map-and-waypoints.md b/docs/en/user/map-and-waypoints.md similarity index 100% rename from docs/user/map-and-waypoints.md rename to docs/en/user/map-and-waypoints.md diff --git a/docs/user/messages-and-channels.md b/docs/en/user/messages-and-channels.md similarity index 100% rename from docs/user/messages-and-channels.md rename to docs/en/user/messages-and-channels.md diff --git a/docs/user/mqtt.md b/docs/en/user/mqtt.md similarity index 100% rename from docs/user/mqtt.md rename to docs/en/user/mqtt.md diff --git a/docs/user/node-metrics.md b/docs/en/user/node-metrics.md similarity index 100% rename from docs/user/node-metrics.md rename to docs/en/user/node-metrics.md diff --git a/docs/user/nodes.md b/docs/en/user/nodes.md similarity index 100% rename from docs/user/nodes.md rename to docs/en/user/nodes.md diff --git a/docs/user/onboarding.md b/docs/en/user/onboarding.md similarity index 100% rename from docs/user/onboarding.md rename to docs/en/user/onboarding.md diff --git a/docs/user/settings-module-admin.md b/docs/en/user/settings-module-admin.md similarity index 100% rename from docs/user/settings-module-admin.md rename to docs/en/user/settings-module-admin.md diff --git a/docs/user/settings-radio-user.md b/docs/en/user/settings-radio-user.md similarity index 100% rename from docs/user/settings-radio-user.md rename to docs/en/user/settings-radio-user.md diff --git a/docs/user/signal-meter.md b/docs/en/user/signal-meter.md similarity index 100% rename from docs/user/signal-meter.md rename to docs/en/user/signal-meter.md diff --git a/docs/user/tak.md b/docs/en/user/tak.md similarity index 100% rename from docs/user/tak.md rename to docs/en/user/tak.md diff --git a/docs/user/telemetry-and-sensors.md b/docs/en/user/telemetry-and-sensors.md similarity index 100% rename from docs/user/telemetry-and-sensors.md rename to docs/en/user/telemetry-and-sensors.md diff --git a/docs/user/translate.md b/docs/en/user/translate.md similarity index 100% rename from docs/user/translate.md rename to docs/en/user/translate.md diff --git a/docs/user/units-and-locale.md b/docs/en/user/units-and-locale.md similarity index 100% rename from docs/user/units-and-locale.md rename to docs/en/user/units-and-locale.md diff --git a/feature/docs/build.gradle.kts b/feature/docs/build.gradle.kts index 1f1a72b72..a783f88ca 100644 --- a/feature/docs/build.gradle.kts +++ b/feature/docs/build.gradle.kts @@ -59,24 +59,16 @@ kotlin { */ val syncDocsToComposeResources by tasks.registering(Sync::class) { - description = "Syncs docs/ markdown source into composeResources for in-app bundling" + description = "Syncs docs/en/ markdown source into composeResources for in-app bundling" group = "docs" - val docsSourceDir = rootProject.layout.projectDirectory.dir("docs") + val docsEnDir = rootProject.layout.projectDirectory.dir("docs/en") val screenshotsDir = rootProject.layout.projectDirectory.dir("docs/screenshots") val composeResourcesTarget = layout.projectDirectory.dir("src/commonMain/composeResources/files/docs") - from(docsSourceDir) { + from(docsEnDir) { include("user/**/*.md") include("developer/**/*.md") - // Exclude Jekyll/site-only files that are not needed in-app - exclude("_config.yml") - exclude("_data/**") - exclude("_includes/**") - exclude("_layouts/**") - exclude("index.md") - exclude("assets/**") - exclude("Gemfile*") } // FR-038: Bundle screenshots into assets/screenshots/ to match markdown image paths. @@ -117,8 +109,7 @@ val syncTranslatedDocsToComposeResources by from(docsDir) { // Crowdin outputs dirs in Android qualifier format (fr, pt-rBR, zh-rCN) include("*/user/**/*.md") - exclude("user/**") - exclude("developer/**") + exclude("en/**") exclude("_*/**") exclude("assets/**") exclude("screenshots/**") @@ -133,6 +124,8 @@ val syncTranslatedDocsToComposeResources by if (segments.size >= 3) { val qualifier = segments[0] val rest = segments.drop(1).joinToString("/") + // Output: files/{locale}/docs/user/page.md + // English source lives at: docs/en/$rest path = "$qualifier/docs/$rest" } } diff --git a/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/data/DocBundleLoader.kt b/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/data/DocBundleLoader.kt index 20af93b8c..9ea02dbf4 100644 --- a/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/data/DocBundleLoader.kt +++ b/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/data/DocBundleLoader.kt @@ -241,7 +241,7 @@ class DefaultDocBundleLoader : DocBundleLoader { "onboarding", CoreRes.string.doc_title_onboarding, CoreRes.string.doc_keywords_onboarding, - "docs/user/onboarding.html", + "en/user/onboarding.html", 1, listOf("first-launch", "setup", "intro"), 3200, @@ -251,7 +251,7 @@ class DefaultDocBundleLoader : DocBundleLoader { "connections", CoreRes.string.doc_title_connections, CoreRes.string.doc_keywords_connections, - "docs/user/connections.html", + "en/user/connections.html", 2, listOf("bluetooth", "usb", "tcp", "pairing"), 4100, @@ -261,7 +261,7 @@ class DefaultDocBundleLoader : DocBundleLoader { "messages-and-channels", CoreRes.string.doc_title_messages, CoreRes.string.doc_keywords_messages, - "docs/user/messages-and-channels.html", + "en/user/messages-and-channels.html", 3, listOf("channels", "direct-messages", "messaging", "conversations"), 4500, @@ -271,7 +271,7 @@ class DefaultDocBundleLoader : DocBundleLoader { "nodes", CoreRes.string.doc_title_nodes, CoreRes.string.doc_keywords_nodes, - "docs/user/nodes.html", + "en/user/nodes.html", 4, listOf("node-list", "mesh-nodes", "peers"), 3800, @@ -281,7 +281,7 @@ class DefaultDocBundleLoader : DocBundleLoader { "node-metrics", CoreRes.string.doc_title_node_metrics, CoreRes.string.doc_keywords_node_metrics, - "docs/user/node-metrics.html", + "en/user/node-metrics.html", 5, listOf("metrics", "telemetry", "device-metrics", "signal"), 5200, @@ -291,7 +291,7 @@ class DefaultDocBundleLoader : DocBundleLoader { "map-and-waypoints", CoreRes.string.doc_title_map, CoreRes.string.doc_keywords_map, - "docs/user/map-and-waypoints.html", + "en/user/map-and-waypoints.html", 6, listOf("map", "waypoints", "gps", "location"), 3600, @@ -301,7 +301,7 @@ class DefaultDocBundleLoader : DocBundleLoader { "settings-radio-user", CoreRes.string.doc_title_settings_radio, CoreRes.string.doc_keywords_settings_radio, - "docs/user/settings-radio-user.html", + "en/user/settings-radio-user.html", 7, listOf("settings", "radio-config", "user-config", "lora"), 6800, @@ -311,7 +311,7 @@ class DefaultDocBundleLoader : DocBundleLoader { "settings-module-admin", CoreRes.string.doc_title_settings_module, CoreRes.string.doc_keywords_settings_module, - "docs/user/settings-module-admin.html", + "en/user/settings-module-admin.html", 8, listOf("modules", "module-config", "administration"), 5500, @@ -321,7 +321,7 @@ class DefaultDocBundleLoader : DocBundleLoader { "telemetry-and-sensors", CoreRes.string.doc_title_telemetry, CoreRes.string.doc_keywords_telemetry, - "docs/user/telemetry-and-sensors.html", + "en/user/telemetry-and-sensors.html", 9, listOf("sensors", "environment", "weather", "power-metrics"), 4800, @@ -331,7 +331,7 @@ class DefaultDocBundleLoader : DocBundleLoader { "tak", CoreRes.string.doc_title_tak, CoreRes.string.doc_keywords_tak, - "docs/user/tak.html", + "en/user/tak.html", 10, listOf("tak", "atak", "team-awareness-kit"), 2400, @@ -341,7 +341,7 @@ class DefaultDocBundleLoader : DocBundleLoader { "mqtt", CoreRes.string.doc_title_mqtt, CoreRes.string.doc_keywords_mqtt, - "docs/user/mqtt.html", + "en/user/mqtt.html", 11, listOf("mqtt", "internet-bridge", "broker"), 4200, @@ -351,7 +351,7 @@ class DefaultDocBundleLoader : DocBundleLoader { "discovery", CoreRes.string.doc_title_discovery, CoreRes.string.doc_keywords_discovery, - "docs/user/discovery.html", + "en/user/discovery.html", 12, listOf("mesh-discovery", "local-discovery", "network-scan"), 2800, @@ -361,7 +361,7 @@ class DefaultDocBundleLoader : DocBundleLoader { "firmware", CoreRes.string.doc_title_firmware, CoreRes.string.doc_keywords_firmware, - "docs/user/firmware.html", + "en/user/firmware.html", 13, listOf("firmware", "update", "ota", "flash"), 3400, @@ -371,7 +371,7 @@ class DefaultDocBundleLoader : DocBundleLoader { "desktop", CoreRes.string.doc_title_desktop, CoreRes.string.doc_keywords_desktop, - "docs/user/desktop.html", + "en/user/desktop.html", 14, listOf("desktop", "linux", "macos", "windows", "jvm"), 3900, @@ -381,7 +381,7 @@ class DefaultDocBundleLoader : DocBundleLoader { "signal-meter", CoreRes.string.doc_title_signal_meter, CoreRes.string.doc_keywords_signal_meter, - "docs/user/signal-meter.html", + "en/user/signal-meter.html", 15, listOf("signal-quality", "signal-strength", "rssi", "snr"), 3500, @@ -391,7 +391,7 @@ class DefaultDocBundleLoader : DocBundleLoader { "units-and-locale", CoreRes.string.doc_title_units, CoreRes.string.doc_keywords_units, - "docs/user/units-and-locale.html", + "en/user/units-and-locale.html", 16, listOf("measurement", "units", "locale", "metric", "imperial"), 3800, @@ -401,7 +401,7 @@ class DefaultDocBundleLoader : DocBundleLoader { "translate", CoreRes.string.doc_title_translate, CoreRes.string.doc_keywords_translate, - "docs/user/translate.html", + "en/user/translate.html", 17, listOf("crowdin", "localization", "language", "i18n", "contribute"), 3700, @@ -433,7 +433,7 @@ class DefaultDocBundleLoader : DocBundleLoader { "architecture", "Architecture", "developer", - "docs/developer/architecture.html", + "en/developer/architecture.html", 1, listOf("architecture", "kmp", "module", "layer", "core", "feature", "compose"), listOf("layers", "module-architecture", "kmp"), @@ -444,7 +444,7 @@ class DefaultDocBundleLoader : DocBundleLoader { "codebase", "Codebase", "developer", - "docs/developer/codebase.html", + "en/developer/codebase.html", 2, listOf("codebase", "repository", "layout", "gradle", "build", "namespace", "convention"), listOf("repository-layout", "project-structure", "source-code"), @@ -455,7 +455,7 @@ class DefaultDocBundleLoader : DocBundleLoader { "adding-a-feature-module", "Adding a Feature Module", "developer", - "docs/developer/adding-a-feature-module.html", + "en/developer/adding-a-feature-module.html", 3, listOf("module", "feature", "new", "create", "plugin", "di", "koin"), listOf("new-module", "feature-module", "module-guide"), @@ -466,7 +466,7 @@ class DefaultDocBundleLoader : DocBundleLoader { "navigation-and-deep-links", "Navigation & Deep Links", "developer", - "docs/developer/navigation-and-deep-links.html", + "en/developer/navigation-and-deep-links.html", 4, listOf("navigation", "deeplink", "route", "navkey", "backstack", "typed"), listOf("deeplinks", "navigation-3", "routes"), @@ -477,7 +477,7 @@ class DefaultDocBundleLoader : DocBundleLoader { "transport", "Transport", "developer", - "docs/developer/transport.html", + "en/developer/transport.html", 5, listOf("transport", "ble", "serial", "tcp", "radio", "connection"), listOf("ble", "serial", "tcp", "radio-transport"), @@ -488,7 +488,7 @@ class DefaultDocBundleLoader : DocBundleLoader { "persistence", "Persistence", "developer", - "docs/developer/persistence.html", + "en/developer/persistence.html", 6, listOf("room", "database", "datastore", "prefs", "storage", "migration"), listOf("room", "database", "datastore", "prefs"), @@ -499,7 +499,7 @@ class DefaultDocBundleLoader : DocBundleLoader { "testing", "Testing", "developer", - "docs/developer/testing.html", + "en/developer/testing.html", 7, listOf("test", "unit", "screenshot", "compose", "roborazzi", "ci"), listOf("tests", "unit-tests", "screenshot-tests"), @@ -510,7 +510,7 @@ class DefaultDocBundleLoader : DocBundleLoader { "contributing", "Contributing", "developer", - "docs/developer/contributing.html", + "en/developer/contributing.html", 8, listOf("contributing", "pull-request", "branch", "commit", "style", "pr"), listOf("contributing", "pull-request", "branch-naming"), @@ -521,7 +521,7 @@ class DefaultDocBundleLoader : DocBundleLoader { "measurement", "Measurement & Formatting", "developer", - "docs/developer/measurement.html", + "en/developer/measurement.html", 9, listOf("formatter", "metric", "number", "locale", "temperature", "conversion", "api"), listOf("metric-formatter", "number-formatter", "measurement"), diff --git a/scripts/check-doc-coverage.js b/scripts/check-doc-coverage.js index 7bebbaad7..3d73aac5e 100644 --- a/scripts/check-doc-coverage.js +++ b/scripts/check-doc-coverage.js @@ -12,7 +12,7 @@ const path = require("path"); const { forEachDocPage } = require("./lib/frontmatter"); const REPO_ROOT = path.resolve(process.argv[2] || "."); -const DOCS_DIR = path.join(REPO_ROOT, "docs"); +const DOCS_DIR = path.join(REPO_ROOT, "docs", "en"); // Map of feature module directory names to expected doc page slugs. // Modules not listed here are considered internal (no user-facing docs required). diff --git a/scripts/check-doc-freshness.js b/scripts/check-doc-freshness.js index a73c6261a..58099327b 100644 --- a/scripts/check-doc-freshness.js +++ b/scripts/check-doc-freshness.js @@ -13,7 +13,7 @@ const { parseFrontmatter, forEachDocPage } = require("./lib/frontmatter"); const args = process.argv.slice(2); const positional = args.filter(a => !a.startsWith("--")); -const DOCS_DIR = path.resolve(positional[0] || "docs"); +const DOCS_DIR = path.resolve(positional[0] || path.join("docs", "en")); const maxAgeArg = args.find(a => a.startsWith("--max-age-days=")); const MAX_AGE_DAYS = maxAgeArg ? parseInt(maxAgeArg.split("=")[1], 10) : 180; diff --git a/scripts/sync-android-docs.js b/scripts/sync-android-docs.js index b555f87db..8281a5db6 100755 --- a/scripts/sync-android-docs.js +++ b/scripts/sync-android-docs.js @@ -37,8 +37,8 @@ const IMAGE_EXTENSIONS = new Set([".png", ".jpg", ".jpeg", ".gif", ".svg", ".web const ANDROID_REPO_ROOT = positionalArgs.length > 0 ? path.resolve(positionalArgs[0]) : path.resolve(__dirname, ".."); -const SRC_DOCS_DIR = path.join(ANDROID_REPO_ROOT, "docs"); -const SRC_SCREENSHOTS_DIR = path.join(SRC_DOCS_DIR, "assets", "screenshots"); +const SRC_DOCS_DIR = path.join(ANDROID_REPO_ROOT, "docs", "en"); +const SRC_SCREENSHOTS_DIR = path.join(ANDROID_REPO_ROOT, "docs", "assets", "screenshots"); if (!fs.existsSync(SRC_DOCS_DIR)) { console.error(`Error: docs directory not found at ${SRC_DOCS_DIR}`); diff --git a/scripts/validate-doc-links.js b/scripts/validate-doc-links.js index dcd82c39f..1473e2301 100644 --- a/scripts/validate-doc-links.js +++ b/scripts/validate-doc-links.js @@ -11,7 +11,9 @@ const fs = require("fs"); const path = require("path"); const { discoverSlugs, forEachDocPage } = require("./lib/frontmatter"); -const DOCS_DIR = path.resolve(process.argv[2] || "docs"); +const DOCS_DIR = path.resolve(process.argv[2] || path.join("docs", "en")); +// Assets (screenshots) live at docs/ root, not inside the en/ locale folder +const DOCS_ROOT = path.resolve(DOCS_DIR, ".."); const IMAGE_EXTS = new Set([".png", ".jpg", ".jpeg", ".gif", ".svg", ".webp"]); // Collect known page slugs from both sections @@ -64,7 +66,7 @@ forEachDocPage(DOCS_DIR, (filePath, slug, section) => { if (/^https?:/.test(imgPath)) continue; const resolved = imgPath.startsWith("/") - ? path.join(DOCS_DIR, imgPath) + ? path.join(DOCS_ROOT, imgPath) : path.resolve(path.dirname(filePath), imgPath); if (!fs.existsSync(resolved)) { console.log(` ERROR: ${section}/${slug}.md:${lineNum} — missing image '${imgPath}'`); From ae127a1e15bdbbae6395a4c21da6440297cdb13b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 19 May 2026 14:08:59 -0500 Subject: [PATCH 52/78] chore(deps): update org.junit.vintage:junit-vintage-engine to v6.1.0 (#5503) --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 796019ff7..25b7264e3 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -26,7 +26,7 @@ ktlint = "1.7.1" ktfmt = "0.61" kover = "0.9.8" mokkery = "3.3.0" -junit5 = "6.0.3" +junit5 = "6.1.0" junit-platform = "6.0.3" # aligned with junit5 — JUnit Platform uses 1.x scheme kotest = "6.1.11" testRetry = "1.6.4" From 2b76212217122604eeb14ba02ea45d93809773a0 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 19 May 2026 14:11:42 -0500 Subject: [PATCH 53/78] chore(deps): update org.junit.platform:junit-platform-launcher to v6.1.0 (#5502) --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 25b7264e3..cb9ae80cc 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -27,7 +27,7 @@ ktfmt = "0.61" kover = "0.9.8" mokkery = "3.3.0" junit5 = "6.1.0" -junit-platform = "6.0.3" # aligned with junit5 — JUnit Platform uses 1.x scheme +junit-platform = "6.1.0" # aligned with junit5 — JUnit Platform uses 1.x scheme kotest = "6.1.11" testRetry = "1.6.4" turbine = "1.2.1" From 59499e82723bdef4f1116ae5996814d59ab85595 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 19 May 2026 14:11:58 -0500 Subject: [PATCH 54/78] chore(deps): update room to v3.0.0-alpha05 (#5498) --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index cb9ae80cc..b32644cbd 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -13,7 +13,7 @@ lifecycle = "2.10.0" jetbrains-lifecycle = "2.11.0-beta01" navigation3 = "1.1.1" paging = "3.5.0" -room = "3.0.0-alpha04" +room = "3.0.0-alpha05" koin = "4.2.1" koin-plugin = "1.0.0-RC2" From 6c51c1ac18cd61f3ab381335ecada8c9d614b7cb Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 19 May 2026 14:13:00 -0500 Subject: [PATCH 55/78] docs: update CHANGELOG.md (#5500) --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2af7e69b4..e29c63804 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,12 @@ See [GitHub Releases](https://github.com/meshtastic/Meshtastic-Android/releases) ### Unreleased (not yet in any build) +* chore(deps): update room to v3.0.0-alpha05 (#5498) by @renovate[bot] in [`59499e827`](https://github.com/meshtastic/Meshtastic-Android/commit/59499e82723bdef4f1116ae5996814d59ab85595) +* chore(deps): update org.junit.platform:junit-platform-launcher to v6.1.0 (#5502) by @renovate[bot] in [`2b7621221`](https://github.com/meshtastic/Meshtastic-Android/commit/2b76212217122604eeb14ba02ea45d93809773a0) +* chore(deps): update org.junit.vintage:junit-vintage-engine to v6.1.0 (#5503) by @renovate[bot] in [`ae127a1e1`](https://github.com/meshtastic/Meshtastic-Android/commit/ae127a1e15bdbbae6395a4c21da6440297cdb13b) +* docs: move English sources into docs/en/ locale folder (#5501) by @James Rich in [`11bc37c96`](https://github.com/meshtastic/Meshtastic-Android/commit/11bc37c96878cd1d9a822c1dad658f43c9be6604) +* fix(ci): exclude pre-release tags from docs-release workflow (#5499) by @James Rich in [`92cfbaee9`](https://github.com/meshtastic/Meshtastic-Android/commit/92cfbaee9b8819804571ae15fd0815b8ab785bce) +* docs: update CHANGELOG.md (#5495) by @github-actions[bot] in [`51d2c7b15`](https://github.com/meshtastic/Meshtastic-Android/commit/51d2c7b15cf1b3520cfbef13b8dbcff0b72748e4) * chore(deps): update compose-multiplatform to v1.11.2 (#5497) by @renovate[bot] in [`619897de8`](https://github.com/meshtastic/Meshtastic-Android/commit/619897de85616eb9bebedf850970abd24571f705) * fix(ci): unblock Dokka documentation generation (#5496) by @James Rich in [`228765a15`](https://github.com/meshtastic/Meshtastic-Android/commit/228765a159b6f1498566d3fe6005f91b470761b4) * fix(docs): use locale subdirectory inside files/ instead of qualifier (#5494) by @James Rich in [`418861d35`](https://github.com/meshtastic/Meshtastic-Android/commit/418861d356f1edf5ac0c4b00f3bfc761ad34e609) From 4ff6f23c5e5d074f319736a74e563f28bf65c127 Mon Sep 17 00:00:00 2001 From: James Rich <2199651+jamesarich@users.noreply.github.com> Date: Tue, 19 May 2026 12:19:17 -0700 Subject: [PATCH 56/78] fix(ci): use GitHub compare API for changelog author resolution (#5504) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/workflows/update-changelog.yml | 8 +- CHANGELOG.md | 424 ++++++++++++------------- 2 files changed, 218 insertions(+), 214 deletions(-) diff --git a/.github/workflows/update-changelog.yml b/.github/workflows/update-changelog.yml index aede958ac..5d023ab90 100644 --- a/.github/workflows/update-changelog.yml +++ b/.github/workflows/update-changelog.yml @@ -101,10 +101,14 @@ jobs: | sed -e :a -e '/^\n*$/{$d;N;ba}' } - # Helper: generate notes using git log (works between any two refs) + # Helper: generate notes using GitHub compare API (works between any two refs) generate_notes_git() { local from_ref="$1" to_ref="$2" - git log --no-merges --format="* %s by @%an in [\`%h\`](https://github.com/${REPO}/commit/%H)" "$from_ref".."$to_ref" 2>/dev/null || true + gh api "repos/${REPO}/compare/${from_ref}...${to_ref}" \ + --jq '.commits[] + | select(.parents | length == 1) + | "* \(.commit.message | split("\n")[0]) by \(.commit.author.name) (@\(.author.login // .commit.author.name)) in [`\(.sha[0:9])`](https://github.com/'"${REPO}"'/commit/\(.sha))"' \ + 2>/dev/null || true } # Helper: demote ### headings to #### for nesting under channel sections diff --git a/CHANGELOG.md b/CHANGELOG.md index e29c63804..4209ebf80 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,19 +12,19 @@ See [GitHub Releases](https://github.com/meshtastic/Meshtastic-Android/releases) * chore(deps): update room to v3.0.0-alpha05 (#5498) by @renovate[bot] in [`59499e827`](https://github.com/meshtastic/Meshtastic-Android/commit/59499e82723bdef4f1116ae5996814d59ab85595) * chore(deps): update org.junit.platform:junit-platform-launcher to v6.1.0 (#5502) by @renovate[bot] in [`2b7621221`](https://github.com/meshtastic/Meshtastic-Android/commit/2b76212217122604eeb14ba02ea45d93809773a0) * chore(deps): update org.junit.vintage:junit-vintage-engine to v6.1.0 (#5503) by @renovate[bot] in [`ae127a1e1`](https://github.com/meshtastic/Meshtastic-Android/commit/ae127a1e15bdbbae6395a4c21da6440297cdb13b) -* docs: move English sources into docs/en/ locale folder (#5501) by @James Rich in [`11bc37c96`](https://github.com/meshtastic/Meshtastic-Android/commit/11bc37c96878cd1d9a822c1dad658f43c9be6604) -* fix(ci): exclude pre-release tags from docs-release workflow (#5499) by @James Rich in [`92cfbaee9`](https://github.com/meshtastic/Meshtastic-Android/commit/92cfbaee9b8819804571ae15fd0815b8ab785bce) +* docs: move English sources into docs/en/ locale folder (#5501) by James Rich (@jamesarich) in [`11bc37c96`](https://github.com/meshtastic/Meshtastic-Android/commit/11bc37c96878cd1d9a822c1dad658f43c9be6604) +* fix(ci): exclude pre-release tags from docs-release workflow (#5499) by James Rich (@jamesarich) in [`92cfbaee9`](https://github.com/meshtastic/Meshtastic-Android/commit/92cfbaee9b8819804571ae15fd0815b8ab785bce) * docs: update CHANGELOG.md (#5495) by @github-actions[bot] in [`51d2c7b15`](https://github.com/meshtastic/Meshtastic-Android/commit/51d2c7b15cf1b3520cfbef13b8dbcff0b72748e4) * chore(deps): update compose-multiplatform to v1.11.2 (#5497) by @renovate[bot] in [`619897de8`](https://github.com/meshtastic/Meshtastic-Android/commit/619897de85616eb9bebedf850970abd24571f705) -* fix(ci): unblock Dokka documentation generation (#5496) by @James Rich in [`228765a15`](https://github.com/meshtastic/Meshtastic-Android/commit/228765a159b6f1498566d3fe6005f91b470761b4) -* fix(docs): use locale subdirectory inside files/ instead of qualifier (#5494) by @James Rich in [`418861d35`](https://github.com/meshtastic/Meshtastic-Android/commit/418861d356f1edf5ac0c4b00f3bfc761ad34e609) +* fix(ci): unblock Dokka documentation generation (#5496) by James Rich (@jamesarich) in [`228765a15`](https://github.com/meshtastic/Meshtastic-Android/commit/228765a159b6f1498566d3fe6005f91b470761b4) +* fix(docs): use locale subdirectory inside files/ instead of qualifier (#5494) by James Rich (@jamesarich) in [`418861d35`](https://github.com/meshtastic/Meshtastic-Android/commit/418861d356f1edf5ac0c4b00f3bfc761ad34e609) * docs: update CHANGELOG.md (#5473) by @github-actions[bot] in [`3121ea09a`](https://github.com/meshtastic/Meshtastic-Android/commit/3121ea09a3abb43713f0a090dac5147b6ae76f84) -* chore: Scheduled updates (Firmware, Hardware, Translations, Graphs) (#5465) by @James Rich in [`83bb1a31f`](https://github.com/meshtastic/Meshtastic-Android/commit/83bb1a31f75bfd2717428f2fed287eb1e830302f) +* chore: Scheduled updates (Firmware, Hardware, Translations, Graphs) (#5465) by James Rich (@jamesarich) in [`83bb1a31f`](https://github.com/meshtastic/Meshtastic-Android/commit/83bb1a31f75bfd2717428f2fed287eb1e830302f) * chore(deps): update peter-evans/create-pull-request action to v8 (#5493) by @renovate[bot] in [`a141df437`](https://github.com/meshtastic/Meshtastic-Android/commit/a141df437298b039086e9084ec234f925ffa09b2) * chore(deps): update node to v24 (#5491) by @renovate[bot] in [`cdf57ced8`](https://github.com/meshtastic/Meshtastic-Android/commit/cdf57ced8e9d6a6ce66a88f10da304a41b0ab4c1) * chore(deps): update compose-multiplatform to v1.3.0-beta01 (#5490) by @renovate[bot] in [`3bfaa466a`](https://github.com/meshtastic/Meshtastic-Android/commit/3bfaa466afc01fe03cc69ba7437610441ba8bcf7) -* fix(ci): disable configuration cache for Dokka build (#5492) by @James Rich in [`fe2cbae87`](https://github.com/meshtastic/Meshtastic-Android/commit/fe2cbae8756c4af9f1daacd842ab0fde097ffab6) -* docs: comprehensive accuracy audit and CI fix (#5489) by @James Rich in [`ece771edb`](https://github.com/meshtastic/Meshtastic-Android/commit/ece771edb06f0110050baac322a093214b89f6c8) +* fix(ci): disable configuration cache for Dokka build (#5492) by James Rich (@jamesarich) in [`fe2cbae87`](https://github.com/meshtastic/Meshtastic-Android/commit/fe2cbae8756c4af9f1daacd842ab0fde097ffab6) +* docs: comprehensive accuracy audit and CI fix (#5489) by James Rich (@jamesarich) in [`ece771edb`](https://github.com/meshtastic/Meshtastic-Android/commit/ece771edb06f0110050baac322a093214b89f6c8) * chore(deps): update actions/setup-java action to v5 (#5484) by @renovate[bot] in [`bbdc4a300`](https://github.com/meshtastic/Meshtastic-Android/commit/bbdc4a300406ae417ad7a70fb4cdd826debb5cb3) * chore(deps): update actions/upload-pages-artifact action to v5 (#5487) by @renovate[bot] in [`4afa1a032`](https://github.com/meshtastic/Meshtastic-Android/commit/4afa1a032fc465464e7408ef36d0505876ce9d61) * chore(deps): update gradle/actions action to v6 (#5488) by @renovate[bot] in [`21993b6cc`](https://github.com/meshtastic/Meshtastic-Android/commit/21993b6cc7eba8776262c3805942ddc460ab0c5b) @@ -33,15 +33,15 @@ See [GitHub Releases](https://github.com/meshtastic/Meshtastic-Android/releases) * chore(deps): update actions/github-script action to v9 (#5483) by @renovate[bot] in [`f8a5f894a`](https://github.com/meshtastic/Meshtastic-Android/commit/f8a5f894a86b6145b86143888f7ea1fe3d9ccbb6) * chore(deps): update actions/deploy-pages action to v5 (#5482) by @renovate[bot] in [`d7cccd0db`](https://github.com/meshtastic/Meshtastic-Android/commit/d7cccd0dba442d8c8892a4aac8124f565563434a) * chore(deps): update actions/checkout action to v6 (#5481) by @renovate[bot] in [`2e484e219`](https://github.com/meshtastic/Meshtastic-Android/commit/2e484e219c132b89597ffa939e1801765a5d5352) -* feat(docs): In-app documentation browser with Jekyll site and Docusaurus sync (#5445) by @James Rich in [`fc0df1a79`](https://github.com/meshtastic/Meshtastic-Android/commit/fc0df1a79ad1d8ce355803f5ac6eb4a1f2ec78c3) -* feat: adopt Material 3 Expressive design system (M3-native APIs only) (#5479) by @James Rich in [`f5128798a`](https://github.com/meshtastic/Meshtastic-Android/commit/f5128798a808219a28e9ee0916c079edcb203744) +* feat(docs): In-app documentation browser with Jekyll site and Docusaurus sync (#5445) by James Rich (@jamesarich) in [`fc0df1a79`](https://github.com/meshtastic/Meshtastic-Android/commit/fc0df1a79ad1d8ce355803f5ac6eb4a1f2ec78c3) +* feat: adopt Material 3 Expressive design system (M3-native APIs only) (#5479) by James Rich (@jamesarich) in [`f5128798a`](https://github.com/meshtastic/Meshtastic-Android/commit/f5128798a808219a28e9ee0916c079edcb203744) * chore(deps): update core/proto/src/main/proto digest to 59cb394 (#5480) by @renovate[bot] in [`72436e70b`](https://github.com/meshtastic/Meshtastic-Android/commit/72436e70bc1db9373581bc53e8cc62548e596744) -* fix(nav): remote admin nodenum + Nav3 consolidation and improvements (#5478) by @James Rich in [`df4f10c4d`](https://github.com/meshtastic/Meshtastic-Android/commit/df4f10c4d64a273688aa9dbe5284ac3737756310) +* fix(nav): remote admin nodenum + Nav3 consolidation and improvements (#5478) by James Rich (@jamesarich) in [`df4f10c4d`](https://github.com/meshtastic/Meshtastic-Android/commit/df4f10c4d64a273688aa9dbe5284ac3737756310) * chore(deps): update markdownrenderer to v0.41.0 (#5471) by @renovate[bot] in [`f6587a123`](https://github.com/meshtastic/Meshtastic-Android/commit/f6587a12364cc490b5872ed7bc77cfeed9e414a6) -* fix(settings): add input validation for BLE PIN, LoRa modem, and ambient lighting (#5477) by @James Rich in [`1dd47bc09`](https://github.com/meshtastic/Meshtastic-Android/commit/1dd47bc09032fe0972af7eed6a7554e61be7a02b) -* refactor(build): rename entry modules and remove DESKTOP_ONLY mode (#5476) by @James Rich in [`f4b6b02ac`](https://github.com/meshtastic/Meshtastic-Android/commit/f4b6b02acecdd8855408db7d92757f2495fbc11f) -* ci: remove desktop build job from reusable-check to cut macOS runner costs (#5475) by @James Rich in [`d24fc9ac9`](https://github.com/meshtastic/Meshtastic-Android/commit/d24fc9ac9245b69718e2cb2a6c3a872e36d8c28c) -* fix(database): make withDb retry logic resilient to varying close messages (#5474) by @James Rich in [`057d5bb77`](https://github.com/meshtastic/Meshtastic-Android/commit/057d5bb778a72cf4359abc7fae904d587cdc90a2) +* fix(settings): add input validation for BLE PIN, LoRa modem, and ambient lighting (#5477) by James Rich (@jamesarich) in [`1dd47bc09`](https://github.com/meshtastic/Meshtastic-Android/commit/1dd47bc09032fe0972af7eed6a7554e61be7a02b) +* refactor(build): rename entry modules and remove DESKTOP_ONLY mode (#5476) by James Rich (@jamesarich) in [`f4b6b02ac`](https://github.com/meshtastic/Meshtastic-Android/commit/f4b6b02acecdd8855408db7d92757f2495fbc11f) +* ci: remove desktop build job from reusable-check to cut macOS runner costs (#5475) by James Rich (@jamesarich) in [`d24fc9ac9`](https://github.com/meshtastic/Meshtastic-Android/commit/d24fc9ac9245b69718e2cb2a6c3a872e36d8c28c) +* fix(database): make withDb retry logic resilient to varying close messages (#5474) by James Rich (@jamesarich) in [`057d5bb77`](https://github.com/meshtastic/Meshtastic-Android/commit/057d5bb778a72cf4359abc7fae904d587cdc90a2) * chore(deps): update wire to v6.4.0 (#5466) by @renovate[bot] in [`f0e12695b`](https://github.com/meshtastic/Meshtastic-Android/commit/f0e12695bbf3df16b043476ff98856b727d6a2f7) * chore(deps): update spotless to v8.5.1 (#5468) by @renovate[bot] in [`c91219d8b`](https://github.com/meshtastic/Meshtastic-Android/commit/c91219d8b0411975c059c7a5ae6eb370386954f6) * chore(deps): update vico to v3.2.0-next.5 (#5470) by @renovate[bot] in [`4bacff81c`](https://github.com/meshtastic/Meshtastic-Android/commit/4bacff81c5abad536b40f7370ae5d302b74a11fe) @@ -50,220 +50,220 @@ See [GitHub Releases](https://github.com/meshtastic/Meshtastic-Android/releases) Changes since [`v2.7.13`](https://github.com/meshtastic/Meshtastic-Android/releases/tag/v2.7.13): #### 🏗️ Features -* refactor(ble): Centralize BLE logic into a core module by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4550 -* feat(ble): Add support for `FromRadioSync` characteristic by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4609 -* feat(widget): Add Local Stats glance widget by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4642 -* chore(deps): bump deps to take advantage of new functionality by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4658 -* feat(maps): Google maps improvements for network and offline tilesources by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4664 -* feat: Improve edge-to-edge and display cutout handling by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4669 -* feat: upcoming support for tak and trafficmanagement configs, device hw by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4671 -* feat: settings rework by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4678 -* feat: settings rework part 2, domain and usecase abstraction, tests by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4680 -* feat: service decoupling by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4685 -* refactor: migrate :core:database to Room Kotlin Multiplatform by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4702 -* refactor(ble): improve connection lifecycle and enhance OTA reliability by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4721 -* refactor: migrate preferences to DataStore and decouple core:domain for KMP by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4731 -* refactor: migrate core modules to Kotlin Multiplatform and consolidat… by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4735 -* feat: Migrate project to Kotlin Multiplatform (KMP) architecture by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4738 -* refactor: migrate from Hilt to Koin and expand KMP common modules by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4746 -* refactor: migrate core UI and features to KMP, adopt Navigation 3 by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4750 -* feat: introduce Desktop target and expand Kotlin Multiplatform (KMP) architecture by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4761 -* build(desktop): enable ProGuard for release builds by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4772 -* feat(desktop): implement DI auto-wiring and validation by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4782 -* feat(desktop): expand supported native distribution formats by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4783 -* feat: Complete ViewModel extraction and update documentation by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4817 -* refactor: Replace Nordic, use Kable backend for Desktop and Android with BLE support by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4818 -* feat: Integrate notification management and preferences across platforms by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4819 -* feat: service extraction by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4828 -* feat: build logic by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4829 -* feat: Desktop USB serial transport by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4836 +* refactor(ble): Centralize BLE logic into a core module by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4550 +* feat(ble): Add support for `FromRadioSync` characteristic by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4609 +* feat(widget): Add Local Stats glance widget by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4642 +* chore(deps): bump deps to take advantage of new functionality by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4658 +* feat(maps): Google maps improvements for network and offline tilesources by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4664 +* feat: Improve edge-to-edge and display cutout handling by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4669 +* feat: upcoming support for tak and trafficmanagement configs, device hw by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4671 +* feat: settings rework by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4678 +* feat: settings rework part 2, domain and usecase abstraction, tests by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4680 +* feat: service decoupling by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4685 +* refactor: migrate :core:database to Room Kotlin Multiplatform by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4702 +* refactor(ble): improve connection lifecycle and enhance OTA reliability by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4721 +* refactor: migrate preferences to DataStore and decouple core:domain for KMP by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4731 +* refactor: migrate core modules to Kotlin Multiplatform and consolidat… by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4735 +* feat: Migrate project to Kotlin Multiplatform (KMP) architecture by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4738 +* refactor: migrate from Hilt to Koin and expand KMP common modules by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4746 +* refactor: migrate core UI and features to KMP, adopt Navigation 3 by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4750 +* feat: introduce Desktop target and expand Kotlin Multiplatform (KMP) architecture by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4761 +* build(desktop): enable ProGuard for release builds by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4772 +* feat(desktop): implement DI auto-wiring and validation by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4782 +* feat(desktop): expand supported native distribution formats by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4783 +* feat: Complete ViewModel extraction and update documentation by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4817 +* refactor: Replace Nordic, use Kable backend for Desktop and Android with BLE support by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4818 +* feat: Integrate notification management and preferences across platforms by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4819 +* feat: service extraction by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4828 +* feat: build logic by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4829 +* feat: Desktop USB serial transport by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4836 * Add "Exclude MQTT" filter to Nodes view. by @VictorioBerra in https://github.com/meshtastic/Meshtastic-Android/pull/4825 -* feat: mqtt by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4841 -* feat: Integrate Mokkery and Turbine into KMP testing framework by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4845 -* feat: Complete app module thinning and feature module extraction by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4844 -* feat: Enhance test coverage by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4847 -* feat: Implement KMP ServiceDiscovery for TCP devices by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4854 -* feat: Add KMP URI handling, import, and QR code generation support by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4856 -* feat: KMP Debug Panel Migration and Update Documentation by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4859 -* feat: Migrate to Room 3.0 and update related documentation and tracks by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4865 -* feat: Implement iOS support and unify Compose Multiplatform infrastructure by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4876 +* feat: mqtt by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4841 +* feat: Integrate Mokkery and Turbine into KMP testing framework by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4845 +* feat: Complete app module thinning and feature module extraction by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4844 +* feat: Enhance test coverage by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4847 +* feat: Implement KMP ServiceDiscovery for TCP devices by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4854 +* feat: Add KMP URI handling, import, and QR code generation support by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4856 +* feat: KMP Debug Panel Migration and Update Documentation by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4859 +* feat: Migrate to Room 3.0 and update related documentation and tracks by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4865 +* feat: Implement iOS support and unify Compose Multiplatform infrastructure by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4876 * Add InlineMap implementation for F-Droid build by @theKorzh in https://github.com/meshtastic/Meshtastic-Android/pull/4877 -* refactor(desktop): remove native MenuBar from main window by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4888 -* feat: Migrate networking to Ktor and enhance multiplatform support by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4890 -* refactor: adaptive UI components for Navigation 3 by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4891 -* feat: Integrate AlertHost into desktop application and add UI tests by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4893 -* feat: implement global SnackbarManager and consolidate common UI setup by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4909 -* feat: implement unified deep link routing for Kotlin Multiplatform by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4910 -* refactor: BLE transport and UI for Kotlin Multiplatform unification by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4911 -* Refactor map layer management and navigation infrastructure by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4921 -* feat: migrate to Material 3 Expressive APIs by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4934 -* Refactor nav3 architecture and enhance adaptive layouts by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4944 -* feat(tak): introduce built-in Local TAK Server and mesh integration by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4951 -* feat(analytics): expand DataDog RUM integration and align with iOS parity by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4970 -* feat(wifi): introduce BLE-based WiFi provisioning for nymea-compatible devices by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4968 -* feat(wifi-provision): add mPWRD-OS branding and disclaimer banner by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4978 -* feat(charts): adopt Vico best practices, add sensor data, and migrate TracerouteLog by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5026 -* refactor(icons): migrate to self-hosted VectorDrawable XMLs via MeshtasticIcons by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5030 -* feat(messaging): add IME Send action to message input by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5047 -* feat(metrics): redesign position log with SelectableMetricCard and add CSV export to all metrics screens by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5062 -* feat(core/ui): add safeLaunch, UiState, KMP permissions, and CMP lifecycle modernization by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5118 -* feat(desktop): add entitlements and wire MeshConnectionManager into orchestrator by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5127 -* feat(environment): add 1-Wire multi-thermometer (DS18B20) display support by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5130 -* feat: add high-contrast theme with accessible message bubbles by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5135 -* feat(mqtt): migrate to MQTTastic-Client-KMP by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5165 -* feat(mqtt): adopt mqttastic-client-kmp 0.2.0 — disconnect reasons + Test Connection by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5181 -* feat(firmware): nRF52 BLE Legacy DFU support by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5209 -* feat(service): send polite ToRadio(disconnect=true) before transport close by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5210 -* feat(node): smoother remote-admin UX with per-node session tracking by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5217 -* fix(ble): unblock reconnect + kable audit (logging, priority, backoff, StateFlow) by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5222 -* feat: Enhance mPWRD-os WiFi provisioning success state and UI components by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5225 -* feat(messaging): add entry points for filter settings by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5229 -* feat(messaging): send message on Enter keypress by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5246 -* feat(desktop): native OS notifications via libnotify/osascript/PowerShell by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5253 +* refactor(desktop): remove native MenuBar from main window by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4888 +* feat: Migrate networking to Ktor and enhance multiplatform support by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4890 +* refactor: adaptive UI components for Navigation 3 by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4891 +* feat: Integrate AlertHost into desktop application and add UI tests by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4893 +* feat: implement global SnackbarManager and consolidate common UI setup by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4909 +* feat: implement unified deep link routing for Kotlin Multiplatform by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4910 +* refactor: BLE transport and UI for Kotlin Multiplatform unification by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4911 +* Refactor map layer management and navigation infrastructure by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4921 +* feat: migrate to Material 3 Expressive APIs by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4934 +* Refactor nav3 architecture and enhance adaptive layouts by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4944 +* feat(tak): introduce built-in Local TAK Server and mesh integration by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4951 +* feat(analytics): expand DataDog RUM integration and align with iOS parity by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4970 +* feat(wifi): introduce BLE-based WiFi provisioning for nymea-compatible devices by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4968 +* feat(wifi-provision): add mPWRD-OS branding and disclaimer banner by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4978 +* feat(charts): adopt Vico best practices, add sensor data, and migrate TracerouteLog by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5026 +* refactor(icons): migrate to self-hosted VectorDrawable XMLs via MeshtasticIcons by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5030 +* feat(messaging): add IME Send action to message input by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5047 +* feat(metrics): redesign position log with SelectableMetricCard and add CSV export to all metrics screens by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5062 +* feat(core/ui): add safeLaunch, UiState, KMP permissions, and CMP lifecycle modernization by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5118 +* feat(desktop): add entitlements and wire MeshConnectionManager into orchestrator by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5127 +* feat(environment): add 1-Wire multi-thermometer (DS18B20) display support by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5130 +* feat: add high-contrast theme with accessible message bubbles by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5135 +* feat(mqtt): migrate to MQTTastic-Client-KMP by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5165 +* feat(mqtt): adopt mqttastic-client-kmp 0.2.0 — disconnect reasons + Test Connection by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5181 +* feat(firmware): nRF52 BLE Legacy DFU support by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5209 +* feat(service): send polite ToRadio(disconnect=true) before transport close by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5210 +* feat(node): smoother remote-admin UX with per-node session tracking by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5217 +* fix(ble): unblock reconnect + kable audit (logging, priority, backoff, StateFlow) by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5222 +* feat: Enhance mPWRD-os WiFi provisioning success state and UI components by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5225 +* feat(messaging): add entry points for filter settings by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5229 +* feat(messaging): send message on Enter keypress by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5246 +* feat(desktop): native OS notifications via libnotify/osascript/PowerShell by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5253 * feat(auto): enable Android Auto messaging notifications by @riddlemd in https://github.com/meshtastic/Meshtastic-Android/pull/5265 -* fix: update emoji catalog metadata and improve picker synchronization by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5292 -* fix: update notification icon by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5293 -* feat(connections): connection sorting & conversation empty channel ranking by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5295 -* fix(connections): improve BLE scan reliability and UI lifecycle by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5329 -* feat: event firmware easter egg with ambient branding by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5354 -* feat: align theme with Design Standards v1.3, remove contrast setting by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5355 -* feat(desktop): fix mac notifications, new desktop icons by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5403 -* Update notification intents and deep link URI format by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5408 -* fix: clarify position precision as ± radius by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5428 -* feat: TAK v2 protocol integration with zstd compression and full CoT type support by @thebentern in https://github.com/meshtastic/Meshtastic-Android/pull/5434 +* fix: update emoji catalog metadata and improve picker synchronization by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5292 +* fix: update notification icon by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5293 +* feat(connections): connection sorting & conversation empty channel ranking by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5295 +* fix(connections): improve BLE scan reliability and UI lifecycle by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5329 +* feat: event firmware easter egg with ambient branding by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5354 +* feat: align theme with Design Standards v1.3, remove contrast setting by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5355 +* feat(desktop): fix mac notifications, new desktop icons by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5403 +* Update notification intents and deep link URI format by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5408 +* fix: clarify position precision as ± radius by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5428 +* feat: TAK v2 protocol integration with zstd compression and full CoT type support by Ben Meadors (@thebentern) in https://github.com/meshtastic/Meshtastic-Android/pull/5434 #### 🖥️ Desktop -* fix(desktop): keep Vico package to prevent bytecode verification errors by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5424 +* fix(desktop): keep Vico package to prevent bytecode verification errors by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5424 #### 🛠️ Fixes -* fix(strings): replace plurals by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4596 -* fix: replace fdroid map_style_selection string by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4598 -* refactor(test): Introduce MeshTestApplication for robust testing by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4602 -* fix: spotless by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4604 -* feat(build): Implement flavor-specific barcode scanning and build improvements by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4611 +* fix(strings): replace plurals by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4596 +* fix: replace fdroid map_style_selection string by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4598 +* refactor(test): Introduce MeshTestApplication for robust testing by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4602 +* fix: spotless by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4604 +* feat(build): Implement flavor-specific barcode scanning and build improvements by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4611 * fix(qr): add channels as key to remember block to fix add-channel rac… by @nreisbeck in https://github.com/meshtastic/Meshtastic-Android/pull/4607 -* chore(ble): Add Proguard rules for Nordic BLE library by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4618 -* ci(release): Use wildcards for APK paths in release workflow by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4619 -* chore(ci): Use wildcard for APK paths in release workflow by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4622 -* chore(ci): Refine analytics task filtering and improve release debugging by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4624 -* Fix/splits by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4626 +* chore(ble): Add Proguard rules for Nordic BLE library by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4618 +* ci(release): Use wildcards for APK paths in release workflow by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4619 +* chore(ci): Use wildcard for APK paths in release workflow by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4622 +* chore(ci): Refine analytics task filtering and improve release debugging by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4624 +* Fix/splits by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4626 * Align FDroid MapView constructor with Google version (Issue #4576) by @ujade in https://github.com/meshtastic/Meshtastic-Android/pull/4630 -* refactor(analytics): reduce tracking footprint by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4649 -* fix(map): location perms and button visibility, breadcrumb taps by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4651 +* refactor(analytics): reduce tracking footprint by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4649 +* fix(map): location perms and button visibility, breadcrumb taps by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4651 * fix(strings): Correct capitalization of Ham by @alecperkins in https://github.com/meshtastic/Meshtastic-Android/pull/4620 -* ci: Split Google artifact attestations and ensure F-Droid uploads by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4665 -* fix: Replace strings.xml with app_name resource by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4666 -* Disable generate_release_notes in release workflow by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4668 -* fix: ui tweaks by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4696 -* refactor: simplify traceroute tracking and unify cooldown button logic by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4699 -* feat: Add "Mark all as read" and unread message count indicators by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4720 -* fix(widget): ensure local stats widget gets updates by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4722 -* refactor(ble): increase default timeout for BLE profiling by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4728 -* refactor: enhance handshake stall guard and extend coverage to Stage 2 by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4730 -* build(ci): optimize release workflow and update Room configuration by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4775 -* Disable ProGuard for desktop release and add application icon by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4776 -* fix(ble): implement scanning for unbonded devices in common connections ui by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4779 -* fix: fix animation stalls and update dependencies for stability by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4784 -* build(desktop): include `java.net.http` module in native distribution by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4787 -* build: remove PKG from desktop distribution targets by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4788 -* build: Update desktop app icons, versioning, and packaging configuration by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4789 -* refactor(settings): improve destination node handling in RadioConfigViewModel by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4790 -* feat(desktop): add enter-to-send functionality in messaging by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4793 -* feat: enhance map navigation and waypoint handling by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4814 -* build: fix license generation and analytics build tasks by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4820 -* fix: resolve crashes and debug filter issues in Metrics and MapView by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4824 -* fix(map, settings): allow null IDs and implement request timeout by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4851 -* docs: Unify notification channel management and migrate unit tests by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4867 -* fix: Implement reconnection logic and stabilize BLE connection flow by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4870 -* fix: Update messaging feature with contact item keys and MQTT limits by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4871 -* fix: specify jetbrains in gradle-daemon-jvm.properties by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4872 -* fix(settings): remove redundant regex option in DebugViewModel by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4881 -* refactor(service): update string formatting for local stats notif by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4885 -* refactor(messaging): fix contact key derivation in ContactsViewModel by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4887 -* feat: optimistically persist local configs and channels by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4898 -* refactor(di): specify disk cache directory for ImageLoader by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4899 -* refactor: null safety, update date/time libraries, and migrate tests by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4900 -* refactor: remove demoscenario and enhance BLE connection stability by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4914 -* refactor(ui): remove labels from navigation suite items by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4924 -* build: enable `-Xjvm-default=all` compiler flag by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4929 -* fix(ci): update APP_VERSION_NAME output reference in workflows by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4935 +* ci: Split Google artifact attestations and ensure F-Droid uploads by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4665 +* fix: Replace strings.xml with app_name resource by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4666 +* Disable generate_release_notes in release workflow by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4668 +* fix: ui tweaks by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4696 +* refactor: simplify traceroute tracking and unify cooldown button logic by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4699 +* feat: Add "Mark all as read" and unread message count indicators by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4720 +* fix(widget): ensure local stats widget gets updates by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4722 +* refactor(ble): increase default timeout for BLE profiling by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4728 +* refactor: enhance handshake stall guard and extend coverage to Stage 2 by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4730 +* build(ci): optimize release workflow and update Room configuration by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4775 +* Disable ProGuard for desktop release and add application icon by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4776 +* fix(ble): implement scanning for unbonded devices in common connections ui by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4779 +* fix: fix animation stalls and update dependencies for stability by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4784 +* build(desktop): include `java.net.http` module in native distribution by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4787 +* build: remove PKG from desktop distribution targets by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4788 +* build: Update desktop app icons, versioning, and packaging configuration by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4789 +* refactor(settings): improve destination node handling in RadioConfigViewModel by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4790 +* feat(desktop): add enter-to-send functionality in messaging by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4793 +* feat: enhance map navigation and waypoint handling by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4814 +* build: fix license generation and analytics build tasks by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4820 +* fix: resolve crashes and debug filter issues in Metrics and MapView by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4824 +* fix(map, settings): allow null IDs and implement request timeout by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4851 +* docs: Unify notification channel management and migrate unit tests by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4867 +* fix: Implement reconnection logic and stabilize BLE connection flow by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4870 +* fix: Update messaging feature with contact item keys and MQTT limits by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4871 +* fix: specify jetbrains in gradle-daemon-jvm.properties by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4872 +* fix(settings): remove redundant regex option in DebugViewModel by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4881 +* refactor(service): update string formatting for local stats notif by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4885 +* refactor(messaging): fix contact key derivation in ContactsViewModel by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4887 +* feat: optimistically persist local configs and channels by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4898 +* refactor(di): specify disk cache directory for ImageLoader by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4899 +* refactor: null safety, update date/time libraries, and migrate tests by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4900 +* refactor: remove demoscenario and enhance BLE connection stability by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4914 +* refactor(ui): remove labels from navigation suite items by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4924 +* build: enable `-Xjvm-default=all` compiler flag by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4929 +* fix(ci): update APP_VERSION_NAME output reference in workflows by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4935 * fix(strings): Fix public key description by @Klavionik in https://github.com/meshtastic/Meshtastic-Android/pull/4957 -* feat: implement XModem file transfers and enhance BLE connection robustness by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4959 -* Refactor navigation to use NodeDetail route and fix radio settings by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4960 -* Refactor and unify firmware update logic across platforms by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4966 -* fix: improve PKI message routing and resolve database migration racecondition by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4996 +* feat: implement XModem file transfers and enhance BLE connection robustness by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4959 +* Refactor navigation to use NodeDetail route and fix radio settings by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4960 +* Refactor and unify firmware update logic across platforms by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4966 +* fix: improve PKI message routing and resolve database migration racecondition by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4996 * fix: resolve correct node public key in sendSharedContact and favoriteNode by @Copilot in https://github.com/meshtastic/Meshtastic-Android/pull/5005 -* fix: resolve bugs across connection, PKI, admin, packet flow, and stability subsystems by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5011 -* fix(tak): resolve frequent TAK client disconnections by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5015 -* fix(service): resolve MeshService crash from eager notification channel init by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5034 -* style: update ic_no_cell and ic_place vector drawables by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5040 -* fix(build): prevent DataDog asset transform from stripping fdroid release assets by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5044 -* fix(icons): replace outline (FILL=0) pathData with filled (FILL=1) from upstream Material Symbols by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5056 -* fix(charts): hoist rememberVicoZoomState above vararg layers to prevent ClassCastException by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5060 -* fix(ui): add missing @ParameterName annotations on actual rememberReadTextFromUri declarations by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5072 -* fix(settings): hide Status Message config until firmware v2.8.0 by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5070 -* fix(transport): Kable BLE audit + thread-safety, MQTT, and logging fixes across transport layers by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5071 -* fix(build): remove Compose BOM to resolve compileSdk 37 conflict by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5088 -* fix(connections): show device name during connecting state by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5085 -* fix(build): add explicit compose-multiplatform-animation dependency by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5095 -* fix(nav): restore broken traceroute map navigation by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5104 -* fix(build): overhaul R8 rules and DRY up build-logic conventions by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5109 -* fix(proguard): disable shrinking for Compose animation classes by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5116 -* fix(icons): audit and correct icon migration regressions from #5030 #5040 #5056 by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5136 -* fix: align BLE connection handshake with firmware protocol expectations by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5141 -* fix(app): add R8 keep rules for Compose animation/runtime/ui by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5146 -* perf(messaging): batch node + reply lookups in message loading by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5149 -* fix(app): disable R8 optimization to fix Compose animation freeze by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5150 -* fix(node): don't recreate Vico CartesianChartModelProducer on channel switch by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5160 -* refactor: use injected ioDispatcher and ApplicationCoroutineScope by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5167 -* fix: redact MeshLog proto secrets and centralize Compose keep-rules by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5166 -* fix(ui): stable LazyColumn keys, semantic roles, and content descriptions by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5168 -* fix(ui): finish accessibility roles and action labels for clickable surfaces by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5170 -* fix(widget): drive updates via debounced state observer by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5185 -* fix(transport): improve BLE / TCP / USB reconnect and handshake resilience by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5196 -* fix(fdroid): prevent NotImplementedError crash on firmware release fetch by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5197 -* fix(compass): stop coarse network fixes from clobbering GPS fixes by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5200 -* fix(canned-messages): enable multiline text editing for long message lists by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5203 -* fix(settings): restore Import/Export button functionality in #4913 by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5204 -* refactor: eliminate Accompanist permissions library by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5211 -* fix: MQTT proxy connection and probe test failures by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5215 +* fix: resolve bugs across connection, PKI, admin, packet flow, and stability subsystems by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5011 +* fix(tak): resolve frequent TAK client disconnections by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5015 +* fix(service): resolve MeshService crash from eager notification channel init by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5034 +* style: update ic_no_cell and ic_place vector drawables by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5040 +* fix(build): prevent DataDog asset transform from stripping fdroid release assets by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5044 +* fix(icons): replace outline (FILL=0) pathData with filled (FILL=1) from upstream Material Symbols by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5056 +* fix(charts): hoist rememberVicoZoomState above vararg layers to prevent ClassCastException by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5060 +* fix(ui): add missing @ParameterName annotations on actual rememberReadTextFromUri declarations by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5072 +* fix(settings): hide Status Message config until firmware v2.8.0 by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5070 +* fix(transport): Kable BLE audit + thread-safety, MQTT, and logging fixes across transport layers by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5071 +* fix(build): remove Compose BOM to resolve compileSdk 37 conflict by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5088 +* fix(connections): show device name during connecting state by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5085 +* fix(build): add explicit compose-multiplatform-animation dependency by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5095 +* fix(nav): restore broken traceroute map navigation by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5104 +* fix(build): overhaul R8 rules and DRY up build-logic conventions by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5109 +* fix(proguard): disable shrinking for Compose animation classes by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5116 +* fix(icons): audit and correct icon migration regressions from #5030 #5040 #5056 by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5136 +* fix: align BLE connection handshake with firmware protocol expectations by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5141 +* fix(app): add R8 keep rules for Compose animation/runtime/ui by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5146 +* perf(messaging): batch node + reply lookups in message loading by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5149 +* fix(app): disable R8 optimization to fix Compose animation freeze by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5150 +* fix(node): don't recreate Vico CartesianChartModelProducer on channel switch by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5160 +* refactor: use injected ioDispatcher and ApplicationCoroutineScope by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5167 +* fix: redact MeshLog proto secrets and centralize Compose keep-rules by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5166 +* fix(ui): stable LazyColumn keys, semantic roles, and content descriptions by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5168 +* fix(ui): finish accessibility roles and action labels for clickable surfaces by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5170 +* fix(widget): drive updates via debounced state observer by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5185 +* fix(transport): improve BLE / TCP / USB reconnect and handshake resilience by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5196 +* fix(fdroid): prevent NotImplementedError crash on firmware release fetch by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5197 +* fix(compass): stop coarse network fixes from clobbering GPS fixes by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5200 +* fix(canned-messages): enable multiline text editing for long message lists by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5203 +* fix(settings): restore Import/Export button functionality in #4913 by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5204 +* refactor: eliminate Accompanist permissions library by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5211 +* fix: MQTT proxy connection and probe test failures by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5215 * fix(ble): ensure GATT cleanup runs under NonCancellable on cancellation by @jdogg172 in https://github.com/meshtastic/Meshtastic-Android/pull/5207 -* fix(ble): cleanup races discovered while reviewing #5207 by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5221 +* fix(ble): cleanup races discovered while reviewing #5207 by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5221 * fix(ui): make footer buttons expand downwards by @zt64 in https://github.com/meshtastic/Meshtastic-Android/pull/5226 -* fix(desktop): suppress Vico ColorScale ProGuard warnings by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5232 -* fix(desktop): unbreak release crash via correct ProGuard rules by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5236 -* fix(crashlytics): resolve beta 2.7.14 crash issues by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5245 -* fix: Resolve top Crashlytics issues for 29320633 beta release by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5278 -* fix: persist language switching and correctly map locales by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5287 -* fix: ensure snackbar respects safe drawing padding over host modifiers by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5290 +* fix(desktop): suppress Vico ColorScale ProGuard warnings by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5232 +* fix(desktop): unbreak release crash via correct ProGuard rules by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5236 +* fix(crashlytics): resolve beta 2.7.14 crash issues by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5245 +* fix: Resolve top Crashlytics issues for 29320633 beta release by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5278 +* fix: persist language switching and correctly map locales by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5287 +* fix: ensure snackbar respects safe drawing padding over host modifiers by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5290 * fix(ui): align Cancel and Send enabled state by @elagin in https://github.com/meshtastic/Meshtastic-Android/pull/5284 -* fix(data): default new-node notifications off for event firmware by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5323 -* fix(network): resolve empty MQTT address and enforce TLS on default server by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5333 -* fix(mqtt): harden TLS enforcement, add user CA trust, and improve error diagnostics by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5365 -* fix: clamp future lastHeard timestamps to current time on ingestion by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5418 -* revert: Update retry settings in gradle-wrapper.properties by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5430 -* fix: update screenshots by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5435 +* fix(data): default new-node notifications off for event firmware by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5323 +* fix(network): resolve empty MQTT address and enforce TLS on default server by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5333 +* fix(mqtt): harden TLS enforcement, add user CA trust, and improve error diagnostics by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5365 +* fix: clamp future lastHeard timestamps to current time on ingestion by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5418 +* revert: Update retry settings in gradle-wrapper.properties by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5430 +* fix: update screenshots by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5435 #### 📝 Other Changes -* refactor(ui): compose resources, domain layer by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4628 +* refactor(ui): compose resources, domain layer by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4628 * Add per-message transport method icons for new message format by @Kealper in https://github.com/meshtastic/Meshtastic-Android/pull/4643 -* build: apply instrumented test dependencies conditionally by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4698 -* docs: summarize KMP migration progress and architectural decisions by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4770 -* ci(release): pass app version to desktop build via environment variable by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4774 -* ai: Establish conductor documentation and governance framework by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4780 +* build: apply instrumented test dependencies conditionally by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4698 +* docs: summarize KMP migration progress and architectural decisions by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4770 +* ci(release): pass app version to desktop build via environment variable by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4774 +* ai: Establish conductor documentation and governance framework by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4780 * fix: fix wrong getChannelUrl() call causing loss of "add" flag and un… by @skobkin in https://github.com/meshtastic/Meshtastic-Android/pull/4809 -* chore: Enhance CI coverage reporting and add main branch workflow by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4873 -* build(desktop): enable ProGuard minification and tree-shaking by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4904 -* build: update Compose Multiplatform and migrate lifecycle dependencies by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4932 -* chore: standardize resources and update documentation for Navigation 3 by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4961 -* feat(settings): add DNS support and fix UDP protocol toggle by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5013 -* fix: use payload labels in pr_enforce_labels.yml to avoid rate limiting by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5018 -* fix: scope labeler trigger to reduce rate limiting and fix bugfix typo by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5020 -* test(prefs): migrate DataStore tests from androidHostTest to commonTest by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5092 -* fix(resources): add resourcePrefix to KMP + widget modules, rename prefixed resources by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5111 -* fix(charts): apply Vico 3.1.0 best-practice audit fixes by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5138 -* refactor(di): adopt @KoinApplication with startKoin() compiler plugin API by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5152 -* test: migrate MigrationTest to runTest and add missing repository fakes by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5171 -* refactor: consolidate metric formatting through MetricFormatter by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5169 -* chore(r8): remove redundant keep rules covered by consumer rules by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5172 -* Revert "diag(r8): disable minify for release builds (animation-freeze diagnostic)" by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5176 +* chore: Enhance CI coverage reporting and add main branch workflow by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4873 +* build(desktop): enable ProGuard minification and tree-shaking by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4904 +* build: update Compose Multiplatform and migrate lifecycle dependencies by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4932 +* chore: standardize resources and update documentation for Navigation 3 by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4961 +* feat(settings): add DNS support and fix UDP protocol toggle by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5013 +* fix: use payload labels in pr_enforce_labels.yml to avoid rate limiting by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5018 +* fix: scope labeler trigger to reduce rate limiting and fix bugfix typo by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5020 +* test(prefs): migrate DataStore tests from androidHostTest to commonTest by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5092 +* fix(resources): add resourcePrefix to KMP + widget modules, rename prefixed resources by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5111 +* fix(charts): apply Vico 3.1.0 best-practice audit fixes by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5138 +* refactor(di): adopt @KoinApplication with startKoin() compiler plugin API by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5152 +* test: migrate MigrationTest to runTest and add missing repository fakes by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5171 +* refactor: consolidate metric formatting through MetricFormatter by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5169 +* chore(r8): remove redundant keep rules covered by consumer rules by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5172 +* Revert "diag(r8): disable minify for release builds (animation-freeze diagnostic)" by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5176 * Fix node-details remove action to preserve confirmation flow by @Copilot in https://github.com/meshtastic/Meshtastic-Android/pull/5192 * Change default ContrastLevel from STANDARD to MEDIUM by @somenice in https://github.com/meshtastic/Meshtastic-Android/pull/5325 From f38536ae61c8eaa99bcb315b4953bbfd90b7979c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 19 May 2026 14:25:20 -0500 Subject: [PATCH 57/78] docs: update CHANGELOG.md (#5505) --- CHANGELOG.md | 468 ++++++++++++++++++++++++++------------------------- 1 file changed, 235 insertions(+), 233 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4209ebf80..2bca8fcf9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,261 +9,263 @@ See [GitHub Releases](https://github.com/meshtastic/Meshtastic-Android/releases) ### Unreleased (not yet in any build) -* chore(deps): update room to v3.0.0-alpha05 (#5498) by @renovate[bot] in [`59499e827`](https://github.com/meshtastic/Meshtastic-Android/commit/59499e82723bdef4f1116ae5996814d59ab85595) -* chore(deps): update org.junit.platform:junit-platform-launcher to v6.1.0 (#5502) by @renovate[bot] in [`2b7621221`](https://github.com/meshtastic/Meshtastic-Android/commit/2b76212217122604eeb14ba02ea45d93809773a0) -* chore(deps): update org.junit.vintage:junit-vintage-engine to v6.1.0 (#5503) by @renovate[bot] in [`ae127a1e1`](https://github.com/meshtastic/Meshtastic-Android/commit/ae127a1e15bdbbae6395a4c21da6440297cdb13b) -* docs: move English sources into docs/en/ locale folder (#5501) by James Rich (@jamesarich) in [`11bc37c96`](https://github.com/meshtastic/Meshtastic-Android/commit/11bc37c96878cd1d9a822c1dad658f43c9be6604) -* fix(ci): exclude pre-release tags from docs-release workflow (#5499) by James Rich (@jamesarich) in [`92cfbaee9`](https://github.com/meshtastic/Meshtastic-Android/commit/92cfbaee9b8819804571ae15fd0815b8ab785bce) -* docs: update CHANGELOG.md (#5495) by @github-actions[bot] in [`51d2c7b15`](https://github.com/meshtastic/Meshtastic-Android/commit/51d2c7b15cf1b3520cfbef13b8dbcff0b72748e4) -* chore(deps): update compose-multiplatform to v1.11.2 (#5497) by @renovate[bot] in [`619897de8`](https://github.com/meshtastic/Meshtastic-Android/commit/619897de85616eb9bebedf850970abd24571f705) -* fix(ci): unblock Dokka documentation generation (#5496) by James Rich (@jamesarich) in [`228765a15`](https://github.com/meshtastic/Meshtastic-Android/commit/228765a159b6f1498566d3fe6005f91b470761b4) -* fix(docs): use locale subdirectory inside files/ instead of qualifier (#5494) by James Rich (@jamesarich) in [`418861d35`](https://github.com/meshtastic/Meshtastic-Android/commit/418861d356f1edf5ac0c4b00f3bfc761ad34e609) -* docs: update CHANGELOG.md (#5473) by @github-actions[bot] in [`3121ea09a`](https://github.com/meshtastic/Meshtastic-Android/commit/3121ea09a3abb43713f0a090dac5147b6ae76f84) -* chore: Scheduled updates (Firmware, Hardware, Translations, Graphs) (#5465) by James Rich (@jamesarich) in [`83bb1a31f`](https://github.com/meshtastic/Meshtastic-Android/commit/83bb1a31f75bfd2717428f2fed287eb1e830302f) -* chore(deps): update peter-evans/create-pull-request action to v8 (#5493) by @renovate[bot] in [`a141df437`](https://github.com/meshtastic/Meshtastic-Android/commit/a141df437298b039086e9084ec234f925ffa09b2) -* chore(deps): update node to v24 (#5491) by @renovate[bot] in [`cdf57ced8`](https://github.com/meshtastic/Meshtastic-Android/commit/cdf57ced8e9d6a6ce66a88f10da304a41b0ab4c1) -* chore(deps): update compose-multiplatform to v1.3.0-beta01 (#5490) by @renovate[bot] in [`3bfaa466a`](https://github.com/meshtastic/Meshtastic-Android/commit/3bfaa466afc01fe03cc69ba7437610441ba8bcf7) -* fix(ci): disable configuration cache for Dokka build (#5492) by James Rich (@jamesarich) in [`fe2cbae87`](https://github.com/meshtastic/Meshtastic-Android/commit/fe2cbae8756c4af9f1daacd842ab0fde097ffab6) -* docs: comprehensive accuracy audit and CI fix (#5489) by James Rich (@jamesarich) in [`ece771edb`](https://github.com/meshtastic/Meshtastic-Android/commit/ece771edb06f0110050baac322a093214b89f6c8) -* chore(deps): update actions/setup-java action to v5 (#5484) by @renovate[bot] in [`bbdc4a300`](https://github.com/meshtastic/Meshtastic-Android/commit/bbdc4a300406ae417ad7a70fb4cdd826debb5cb3) -* chore(deps): update actions/upload-pages-artifact action to v5 (#5487) by @renovate[bot] in [`4afa1a032`](https://github.com/meshtastic/Meshtastic-Android/commit/4afa1a032fc465464e7408ef36d0505876ce9d61) -* chore(deps): update gradle/actions action to v6 (#5488) by @renovate[bot] in [`21993b6cc`](https://github.com/meshtastic/Meshtastic-Android/commit/21993b6cc7eba8776262c3805942ddc460ab0c5b) -* chore(deps): update actions/setup-node action to v6 (#5486) by @renovate[bot] in [`733cb92ae`](https://github.com/meshtastic/Meshtastic-Android/commit/733cb92aecb51deab11edb2e9c3e198f9579304c) -* chore(deps): update io.nlopez.compose.rules:detekt to v0.5.9 (#5485) by @renovate[bot] in [`4eb7ed8fe`](https://github.com/meshtastic/Meshtastic-Android/commit/4eb7ed8fe0853850a8056524403d4da3d8c36de3) -* chore(deps): update actions/github-script action to v9 (#5483) by @renovate[bot] in [`f8a5f894a`](https://github.com/meshtastic/Meshtastic-Android/commit/f8a5f894a86b6145b86143888f7ea1fe3d9ccbb6) -* chore(deps): update actions/deploy-pages action to v5 (#5482) by @renovate[bot] in [`d7cccd0db`](https://github.com/meshtastic/Meshtastic-Android/commit/d7cccd0dba442d8c8892a4aac8124f565563434a) -* chore(deps): update actions/checkout action to v6 (#5481) by @renovate[bot] in [`2e484e219`](https://github.com/meshtastic/Meshtastic-Android/commit/2e484e219c132b89597ffa939e1801765a5d5352) -* feat(docs): In-app documentation browser with Jekyll site and Docusaurus sync (#5445) by James Rich (@jamesarich) in [`fc0df1a79`](https://github.com/meshtastic/Meshtastic-Android/commit/fc0df1a79ad1d8ce355803f5ac6eb4a1f2ec78c3) -* feat: adopt Material 3 Expressive design system (M3-native APIs only) (#5479) by James Rich (@jamesarich) in [`f5128798a`](https://github.com/meshtastic/Meshtastic-Android/commit/f5128798a808219a28e9ee0916c079edcb203744) -* chore(deps): update core/proto/src/main/proto digest to 59cb394 (#5480) by @renovate[bot] in [`72436e70b`](https://github.com/meshtastic/Meshtastic-Android/commit/72436e70bc1db9373581bc53e8cc62548e596744) -* fix(nav): remote admin nodenum + Nav3 consolidation and improvements (#5478) by James Rich (@jamesarich) in [`df4f10c4d`](https://github.com/meshtastic/Meshtastic-Android/commit/df4f10c4d64a273688aa9dbe5284ac3737756310) -* chore(deps): update markdownrenderer to v0.41.0 (#5471) by @renovate[bot] in [`f6587a123`](https://github.com/meshtastic/Meshtastic-Android/commit/f6587a12364cc490b5872ed7bc77cfeed9e414a6) -* fix(settings): add input validation for BLE PIN, LoRa modem, and ambient lighting (#5477) by James Rich (@jamesarich) in [`1dd47bc09`](https://github.com/meshtastic/Meshtastic-Android/commit/1dd47bc09032fe0972af7eed6a7554e61be7a02b) -* refactor(build): rename entry modules and remove DESKTOP_ONLY mode (#5476) by James Rich (@jamesarich) in [`f4b6b02ac`](https://github.com/meshtastic/Meshtastic-Android/commit/f4b6b02acecdd8855408db7d92757f2495fbc11f) -* ci: remove desktop build job from reusable-check to cut macOS runner costs (#5475) by James Rich (@jamesarich) in [`d24fc9ac9`](https://github.com/meshtastic/Meshtastic-Android/commit/d24fc9ac9245b69718e2cb2a6c3a872e36d8c28c) +* chore(deps): update vico to v3.2.0-next.5 (#5470) by renovate[bot] (@renovate[bot]) in [`4bacff81c`](https://github.com/meshtastic/Meshtastic-Android/commit/4bacff81c5abad536b40f7370ae5d302b74a11fe) +* chore(deps): update spotless to v8.5.1 (#5468) by renovate[bot] (@renovate[bot]) in [`c91219d8b`](https://github.com/meshtastic/Meshtastic-Android/commit/c91219d8b0411975c059c7a5ae6eb370386954f6) +* chore(deps): update wire to v6.4.0 (#5466) by renovate[bot] (@renovate[bot]) in [`f0e12695b`](https://github.com/meshtastic/Meshtastic-Android/commit/f0e12695bbf3df16b043476ff98856b727d6a2f7) * fix(database): make withDb retry logic resilient to varying close messages (#5474) by James Rich (@jamesarich) in [`057d5bb77`](https://github.com/meshtastic/Meshtastic-Android/commit/057d5bb778a72cf4359abc7fae904d587cdc90a2) -* chore(deps): update wire to v6.4.0 (#5466) by @renovate[bot] in [`f0e12695b`](https://github.com/meshtastic/Meshtastic-Android/commit/f0e12695bbf3df16b043476ff98856b727d6a2f7) -* chore(deps): update spotless to v8.5.1 (#5468) by @renovate[bot] in [`c91219d8b`](https://github.com/meshtastic/Meshtastic-Android/commit/c91219d8b0411975c059c7a5ae6eb370386954f6) -* chore(deps): update vico to v3.2.0-next.5 (#5470) by @renovate[bot] in [`4bacff81c`](https://github.com/meshtastic/Meshtastic-Android/commit/4bacff81c5abad536b40f7370ae5d302b74a11fe) +* ci: remove desktop build job from reusable-check to cut macOS runner costs (#5475) by James Rich (@jamesarich) in [`d24fc9ac9`](https://github.com/meshtastic/Meshtastic-Android/commit/d24fc9ac9245b69718e2cb2a6c3a872e36d8c28c) +* refactor(build): rename entry modules and remove DESKTOP_ONLY mode (#5476) by James Rich (@jamesarich) in [`f4b6b02ac`](https://github.com/meshtastic/Meshtastic-Android/commit/f4b6b02acecdd8855408db7d92757f2495fbc11f) +* fix(settings): add input validation for BLE PIN, LoRa modem, and ambient lighting (#5477) by James Rich (@jamesarich) in [`1dd47bc09`](https://github.com/meshtastic/Meshtastic-Android/commit/1dd47bc09032fe0972af7eed6a7554e61be7a02b) +* chore(deps): update markdownrenderer to v0.41.0 (#5471) by renovate[bot] (@renovate[bot]) in [`f6587a123`](https://github.com/meshtastic/Meshtastic-Android/commit/f6587a12364cc490b5872ed7bc77cfeed9e414a6) +* fix(nav): remote admin nodenum + Nav3 consolidation and improvements (#5478) by James Rich (@jamesarich) in [`df4f10c4d`](https://github.com/meshtastic/Meshtastic-Android/commit/df4f10c4d64a273688aa9dbe5284ac3737756310) +* chore(deps): update core/proto/src/main/proto digest to 59cb394 (#5480) by renovate[bot] (@renovate[bot]) in [`72436e70b`](https://github.com/meshtastic/Meshtastic-Android/commit/72436e70bc1db9373581bc53e8cc62548e596744) +* feat: adopt Material 3 Expressive design system (M3-native APIs only) (#5479) by James Rich (@jamesarich) in [`f5128798a`](https://github.com/meshtastic/Meshtastic-Android/commit/f5128798a808219a28e9ee0916c079edcb203744) +* feat(docs): In-app documentation browser with Jekyll site and Docusaurus sync (#5445) by James Rich (@jamesarich) in [`fc0df1a79`](https://github.com/meshtastic/Meshtastic-Android/commit/fc0df1a79ad1d8ce355803f5ac6eb4a1f2ec78c3) +* chore(deps): update actions/checkout action to v6 (#5481) by renovate[bot] (@renovate[bot]) in [`2e484e219`](https://github.com/meshtastic/Meshtastic-Android/commit/2e484e219c132b89597ffa939e1801765a5d5352) +* chore(deps): update actions/deploy-pages action to v5 (#5482) by renovate[bot] (@renovate[bot]) in [`d7cccd0db`](https://github.com/meshtastic/Meshtastic-Android/commit/d7cccd0dba442d8c8892a4aac8124f565563434a) +* chore(deps): update actions/github-script action to v9 (#5483) by renovate[bot] (@renovate[bot]) in [`f8a5f894a`](https://github.com/meshtastic/Meshtastic-Android/commit/f8a5f894a86b6145b86143888f7ea1fe3d9ccbb6) +* chore(deps): update io.nlopez.compose.rules:detekt to v0.5.9 (#5485) by renovate[bot] (@renovate[bot]) in [`4eb7ed8fe`](https://github.com/meshtastic/Meshtastic-Android/commit/4eb7ed8fe0853850a8056524403d4da3d8c36de3) +* chore(deps): update actions/setup-node action to v6 (#5486) by renovate[bot] (@renovate[bot]) in [`733cb92ae`](https://github.com/meshtastic/Meshtastic-Android/commit/733cb92aecb51deab11edb2e9c3e198f9579304c) +* chore(deps): update gradle/actions action to v6 (#5488) by renovate[bot] (@renovate[bot]) in [`21993b6cc`](https://github.com/meshtastic/Meshtastic-Android/commit/21993b6cc7eba8776262c3805942ddc460ab0c5b) +* chore(deps): update actions/upload-pages-artifact action to v5 (#5487) by renovate[bot] (@renovate[bot]) in [`4afa1a032`](https://github.com/meshtastic/Meshtastic-Android/commit/4afa1a032fc465464e7408ef36d0505876ce9d61) +* chore(deps): update actions/setup-java action to v5 (#5484) by renovate[bot] (@renovate[bot]) in [`bbdc4a300`](https://github.com/meshtastic/Meshtastic-Android/commit/bbdc4a300406ae417ad7a70fb4cdd826debb5cb3) +* docs: comprehensive accuracy audit and CI fix (#5489) by James Rich (@jamesarich) in [`ece771edb`](https://github.com/meshtastic/Meshtastic-Android/commit/ece771edb06f0110050baac322a093214b89f6c8) +* fix(ci): disable configuration cache for Dokka build (#5492) by James Rich (@jamesarich) in [`fe2cbae87`](https://github.com/meshtastic/Meshtastic-Android/commit/fe2cbae8756c4af9f1daacd842ab0fde097ffab6) +* chore(deps): update compose-multiplatform to v1.3.0-beta01 (#5490) by renovate[bot] (@renovate[bot]) in [`3bfaa466a`](https://github.com/meshtastic/Meshtastic-Android/commit/3bfaa466afc01fe03cc69ba7437610441ba8bcf7) +* chore(deps): update node to v24 (#5491) by renovate[bot] (@renovate[bot]) in [`cdf57ced8`](https://github.com/meshtastic/Meshtastic-Android/commit/cdf57ced8e9d6a6ce66a88f10da304a41b0ab4c1) +* chore(deps): update peter-evans/create-pull-request action to v8 (#5493) by renovate[bot] (@renovate[bot]) in [`a141df437`](https://github.com/meshtastic/Meshtastic-Android/commit/a141df437298b039086e9084ec234f925ffa09b2) +* chore: Scheduled updates (Firmware, Hardware, Translations, Graphs) (#5465) by James Rich (@jamesarich) in [`83bb1a31f`](https://github.com/meshtastic/Meshtastic-Android/commit/83bb1a31f75bfd2717428f2fed287eb1e830302f) +* docs: update CHANGELOG.md (#5473) by github-actions[bot] (@github-actions[bot]) in [`3121ea09a`](https://github.com/meshtastic/Meshtastic-Android/commit/3121ea09a3abb43713f0a090dac5147b6ae76f84) +* fix(docs): use locale subdirectory inside files/ instead of qualifier (#5494) by James Rich (@jamesarich) in [`418861d35`](https://github.com/meshtastic/Meshtastic-Android/commit/418861d356f1edf5ac0c4b00f3bfc761ad34e609) +* fix(ci): unblock Dokka documentation generation (#5496) by James Rich (@jamesarich) in [`228765a15`](https://github.com/meshtastic/Meshtastic-Android/commit/228765a159b6f1498566d3fe6005f91b470761b4) +* chore(deps): update compose-multiplatform to v1.11.2 (#5497) by renovate[bot] (@renovate[bot]) in [`619897de8`](https://github.com/meshtastic/Meshtastic-Android/commit/619897de85616eb9bebedf850970abd24571f705) +* docs: update CHANGELOG.md (#5495) by github-actions[bot] (@github-actions[bot]) in [`51d2c7b15`](https://github.com/meshtastic/Meshtastic-Android/commit/51d2c7b15cf1b3520cfbef13b8dbcff0b72748e4) +* fix(ci): exclude pre-release tags from docs-release workflow (#5499) by James Rich (@jamesarich) in [`92cfbaee9`](https://github.com/meshtastic/Meshtastic-Android/commit/92cfbaee9b8819804571ae15fd0815b8ab785bce) +* docs: move English sources into docs/en/ locale folder (#5501) by James Rich (@jamesarich) in [`11bc37c96`](https://github.com/meshtastic/Meshtastic-Android/commit/11bc37c96878cd1d9a822c1dad658f43c9be6604) +* chore(deps): update org.junit.vintage:junit-vintage-engine to v6.1.0 (#5503) by renovate[bot] (@renovate[bot]) in [`ae127a1e1`](https://github.com/meshtastic/Meshtastic-Android/commit/ae127a1e15bdbbae6395a4c21da6440297cdb13b) +* chore(deps): update org.junit.platform:junit-platform-launcher to v6.1.0 (#5502) by renovate[bot] (@renovate[bot]) in [`2b7621221`](https://github.com/meshtastic/Meshtastic-Android/commit/2b76212217122604eeb14ba02ea45d93809773a0) +* chore(deps): update room to v3.0.0-alpha05 (#5498) by renovate[bot] (@renovate[bot]) in [`59499e827`](https://github.com/meshtastic/Meshtastic-Android/commit/59499e82723bdef4f1116ae5996814d59ab85595) +* docs: update CHANGELOG.md (#5500) by github-actions[bot] (@github-actions[bot]) in [`6c51c1ac1`](https://github.com/meshtastic/Meshtastic-Android/commit/6c51c1ac18cd61f3ab381335ecada8c9d614b7cb) +* fix(ci): use GitHub compare API for changelog author resolution (#5504) by James Rich (@jamesarich) in [`4ff6f23c5`](https://github.com/meshtastic/Meshtastic-Android/commit/4ff6f23c5e5d074f319736a74e563f28bf65c127) ### Open Beta (v2.7.14-open.9) Changes since [`v2.7.13`](https://github.com/meshtastic/Meshtastic-Android/releases/tag/v2.7.13): #### 🏗️ Features -* refactor(ble): Centralize BLE logic into a core module by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4550 -* feat(ble): Add support for `FromRadioSync` characteristic by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4609 -* feat(widget): Add Local Stats glance widget by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4642 -* chore(deps): bump deps to take advantage of new functionality by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4658 -* feat(maps): Google maps improvements for network and offline tilesources by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4664 -* feat: Improve edge-to-edge and display cutout handling by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4669 -* feat: upcoming support for tak and trafficmanagement configs, device hw by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4671 -* feat: settings rework by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4678 -* feat: settings rework part 2, domain and usecase abstraction, tests by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4680 -* feat: service decoupling by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4685 -* refactor: migrate :core:database to Room Kotlin Multiplatform by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4702 -* refactor(ble): improve connection lifecycle and enhance OTA reliability by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4721 -* refactor: migrate preferences to DataStore and decouple core:domain for KMP by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4731 -* refactor: migrate core modules to Kotlin Multiplatform and consolidat… by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4735 -* feat: Migrate project to Kotlin Multiplatform (KMP) architecture by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4738 -* refactor: migrate from Hilt to Koin and expand KMP common modules by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4746 -* refactor: migrate core UI and features to KMP, adopt Navigation 3 by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4750 -* feat: introduce Desktop target and expand Kotlin Multiplatform (KMP) architecture by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4761 -* build(desktop): enable ProGuard for release builds by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4772 -* feat(desktop): implement DI auto-wiring and validation by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4782 -* feat(desktop): expand supported native distribution formats by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4783 -* feat: Complete ViewModel extraction and update documentation by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4817 -* refactor: Replace Nordic, use Kable backend for Desktop and Android with BLE support by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4818 -* feat: Integrate notification management and preferences across platforms by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4819 -* feat: service extraction by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4828 -* feat: build logic by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4829 -* feat: Desktop USB serial transport by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4836 +* refactor(ble): Centralize BLE logic into a core module by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4550 +* feat(ble): Add support for `FromRadioSync` characteristic by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4609 +* feat(widget): Add Local Stats glance widget by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4642 +* chore(deps): bump deps to take advantage of new functionality by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4658 +* feat(maps): Google maps improvements for network and offline tilesources by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4664 +* feat: Improve edge-to-edge and display cutout handling by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4669 +* feat: upcoming support for tak and trafficmanagement configs, device hw by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4671 +* feat: settings rework by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4678 +* feat: settings rework part 2, domain and usecase abstraction, tests by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4680 +* feat: service decoupling by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4685 +* refactor: migrate :core:database to Room Kotlin Multiplatform by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4702 +* refactor(ble): improve connection lifecycle and enhance OTA reliability by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4721 +* refactor: migrate preferences to DataStore and decouple core:domain for KMP by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4731 +* refactor: migrate core modules to Kotlin Multiplatform and consolidat… by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4735 +* feat: Migrate project to Kotlin Multiplatform (KMP) architecture by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4738 +* refactor: migrate from Hilt to Koin and expand KMP common modules by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4746 +* refactor: migrate core UI and features to KMP, adopt Navigation 3 by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4750 +* feat: introduce Desktop target and expand Kotlin Multiplatform (KMP) architecture by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4761 +* build(desktop): enable ProGuard for release builds by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4772 +* feat(desktop): implement DI auto-wiring and validation by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4782 +* feat(desktop): expand supported native distribution formats by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4783 +* feat: Complete ViewModel extraction and update documentation by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4817 +* refactor: Replace Nordic, use Kable backend for Desktop and Android with BLE support by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4818 +* feat: Integrate notification management and preferences across platforms by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4819 +* feat: service extraction by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4828 +* feat: build logic by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4829 +* feat: Desktop USB serial transport by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4836 * Add "Exclude MQTT" filter to Nodes view. by @VictorioBerra in https://github.com/meshtastic/Meshtastic-Android/pull/4825 -* feat: mqtt by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4841 -* feat: Integrate Mokkery and Turbine into KMP testing framework by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4845 -* feat: Complete app module thinning and feature module extraction by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4844 -* feat: Enhance test coverage by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4847 -* feat: Implement KMP ServiceDiscovery for TCP devices by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4854 -* feat: Add KMP URI handling, import, and QR code generation support by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4856 -* feat: KMP Debug Panel Migration and Update Documentation by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4859 -* feat: Migrate to Room 3.0 and update related documentation and tracks by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4865 -* feat: Implement iOS support and unify Compose Multiplatform infrastructure by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4876 +* feat: mqtt by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4841 +* feat: Integrate Mokkery and Turbine into KMP testing framework by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4845 +* feat: Complete app module thinning and feature module extraction by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4844 +* feat: Enhance test coverage by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4847 +* feat: Implement KMP ServiceDiscovery for TCP devices by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4854 +* feat: Add KMP URI handling, import, and QR code generation support by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4856 +* feat: KMP Debug Panel Migration and Update Documentation by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4859 +* feat: Migrate to Room 3.0 and update related documentation and tracks by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4865 +* feat: Implement iOS support and unify Compose Multiplatform infrastructure by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4876 * Add InlineMap implementation for F-Droid build by @theKorzh in https://github.com/meshtastic/Meshtastic-Android/pull/4877 -* refactor(desktop): remove native MenuBar from main window by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4888 -* feat: Migrate networking to Ktor and enhance multiplatform support by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4890 -* refactor: adaptive UI components for Navigation 3 by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4891 -* feat: Integrate AlertHost into desktop application and add UI tests by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4893 -* feat: implement global SnackbarManager and consolidate common UI setup by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4909 -* feat: implement unified deep link routing for Kotlin Multiplatform by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4910 -* refactor: BLE transport and UI for Kotlin Multiplatform unification by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4911 -* Refactor map layer management and navigation infrastructure by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4921 -* feat: migrate to Material 3 Expressive APIs by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4934 -* Refactor nav3 architecture and enhance adaptive layouts by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4944 -* feat(tak): introduce built-in Local TAK Server and mesh integration by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4951 -* feat(analytics): expand DataDog RUM integration and align with iOS parity by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4970 -* feat(wifi): introduce BLE-based WiFi provisioning for nymea-compatible devices by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4968 -* feat(wifi-provision): add mPWRD-OS branding and disclaimer banner by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4978 -* feat(charts): adopt Vico best practices, add sensor data, and migrate TracerouteLog by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5026 -* refactor(icons): migrate to self-hosted VectorDrawable XMLs via MeshtasticIcons by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5030 -* feat(messaging): add IME Send action to message input by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5047 -* feat(metrics): redesign position log with SelectableMetricCard and add CSV export to all metrics screens by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5062 -* feat(core/ui): add safeLaunch, UiState, KMP permissions, and CMP lifecycle modernization by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5118 -* feat(desktop): add entitlements and wire MeshConnectionManager into orchestrator by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5127 -* feat(environment): add 1-Wire multi-thermometer (DS18B20) display support by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5130 -* feat: add high-contrast theme with accessible message bubbles by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5135 -* feat(mqtt): migrate to MQTTastic-Client-KMP by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5165 -* feat(mqtt): adopt mqttastic-client-kmp 0.2.0 — disconnect reasons + Test Connection by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5181 -* feat(firmware): nRF52 BLE Legacy DFU support by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5209 -* feat(service): send polite ToRadio(disconnect=true) before transport close by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5210 -* feat(node): smoother remote-admin UX with per-node session tracking by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5217 -* fix(ble): unblock reconnect + kable audit (logging, priority, backoff, StateFlow) by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5222 -* feat: Enhance mPWRD-os WiFi provisioning success state and UI components by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5225 -* feat(messaging): add entry points for filter settings by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5229 -* feat(messaging): send message on Enter keypress by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5246 -* feat(desktop): native OS notifications via libnotify/osascript/PowerShell by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5253 +* refactor(desktop): remove native MenuBar from main window by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4888 +* feat: Migrate networking to Ktor and enhance multiplatform support by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4890 +* refactor: adaptive UI components for Navigation 3 by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4891 +* feat: Integrate AlertHost into desktop application and add UI tests by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4893 +* feat: implement global SnackbarManager and consolidate common UI setup by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4909 +* feat: implement unified deep link routing for Kotlin Multiplatform by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4910 +* refactor: BLE transport and UI for Kotlin Multiplatform unification by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4911 +* Refactor map layer management and navigation infrastructure by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4921 +* feat: migrate to Material 3 Expressive APIs by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4934 +* Refactor nav3 architecture and enhance adaptive layouts by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4944 +* feat(tak): introduce built-in Local TAK Server and mesh integration by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4951 +* feat(analytics): expand DataDog RUM integration and align with iOS parity by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4970 +* feat(wifi): introduce BLE-based WiFi provisioning for nymea-compatible devices by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4968 +* feat(wifi-provision): add mPWRD-OS branding and disclaimer banner by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4978 +* feat(charts): adopt Vico best practices, add sensor data, and migrate TracerouteLog by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5026 +* refactor(icons): migrate to self-hosted VectorDrawable XMLs via MeshtasticIcons by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5030 +* feat(messaging): add IME Send action to message input by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5047 +* feat(metrics): redesign position log with SelectableMetricCard and add CSV export to all metrics screens by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5062 +* feat(core/ui): add safeLaunch, UiState, KMP permissions, and CMP lifecycle modernization by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5118 +* feat(desktop): add entitlements and wire MeshConnectionManager into orchestrator by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5127 +* feat(environment): add 1-Wire multi-thermometer (DS18B20) display support by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5130 +* feat: add high-contrast theme with accessible message bubbles by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5135 +* feat(mqtt): migrate to MQTTastic-Client-KMP by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5165 +* feat(mqtt): adopt mqttastic-client-kmp 0.2.0 — disconnect reasons + Test Connection by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5181 +* feat(firmware): nRF52 BLE Legacy DFU support by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5209 +* feat(service): send polite ToRadio(disconnect=true) before transport close by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5210 +* feat(node): smoother remote-admin UX with per-node session tracking by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5217 +* fix(ble): unblock reconnect + kable audit (logging, priority, backoff, StateFlow) by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5222 +* feat: Enhance mPWRD-os WiFi provisioning success state and UI components by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5225 +* feat(messaging): add entry points for filter settings by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5229 +* feat(messaging): send message on Enter keypress by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5246 +* feat(desktop): native OS notifications via libnotify/osascript/PowerShell by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5253 * feat(auto): enable Android Auto messaging notifications by @riddlemd in https://github.com/meshtastic/Meshtastic-Android/pull/5265 -* fix: update emoji catalog metadata and improve picker synchronization by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5292 -* fix: update notification icon by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5293 -* feat(connections): connection sorting & conversation empty channel ranking by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5295 -* fix(connections): improve BLE scan reliability and UI lifecycle by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5329 -* feat: event firmware easter egg with ambient branding by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5354 -* feat: align theme with Design Standards v1.3, remove contrast setting by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5355 -* feat(desktop): fix mac notifications, new desktop icons by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5403 -* Update notification intents and deep link URI format by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5408 -* fix: clarify position precision as ± radius by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5428 -* feat: TAK v2 protocol integration with zstd compression and full CoT type support by Ben Meadors (@thebentern) in https://github.com/meshtastic/Meshtastic-Android/pull/5434 +* fix: update emoji catalog metadata and improve picker synchronization by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5292 +* fix: update notification icon by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5293 +* feat(connections): connection sorting & conversation empty channel ranking by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5295 +* fix(connections): improve BLE scan reliability and UI lifecycle by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5329 +* feat: event firmware easter egg with ambient branding by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5354 +* feat: align theme with Design Standards v1.3, remove contrast setting by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5355 +* feat(desktop): fix mac notifications, new desktop icons by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5403 +* Update notification intents and deep link URI format by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5408 +* fix: clarify position precision as ± radius by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5428 +* feat: TAK v2 protocol integration with zstd compression and full CoT type support by @thebentern in https://github.com/meshtastic/Meshtastic-Android/pull/5434 #### 🖥️ Desktop -* fix(desktop): keep Vico package to prevent bytecode verification errors by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5424 +* fix(desktop): keep Vico package to prevent bytecode verification errors by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5424 #### 🛠️ Fixes -* fix(strings): replace plurals by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4596 -* fix: replace fdroid map_style_selection string by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4598 -* refactor(test): Introduce MeshTestApplication for robust testing by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4602 -* fix: spotless by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4604 -* feat(build): Implement flavor-specific barcode scanning and build improvements by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4611 +* fix(strings): replace plurals by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4596 +* fix: replace fdroid map_style_selection string by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4598 +* refactor(test): Introduce MeshTestApplication for robust testing by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4602 +* fix: spotless by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4604 +* feat(build): Implement flavor-specific barcode scanning and build improvements by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4611 * fix(qr): add channels as key to remember block to fix add-channel rac… by @nreisbeck in https://github.com/meshtastic/Meshtastic-Android/pull/4607 -* chore(ble): Add Proguard rules for Nordic BLE library by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4618 -* ci(release): Use wildcards for APK paths in release workflow by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4619 -* chore(ci): Use wildcard for APK paths in release workflow by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4622 -* chore(ci): Refine analytics task filtering and improve release debugging by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4624 -* Fix/splits by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4626 +* chore(ble): Add Proguard rules for Nordic BLE library by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4618 +* ci(release): Use wildcards for APK paths in release workflow by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4619 +* chore(ci): Use wildcard for APK paths in release workflow by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4622 +* chore(ci): Refine analytics task filtering and improve release debugging by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4624 +* Fix/splits by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4626 * Align FDroid MapView constructor with Google version (Issue #4576) by @ujade in https://github.com/meshtastic/Meshtastic-Android/pull/4630 -* refactor(analytics): reduce tracking footprint by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4649 -* fix(map): location perms and button visibility, breadcrumb taps by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4651 +* refactor(analytics): reduce tracking footprint by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4649 +* fix(map): location perms and button visibility, breadcrumb taps by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4651 * fix(strings): Correct capitalization of Ham by @alecperkins in https://github.com/meshtastic/Meshtastic-Android/pull/4620 -* ci: Split Google artifact attestations and ensure F-Droid uploads by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4665 -* fix: Replace strings.xml with app_name resource by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4666 -* Disable generate_release_notes in release workflow by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4668 -* fix: ui tweaks by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4696 -* refactor: simplify traceroute tracking and unify cooldown button logic by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4699 -* feat: Add "Mark all as read" and unread message count indicators by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4720 -* fix(widget): ensure local stats widget gets updates by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4722 -* refactor(ble): increase default timeout for BLE profiling by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4728 -* refactor: enhance handshake stall guard and extend coverage to Stage 2 by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4730 -* build(ci): optimize release workflow and update Room configuration by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4775 -* Disable ProGuard for desktop release and add application icon by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4776 -* fix(ble): implement scanning for unbonded devices in common connections ui by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4779 -* fix: fix animation stalls and update dependencies for stability by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4784 -* build(desktop): include `java.net.http` module in native distribution by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4787 -* build: remove PKG from desktop distribution targets by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4788 -* build: Update desktop app icons, versioning, and packaging configuration by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4789 -* refactor(settings): improve destination node handling in RadioConfigViewModel by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4790 -* feat(desktop): add enter-to-send functionality in messaging by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4793 -* feat: enhance map navigation and waypoint handling by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4814 -* build: fix license generation and analytics build tasks by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4820 -* fix: resolve crashes and debug filter issues in Metrics and MapView by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4824 -* fix(map, settings): allow null IDs and implement request timeout by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4851 -* docs: Unify notification channel management and migrate unit tests by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4867 -* fix: Implement reconnection logic and stabilize BLE connection flow by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4870 -* fix: Update messaging feature with contact item keys and MQTT limits by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4871 -* fix: specify jetbrains in gradle-daemon-jvm.properties by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4872 -* fix(settings): remove redundant regex option in DebugViewModel by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4881 -* refactor(service): update string formatting for local stats notif by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4885 -* refactor(messaging): fix contact key derivation in ContactsViewModel by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4887 -* feat: optimistically persist local configs and channels by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4898 -* refactor(di): specify disk cache directory for ImageLoader by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4899 -* refactor: null safety, update date/time libraries, and migrate tests by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4900 -* refactor: remove demoscenario and enhance BLE connection stability by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4914 -* refactor(ui): remove labels from navigation suite items by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4924 -* build: enable `-Xjvm-default=all` compiler flag by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4929 -* fix(ci): update APP_VERSION_NAME output reference in workflows by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4935 +* ci: Split Google artifact attestations and ensure F-Droid uploads by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4665 +* fix: Replace strings.xml with app_name resource by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4666 +* Disable generate_release_notes in release workflow by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4668 +* fix: ui tweaks by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4696 +* refactor: simplify traceroute tracking and unify cooldown button logic by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4699 +* feat: Add "Mark all as read" and unread message count indicators by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4720 +* fix(widget): ensure local stats widget gets updates by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4722 +* refactor(ble): increase default timeout for BLE profiling by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4728 +* refactor: enhance handshake stall guard and extend coverage to Stage 2 by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4730 +* build(ci): optimize release workflow and update Room configuration by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4775 +* Disable ProGuard for desktop release and add application icon by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4776 +* fix(ble): implement scanning for unbonded devices in common connections ui by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4779 +* fix: fix animation stalls and update dependencies for stability by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4784 +* build(desktop): include `java.net.http` module in native distribution by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4787 +* build: remove PKG from desktop distribution targets by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4788 +* build: Update desktop app icons, versioning, and packaging configuration by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4789 +* refactor(settings): improve destination node handling in RadioConfigViewModel by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4790 +* feat(desktop): add enter-to-send functionality in messaging by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4793 +* feat: enhance map navigation and waypoint handling by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4814 +* build: fix license generation and analytics build tasks by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4820 +* fix: resolve crashes and debug filter issues in Metrics and MapView by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4824 +* fix(map, settings): allow null IDs and implement request timeout by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4851 +* docs: Unify notification channel management and migrate unit tests by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4867 +* fix: Implement reconnection logic and stabilize BLE connection flow by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4870 +* fix: Update messaging feature with contact item keys and MQTT limits by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4871 +* fix: specify jetbrains in gradle-daemon-jvm.properties by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4872 +* fix(settings): remove redundant regex option in DebugViewModel by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4881 +* refactor(service): update string formatting for local stats notif by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4885 +* refactor(messaging): fix contact key derivation in ContactsViewModel by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4887 +* feat: optimistically persist local configs and channels by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4898 +* refactor(di): specify disk cache directory for ImageLoader by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4899 +* refactor: null safety, update date/time libraries, and migrate tests by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4900 +* refactor: remove demoscenario and enhance BLE connection stability by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4914 +* refactor(ui): remove labels from navigation suite items by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4924 +* build: enable `-Xjvm-default=all` compiler flag by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4929 +* fix(ci): update APP_VERSION_NAME output reference in workflows by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4935 * fix(strings): Fix public key description by @Klavionik in https://github.com/meshtastic/Meshtastic-Android/pull/4957 -* feat: implement XModem file transfers and enhance BLE connection robustness by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4959 -* Refactor navigation to use NodeDetail route and fix radio settings by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4960 -* Refactor and unify firmware update logic across platforms by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4966 -* fix: improve PKI message routing and resolve database migration racecondition by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4996 +* feat: implement XModem file transfers and enhance BLE connection robustness by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4959 +* Refactor navigation to use NodeDetail route and fix radio settings by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4960 +* Refactor and unify firmware update logic across platforms by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4966 +* fix: improve PKI message routing and resolve database migration racecondition by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4996 * fix: resolve correct node public key in sendSharedContact and favoriteNode by @Copilot in https://github.com/meshtastic/Meshtastic-Android/pull/5005 -* fix: resolve bugs across connection, PKI, admin, packet flow, and stability subsystems by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5011 -* fix(tak): resolve frequent TAK client disconnections by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5015 -* fix(service): resolve MeshService crash from eager notification channel init by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5034 -* style: update ic_no_cell and ic_place vector drawables by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5040 -* fix(build): prevent DataDog asset transform from stripping fdroid release assets by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5044 -* fix(icons): replace outline (FILL=0) pathData with filled (FILL=1) from upstream Material Symbols by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5056 -* fix(charts): hoist rememberVicoZoomState above vararg layers to prevent ClassCastException by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5060 -* fix(ui): add missing @ParameterName annotations on actual rememberReadTextFromUri declarations by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5072 -* fix(settings): hide Status Message config until firmware v2.8.0 by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5070 -* fix(transport): Kable BLE audit + thread-safety, MQTT, and logging fixes across transport layers by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5071 -* fix(build): remove Compose BOM to resolve compileSdk 37 conflict by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5088 -* fix(connections): show device name during connecting state by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5085 -* fix(build): add explicit compose-multiplatform-animation dependency by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5095 -* fix(nav): restore broken traceroute map navigation by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5104 -* fix(build): overhaul R8 rules and DRY up build-logic conventions by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5109 -* fix(proguard): disable shrinking for Compose animation classes by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5116 -* fix(icons): audit and correct icon migration regressions from #5030 #5040 #5056 by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5136 -* fix: align BLE connection handshake with firmware protocol expectations by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5141 -* fix(app): add R8 keep rules for Compose animation/runtime/ui by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5146 -* perf(messaging): batch node + reply lookups in message loading by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5149 -* fix(app): disable R8 optimization to fix Compose animation freeze by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5150 -* fix(node): don't recreate Vico CartesianChartModelProducer on channel switch by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5160 -* refactor: use injected ioDispatcher and ApplicationCoroutineScope by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5167 -* fix: redact MeshLog proto secrets and centralize Compose keep-rules by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5166 -* fix(ui): stable LazyColumn keys, semantic roles, and content descriptions by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5168 -* fix(ui): finish accessibility roles and action labels for clickable surfaces by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5170 -* fix(widget): drive updates via debounced state observer by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5185 -* fix(transport): improve BLE / TCP / USB reconnect and handshake resilience by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5196 -* fix(fdroid): prevent NotImplementedError crash on firmware release fetch by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5197 -* fix(compass): stop coarse network fixes from clobbering GPS fixes by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5200 -* fix(canned-messages): enable multiline text editing for long message lists by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5203 -* fix(settings): restore Import/Export button functionality in #4913 by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5204 -* refactor: eliminate Accompanist permissions library by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5211 -* fix: MQTT proxy connection and probe test failures by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5215 +* fix: resolve bugs across connection, PKI, admin, packet flow, and stability subsystems by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5011 +* fix(tak): resolve frequent TAK client disconnections by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5015 +* fix(service): resolve MeshService crash from eager notification channel init by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5034 +* style: update ic_no_cell and ic_place vector drawables by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5040 +* fix(build): prevent DataDog asset transform from stripping fdroid release assets by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5044 +* fix(icons): replace outline (FILL=0) pathData with filled (FILL=1) from upstream Material Symbols by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5056 +* fix(charts): hoist rememberVicoZoomState above vararg layers to prevent ClassCastException by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5060 +* fix(ui): add missing @ParameterName annotations on actual rememberReadTextFromUri declarations by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5072 +* fix(settings): hide Status Message config until firmware v2.8.0 by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5070 +* fix(transport): Kable BLE audit + thread-safety, MQTT, and logging fixes across transport layers by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5071 +* fix(build): remove Compose BOM to resolve compileSdk 37 conflict by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5088 +* fix(connections): show device name during connecting state by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5085 +* fix(build): add explicit compose-multiplatform-animation dependency by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5095 +* fix(nav): restore broken traceroute map navigation by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5104 +* fix(build): overhaul R8 rules and DRY up build-logic conventions by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5109 +* fix(proguard): disable shrinking for Compose animation classes by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5116 +* fix(icons): audit and correct icon migration regressions from #5030 #5040 #5056 by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5136 +* fix: align BLE connection handshake with firmware protocol expectations by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5141 +* fix(app): add R8 keep rules for Compose animation/runtime/ui by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5146 +* perf(messaging): batch node + reply lookups in message loading by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5149 +* fix(app): disable R8 optimization to fix Compose animation freeze by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5150 +* fix(node): don't recreate Vico CartesianChartModelProducer on channel switch by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5160 +* refactor: use injected ioDispatcher and ApplicationCoroutineScope by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5167 +* fix: redact MeshLog proto secrets and centralize Compose keep-rules by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5166 +* fix(ui): stable LazyColumn keys, semantic roles, and content descriptions by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5168 +* fix(ui): finish accessibility roles and action labels for clickable surfaces by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5170 +* fix(widget): drive updates via debounced state observer by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5185 +* fix(transport): improve BLE / TCP / USB reconnect and handshake resilience by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5196 +* fix(fdroid): prevent NotImplementedError crash on firmware release fetch by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5197 +* fix(compass): stop coarse network fixes from clobbering GPS fixes by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5200 +* fix(canned-messages): enable multiline text editing for long message lists by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5203 +* fix(settings): restore Import/Export button functionality in #4913 by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5204 +* refactor: eliminate Accompanist permissions library by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5211 +* fix: MQTT proxy connection and probe test failures by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5215 * fix(ble): ensure GATT cleanup runs under NonCancellable on cancellation by @jdogg172 in https://github.com/meshtastic/Meshtastic-Android/pull/5207 -* fix(ble): cleanup races discovered while reviewing #5207 by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5221 +* fix(ble): cleanup races discovered while reviewing #5207 by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5221 * fix(ui): make footer buttons expand downwards by @zt64 in https://github.com/meshtastic/Meshtastic-Android/pull/5226 -* fix(desktop): suppress Vico ColorScale ProGuard warnings by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5232 -* fix(desktop): unbreak release crash via correct ProGuard rules by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5236 -* fix(crashlytics): resolve beta 2.7.14 crash issues by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5245 -* fix: Resolve top Crashlytics issues for 29320633 beta release by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5278 -* fix: persist language switching and correctly map locales by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5287 -* fix: ensure snackbar respects safe drawing padding over host modifiers by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5290 +* fix(desktop): suppress Vico ColorScale ProGuard warnings by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5232 +* fix(desktop): unbreak release crash via correct ProGuard rules by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5236 +* fix(crashlytics): resolve beta 2.7.14 crash issues by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5245 +* fix: Resolve top Crashlytics issues for 29320633 beta release by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5278 +* fix: persist language switching and correctly map locales by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5287 +* fix: ensure snackbar respects safe drawing padding over host modifiers by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5290 * fix(ui): align Cancel and Send enabled state by @elagin in https://github.com/meshtastic/Meshtastic-Android/pull/5284 -* fix(data): default new-node notifications off for event firmware by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5323 -* fix(network): resolve empty MQTT address and enforce TLS on default server by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5333 -* fix(mqtt): harden TLS enforcement, add user CA trust, and improve error diagnostics by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5365 -* fix: clamp future lastHeard timestamps to current time on ingestion by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5418 -* revert: Update retry settings in gradle-wrapper.properties by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5430 -* fix: update screenshots by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5435 +* fix(data): default new-node notifications off for event firmware by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5323 +* fix(network): resolve empty MQTT address and enforce TLS on default server by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5333 +* fix(mqtt): harden TLS enforcement, add user CA trust, and improve error diagnostics by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5365 +* fix: clamp future lastHeard timestamps to current time on ingestion by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5418 +* revert: Update retry settings in gradle-wrapper.properties by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5430 +* fix: update screenshots by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5435 #### 📝 Other Changes -* refactor(ui): compose resources, domain layer by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4628 +* refactor(ui): compose resources, domain layer by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4628 * Add per-message transport method icons for new message format by @Kealper in https://github.com/meshtastic/Meshtastic-Android/pull/4643 -* build: apply instrumented test dependencies conditionally by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4698 -* docs: summarize KMP migration progress and architectural decisions by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4770 -* ci(release): pass app version to desktop build via environment variable by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4774 -* ai: Establish conductor documentation and governance framework by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4780 +* build: apply instrumented test dependencies conditionally by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4698 +* docs: summarize KMP migration progress and architectural decisions by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4770 +* ci(release): pass app version to desktop build via environment variable by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4774 +* ai: Establish conductor documentation and governance framework by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4780 * fix: fix wrong getChannelUrl() call causing loss of "add" flag and un… by @skobkin in https://github.com/meshtastic/Meshtastic-Android/pull/4809 -* chore: Enhance CI coverage reporting and add main branch workflow by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4873 -* build(desktop): enable ProGuard minification and tree-shaking by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4904 -* build: update Compose Multiplatform and migrate lifecycle dependencies by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4932 -* chore: standardize resources and update documentation for Navigation 3 by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/4961 -* feat(settings): add DNS support and fix UDP protocol toggle by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5013 -* fix: use payload labels in pr_enforce_labels.yml to avoid rate limiting by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5018 -* fix: scope labeler trigger to reduce rate limiting and fix bugfix typo by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5020 -* test(prefs): migrate DataStore tests from androidHostTest to commonTest by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5092 -* fix(resources): add resourcePrefix to KMP + widget modules, rename prefixed resources by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5111 -* fix(charts): apply Vico 3.1.0 best-practice audit fixes by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5138 -* refactor(di): adopt @KoinApplication with startKoin() compiler plugin API by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5152 -* test: migrate MigrationTest to runTest and add missing repository fakes by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5171 -* refactor: consolidate metric formatting through MetricFormatter by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5169 -* chore(r8): remove redundant keep rules covered by consumer rules by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5172 -* Revert "diag(r8): disable minify for release builds (animation-freeze diagnostic)" by James Rich (@jamesarich) in https://github.com/meshtastic/Meshtastic-Android/pull/5176 +* chore: Enhance CI coverage reporting and add main branch workflow by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4873 +* build(desktop): enable ProGuard minification and tree-shaking by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4904 +* build: update Compose Multiplatform and migrate lifecycle dependencies by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4932 +* chore: standardize resources and update documentation for Navigation 3 by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/4961 +* feat(settings): add DNS support and fix UDP protocol toggle by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5013 +* fix: use payload labels in pr_enforce_labels.yml to avoid rate limiting by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5018 +* fix: scope labeler trigger to reduce rate limiting and fix bugfix typo by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5020 +* test(prefs): migrate DataStore tests from androidHostTest to commonTest by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5092 +* fix(resources): add resourcePrefix to KMP + widget modules, rename prefixed resources by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5111 +* fix(charts): apply Vico 3.1.0 best-practice audit fixes by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5138 +* refactor(di): adopt @KoinApplication with startKoin() compiler plugin API by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5152 +* test: migrate MigrationTest to runTest and add missing repository fakes by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5171 +* refactor: consolidate metric formatting through MetricFormatter by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5169 +* chore(r8): remove redundant keep rules covered by consumer rules by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5172 +* Revert "diag(r8): disable minify for release builds (animation-freeze diagnostic)" by @jamesarich in https://github.com/meshtastic/Meshtastic-Android/pull/5176 * Fix node-details remove action to preserve confirmation flow by @Copilot in https://github.com/meshtastic/Meshtastic-Android/pull/5192 * Change default ContrastLevel from STANDARD to MEDIUM by @somenice in https://github.com/meshtastic/Meshtastic-Android/pull/5325 From 01d32e15c00c952ca5933fb3d29c08d3a3989c59 Mon Sep 17 00:00:00 2001 From: James Rich <2199651+jamesarich@users.noreply.github.com> Date: Tue, 19 May 2026 12:36:47 -0700 Subject: [PATCH 58/78] fix(database): update @Relation annotations for Room 3.0.0-alpha05 (#5507) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../kotlin/org/meshtastic/core/database/entity/NodeEntity.kt | 4 ++-- .../kotlin/org/meshtastic/core/database/entity/Packet.kt | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/core/database/src/commonMain/kotlin/org/meshtastic/core/database/entity/NodeEntity.kt b/core/database/src/commonMain/kotlin/org/meshtastic/core/database/entity/NodeEntity.kt index 16134653b..b30a4306f 100644 --- a/core/database/src/commonMain/kotlin/org/meshtastic/core/database/entity/NodeEntity.kt +++ b/core/database/src/commonMain/kotlin/org/meshtastic/core/database/entity/NodeEntity.kt @@ -43,8 +43,8 @@ import org.meshtastic.proto.Position as WirePosition data class NodeWithRelations( @Embedded val node: NodeEntity, - @Relation(entity = MetadataEntity::class, parentColumn = "num", entityColumn = "num") - val metadata: MetadataEntity? = null, + @Relation(entity = MetadataEntity::class, parentColumns = ["num"], entityColumns = ["num"]) + val metadata: MetadataEntity?, ) { fun toModel() = with(node) { Node( diff --git a/core/database/src/commonMain/kotlin/org/meshtastic/core/database/entity/Packet.kt b/core/database/src/commonMain/kotlin/org/meshtastic/core/database/entity/Packet.kt index 0a9ea4aa2..5a16fd7b1 100644 --- a/core/database/src/commonMain/kotlin/org/meshtastic/core/database/entity/Packet.kt +++ b/core/database/src/commonMain/kotlin/org/meshtastic/core/database/entity/Packet.kt @@ -33,8 +33,8 @@ import org.meshtastic.core.model.util.getShortDateTime data class PacketEntity( @Embedded val packet: Packet, - @Relation(entity = ReactionEntity::class, parentColumn = "packet_id", entityColumn = "reply_id") - val reactions: List = emptyList(), + @Relation(entity = ReactionEntity::class, parentColumns = ["packet_id"], entityColumns = ["reply_id"]) + val reactions: List, ) { suspend fun toMessage(getNode: suspend (userId: String?) -> Node) = with(packet) { val node = getNode(data.from) From 9260033e04f604a8f15bb3efce611bedc695d40b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 19 May 2026 14:45:06 -0500 Subject: [PATCH 59/78] chore(deps): update plugin flatpak-gradle-generator to v1.8.0 (#5506) thanks @vidplace7 ! --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index b32644cbd..b2b7d73df 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -316,7 +316,7 @@ wire = { id = "com.squareup.wire", version.ref = "wire" } room = { id = "androidx.room3", version.ref = "room" } spotless = { id = "com.diffplug.spotless", version.ref = "spotless" } test-retry = { id = "org.gradle.test-retry", version.ref = "testRetry" } -flatpak-gradle-generator = { id = "io.github.jwharm.flatpak-gradle-generator", version = "1.7.0" } +flatpak-gradle-generator = { id = "io.github.jwharm.flatpak-gradle-generator", version = "1.8.0" } # Meshtastic meshtastic-android-application = { id = "meshtastic.android.application" } From 6fb3776e0c2588392111fb4da89780f8bf597eb5 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 19 May 2026 14:45:47 -0500 Subject: [PATCH 60/78] docs: update CHANGELOG.md (#5508) --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2bca8fcf9..bbb2fa010 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -47,6 +47,9 @@ See [GitHub Releases](https://github.com/meshtastic/Meshtastic-Android/releases) * chore(deps): update room to v3.0.0-alpha05 (#5498) by renovate[bot] (@renovate[bot]) in [`59499e827`](https://github.com/meshtastic/Meshtastic-Android/commit/59499e82723bdef4f1116ae5996814d59ab85595) * docs: update CHANGELOG.md (#5500) by github-actions[bot] (@github-actions[bot]) in [`6c51c1ac1`](https://github.com/meshtastic/Meshtastic-Android/commit/6c51c1ac18cd61f3ab381335ecada8c9d614b7cb) * fix(ci): use GitHub compare API for changelog author resolution (#5504) by James Rich (@jamesarich) in [`4ff6f23c5`](https://github.com/meshtastic/Meshtastic-Android/commit/4ff6f23c5e5d074f319736a74e563f28bf65c127) +* docs: update CHANGELOG.md (#5505) by github-actions[bot] (@github-actions[bot]) in [`f38536ae6`](https://github.com/meshtastic/Meshtastic-Android/commit/f38536ae61c8eaa99bcb315b4953bbfd90b7979c) +* fix(database): update @Relation annotations for Room 3.0.0-alpha05 (#5507) by James Rich (@jamesarich) in [`01d32e15c`](https://github.com/meshtastic/Meshtastic-Android/commit/01d32e15c00c952ca5933fb3d29c08d3a3989c59) +* chore(deps): update plugin flatpak-gradle-generator to v1.8.0 (#5506) by renovate[bot] (@renovate[bot]) in [`9260033e0`](https://github.com/meshtastic/Meshtastic-Android/commit/9260033e04f604a8f15bb3efce611bedc695d40b) ### Open Beta (v2.7.14-open.9) Changes since [`v2.7.13`](https://github.com/meshtastic/Meshtastic-Android/releases/tag/v2.7.13): From 930dee09e5b3f23d02d0dc5aae3eeea61974bada Mon Sep 17 00:00:00 2001 From: James Rich <2199651+jamesarich@users.noreply.github.com> Date: Tue, 19 May 2026 13:43:00 -0700 Subject: [PATCH 61/78] build: reorder Maven repos to reduce flatpak generator 404s (#5509) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .gitignore | 3 +++ build-logic/settings.gradle.kts | 12 +++++++++--- settings.gradle.kts | 10 ++++++++-- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index faa540dfa..3ec08e5a0 100644 --- a/.gitignore +++ b/.gitignore @@ -79,3 +79,6 @@ feature/docs/src/commonMain/composeResources/files/*/docs/ /.specify/extensions/.cache/ # Jekyll local config (comments out remote_theme for local builds) docs/_config_local.yml + +# Flatpak source manifests (generated by flatpakGradleGenerator) +flatpak-sources-*.json diff --git a/build-logic/settings.gradle.kts b/build-logic/settings.gradle.kts index 32a044ced..65ba80c0b 100644 --- a/build-logic/settings.gradle.kts +++ b/build-logic/settings.gradle.kts @@ -17,9 +17,15 @@ pluginManagement { repositories { - google() mavenCentral() gradlePluginPortal() + google { + content { + includeGroupByRegex("com\\.android.*") + includeGroupByRegex("com\\.google.*") + includeGroupByRegex("androidx.*") + } + } maven { url = uri("../offline-repository") } } } @@ -31,6 +37,8 @@ plugins { dependencyResolutionManagement { repositories { + mavenCentral() + gradlePluginPortal() google { content { includeGroupByRegex("com\\.android.*") @@ -38,8 +46,6 @@ dependencyResolutionManagement { includeGroupByRegex("androidx.*") } } - mavenCentral() - gradlePluginPortal() maven { url = uri("../offline-repository") } } versionCatalogs { diff --git a/settings.gradle.kts b/settings.gradle.kts index da7e1295a..b3aeb19e6 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -18,9 +18,15 @@ pluginManagement { includeBuild("build-logic") repositories { - google() mavenCentral() gradlePluginPortal() + google { + content { + includeGroupByRegex("com\\.android.*") + includeGroupByRegex("com\\.google.*") + includeGroupByRegex("androidx.*") + } + } maven { url = uri("./offline-repository") } } } @@ -37,6 +43,7 @@ dependencyResolutionManagement { repositories { // Only enable mavenLocal for local JitPack testing; never in CI. if (providers.gradleProperty("useMavenLocal").isPresent) mavenLocal() + mavenCentral() google { content { includeGroupByRegex("com\\.android.*") @@ -44,7 +51,6 @@ dependencyResolutionManagement { includeGroupByRegex("androidx.*") } } - mavenCentral() maven { url = uri("https://central.sonatype.com/repository/maven-snapshots/") mavenContent { snapshotsOnly() } From 5c3b22584e4d5d71c6813842033bd2ae17b0041b Mon Sep 17 00:00:00 2001 From: James Rich <2199651+jamesarich@users.noreply.github.com> Date: Tue, 19 May 2026 15:12:02 -0700 Subject: [PATCH 62/78] chore(deps): migrate takpacket-sdk to Maven Central coordinates (#5512) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../convention/src/main/kotlin/RootConventionPlugin.kt | 2 +- .../main/kotlin/org/meshtastic/buildlogic/KotlinAndroid.kt | 6 +++--- gradle/libs.versions.toml | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/build-logic/convention/src/main/kotlin/RootConventionPlugin.kt b/build-logic/convention/src/main/kotlin/RootConventionPlugin.kt index 27014599f..9bc9bb4bd 100644 --- a/build-logic/convention/src/main/kotlin/RootConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/RootConventionPlugin.kt @@ -119,7 +119,7 @@ private val ANDROID_ONLY_MODULES = setOf(":androidApp", ":core:api", ":core:barc /** * Modules excluded from Dokka aggregation. :core:proto contains only auto-generated Wire classes (no KDoc value) and - * its TAKPacket-SDK dependency doesn't publish iOS metadata JARs to JitPack, causing + * its TAKPacket-SDK dependency doesn't publish iOS metadata JARs, causing * `transformCommonMainDependenciesMetadata` to fail during Dokka resolution. */ private val DOKKA_EXCLUDED_MODULES = setOf(":core:proto") diff --git a/build-logic/convention/src/main/kotlin/org/meshtastic/buildlogic/KotlinAndroid.kt b/build-logic/convention/src/main/kotlin/org/meshtastic/buildlogic/KotlinAndroid.kt index 735d5e79a..0254340cc 100644 --- a/build-logic/convention/src/main/kotlin/org/meshtastic/buildlogic/KotlinAndroid.kt +++ b/build-logic/convention/src/main/kotlin/org/meshtastic/buildlogic/KotlinAndroid.kt @@ -122,8 +122,8 @@ internal fun Project.configureKotlinMultiplatform() { } } - // TAKPacket-SDK doesn't publish iOS metadata JARs on JitPack (the .klib exists but - // the metadata .jar returns 404). iOS native compilation resolves fine via .klib, but + // TAKPacket-SDK doesn't publish iOS metadata JARs (the .klib exists but the metadata + // .jar returns 404). iOS native compilation resolves fine via .klib, but // `transformCommonMainDependenciesMetadata` (triggered by Dokka/publishing) fails. // Exclude the SDK only from the CompilationDependenciesMetadata configs that feed // the metadata transform — NOT from Implementation/Resolvable configs which feed the @@ -134,7 +134,7 @@ internal fun Project.configureKotlinMultiplatform() { ) configurations.configureEach { if (name in iosMetadataConfigs) { - exclude(mapOf("group" to "com.github.meshtastic.TAKPacket-SDK", "module" to "takpacket-sdk")) + exclude(mapOf("group" to "org.meshtastic", "module" to "takpacket-sdk")) } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index b2b7d73df..e454fce96 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -88,7 +88,7 @@ kable = "0.43.0" mqttastic = "0.3.6" jmdns = "3.6.3" qrcode-kotlin = "4.5.0" -takpacket-sdk = "0.2.3" +takpacket-sdk = "0.2.4-SNAPSHOT" [libraries] xmlutil-core = { module = "io.github.pdvrieze.xmlutil:core", version.ref = "xmlutil" } @@ -278,8 +278,8 @@ jmdns = { module = "org.jmdns:jmdns", version.ref = "jmdns" } jna = { module = "net.java.dev.jna:jna", version = "5.18.1" } # TAK -takpacket-sdk-kmp = { module = "com.github.meshtastic.TAKPacket-SDK:takpacket-sdk", version.ref = "takpacket-sdk" } -takpacket-sdk-jvm = { module = "com.github.meshtastic.TAKPacket-SDK:takpacket-sdk-jvm", version.ref = "takpacket-sdk" } +takpacket-sdk-kmp = { module = "org.meshtastic:takpacket-sdk", version.ref = "takpacket-sdk" } +takpacket-sdk-jvm = { module = "org.meshtastic:takpacket-sdk-jvm", version.ref = "takpacket-sdk" } [plugins] # Android From 3f64b5a0ecf7cc9ed6e81068ab3067033a7f74f4 Mon Sep 17 00:00:00 2001 From: James Rich <2199651+jamesarich@users.noreply.github.com> Date: Tue, 19 May 2026 16:11:13 -0700 Subject: [PATCH 63/78] ci: reduce flatpak source generation thrash (#5513) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/workflows/release.yml | 2 +- settings.gradle.kts | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 4f12cf5c8..8b795afb5 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -373,7 +373,7 @@ jobs: - name: Generate Flatpak Sources run: > ./gradlew :build-logic:convention:flatpakGradleGenerator flatpakGradleGenerator - --no-configuration-cache --refresh-dependencies --no-parallel + --no-configuration-cache - name: List Flatpak source files run: ls -R flatpak-sources-*.json diff --git a/settings.gradle.kts b/settings.gradle.kts index b3aeb19e6..5ae98fe86 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -18,8 +18,6 @@ pluginManagement { includeBuild("build-logic") repositories { - mavenCentral() - gradlePluginPortal() google { content { includeGroupByRegex("com\\.android.*") @@ -27,6 +25,8 @@ pluginManagement { includeGroupByRegex("androidx.*") } } + mavenCentral() + gradlePluginPortal() maven { url = uri("./offline-repository") } } } @@ -43,7 +43,6 @@ dependencyResolutionManagement { repositories { // Only enable mavenLocal for local JitPack testing; never in CI. if (providers.gradleProperty("useMavenLocal").isPresent) mavenLocal() - mavenCentral() google { content { includeGroupByRegex("com\\.android.*") @@ -51,6 +50,7 @@ dependencyResolutionManagement { includeGroupByRegex("androidx.*") } } + mavenCentral() maven { url = uri("https://central.sonatype.com/repository/maven-snapshots/") mavenContent { snapshotsOnly() } From 1dcb7b9d1a29fcdfad214fe74360130c597ee989 Mon Sep 17 00:00:00 2001 From: James Rich <2199651+jamesarich@users.noreply.github.com> Date: Tue, 19 May 2026 16:28:06 -0700 Subject: [PATCH 64/78] chore: Scheduled updates (Firmware, Hardware, Translations, Graphs) (#5511) --- docs/ru-rRU/user/connections.md | 40 +++++++++++------------ docs/ru-rRU/user/desktop.md | 2 +- docs/ru-rRU/user/firmware.md | 4 +-- docs/ru-rRU/user/node-metrics.md | 4 +-- docs/ru-rRU/user/onboarding.md | 4 +-- docs/ru-rRU/user/settings-module-admin.md | 20 ++++++------ docs/ru-rRU/user/settings-radio-user.md | 4 +-- docs/ru-rRU/user/tak.md | 18 +++++----- docs/ru-rRU/user/telemetry-and-sensors.md | 2 +- docs/ru-rRU/user/units-and-locale.md | 6 ++-- docs/zh-rTW/user/settings-module-admin.md | 2 +- 11 files changed, 53 insertions(+), 53 deletions(-) diff --git a/docs/ru-rRU/user/connections.md b/docs/ru-rRU/user/connections.md index 0c30e6264..cc2e97df6 100644 --- a/docs/ru-rRU/user/connections.md +++ b/docs/ru-rRU/user/connections.md @@ -2,7 +2,7 @@ title: Соединения nav_order: 2 last_updated: 2026-05-13 -description: Connect your phone or desktop to a Meshtastic radio via Bluetooth, USB, or TCP/IP. +description: Подключите ваш телефон или компьютер к устройству Meshtastic через Bluetooth, USB или TCP/IP. aliases: - bluetooth - usb @@ -12,38 +12,38 @@ aliases: # Соединения -Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node. +Meshtastic поддерживает несколько способов передачи данных между вашим телефоном/компьютером и радионодой. ## Bluetooth (BLE) -Bluetooth Low Energy is the default and most common connection method on Android. +Bluetooth Low Energy является наиболее распространенным методом подключения на Android. -### Pairing a Device +### Привязка устройства -1. Ensure your Meshtastic radio is powered on and in pairing mode. -2. Open the app and navigate to **Connections**. -3. Tap **Scan for Devices** — nearby Meshtastic radios will appear. -4. Select your device from the list. -5. Accept the Bluetooth pairing prompt if shown. +1. Убедитесь, что устройство Meshtastic включено и находится в режиме сопряжения. +2. Откройте приложение и перейдите в **Соединения**. +3. Нажмите **Сканировать устройства** — появятся ближайшие устройства Meshtastic. +4. Выберите ваше устройство из списка. +5. Примите запрос на соединение Bluetooth, если показано. -![Device list item](/assets/screenshots/connections_bluetooth_scan.png) +![Элемент списка устройств](/assets/screenshots/connections_bluetooth_scan.png) -You can filter devices by transport type using the filter chips at the top: +Вы можете отфильтровать устройства по типу передачи данных, используя функцию фильтра сверху: ![Transport filter chips](/assets/screenshots/connections_transport_filters.png) -> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. +> 💡 **Подсказка:** Если ваше радио Meshtastic не отображается, проверьте, предоставлены ли разрешения на Bluetooth и геолокацию, а также не подключено ли ваше радио к другому устройству. -### Connection Status +### Статус подключения -| Icon | State | Описание | -| ---- | -------------- | ----------------------------- | -| 🟢 | Подключено | Active radio link established | -| 🟡 | Подключение | Handshake in progress | -| 🔴 | Отключено | No active connection | -| ⚪ | Not configured | Устройство не выбрано | +| Иконка | Состояние | Описание | +| ------ | -------------- | ------------------------ | +| 🟢 | Подключено | Подключение активно | +| 🟡 | Подключение | Выполняется рукопожатие | +| 🔴 | Отключено | Нет активного соединения | +| ⚪ | Not configured | Устройство не выбрано | -When connecting, a status indicator shows the current connection state: +При подключении индикатор состояния показывает текущее состояние соединения: ![Connecting status](/assets/screenshots/connections_connecting.png) diff --git a/docs/ru-rRU/user/desktop.md b/docs/ru-rRU/user/desktop.md index 5f7f919b0..960fe79d0 100644 --- a/docs/ru-rRU/user/desktop.md +++ b/docs/ru-rRU/user/desktop.md @@ -66,7 +66,7 @@ Bluetooth Low Energy is supported on Desktop via the [Kable](https://github.com/ | Feature | Android | Desktop | Заметки | | ---------------------------------------- | ------- | ------- | -------------------------- | | Обмен сообщениями | ✓ | ✓ | Полное равенство | -| Список нод | ✓ | ✓ | Полное равенство | +| Список узлов | ✓ | ✓ | Полное равенство | | Карта | ✓ | ✓ | Полное равенство | | Настройки | ✓ | ✓ | Полное равенство | | Bluetooth (BLE) | ✓ | ✓ | Via Kable on desktop | diff --git a/docs/ru-rRU/user/firmware.md b/docs/ru-rRU/user/firmware.md index 8a9b01a56..73ab04e9f 100644 --- a/docs/ru-rRU/user/firmware.md +++ b/docs/ru-rRU/user/firmware.md @@ -1,5 +1,5 @@ --- -title: Firmware Updates +title: Обновления прошивки nav_order: 13 last_updated: 2026-05-13 description: Update your radio firmware over Bluetooth — OTA process, version channels, pre-flight checks, and recovery. @@ -10,7 +10,7 @@ aliases: - flash --- -# Firmware Updates +# Обновления прошивки Keep your Meshtastic radio up to date with the latest firmware for new features, bug fixes, and security improvements. diff --git a/docs/ru-rRU/user/node-metrics.md b/docs/ru-rRU/user/node-metrics.md index ab06c0e06..7e2461287 100644 --- a/docs/ru-rRU/user/node-metrics.md +++ b/docs/ru-rRU/user/node-metrics.md @@ -1,5 +1,5 @@ --- -title: Node Metrics +title: Метрики ноды nav_order: 5 last_updated: 2026-05-13 description: Telemetry dashboards for each mesh node — device health, environment sensors, signal quality, power, traceroute, and position history. @@ -10,7 +10,7 @@ aliases: - signal --- -# Node Metrics +# Метрики ноды The node detail screen provides comprehensive telemetry and metrics for each node on your mesh. diff --git a/docs/ru-rRU/user/onboarding.md b/docs/ru-rRU/user/onboarding.md index 3b910534e..71a350198 100644 --- a/docs/ru-rRU/user/onboarding.md +++ b/docs/ru-rRU/user/onboarding.md @@ -1,5 +1,5 @@ --- -title: Getting Started +title: Начало работы nav_order: 1 last_updated: 2026-05-13 description: First-launch setup — permissions, onboarding flow, and next steps after connecting your radio. @@ -9,7 +9,7 @@ aliases: - intro --- -# Getting Started +# Начало работы Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app. diff --git a/docs/ru-rRU/user/settings-module-admin.md b/docs/ru-rRU/user/settings-module-admin.md index 33fb18a21..821215078 100644 --- a/docs/ru-rRU/user/settings-module-admin.md +++ b/docs/ru-rRU/user/settings-module-admin.md @@ -77,7 +77,7 @@ Controls buzzer, LED, or vibration alerts on your radio hardware. Useful for dev Buffers messages for nodes that were temporarily offline, then replays them when those nodes reconnect. Essential for meshes where nodes go in and out of range regularly — ensures messages aren't lost during brief disconnections. -| Setting | Описание | +| Настройка | Описание | | ------------------------------------------ | -------------------------- | | Включено | Activate store and forward | | Heartbeat (s) | Announcement interval | @@ -91,7 +91,7 @@ Buffers messages for nodes that were temporarily offline, then replays them when Automated range testing tool for evaluating link quality between nodes. When enabled, the node periodically transmits test messages with incrementing counters. A receiver node logs these messages, allowing you to walk or drive away and later analyze at what distance messages stopped arriving. -| Setting | Описание | +| Настройка | Описание | | -------------------------------------- | --------------------------------- | | Включено | Activate range testing | | Sender Interval (s) | Time between test transmissions | @@ -101,7 +101,7 @@ Automated range testing tool for evaluating link quality between nodes. When ena Controls what telemetry data your node shares with the mesh. Telemetry includes device health (battery, uptime) and environmental sensor data (temperature, humidity, pressure). -| Setting | Описание | +| Настройка | Описание | | ---------------------------- | --------------------------------------- | | Device Metrics Interval | How often to report device metrics | | Environment Metrics Interval | How often to report environment sensors | @@ -114,7 +114,7 @@ See [Telemetry & Sensors](telemetry-and-sensors) for supported sensors and confi Pre-configured messages accessible from the device's physical buttons (for radios with rotary encoders, keypads, or similar input hardware). Define a list of quick-send messages that can be transmitted without a phone connected — ideal for field use. -| Setting | Описание | +| Настройка | Описание | | ------------------ | ----------------------------------------------------------- | | ~~Enabled~~ | ⚠️ **Deprecated** — current firmware may ignore this toggle | | Сообщения | Newline-separated list of messages | @@ -126,7 +126,7 @@ Pre-configured messages accessible from the device's physical buttons (for radio Codec2 audio support for low-bandwidth voice communication over the mesh. This is an **experimental** feature that encodes voice into very small data packets using the Codec2 codec. -| Setting | Описание | +| Настройка | Описание | | --------------- | -------------------------------- | | Включено | Activate audio module | | Codec2 Rate | Audio quality/bandwidth tradeoff | @@ -140,7 +140,7 @@ Codec2 audio support for low-bandwidth voice communication over the mesh. This i GPIO control over the mesh network. Allows a remote node to read or write GPIO pins on another node — useful for activating relays, reading switches, or controlling external hardware from a distance. -| Setting | Описание | +| Настройка | Описание | | -------------------- | --------------------------------------------------------------- | | Включено | Activate remote GPIO access | | Allow Undefined Pins | Allow access to any GPIO pin (security risk) | @@ -151,7 +151,7 @@ GPIO control over the mesh network. Allows a remote node to read or write GPIO p Broadcasts information about directly heard neighbors, enabling mesh topology mapping. Each enabled node periodically shares a list of the other nodes it can hear and their signal quality. -| Setting | Описание | +| Настройка | Описание | | -------------------------------------- | ------------------------------------ | | Включено | Activate neighbor broadcasting | | Update Interval (s) | How often to broadcast neighbor list | @@ -162,7 +162,7 @@ See [Discovery](discovery) for how to use neighbor data for mesh topology explor Controls onboard NeoPixel or other addressable RGB LEDs on supported hardware. Can be used for visual status indicators, notification lights, or decorative effects. -| Setting | Описание | +| Настройка | Описание | | -------------------- | ---------------------------------------------------------- | | Включено | Activate LED control | | Состояние светодиода | On, Off, or set specific color | @@ -172,7 +172,7 @@ Controls onboard NeoPixel or other addressable RGB LEDs on supported hardware. C Turns your node into a motion or door sensor alert system. When a GPIO pin detects a state change (motion detected, door opened), the node broadcasts an alert message over the mesh. -| Setting | Описание | +| Настройка | Описание | | ---------------------------------------- | ----------------------------------------------------------------------- | | Включено | Activate detection sensor | | Пин датчика | GPIO pin connected to sensor | @@ -186,7 +186,7 @@ Turns your node into a motion or door sensor alert system. When a GPIO pin detec People counter using WiFi and BLE probe requests. Counts nearby devices by passively listening for probe requests that phones and laptops emit when scanning for networks. Available only on ESP32 devices. -| Setting | Описание | +| Настройка | Описание | | -------------------------------------- | -------------------------- | | Включено | Activate people counting | | Update Interval (s) | How often to report counts | diff --git a/docs/ru-rRU/user/settings-radio-user.md b/docs/ru-rRU/user/settings-radio-user.md index 9b6c8823d..2422e744c 100644 --- a/docs/ru-rRU/user/settings-radio-user.md +++ b/docs/ru-rRU/user/settings-radio-user.md @@ -134,7 +134,7 @@ The modem preset controls the fundamental tradeoff between **range** and **data ### Настройка Bluetooth -| Setting | Описание | +| Настройка | Описание | | --------------------- | ------------------------------------------------------------------------- | | Bluetooth Enabled | Enable/disable BLE radio | | Pairing Mode | Fixed PIN, Random PIN, or No PIN | @@ -142,7 +142,7 @@ The modem preset controls the fundamental tradeoff between **range** and **data ### Настройки безопасности -| Setting | Описание | +| Настройка | Описание | | --------------------- | -------------------------------------------------------------------------- | | Публичный ключ | Your node's public key (read-only) | | Ключ администратора | Key for remote administration | diff --git a/docs/ru-rRU/user/tak.md b/docs/ru-rRU/user/tak.md index 178779555..715a198c4 100644 --- a/docs/ru-rRU/user/tak.md +++ b/docs/ru-rRU/user/tak.md @@ -1,5 +1,5 @@ --- -title: TAK Integration +title: Интеграция TAK nav_order: 10 last_updated: 2026-05-13 description: Interoperate with ATAK and WinTAK — CoT position sharing, TAK roles, and plugin setup. @@ -9,11 +9,11 @@ aliases: - team-awareness-kit --- -# TAK Integration +# Интеграция TAK Meshtastic integrates with the Team Awareness Kit (TAK) ecosystem, enabling interoperability between Meshtastic mesh devices and TAK applications like ATAK and WinTAK. -## Overview +## Обзор The TAK module allows Meshtastic nodes to: @@ -37,7 +37,7 @@ The TAK module allows Meshtastic nodes to: ![Module toggle switch](/assets/screenshots/settings_switch.png) -| Setting | Описание | +| Настройка | Описание | | ------------ | -------------------------- | | Включено | Activate TAK interop | | Режим обмена | TAK-compatible output mode | @@ -67,11 +67,11 @@ TAK messages use the Cursor on Target XML format — a military standard for sha When using TAK roles, your node broadcasts identity information that appears on TAK maps: -| Setting | Описание | -| -------- | ---------------------------------------------------------------------------------------------------------------- | -| Team | Your team color on the TAK map (e.g., Blue, Red, Cyan, Green) | -| Роль | Your operational role (Team Member, Team Lead, HQ, Medic, RTO, etc.) | -| Callsign | Your TAK callsign (defaults to your Meshtastic long name) | +| Настройка | Описание | +| --------- | ---------------------------------------------------------------------------------------------------------------- | +| Team | Your team color on the TAK map (e.g., Blue, Red, Cyan, Green) | +| Роль | Your operational role (Team Member, Team Lead, HQ, Medic, RTO, etc.) | +| Callsign | Your TAK callsign (defaults to your Meshtastic long name) | These settings appear in **Settings → Module Config → TAK** when the TAK module is enabled. diff --git a/docs/ru-rRU/user/telemetry-and-sensors.md b/docs/ru-rRU/user/telemetry-and-sensors.md index ddedeae37..64fee9161 100644 --- a/docs/ru-rRU/user/telemetry-and-sensors.md +++ b/docs/ru-rRU/user/telemetry-and-sensors.md @@ -14,7 +14,7 @@ aliases: Meshtastic nodes can collect and share sensor data across the mesh network. -## Overview +## Обзор Telemetry allows nodes equipped with sensors to broadcast environmental, power, and device health information. This data is visible on the node detail screen and can be logged over time. diff --git a/docs/ru-rRU/user/units-and-locale.md b/docs/ru-rRU/user/units-and-locale.md index 191fcbc98..e6a89df73 100644 --- a/docs/ru-rRU/user/units-and-locale.md +++ b/docs/ru-rRU/user/units-and-locale.md @@ -1,6 +1,6 @@ --- title: Units, Measurement & Locale -parent: User Guide +parent: Руководство пользователя nav_order: 16 last_updated: 2026-05-12 --- @@ -11,7 +11,7 @@ The Meshtastic app automatically displays temperatures, distances, speeds, and t --- -## How It Works +## Как это работает Meshtastic radios always transmit data in **metric units** (meters, °C, km/h, hPa, etc.). When the app receives this data, it uses the `MetricFormatter` utility to convert and display values in whatever unit system your device's locale specifies. @@ -99,7 +99,7 @@ Some units are international standards and are displayed the same way regardless All timestamps throughout the app — last heard, message times, telemetry logs, chart axes — follow your device's date and time preferences. -| Setting | What It Controls | Example | +| Настройка | What It Controls | Example | | ---------------- | ---------------- | ------------------------------------------------ | | **24-Hour Time** | Clock format | 14:30 vs 2:30 PM | | **Date Format** | Date ordering | 09/05/2026 vs 05/09/2026 | diff --git a/docs/zh-rTW/user/settings-module-admin.md b/docs/zh-rTW/user/settings-module-admin.md index 5ceb802e6..933ca2e9b 100644 --- a/docs/zh-rTW/user/settings-module-admin.md +++ b/docs/zh-rTW/user/settings-module-admin.md @@ -186,7 +186,7 @@ Turns your node into a motion or door sensor alert system. When a GPIO pin detec People counter using WiFi and BLE probe requests. Counts nearby devices by passively listening for probe requests that phones and laptops emit when scanning for networks. Available only on ESP32 devices. -| Setting 設定 | 描述說明 | +| 設定 | 描述說明 | | -------------------------------------- | -------------------------- | | 已啟用 | Activate people counting | | Update Interval (s) | How often to report counts | From 0803dd3ae8d6970ae8218dcfd6d0bb9b63866da9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 19 May 2026 18:28:34 -0500 Subject: [PATCH 65/78] docs: update CHANGELOG.md (#5510) --- CHANGELOG.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index bbb2fa010..fb1bc3f01 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,12 @@ See [GitHub Releases](https://github.com/meshtastic/Meshtastic-Android/releases) ### Unreleased (not yet in any build) +* ci: reduce flatpak source generation thrash (#5513) by James Rich (@jamesarich) in [`3f64b5a0e`](https://github.com/meshtastic/Meshtastic-Android/commit/3f64b5a0ecf7cc9ed6e81068ab3067033a7f74f4) +* chore: Scheduled updates (Firmware, Hardware, Translations, Graphs) (#5511) by James Rich (@jamesarich) in [`1dcb7b9d1`](https://github.com/meshtastic/Meshtastic-Android/commit/1dcb7b9d1a29fcdfad214fe74360130c597ee989) + +### Internal (v2.7.14-internal.93) +Changes since [`v2.7.14-open.9`](https://github.com/meshtastic/Meshtastic-Android/releases/tag/v2.7.14-open.9): + * chore(deps): update vico to v3.2.0-next.5 (#5470) by renovate[bot] (@renovate[bot]) in [`4bacff81c`](https://github.com/meshtastic/Meshtastic-Android/commit/4bacff81c5abad536b40f7370ae5d302b74a11fe) * chore(deps): update spotless to v8.5.1 (#5468) by renovate[bot] (@renovate[bot]) in [`c91219d8b`](https://github.com/meshtastic/Meshtastic-Android/commit/c91219d8b0411975c059c7a5ae6eb370386954f6) * chore(deps): update wire to v6.4.0 (#5466) by renovate[bot] (@renovate[bot]) in [`f0e12695b`](https://github.com/meshtastic/Meshtastic-Android/commit/f0e12695bbf3df16b043476ff98856b727d6a2f7) @@ -50,6 +56,9 @@ See [GitHub Releases](https://github.com/meshtastic/Meshtastic-Android/releases) * docs: update CHANGELOG.md (#5505) by github-actions[bot] (@github-actions[bot]) in [`f38536ae6`](https://github.com/meshtastic/Meshtastic-Android/commit/f38536ae61c8eaa99bcb315b4953bbfd90b7979c) * fix(database): update @Relation annotations for Room 3.0.0-alpha05 (#5507) by James Rich (@jamesarich) in [`01d32e15c`](https://github.com/meshtastic/Meshtastic-Android/commit/01d32e15c00c952ca5933fb3d29c08d3a3989c59) * chore(deps): update plugin flatpak-gradle-generator to v1.8.0 (#5506) by renovate[bot] (@renovate[bot]) in [`9260033e0`](https://github.com/meshtastic/Meshtastic-Android/commit/9260033e04f604a8f15bb3efce611bedc695d40b) +* docs: update CHANGELOG.md (#5508) by github-actions[bot] (@github-actions[bot]) in [`6fb3776e0`](https://github.com/meshtastic/Meshtastic-Android/commit/6fb3776e0c2588392111fb4da89780f8bf597eb5) +* build: reorder Maven repos to reduce flatpak generator 404s (#5509) by James Rich (@jamesarich) in [`930dee09e`](https://github.com/meshtastic/Meshtastic-Android/commit/930dee09e5b3f23d02d0dc5aae3eeea61974bada) +* chore(deps): migrate takpacket-sdk to Maven Central coordinates (#5512) by James Rich (@jamesarich) in [`5c3b22584`](https://github.com/meshtastic/Meshtastic-Android/commit/5c3b22584e4d5d71c6813842033bd2ae17b0041b) ### Open Beta (v2.7.14-open.9) Changes since [`v2.7.13`](https://github.com/meshtastic/Meshtastic-Android/releases/tag/v2.7.13): From 877909fa94b55758be9dd91e2bd11e160b3822ed Mon Sep 17 00:00:00 2001 From: James Rich <2199651+jamesarich@users.noreply.github.com> Date: Tue, 19 May 2026 18:37:42 -0700 Subject: [PATCH 66/78] fix: prevent node details hang when device hardware API is unreachable (#5514) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../DeviceHardwareRepositoryImpl.kt | 109 ++++++++++++------ .../FirmwareReleaseRepositoryImpl.kt | 96 +++++++-------- .../data/util/StaleWhileRevalidateFlow.kt | 74 ++++++++++++ .../usecase/settings/IsOtaCapableUseCase.kt | 22 ++-- .../settings/IsOtaCapableUseCaseTest.kt | 10 +- .../repository/DeviceHardwareRepository.kt | 12 ++ .../testing/FakeDeviceHardwareRepository.kt | 7 ++ .../usecase/CommonGetNodeDetailsUseCase.kt | 51 ++++++-- 8 files changed, 262 insertions(+), 119 deletions(-) create mode 100644 core/data/src/commonMain/kotlin/org/meshtastic/core/data/util/StaleWhileRevalidateFlow.kt diff --git a/core/data/src/commonMain/kotlin/org/meshtastic/core/data/repository/DeviceHardwareRepositoryImpl.kt b/core/data/src/commonMain/kotlin/org/meshtastic/core/data/repository/DeviceHardwareRepositoryImpl.kt index c7c805ee1..95755f1fc 100644 --- a/core/data/src/commonMain/kotlin/org/meshtastic/core/data/repository/DeviceHardwareRepositoryImpl.kt +++ b/core/data/src/commonMain/kotlin/org/meshtastic/core/data/repository/DeviceHardwareRepositoryImpl.kt @@ -17,13 +17,18 @@ package org.meshtastic.core.data.repository import co.touchlab.kermit.Logger +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.sync.Mutex +import kotlinx.coroutines.sync.withLock import kotlinx.coroutines.withContext +import kotlinx.coroutines.withTimeoutOrNull import org.koin.core.annotation.Single import org.meshtastic.core.common.util.nowMillis import org.meshtastic.core.common.util.safeCatching import org.meshtastic.core.data.datasource.BootloaderOtaQuirksJsonDataSource import org.meshtastic.core.data.datasource.DeviceHardwareJsonDataSource import org.meshtastic.core.data.datasource.DeviceHardwareLocalDataSource +import org.meshtastic.core.data.util.staleWhileRevalidateFlow import org.meshtastic.core.database.entity.DeviceHardwareEntity import org.meshtastic.core.database.entity.asExternalModel import org.meshtastic.core.di.CoroutineDispatchers @@ -42,13 +47,16 @@ class DeviceHardwareRepositoryImpl( private val dispatchers: CoroutineDispatchers, ) : DeviceHardwareRepository { + /** Single-flight guard so concurrent collectors don't duplicate the full-table refresh. */ + private val refreshMutex = Mutex() + /** * Retrieves device hardware information by its model ID and optional target string. * * Pipeline: * 1. If the local DB is empty, seed it from the bundled JSON asset (instant baseline). - * 2. If the cached entry is stale or missing, refresh from the remote API. - * 3. Return the best available data from the DB. + * 2. If the cached entry is stale or missing, refresh from the remote API with a timeout. + * 3. Return the best available data from the DB (never blocks longer than [NETWORK_REFRESH_TIMEOUT_MS]). */ override suspend fun getDeviceHardwareByModel( hwModel: Int, @@ -60,53 +68,85 @@ class DeviceHardwareRepositoryImpl( " target=$target, forceRefresh=$forceRefresh)" } - val quirks = loadQuirks() - if (forceRefresh) { Logger.d { "DeviceHardwareRepository: forceRefresh=true, clearing cache" } localDataSource.deleteAllDeviceHardware() } - // 1. Seed from bundled JSON if the DB is completely empty (first launch or post-wipe). - if (!localDataSource.hasAnyEntries()) { - seedCacheFromBundledJson() - } + ensureSeeded() - // 2. Check cache; refresh from network if stale, empty, or forced. var entities = lookupEntities(hwModel, target) if (forceRefresh || entities.isEmpty() || entities.any { it.isStale() }) { - refreshFromNetwork() + singleFlightRefresh() entities = lookupEntities(hwModel, target) } - // 3. Resolve and return the best available data. - val matched = disambiguate(entities, target) - Result.success(applyBootloaderQuirk(hwModel, matched?.asExternalModel(), quirks, target)) + Result.success(resolveHardware(hwModel, entities, target)) } + /** + * Non-blocking Flow that emits cached/bundled hardware data immediately, then refreshes from the network if stale. + * Safe to use inside Flow `combine` transforms. + */ + override fun observeDeviceHardware(hwModel: Int, target: String?): Flow = staleWhileRevalidateFlow( + loadFromCache = { + ensureSeeded() + resolveHardware(hwModel, lookupEntities(hwModel, target), target) + }, + shouldFetch = { cached -> cached == null || lookupEntities(hwModel, target).any { it.isStale() } }, + fetch = { singleFlightRefresh() }, + context = dispatchers.io, + networkTimeoutMs = NETWORK_REFRESH_TIMEOUT_MS, + tag = "DeviceHardwareRepository", + ) + /** Looks up entities by hwModel, falling back to a target-only lookup when needed. */ private suspend fun lookupEntities(hwModel: Int, target: String?): List = localDataSource.getByHwModel(hwModel).ifEmpty { target?.let { listOfNotNull(localDataSource.getByTarget(it)) } ?: emptyList() } - private suspend fun seedCacheFromBundledJson() { - safeCatching { - Logger.d { "DeviceHardwareRepository: seeding cache from bundled JSON" } - val jsonHardware = jsonDataSource.loadDeviceHardwareFromJsonAsset() - localDataSource.insertAllDeviceHardware(jsonHardware) + /** Seeds the local DB from bundled JSON if completely empty. */ + private suspend fun ensureSeeded() { + if (!localDataSource.hasAnyEntries()) { + safeCatching { + Logger.d { "DeviceHardwareRepository: seeding cache from bundled JSON" } + val jsonHardware = jsonDataSource.loadDeviceHardwareFromJsonAsset() + localDataSource.insertAllDeviceHardware(jsonHardware) + } + .onFailure { e -> Logger.w(e) { "DeviceHardwareRepository: failed to seed cache from bundled JSON" } } } - .onFailure { e -> Logger.w(e) { "DeviceHardwareRepository: failed to seed cache from bundled JSON" } } } - private suspend fun refreshFromNetwork() { - safeCatching { - Logger.d { "DeviceHardwareRepository: fetching from remote API" } - val remoteHardware = remoteDataSource.getAllDeviceHardware() - Logger.d { "DeviceHardwareRepository: remote returned ${remoteHardware.size} entries" } - localDataSource.insertAllDeviceHardware(remoteHardware) + /** + * Performs a single-flight network refresh: concurrent callers share one in-flight request rather than each + * triggering a full API fetch. + */ + private suspend fun singleFlightRefresh() { + refreshMutex.withLock { + safeCatching { + val completed = + withTimeoutOrNull(NETWORK_REFRESH_TIMEOUT_MS) { + Logger.d { "DeviceHardwareRepository: fetching from remote API" } + val remoteHardware = remoteDataSource.getAllDeviceHardware() + Logger.d { "DeviceHardwareRepository: remote returned ${remoteHardware.size} entries" } + localDataSource.insertAllDeviceHardware(remoteHardware) + } + if (completed == null) { + Logger.w { + "DeviceHardwareRepository: network refresh timed out after ${NETWORK_REFRESH_TIMEOUT_MS}ms" + } + } + } + .onFailure { e -> Logger.w(e) { "DeviceHardwareRepository: network refresh failed" } } } - .onFailure { e -> Logger.w(e) { "DeviceHardwareRepository: network refresh failed" } } + } + + /** Resolves entities into a [DeviceHardware] domain model with quirk application. */ + private fun resolveHardware(hwModel: Int, entities: List, target: String?): DeviceHardware? { + val matched = disambiguate(entities, target) + val quirks = loadQuirks() + return applyBootloaderQuirk(hwModel, matched?.asExternalModel(), quirks, target) } private fun disambiguate(entities: List, target: String?): DeviceHardwareEntity? = @@ -125,11 +165,8 @@ class DeviceHardwareRepositoryImpl( private fun DeviceHardwareEntity.isStale(): Boolean = isIncomplete() || (nowMillis - this.lastUpdated) > CACHE_EXPIRATION_TIME_MS - private fun loadQuirks(): List { - val quirks = bootloaderOtaQuirksJsonDataSource.loadBootloaderOtaQuirksFromJsonAsset() - Logger.d { "DeviceHardwareRepository: loaded ${quirks.size} bootloader quirks" } - return quirks - } + private fun loadQuirks(): List = + bootloaderOtaQuirksJsonDataSource.loadBootloaderOtaQuirksFromJsonAsset() private fun applyBootloaderQuirk( hwModel: Int, @@ -140,11 +177,6 @@ class DeviceHardwareRepositoryImpl( val matchedQuirk = quirks.firstOrNull { it.hwModel == hwModel } val withQuirk = if (matchedQuirk != null) { - Logger.d { - "DeviceHardwareRepository: applying quirk: " + - "requiresBootloaderUpgradeForOta=${matchedQuirk.requiresBootloaderUpgradeForOta}, " + - "infoUrl=${matchedQuirk.infoUrl}" - } hw.copy( requiresBootloaderUpgradeForOta = matchedQuirk.requiresBootloaderUpgradeForOta, bootloaderInfoUrl = matchedQuirk.infoUrl, @@ -152,12 +184,13 @@ class DeviceHardwareRepositoryImpl( } else { hw } - - // If the device reported a specific build environment via pio_env, trust it for firmware retrieval reportedTarget?.let { withQuirk.copy(platformioTarget = it) } ?: withQuirk } companion object { private val CACHE_EXPIRATION_TIME_MS = TimeConstants.ONE_DAY.inWholeMilliseconds + + /** Maximum time to wait for the remote API before falling back to cached/bundled data. */ + private const val NETWORK_REFRESH_TIMEOUT_MS = 5_000L } } diff --git a/core/data/src/commonMain/kotlin/org/meshtastic/core/data/repository/FirmwareReleaseRepositoryImpl.kt b/core/data/src/commonMain/kotlin/org/meshtastic/core/data/repository/FirmwareReleaseRepositoryImpl.kt index 8739d0844..68682acb0 100644 --- a/core/data/src/commonMain/kotlin/org/meshtastic/core/data/repository/FirmwareReleaseRepositoryImpl.kt +++ b/core/data/src/commonMain/kotlin/org/meshtastic/core/data/repository/FirmwareReleaseRepositoryImpl.kt @@ -18,16 +18,19 @@ package org.meshtastic.core.data.repository import co.touchlab.kermit.Logger import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.sync.Mutex +import kotlinx.coroutines.sync.withLock import org.koin.core.annotation.Single import org.meshtastic.core.common.util.nowMillis import org.meshtastic.core.common.util.safeCatching import org.meshtastic.core.data.datasource.FirmwareReleaseJsonDataSource import org.meshtastic.core.data.datasource.FirmwareReleaseLocalDataSource +import org.meshtastic.core.data.util.staleWhileRevalidateFlow import org.meshtastic.core.database.entity.FirmwareRelease import org.meshtastic.core.database.entity.FirmwareReleaseEntity import org.meshtastic.core.database.entity.FirmwareReleaseType import org.meshtastic.core.database.entity.asExternalModel +import org.meshtastic.core.di.CoroutineDispatchers import org.meshtastic.core.model.util.TimeConstants import org.meshtastic.core.network.FirmwareReleaseRemoteDataSource import org.meshtastic.core.repository.FirmwareReleaseRepository @@ -37,76 +40,61 @@ open class FirmwareReleaseRepositoryImpl( private val remoteDataSource: FirmwareReleaseRemoteDataSource, private val localDataSource: FirmwareReleaseLocalDataSource, private val jsonDataSource: FirmwareReleaseJsonDataSource, + private val dispatchers: CoroutineDispatchers, ) : FirmwareReleaseRepository { - /** - * A flow that provides the latest STABLE firmware release. - * - * Pipeline: - * 1. If the local DB is empty, seed it from the bundled JSON asset (instant baseline). - * 2. Immediately emit the cached version. - * 3. If the cached version is stale, refresh from the remote API and re-emit. - * - * Collectors should use `.distinctUntilChanged()` to avoid redundant UI updates. - */ + /** Single-flight guard so concurrent collectors share one network refresh. */ + private val refreshMutex = Mutex() + override val stableRelease: Flow = getLatestFirmware(FirmwareReleaseType.STABLE) - /** - * A flow that provides the latest ALPHA firmware release. - * - * @see stableRelease for behavior details. - */ override val alphaRelease: Flow = getLatestFirmware(FirmwareReleaseType.ALPHA) - private fun getLatestFirmware(releaseType: FirmwareReleaseType): Flow = flow { - // 1. Seed from bundled JSON if the DB is completely empty (first launch or post-wipe). - if (!localDataSource.hasAnyEntries()) { - seedCacheFromBundledJson() - } - - // 2. Emit cached data immediately. - val cachedRelease = localDataSource.getLatestRelease(releaseType) - emit(cachedRelease?.asExternalModel()) - - // 3. If fresh, we're done. - if (cachedRelease?.isStale() == false) { - return@flow - } - - // 4. Cache is stale or empty — refresh from network and re-emit. - refreshFromNetwork() - val finalRelease = localDataSource.getLatestRelease(releaseType) - Logger.d { "Emitting final firmware for $releaseType from cache." } - emit(finalRelease?.asExternalModel()) - } - - private suspend fun refreshFromNetwork() { - safeCatching { - Logger.d { "Fetching fresh firmware releases from remote API." } - val networkReleases = remoteDataSource.getFirmwareReleases() - localDataSource.insertFirmwareReleases(networkReleases.releases.stable, FirmwareReleaseType.STABLE) - localDataSource.insertFirmwareReleases(networkReleases.releases.alpha, FirmwareReleaseType.ALPHA) - } - .onFailure { e -> Logger.w(e) { "FirmwareReleaseRepository: network refresh failed" } } - } + private fun getLatestFirmware(releaseType: FirmwareReleaseType): Flow = staleWhileRevalidateFlow( + loadFromCache = { + ensureSeeded() + localDataSource.getLatestRelease(releaseType)?.asExternalModel() + }, + shouldFetch = { cached -> + cached == null || localDataSource.getLatestRelease(releaseType)?.isStale() != false + }, + fetch = { singleFlightRefresh() }, + context = dispatchers.default, + networkTimeoutMs = NETWORK_REFRESH_TIMEOUT_MS, + tag = "FirmwareReleaseRepository", + ) override suspend fun invalidateCache() { localDataSource.deleteAllFirmwareReleases() } - private suspend fun seedCacheFromBundledJson() { - safeCatching { - Logger.d { "FirmwareReleaseRepository: seeding cache from bundled JSON" } - val jsonReleases = jsonDataSource.loadFirmwareReleaseFromJsonAsset() - localDataSource.insertFirmwareReleases(jsonReleases.releases.stable, FirmwareReleaseType.STABLE) - localDataSource.insertFirmwareReleases(jsonReleases.releases.alpha, FirmwareReleaseType.ALPHA) + private suspend fun ensureSeeded() { + if (!localDataSource.hasAnyEntries()) { + safeCatching { + Logger.d { "FirmwareReleaseRepository: seeding cache from bundled JSON" } + val jsonReleases = jsonDataSource.loadFirmwareReleaseFromJsonAsset() + localDataSource.insertFirmwareReleases(jsonReleases.releases.stable, FirmwareReleaseType.STABLE) + localDataSource.insertFirmwareReleases(jsonReleases.releases.alpha, FirmwareReleaseType.ALPHA) + } + .onFailure { e -> Logger.w(e) { "FirmwareReleaseRepository: failed to seed cache from bundled JSON" } } + } + } + + private suspend fun singleFlightRefresh() { + refreshMutex.withLock { + Logger.d { "FirmwareReleaseRepository: fetching from remote API" } + val networkReleases = remoteDataSource.getFirmwareReleases() + localDataSource.insertFirmwareReleases(networkReleases.releases.stable, FirmwareReleaseType.STABLE) + localDataSource.insertFirmwareReleases(networkReleases.releases.alpha, FirmwareReleaseType.ALPHA) } - .onFailure { e -> Logger.w(e) { "FirmwareReleaseRepository: failed to seed cache from bundled JSON" } } } private fun FirmwareReleaseEntity.isStale(): Boolean = (nowMillis - this.lastUpdated) > CACHE_EXPIRATION_TIME_MS companion object { private val CACHE_EXPIRATION_TIME_MS = TimeConstants.ONE_HOUR.inWholeMilliseconds + + /** Maximum time to wait for the remote API before falling back to cached/bundled data. */ + private const val NETWORK_REFRESH_TIMEOUT_MS = 5_000L } } diff --git a/core/data/src/commonMain/kotlin/org/meshtastic/core/data/util/StaleWhileRevalidateFlow.kt b/core/data/src/commonMain/kotlin/org/meshtastic/core/data/util/StaleWhileRevalidateFlow.kt new file mode 100644 index 000000000..46bc97142 --- /dev/null +++ b/core/data/src/commonMain/kotlin/org/meshtastic/core/data/util/StaleWhileRevalidateFlow.kt @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.meshtastic.core.data.util + +import co.touchlab.kermit.Logger +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.flow.flowOn +import kotlinx.coroutines.withTimeoutOrNull +import org.meshtastic.core.common.util.safeCatching +import kotlin.coroutines.CoroutineContext + +private const val DEFAULT_NETWORK_TIMEOUT_MS = 5_000L + +/** + * Creates a cold Flow that implements the stale-while-revalidate caching pattern: + * 1. Load and emit cached data immediately (UI never waits for network). + * 2. If [shouldFetch] returns true, attempt a network refresh bounded by [networkTimeoutMs]. + * 3. Reload from cache and emit again if the data changed. + * + * The [fetch] lambda is expected to write results to the local cache as a side-effect; [loadFromCache] is called again + * after fetch to pick up the fresh data. + * + * All work runs on [context] (typically an IO dispatcher). + * + * @param T The domain model type emitted to collectors. + * @param loadFromCache Loads the current best-available data from local storage. + * @param shouldFetch Decides whether a network refresh is needed based on the cached value (suspendable). + * @param fetch Performs the network call and persists results locally (side-effect only). + * @param context The coroutine context for cache/network operations. + * @param networkTimeoutMs Maximum time to wait for [fetch] before falling back to cached data. + * @param tag Logging tag for diagnostics. + */ +internal fun staleWhileRevalidateFlow( + loadFromCache: suspend () -> T?, + shouldFetch: suspend (T?) -> Boolean, + fetch: suspend () -> Unit, + context: CoroutineContext, + networkTimeoutMs: Long = DEFAULT_NETWORK_TIMEOUT_MS, + tag: String = "StaleWhileRevalidate", +): Flow = flow { + val cached = loadFromCache() + emit(cached) + + if (!shouldFetch(cached)) return@flow + + val completed = + withTimeoutOrNull(networkTimeoutMs) { + safeCatching { fetch() }.onFailure { e -> Logger.w(e) { "$tag: network fetch failed" } } + } + if (completed == null) { + Logger.w { "$tag: network fetch timed out after ${networkTimeoutMs}ms" } + } + + val fresh = loadFromCache() + if (fresh != cached) { + emit(fresh) + } +} + .flowOn(context) diff --git a/core/domain/src/commonMain/kotlin/org/meshtastic/core/domain/usecase/settings/IsOtaCapableUseCase.kt b/core/domain/src/commonMain/kotlin/org/meshtastic/core/domain/usecase/settings/IsOtaCapableUseCase.kt index b623f4527..b2aef85bc 100644 --- a/core/domain/src/commonMain/kotlin/org/meshtastic/core/domain/usecase/settings/IsOtaCapableUseCase.kt +++ b/core/domain/src/commonMain/kotlin/org/meshtastic/core/domain/usecase/settings/IsOtaCapableUseCase.kt @@ -16,11 +16,12 @@ */ package org.meshtastic.core.domain.usecase.settings +import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.flatMapLatest -import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.flowOf +import kotlinx.coroutines.flow.map import org.koin.core.annotation.Single import org.meshtastic.core.model.ConnectionState import org.meshtastic.core.model.RadioController @@ -37,6 +38,7 @@ interface IsOtaCapableUseCase { operator fun invoke(): Flow } +@OptIn(ExperimentalCoroutinesApi::class) @Single class IsOtaCapableUseCaseImpl( private val nodeRepository: NodeRepository, @@ -52,17 +54,13 @@ class IsOtaCapableUseCaseImpl( if (node == null || connectionState != ConnectionState.Connected) { flowOf(false) } else if (radioPrefs.isBle() || radioPrefs.isSerial() || radioPrefs.isTcp()) { - flow { - val hwModel = node.user.hw_model - val hw = deviceHardwareRepository.getDeviceHardwareByModel(hwModel.value).getOrNull() - // If we have hardware info, check if it's an architecture known to support OTA/DFU - val isOtaCapable = - hw?.let { - it.isEsp32Arc || - it.architecture.contains("nrf", ignoreCase = true) || - it.requiresDfu == true - } ?: (hwModel != HardwareModel.UNSET) - emit(isOtaCapable) + val hwModel = node.user.hw_model + deviceHardwareRepository.observeDeviceHardware(hwModel.value).map { hw -> + hw?.let { + it.isEsp32Arc || + it.architecture.contains("nrf", ignoreCase = true) || + it.requiresDfu == true + } ?: (hwModel != HardwareModel.UNSET) } } else { flowOf(false) diff --git a/core/domain/src/commonTest/kotlin/org/meshtastic/core/domain/usecase/settings/IsOtaCapableUseCaseTest.kt b/core/domain/src/commonTest/kotlin/org/meshtastic/core/domain/usecase/settings/IsOtaCapableUseCaseTest.kt index 78e402ce2..5851a2080 100644 --- a/core/domain/src/commonTest/kotlin/org/meshtastic/core/domain/usecase/settings/IsOtaCapableUseCaseTest.kt +++ b/core/domain/src/commonTest/kotlin/org/meshtastic/core/domain/usecase/settings/IsOtaCapableUseCaseTest.kt @@ -19,10 +19,10 @@ package org.meshtastic.core.domain.usecase.settings import app.cash.turbine.test import dev.mokkery.MockMode import dev.mokkery.answering.returns -import dev.mokkery.everySuspend import dev.mokkery.matcher.any import dev.mokkery.mock import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.test.runTest import org.meshtastic.core.model.DeviceHardware import org.meshtastic.core.model.Node @@ -77,7 +77,7 @@ class IsOtaCapableUseCaseTest { hwModel = HardwareModel.TBEAM.value, requiresDfu = false, ) - everySuspend { deviceHardwareRepository.getDeviceHardwareByModel(any()) } returns Result.success(hw) + dev.mokkery.every { deviceHardwareRepository.observeDeviceHardware(any(), any()) } returns flowOf(hw) useCase().test { assertTrue(awaitItem()) @@ -95,7 +95,7 @@ class IsOtaCapableUseCaseTest { dev.mokkery.every { radioPrefs.devAddr } returns MutableStateFlow("x12345678") // x for BLE val hw = DeviceHardware(activelySupported = false, hwModel = HardwareModel.TBEAM.value) - everySuspend { deviceHardwareRepository.getDeviceHardwareByModel(any()) } returns Result.success(hw) + dev.mokkery.every { deviceHardwareRepository.observeDeviceHardware(any(), any()) } returns flowOf(hw) useCase().test { assertFalse(awaitItem()) @@ -119,7 +119,7 @@ class IsOtaCapableUseCaseTest { hwModel = HardwareModel.TBEAM.value, requiresDfu = true, ) - everySuspend { deviceHardwareRepository.getDeviceHardwareByModel(any()) } returns Result.success(hw) + dev.mokkery.every { deviceHardwareRepository.observeDeviceHardware(any(), any()) } returns flowOf(hw) useCase().test { assertTrue(awaitItem()) @@ -136,7 +136,7 @@ class IsOtaCapableUseCaseTest { MutableStateFlow(org.meshtastic.core.model.ConnectionState.Connected) dev.mokkery.every { radioPrefs.devAddr } returns MutableStateFlow("x12345678") // x for BLE - everySuspend { deviceHardwareRepository.getDeviceHardwareByModel(any()) } returns Result.failure(Exception()) + dev.mokkery.every { deviceHardwareRepository.observeDeviceHardware(any(), any()) } returns flowOf(null) useCase().test { assertFalse(awaitItem()) diff --git a/core/repository/src/commonMain/kotlin/org/meshtastic/core/repository/DeviceHardwareRepository.kt b/core/repository/src/commonMain/kotlin/org/meshtastic/core/repository/DeviceHardwareRepository.kt index 8f37178d8..28884376e 100644 --- a/core/repository/src/commonMain/kotlin/org/meshtastic/core/repository/DeviceHardwareRepository.kt +++ b/core/repository/src/commonMain/kotlin/org/meshtastic/core/repository/DeviceHardwareRepository.kt @@ -16,6 +16,7 @@ */ package org.meshtastic.core.repository +import kotlinx.coroutines.flow.Flow import org.meshtastic.core.model.DeviceHardware interface DeviceHardwareRepository { @@ -32,4 +33,15 @@ interface DeviceHardwareRepository { target: String? = null, forceRefresh: Boolean = false, ): Result + + /** + * Observes device hardware information as a non-blocking [Flow]. + * + * Emits cached/bundled data immediately and refreshes from the network in the background if stale. Suitable for use + * inside Flow `combine` transforms where suspending would block the UI. + * + * @param hwModel The hardware model identifier. + * @param target Optional PlatformIO target environment name to disambiguate multiple variants. + */ + fun observeDeviceHardware(hwModel: Int, target: String? = null): Flow } diff --git a/core/testing/src/commonMain/kotlin/org/meshtastic/core/testing/FakeDeviceHardwareRepository.kt b/core/testing/src/commonMain/kotlin/org/meshtastic/core/testing/FakeDeviceHardwareRepository.kt index ef8cac0ba..a77118366 100644 --- a/core/testing/src/commonMain/kotlin/org/meshtastic/core/testing/FakeDeviceHardwareRepository.kt +++ b/core/testing/src/commonMain/kotlin/org/meshtastic/core/testing/FakeDeviceHardwareRepository.kt @@ -16,6 +16,8 @@ */ package org.meshtastic.core.testing +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.flowOf import org.meshtastic.core.model.DeviceHardware import org.meshtastic.core.repository.DeviceHardwareRepository @@ -52,6 +54,11 @@ class FakeDeviceHardwareRepository : return hardware[hwModel to target] ?: hardware[hwModel to null] ?: Result.success(null) } + override fun observeDeviceHardware(hwModel: Int, target: String?): Flow { + val result = hardware[hwModel to target] ?: hardware[hwModel to null] ?: Result.success(null) + return flowOf(result.getOrNull()) + } + /** Seeds a successful lookup for the given model/target pair. */ fun setHardware(hwModel: Int, target: String? = null, device: DeviceHardware?) { hardware[hwModel to target] = Result.success(device) diff --git a/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/domain/usecase/CommonGetNodeDetailsUseCase.kt b/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/domain/usecase/CommonGetNodeDetailsUseCase.kt index 3ceab3df0..5f68fea95 100644 --- a/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/domain/usecase/CommonGetNodeDetailsUseCase.kt +++ b/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/domain/usecase/CommonGetNodeDetailsUseCase.kt @@ -25,6 +25,7 @@ import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onStart import org.koin.core.annotation.Single import org.meshtastic.core.database.entity.FirmwareRelease +import org.meshtastic.core.model.DeviceHardware import org.meshtastic.core.model.MeshLog import org.meshtastic.core.model.MyNodeInfo import org.meshtastic.core.model.Node @@ -113,7 +114,18 @@ constructor( IdentityGroup(ourNode, myInfo, profile) } - // 3. Metadata & Request Timestamps + // 3. Device Hardware — non-blocking Flow derived from stable (hwModel, pioEnv) key. + val hardwareFlow: Flow = + combine(nodeFlow, identityFlow) { node, identity -> + val isLocal = node.num == identity.ourNode?.num + val pioEnv = if (isLocal) identity.myInfo?.pioEnv else null + HardwareKey(node.user.hw_model.value, pioEnv) + } + .distinctUntilChanged() + .flatMapLatest { key -> deviceHardwareRepository.observeDeviceHardware(key.hwModel, key.target) } + .onStart { emit(null) } + + // 4. Metadata & Request Timestamps val metadataFlow = combine( meshLogRepository @@ -129,7 +141,7 @@ constructor( MetadataGroup(edition = edition, stable = stable, alpha = alpha, trTime = trTime, niTime = niTime) } - // 4. Requests History (we still query request logs by the target nodeId) + // 5. Requests History (we still query request logs by the target nodeId) val requestsFlow = combine( meshLogRepository.getRequestLogs(nodeId, PortNum.TRACEROUTE_APP).onStart { emit(emptyList()) }, @@ -139,17 +151,25 @@ constructor( } // Assemble final UI state - return combine(nodeFlow, metricsLogsFlow, identityFlow, metadataFlow, requestsFlow) { - node, - logs, - identity, - metadata, - requests, - -> + return combine( + nodeFlow, + metricsLogsFlow, + identityFlow, + metadataFlow, + requestsFlow, + hardwareFlow, + ) { args: Array -> + @Suppress("UNCHECKED_CAST") + val node = args[NODE_INDEX] as Node + val logs = args[LOGS_INDEX] as LogsGroup + val identity = args[IDENTITY_INDEX] as IdentityGroup + val metadata = args[METADATA_INDEX] as MetadataGroup + val requests = args[REQUESTS_INDEX] as Pair, List> + val hw = args[HARDWARE_INDEX] as DeviceHardware? + val (trReqs, niReqs) = requests val isLocal = node.num == identity.ourNode?.num val pioEnv = if (isLocal) identity.myInfo?.pioEnv else null - val hw = deviceHardwareRepository.getDeviceHardwareByModel(node.user.hw_model.value, pioEnv).getOrNull() val moduleConfig = identity.profile.module_config val displayUnits = identity.profile.config?.display?.units ?: Config.DisplayConfig.DisplayUnits.METRIC @@ -215,6 +235,8 @@ constructor( } } + private data class HardwareKey(val hwModel: Int, val target: String?) + private data class LogsGroup( val telemetry: List, val packets: List, @@ -233,4 +255,13 @@ constructor( val trTime: Long?, val niTime: Long?, ) + + private companion object { + const val NODE_INDEX = 0 + const val LOGS_INDEX = 1 + const val IDENTITY_INDEX = 2 + const val METADATA_INDEX = 3 + const val REQUESTS_INDEX = 4 + const val HARDWARE_INDEX = 5 + } } From d37e08fccdabd3f673e3eccf90ab1538f02fe867 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 19 May 2026 20:38:36 -0500 Subject: [PATCH 67/78] chore(deps): update ruby to v4.0.5 (#5515) --- .github/workflows/release.yml | 4 ++-- .ruby-version | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 8b795afb5..6c6cf9b07 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -162,7 +162,7 @@ jobs: - name: Setup Fastlane uses: ruby/setup-ruby@v1 with: - ruby-version: '4.0.4' + ruby-version: '4.0.5' bundler-cache: true - name: Build and Deploy Google Play to Internal Track with Fastlane @@ -235,7 +235,7 @@ jobs: - name: Setup Fastlane uses: ruby/setup-ruby@v1 with: - ruby-version: '4.0.4' + ruby-version: '4.0.5' bundler-cache: true - name: Build F-Droid with Fastlane diff --git a/.ruby-version b/.ruby-version index c5106e6d1..7636e7565 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -4.0.4 +4.0.5 From f5e5fb6da63ee85e64dbbe19a519a5a3deccd408 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 19 May 2026 20:39:29 -0500 Subject: [PATCH 68/78] docs: update CHANGELOG.md (#5516) --- CHANGELOG.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fb1bc3f01..6dd534ab4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,8 +9,8 @@ See [GitHub Releases](https://github.com/meshtastic/Meshtastic-Android/releases) ### Unreleased (not yet in any build) -* ci: reduce flatpak source generation thrash (#5513) by James Rich (@jamesarich) in [`3f64b5a0e`](https://github.com/meshtastic/Meshtastic-Android/commit/3f64b5a0ecf7cc9ed6e81068ab3067033a7f74f4) -* chore: Scheduled updates (Firmware, Hardware, Translations, Graphs) (#5511) by James Rich (@jamesarich) in [`1dcb7b9d1`](https://github.com/meshtastic/Meshtastic-Android/commit/1dcb7b9d1a29fcdfad214fe74360130c597ee989) +* fix: prevent node details hang when device hardware API is unreachable (#5514) by James Rich (@jamesarich) in [`877909fa9`](https://github.com/meshtastic/Meshtastic-Android/commit/877909fa94b55758be9dd91e2bd11e160b3822ed) +* chore(deps): update ruby to v4.0.5 (#5515) by renovate[bot] (@renovate[bot]) in [`d37e08fcc`](https://github.com/meshtastic/Meshtastic-Android/commit/d37e08fccdabd3f673e3eccf90ab1538f02fe867) ### Internal (v2.7.14-internal.93) Changes since [`v2.7.14-open.9`](https://github.com/meshtastic/Meshtastic-Android/releases/tag/v2.7.14-open.9): @@ -59,6 +59,9 @@ Changes since [`v2.7.14-open.9`](https://github.com/meshtastic/Meshtastic-Androi * docs: update CHANGELOG.md (#5508) by github-actions[bot] (@github-actions[bot]) in [`6fb3776e0`](https://github.com/meshtastic/Meshtastic-Android/commit/6fb3776e0c2588392111fb4da89780f8bf597eb5) * build: reorder Maven repos to reduce flatpak generator 404s (#5509) by James Rich (@jamesarich) in [`930dee09e`](https://github.com/meshtastic/Meshtastic-Android/commit/930dee09e5b3f23d02d0dc5aae3eeea61974bada) * chore(deps): migrate takpacket-sdk to Maven Central coordinates (#5512) by James Rich (@jamesarich) in [`5c3b22584`](https://github.com/meshtastic/Meshtastic-Android/commit/5c3b22584e4d5d71c6813842033bd2ae17b0041b) +* ci: reduce flatpak source generation thrash (#5513) by James Rich (@jamesarich) in [`3f64b5a0e`](https://github.com/meshtastic/Meshtastic-Android/commit/3f64b5a0ecf7cc9ed6e81068ab3067033a7f74f4) +* chore: Scheduled updates (Firmware, Hardware, Translations, Graphs) (#5511) by James Rich (@jamesarich) in [`1dcb7b9d1`](https://github.com/meshtastic/Meshtastic-Android/commit/1dcb7b9d1a29fcdfad214fe74360130c597ee989) +* docs: update CHANGELOG.md (#5510) by github-actions[bot] (@github-actions[bot]) in [`0803dd3ae`](https://github.com/meshtastic/Meshtastic-Android/commit/0803dd3ae8d6970ae8218dcfd6d0bb9b63866da9) ### Open Beta (v2.7.14-open.9) Changes since [`v2.7.13`](https://github.com/meshtastic/Meshtastic-Android/releases/tag/v2.7.13): From e13a4359e188bbf02087cdb6253ea2b70c8200ed Mon Sep 17 00:00:00 2001 From: James Rich <2199651+jamesarich@users.noreply.github.com> Date: Tue, 19 May 2026 19:03:51 -0700 Subject: [PATCH 69/78] fix(ci): exclude kotlinNativeBundleConfiguration from flatpak source generation (#5517) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- core/ble/build.gradle.kts | 1 + core/common/build.gradle.kts | 1 + core/database/build.gradle.kts | 1 + core/model/build.gradle.kts | 1 + core/navigation/build.gradle.kts | 1 + core/proto/build.gradle.kts | 8 +++++++- feature/messaging/build.gradle.kts | 1 + 7 files changed, 13 insertions(+), 1 deletion(-) diff --git a/core/ble/build.gradle.kts b/core/ble/build.gradle.kts index 337435c8e..b40d0c5c5 100644 --- a/core/ble/build.gradle.kts +++ b/core/ble/build.gradle.kts @@ -58,6 +58,7 @@ tasks.flatpakGradleGenerator { "androidHostTestCompileClasspath", "androidHostTestLintChecksClasspath", "androidHostTestRuntimeClasspath", + "kotlinNativeBundleConfiguration", "testCompileClasspath", "testRuntimeClasspath", ), diff --git a/core/common/build.gradle.kts b/core/common/build.gradle.kts index 11b33ca8f..1466b1051 100644 --- a/core/common/build.gradle.kts +++ b/core/common/build.gradle.kts @@ -49,6 +49,7 @@ tasks.flatpakGradleGenerator { "androidHostTestCompileClasspath", "androidHostTestLintChecksClasspath", "androidHostTestRuntimeClasspath", + "kotlinNativeBundleConfiguration", "testCompileClasspath", "testRuntimeClasspath", ), diff --git a/core/database/build.gradle.kts b/core/database/build.gradle.kts index b5a8617dc..1b7766e8c 100644 --- a/core/database/build.gradle.kts +++ b/core/database/build.gradle.kts @@ -93,6 +93,7 @@ tasks.flatpakGradleGenerator { "androidDeviceTestLintChecksClasspath", "androidDeviceTestCompileClasspath", "androidCompileClasspath", + "kotlinNativeBundleConfiguration", "testCompileClasspath", "testRuntimeClasspath", ), diff --git a/core/model/build.gradle.kts b/core/model/build.gradle.kts index 3c0dc95bd..e20f9c9e2 100644 --- a/core/model/build.gradle.kts +++ b/core/model/build.gradle.kts @@ -85,6 +85,7 @@ tasks.flatpakGradleGenerator { "androidDeviceTestLintChecksClasspath", "androidDeviceTestCompileClasspath", "androidCompileClasspath", + "kotlinNativeBundleConfiguration", "testCompileClasspath", "testRuntimeClasspath", ), diff --git a/core/navigation/build.gradle.kts b/core/navigation/build.gradle.kts index 633b86f8f..ad091e2fe 100644 --- a/core/navigation/build.gradle.kts +++ b/core/navigation/build.gradle.kts @@ -50,6 +50,7 @@ tasks.flatpakGradleGenerator { "androidDeviceTestLintChecksClasspath", "androidDeviceTestCompileClasspath", "androidCompileClasspath", + "kotlinNativeBundleConfiguration", "testCompileClasspath", "testRuntimeClasspath", ), diff --git a/core/proto/build.gradle.kts b/core/proto/build.gradle.kts index 683514a3c..00bb630b2 100644 --- a/core/proto/build.gradle.kts +++ b/core/proto/build.gradle.kts @@ -137,5 +137,11 @@ publishing { tasks.flatpakGradleGenerator { outputFile = file("../../flatpak-sources-core-proto.json") downloadDirectory.set("./offline-repository") - excludeConfigurations.set(listOf("testCompileClasspath", "testRuntimeClasspath")) + excludeConfigurations.set( + listOf( + "kotlinNativeBundleConfiguration", + "testCompileClasspath", + "testRuntimeClasspath", + ), + ) } diff --git a/feature/messaging/build.gradle.kts b/feature/messaging/build.gradle.kts index 39bcfb461..828857ece 100644 --- a/feature/messaging/build.gradle.kts +++ b/feature/messaging/build.gradle.kts @@ -80,6 +80,7 @@ tasks.flatpakGradleGenerator { "androidHostTestCompileClasspath", "androidHostTestLintChecksClasspath", "androidHostTestRuntimeClasspath", + "kotlinNativeBundleConfiguration", "testCompileClasspath", "testRuntimeClasspath", ), From 54fafd225bddfee446cfea01dee6887e082acc79 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 19 May 2026 21:05:25 -0500 Subject: [PATCH 70/78] docs: update CHANGELOG.md (#5518) --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6dd534ab4..fbaa95a3e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,8 @@ See [GitHub Releases](https://github.com/meshtastic/Meshtastic-Android/releases) * fix: prevent node details hang when device hardware API is unreachable (#5514) by James Rich (@jamesarich) in [`877909fa9`](https://github.com/meshtastic/Meshtastic-Android/commit/877909fa94b55758be9dd91e2bd11e160b3822ed) * chore(deps): update ruby to v4.0.5 (#5515) by renovate[bot] (@renovate[bot]) in [`d37e08fcc`](https://github.com/meshtastic/Meshtastic-Android/commit/d37e08fccdabd3f673e3eccf90ab1538f02fe867) +* docs: update CHANGELOG.md (#5516) by github-actions[bot] (@github-actions[bot]) in [`f5e5fb6da`](https://github.com/meshtastic/Meshtastic-Android/commit/f5e5fb6da63ee85e64dbbe19a519a5a3deccd408) +* fix(ci): exclude kotlinNativeBundleConfiguration from flatpak source generation (#5517) by James Rich (@jamesarich) in [`e13a4359e`](https://github.com/meshtastic/Meshtastic-Android/commit/e13a4359e188bbf02087cdb6253ea2b70c8200ed) ### Internal (v2.7.14-internal.93) Changes since [`v2.7.14-open.9`](https://github.com/meshtastic/Meshtastic-Android/releases/tag/v2.7.14-open.9): From 1998277555d2d3ac9f01f8af9f6c4a0652c169ad Mon Sep 17 00:00:00 2001 From: James Rich <2199651+jamesarich@users.noreply.github.com> Date: Tue, 19 May 2026 19:12:38 -0700 Subject: [PATCH 71/78] fix(ci): downgrade Ruby to 4.0.4 for ubuntu-24.04 compatibility (#5519) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/workflows/release.yml | 4 ++-- .ruby-version | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 6c6cf9b07..8b795afb5 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -162,7 +162,7 @@ jobs: - name: Setup Fastlane uses: ruby/setup-ruby@v1 with: - ruby-version: '4.0.5' + ruby-version: '4.0.4' bundler-cache: true - name: Build and Deploy Google Play to Internal Track with Fastlane @@ -235,7 +235,7 @@ jobs: - name: Setup Fastlane uses: ruby/setup-ruby@v1 with: - ruby-version: '4.0.5' + ruby-version: '4.0.4' bundler-cache: true - name: Build F-Droid with Fastlane diff --git a/.ruby-version b/.ruby-version index 7636e7565..c5106e6d1 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -4.0.5 +4.0.4 From a6523acbb88766c6a1401f13d4b23ab679bf3af7 Mon Sep 17 00:00:00 2001 From: James Rich <2199651+jamesarich@users.noreply.github.com> Date: Wed, 20 May 2026 02:23:54 -0700 Subject: [PATCH 72/78] ci: unify GitHub Pages deployment (Dokka + docs site) (#5523) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/workflows/docs-deploy.yml | 58 ++++++++----- .github/workflows/docs-release.yml | 65 +++++++-------- .github/workflows/docs.yml | 83 ------------------- .../org/meshtastic/buildlogic/DocsTasks.kt | 8 +- 4 files changed, 70 insertions(+), 144 deletions(-) delete mode 100644 .github/workflows/docs.yml diff --git a/.github/workflows/docs-deploy.yml b/.github/workflows/docs-deploy.yml index a1e67ef35..4f28bfb30 100644 --- a/.github/workflows/docs-deploy.yml +++ b/.github/workflows/docs-deploy.yml @@ -1,30 +1,38 @@ -name: Docs Deploy (Beta) +name: Deploy Documentation on: push: branches: [main] paths: + # Dokka sources (KDoc in source files) + - 'androidApp/src/**' + - 'core/**/src/**' + - 'feature/**/src/**' + - 'desktopApp/src/**' + # Docs site sources - 'docs/**' - 'feature/docs/**' - - 'build-logic/convention/src/main/kotlin/org/meshtastic/buildlogic/DocsTasks.kt' + # Build infrastructure + - 'build-logic/**' + - 'build.gradle.kts' + - 'settings.gradle.kts' - '.github/workflows/docs-deploy.yml' + workflow_dispatch: + permissions: contents: read pages: write id-token: write concurrency: - group: docs-deploy + group: pages cancel-in-progress: true jobs: - build-and-deploy: + build: + if: github.repository == 'meshtastic/Meshtastic-Android' runs-on: ubuntu-24.04 - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - steps: - name: Checkout uses: actions/checkout@v6 @@ -32,31 +40,35 @@ jobs: submodules: true fetch-depth: 0 - - name: Set up JDK 21 - uses: actions/setup-java@v5 + - name: Gradle Setup + uses: ./.github/actions/gradle-setup with: - java-version: '21' - distribution: 'temurin' + gradle_encryption_key: ${{ secrets.GRADLE_ENCRYPTION_KEY }} - - name: Setup Gradle - uses: gradle/actions/setup-gradle@v6 - with: - cache-read-only: false + - name: Build Dokka HTML documentation + run: ./gradlew dokkaGeneratePublicationHtml --no-configuration-cache - - name: Generate Docs Bundle - run: ./gradlew generateDocsBundle -Pdocs.channel=beta -Pci=true + - name: Generate Docs Site + run: ./gradlew generateDocsBundle validateDocsBundle publishDocsSite -Pdocs.channel=root -Pci=true - - name: Validate Docs Bundle - run: ./gradlew validateDocsBundle -Pdocs.channel=beta -Pci=true - - - name: Generate Site Artifact - run: ./gradlew publishDocsSite -Pdocs.channel=beta -Pci=true + - name: Assemble Pages artifact + run: | + # Copy Dokka output into _site/api/ + cp -r build/dokka/html build/_site/api - name: Upload Pages Artifact uses: actions/upload-pages-artifact@v5 with: path: build/_site/ + deploy: + if: github.repository == 'meshtastic/Meshtastic-Android' + needs: build + runs-on: ubuntu-24.04-arm + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: - name: Deploy to GitHub Pages id: deployment uses: actions/deploy-pages@v5 diff --git a/.github/workflows/docs-release.yml b/.github/workflows/docs-release.yml index 3e5160e1a..9aae78292 100644 --- a/.github/workflows/docs-release.yml +++ b/.github/workflows/docs-release.yml @@ -7,21 +7,18 @@ on: - '!v*-*' permissions: - contents: write + contents: read pages: write id-token: write concurrency: - group: docs-release + group: pages cancel-in-progress: false jobs: - release-docs: + build: + if: github.repository == 'meshtastic/Meshtastic-Android' runs-on: ubuntu-24.04 - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - steps: - name: Checkout uses: actions/checkout@v6 @@ -36,47 +33,43 @@ jobs: echo "version=$TAG" >> $GITHUB_OUTPUT echo "Deploying docs for version: $TAG" - - name: Set up JDK 21 - uses: actions/setup-java@v5 + - name: Gradle Setup + uses: ./.github/actions/gradle-setup with: - java-version: '21' - distribution: 'temurin' + gradle_encryption_key: ${{ secrets.GRADLE_ENCRYPTION_KEY }} - - name: Setup Gradle - uses: gradle/actions/setup-gradle@v6 - with: - cache-read-only: true + # Build root docs site (/ on Pages) + - name: Build Root Docs Site + run: ./gradlew generateDocsBundle publishDocsSite -Pdocs.channel=root -Pci=true - - name: Generate Docs Bundle - run: ./gradlew generateDocsBundle -Pdocs.channel=release -Pdocs.version=${{ steps.version.outputs.version }} -Pci=true + # Build versioned docs (/vX.Y.Z/ on Pages) + - name: Build Versioned Docs + run: ./gradlew generateDocsBundle publishDocsSite -Pdocs.channel=release -Pdocs.version=${{ steps.version.outputs.version }} -Pci=true - - name: Validate Docs Bundle - run: ./gradlew validateDocsBundle -Pdocs.version=${{ steps.version.outputs.version }} -Pci=true + # Build Dokka API reference (/api/ on Pages) + - name: Build Dokka HTML documentation + run: ./gradlew dokkaGeneratePublicationHtml --no-configuration-cache - - name: Generate Site Artifact - run: ./gradlew publishDocsSite -Pdocs.channel=release -Pdocs.version=${{ steps.version.outputs.version }} -Pci=true - - - name: Update Versions Manifest + - name: Assemble Pages artifact run: | - VERSION=${{ steps.version.outputs.version }} - # Prepend new version entry to versions.yml - cat < /tmp/new_version.yml - - name: "$VERSION" - url: /v$VERSION/ - prerelease: false - current: true - EOF - # Mark existing entries as not current - sed -i 's/current: true/current: false/' docs/_data/versions.yml - # Prepend new entry - cat /tmp/new_version.yml docs/_data/versions.yml > /tmp/versions_merged.yml - mv /tmp/versions_merged.yml docs/_data/versions.yml + # Root site is already at build/_site/ from the root channel build. + # Versioned docs are at build/_site/v{version}/ from the release channel build. + # Add Dokka at /api/ + cp -r build/dokka/html build/_site/api - name: Upload Pages Artifact uses: actions/upload-pages-artifact@v5 with: path: build/_site/ + deploy: + if: github.repository == 'meshtastic/Meshtastic-Android' + needs: build + runs-on: ubuntu-24.04-arm + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: - name: Deploy to GitHub Pages id: deployment uses: actions/deploy-pages@v5 diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml deleted file mode 100644 index 7b4d82083..000000000 --- a/.github/workflows/docs.yml +++ /dev/null @@ -1,83 +0,0 @@ -# This workflow builds and deploys the Dokka documentation to GitHub Pages. - -name: Deploy Documentation - -on: - push: - branches: - - main - paths: - # Only rebuild docs when source code changes (Dokka generates from KDoc) - - 'androidApp/src/**' - - 'core/**/src/**' - - 'feature/**/src/**' - - 'desktopApp/src/**' - - 'build-logic/**' - - 'build.gradle.kts' - - 'settings.gradle.kts' - - '.github/workflows/docs.yml' - - # Allows you to run this workflow manually from the Actions tab - workflow_dispatch: - inputs: - ref: - description: 'The branch, tag or SHA to checkout' - required: false - type: string - - # Allow this workflow to be called from other workflows - workflow_call: - inputs: - ref: - description: 'The branch, tag or SHA to checkout' - required: false - type: string - -# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages -permissions: - contents: read - pages: write - id-token: write - -# Allow only one concurrent deployment; cancel queued runs since only the latest -# main state matters for documentation. -concurrency: - group: "pages" - cancel-in-progress: true - -jobs: - build-docs: - if: github.repository == 'meshtastic/Meshtastic-Android' - runs-on: ubuntu-24.04 - steps: - - name: Checkout code - uses: actions/checkout@v6 - with: - fetch-depth: 0 - submodules: 'recursive' - ref: ${{ inputs.ref || '' }} - - - name: Gradle Setup - uses: ./.github/actions/gradle-setup - with: - gradle_encryption_key: ${{ secrets.GRADLE_ENCRYPTION_KEY }} - - - name: Build Dokka HTML documentation - run: ./gradlew dokkaGeneratePublicationHtml --no-configuration-cache - - - name: Upload artifact - uses: actions/upload-pages-artifact@v5 - with: - path: build/dokka/html - - deploy: - if: github.repository == 'meshtastic/Meshtastic-Android' - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - runs-on: ubuntu-24.04-arm - needs: build-docs - steps: - - name: Deploy to GitHub Pages - id: deployment - uses: actions/deploy-pages@v5 diff --git a/build-logic/convention/src/main/kotlin/org/meshtastic/buildlogic/DocsTasks.kt b/build-logic/convention/src/main/kotlin/org/meshtastic/buildlogic/DocsTasks.kt index 4e9745934..4f8656024 100644 --- a/build-logic/convention/src/main/kotlin/org/meshtastic/buildlogic/DocsTasks.kt +++ b/build-logic/convention/src/main/kotlin/org/meshtastic/buildlogic/DocsTasks.kt @@ -380,8 +380,12 @@ abstract class PublishDocsSiteTask : DefaultTask() { @TaskAction fun publish() { val siteDir = siteOutputDir.get().asFile - val channelPath = if (channel.get() == "release") "v${version.get()}" else channel.get() - val outDir = File(siteDir, channelPath) + val channelPath = when (channel.get()) { + "release" -> "v${version.get()}" + "root" -> "" + else -> channel.get() + } + val outDir = if (channelPath.isEmpty()) siteDir else File(siteDir, channelPath) outDir.mkdirs() // Copy generated bundle to site output From 8de0a1f167e498ccef999d3917023e1f34640a8c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 20 May 2026 04:47:33 -0500 Subject: [PATCH 73/78] chore(deps): update koin.plugin to v1.0.0 (#5524) --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e454fce96..209732ee4 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -15,7 +15,7 @@ navigation3 = "1.1.1" paging = "3.5.0" room = "3.0.0-alpha05" koin = "4.2.1" -koin-plugin = "1.0.0-RC2" +koin-plugin = "1.0.0" # Kotlin kotlin = "2.3.21" From 7ae1b2681313da5a07217ea6e04a0c3dc4b79946 Mon Sep 17 00:00:00 2001 From: James Rich <2199651+jamesarich@users.noreply.github.com> Date: Wed, 20 May 2026 02:51:47 -0700 Subject: [PATCH 74/78] chore(flatpak): optimize CI source generation and clean up redundant tasks (#5525) --- .agent_memory/session_context.md | 7 +++++ .github/workflows/release.yml | 2 +- .github/workflows/reusable-check.yml | 4 +-- build-logic/convention/build.gradle.kts | 2 +- build.gradle.kts | 14 +--------- core/ble/build.gradle.kts | 19 -------------- core/common/build.gradle.kts | 16 ----------- core/database/build.gradle.kts | 22 ---------------- core/model/build.gradle.kts | 22 ---------------- core/navigation/build.gradle.kts | 22 ---------------- core/proto/build.gradle.kts | 13 --------- desktopApp/build.gradle.kts | 7 +++-- feature/messaging/build.gradle.kts | 35 +------------------------ 13 files changed, 18 insertions(+), 167 deletions(-) diff --git a/.agent_memory/session_context.md b/.agent_memory/session_context.md index 3d98a8c99..3976befd4 100644 --- a/.agent_memory/session_context.md +++ b/.agent_memory/session_context.md @@ -3,6 +3,13 @@ # Do NOT edit or remove previous entries — stale state claims cause agent confusion. # Format: ## YYYY-MM-DD —

+## 2026-05-20 — Optimized slow Flatpak CI jobs +- Restrained flatpakGradleGenerator to target only the runtimeClasspath configuration in desktopApp and build-logic:convention modules. +- Updated release.yml and reusable-check.yml to invoke only targeted tasks (:desktopApp:flatpakGradleGenerator and :build-logic:convention:flatpakGradleGenerator) instead of running the task on the root and all subprojects. +- Retained Matrix architecture runner configuration for build validity, as Skiko/Compose Desktop native artifacts are resolved dynamically based on host architecture. +- Cleaned up leftover speed-up workarounds: completely removed the Flatpak Gradle Generator plugin application and tasks from the root project and all other library/feature subprojects (`core:ble`, `core:common`, `core:database`, `core:model`, `core:navigation`, `core:proto`, and `feature:messaging`), including deleting the unused `flatpakKmpAndroidMeta` configuration from `feature:messaging`. +- Verified that local execution of `:desktopApp:flatpakGradleGenerator` runtimeClasspath resolution speed dropped from 46 seconds to 12 seconds, and all Spotless and Detekt linting checks passed. + ## 2026-05-12 — Implemented Apple alignment for docs feature (FR-038) - Branch: `feat/20260507-161858-app-docs-markdown` - Gap analysis against `meshtastic-apple` completed. Implemented 4 alignment items: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 8b795afb5..fabcd838b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -372,7 +372,7 @@ jobs: - name: Generate Flatpak Sources run: > - ./gradlew :build-logic:convention:flatpakGradleGenerator flatpakGradleGenerator + ./gradlew :build-logic:convention:flatpakGradleGenerator :desktopApp:flatpakGradleGenerator --no-configuration-cache - name: List Flatpak source files diff --git a/.github/workflows/reusable-check.yml b/.github/workflows/reusable-check.yml index c87b954c1..b5340bf9c 100644 --- a/.github/workflows/reusable-check.yml +++ b/.github/workflows/reusable-check.yml @@ -536,8 +536,8 @@ jobs: - name: Generate Flatpak Sources run: > - ./gradlew :build-logic:convention:flatpakGradleGenerator flatpakGradleGenerator - --no-configuration-cache --refresh-dependencies --no-parallel + ./gradlew :build-logic:convention:flatpakGradleGenerator :desktopApp:flatpakGradleGenerator + --no-configuration-cache --refresh-dependencies - run: ls -lah flatpak-sources-*.json diff --git a/build-logic/convention/build.gradle.kts b/build-logic/convention/build.gradle.kts index 87fa2f3d0..eb35fbac1 100644 --- a/build-logic/convention/build.gradle.kts +++ b/build-logic/convention/build.gradle.kts @@ -100,7 +100,7 @@ detekt { tasks.flatpakGradleGenerator { outputFile = file("../../flatpak-sources-convention.json") downloadDirectory.set("./offline-repository") - excludeConfigurations.set(listOf("testCompileClasspath", "testRuntimeClasspath")) + includeConfigurations.set(listOf("runtimeClasspath")) } gradlePlugin { diff --git a/build.gradle.kts b/build.gradle.kts index 8a6dfdaf6..2754b365c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -38,7 +38,6 @@ plugins { alias(libs.plugins.spotless) apply false alias(libs.plugins.dokka) alias(libs.plugins.test.retry) apply false - alias(libs.plugins.flatpak.gradle.generator) alias(libs.plugins.meshtastic.root) id("meshtastic.docs") } @@ -47,15 +46,4 @@ dependencies { dokkaPlugin(libs.dokka.android.documentation.plugin) } -tasks.flatpakGradleGenerator { - outputFile = file("flatpak-sources-root.json") - downloadDirectory = "./offline-repository" - excludeConfigurations.set( - listOf( - "dokkaHtmlModuleOutputDirectoriesResolver~internal", - "koverExternalArtifacts", - "testCompileClasspath", - "testRuntimeClasspath", - ) - ) -} + diff --git a/core/ble/build.gradle.kts b/core/ble/build.gradle.kts index b40d0c5c5..e6cc2ec2a 100644 --- a/core/ble/build.gradle.kts +++ b/core/ble/build.gradle.kts @@ -18,7 +18,6 @@ plugins { alias(libs.plugins.meshtastic.kmp.library) id("meshtastic.koin") - alias(libs.plugins.flatpak.gradle.generator) } kotlin { @@ -46,21 +45,3 @@ kotlin { } } } - -tasks.flatpakGradleGenerator { - outputFile = file("../../flatpak-sources-core-ble.json") - downloadDirectory.set("./offline-repository") - excludeConfigurations.set( - listOf( - "androidRuntimeClasspath", - "androidCompileClasspath", - "androidMainLintChecksClasspath", - "androidHostTestCompileClasspath", - "androidHostTestLintChecksClasspath", - "androidHostTestRuntimeClasspath", - "kotlinNativeBundleConfiguration", - "testCompileClasspath", - "testRuntimeClasspath", - ), - ) -} diff --git a/core/common/build.gradle.kts b/core/common/build.gradle.kts index 1466b1051..d535d4eff 100644 --- a/core/common/build.gradle.kts +++ b/core/common/build.gradle.kts @@ -20,7 +20,6 @@ plugins { alias(libs.plugins.kotlin.parcelize) id("meshtastic.kmp.jvm.android") id("meshtastic.koin") - alias(libs.plugins.flatpak.gradle.generator) } kotlin { @@ -40,18 +39,3 @@ kotlin { commonTest.dependencies { implementation(libs.kotlinx.coroutines.test) } } } - -tasks.flatpakGradleGenerator { - outputFile = file("../../flatpak-sources-core-common.json") - downloadDirectory.set("./offline-repository") - excludeConfigurations.set( - listOf( - "androidHostTestCompileClasspath", - "androidHostTestLintChecksClasspath", - "androidHostTestRuntimeClasspath", - "kotlinNativeBundleConfiguration", - "testCompileClasspath", - "testRuntimeClasspath", - ), - ) -} diff --git a/core/database/build.gradle.kts b/core/database/build.gradle.kts index 1b7766e8c..69ed36b5d 100644 --- a/core/database/build.gradle.kts +++ b/core/database/build.gradle.kts @@ -21,7 +21,6 @@ plugins { alias(libs.plugins.meshtastic.kotlinx.serialization) alias(libs.plugins.kotlin.parcelize) id("meshtastic.koin") - alias(libs.plugins.flatpak.gradle.generator) } kotlin { @@ -78,24 +77,3 @@ dependencies { "kspAndroidHostTest"(libs.androidx.room.compiler) "kspAndroidDeviceTest"(libs.androidx.room.compiler) } - -tasks.flatpakGradleGenerator { - outputFile = file("../../flatpak-sources-core-database.json") - downloadDirectory.set("./offline-repository") - excludeConfigurations.set( - listOf( - "androidRuntimeClasspath", - "androidMainLintChecksClasspath", - "androidHostTestRuntimeClasspath", - "androidHostTestLintChecksClasspath", - "androidHostTestCompileClasspath", - "androidDeviceTestRuntimeClasspath", - "androidDeviceTestLintChecksClasspath", - "androidDeviceTestCompileClasspath", - "androidCompileClasspath", - "kotlinNativeBundleConfiguration", - "testCompileClasspath", - "testRuntimeClasspath", - ), - ) -} diff --git a/core/model/build.gradle.kts b/core/model/build.gradle.kts index e20f9c9e2..cb3d908d2 100644 --- a/core/model/build.gradle.kts +++ b/core/model/build.gradle.kts @@ -21,7 +21,6 @@ plugins { alias(libs.plugins.kotlin.parcelize) id("meshtastic.kmp.jvm.android") id("meshtastic.publishing") - alias(libs.plugins.flatpak.gradle.generator) } kotlin { @@ -70,24 +69,3 @@ publishing { } } } - -tasks.flatpakGradleGenerator { - outputFile = file("../../flatpak-sources-core-model.json") - downloadDirectory.set("./offline-repository") - excludeConfigurations.set( - listOf( - "androidRuntimeClasspath", - "androidMainLintChecksClasspath", - "androidHostTestRuntimeClasspath", - "androidHostTestLintChecksClasspath", - "androidHostTestCompileClasspath", - "androidDeviceTestRuntimeClasspath", - "androidDeviceTestLintChecksClasspath", - "androidDeviceTestCompileClasspath", - "androidCompileClasspath", - "kotlinNativeBundleConfiguration", - "testCompileClasspath", - "testRuntimeClasspath", - ), - ) -} diff --git a/core/navigation/build.gradle.kts b/core/navigation/build.gradle.kts index ad091e2fe..ff848a827 100644 --- a/core/navigation/build.gradle.kts +++ b/core/navigation/build.gradle.kts @@ -19,7 +19,6 @@ plugins { alias(libs.plugins.meshtastic.kmp.library) alias(libs.plugins.meshtastic.kmp.library.compose) alias(libs.plugins.meshtastic.kotlinx.serialization) - alias(libs.plugins.flatpak.gradle.generator) } kotlin { @@ -35,24 +34,3 @@ kotlin { commonTest.dependencies { implementation(projects.core.testing) } } } - -tasks.flatpakGradleGenerator { - outputFile = file("../../flatpak-sources-core-navigation.json") - downloadDirectory.set("./offline-repository") - excludeConfigurations.set( - listOf( - "androidRuntimeClasspath", - "androidMainLintChecksClasspath", - "androidHostTestRuntimeClasspath", - "androidHostTestLintChecksClasspath", - "androidHostTestCompileClasspath", - "androidDeviceTestRuntimeClasspath", - "androidDeviceTestLintChecksClasspath", - "androidDeviceTestCompileClasspath", - "androidCompileClasspath", - "kotlinNativeBundleConfiguration", - "testCompileClasspath", - "testRuntimeClasspath", - ), - ) -} diff --git a/core/proto/build.gradle.kts b/core/proto/build.gradle.kts index 00bb630b2..1deb5c91f 100644 --- a/core/proto/build.gradle.kts +++ b/core/proto/build.gradle.kts @@ -19,7 +19,6 @@ plugins { alias(libs.plugins.meshtastic.kmp.library) alias(libs.plugins.wire) id("meshtastic.publishing") - alias(libs.plugins.flatpak.gradle.generator) } kotlin { @@ -133,15 +132,3 @@ publishing { } } } - -tasks.flatpakGradleGenerator { - outputFile = file("../../flatpak-sources-core-proto.json") - downloadDirectory.set("./offline-repository") - excludeConfigurations.set( - listOf( - "kotlinNativeBundleConfiguration", - "testCompileClasspath", - "testRuntimeClasspath", - ), - ) -} diff --git a/desktopApp/build.gradle.kts b/desktopApp/build.gradle.kts index 1f099dc97..e3b5138ee 100644 --- a/desktopApp/build.gradle.kts +++ b/desktopApp/build.gradle.kts @@ -327,9 +327,12 @@ dependencies { // Must be run on each architecture to generate separate flatpak-sources. tasks.flatpakGradleGenerator { - val arch = System.getProperty("os.arch").let { if (it == "amd64") "x86_64" else it } + val arch = + providers + .gradleProperty("flatpak.arch") + .getOrElse(System.getProperty("os.arch").let { if (it == "amd64") "x86_64" else it }) outputFile = file("../flatpak-sources-desktop-$arch.json") downloadDirectory.set("./offline-repository") onlyArches = arch - excludeConfigurations.set(listOf("testCompileClasspath", "testRuntimeClasspath")) + includeConfigurations.set(listOf("runtimeClasspath")) } diff --git a/feature/messaging/build.gradle.kts b/feature/messaging/build.gradle.kts index 828857ece..bedb38120 100644 --- a/feature/messaging/build.gradle.kts +++ b/feature/messaging/build.gradle.kts @@ -15,10 +15,7 @@ * along with this program. If not, see . */ -plugins { - alias(libs.plugins.meshtastic.kmp.feature) - alias(libs.plugins.flatpak.gradle.generator) -} +plugins { alias(libs.plugins.meshtastic.kmp.feature) } kotlin { sourceSets { @@ -56,33 +53,3 @@ kotlin { } // Gradle's KMP variant resolution follows `available-at` redirects in module -// metadata and needs android variant `.module` files for disambiguation. The -// androidCompileClasspath configuration can't be resolved by the flatpak -// generator due to AGP variant ambiguity on project dependencies, so we capture -// android KMP metadata via a dedicated configuration that only holds external -// dependencies. -val flatpakKmpAndroidMeta by - configurations.creating { - isCanBeResolved = true - isCanBeConsumed = false - } - -dependencies { flatpakKmpAndroidMeta("androidx.paging:paging-compose-android:${libs.versions.paging.get()}") } - -tasks.flatpakGradleGenerator { - outputFile = file("../../flatpak-sources-feature-messaging.json") - downloadDirectory.set("./offline-repository") - excludeConfigurations.set( - listOf( - "androidRuntimeClasspath", - "androidMainLintChecksClasspath", - "androidCompileClasspath", - "androidHostTestCompileClasspath", - "androidHostTestLintChecksClasspath", - "androidHostTestRuntimeClasspath", - "kotlinNativeBundleConfiguration", - "testCompileClasspath", - "testRuntimeClasspath", - ), - ) -} From f94358551c7e41a2ea07ca97185fa8331b19f09c Mon Sep 17 00:00:00 2001 From: James Rich <2199651+jamesarich@users.noreply.github.com> Date: Wed, 20 May 2026 02:58:44 -0700 Subject: [PATCH 75/78] fix(docs): compile Jekyll docs site and add root redirect in CI (#5526) --- .agent_memory/session_context.md | 6 ++++ .github/workflows/docs-deploy.yml | 21 ++++++++++++-- .github/workflows/docs-release.yml | 45 ++++++++++++++++++++++++++---- docs/index.html | 13 +++++++++ 4 files changed, 77 insertions(+), 8 deletions(-) create mode 100644 docs/index.html diff --git a/.agent_memory/session_context.md b/.agent_memory/session_context.md index 3976befd4..930c36dd5 100644 --- a/.agent_memory/session_context.md +++ b/.agent_memory/session_context.md @@ -3,6 +3,12 @@ # Do NOT edit or remove previous entries — stale state claims cause agent confusion. # Format: ## YYYY-MM-DD — +## 2026-05-20 — Fixed Jekyll documentation site build and deployment in CI +- Created `docs/index.html` to automatically redirect root path requests (`/`) to the English directory (`/en/`). +- Updated `.github/workflows/docs-deploy.yml` to compile the Jekyll root site using `--baseurl /${{ github.event.repository.name }}` and setup Ruby with version `4.0.4` to match project release workflow conventions. +- Updated `.github/workflows/docs-release.yml` to compile both versioned and root Jekyll sites, assemble them into `build/final_site/` with Dokka HTML references, configure correct baseurls respectively, and setup Ruby with version `4.0.4`. +- Verified that local Gradle docs tasks (`generateDocsBundle`, `validateDocsBundle`, `publishDocsSite`) compile successfully and the redirect file is correctly populated in the output. + ## 2026-05-20 — Optimized slow Flatpak CI jobs - Restrained flatpakGradleGenerator to target only the runtimeClasspath configuration in desktopApp and build-logic:convention modules. - Updated release.yml and reusable-check.yml to invoke only targeted tasks (:desktopApp:flatpakGradleGenerator and :build-logic:convention:flatpakGradleGenerator) instead of running the task on the root and all subprojects. diff --git a/.github/workflows/docs-deploy.yml b/.github/workflows/docs-deploy.yml index 4f28bfb30..784fc47b7 100644 --- a/.github/workflows/docs-deploy.yml +++ b/.github/workflows/docs-deploy.yml @@ -48,18 +48,33 @@ jobs: - name: Build Dokka HTML documentation run: ./gradlew dokkaGeneratePublicationHtml --no-configuration-cache + - name: Setup Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: '4.0.4' + bundler-cache: true + working-directory: docs + - name: Generate Docs Site run: ./gradlew generateDocsBundle validateDocsBundle publishDocsSite -Pdocs.channel=root -Pci=true + - name: Compile Jekyll Docs Site + run: | + BUNDLE_GEMFILE=docs/Gemfile bundle exec jekyll build \ + --source build/_site \ + --destination build/jekyll_site \ + --baseurl /${{ github.event.repository.name }} + touch build/jekyll_site/.nojekyll + - name: Assemble Pages artifact run: | - # Copy Dokka output into _site/api/ - cp -r build/dokka/html build/_site/api + # Copy Dokka output into compiled jekyll_site/api/ + cp -r build/dokka/html build/jekyll_site/api - name: Upload Pages Artifact uses: actions/upload-pages-artifact@v5 with: - path: build/_site/ + path: build/jekyll_site/ deploy: if: github.repository == 'meshtastic/Meshtastic-Android' diff --git a/.github/workflows/docs-release.yml b/.github/workflows/docs-release.yml index 9aae78292..743e7a45f 100644 --- a/.github/workflows/docs-release.yml +++ b/.github/workflows/docs-release.yml @@ -38,6 +38,13 @@ jobs: with: gradle_encryption_key: ${{ secrets.GRADLE_ENCRYPTION_KEY }} + - name: Setup Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: '4.0.4' + bundler-cache: true + working-directory: docs + # Build root docs site (/ on Pages) - name: Build Root Docs Site run: ./gradlew generateDocsBundle publishDocsSite -Pdocs.channel=root -Pci=true @@ -50,17 +57,45 @@ jobs: - name: Build Dokka HTML documentation run: ./gradlew dokkaGeneratePublicationHtml --no-configuration-cache + - name: Compile Jekyll Sites + run: | + # Build versioned Jekyll site + BUNDLE_GEMFILE=docs/Gemfile bundle exec jekyll build \ + --source build/_site/v${{ steps.version.outputs.version }} \ + --destination build/jekyll_release \ + --baseurl /${{ github.event.repository.name }}/v${{ steps.version.outputs.version }} + + # Move versioned source folder out of root source folder to avoid nested build issues + mv build/_site/v${{ steps.version.outputs.version }} build/v_temp + + # Build root Jekyll site + BUNDLE_GEMFILE=docs/Gemfile bundle exec jekyll build \ + --source build/_site \ + --destination build/jekyll_root \ + --baseurl /${{ github.event.repository.name }} + - name: Assemble Pages artifact run: | - # Root site is already at build/_site/ from the root channel build. - # Versioned docs are at build/_site/v{version}/ from the release channel build. - # Add Dokka at /api/ - cp -r build/dokka/html build/_site/api + # Create final site directory + mkdir -p build/final_site + + # Copy root compiled site + cp -r build/jekyll_root/* build/final_site/ + + # Copy release compiled site to vX.Y.Z/ + mkdir -p build/final_site/v${{ steps.version.outputs.version }} + cp -r build/jekyll_release/* build/final_site/v${{ steps.version.outputs.version }}/ + + # Copy Dokka output into final_site/api/ + cp -r build/dokka/html build/final_site/api + + # Disable GitHub Pages' own Jekyll build + touch build/final_site/.nojekyll - name: Upload Pages Artifact uses: actions/upload-pages-artifact@v5 with: - path: build/_site/ + path: build/final_site/ deploy: if: github.repository == 'meshtastic/Meshtastic-Android' diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 000000000..b011e4b69 --- /dev/null +++ b/docs/index.html @@ -0,0 +1,13 @@ + + + + + Redirecting... + + + + + +

Redirecting to en/...

+ + From 95df500142abd44f7b4d2d75ba28ab72f1fe77ac Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 20 May 2026 04:59:00 -0500 Subject: [PATCH 76/78] docs: update CHANGELOG.md (#5520) --- CHANGELOG.md | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fbaa95a3e..fac65b53d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,12 +9,11 @@ See [GitHub Releases](https://github.com/meshtastic/Meshtastic-Android/releases) ### Unreleased (not yet in any build) -* fix: prevent node details hang when device hardware API is unreachable (#5514) by James Rich (@jamesarich) in [`877909fa9`](https://github.com/meshtastic/Meshtastic-Android/commit/877909fa94b55758be9dd91e2bd11e160b3822ed) -* chore(deps): update ruby to v4.0.5 (#5515) by renovate[bot] (@renovate[bot]) in [`d37e08fcc`](https://github.com/meshtastic/Meshtastic-Android/commit/d37e08fccdabd3f673e3eccf90ab1538f02fe867) -* docs: update CHANGELOG.md (#5516) by github-actions[bot] (@github-actions[bot]) in [`f5e5fb6da`](https://github.com/meshtastic/Meshtastic-Android/commit/f5e5fb6da63ee85e64dbbe19a519a5a3deccd408) -* fix(ci): exclude kotlinNativeBundleConfiguration from flatpak source generation (#5517) by James Rich (@jamesarich) in [`e13a4359e`](https://github.com/meshtastic/Meshtastic-Android/commit/e13a4359e188bbf02087cdb6253ea2b70c8200ed) +* ci: unify GitHub Pages deployment (Dokka + docs site) (#5523) by James Rich (@jamesarich) in [`a6523acbb`](https://github.com/meshtastic/Meshtastic-Android/commit/a6523acbb88766c6a1401f13d4b23ab679bf3af7) +* chore(deps): update koin.plugin to v1.0.0 (#5524) by renovate[bot] (@renovate[bot]) in [`8de0a1f16`](https://github.com/meshtastic/Meshtastic-Android/commit/8de0a1f167e498ccef999d3917023e1f34640a8c) +* chore(flatpak): optimize CI source generation and clean up redundant tasks (#5525) by James Rich (@jamesarich) in [`7ae1b2681`](https://github.com/meshtastic/Meshtastic-Android/commit/7ae1b2681313da5a07217ea6e04a0c3dc4b79946) -### Internal (v2.7.14-internal.93) +### Internal (v2.7.14-internal.94) Changes since [`v2.7.14-open.9`](https://github.com/meshtastic/Meshtastic-Android/releases/tag/v2.7.14-open.9): * chore(deps): update vico to v3.2.0-next.5 (#5470) by renovate[bot] (@renovate[bot]) in [`4bacff81c`](https://github.com/meshtastic/Meshtastic-Android/commit/4bacff81c5abad536b40f7370ae5d302b74a11fe) @@ -64,6 +63,12 @@ Changes since [`v2.7.14-open.9`](https://github.com/meshtastic/Meshtastic-Androi * ci: reduce flatpak source generation thrash (#5513) by James Rich (@jamesarich) in [`3f64b5a0e`](https://github.com/meshtastic/Meshtastic-Android/commit/3f64b5a0ecf7cc9ed6e81068ab3067033a7f74f4) * chore: Scheduled updates (Firmware, Hardware, Translations, Graphs) (#5511) by James Rich (@jamesarich) in [`1dcb7b9d1`](https://github.com/meshtastic/Meshtastic-Android/commit/1dcb7b9d1a29fcdfad214fe74360130c597ee989) * docs: update CHANGELOG.md (#5510) by github-actions[bot] (@github-actions[bot]) in [`0803dd3ae`](https://github.com/meshtastic/Meshtastic-Android/commit/0803dd3ae8d6970ae8218dcfd6d0bb9b63866da9) +* fix: prevent node details hang when device hardware API is unreachable (#5514) by James Rich (@jamesarich) in [`877909fa9`](https://github.com/meshtastic/Meshtastic-Android/commit/877909fa94b55758be9dd91e2bd11e160b3822ed) +* chore(deps): update ruby to v4.0.5 (#5515) by renovate[bot] (@renovate[bot]) in [`d37e08fcc`](https://github.com/meshtastic/Meshtastic-Android/commit/d37e08fccdabd3f673e3eccf90ab1538f02fe867) +* docs: update CHANGELOG.md (#5516) by github-actions[bot] (@github-actions[bot]) in [`f5e5fb6da`](https://github.com/meshtastic/Meshtastic-Android/commit/f5e5fb6da63ee85e64dbbe19a519a5a3deccd408) +* fix(ci): exclude kotlinNativeBundleConfiguration from flatpak source generation (#5517) by James Rich (@jamesarich) in [`e13a4359e`](https://github.com/meshtastic/Meshtastic-Android/commit/e13a4359e188bbf02087cdb6253ea2b70c8200ed) +* docs: update CHANGELOG.md (#5518) by github-actions[bot] (@github-actions[bot]) in [`54fafd225`](https://github.com/meshtastic/Meshtastic-Android/commit/54fafd225bddfee446cfea01dee6887e082acc79) +* fix(ci): downgrade Ruby to 4.0.4 for ubuntu-24.04 compatibility (#5519) by James Rich (@jamesarich) in [`199827755`](https://github.com/meshtastic/Meshtastic-Android/commit/1998277555d2d3ac9f01f8af9f6c4a0652c169ad) ### Open Beta (v2.7.14-open.9) Changes since [`v2.7.13`](https://github.com/meshtastic/Meshtastic-Android/releases/tag/v2.7.13): From 99b5688b00e5810467769ae57e6ee33ea3d3360c Mon Sep 17 00:00:00 2001 From: James Rich <2199651+jamesarich@users.noreply.github.com> Date: Wed, 20 May 2026 05:12:03 -0700 Subject: [PATCH 77/78] build(flatpak): overhaul and automate flatpak offline manifest generation (#5529) --- .agent_memory/session_context.md | 16 ++++++ .github/workflows/release.yml | 22 ++------ .github/workflows/reusable-check.yml | 6 +-- .gitignore | 4 +- build-logic/convention/build.gradle.kts | 71 ++++++++++++++++++++++++- build.gradle.kts | 67 +++++++++++++++++++++++ core/database/build.gradle.kts | 10 ++++ desktopApp/build.gradle.kts | 2 +- gradle/libs.versions.toml | 37 +++++++++++++ 9 files changed, 212 insertions(+), 23 deletions(-) diff --git a/.agent_memory/session_context.md b/.agent_memory/session_context.md index 930c36dd5..6894957a2 100644 --- a/.agent_memory/session_context.md +++ b/.agent_memory/session_context.md @@ -3,6 +3,22 @@ # Do NOT edit or remove previous entries — stale state claims cause agent confusion. # Format: ## YYYY-MM-DD — +## 2026-05-20 — Overhauled and Bulletproofed Flatpak Source Generation +- Overhauled and streamlined `build-logic/convention/build.gradle.kts` to dynamically query and resolve all 25+ Version Catalog plugin marker coordinates in a type-safe dynamic loop. +- Replaced the hardcoded embedded Gradle Kotlin compiler version with dynamic standard library detection: `KotlinVersion.CURRENT.toString()`. +- Implemented root Gradle consolidator task `:combineFlatpakSources` using JVM-native Json Slurper/Output, deduplicating 2222 entries and injecting Google/Aliyun backup `mirror-urls`. +- Streamlined reusable-check and release CI workflows, replacing complex `jq` hacks with a simple, single gradle task invocation. +- Verified `spotlessCheck`, `detekt`, and end-to-end completely offline package builds (`--offline`) completed with 100% success. + +## 2026-05-20 — Refactored and polished Flatpak dependency manifests to modern Gradle standards +- Polished the Flatpak generator tasks and convention setup following a comprehensive audit: + 1. Centralized version definitions to reference the central `libs.versions` catalog (`kotlin`, `koin.plugin`, etc.) instead of hardcoded strings. + 2. Documented every single dependency override and compiler-plugin helper with clear, inline comments (`// why: ...`). + 3. Cleaned out legacy dependencies and streamlined `core:database` to only capture `kspKotlinJvmProcessorClasspath`. + 4. Changed includeConfigurations to use type-safe `setOf` instead of `listOf` to align with Gradle's `SetProperty` APIs. +- Verified that all static analysis checks pass successfully: `./gradlew spotlessCheck detekt` is 100% green. +- Validated end-to-end correctness by successfully compiling the app completely offline (`--offline`) and packaging the release UberJar. + ## 2026-05-20 — Fixed Jekyll documentation site build and deployment in CI - Created `docs/index.html` to automatically redirect root path requests (`/`) to the English directory (`/en/`). - Updated `.github/workflows/docs-deploy.yml` to compile the Jekyll root site using `--baseurl /${{ github.event.repository.name }}` and setup Ruby with version `4.0.4` to match project release workflow conventions. diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index fabcd838b..da8ba6cd3 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -372,18 +372,18 @@ jobs: - name: Generate Flatpak Sources run: > - ./gradlew :build-logic:convention:flatpakGradleGenerator :desktopApp:flatpakGradleGenerator + ./gradlew :combineFlatpakSources --no-configuration-cache - name: List Flatpak source files - run: ls -R flatpak-sources-*.json + run: ls -R flatpak-sources.json - name: Upload Flatpak source artifacts if: always() uses: actions/upload-artifact@v7 with: name: flatpak-multisrc-${{ runner.arch }} - path: flatpak-sources-*.json + path: flatpak-sources.json retention-days: 1 release-flatpak-src: @@ -401,24 +401,12 @@ jobs: run: ls -R flatpak-multisrc/ - name: Validate Flatpak source files - run: jq empty flatpak-multisrc/*/*.json + run: jq empty flatpak-multisrc/*/flatpak-sources.json - name: Combine Flatpak source files run: > jq -s 'add | unique_by(.dest + "/" + .["dest-filename"] + "/" + (.["only-arches"] | tostring))' - flatpak-multisrc/*/*.json - > flatpak-sources-combined.json - - - name: Add mirror-urls for Maven Central - run: > - jq '[.[] | if (.url | test("^https://repo\\.maven\\.apache\\.org/maven2/")) then . + {"mirror-urls": [(.url | sub("^https://repo\\.maven\\.apache\\.org/maven2/"; "https://maven-central.storage-download.googleapis.com/maven2/"))]} else . end]' - flatpak-sources-combined.json - > flatpak-sources-central.json - - - name: Add mirror-urls for Gradle Plugin Portal - run: > - jq '[.[] | if (.url | test("^https://plugins\\.gradle\\.org/m2/")) then . + {"mirror-urls": [(.url | sub("^https://plugins\\.gradle\\.org/m2/"; "https://maven.aliyun.com/repository/gradle-plugin/"))]} else . end]' - flatpak-sources-central.json + flatpak-multisrc/*/flatpak-sources.json > flatpak-sources.json - name: Upload combined Flatpak source artifact diff --git a/.github/workflows/reusable-check.yml b/.github/workflows/reusable-check.yml index b5340bf9c..5cf980516 100644 --- a/.github/workflows/reusable-check.yml +++ b/.github/workflows/reusable-check.yml @@ -536,15 +536,15 @@ jobs: - name: Generate Flatpak Sources run: > - ./gradlew :build-logic:convention:flatpakGradleGenerator :desktopApp:flatpakGradleGenerator + ./gradlew :combineFlatpakSources --no-configuration-cache --refresh-dependencies - - run: ls -lah flatpak-sources-*.json + - run: ls -lah flatpak-sources.json - name: Upload Flatpak Sources if: ${{ inputs.upload_artifacts }} uses: actions/upload-artifact@v7 with: name: flatpak-sources-${{ runner.arch }} - path: flatpak-sources-*.json + path: flatpak-sources.json retention-days: 7 diff --git a/.gitignore b/.gitignore index 3ec08e5a0..3c0d2082f 100644 --- a/.gitignore +++ b/.gitignore @@ -80,5 +80,7 @@ feature/docs/src/commonMain/composeResources/files/*/docs/ # Jekyll local config (comments out remote_theme for local builds) docs/_config_local.yml -# Flatpak source manifests (generated by flatpakGradleGenerator) +# Flatpak source manifests and repositories flatpak-sources-*.json +flatpak-sources.json +offline-repository/ diff --git a/build-logic/convention/build.gradle.kts b/build-logic/convention/build.gradle.kts index eb35fbac1..c26ed9bd9 100644 --- a/build-logic/convention/build.gradle.kts +++ b/build-logic/convention/build.gradle.kts @@ -15,6 +15,7 @@ * along with this program. If not, see . */ +import org.gradle.api.artifacts.VersionCatalogsExtension import org.jetbrains.kotlin.gradle.dsl.JvmTarget plugins { @@ -35,10 +36,26 @@ java { kotlin { compilerOptions { jvmTarget = JvmTarget.JVM_21 } } +val flatpakOfflineDeps by configurations.creating { + isCanBeResolved = true + isCanBeConsumed = false +} + dependencies { // This allows the use of the 'libs' type-safe accessor in the Kotlin source of the plugins implementation(files(libs.javaClass.superclass.protectionDomain.codeSource.location)) + // Self-updating embedded Gradle Kotlin version + val gradleKotlinVersion = KotlinVersion.CURRENT.toString() + + /** Registers a dependency to be captured for the Flatpak offline repository. */ + fun flatpakDep(dependency: Any) { + flatpakOfflineDeps(dependency) + } + + // ── Convention plugin compile dependencies ────────────────────────────── + // These are standard compile-time dependencies. Since flatpakGradleGenerator includes + // "compileClasspath", they are automatically captured along with all their transitives offline. compileOnly(libs.android.gradleApiPlugin) compileOnly(libs.serialization.gradlePlugin) compileOnly(libs.android.tools.common) @@ -51,6 +68,7 @@ dependencies { compileOnly(libs.google.services.gradlePlugin) compileOnly(libs.koin.gradlePlugin) compileOnly(libs.kover.gradlePlugin) + // Mokkery needs `implementation` because convention plugins reference its types at compile time implementation(libs.mokkery.gradlePlugin) compileOnly(libs.kotlin.gradlePlugin) compileOnly(libs.ksp.gradlePlugin) @@ -59,7 +77,58 @@ dependencies { compileOnly(libs.test.retry.gradlePlugin) compileOnly(libs.aboutlibraries.gradlePlugin) + // ── Dynamic plugin marker artifacts from Version Catalog ──────────────── + // This loop dynamically resolves and registers all plugin marker artifacts declared in the catalog. + // Since Develocity, Custom User Data, and Foojay Resolver are defined in libs.versions.toml, + // they are automatically resolved and registered here! + val versionCatalog = project.extensions.getByType().named("libs") + versionCatalog.pluginAliases.forEach { alias -> + versionCatalog.findPlugin(alias).ifPresent { pluginProvider -> + val plugin = pluginProvider.get() + val version = plugin.version?.requiredVersion + if (!version.isNullOrEmpty()) { + flatpakOfflineDeps("${plugin.pluginId}:${plugin.pluginId}.gradle.plugin:$version") + } + } + } + + // Other non-plugin dependencies needed explicitly for offline builds + flatpakDep(libs.screenshot.validation.api) + + // ── Kotlin build tooling (resolved at task execution time by kotlin-dsl) ─ + flatpakDep("${libs.kotlin.build.tools.compat.get().module}:$gradleKotlinVersion") + flatpakDep("${libs.kotlin.build.tools.impl.get().module}:$gradleKotlinVersion") + flatpakDep("${libs.kotlin.scripting.compiler.embeddable.get().module}:$gradleKotlinVersion") + flatpakDep("${libs.kotlin.sam.with.receiver.compiler.plugin.embeddable.get().module}:$gradleKotlinVersion") + flatpakDep("${libs.kotlin.assignment.compiler.plugin.embeddable.get().module}:$gradleKotlinVersion") + flatpakDep(libs.kotlin.build.tools.compat) + flatpakDep(libs.kotlin.build.tools.impl) + flatpakDep(libs.kotlin.scripting.compiler.embeddable) + + // ── Compiler plugins resolved at task execution time ──────────────────── + flatpakDep(libs.koin.compiler.plugin) + flatpakDep(libs.kotlin.compose.compiler.plugin.embeddable) + flatpakDep(libs.kotlin.serialization.compiler.plugin.embeddable) + + // ── Transitive deps not on standard classpaths ────────────────────────── + flatpakDep(libs.compose.material.ripple) + flatpakDep(libs.savedstate.compose) + flatpakDep(libs.androidx.paging.common) + + // ── Compose Desktop packaging (proguardReleaseJars task) ──────────────── + flatpakDep(libs.proguard.gradle) + flatpakDep(libs.kotlin.stdlib) + flatpakDep(libs.kotlin.stdlib.common) + detektPlugins(libs.detekt.formatting) + + // ── Older transitive versions needed for plugin resolution metadata ───── + flatpakDep(libs.old.kotlin.gradle.plugin) + flatpakDep(libs.old.kotlin.stdlib.jdk8) + flatpakDep(libs.old.guava) + flatpakDep(libs.old.guava.parent) + flatpakDep(libs.old.kotlinx.serialization.core) + flatpakDep(libs.old.kotlinx.serialization.core.jvm) } tasks { @@ -100,7 +169,7 @@ detekt { tasks.flatpakGradleGenerator { outputFile = file("../../flatpak-sources-convention.json") downloadDirectory.set("./offline-repository") - includeConfigurations.set(listOf("runtimeClasspath")) + includeConfigurations.set(setOf("compileClasspath", "flatpakOfflineDeps")) } gradlePlugin { diff --git a/build.gradle.kts b/build.gradle.kts index 2754b365c..b199d9a4a 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -15,6 +15,9 @@ * along with this program. If not, see . */ +import groovy.json.JsonOutput +import groovy.json.JsonSlurper + plugins { alias(libs.plugins.android.application) apply false alias(libs.plugins.android.kotlin.multiplatform.library) apply false @@ -46,4 +49,68 @@ dependencies { dokkaPlugin(libs.dokka.android.documentation.plugin) } +val combineFlatpakSources by tasks.registering { + group = "flatpak" + description = "Combines, deduplicates, and adds high-availability CDN mirrors to all Flatpak source manifests." + + dependsOn(gradle.includedBuild("build-logic").task(":convention:flatpakGradleGenerator")) + dependsOn(":core:database:flatpakGradleGenerator") + dependsOn(":desktopApp:flatpakGradleGenerator") + + val arch = providers.gradleProperty("flatpak.arch") + .getOrElse(System.getProperty("os.arch").let { if (it == "amd64") "x86_64" else it }) + + val conventionSources = file("flatpak-sources-convention.json") + val databaseSources = file("flatpak-sources-core-database.json") + val desktopSources = file("flatpak-sources-desktop-$arch.json") + val outputSources = file("flatpak-sources.json") + + inputs.files(conventionSources, databaseSources, desktopSources) + outputs.file(outputSources) + + doLast { + val slurper = JsonSlurper() + val allEntries = mutableListOf>() + + listOf(conventionSources, databaseSources, desktopSources).forEach { file -> + if (file.exists()) { + @Suppress("UNCHECKED_CAST") + val parsed = slurper.parse(file) as List> + allEntries.addAll(parsed) + } + } + + // Deduplicate entries by dest-filename + target path + architecture spec + val deduplicated = allEntries.groupBy { entry -> + val dest = entry["dest"] as? String ?: "" + val filename = entry["dest-filename"] as? String ?: "" + val arches = entry["only-arches"]?.toString() ?: "" + "$dest/$filename/$arches" + }.map { (_, group) -> + val entry = group.first().toMutableMap() + val url = entry["url"] as? String ?: "" + + // Dynamically inject mirror URLs for redundancy in Flatpak builds + if (url.startsWith("https://repo.maven.apache.org/maven2/")) { + val mirrorUrl = url.replace( + "https://repo.maven.apache.org/maven2/", + "https://maven-central.storage-download.googleapis.com/maven2/" + ) + entry["mirror-urls"] = listOf(mirrorUrl) + } else if (url.startsWith("https://plugins.gradle.org/m2/")) { + val mirrorUrl = url.replace( + "https://plugins.gradle.org/m2/", + "https://maven.aliyun.com/repository/gradle-plugin/" + ) + entry["mirror-urls"] = listOf(mirrorUrl) + } + entry + } + + outputSources.writeText(JsonOutput.prettyPrint(JsonOutput.toJson(deduplicated))) + logger.lifecycle("Successfully combined and deduplicated ${deduplicated.size} Flatpak offline resources.") + } +} + + diff --git a/core/database/build.gradle.kts b/core/database/build.gradle.kts index 69ed36b5d..28a4bba43 100644 --- a/core/database/build.gradle.kts +++ b/core/database/build.gradle.kts @@ -21,6 +21,7 @@ plugins { alias(libs.plugins.meshtastic.kotlinx.serialization) alias(libs.plugins.kotlin.parcelize) id("meshtastic.koin") + alias(libs.plugins.flatpak.gradle.generator) } kotlin { @@ -77,3 +78,12 @@ dependencies { "kspAndroidHostTest"(libs.androidx.room.compiler) "kspAndroidDeviceTest"(libs.androidx.room.compiler) } + +// Only kspKotlinJvmProcessorClasspath is needed here — it captures Room compiler +// and KSP processor deps that are module-scoped and invisible to desktopApp. +// All other JVM deps are captured transitively by desktopApp's runtimeClasspath. +tasks.flatpakGradleGenerator { + outputFile = file("../../flatpak-sources-core-database.json") + downloadDirectory.set("./offline-repository") + includeConfigurations.set(setOf("kspKotlinJvmProcessorClasspath")) +} diff --git a/desktopApp/build.gradle.kts b/desktopApp/build.gradle.kts index e3b5138ee..816265c3e 100644 --- a/desktopApp/build.gradle.kts +++ b/desktopApp/build.gradle.kts @@ -334,5 +334,5 @@ tasks.flatpakGradleGenerator { outputFile = file("../flatpak-sources-desktop-$arch.json") downloadDirectory.set("./offline-repository") onlyArches = arch - includeConfigurations.set(listOf("runtimeClasspath")) + includeConfigurations.set(setOf("runtimeClasspath", "compileClasspath", "kotlinCompilerPluginClasspath")) } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 209732ee4..2c5aa4a52 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -90,6 +90,17 @@ jmdns = "3.6.3" qrcode-kotlin = "4.5.0" takpacket-sdk = "0.2.4-SNAPSHOT" +# Flatpak Offline Build Overrides & Tooling +develocity = "4.4.1" +custom-user-data = "2.6.0" +foojay-resolver = "1.0.0" +proguard-gradle = "7.7.0" +savedstate-compose = "1.3.6" +old-kotlin-transitive = "2.2.21" +old-kotlin-stdlib-jdk8 = "1.9.20" +old-kotlinx-serialization = "1.9.0" +old-guava = "32.1.3-jre" + [libraries] xmlutil-core = { module = "io.github.pdvrieze.xmlutil:core", version.ref = "xmlutil" } xmlutil-serialization = { module = "io.github.pdvrieze.xmlutil:serialization", version.ref = "xmlutil" } @@ -281,6 +292,29 @@ jna = { module = "net.java.dev.jna:jna", version = "5.18.1" } takpacket-sdk-kmp = { module = "org.meshtastic:takpacket-sdk", version.ref = "takpacket-sdk" } takpacket-sdk-jvm = { module = "org.meshtastic:takpacket-sdk-jvm", version.ref = "takpacket-sdk" } +# Flatpak Offline Build Overrides & Tooling +proguard-gradle = { module = "com.guardsquare:proguard-gradle", version.ref = "proguard-gradle" } +savedstate-compose = { module = "org.jetbrains.androidx.savedstate:savedstate-compose", version.ref = "savedstate-compose" } +old-guava = { module = "com.google.guava:guava", version.ref = "old-guava" } +old-guava-parent = { module = "com.google.guava:guava-parent", version.ref = "old-guava" } +old-kotlin-gradle-plugin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "old-kotlin-transitive" } +old-kotlin-stdlib-jdk8 = { module = "org.jetbrains.kotlin:kotlin-stdlib-jdk8", version.ref = "old-kotlin-stdlib-jdk8" } +old-kotlinx-serialization-core = { module = "org.jetbrains.kotlinx:kotlinx-serialization-core", version.ref = "old-kotlinx-serialization" } +old-kotlinx-serialization-core-jvm = { module = "org.jetbrains.kotlinx:kotlinx-serialization-core-jvm", version.ref = "old-kotlinx-serialization" } + +kotlin-build-tools-compat = { module = "org.jetbrains.kotlin:kotlin-build-tools-compat", version.ref = "kotlin" } +kotlin-build-tools-impl = { module = "org.jetbrains.kotlin:kotlin-build-tools-impl", version.ref = "kotlin" } +kotlin-scripting-compiler-embeddable = { module = "org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable", version.ref = "kotlin" } +kotlin-sam-with-receiver-compiler-plugin-embeddable = { module = "org.jetbrains.kotlin:kotlin-sam-with-receiver-compiler-plugin-embeddable", version.ref = "kotlin" } +kotlin-assignment-compiler-plugin-embeddable = { module = "org.jetbrains.kotlin:kotlin-assignment-compiler-plugin-embeddable", version.ref = "kotlin" } +kotlin-compose-compiler-plugin-embeddable = { module = "org.jetbrains.kotlin:kotlin-compose-compiler-plugin-embeddable", version.ref = "kotlin" } +kotlin-serialization-compiler-plugin-embeddable = { module = "org.jetbrains.kotlin:kotlin-serialization-compiler-plugin-embeddable", version.ref = "kotlin" } +kotlin-stdlib = { module = "org.jetbrains.kotlin:kotlin-stdlib", version.ref = "kotlin" } +kotlin-stdlib-common = { module = "org.jetbrains.kotlin:kotlin-stdlib-common", version.ref = "kotlin" } + +koin-compiler-plugin = { module = "io.insert-koin:koin-compiler-plugin", version.ref = "koin-plugin" } +compose-material-ripple = { module = "org.jetbrains.compose.material:material-ripple", version.ref = "compose-multiplatform" } + [plugins] # Android android-application = { id = "com.android.application", version.ref = "agp" } @@ -317,6 +351,9 @@ room = { id = "androidx.room3", version.ref = "room" } spotless = { id = "com.diffplug.spotless", version.ref = "spotless" } test-retry = { id = "org.gradle.test-retry", version.ref = "testRetry" } flatpak-gradle-generator = { id = "io.github.jwharm.flatpak-gradle-generator", version = "1.8.0" } +develocity = { id = "com.gradle.develocity", version.ref = "develocity" } +custom-user-data = { id = "com.gradle.common-custom-user-data-gradle-plugin", version.ref = "custom-user-data" } +foojay-resolver = { id = "org.gradle.toolchains.foojay-resolver", version.ref = "foojay-resolver" } # Meshtastic meshtastic-android-application = { id = "meshtastic.android.application" } From cd0b9d6668e25f3c048a349414943a21c158d17e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 20 May 2026 07:12:58 -0500 Subject: [PATCH 78/78] docs: update CHANGELOG.md (#5527) --- CHANGELOG.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fac65b53d..22e9de1f7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,11 +9,9 @@ See [GitHub Releases](https://github.com/meshtastic/Meshtastic-Android/releases) ### Unreleased (not yet in any build) -* ci: unify GitHub Pages deployment (Dokka + docs site) (#5523) by James Rich (@jamesarich) in [`a6523acbb`](https://github.com/meshtastic/Meshtastic-Android/commit/a6523acbb88766c6a1401f13d4b23ab679bf3af7) -* chore(deps): update koin.plugin to v1.0.0 (#5524) by renovate[bot] (@renovate[bot]) in [`8de0a1f16`](https://github.com/meshtastic/Meshtastic-Android/commit/8de0a1f167e498ccef999d3917023e1f34640a8c) -* chore(flatpak): optimize CI source generation and clean up redundant tasks (#5525) by James Rich (@jamesarich) in [`7ae1b2681`](https://github.com/meshtastic/Meshtastic-Android/commit/7ae1b2681313da5a07217ea6e04a0c3dc4b79946) +* build(flatpak): overhaul and automate flatpak offline manifest generation (#5529) by James Rich (@jamesarich) in [`99b5688b0`](https://github.com/meshtastic/Meshtastic-Android/commit/99b5688b00e5810467769ae57e6ee33ea3d3360c) -### Internal (v2.7.14-internal.94) +### Internal (v2.7.14-internal.95) Changes since [`v2.7.14-open.9`](https://github.com/meshtastic/Meshtastic-Android/releases/tag/v2.7.14-open.9): * chore(deps): update vico to v3.2.0-next.5 (#5470) by renovate[bot] (@renovate[bot]) in [`4bacff81c`](https://github.com/meshtastic/Meshtastic-Android/commit/4bacff81c5abad536b40f7370ae5d302b74a11fe) @@ -69,6 +67,11 @@ Changes since [`v2.7.14-open.9`](https://github.com/meshtastic/Meshtastic-Androi * fix(ci): exclude kotlinNativeBundleConfiguration from flatpak source generation (#5517) by James Rich (@jamesarich) in [`e13a4359e`](https://github.com/meshtastic/Meshtastic-Android/commit/e13a4359e188bbf02087cdb6253ea2b70c8200ed) * docs: update CHANGELOG.md (#5518) by github-actions[bot] (@github-actions[bot]) in [`54fafd225`](https://github.com/meshtastic/Meshtastic-Android/commit/54fafd225bddfee446cfea01dee6887e082acc79) * fix(ci): downgrade Ruby to 4.0.4 for ubuntu-24.04 compatibility (#5519) by James Rich (@jamesarich) in [`199827755`](https://github.com/meshtastic/Meshtastic-Android/commit/1998277555d2d3ac9f01f8af9f6c4a0652c169ad) +* ci: unify GitHub Pages deployment (Dokka + docs site) (#5523) by James Rich (@jamesarich) in [`a6523acbb`](https://github.com/meshtastic/Meshtastic-Android/commit/a6523acbb88766c6a1401f13d4b23ab679bf3af7) +* chore(deps): update koin.plugin to v1.0.0 (#5524) by renovate[bot] (@renovate[bot]) in [`8de0a1f16`](https://github.com/meshtastic/Meshtastic-Android/commit/8de0a1f167e498ccef999d3917023e1f34640a8c) +* chore(flatpak): optimize CI source generation and clean up redundant tasks (#5525) by James Rich (@jamesarich) in [`7ae1b2681`](https://github.com/meshtastic/Meshtastic-Android/commit/7ae1b2681313da5a07217ea6e04a0c3dc4b79946) +* fix(docs): compile Jekyll docs site and add root redirect in CI (#5526) by James Rich (@jamesarich) in [`f94358551`](https://github.com/meshtastic/Meshtastic-Android/commit/f94358551c7e41a2ea07ca97185fa8331b19f09c) +* docs: update CHANGELOG.md (#5520) by github-actions[bot] (@github-actions[bot]) in [`95df50014`](https://github.com/meshtastic/Meshtastic-Android/commit/95df500142abd44f7b4d2d75ba28ab72f1fe77ac) ### Open Beta (v2.7.14-open.9) Changes since [`v2.7.13`](https://github.com/meshtastic/Meshtastic-Android/releases/tag/v2.7.13):

d~zwCXG>o%hINi%L%_OtAt_nN&P4#C*VrmKMew;igQ#Ryeeo*r)1 zpj)Vc@J;9h>KBv#5N_O)9ef9Pc{=%JMC6g?9(nm?9;DoV3C?(Y>B_R$7kNy!&of(D z&jbR_veV|fmt167_}RzIQaV`03WkeTB+}>_iX|5|qEpN8#Z}O%T9Q;WSgd?b{67dx zMzh~$CHMQk?VGj16<}>lSd)+3oe`d<%!@qLxi3v{Vb%O^Nw(F2=y%tRov};7QUE93 z@8&43xU*^h>-8uCWAAHOSyP?2ybN9r>)Ga4Qu`z2R=J9DHSQ2(rIZY$n~(JPmKQxA z#g`4o^Ve_=f?myaeoVG8-p?l$1EVx_L-Gop@a25lw_eO?tg*ad%Wt%$pDzBKy3k%% zIgmzoZh4uO0(^XlPT9|8VhjyT2I6@@*lPga{hE-i!6i97m0gDLpZaCD)^rU^+#Km+ z8U+G+nldv0$}GL2aC||)4EY41AK$~qAXQ(w8TE5AVOlXZ){RyCYe5GFD)w)fI(@M* zedYXCwR>XKk0X3OcfG-;JfCT{j2HQm>vajgFDiFiXR!Oso3mr@1JDs}QAhOy9`CT* za6cfBCEO!tJWmi)hK;ZjT8=T^R9fEJkIglDDW9a`;*w|b2~ox@Ts7}ekyOoNqTt7x zunODlIQeuh;rX|c#2flR-1{8{Wo$KMghDcb z)=sTZu~K2QWIN4`p96zFAPzDDTUM?JEr_M*6k9#R?AKq^;FeMPlefFv^lJYCN4awD zgxNP)&0F~wBzx~wL`eXCoqTHSR8)ckTwm6pI0?xE*ksq?sSvHs>lup{?T9YfjaNBu zt6JZe&kv8y@V4z({Nu&I$2`fiGU)fXl&$KYK*YXpA1wgy>j#Q#K=Dg<2K34$YgZ*T zh?*mp_3hJ6QTq&4bv-V$a@Wn<7TgeK0#uVoY!W;Ry}R1d$?YCyHp}ymAV8IHvpzTP z%%80|6%EH8c645^^C8AMz0#~zDH=#ddbiV0*t~q$Z*AFXxC`ar;T6MOS1-T$U-k+H z_{?=YhuK}M>iu12$arM|KX-GGvO2@vM*g}L;1h{TSwXOUEeM|980sV5)XpXxrL_Jh zJZtQ$?+#y zLo;CbZ0PyWU4%G4FXuDbV#_L*7jnkCa*R5dm9`im?nJ_lMbqrG9Kif zi>htNyIvDC;MA9)M-nQAoE9+`sd5aiYyWiUnhD51=>N$uZ_XePmlCFBo#-s?Q>AwuEfG;dUDZ?!r?jb zd=fHIIi7WtY7>TeXn}_55NA+d5f7Af3Z3{(rs#!OYeD7xfB*}FM}6zsXZl}%98erk z_~&+O2OIk4+}AChYm&axl1Lp?6UFRn$c+KY)uLoVVVZ9BI{wBHNr+A&~g zuU9q~W_NoKzVjP!n4`KJ{eO-6yDxQOz-z0j!+}rfLBG!-7UYQT0dD5k1|#Tsfl1$y z`$<*btnoz^@mvb$j~w&(LCRz}^Hi8jJNDI85D2uuadh6^UR^uzc%x*ALW2sFr$*~5 zh&(=s?0)`gip@`T=HE6DZ4-kZ!nbFRas0YCX&&&m&2-eIIp?)-fjh~ZxaT&uV72p< z!w}e~pMyrg&(}QrC&n}s14aT?FVfm%J4ey*nGm1e;hE{EP!@qW97*+e;CosdNtKpU zr@ec{)Xgps=N%X9E>&Os_NaN**hIT66m~sYfqdtNcMo$DgLkiYQs+^l(BP;~cSPZc z$~X({9O5N{O#!O|7 zjpuXmcUn>?0!SJuj#~AXeEx9g%i5<{ax1ILeQ!%E6YrRo6eJ6j)862xA(^$tK~nlw z2_umtEU0?lzxxb*a_itvZb`I-5QYQC0Mvx6Xy@cL_OzxtF}({Y8-K>r>n_g0=1;`; z*_T6yeUDGlh7ufTT|tnk=ei>*(a?DC%XG1eD1fnLDs zDaf?ZNdCE+lH1^o@bA%E3un|*XeZJ%0q6}^)uc!H*L06X?A%HX`QE`1vr}fC3IbZx zS~{%)eg)e-ZyMHAOO873AkaB)??Oz+q;Sf~g_Gd|y!H>2=TDYApqrwji~bA@j^)lc z=RzFV6_*s?7Fe1e0eJq|2}g7n;J>Dv2Ru)(v~{FW<6GM>oqj3@Q9)J-(=^nY}FWv{ynOx@^>UisCdw0<;22SU@&&!ziWI7BpSU|!IPbwD3rW8 zv2U=FM17%Hd*LrTqT1Oc;Q(;q5z6ELSps8?9wl9HwJhd8Wwodm-r2bkki_dum8I@O z|M_=Smnp9D|B}??pCaQL1Y25)><*~)HV5^_;imqfJMD&2o#U*pgnN^hO*;c!w5{#H zH*5dz#WUben8a}x>nGckrdb>wzoQ;D87ZC&VwOBoELqiK3h$YtR2$1&dd_4XTH=S= ztY(-Lx;(r*PSv>h>WOa@zAcgCwtk9u6gG*&CA^ic9kfPJBxm~bK+F&m5Xj|;WfcrQ z(-EBCbk;tV+zW~#czCQ#tGY}b_Y~sb2@acVZf<`LY84Jt!x{*X2TJe|!43s}~;~hvVI6*Zyg?3kvX?CKDV$~6APMXWspj>A2 z^h_bY0x^@*dYBZVZ_eD=_$kZ)+)SBa(s)yBg$jgrc{v#>&W-@=@$SYbKXl&T0Rv!_ z)RA4+YS9IAB(+0|<4d~e^AHoMy@BZ*$ia0cH|SBvm^J;jEyNz1H%GS8kr|OD>1tVLhsiE57$#?NQe9I8II6B zRdQq$?9h<`47V;!#UKby;msrQZL%nU!>>zCD**GysX+s86N{+KGkImSbB8< z*)~vXxg#_E>CpYwL*8RIRd-xsws#gu%&Az)7MC}0o%Yy#*K$BGpen2OorMFi|PY#;R6WS9|?tiEj@mk#(Pxelzu~~-AH3Y6KJD3$cwBK6Z?cHl{ z*mGMOKHTd*{Gz(g;S7n8k}`LM$PUb^V1#ED?y zIjSOH`DH_nEY9`Dp1Nj9r`BkKhQZ`yjM@#1U+9_2ncos3Kq0wFD|Us?`DFBB>O2f7 z5FF~>nXCG+^x#*g)N!)P-s`g+YKI#Q$C};++XfAsS~`9>TD=U^@aB#KBs-GL{){l2 zw;pL;fSQn>yUi|lD)Ag39ZGwk`kkUbsmYQ`tOtZl90;Bage4!Ma%#H$HN!I3g&UtK zyL_f&R|IamB*n+oyVq~ej0)wgwW=Kq?=3bQSe@E5SQ{^JgUQbNihaFOZIt^k{2kH~ zVfWs6pE_V}3*O^D057fg5dFGz>`!{;r8-el_B-dwj62_1bSLFHOI^!sxi3RN1AR}Y z<%l>`(gA~J;<~=7hm#8Cr?Oly@`7AI`TS5m8G5R)Diufi-E#80LWahxT@1HG!+cz| z)7ty1&o6M$F32S)Pg~pw`f*1ZB4aUY8yVd_ej6i*Pq!iF5ZO{uI%@3Hxb#|eLPg}g5p1ca_>BD@FB#|PlhS9l*`H8VT9B+c-Z-gGI-b{fqSXS#qL#wv7(~03My_fk%(?2?^8x7QxDwI*c4Otoc zmItgM+&&!a0q&Kx>p4n1aaY+qO#)I1wv(ct9(f#(ut~vszaIy$etg$xXAAV~UTaVq zCAxJXa^6%yHXN>c<5mnAQ>!e&jgrddB!=dE!@nJaVdAgE^2TUu?H+ML?iX3EdMRbn@ zUvK&9-;_@Jz$uZbSI;{%q)hdD9kkWxscCVM4raH7T~`%-9^*u4a3) zVuIsFyZ|gfX>7)rEm5O|U?aNFP9)D%+o&3r59y;o*{=@LT3dj-YKMdE(veK8J~U2L z@80y0wt8Km(y-CHNG2 z%VOCU7$+-`mGTG1WgvHB?fv#I;X$qY{DFzvUCu0bY8PY6A5SkbE-rd3RCHq>u36-} zUH?3QRSlZ@1o-3iTt#z7bNFjQko$_FaWk@))aXi_EjR@msqD1M{cLUqCzC~UEL$rr zcfaOLSQi7bzf$#SGo+i07pt*wEwxK}{@(SGV`$vnFyTUy53La7|2q%((}5Hpv<2F| znH0{l+tFq|_ytK2xZWxdYE-H$)_D5Zb*Y`=TGy#y#?-@t{mvQuVu{QwVF+*SL+vC6 zFw^sKAKO0oP7QIX|1(i&Hxoy#t{3b`d3@;Sw;N6L>ol?lhPZ}Z`@;|m(gzb015Laf zR1HxvYu`mfLQdqToQ|#POq9f;ZK$+}T}hB*=5U#JYP{2agr6{}ces3n#sZ!2{Rkbn zlTC;})}q`&Z%y6=?tu58{Vzj1%53}9O}}}_ny^~L?4qrkYZJS}vhZ$Kf9NBd;O|NsFRm!eRzXe6m^W zY94CsCK9&z!6>%s@oZ6I!!ziLch6`*pb8^zB;vG})oR{#E7(#*QFMM5!5Q^&(MAa< zXwyxf!}w0%S1nRTRUeq&Fl0T$Xo|1gVXJB-oQPFw(C#uGY?y!jH*jZG(D7;=bCD^@ zRb1|{O;9584z5{@CJT4Y&ssl5`jekUbR!e`7606CU!v%j(er8XZ42K(jGWwnA8xI( zJ&X1ujl!gA){IsI9VCH{7u91KxXH`R5denV@iXQ^cRnGR3~;T68jQp~aT2wZTyi*ic}M!W~~JdHubyD0SCm?_@Air*^+q zENBI7crJ|vXL#3uL1e+3s^^&x(lVo>nJ!g@dRI3bLVvkU0Dl*QHM`VIuVOg6lgAiF#;k_e=h*i!LIGH=^1D%dny5#+}SmVUg%Dt0CFwD`BR6p?l#Y8qm4eJ z5^Z+JJnaWje;OWxw|TeE^{~|(-n2AL>+xANMp~)s|MRy;{A9O2e!(dXmF;WUd2TEx zzxiO`dgJ=~0ZV$|vf10+U?z4RPQdMktCZ#*NP&m)c3MXL^9SzM+=o+^9ckS^!s0|o z!xK(`tMwY=e zC`HSOq^PlF-}ikPOSX`GH-@oftYe>vG2Dli^ZWh%zQ617xc|Ga`+8jeojuOvSl-8b zdA*;<@nLwMOsXg+XWQ;V*`q3{hZobGLZVae?+wVOzO#+L0Bx!`+ZFH_xDNt_z)g0H zGcB1Z>{}k&y4lKllD8~Nr{oZ4$)DJ&C0pkPZCNpanZfWOv(?eL;v~viRqmxB?N`tY zUIr040Z-9$xO6%nMwtB>Hv~oBmBVa-$1zV1+5AKdAc_y3uosMJF*k|m+OvyGfrC1K z_OnE0Em%D{#b>D~_r89<{rSG*(P*bOc`2+cz$Zt%xtJtueI6xgXLYP^Jr`+p{n)o7ayt}W83wsK@V;=+~*Ll z^sNth+dO%+W%lSH&LO{{n<;TKGIeV^&7@<4V)sryu5h(&Q?PIMS&U`kSQi?K{gUc2 zx}tmcg}@@^j%mQ-iAbkR!1If&4;4T2lGQ@brM{XX@*4KR5k3dq?$Urb)t}w&l!x)h z-ROA0g~_tMGg+#GkM`M}0<4lDFOn-6ho?>F6g`HRGN!DhqTnqN_lt-*&z8>|hgo~( zy~*Vvi{y{b5)qqjV&?1)UB+V*${N1$X(Z>*yv54B&^@IM#noG*Cm)n2sSHzPszBs z=g7^Gs@LZV_qn>T;(}i>yip{dmQYNydHx-ge{oTSq2u|Zl|b4d_r5!ECLdGp+vJ}m z58Vft*ldqQ4RK)Q5OWGG#{kDYIUYG(J}55nK1gQ}3dy#+Ub4#(hioeMB!-it6?2R6 zmkB?uKvS=br$Z9^d?u?Dc*y!t`|ryay)a1k4fW#$C`UjQcUBks2QTrgw`X{@*j>!_fKH_ z5a~5-P}Jk`A~okBQvtY-*^VgDuW>nzLtTU@?m{gDos?_e^?b4<)$l>rrlWJn!mz{L zQS-oCv`RXI^B0<`PW1wVK*hb$o##2 z_GxE)bko%j#bnO3DYGm)Wf_M&F4K}Opf?UzE?c?!Tm?*tV7xC4VZV0ueaYW{>^SxV8a()krmB zEXzmRg;4S8*9^xfom0M=nn_cb?NJs!7Thw`%Vq>@D9U8n5^$I4AO1$0eK?L@I}x?0 zmB~@vEq%<3Td#Hl)!C!X%!2#6U;%fCmlzBlzf-k1a;CV4s@#qCxE7*wYL_->Y_YH( zN$4&9MD)3nc>lt1-OlE03B{VQ$HD z!WZLzGRjJ7=x%-0m_%^XTu2JVyjLRpa_YZrH{r9rtLyk=iU$7yyms91-xlO)Mf&oeBl)ss1L zU*hw_yGG~kv0*)L{4(UXh!dJvJTE%L=!KM-`p`zU-C0@^3NT`E!RfbQW*;~WG>W=T z|6|m#m%Ci9vwon|1{2mF0nnv?L5gebrvx`orT$)pQEu>{hD3L%sB>>IyAPjIT35`o z^I?E}1vgEH#_k0^t!UTOn{0yi##z@@UL<}tb)c;fy71G7zc&5RDeGUAZ)4;u{NcL{ zLyE{}!SJ7i@`rAT2x3h-U-pCMw0M8a>PYYR#p*5RlHuCaGq|^p4C*TTiqw|F$`7Wh zQdl_@(Q9f2&%9&K%KoiiOZbYsxty_+j(oZ4@$6n#C^T zx0{N@6O+s>C6jv;=0(L0ths;c_xw)cV4O!`F;hrx{ebCJer?dRvIC*J+~9*kx6Izl zB|`Dj55&BIK-q7aG`o(HZr^;B`p$lyI$KlJxgXmhcf7YLR<@!ey4RCh%XkQ~vv}5s!bLOF}T0U8rKJcffQoXhmg6)Jx61^d{09ml9)#4^e@)!-!zH;`wHbI{G5{9;eLr<+ zMhI1Tw~NqPXr!>=E5?CG`=fG0PsaQvp~}2s)Qkmm*ZSFxg)wlM=I0Uw;jwQKA>eJ7 zgD@^ zcUym)T5Rq3;Ba4KM%5P}Lio-ndJuXs-#%_tlPatMrA>%VyR7D_^Alyhtx%hv-|OOP z@Zz2nI_oSsZBf-=Ajn}L8KX7bD_hyTglsnmXh0K|ZI{?BuTQ&`FFqf8?Fc|-P#`=3 zC8bJ@EPSY>yhC%EUDnyGo@B^+Tq-14!OqS9@CESh8j&hL@u>i~4RuqjMnC_5xhPD_ z9y{iLi*JP3e$^-xbL%qrcVl>{9`hjdG7Aon1@4VZ=K}e2!QvFcdT!&NR*XcacBfL8 zO3HQ!N^VmrK7Z)bDd zEVfF%_sY>|)J=7+F5vvLEy%Xl_n5qpjhY4-5}2>+zFF^4Di}{@ru>1vNU2`;*4T{l`TMlDp_ zg((9`=Bai2vgW&uyTDrB1Ioe&SWCj-Id;1SihMFv%cRn70m(<99o(}DN03Fr=jyW# za3eYdF?R7t0#Nz_Y@#K&Z%bx`L{v%&NJ*;PLf-8|4Zv`1FIUDsP@yGvsl++RuwV z_ZlRf`pIu;k9hR47`&nML4fS?bXDSJDiS;AYMun$OOU6LZd@kuEC6{fYB2JAUHAYx zcXosLATY7bxnG)xJ?jB@SB1vmUibhWI*LOi%iC%A9qt>$J5nCy@uObcsC6~Tb=n02 z@UxLSXKp?2Ya4XoL2L&dB)*_J(rA)d{F(T~W_RTr>VVeWn8!{?dxrS<&OUo~*2Rr< zq17i7^j?@`Bkm(f=r43B zOQVzz^SwD?QI;1ZmSauXP6OT7uDugimEJuoDn>HARXEyJOp{*zVkLWnDWj{_^y67{ z#Xy1HQ^4G%e-VE;bw{jLHxgewkrakl%y6isHR!K7;p_Z&nYKQl*ao%?8K4v1mj>P| z+#V#Sz4q?+Oj7>)*tn1`rXw?HMx<^Hwo*T?Xz$D@6)OzhRRQs3z~nE-*c?-mgc)-i zCMP>X-!${M@~C^{jMSB7B=^AMi}W;MWAZM>TnA;5hEV6b@4s^gB-B%^V)6OneEG#y zd-$cktHt}~P|J65Y1#gLdfsmAh8sE#Ewn{Al&7O-m zc*)|-cLN4r_tRS^LlT40L=1A{{+)la2G70Hab&RSS&27#ywch=pcE`Qc;n%{GNq?U z7Cho!sG%FlXOO{m7ocTH>TiHk93pDqfi zZQ>SrIi5NN_}b*Nc(1YNX=vQt_gF;DvC5MpBrBfv<7N8QpnM;K_ z66{6~-5vV^AKb2zDF29(jmq3jzm!FL_l;wX$sI%d-R;Z_&wh^iM>LzsLRd9OUYTP7 z9a}%npRj(ua7-zLso?Q|npoFc+ERlFSC;X6#`#g-uhu=>&s`LG67!S?G)v9{{n1L` zPTab4H%q-s5KphEqe9Wtx3O^GODGK4Gm1QtPo9lbf9H2q(EEPZ{M?u8H(14t4f3CW z$0sfPavgbou7`meW7!9gV7xCL3KaoI!O|#o_ha%qqP#|A z?fk`1&?5|>3g-WKA;mgi`uRH%`GubP6EJIyq$gqAau9Fn_Bp}SW)xk`=qByWKqrTV zt1O0Fk_P;lMvEcW(MxvdUJibiM{&Ns7P>D1I;h|C3ZR4cqJs3SQjcK8JhUOu>+cSk za{}zqB3BB1uEcJ>du|t8K>{msZcl#S>f~Q`S8Ova+fgPQQ zGpG|#MS>Nsjydnh)uv&7wqtwOo(|s2zwNq}g$%KEyCXb;PcHPOwLX|8xZ^8{Y~Fpa z6#g_&?Vd!PBgA?;nvv(1mA8be$67NgCH`RJ2#!$_4EDS^gKGCsxNfh8$!G2@r9JdKfQdeJD|-_I z-h-wRqVJ$h0e~r8K&1UNQgtrG?URiMLjWAnb*ZzYjRO=$8QuE;rlXBIcVddvwxDI( zB{*^BZ?s-c{Y}6_+8lJfj>4ov6^UurPl7n%aqz4&e;CLve)2rJd1LjeE-TI>4p4ia zsxp8Q9guWDeq+N)_wLR$#z!;j$hYtQXteyu?Elzs6+Q>vVG=oq`?1HXPUo=X>D&?v zt1RoR|1}PYK)^prLPs5egxh)W3=bpY?|;nR7f?OvMhXZ93D=sf>p#)QDldN<+fEbv z1Hm}zEFk=Twu8XyK~%q3Bq6{bf)JNP|BJ%;eEQci{J;C(`$`D-xG3a9uK(_LPaZL` z7&;S&8T?DWz<{F{`2xTFb*=RT^xOyIBcINkl=^!9FK1<4hY}sqISUoPvG1*3-;Fiy z1>Ih5>m-GB4G?n$GcxaHeyuE`rMh_%_W9URX~%$H2-2w|oau)Sg|h$klP%IcLQR($ z5RgQB^d~)Y=6c;zp}%nH)Q5f&TK`}Fs1?k(;ITn>Ur|*&l5=Zwb0Ut(S8=4zwP$L; z0=!GBZ1H<8>5g?*oqv3N@NM|g_{1V%seg#s~FanP?9eMuv9*$ zel5o5*VHX2i0Ly+0!1e&!E3j%0w=b=mTuJN5}7x~8KdZ4kz$Z0N~<1<K!#1f~!@U&@tWu)L_1@1?spE~R*)QnPEg^diT)^G0 zbVgch)6-a%+Fohj*`o&=r2Ofqv@XpNPKa(vfJ&ycY7;G|V2vV=!{?wd0 zx3nTF~W zNf*7hg1Bl&D8zj?YWB%X`83&uMmZQ;QBhry{(aUy{~cg8CoV>-w7)(<3CXZkV9e%{ zQwo!4?EhK_!PiuAXY{lQl{WYKiGEZ|NNK@~-Jf*9Fy1^As?NhRsFabpiQOH@qEBIv zZr1UZ(l6VubITJ5Me>N-iL5zJ&54iZyV=2}o0a%5Rhy$}TJd-n;nM39ugBxD!A`@g zM$fQ_Fv%}`RW7#x@MLG1Y!WA>Ef=3ON7gwey*IIuCnZqqS(_Ibq^hurV;*;Ue5rAJ zXJ&iPCD#ny=e=JFj{XVl-zIvI9{`dqU25zaNfz-l1C15F%V~Qq{Z}~GyZbD(A_G)H zvcWm=4Joyiz`wxi=t;7DJq^3_k&S`BMgak);AvI2*4sX95~P{CEXU|gzBpP3*NT-C zET>pKo_lcVxo#eBRlMyeh4bcwzggW?Wb+psG1lJ~(>$`jZ3Kpv5&Rl!JF*^P0UkVK zi}_>yhIIuGdNOZW+4Z%=`#=Ucm{V_-jufrDG~#zS%(!*FVv`bP(Xcp`Vp^Y|lE#6) zStIMCNMx+4oX1dD9tJ+WOdT8=ShZZag{emAmeFv6=jD#=Kq+TO)LO_h8OKAW_qXfw z0^6^~_eAE9`N%zsebvmo9NaP6#M?7#M(SFd7H{m+TVkvB*W+{&dhDtg=@2BYtxhq$ zlUIl#9xAunyh9ULCTKa8%=RzzI;kj#GIC0vS{kR=OmptcJ1qbG$pCA-$DsD48C;X6rkbs+6o_cA3BXk4Ob%l zlMNZFy*k^$oQkPi-laJ4W9GH}i?)R-FX7nMSG$|>gu#_zpKfyX-cH?g{X&T;Ujr=J zI4meT!nutn~M^op%+Ly1`~D2i?Vt7u>y)O0ss6qj0|4qF@5}Jt)m+9Hl}N z?b~rLX=rLt=zXClFN2<*^y$IOp?(9Mu+;_d+!;>wSKN472%g(c8gco{A^lm7TLps< z_F-vQaPJY$W7K1E{Zc!Gk{EnljfK`x2dDMI`T)XARm2UGg_MK}%`un$jqC8Xl4=T6cXp#oIg|0;(ZJL4RZl0ZX{Tqtxs7^JcxO8h$WjZumT_B1S= z^ac~C9`VMp@UE#{g@R)L8-WZ~^A*;ngY0&@*?2QEz9fVI2By?F~U-&3w|Y zE)YmF8E-7KEF{@(X)??P25UFx3NWXc9twpxm8veFIyk0!ZwnK=its-g1kXDiwwyGX z*|MICwK5_a7eTX(`ZDlGZIJttxbC(~r2?I4Rg5=F``*=*f-DiF1Ao?|u;ZIcxWt|B zRU7_6XLnr57;&-o*X6D-sEhX>Nvg9U=4~MqIv5ntPXwn`X zX;Y@*6h)U|5sB@Mj*q`4zY?zE#dUX|hd*xP3*}UpUbZZhSl#j+V=iTSe*Axtw>PzfD?m?Xp<*&mPf#p8yd6Na8-q+ZbAV9_#6*-g?=sdrn~pAR1&BL{SuTHvlsTs-4|F3@EjIiAy zwXNZ!`?*1WKS*-$eQaTZfWx8CU~Zq(Q?}0`$Mhtf$4;H_nRCdK>~GajE28Bz_%;*W z5*okdn9OmA5y6S=sxk-j^Ykk(v8(CWtEg;<_7HWrbvrG-;lp>z@&A&u$g;pLTNKLn zdLIwYh>=BR?5_kf#jlsXi4efu2k1<)8iTv3)ku(!6b&a}>om4TD|vAz;a|QvDeW#P zSlk_?-CO4IU&%xJEK04c*-EJ1a)0z3BdCQM{bjHJB|)3JTbHn^tRV3vs23!Q?Cy|q z6{F(9S6ESP;4B!t%4}z{n5)^dq7R48i=S01)j>TGcd5JTHP(L%`!vwf2jaFwzI9C6 zx69&9e~P()WKK526RBGf2NA^a-EfMN&XcX!KS%Vx|6X24)nJATIoArDx8pZ%k5y6- zt95}o-k3%WX4sSE6R%FaxCHWtex~z|Qz? zX#iIgTqDnwp<&|Ln9^N`O$F{JJWtE{h_b`D&S-$j!*`gZ+2F-mZ%AZmg~zs+^}Ysm zu&-EoM9X;1Mi=fw_%ymw8pK$~%UsU;ghKQMRE{*CiO?{YqQK+91_`)(7;Q{EIQ7}cM{aY;uN zq9dzA*tISp0pj%uGw$A+C+t$kOIWY&&0fot;Va(xTR{zsZV8~i+;WfS$vlA%8!Xor z%#ze<2b5%%2xxVVE+?m%)o@onvLEuBsYOVM6~6wfBq|-^u%Afppc7ZgHll|Akh8ey zeru34kpY6n;>FK}{vfRmo} z^4sRe1&-brlM2{cYS~1!bKTlVZUd#guem3NL(a>Our<~lyXQ7Nu}0)+I}NkHcdpDZ z!n)IMKk(McvUwI=mJ@`c@1TM$$K|lSG6C@)G*%h@CFPP(N=rJX8evvFDhts_^M+@1} zWeZ26yLwvW2yAjM+8)B7{j-T}rx<;!WE&|HeOvyjAnRmpO$Rw~<8%{D&7 zNOKY?Md5}Vcxe0gSq00C6)*cP%|=`AskcQOUud5{#g!FI?1Bmpe%7`_REW!uM?O7Y>jLK`&#j=}wgF@iV0nS8PUwxHP&za$}@zMm6t?2rKiWpix z*G+y|QbRkol1*M}3gW8NaWIOzmGM&bicdm(>H`o|3XjK)!AfHHRVFV zN}nRP`o<$pd5>NM7q6CYh7YetOw?s_4xh_f;H3~}_x4hxRv;t8a<^)pTZ7D${jH!N z$HuLb1q{2=Z=$k^K`+ZCk{!mMv5b2ezu)FG9`^?!_e-M!d2i`zii~UToqTX#l9uie z<6UZMb%qnFbyszpYpz1>Ki)?RJut3$WR=ts6ni|ev-ot2T;D7tQtsYd5o}Gp{s;X^ zDTU49#vRClQ69F}JC5d!VG1K;%09hg_k}P={Nh0&mC-j_d;)D|vUU@5>Dy^^TsHc( z$)ydM*ERcI|1}x&JoZy|DCYU!S%vs{bL;<4vdRA)@c+h|*8km{|5G=o8>$lTb9HXp zTBr8r8zTgSDxf~_caa6My8thQ!wg3~+JD!z)~W@8W(P`5c>Tu$gX-GDRF!`mAgwGY z+`Ieg$9&qKCAIhlf}3X~Zk}81Mo>oW_==dejJ~L6{OVmt5JWC|Nz&4>RPAVH`2!V4 zk@_=ZAuXrVpfkN+1xYDnbXu^J#(z6Z9Sz&+!kxW+i9BRL#qgzULkDJ3gUcVd-RMm-UAYds6xKrnlDV(V_f)6Q_K z3EvW`D{M9lAlUr#W7>3_3s~4x)(X2Ot>XG{QTU`#;04@K9t&GR6&pasq+( zfHsQTXT^9HXOH(eLiIKHj}k%0nR9{|pd#E-PA>PN*yT0rH^4~aN%c9HTJ=)TE$lAj zK!*=`P!Dy@DBa)ox2NnnChu-;_;0!P^%Y^V3c$@lHXo#BWbT&Z<(!z$%{?I;`>W%Y za|aCphd#UyrqaUO?T&Rcnj9**mz%GOe@`CXJKTa^-f$%0ttWy7at9_#4u#FSzKX7v zEQaqFlwMZPrY)|TSjig$!fX1|dC~3cZM!&*HIxynBdH)_jd?u8Ii6TlID01uakCPZAg1p$zqWnc&>NF_AXnnr2IR&SZ`N|qF~yz;Qrvhn8!$ZvAL8HI zLFPjY&*4u|{l)X!(oVw87cs=kQwI|&E6L?Oq%5Opl&p(3jNCHw##57ZrEuA@`Co2Qb+oZjE zTLY57W`EsCFUT9nbT${?86O>btI8Wm5z$EO)>kMTt1XekU0jquL^Y%Gr-u}3T{;;d zh|^_thx1It))EGuOI)7m#QOWN&Q8RE`(34ruxV(n%aNDtbygF%2(NSGN}y<8(_!`~ z4#VgDZ|Vjs#w^%Su1$)BUezoD)~|eM{JQ*Fg zotO8!qtdJ_RnlXr)j$1@J6GyP3ik-li{m!R9S`Y`+nas7lqp=9luMgynicd7^oo2- z635RF-jxJLkChB??Uq+1c8rs=k_6Nol?Wr>2cB=T5AZkUOcZQ<9{RYwcsPtMYY4g) zIT})R*oor>FJu;Ue1_&|*82PS*~w2PQ?8B^L7p#j0S!K7NuXKjGG7>Q3Z+@@%DH#T zdatOC#9_+;rH8^A~9cx4Y%C9b=@gPl1wDY$NAz2f?zVmdH$zpAe3wm z5o-bZ9(pL5`}{FO=N!eVy^+4Oag^#U(?4nZyOAKBA~iowb5+c7 zN-}a-4hQ5N7l}vCu~jR5cB1N~^CN{VS;sS|PYz}jSo1JtP=6~A$g3f~BAxW7j5RPtl9*JNy$-ro{qqQK?Y zT}!Dm=s8`qZZXSLmMmO);FSE$N-&mDx=p%eT|P|Urf1hv4kXEh@l;=dTf7Rh`zU)< zr%IVcd`ga+16xe2c(OUQ`pAFoUNVd?lyGfyZK2YDeQ33N*au$zwE1<*fN?`S0@C}k z+rI^?_hE~}OVvWNxB3`V%7av-cUWj1QUMQx+-*|i)>pwI(V3n`=C`JZKf2v|xtvLE zn2XgwaLP;NYTJuhB6qK86rFxGTLmkNzOrVXCy>>lP{l`fmb`OQg>%d#XY`>{o8s>y zce!iBUi288gP|uM5_#hm_zz?uB;l2-8e-EvaYll7bp1m#Kc<8qH`n;@zVrxZt8+t| zG0;J{CQnC?YG-{Y$K399Ja58VpX1~yHIP!ULMU|_blGxLh3{ZxMUw2DRN?*&DC43i z3HJMw`$Nf3OKS>3#P@>)ZWf0H4`z>?M#j_U)&EwTRY9Lg?O|5XT?-q3Z6ebC`x#T_ zmd;NJDatNdhQtyHj?~1-lMiFr<4tl02Hzu>k|U_qjq&%>;?xrY$npyp9y#5>e0v*N zJb}4ps5k#VjQk}?a=gh*NaXsHWJ5TIi`KgyD?#;Am%*1mCU?Xro`N+yorp1XR#xke zGoy2z&>v-DVLw*tJ8KgzoOjWh`|-*>eAJLRDro74KZCm)&&u7T{H3l-E988IizpYObM2FWqm)dm3?_Sr#y?^K81noZ4Y8r_>c|9NmS#NCuYK8 zbFK>_r}nhEtg2G0+^r=zn)wz+xd$aV+8!}*C>Hw56)+5GLyooY#jMvbA&d|`Q$OM) zjU6tWf!E3^Id{Ci*Mmxir7T$q9^uqu-%DXp+2pd=($neQXpQqDz|B!KoCH$o$gYCn zIcjymPJSw7#oxWVzi_u~ITRf-qH74gj^l3*^!t?6sC{pVLj9Ms2KkVjnA&buA1D|w zF@}jR&wT;2qRtH$R5j245f+qrhylJ-8I)6wDc^9FKrH*l6I5T`93H>2?0iOGz7hYP zgnZ8evwx%suL&%FC}hGX@njdcb}3)lVU#u}SWEAV-b=40>p}a*=EJ5JV;Zg;**T(&iphLEGUVoPitZc9V|{afM)}e(9Y$Ja zG|;meRfzY98(vOfZqZ)ghS^U&*t!iX(-FRe^PUU0sHJ^y3N9VA=r zEo{t+rA+npHNAs830%7H4=mUZ@Ul;}4{q*T0nuu4zbe+B-@)dr-s<$=*@sctBE1*y zWHHAZjFa?0pNChFP*Vn;aoQgSN(q11NUNnvthARt9(;lNy>WP)VInVQ6^YZ~Nm)r@ z$ALIcSBQE!n4@(}I!J!gBN>`c!|C>)&g$ABM)O8+iD(w{BS=jg3it4wG&F*mGMk`h zBlb)f&h>DaP_VJO`t5R+m~^RNj20!QRh+{g4p!_)DzU=MOTPj1A+{XX+b|cuCH^y3 z+FT55a6x&}3M4B_`&F~Hw@`Me2dl;oo0H4F(x9ODK81xHbdjhuRIlIVkR;eY@dCcQ zHVlZXszK>v`}D%53Ye_sm>7ao9B-2?3=2XOH3wXLHaz5%!yXq`%UdwHWBtL*U+5OuIRO1E#v2ax6hy0$fV)4l-pQ%DX>`ri4+*} zD04Uqn?o!N3Y{tWUpd4}!Z=-N9OHzp)%u#CDIG1!qbru@x_N1X3TC+frg!sk6j<~x$dhK{ok zslHi-tKorgx}fh73z!+Ad-O{lx@7r0{Ngg^Zk%}*#<{cZVa=h%=je12rgR^nwpT;#&0ZGjNesE5J3R2-j@pGGA)nFe`)V<}BV?s68jik1BI3B8x zNL?(iT5=Nin)<4nMSmnpWCG{H|1(lX3~zI8ZkIV;4q>Ml?w@~MMdIEH)r?bnXkp{0 z?K7b+2)0ub7T=J?iLa?X;8Zj3PCz=p?y3=A$Km0elx6%pZ;{Z(HE z1$q?6CK(fXnTqgFaF8|&Z-+ZpU;pN4p4%3zkx?*-O49pi^y%P8^}GsDks!S$%RgTB z-D!Q)F7L$~D@Kq+y?;z3_qc2B=WKKkl6U7PJ^PSPkY*oSoN*Afl5QeudLQ{@;z@fy0d0@M82SB0+9p;CoMN zfJ*=2l$Al(aQqqbAMt?0nylLBQ427ubrWM#@G2~;wKdEhn_0$pXygR)%C%ae9#Red zZTyD6;n5Ai5s=bpH6}XjkMbRpiWD_nSr*et$_GWkf!P~Sw*-as;KN}zV~g8ly?ANt z-SDB$*dWga$~}Xn8#7Gmc-<8A3U6&-vR2}-qGP3`u@W`idD_oAoMZbF3kM@l{+aZ0 z{Z4vmRq7^1jV|3|ke*42YVpC=NB10~>k9Giz~~5j-Dn1xXEjP%mX_cJ9)g)4NWSXO z_U)_C<(!KrH5|+FE@#f_H6H{~V1M0I#fwwfC;#x=)52 zrqlLb5$goKB=&~aqGoe%b``XAvM*>3H4{7YHxcVQAItdSRkBD2-HgI65d9_pz-7L5 zye6}o1RZ}fk3~k8$dtp;=U#&EG};)u3^_(se(o~O|AG-cUiLIXGM#O0H~s74#{+CF zB2s{EtkA`>uQ|Ok(dkBGIRT$g9rDG?9{+o^C(G!<1n|XSc0HX|b`BO%fJyKrpK!Ps zJ^N6X-z3C~R3JplnK0rWNo&_d!J#en<~~0ZQsL$vO~-of%dIHZKq->0{%*yxufLp; z>%VhGb)lRIIoqU`GrOfhwg3`V!nK2G`2L;-+gw1BxkT&S^H(d9vCg@#&kSC^U!B?W z<1OerK+NZpGd;?TLf#HIl}WHa^o{Sh5dt*`?$U4ci88 zDJp);T73U=NKSu-beWni;PFA}{MhcvjMMV`CGfSg%&>n+eZA68e%$phPnbMHbOS7` zenJY0-BUP7oeq$vbg_RF0Vfd34hOVr3oI-sz(u@g3hdA>02)O9h7YKMXNY6l#bHpEsbISv$tMYGO zqm7z52LGn4jAsd5)og%_saR7~3yJHu{|m!@w*`Qy z^xy)yKbcEzd~ty4N1$Iz!$fVtbSf=yA|gLP$&c_@J4;@0coih%<35mO(k!$b=L#MXGA+1_5u0}SzS$Z`KF zkxI~|?jC!eQ51+pgdQ1k9oz6D&w%eq2_G2kDq(ZG-g0kR&lU0c13-+9)Q*wko3}l7 z8)Z8AKmXas?u-Ddy)Pf?4+uEXpy|0UYSdre2FDSJ;&1!qtU&ccVYSHF-EH@$17B}G zBfr+~K3>xez?1;*W9dvtpHXtG)9kl0qi6f1-No^mfb+mRESL*_L!le94tFDe8%y`A z0INkJW&A}RfFU7s%jn4ABo#QcGNoz*sFTNX&G$zTAr590zJhGqqpGg)7l(Rn7Wp?E z=Dv&!-ao<_prfJ-P7;>vqN#$>LfVCv>GZ1%PE7tINV~rbIGj%V+lql8eb7x_d1h4q zBFLxQQ>DR(J}h5e2Xo+%(lJo92eda=kl#S zAx_AWQ}H`GEV|6kO5QCvR?%H%{ao_AhDsf^YDY{-^3|nAip3ZJA|8+kVjN-UYmc8K z^Wbh7j1ZlO}z9IMRB+F;i@1@WM#ltI=m9dcVSKH-wQAT)^ zYHQDAi~28CIwwdAvNyY2@T27b%*1tQtoW4Vf;$HYt9~)F$^p*?C~c8E>);X2x_AkP z^yLaS;uurCCjZ2$qdDp?ee}lIa_6SS+QO9|-?zDFb+vw5@0oHT)J@ zF`z&QaZc-Q81!g6D7W&yt4-vEj0=>ChJv@cJ5#FAL5st(@A3* z6}L8z=81;RF6Apsq@v}9vKnxacsLvQ$n9?g`&+!pu2HdHzakj4?bT|Ivqz?-pk2(xO(1Vp4AB35 z2Hi8L$(td27{xf%_Qpz9Rn+2_L62tws_vG-vxE5%hvBNv!iLaw#~Y}26}XJb0v|y! zm-Yt$GXnt#Km)`!`tkUx;vTLsf?yaRF&s7{NAex)@*fS%K4{LqSufsTL0otzzxh=> zd}wc7xJP*ra4d8y9cE{;ckSKt9X8TJrmxr$uH}h}F>pMN-`@rNf!mO(Ct=!+bu{Nt z=(P!zo@vYXgmR~AUzrrmIGlHDNvT5sZ7xCw6?RP)lEReiwa=5PKFdfsYY8tb&k|HN zgo;tt*OGl$H)9V-r+jDwu^FEs6AB89g@ICiqN~9OSx0}+HK@i45ROAXM7nE?^0v=^ z1m$UFYawP$F58K!Okk0d^PVg`n~wWQ;;HkUaYe;F#|_VlSa98myY_}RckWNzy(o<9 zR%#@uMo+|Sk7sFITiDVFKc0vNH5eooMyOg0A4;I#bk<_`vN)xMvUR$_jv)-@no!)P zSHOz~^fhukNCnXl_>gtFmw%3Z^9}4_`o2!Am)U&`=`#@4N!^6$_z&!dK`(4G zF71;9`eU17aQnE@?nL%wh1G1xVyR@%rRM<4!VNq>qmSLYTH)rHQIJ_h@luNXGr?dm z!Qru@c1+DD70bBLSgLBS+6JFPp_y@V*X+iF$Dc2CT)eBda;A#s!RJ3GkmE2T22wfj zH^ru#=5I1PNDFWS)(NfKW0VV6hLVsn!18_HCDn2$JoI?#iK}~s>m@0vIjVFJa$igd zDBoL6Bvn}9@%4DRT1L^9C8cTvOADCijWKjpirPDivdYRu#w2rJeTm{af>aKLE>xXe zpZJIbTt8n}t!�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 +psS{1-lCzi#Us--Jozyddz z^jE6|KB6cgNQmwaFm=HDPKaCpB=XP~sfzHlpxHo>S}m9g?6Mfr+cz6~hP(fWNOEs=qebtjXj* z!$o-gK)cO>ud8F_QMnPuZykmbeX-SqoZ=FZ|0=xetZA#8J!ApLV{3{$sYf_~ zdRlC<8=H8*DSn7Iim`qOv!Blc0TTRR)sW3zdud^#>l^jpi3X;4Y-EI5Lp*QtgS9`> z9=Z393O@L1F8vf2!o9XPu#LQbz|Tu!D{F9{9MGK`(bH_`6t}zE&Mf`ie*9WXkTBTe zP}6lTAz0sB84pZ7$@o(9g88Fg|NPpG@0Bs z@;e9bFV#IKLl7TqUQ~-u?pZw7#+6L^Js$>UGtI;sLW@4&`6aDWsjx&tYse1SY#Imu zZxAIE+eR5n)QI66&{x?a&;`u7c?tO%LAKMT|6pX^ldY&dE8xNyd?hG~u~`r69Fx%h zZF0tFLoSX_Xn*OFJ|_oUdGyM^Q9|nmOS6ymkjI9E6J;*-w7;Ysr9TdZZf=)VubfId z6fgGSfb>Qn+1%mXi(p<2_67QH<5z}W&q~)0I%tHic}Ei_JCu~J#9PgX>r9QsS0B5V z(Z)%S^%$AgEDyFz$GRuQF#AdarfIJDGcnl#`tv&+H)M? z1b-!@uED3f++=oKi7SkI={&JNa7c5;v6faskLO2R-7~lb-Kd|%7Yu_wSK3c5LrY$$ z_vm4UHIwT5j9$Au0{J>DW+Hv8YZkTDH>2(&5e!0e?u)9W5b zJEHPtuWz7V8*?|${FFPQn$>t5gy;IiWVwLz#PwzD6hD!3~ zjXCg!4?h3zy|b^T(zZP~np4md>3;oqkna?4uf*|ACp@N@JUBwE+?L>ps3vv%@gvYr z%?_^j3FtwB2A#ET*u0tLMd|tlV$B`RZJyX8I+P?JEz77GR`h)X-@6IBM<+h}(iir{ z!)DGn($OtNw$wFL-yzVwrf4sc*QInYs00Jh7=}bbHf@V#KC?x>R|grLSW0d!j~8(n zVI~61a+*0nnF292(WbmQ>H~VW({+MSKH^rSPYkCV%BOmXb*fR-mP9hiO zj!N`^_e?KPf9U5<*@^%Gc0=|_$re)iqY`#+P$ab)Xes(0!CzfHV6RfX{`a667k8`A zKrsS6MNaq_I8bf$k8Is8?aNR83?$op(5z6A$vZxt3Kk~B{m7E3T$m^^1NO&KUMy94 z_hAR;OF(lCt3%Sv776{+{V<~~s+Mh`8Wr2RGOISMO@*suIBO6cAEjNrk{D&bqwk#g zg=ViK>>c-CwUp1T|BSs(FL}3m=J;a0j$cW4!zW1<*mGIwG6;V{^aEI$z3scAS+x%6 zQ3!al+i%mxIQp_DHIrRYM$l1L9+6dgOsp5B*z8~jcW0e2DS`hs+SE+V+0{8POJ!SD z4n1m=s0$Go{3K3wghc_I=I3H#MmYE4or#C@Z|g4uls)cL(qGBxYiUtxs}!Q9czaBM z&0Znx$T1Tf>|If)V)M<{!M6qv*!yYByKdynH36c#j%FqLn;??0KTg81SIUl z2gtytgKKh&VU$V}*D&aWN*OfZ%IdTqs||0pQ>(ef8HcxVmod1@DrvSS2^&XIIZf(4 zGC>w+uaq$h&E)zPYPwmLzJ9WGA^RW0^}<|dG_=DGV2J^@~mxiwzU=zT9-p))Zmvl8!}_s zuAx_Q6*!R+Mr;3oG%dpPsmmvq{0+-=KAcNrv1-kE78U;`?Gb9a3Dsd zhhZ<(v1}P-*>D`EFu{$~&f_p-K_!S=TSX6cy@c~sUbyBA!C?~HJp?y_Ao$b(d?{!w1t1T!`49FWUSy&plpIPIy3ba1pv3*-bFwTqw-KC(s)=knI%I4=j!s?IgD7NK80RY78@b88pO3iOi zy4{1#jR92-x%$9YdVQ%0`VB)s!gZ^n$ta`2zDYkGC^YgCHXf-2D7sj?b)!jO+*WZ= zmH*&qpq%aF*16~J%jzUVc2O8T)aI{akce7ew9!DZ%aov!S)lP X>$f4Pz-Lc0a=1G` literal 0 HcmV?d00001 diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/DocsScreenshotTestsKt/ScreenshotChirpyAssistant_Dark_d19fbf1f_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/DocsScreenshotTestsKt/ScreenshotChirpyAssistant_Dark_d19fbf1f_0.png new file mode 100644 index 0000000000000000000000000000000000000000..e6cc038b5fb5b8db9a4b8752c994c1873212911b GIT binary patch literal 109806 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

b$DUQpVY(~fQO5A>}C@!|F{RUX9z~yib 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 R@;OkR!PC{xWt~$(69CZQX5jz; literal 0 HcmV?d00001 diff --git a/docs/assets/screenshots/settings_appearance.png b/docs/assets/screenshots/settings_appearance.png new file mode 100644 index 0000000000000000000000000000000000000000..aecd2b62082a4ce5114fa0a8841c3cf66a03f483 GIT binary patch literal 12667 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 SQ3rZ({H}NXa{k4;kN*!m*bcJ* literal 0 HcmV?d00001 diff --git a/docs/assets/screenshots/settings_dropdown.png b/docs/assets/screenshots/settings_dropdown.png new file mode 100644 index 0000000000000000000000000000000000000000..53419996a60ccd58354b5e838976bba7fc744e77 GIT binary patch literal 11369 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 DIZYSg literal 0 HcmV?d00001 diff --git a/docs/assets/screenshots/settings_slider.png b/docs/assets/screenshots/settings_slider.png new file mode 100644 index 0000000000000000000000000000000000000000..f05643897bffa4451ee26237803cc73ae7c07cac GIT binary patch literal 11345 zcmeHtX&{t++xJMNEU8qKtx`=ThHO)|E{Y^nipDM>#1O_h=&nHtl|+_QLL%GPw~=iw z`##JtGnVWIgBin^ndcl`*L~m5`|17o-tY5#I+=6+|MU1C%kTIdzjI#PGS(O3KgJIN zfrJdMU%dkY?Sz6rJf3@Y1D{ySw4DQiE{GXi{o}5`4TZQ~meQ089^Fu*FW}MMPW1Lb zr_Q`saH>I-(gaP+q3)O6#T^fKCZ2uUa%u1W#N$`@*Pl$XyYlNX&yF`cPx60G@jh}; zwdAgM4kIuxEmeD z3tYZw@bCebTLC-v0hdoJJ0*b2mC3z;y`ZpG5l`R(iU*H!FXv6_c!0~@kN-a}g#Wo) z!rY2FAD+Dwl2Vc|S-lDo&Polj>4<_DcM^c}hq;^M!zQAlLj_GUt3{h*F%T=Iz?*W{ zp`3czhD1fb=UC}b`3pAX7w7vH^tDMPV;{0?I|&mE2Q29*oiIJ>IrTvlbqOu%s6rV+ zcJUs=28=$%79jw~+6~{kIGU&phe6rT`vgv0v(2lVYc6ma$jl8bE(x1J&wBH#sF5|a za$F*|Be2_caz~6mxM?v+DiL**b!m~&SHD@3jP^=$+vJD7mxGBQNRDZG9S*UYaRbG= z+rfL5|AYs7)Y~zt|4ohc5m}fKv2}9Zt<7+5{Nnp5`j1@_if7OEYs3#; z?bH4sx$lzC)z7MgAhNFOAG+#1`Wm>Jb#@*i%iyxHa^PB`1>+6fkfS;NHi=hQqlijV z#D08B<7R-(-Rv+KAxHW`O;x+8r@o6N~cw zR-p~XoTo(ro>JF@9A9=)Ljj;Zqb6`}G^633yyK9UV6O8ryCxh0) zP7WF?f0{y2GUyC0YA77KD?j=z>Z$H(h)8yviB?XjwjLoruc9-aA_h6h#Gal@Q zs8!FSsMr!CCQdSFBs;n?LOP^~%2FPEG~Idl_u=ea1O@do1-Qo>71tE;?03Jv?&uDQno_?!e(>#@ zVot};D_|b1eM8KmlF#)Le&{~+t)Y5Ff}&HqWHfslS{Zs7J7S=pLzjrLZd0AGloGX| zMZ5v3h4W4=^9Uh%`0`$83~TaSbZN53u>@Ma+hI>-ZPaOb-4`a2_@r~DB)2tDE*RIT zod@oaRSv8ZuMa18q?P3=Y=o{*MfoWm?x{N^L~WG6_uyPPugrM#SEVGpOk#_daC?5+ z9nTLPclt@bDu<>*)ESyY^0{zm@V+u30byG9xp>T< z8ckI3{^K+2m6H6~>h~SVwftp7)z7!$c1yUK!})_2k+;${J*+Ap{d}ooBr(0=3`TJi zIZsIi@nVS^t&2EE956zI?fr(ENp(_tMg1!)S;T)*zswHsWciYP=mY zZoTSsxMZab4#`e@jqAKne9fiqK$BOp+xXk}!lXiktpwWE{!W-DsD2qow_@d#eQ+jr}#^h_=7}sE;dEJ4M)zyV9 zG!l)x`mgoA@Y;l8=}R#vhK z#H&Ov(L_D_6F#Q|ufXuo9{jY`!T0hl>x}(>g;(6Ozp3i1)~21_1hvr1yXRU`F+QLZ20tTWxIWc{in3#D<&3bSBLV6n4n`e{$m5V;iMCz z+;f2CY|2k=C2%&Ug)o}~8!(}o?S55<@E(8R{5(BYGvHRPRc)T<1s-hoN$v`}s*M~B zdst`YR%S+&xoFJkQ8A0{kUUn~v2S-2*B@aNr~2pQBdY9$w%M#S^F3$ASK^8@A#P^y z^Ad)2ipASyF>^jvn{9O>F>>shMc=-^cmI^L2Rie7dy~AAqn|{!E4Z?i&JV@qu}@a3 zOtO||(z~8lEd?svOkq6sckE5J|5@#bzt6%Kco_PxrwWTtwOjN*vILUJe>Hl&o)?46 zr7H!mjlIeZ4b@840t4OYt7jKcI2sd?J4l%Hg+wTUx%E_<%OlOHnZH>Y?72SxY!-I~jWOu@HgeO^3I3koY z7K5M9R)0Jcx!gG{{SaB^q<~#K^4BTsc1yr9m*los+FRtuPsj;v5b4zD4>w}HW;4tq zdeX5E9j+-V8!!juQZO0|p>+khCZWwSl4;RBX+I^ZlK=ABv%{WS{t?y!e(npE%#g8_ zwtS&Mn;>t>A_~JGt)pAmvY52D(Zh3MoOveab@Xj>OqGmE5UzeXpR<{+L(yjUg+3QC z(U2JlUS)W;oHmcpq-z`(hmTPFoEoh2>1z7iFpLFog@#(D z)SYk9e_XK`>{MjWriF@mU|4wsNf{up{K;y_!$;)qzoBv4iD&m8`bRcnj(Y368yI+7 zFL1h_i8Q3K@wP`?wb}kos#A2aD)DVnGjsmgQBMi4Uyz2C3^z2P5~d^?uFYJ_EL8DQlE*FvkFUc!j?VB8CV>;KEGM?0AIPR7P<~W4VHOyOy$ZC z1e-Unv*-AbQg9$zW`9R(mjt!toQsjINBI~|2g48>D9*$(*!Td>pyOmFvIL|MFkx%>~>Da_|`{1cFh%l!M1PT+K=gvH1)S4tBTbOAyX9 zf~-Xu-tJ8T;%oVrKghmyUR}hdunCl?O^0hKO{{01`XX*-eMx&n(QV1Z%Be57T{f>= zKIdqAVO9L^O1XGwM-1cF+bMmVM-;lN*1sy6*s)!cKJlOTdjj<m zIpgKInWoP!A=I|Vk?wopI&}w- z96rv_Oxc8S&_l}bgMahat-a8F+ABjkWQ6o2A?DvsqSGL>5^Jt%h2qVJXawLb1< zgO73TsIe^dC0Gt-Dk-^s%E;DH<(Vcz?I0J`0h9046>{SZ=TPJ7#k@?rTk>mCQ36p% za`&tgnN{0)5KYi#p)rDK!53x4{R*&)dVjl!ANoa&><`&$TCcSg1HbgUBY|9K8Hrrl8`(T`OP|5cy5a-)%2o1S`%u~9;OZg$)E57deg;g*9 zjuvmsBg!14o>E3W%w|QXJAKwAb|Hx15uXW4NzKJx_7B0SA)?MUmA5_86fV~if5sTNVMEmBXvj*Rrhspk2JMNe4L;Cu{8+-4GDkuj=icHv zW0k*cC-Ku09{mwh2M%xSqnrF3?+9YOuCV5tfq|xI36o2-6de{Yiv2m)+Ak|&&VwDD zi{Ca_9ANnVY=FHQ*sJ?J>9p!Oc43S2OdAl4=_r&v(S(pq~xh z=EfUW*OWRTH?@*k3~*J%JiJ^k*QP>o-g1fD*{DK6%V8g@y7ay)7}Vl(cKGVhgk8u) z#)^elnUNF3lD;DOPVNSYT0gm`>ft(49<(VWMksWh46oNiQ+6sjU}NC@X+FIlU_r3o zMoyIv%o`AwX-lOxp@i9KM@mPl#uDJ|T0>w29GBeFAyNQN^H0|?5q+;sSXvd0G-RmRU(5IV~;kSKGoqn{V~Xe;t^Bf zozTB%7r-5-RHz0QX-P_*<)0Lq!O|VM1J{H#6bcn=tj^ztN3}tFC(2|G14KF)&SlqWX6XEhZB5UX1pmlpG8($XOT1Pv zu1%YImiX}6U~hW4zIX_P^q7;g{dgGJwh_% zak>_1wtIxM*jUo;ph~VefPI-(pXH#;or3j{Bgd88V|UApmQTJXD>tjp{=&u4gtL%l z(2y*@=&KzjWS5faDei>S-&B`d@nd0-v>0#)QFnVP08kdY<<5(HUZtKplCB@yvN-kV zNW!5;lLaR8d8G$1Fe-1Zm3{pL8~Ijj6WW?ReTYCvEq@=-K2@W{71rjHU$)(xqwz^8 zYq)U@5Q{8d__o1VswJ+co}u`2YD~l@8tpESnqK3SwOzoZ9|dySaCL5&zAl8Nx32<< z<|oU$mq))@LPG;6G0$t(HNPs@KSngZ!J>poX&-6P<5v+8lIxH9OIN=}m$#?eNP`ZGX` zTLb3g#1i4FfCZ_mr_L*lo?Yc)!OR)W1D?vs?AZlR4l6c1JysHysG;XYevx1ss5!ri zU#mb>GEM=ksg-^jX<@MX_BG-Rx8|((-NtF{9hMo5O!lv3Z&rQ6Ul2DWIxl7McUx*OK|r~##OtOMiVbi)(}i> zEaV_JXon99Hf~iIiaTVq-5s~SLMuhCs~1mV>;aVdKaML21RSwhp8a4o{Ojzg!VSeQ zsjj5%;_dApOUaTl-b&?|0t18weMkx4^<;#ag))?{$)x{D-c04C7JlteL85l@9*#AY z&JXy|3W#qw2Kz^u@t>Om@f(EUOD10~^8Q_fy{kO>#Am`yGukAjKvrkdw6QHEL zswG>?%p#wbxn{+E;s_sHRvu6|odE~qk9xifAORiTCk~J@MZj9aiHS`t;myE)=g{%+ z*Bv5N<&QG}p=K7Awx(yIMRm6X|ISy&i@??UNTWCHjnHUGgh)5xS%{C9N6W6bs*_!`8A)o|*y6wHSH_Mrl4d_O{fkZ9)Zk-~9Wg;L_ zU!HcwqA!i%6F*h!wL%&R;UXzvThjy%Y|K5d0XPjWCaXm|>26{aLP^zQorsW#FVT18 zlbHP)>IOKoHXpD7QVXq6bPASuyeeXH1Y-4JK!4Wl+(b!P(8sMsKeBwzrL}?su%Nl5 z9*1KzK)s3o?S?484PFi1&xALwIXqE)Jfvt3s7)|y*S>J==UnXWfde3yi+oG8T5bKR zCJ@&lYU?j2o&^h*8?^Q_I0=u%?OG1xr!HkXNi85$0@tSKY6-GFB_`09|`@xjqrOOTzJ^ zA3zg`UjT}D2<$+WM@_x361+VAV}oXNJ)JSrSu9T)mj=I@O}s6riy*Jo>9A0u(ch7q zQtR3N>wJBu6i9q2Y@+BgY$QMQwRPTzcxB|Drshp$8jt zK_Un9!u^nL`qbbN+lGt;Yg1+!a^^F*XcN(xp+i$YGZzD}AUU67>WJVm#k_1rB+jSW zxCY?jsKSYWgX=B^^GWe60^gI5jdq_a5L`|H$f?}7G?*h-fcf4Fub2*K<==ky2JyQW zM70U^BD@Ie5K8D7u2i1f2;(zxV7s_{R#%{#}f)_W{0AIzAA4v&`(pHXi9 zsO)kBM@lQQVP5HqV?+-7>l=HgRr>SY7y&y_k|6vhD3`;YSAXXOIpYSOM9275Ir*MP zA#1Z(=@2O(my!ocWf$))>>asXQO4~GW&#mybH2K0*0w(L` z`2e7M4--a8B&pNZ#h#9gQPylpVS*eiZonsJX|4p@VdD_lyT!a;=HzXrw%;+0n~B4g zUE8x}UH7)Q@jv5*R9DJX zA~KjPx4s4~Ou77mPj~zWB!GVL zO5I*rxv=>H_Nga9*27<8UI5g64p1s@eIJv7chtYCmGEwsgxP|^i~;p1tT)#ZeR?6- zQ_5-Ww7luYg9&rI7_bXh-_E%4?3G#XKli+$`@jGF_U`|ao;X&-gKfvl)~B182&s** zt)T0zd<~I(SX50+wQAM!jxZbFnZ0Tex79QcWFpIt2c?Z1nf06r9K27udBV*tZlx8d~p#3W}=+$JdzbJFRv5W*ek%%7`^gZ(0NI_5ddjH>wl0|uw;57AwIc@RZ5F<& zuldgUE)R$tIEQk<2R#D!dRZDU_ceYW2yK_21BJomtX3vpSLUQ=@y0kBsy)xaYJ9N1 z$pfl*782k5%7f=|^Ce+P|UVHi0 zY~qiv$l($via8!74(cYP?6Ry6r`3o*0XVs$FQK}C9665`I193y9}gdy4Vu4_;ZXXP z?ruH;m8*Hg3o7-Ps_w8SR%$yf{iykrwIgOAr*@D2t7?@h{~aI#pp=J^M5Q6aQEm4E z&x}T5Qj{Ppcf{CEP%#%gbQ`vsECE5X=J1oXn|0KgK2vnm8IT>oO+gAixmE*~hW7$b zj^0NHdNV4JY9PC0poZ;cBAH%my?5e2?tyw#%}*};V=qVy3RJwHoM8gzL{Qp~@2z|i zX6D2+n1uR)PCY2?ZY`rjI*=^=_B_W(uT8 z^;1=~qOXh5Cd<9>GvE7cV7M!v{yc~l$auPmw>OV)Yp%Toy)@2=B@a)&z75k{CgS}X zh3vO@;REt@<7C%rP>|P3wdcyNb?1^R&cOC-8e3~v`^H&6Rkr*D-yTt0=0pFbI2D-O zGI4{k8g1VWw~-A#E6oYrB4wdf9cjEJkFU`Zwx9c}QlIxH1#hra^~qSxHD^@o_Dr;!Hcn}$YBNyX9yNJ{W>{MZL_S1Vh~ zG|OgfI2WRz0Bn6(3Q6x!4~z)#<5O~ZY%PiSeb9ZH zpI2EI$Dhxpcd0$Z^!Mv4;Rap%*mZR8wfvAcmOFj2a5~Ew`Sj@l&${lO#e-eWwjWYy zyGql_F9ek}O{;{foRaC?v#4l2SxL`@z@Y&=q{OW*|mf8_&oh8iHju}Av(S#>EhCXm7V62s<-8)I}oJ=4iNDcWN zA)hG+J+Jugf!Z;-cAOXubKUP*oDbYxev`^4Typxn63!XZf7hz{!3+N2vJ1DLQuOP1 zbR$lmza`{_H?RtM%XZHkzj(y(?k2CWrZ%Qmz7Z|;`@DM%s1050 z(nt0wX7WwRpsDBXNeVoZ<>SrHMVPL4MtZVRp6{rMLuRqHfg91gq(lU)A23|}ii6h% zh?wLg8qaQHV13($xk)=)ejcG6?31Wb!f|u7V{VM1X=B|Y%}$|NzI@W!rIRI3)HTk~ z)e&8~`OZKv2@~@iPx9)YL3oH-2&6QFR_6z1M=+ZPrw+5tv_F)bv+`YCg~@dv<>3>Q zOY6W(cvMW&meId-YtoIyAtPb(BDyi&`GFULAkpL~cNf+bIZJB90;|;ZyrgG)O36v) zB;tJdQTa@HURId~Gb0h0kAEPx3G){jHt~+2I)P|G(zzceu%KiL(Q`>jW+Pg{s zR^DHLNh8z&@c05ii`X`_B&*V!iQ>0Sc1pad0WfHI8;EA&Yt-fdSi4__FoaS^_To_@ zpl&Vh_l3MgJ@zK6(K>-O05R-YaTKpV04Be+2J~?XVBwXen`HQ6N&lhmVrO&C?vF<<@+%Id!K2a6P3#u)7G@CFM6}=JkDF4_&KmzG^ zS#4+<)H+CqKJeLYpRldt$C2cPyO$BNF65^c3>wNZP>~O4tJA=#QHHgG^Ef*F$-7#? z?67qF*FkN8bdSK3DW0A1`sFueIFB|XNG0e~0wthv#uGr4@T@e>zxDT%B!s$O&wIiy z>%cdBpqdNvgDGe`Lkd!X^rO&;(tZDBZ`uiQfbKn$5mE&Bzz&el4ZxxA&j0U!|6!hR zW&CN0KAsK%r>LL!7wI?53sM$P+I&Kh>w1Xf0bS-!V>eVLRvqov8}eIrL^~C-R$*=E zf71LQfRw?$^;{_Z=b#~Wh`KKtEzfj^u02;Qxh2DfZxK?(L3MW9KZ5xm^@G#@KHpVy agsrbYFy`mMIl#aRGPq`ZHBZOxAO8h2r<>IP literal 0 HcmV?d00001 diff --git a/docs/assets/screenshots/settings_switch.png b/docs/assets/screenshots/settings_switch.png new file mode 100644 index 0000000000000000000000000000000000000000..c1b4557551f8f9eff5fd9b1178c3129ba17e8ee3 GIT binary patch literal 6705 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 UoegS!#Znn7GaJ)#;~S6v2T3_EWdHyG literal 0 HcmV?d00001 diff --git a/docs/assets/screenshots/settings_text_field.png b/docs/assets/screenshots/settings_text_field.png new file mode 100644 index 0000000000000000000000000000000000000000..679e0da2049e36e5be165037797c6fdd1f902886 GIT binary patch literal 21256 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 X(@Qgo-l#hL0vYY;>gTe~DWM4fTR^DD literal 0 HcmV?d00001 diff --git a/docs/assets/screenshots/settings_titled_card.png b/docs/assets/screenshots/settings_titled_card.png new file mode 100644 index 0000000000000000000000000000000000000000..a97e333dac8168e44c0b973960ee04825ee11d7a GIT binary patch literal 4866 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 literal 0 HcmV?d00001 diff --git a/docs/developer.md b/docs/developer.md new file mode 100644 index 000000000..3802081cd --- /dev/null +++ b/docs/developer.md @@ -0,0 +1,49 @@ +--- +title: Developer Guide +layout: default +nav_order: 2 +has_children: true +parent: "" +--- + +# Developer Guide + +Technical documentation for contributing to the Meshtastic Android and Desktop app. + +--- + +## Before You Open a PR + +Things that trip up first-time contributors — check these before requesting review: + +- **Formatting passes** — run `./gradlew spotlessApply` to auto-format, then verify with `spotlessCheck` +- **Detekt passes** — run `./gradlew detekt` and fix all reported issues +- **All tests pass** — run `./gradlew test allTests` (both are needed: `test` covers Android-only modules, `allTests` covers KMP) +- **Screenshot tests pass** — if you touched any Compose UI, run `./gradlew :screenshot-tests:validateFdroidDebugScreenshotTest` and update reference images if needed +- **Proto submodule unchanged** — `core/proto/` is a read-only git submodule. Never modify proto files directly +- **Docs updated** — if you changed user-visible UI, update the corresponding page under `docs/user/`. The `UI & Docs Governance` CI workflow will flag the PR if you didn't. Add the `skip-docs-check` label if it genuinely isn't needed +- **Previews updated** — if you changed UI composables, update the corresponding `*Previews.kt` file and screenshot tests. The governance workflow will post an advisory. Add `skip-preview-check` to dismiss +- **Branch naming** — branches must start with `feat/`, `fix/`, `chore/`, `docs/`, `build/`, `ci/`, `refactor/`, `test/`, or `deps/` + +--- + +## What's New for Developers + + + + +**May 2026** — [Measurement & Formatting](developer/measurement) — New page documenting the `MetricFormatter` API, locale-aware unit conversion patterns, and how to add new measurement types. + +**May 2026** — [Testing](developer/testing) — Compose Preview Screenshot Testing (CST) integrated: `screenshot-tests/` module, `@PreviewTest` wrappers, CI validation, docs asset pipeline. + +**May 2026** — In-app documentation system added: markdown source under `docs/user/` and `docs/developer/` is bundled as Compose Resources and rendered via `multiplatform-markdown-renderer-m3`. + +**May 2026** — [Architecture](developer/architecture) — Documented KMP module layering, Navigation 3 patterns, and feature module conventions. + +**May 2026** — [Contributing](developer/contributing) — Established docs governance CI workflow for PRs that change UI without updating docs. + + + diff --git a/docs/developer/adding-a-feature-module.md b/docs/developer/adding-a-feature-module.md new file mode 100644 index 000000000..e2bc3634d --- /dev/null +++ b/docs/developer/adding-a-feature-module.md @@ -0,0 +1,147 @@ +--- +title: Adding a Feature Module +nav_order: 3 +last_updated: 2026-05-13 +aliases: + - new-module + - feature-module + - module-guide +--- + +# Adding a Feature Module + +Step-by-step guide for creating a new KMP feature module in the Meshtastic project. + +## 1. Create the Module Directory + +```bash +mkdir -p feature/my-feature/src/{commonMain,commonTest,androidMain,jvmMain,iosMain}/kotlin/org/meshtastic/feature/myfeature +``` + +## 2. Create `build.gradle.kts` + +```kotlin +plugins { + alias(libs.plugins.meshtastic.kmp.feature) + alias(libs.plugins.meshtastic.kotlinx.serialization) + id("meshtastic.kmp.jvm.android") +} + +kotlin { + android { + namespace = "org.meshtastic.feature.myfeature" + androidResources.enable = false + } + + sourceSets { + commonMain.dependencies { + implementation(projects.core.common) + implementation(projects.core.navigation) + implementation(projects.core.resources) + implementation(projects.core.ui) + implementation(projects.core.di) + } + + commonTest.dependencies { + implementation(libs.compose.multiplatform.ui.test) + } + + jvmTest.dependencies { + implementation(compose.desktop.currentOs) + } + } +} +``` + +## 3. Register in `settings.gradle.kts` + +Add your module to the main `include()` block: + +```kotlin +include( + // ...existing modules... + ":feature:my-feature", +) +``` + +## 4. Create the DI Module + +`src/commonMain/kotlin/org/meshtastic/feature/myfeature/di/FeatureMyFeatureModule.kt`: + +```kotlin +package org.meshtastic.feature.myfeature.di + +import org.koin.core.annotation.ComponentScan +import org.koin.core.annotation.Module + +@Module +@ComponentScan("org.meshtastic.feature.myfeature") +class FeatureMyFeatureModule +``` + +## 5. Register DI in App/Desktop + +Add your module to: +- `app/src/main/kotlin/org/meshtastic/app/di/AppKoinModule.kt` +- `desktop/src/main/kotlin/org/meshtastic/desktop/di/DesktopKoinModule.kt` + +## 6. Add Navigation Routes + +In `core/navigation/src/commonMain/kotlin/org/meshtastic/core/navigation/Routes.kt`: + +```kotlin +@Serializable +sealed interface MyFeatureRoute : Route { + @Serializable data object MyFeatureGraph : MyFeatureRoute, Graph + @Serializable data object MyFeatureHome : MyFeatureRoute +} +``` + +## 7. Create Navigation Entries + +`src/commonMain/kotlin/org/meshtastic/feature/myfeature/navigation/MyFeatureNavigation.kt`: + +```kotlin +package org.meshtastic.feature.myfeature.navigation + +import androidx.navigation3.runtime.EntryProviderScope +import org.meshtastic.core.navigation.MyFeatureRoute + +fun EntryProviderScope<*>.myFeatureEntries() { + entry { + MyFeatureScreen() + } +} +``` + +## 8. Source Set Guidelines + +| Source Set | Contains | +|-----------|----------| +| `commonMain` | Models, ViewModels, shared UI, DI module, navigation | +| `androidMain` | Android-specific implementations (e.g., platform APIs) | +| `jvmMain` | Desktop-specific implementations | +| `iosMain` | iOS-specific implementations | +| `commonTest` | Shared unit tests | + +## 9. Testing Expectations + +Every feature module should have: +- Unit tests in `commonTest` for business logic +- UI tests using `compose-multiplatform-ui-test` where appropriate +- No test dependency on other feature modules + +## 10. Checklist + +- [ ] Module directory created +- [ ] `build.gradle.kts` with correct plugins and dependencies +- [ ] Added to `settings.gradle.kts` +- [ ] DI module created with `@ComponentScan` +- [ ] DI module registered in app and desktop roots +- [ ] Routes added to `Routes.kt` +- [ ] Navigation entries registered +- [ ] `./gradlew kmpSmokeCompile` passes +- [ ] `./gradlew :feature:my-feature:allTests` passes + +--- + diff --git a/docs/developer/architecture.md b/docs/developer/architecture.md new file mode 100644 index 000000000..c3d5395ff --- /dev/null +++ b/docs/developer/architecture.md @@ -0,0 +1,132 @@ +--- +title: Architecture +nav_order: 1 +last_updated: 2026-05-13 +aliases: + - layers + - module-architecture + - kmp +--- + +# Architecture + +The Meshtastic Android/Desktop/iOS application follows a modular Kotlin Multiplatform (KMP) architecture with clear layer boundaries. + +## Layer Overview + +``` +┌─────────────────────────────────────────────┐ +│ app / desktop │ Platform entry points +├─────────────────────────────────────────────┤ +│ feature/* modules │ UI + Business Logic +├─────────────────────────────────────────────┤ +│ core/* modules │ Shared infrastructure +├─────────────────────────────────────────────┤ +│ Platform (Android/JVM/iOS) │ OS-specific bindings +└─────────────────────────────────────────────┘ +``` + +## Module Categories + +### `app/` — Android Application + +The Android application entry point: +- Activity, Application, and Manifest definitions +- Koin DI module composition (`AppKoinModule`) +- Flavor-specific bindings (`google/`, `fdroid/`) +- Android-only integrations (widgets, services) + +### `desktop/` — Desktop JVM Application + +The Desktop (Linux/macOS/Windows) entry point: +- Compose Desktop window management +- Desktop-specific DI (`DesktopKoinModule`) +- Platform stubs for Android-only capabilities +- Serial transport implementation + +### `feature/*` — Feature Modules + +Each `feature/` module owns a vertical slice of functionality: + +| Module | Responsibility | +|--------|---------------| +| `feature:intro` | Onboarding/welcome flow | +| `feature:messaging` | Messages, channels, contacts, quick chat | +| `feature:connections` | Bluetooth/USB/TCP connection management | +| `feature:map` | Map display, waypoints | +| `feature:node` | Node list, node detail, metrics | +| `feature:settings` | All configuration screens | +| `feature:firmware` | Firmware update flow | +| `feature:docs` | In-app documentation browser | +| `feature:wifi-provision` | WiFi provisioning | +| `feature:widget` | Android home screen widgets | + +Feature modules: +- Use the `meshtastic.kmp.feature` convention plugin +- Depend on `core` modules, never on other `feature` modules +- Own their navigation entries and DI registrations +- Contain platform-specific implementations in `androidMain`/`jvmMain`/`iosMain` + +### `core/*` — Core Modules + +Shared infrastructure used by all features: + +| Module | Responsibility | +|--------|---------------| +| `core:common` | Utilities, extensions, build config | +| `core:navigation` | Routes, deep links, Navigation 3 | +| `core:ui` | Shared Compose components, icons, theme | +| `core:resources` | Shared string resources | +| `core:model` | Domain models | +| `core:data` | Data layer abstractions | +| `core:database` | Room KMP database | +| `core:datastore` | DataStore preferences | +| `core:prefs` | App preferences | +| `core:repository` | Repository interfaces | +| `core:service` | Mesh service layer | +| `core:di` | DI utilities | +| `core:network` | HTTP/serial/transport | +| `core:ble` | Bluetooth LE abstractions | +| `core:proto` | Protobuf definitions | +| `core:testing` | Test utilities | + +## KMP Source Sets + +Each module uses the standard KMP source set hierarchy: + +``` +src/ +├── commonMain/ ← Shared code (all platforms) +├── commonTest/ ← Shared tests +├── androidMain/ ← Android-specific +├── jvmMain/ ← Desktop JVM-specific +├── iosMain/ ← iOS-specific +└── jvmTest/ ← Desktop test host +``` + +**Golden Rules:** +- No `android.*` imports in `commonMain` +- Platform-specific code goes in appropriate source set +- Prefer interfaces + DI over `expect`/`actual` for complex behaviors +- Use `expect`/`actual` only for simple declarations + +## Dependency Injection + +The project uses **Koin** with annotation processing: +- `@Module`, `@Single`, `@Factory` annotations +- `@ComponentScan` for automatic registration +- Feature modules export their own `Feature*Module` class +- App/Desktop compose all modules in their root DI configuration + +## Navigation + +Navigation uses **Navigation 3** with typed routes: +- All routes defined in `core/navigation/Routes.kt` +- Routes are `@Serializable` data classes/objects +- Deep links resolved through `DeepLinkRouter` +- Each feature registers its own navigation entries + +See [Navigation & Deep Links](navigation-and-deep-links) for details. + +--- + diff --git a/docs/developer/codebase.md b/docs/developer/codebase.md new file mode 100644 index 000000000..045223dfa --- /dev/null +++ b/docs/developer/codebase.md @@ -0,0 +1,137 @@ +--- +title: Codebase +nav_order: 2 +last_updated: 2026-05-13 +aliases: + - repository-layout + - project-structure + - source-code +--- + +# Codebase + +Repository layout, namespacing conventions, and build system overview. + +## Repository Structure + +``` +Meshtastic-Android/ +├── app/ # Android application module +│ ├── src/main/ # Shared Android code +│ ├── src/google/ # Google Play flavor (Gemini, proprietary) +│ └── src/fdroid/ # F-Droid flavor (FOSS-only) +├── desktop/ # Desktop JVM application +├── feature/ # Feature modules (KMP) +│ ├── intro/ +│ ├── messaging/ +│ ├── connections/ +│ ├── map/ +│ ├── node/ +│ ├── settings/ +│ ├── firmware/ +│ ├── docs/ +│ ├── wifi-provision/ +│ └── widget/ +├── core/ # Core infrastructure modules (KMP) +│ ├── common/ +│ ├── navigation/ +│ ├── ui/ +│ ├── resources/ +│ ├── model/ +│ ├── data/ +│ ├── database/ +│ ├── datastore/ +│ ├── prefs/ +│ ├── repository/ +│ ├── service/ +│ ├── di/ +│ ├── network/ +│ ├── ble/ +│ ├── proto/ +│ └── testing/ +├── build-logic/ # Convention plugins and build helpers +│ └── convention/ +├── docs/ # Documentation source (markdown) +│ ├── user/ +│ └── developer/ +├── gradle/ # Gradle wrapper and version catalog +│ └── libs.versions.toml +├── specs/ # Feature specifications +└── .github/workflows/ # CI/CD workflows +``` + +## Namespacing Convention + +All Kotlin packages follow the pattern: +``` +org.meshtastic.{layer}.{module}.{subpackage} +``` + +Examples: +- `org.meshtastic.core.navigation` — core navigation module +- `org.meshtastic.feature.docs.ui` — docs feature UI package +- `org.meshtastic.app.di` — app DI configuration + +## Build System + +### Gradle Kotlin DSL + +All build files use Kotlin DSL (`.gradle.kts`). Configuration: + +- **Version catalog:** `gradle/libs.versions.toml` +- **Convention plugins:** `build-logic/convention/` +- **Settings:** `settings.gradle.kts` + +### Convention Plugins + +Located in `build-logic/convention/src/main/kotlin/org/meshtastic/buildlogic/`: + +| Plugin | Purpose | +|--------|---------| +| `meshtastic.kmp.feature` | Standard feature module setup | +| `meshtastic.kmp.jvm.android` | JVM + Android target configuration | +| `meshtastic.kotlinx.serialization` | Serialization plugin setup | + +### Build Variants (Android) + +| Flavor | Description | +|--------|-------------| +| `google` | Google Play distribution; includes proprietary APIs | +| `fdroid` | F-Droid distribution; FOSS-only dependencies | + +### Key Gradle Tasks + +```bash +# Compile check across all KMP targets +./gradlew kmpSmokeCompile + +# Run all tests +./gradlew allTests + +# Code quality +./gradlew spotlessCheck detekt + +# Android build +./gradlew assembleGoogleDebug assembleFdroidDebug + +# Desktop run +./gradlew :desktop:run +``` + +## Version Catalog Highlights + +Key dependencies in `gradle/libs.versions.toml`: + +| Category | Library | +|----------|---------| +| Compose | Compose Multiplatform (JetBrains) | +| Navigation | Navigation 3 | +| DI | Koin (annotations) | +| Serialization | kotlinx.serialization | +| Database | Room KMP | +| Networking | Ktor | +| Markdown | multiplatform-markdown-renderer | +| Testing | kotlin-test, compose-ui-test | + +--- + diff --git a/docs/developer/contributing.md b/docs/developer/contributing.md new file mode 100644 index 000000000..7783fac1a --- /dev/null +++ b/docs/developer/contributing.md @@ -0,0 +1,97 @@ +--- +title: Contributing +nav_order: 8 +last_updated: 2026-05-13 +aliases: + - contributing + - pull-request + - branch-naming +--- + +# Contributing + +Guidelines for contributing to the Meshtastic Android/Desktop/iOS project. + +## Branch Naming + +Feature branches follow the pattern: +``` +{issue-number}-{short-description} +``` + +Examples: +- `003-app-docs-markdown` +- `001-local-mesh-discovery` +- `fix/bluetooth-reconnect` + +## Development Workflow + +1. **Fork** the repository (external contributors) or create a branch (maintainers). +2. **Implement** your changes following the architecture guidelines. +3. **Test** locally: `./gradlew spotlessCheck detekt kmpSmokeCompile test allTests` +4. **Commit** with clear, descriptive messages. +5. **Push** and open a Pull Request. + +## Commit Messages + +Follow conventional commit style: +``` +feat(docs): add in-app documentation browser +fix(ble): handle reconnection timeout +refactor(navigation): migrate to typed routes +test(search): add keyword ranking tests +``` + +## Pull Request Checklist + +Before submitting: +- [ ] Code compiles on all targets: `./gradlew kmpSmokeCompile` +- [ ] All tests pass: `./gradlew allTests` +- [ ] Code style passes: `./gradlew spotlessCheck` +- [ ] Static analysis passes: `./gradlew detekt` +- [ ] New code has appropriate test coverage +- [ ] No `android.*` imports in `commonMain` +- [ ] Koin modules registered if new DI is added +- [ ] Routes added to `Routes.kt` if new navigation is introduced +- [ ] Documentation updated if user-facing behavior changes + +## Code Style + +- **Formatting:** Enforced by Spotless (KtLint rules) +- **Static analysis:** Detekt with project-specific configuration +- **Imports:** No wildcard imports; organized automatically by Spotless +- **Line length:** 120 characters maximum + +Run formatting: +```bash +./gradlew spotlessApply +``` + +## Architecture Rules + +- Feature modules must not depend on other feature modules +- `commonMain` must not contain `android.*`, `java.io.*`, or platform-specific imports +- Prefer interface + DI over `expect`/`actual` for complex platform behaviors +- All navigation routes must be `@Serializable` and defined in `Routes.kt` +- Use Koin annotations (`@Single`, `@Factory`, `@Module`) for dependency injection + +## Verification + +Full pre-merge verification: +```bash +./gradlew spotlessCheck detekt kmpSmokeCompile test allTests +``` + +For docs-specific changes, also run: +```bash +./gradlew generateDocsBundle validateDocsBundle +``` + +## Getting Help + +- [Meshtastic Discord](https://discord.gg/meshtastic) — `#app-development` channel +- GitHub Issues — for bug reports and feature requests +- GitHub Discussions — for questions and ideas + +--- + diff --git a/docs/developer/measurement.md b/docs/developer/measurement.md new file mode 100644 index 000000000..83eceac3a --- /dev/null +++ b/docs/developer/measurement.md @@ -0,0 +1,166 @@ +--- +title: Measurement & Formatting +nav_order: 9 +last_updated: 2026-05-13 +aliases: + - measurement + - metric-formatter + - number-formatter +--- + +# Measurement & Formatting + +How the Meshtastic Android/KMP app formats numbers, units, and locale-sensitive values. + +--- + +## Overview + +All measurement data transmitted by Meshtastic radios uses **metric units** (meters, °C, hPa, m/s, etc.). The app converts and formats these values for display using two core utilities: + +| Utility | Location | Purpose | +|---|---|---| +| `MetricFormatter` | `core/common/.../util/MetricFormatter.kt` | Converts and formats physical measurements (temperature, pressure, speed, etc.) | +| `NumberFormatter` | `core/common/.../util/NumberFormatter.kt` | Low-level fixed-point number formatting with locale-independent dot separator | + +Both live in `org.meshtastic.core.common.util` and are available to all KMP targets (Android, Desktop, iOS). + +--- + +## MetricFormatter API + +`MetricFormatter` is a Kotlin `object` with pure functions for each measurement type: + +```kotlin +object MetricFormatter { + fun temperature(celsius: Float, isFahrenheit: Boolean): String + fun voltage(volts: Float, decimalPlaces: Int = 2): String + fun current(milliAmps: Float, decimalPlaces: Int = 1): String + fun percent(value: Float, decimalPlaces: Int = 1): String + fun humidity(value: Float): String + fun pressure(hPa: Float, decimalPlaces: Int = 1): String + fun snr(value: Float, decimalPlaces: Int = 1): String + fun rssi(value: Int): String + fun windSpeed(metersPerSecond: Float, decimalPlaces: Int = 1): String + fun rainfall(millimeters: Float, decimalPlaces: Int = 1): String +} +``` + +### Usage + +```kotlin +// Temperature — Fahrenheit conversion is handled automatically +MetricFormatter.temperature(22.5f, isFahrenheit = true) // "72.5°F" +MetricFormatter.temperature(22.5f, isFahrenheit = false) // "22.5°C" + +// Signal metrics +MetricFormatter.snr(-5.2f) // "-5.2 dB" +MetricFormatter.rssi(-97) // "-97 dBm" + +// Environment +MetricFormatter.pressure(1013.25f) // "1013.3 hPa" +MetricFormatter.humidity(65.0f) // "65%" +MetricFormatter.windSpeed(3.7f) // "3.7 m/s" +MetricFormatter.rainfall(12.3f) // "12.3 mm" + +// Power +MetricFormatter.voltage(3.95f) // "3.95 V" +MetricFormatter.current(125.0f) // "125.0 mA" +``` + +--- + +## NumberFormatter + +`NumberFormatter` provides locale-independent decimal formatting using pure arithmetic (no `String.format` or `DecimalFormat`): + +```kotlin +object NumberFormatter { + fun format(value: Double, decimalPlaces: Int): String + fun format(value: Float, decimalPlaces: Int): String +} +``` + +> **Why locale-independent?** Meshtastic is a mesh networking app where consistency matters — sensor readings shared between nodes should look the same everywhere. `NumberFormatter` always uses `.` as the decimal separator. + +--- + +## Temperature Conversion + +Temperature is the only measurement that performs a unit conversion. The `isFahrenheit` flag is typically sourced from the user's device locale or preferences: + +``` +°F = °C × 1.8 + 32 +``` + +All other measurements display in their native metric units. The user-facing `units-and-locale.md` page explains what end users see. + +--- + +## Adding a New Measurement Type + +To add a new measurement formatter: + +1. **Add a function to `MetricFormatter`** in `core/common/src/commonMain/kotlin/org/meshtastic/core/common/util/MetricFormatter.kt`: + + ```kotlin + fun radiation(microSieverts: Float, decimalPlaces: Int = 2): String = + "${NumberFormatter.format(microSieverts, decimalPlaces)} μSv/h" + ``` + +2. **Add tests** in `core/common/src/commonTest/`: + + ```kotlin + @Test + fun radiationFormatting() { + assertEquals("0.15 μSv/h", MetricFormatter.radiation(0.15f)) + assertEquals("1.23 μSv/h", MetricFormatter.radiation(1.234f)) + } + ``` + +3. **Use in UI** — call from any `commonMain` composable or ViewModel: + + ```kotlin + Text(text = MetricFormatter.radiation(node.radiationLevel)) + ``` + +4. **Run verification**: + ```bash + ./gradlew :core:common:allTests + ``` + +--- + +## DateFormatter + +Date and time formatting uses the `DateFormatter` interface with platform-specific implementations: + +| Function | Output Example | +|---|---| +| `formatRelativeTime()` | "5 min ago" | +| `formatDateTime()` | "May 13, 2026 2:30 PM" | +| `formatShortDate()` | "May 13" | +| `formatTime()` | "2:30 PM" | +| `formatTimeWithSeconds()` | "2:30:45 PM" | +| `formatDate()` | "2026-05-13" | + +Unlike `MetricFormatter`, `DateFormatter` is an **interface** with platform `expect`/`actual` implementations because date formatting inherently depends on platform locale APIs. + +--- + +## Design Decisions + +| Decision | Rationale | +|---|---| +| Locale-independent decimal separator (`.`) | Mesh data shared between nodes must be consistent | +| Pure arithmetic formatting (no `DecimalFormat`) | Works identically on JVM, Native, and JS targets | +| Temperature is the only converted unit | All other metric units are universally understood in their native form | +| `object` singleton pattern | Stateless utility — no instance management needed | + +--- + +## Related + +- **User-facing docs**: `docs/user/units-and-locale.md` explains what end users see +- **Source code**: `core/common/src/commonMain/kotlin/org/meshtastic/core/common/util/MetricFormatter.kt` +- **Tests**: `core/common/src/commonTest/kotlin/org/meshtastic/core/common/util/MetricFormatterTest.kt` diff --git a/docs/developer/navigation-and-deep-links.md b/docs/developer/navigation-and-deep-links.md new file mode 100644 index 000000000..08622c60a --- /dev/null +++ b/docs/developer/navigation-and-deep-links.md @@ -0,0 +1,121 @@ +--- +title: Navigation & Deep Links +nav_order: 4 +last_updated: 2026-05-13 +aliases: + - deeplinks + - navigation-3 + - routes +--- + +# Navigation & Deep Links + +The app uses **Navigation 3** with typed, serializable routes and centralized deep link resolution. + +## Route Architecture + +All routes are defined in `core/navigation/src/commonMain/kotlin/org/meshtastic/core/navigation/Routes.kt`. + +### Route Hierarchy + +```kotlin +interface Route : NavKey // All routes implement NavKey +interface Graph : Route // Graph roots for navigation hierarchies + +@Serializable +sealed interface SettingsRoute : Route { + @Serializable data class SettingsGraph(val destNum: Int?) : SettingsRoute, Graph + @Serializable data object DeviceConfiguration : SettingsRoute + @Serializable data object HelpDocs : SettingsRoute + @Serializable data class HelpDocPage(val pageId: String) : SettingsRoute + // ... +} +``` + +### Conventions + +- Routes are `@Serializable` for state restoration +- Use `data object` for routes without parameters +- Use `data class` for parameterized routes +- Group related routes under a `sealed interface` +- Graph entry points implement both the route interface and `Graph` + +## Deep Link Router + +`DeepLinkRouter` in `core/navigation` maps URI deep links to typed backstack lists. + +### URI Format + +``` +meshtastic://meshtastic/{path} +``` + +### Supported Deep Links + +| URI Path | Route | Notes | +|----------|-------|-------| +| `/settings` | `SettingsRoute.SettingsGraph(null)` | Settings root | +| `/settings/helpDocs` | `SettingsRoute.HelpDocs` | Docs browser | +| `/settings/helpDocs/{pageId}` | `SettingsRoute.HelpDocPage(pageId)` | Specific doc page | +| `/settings/help-docs` | `SettingsRoute.HelpDocs` | Compatibility alias | +| `/nodes` | `NodesRoute.Nodes` | Node list | +| `/nodes/{destNum}` | `NodesRoute.NodeDetail(destNum)` | Node detail | +| `/messages/{contactKey}` | `ContactsRoute.Messages(contactKey)` | Conversation | +| `/map` | `MapRoute.Map(null)` | Map view | + +### Backstack Synthesis + +Deep links synthesize a full backstack, not just the target screen: + +```kotlin +// /settings/helpDocs/messages-and-channels produces: +listOf( + SettingsRoute.SettingsGraph(null), + SettingsRoute.HelpDocs, + SettingsRoute.HelpDocPage("messages-and-channels"), +) +``` + +This ensures the user can navigate "up" correctly. + +## Adding a Deep Link + +1. Define the typed route in `Routes.kt`. +2. Add the mapping in `DeepLinkRouter.settingsSubRoutes` (or equivalent for other graphs). +3. Add a test in `DeepLinkRouterTest.kt`. +4. Register the navigation entry in the appropriate feature module. + +## Navigation Entry Registration + +Each feature module provides entries via an extension function: + +```kotlin +fun EntryProviderScope<*>.docsEntries(backStack: NavBackStack) { + entry { DocsBrowserScreen(backStack) } + entry { DocsPageRouteScreen(it.pageId, backStack) } +} +``` + +These are called from the settings navigation composition. + +## Testing + +Deep link routing is tested in: +``` +core/navigation/src/commonTest/kotlin/org/meshtastic/core/navigation/DeepLinkRouterTest.kt +``` + +Example: +```kotlin +@Test +fun `help docs deep link routes correctly`() { + val result = DeepLinkRouter.route(CommonUri.parse("meshtastic://meshtastic/settings/helpDocs")) + assertEquals( + listOf(SettingsRoute.SettingsGraph(null), SettingsRoute.HelpDocs), + result, + ) +} +``` + +--- + diff --git a/docs/developer/persistence.md b/docs/developer/persistence.md new file mode 100644 index 000000000..9b42538e9 --- /dev/null +++ b/docs/developer/persistence.md @@ -0,0 +1,84 @@ +--- +title: Persistence +nav_order: 6 +last_updated: 2026-05-13 +aliases: + - room + - database + - datastore + - prefs +--- + +# Persistence + +How the Meshtastic app stores data across different mechanisms. + +## Room KMP Database + +**Module:** `core:database` + +The primary structured data store: +- Node information and history +- Message history +- Waypoints +- Telemetry data +- Channel configurations + +### Key Points + +- Uses Room KMP for cross-platform compatibility +- Migrations managed through Room's built-in migration system +- DAO interfaces live in `core:database` +- Repository layer in `core:repository` provides the public API + +### What's Stored in Room + +| Entity | Description | +|--------|-------------| +| Nodes | All known mesh nodes and metadata | +| Messages | Message history (channel and direct) | +| Waypoints | Shared geographic points | +| Telemetry | Device, environment, power metrics | +| Channels | Channel configurations | + +## DataStore Preferences + +**Module:** `core:datastore` + +For lightweight key-value preferences: +- Connection state +- Last connected device +- UI preferences + +## Core Prefs + +**Module:** `core:prefs` + +Higher-level preferences abstraction: +- User-facing settings +- App behavior configuration +- Feature toggles + +## What Docs Intentionally Skip + +The `feature:docs` module does **not** use Room or any persistent database: +- Documentation content is packaged as build-time assets +- The docs corpus is versioned with the app binary +- No migration story is needed for docs content +- Optional UX state (last viewed page) could use `core:prefs` but is not part of the docs data model + +This is an intentional design decision to keep documentation: +- Fully offline without database overhead +- Replaceable with each app update +- Simple to validate and test + +## Best Practices + +- Use Room for structured, queryable data that changes at runtime +- Use DataStore for simple preferences and state +- Use bundled resources/assets for static content +- Never store sensitive data (keys, passwords) in plain Room tables +- Always provide migrations for schema changes + +--- + diff --git a/docs/developer/testing.md b/docs/developer/testing.md new file mode 100644 index 000000000..816ab6527 --- /dev/null +++ b/docs/developer/testing.md @@ -0,0 +1,121 @@ +--- +title: Testing +nav_order: 7 +last_updated: 2026-05-13 +aliases: + - tests + - unit-tests + - screenshot-tests +--- + +# Testing + +Testing strategy and practices for the Meshtastic KMP project. + +## Test Categories + +### KMP Unit Tests (`commonTest`) + +Shared tests that run on all platforms: + +```bash +./gradlew allTests +``` + +- Business logic tests +- Data model validation +- Search/ranking algorithm tests +- Route serialization tests + +### Android Host Tests + +Android-specific tests that run on JVM: + +```bash +./gradlew test +``` + +- ViewModel tests +- Repository tests with Room fakes +- Android-specific integration tests + +### Compose UI Tests + +Compose Multiplatform UI test framework: + +```kotlin +@Test +fun myScreenTest() = runComposeUiTest { + setContent { MyScreen() } + onNodeWithText("Expected").assertIsDisplayed() +} +``` + +Located in `commonTest` or `jvmTest` source sets. + +### Screenshot Tests + +Preferred: **Roborazzi** (Gradle-native, Ubuntu CI compatible) +Fallback: **Paparazzi** (Android-view-centric) + +```bash +./gradlew recordDocsScreenshots # Record golden images +./gradlew verifyDocsScreenshots # Compare against goldens +``` + +## Test Organization + +``` +feature/my-feature/src/ +├── commonTest/kotlin/org/meshtastic/feature/myfeature/ +│ ├── MyBusinessLogicTest.kt +│ └── MyModelTest.kt +└── jvmTest/kotlin/org/meshtastic/feature/myfeature/ + └── MyDesktopSpecificTest.kt +``` + +## Testing Guidelines + +### DO + +- Write tests in `commonTest` when possible (runs everywhere) +- Test business logic independently from UI +- Use fakes/stubs instead of mocks where practical +- Test edge cases: empty states, error states, boundary values +- Test deep link routing in `DeepLinkRouterTest` +- Keep tests fast — no network, no disk I/O in unit tests + +### DON'T + +- Don't test framework behavior (Compose internals, Room queries) +- Don't create tests that depend on other feature modules +- Don't use `Thread.sleep` — use coroutine test dispatchers +- Don't rely on test execution order + +## Running Tests + +```bash +# All KMP tests +./gradlew allTests + +# Specific module +./gradlew :feature:docs:allTests + +# Code quality +./gradlew spotlessCheck detekt + +# Full verification +./gradlew spotlessCheck detekt kmpSmokeCompile test allTests +``` + +## CI Integration + +Tests run automatically on: +- Pull request creation/update +- Push to `main` +- Pre-release validation + +The CI workflow uses `ubuntu-24.04` with JDK 21 and Gradle caching. + +--- + diff --git a/docs/developer/transport.md b/docs/developer/transport.md new file mode 100644 index 000000000..15467f0ba --- /dev/null +++ b/docs/developer/transport.md @@ -0,0 +1,98 @@ +--- +title: Transport +nav_order: 5 +last_updated: 2026-05-13 +aliases: + - ble + - serial + - tcp + - radio-transport +--- + +# Transport + +Meshtastic communicates between the app and radio hardware through multiple transport mechanisms. + +## Transport Abstraction + +The transport layer is abstracted through interfaces in `core/network` and `core/ble`, allowing the app to work identically regardless of the underlying connection type. + +``` +App ← RadioController → Transport (BLE | Serial | TCP) +``` + +## Bluetooth Low Energy (BLE) + +**Module:** `core:ble` +**Platforms:** Android, (planned: iOS) + +The primary transport for Android mobile devices: +- Service discovery for Meshtastic GATT services +- Characteristic-based read/write for protobuf packets +- Connection state management and automatic reconnection +- MTU negotiation for optimal packet sizes + +### Key Classes + +- `core/ble/` — BLE scanning, connection, and GATT operations +- Platform-specific implementations in `androidMain` + +## USB Serial + +**Module:** `core:network` +**Platforms:** Android (OTG), Desktop + +Serial communication over USB: +- Uses `usb-serial-for-android` library on Android +- Direct serial port access on Desktop (JVM) +- Probe table for supported USB vendor/product IDs +- Automatic detection when USB device is connected + +### Key Classes + +- Serial prober and transport factory in `core/network` +- Desktop-specific serial in `desktop/src/main/kotlin/.../radio/` + +## TCP/IP + +**Module:** `core:network` +**Platforms:** Android, Desktop, iOS + +Network-based transport for WiFi-enabled radios: +- TCP socket connection to radio's IP address +- Default port: 4403 +- Used for development with simulated radios +- Available when BLE/USB is impractical + +## Transport Factory + +The `RadioTransportFactory` interface abstracts transport creation: + +```kotlin +interface RadioTransportFactory { + fun createTransport(config: TransportConfig): RadioTransport +} +``` + +Platform-specific implementations: +- **Android:** Supports BLE + USB + TCP +- **Desktop:** Supports USB + TCP (no BLE) +- **iOS:** Planned BLE + TCP + +## Connection Lifecycle + +1. **Discovery** — Scan for available radios (BLE scan / USB detect / manual TCP) +2. **Connection** — Establish link to selected radio +3. **Handshake** — Exchange node info and configuration +4. **Active** — Normal message exchange +5. **Disconnection** — Clean teardown or error recovery + +## Adding a New Transport + +1. Implement `RadioTransport` interface +2. Register in platform-specific `RadioTransportFactory` +3. Add connection UI in `feature:connections` +4. Update DI bindings for the platform + +--- + diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 000000000..35d3f7064 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,30 @@ +--- +title: Home +layout: default +nav_order: 0 +--- + +# Meshtastic Android App Documentation + +User and developer documentation for the Meshtastic Android, Desktop, and iOS applications powered by KMP (Kotlin Multiplatform). + +Use the sidebar navigation to browse the **User Guide** for app features and the **Developer Guide** for contributing to the project. + +--- + +## Quick Links + +| Guide | Description | +|-------|-------------| +| [Getting Started](user/onboarding) | Connect your first radio and send a message | +| [Messages & Channels](user/messages-and-channels) | Channel broadcasts, direct messages, reactions, and encryption | +| [Nodes](user/nodes) | Understanding the mesh network node list | +| [Signal Meter](user/signal-meter) | How the LoRa signal quality meter works | +| [Units & Locale](user/units-and-locale) | How temperatures, distances, and times adapt to your region | +| [Desktop App](user/desktop) | Linux, macOS, and Windows desktop usage | +| [Architecture](developer/architecture) | App architecture overview for contributors | +| [Contributing](developer/contributing) | Branch naming, PR workflow, and verification commands | + +--- + +> This documentation is served from the same markdown source that powers the in-app **Help & Documentation** browser. diff --git a/docs/translations.md b/docs/translations.md new file mode 100644 index 000000000..347d70d00 --- /dev/null +++ b/docs/translations.md @@ -0,0 +1,56 @@ +--- +title: Translations +layout: default +nav_order: 99 +--- + +# Translations + +This documentation is translated by the community via [Crowdin](https://crowdin.com/project/meshtastic-android). Translations appear here automatically as volunteers contribute them. + +## Available Languages + +{% for locale in site.data.locales %} +{% assign locale_code = locale[0] %} +{% assign locale_info = locale[1] %} +{% assign locale_index = locale_code | append: "/index.md" %} +{% assign has_content = false %} +{% for p in site.pages %} + {% if p.path contains locale_code %} + {% assign has_content = true %} + {% break %} + {% endif %} +{% endfor %} + +{% if has_content %} +- [{{ locale_info.name }}]({{ locale_code }}/) ({{ locale_code }}) +{% endif %} +{% endfor %} + +{% comment %} Show notice if no translations exist yet {% endcomment %} +{% assign any_locale_exists = false %} +{% for locale in site.data.locales %} + {% assign locale_code = locale[0] %} + {% for p in site.pages %} + {% if p.path contains locale_code %} + {% assign any_locale_exists = true %} + {% break %} + {% endif %} + {% endfor %} + {% if any_locale_exists %}{% break %}{% endif %} +{% endfor %} + +{% unless any_locale_exists %} +> No translations available yet. Want to help? [Join our Crowdin project →](https://crowdin.com/project/meshtastic-android) +{% endunless %} + +--- + +## Contributing Translations + +1. Visit [Crowdin](https://crowdin.com/project/meshtastic-android) +2. Select a language +3. Translate the User Guide documentation files +4. Translations are automatically synced to this site via PR + +Translation coverage and quality are tracked per-language. Pages without full translation show the English original for untranslated sections. diff --git a/docs/user.md b/docs/user.md new file mode 100644 index 000000000..72fcfbf5b --- /dev/null +++ b/docs/user.md @@ -0,0 +1,38 @@ +--- +title: User Guide +layout: default +nav_order: 1 +has_children: true +parent: "" +--- + +# User Guide + +Documentation for using the Meshtastic Android and Desktop app. + +--- + +## What's New in the Docs + + + + +**May 2026** — [Translate the App](user/translate) — New page explaining how to contribute translations to the Meshtastic app via Crowdin. + +**May 2026** — [Units & Locale](user/units-and-locale) — New page explaining how the app automatically adapts temperatures, distances, speeds, and times to your device's regional settings. + +**May 2026** — [Signal Meter](user/signal-meter) — New page explaining how the LoRa signal quality meter works, why negative SNR values are normal, and how to interpret RSSI vs. SNR. + +**May 2026** — [Messages & Channels](user/messages-and-channels) — Added reactions, message actions, and delivery retry documentation. + +**May 2026** — [Nodes](user/nodes) — Corrected filtering and sorting documentation to match actual app capabilities (7 sort options, 6 filter toggles). + +**May 2026** — [Desktop App](user/desktop) — Added keyboard shortcuts table and confirmed system tray support. + +**May 2026** — [Getting Started](user/onboarding) — Added Critical Alerts permission screen and expanded permission explanations. + + + diff --git a/docs/user/connections.md b/docs/user/connections.md new file mode 100644 index 000000000..574433b50 --- /dev/null +++ b/docs/user/connections.md @@ -0,0 +1,113 @@ +--- +title: Connections +nav_order: 2 +last_updated: 2026-05-13 +description: Connect your phone or desktop to a Meshtastic radio via Bluetooth, USB, or TCP/IP. +aliases: + - bluetooth + - usb + - tcp + - pairing +--- + +# Connections + +Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node. + +## Bluetooth (BLE) + +Bluetooth Low Energy is the default and most common connection method on Android. + +### Pairing a Device + +1. Ensure your Meshtastic radio is powered on and in pairing mode. +2. Open the app and navigate to **Connections**. +3. Tap **Scan for Devices** — nearby Meshtastic radios will appear. +4. Select your device from the list. +5. Accept the Bluetooth pairing prompt if shown. + +![Device list item](/assets/screenshots/connections_bluetooth_scan.png) + +You can filter devices by transport type using the filter chips at the top: + +![Transport filter chips](/assets/screenshots/connections_transport_filters.png) + +> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. + +### Connection Status + +| Icon | State | Description | +|------|-------|-------------| +| 🟢 | Connected | Active radio link established | +| 🟡 | Connecting | Handshake in progress | +| 🔴 | Disconnected | No active connection | +| ⚪ | Not configured | No device selected | + +When connecting, a status indicator shows the current connection state: + +![Connecting status](/assets/screenshots/connections_connecting.png) + +If no devices are found, the app shows an empty state with instructions: + +![No devices found](/assets/screenshots/connections_empty_state.png) + +### Troubleshooting Bluetooth + +- **Device not found:** Toggle Bluetooth off/on, ensure location is enabled. +- **Connection drops:** Move closer to the radio; check for interference. +- **Pairing rejected:** Forget the device in Android Bluetooth settings and retry. + +## USB Serial + +USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable. + +### Setup + +1. Connect your radio via USB cable to your device. +2. The app will prompt for USB permission — tap **Allow**. +3. The connection is established automatically. + +> ⚠️ **Note:** USB connections require OTG support on Android devices. + +## TCP/IP (WiFi) + +Some Meshtastic radios support WiFi connectivity, allowing TCP-based connections. + +### Configuration + +1. Connect your radio to a WiFi network via the radio's web interface or settings. +2. In the app, go to **Connections → TCP**. +3. Enter the radio's IP address and port (default: 4403). +4. Tap **Connect**. + +### When to Use TCP + +- Radio is on the same local network +- Testing with a simulated radio +- Environments where Bluetooth has interference issues + +## Connection Priority + +The app attempts connections in this order: +1. Last successful Bluetooth device +2. USB (if detected) +3. Manual TCP (if configured) + +## Desktop Connections + +On Desktop (Linux/macOS/Windows), the app supports: +- **USB Serial** — primary connection method +- **TCP/IP** — for network-connected radios +- Bluetooth is **not** currently supported on Desktop + +See [Desktop App](desktop) for platform-specific details and keyboard shortcuts. + +## Related Topics + +- [Getting Started](onboarding) — first-launch setup and permissions +- [Settings — Radio & User](settings-radio-user) — Bluetooth and network configuration +- [Desktop App](desktop) — desktop-specific connection details +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — full list of compatible radios on meshtastic.org + +--- + diff --git a/docs/user/desktop.md b/docs/user/desktop.md new file mode 100644 index 000000000..2734b9ab3 --- /dev/null +++ b/docs/user/desktop.md @@ -0,0 +1,128 @@ +--- +title: Desktop App +nav_order: 14 +last_updated: 2026-05-13 +description: Install and use the Meshtastic Desktop app on Linux, macOS, and Windows — connections, feature parity, and keyboard shortcuts. +aliases: + - desktop + - linux + - macos + - windows + - jvm +--- + +# Desktop App + +The Meshtastic Desktop application provides the same mesh communication features on Linux, macOS, and Windows. + +## Overview + +The Desktop app shares its core codebase with the Android app through Kotlin Multiplatform (KMP). Most features work identically across platforms. + +## Installation + +### Linux + +- Download the `.deb` or `.AppImage` package from the releases page +- Or build from source using `./gradlew :desktop:run` + +### macOS + +- Download the `.dmg` package from releases +- Or build from source + +### Windows + +- Download the `.msi` installer from releases +- Or build from source + +## Connecting Your Radio + +### USB Serial (Primary) + +The most reliable connection method on Desktop: + +1. Connect your Meshtastic radio via USB cable. +2. The app should detect the serial port automatically. +3. If not detected, select the correct serial port from the connections menu. + +### TCP/IP + +For network-connected radios: + +1. Enter the radio's IP address and port (default: 4403). +2. Click **Connect**. + +### Bluetooth + +> ⚠️ **Note:** Bluetooth is not currently supported on the Desktop app. Use USB or TCP connections. + +## Feature Parity + +| Feature | Android | Desktop | Notes | +|---------|---------|---------|-------| +| Messaging | ✓ | ✓ | Full parity | +| Node List | ✓ | ✓ | Full parity | +| Map | ✓ | ✓ | Full parity | +| Settings | ✓ | ✓ | Full parity | +| Bluetooth | ✓ | ✗ | USB/TCP on desktop | +| Firmware Update OTA | ✓ | ✗ | Use web flasher | +| Notifications | ✓ | ✓ | Native OS notifications | +| Widgets | ✓ | ✗ | Android-only | +| AI Assistant (Chirpy) | ✓* | ✗ | Google flavor Android only | + +*Chirpy AI requires Android 14+ on Google flavor builds with supported hardware. + +## UI Differences + +The Desktop app uses the same Compose Multiplatform UI with adaptations for larger screens and desktop interaction. + +### Keyboard Shortcuts + +| Shortcut | Action | +|----------|--------| +| **⌘Q** / **Ctrl+Q** | Quit the application | +| **⌘,** / **Ctrl+,** | Open Settings | +| **⌘1** / **Ctrl+1** | Switch to Conversations tab | +| **⌘2** / **Ctrl+2** | Switch to Nodes tab | +| **⌘3** / **Ctrl+3** | Switch to Map tab | +| **⌘4** / **Ctrl+4** | Switch to Connections tab | + +### Window & System Tray + +- **Window resizing** — responsive layout adapts to window dimensions +- **System tray** — minimize to system tray for background mesh operation +- **Tray menu** — right-click the tray icon to show window or quit +- **Mouse interaction** — hover states and standard desktop navigation + +### Notification Preferences + +The Desktop app provides in-app toggles for controlling which notifications are shown — messages, new nodes, and low battery alerts. Access these from **Settings → Notifications** within the app. + +## Building from Source + +```bash +git clone https://github.com/meshtastic/Meshtastic-Android.git +cd Meshtastic-Android +git submodule update --init +./gradlew :desktop:run +``` + +Requirements: +- JDK 21 +- No Android SDK required for desktop-only builds + +## Known Limitations + +- No Bluetooth support +- No OTA firmware updates (use web flasher) +- Some Android-specific features (widgets, specific notification channels) are unavailable +- Performance may vary on low-spec hardware running Compose Desktop + +## Related Topics + +- [Connections](connections) — connection methods overview +- [Firmware Updates](firmware) — use the [Web Flasher](https://flasher.meshtastic.org) for desktop firmware updates + +--- + diff --git a/docs/user/discovery.md b/docs/user/discovery.md new file mode 100644 index 000000000..55c5d8d34 --- /dev/null +++ b/docs/user/discovery.md @@ -0,0 +1,114 @@ +--- +title: Discovery +nav_order: 12 +last_updated: 2026-05-13 +description: Explore your mesh network — traceroute paths, neighbor maps, and node discovery tools. +aliases: + - mesh-discovery + - local-discovery + - network-scan + - traceroute + - neighbor-info +--- + +# Discovery + +Discovery tools help you understand **how** your mesh network is connected — which nodes can hear each other, what paths messages take, and where bottlenecks or weak links exist. + +> 💡 **Tip:** You don't need a dedicated "discovery mode" to start exploring your mesh. The tools below are available right now from the node list and node detail screens. + +--- + +## Traceroute + +Traceroute reveals the exact path a message takes from your node to any other node on the mesh. It's the single most useful tool for debugging connectivity problems. + +### Running a Traceroute + +1. Navigate to **Nodes** and tap the node you want to trace. +2. On the node detail screen, tap **Traceroute**. +3. The app sends a traceroute request and waits for the response. +4. Results display each hop in order, with signal quality at every step. + +### Reading the Results + +A traceroute result looks like this: + +``` +You → Node A (SNR: 8.5, RSSI: -95) → Node B (SNR: 5.2, RSSI: -108) → Target +``` + +Each hop represents a relay node that forwarded the message. The SNR and RSSI values at each hop tell you about the link quality on that specific segment. + +| What to look for | What it means | +|------------------|---------------| +| All hops show Good SNR (> 5 dB) | Healthy path — messages flow reliably | +| One hop shows Bad SNR (< 0 dB) | Weak link — this relay segment is fragile | +| Many hops (4+) | Long path — consider repositioning a node to shorten it | +| Different path on retry | Mesh is adapting — multiple routes exist (this is good!) | + +> 💡 **Tip:** Run traceroute several times over a few minutes. If the path changes, your mesh has redundant routes — a sign of a well-connected network. + +### Troubleshooting with Traceroute + +- **"No route found"** — The target node may be offline, out of range, or on a different channel. Check that both nodes share at least one channel with the same encryption key. +- **Traceroute times out** — The path may be too long (exceeds hop limit) or a relay node is congested. Try increasing the hop limit in **Settings → LoRa Config**. +- **Asymmetric paths** — A traceroute from A→B may take a different path than B→A. This is normal — radio propagation is not always symmetric. + +--- + +## Neighbor Info + +The Neighbor Info module lets each node broadcast a list of the nodes it can **directly hear** (single-hop). When multiple nodes share their neighbor lists, you can piece together a topology map of the entire mesh. + +### Enabling Neighbor Info + +1. Navigate to **Settings → Module Config → Neighbor Info**. +2. Enable the module. +3. Set the broadcast interval (default: 900 seconds / 15 minutes). + +Once enabled, your node periodically broadcasts its neighbor table. Other nodes with Neighbor Info enabled do the same. + +### Viewing Neighbor Data + +- Open any node's detail screen and look for the **Neighbors** section. +- Each neighbor entry shows the node that was directly heard and its signal quality. +- Combine neighbor data from multiple nodes to understand the full mesh topology. + +> ⚠️ **Note:** Neighbor Info increases airtime usage because every enabled node periodically broadcasts its neighbor list. On busy meshes with many nodes, consider longer broadcast intervals (3600 seconds or more) to avoid congestion. + +--- + +## Node List as a Discovery Tool + +The node list itself is a powerful discovery tool when you use its filtering and sorting features effectively. + +### Finding New Nodes + +- Sort by **Last heard** to see the most recently active nodes at the top. +- Enable **Include unknown** to see nodes that have appeared on the mesh but haven't sent user info yet — these are often newly powered-on devices. + +### Assessing Connectivity + +- Sort by **Hops away** to see which nodes are directly reachable (0 hops) versus relayed. +- Sort by **Distance** to find nearby nodes and verify they're reachable. +- Use **Exclude MQTT** to focus on nodes reachable over radio (not via internet bridge). + +### Infrastructure Audit + +- Disable **Exclude infrastructure** to see Router, Repeater, and Router Client nodes. +- Check their signal quality and last-heard times to verify your infrastructure nodes are healthy. + +See [Nodes](nodes) for full details on filtering and sorting options. + +--- + +## Tips for Mesh Exploration + +- **Start with traceroute** — it gives you immediate, actionable information about a specific path. +- **Enable Neighbor Info on key nodes** — especially routers and repeaters, to build a picture of the backbone. +- **Check the map** — node positions on the [Map](map-and-waypoints) combined with signal data help you understand why some links are strong and others are weak. +- **Compare signal over time** — use the [Signal Meter](signal-meter) guide to interpret SNR and RSSI values correctly. + +--- + diff --git a/docs/user/firmware.md b/docs/user/firmware.md new file mode 100644 index 000000000..05fc04169 --- /dev/null +++ b/docs/user/firmware.md @@ -0,0 +1,106 @@ +--- +title: Firmware Updates +nav_order: 13 +last_updated: 2026-05-13 +description: Update your radio firmware over Bluetooth — OTA process, version channels, pre-flight checks, and recovery. +aliases: + - firmware + - update + - ota + - flash +--- + +# Firmware Updates + +Keep your Meshtastic radio up to date with the latest firmware for new features, bug fixes, and security improvements. + +## Checking for Updates + +1. Navigate to **Settings → Firmware Update** or tap the firmware notification if shown. +2. The app checks for available firmware versions. +3. Available updates show the version number and changelog summary. + +## Update Methods + +### OTA (Over-The-Air) via Bluetooth + +The most common update method for Android users: + +1. Ensure your radio is connected via Bluetooth. +2. Navigate to the Firmware Update screen. +3. Select the desired firmware version. +4. Tap **Update** to begin the OTA process. +5. Wait for the update to complete — **do not disconnect** during the update. + +![Firmware checking for updates](/assets/screenshots/firmware_checking.png) + +> ⚠️ **Warning:** Interrupting a firmware update can brick your device. Ensure your radio has sufficient battery (>50% recommended) and maintain Bluetooth proximity during the entire process. + +![Firmware disclaimer](/assets/screenshots/firmware_disclaimer.png) + +### USB Flashing + +For recovery or when OTA is unavailable: +- Use the [Meshtastic Web Flasher](https://flasher.meshtastic.org) +- Or the [Meshtastic CLI tool](https://meshtastic.org/docs/getting-started/flashing-firmware) on desktop + +## Version Channels + +| Channel | Description | +|---------|-------------| +| Stable | Recommended for most users; tested releases | +| Alpha | Preview releases; may contain bugs | + +## Pre-Update Checklist + +Before updating: +- [ ] Battery > 50% +- [ ] Stable Bluetooth connection +- [ ] Note your current settings (they may reset on major version changes) +- [ ] Check the release notes for breaking changes + +## Post-Update + +After a successful update: +- The radio will reboot automatically +- Bluetooth connection will re-establish +- Verify your settings are intact +- Check the firmware version in **Settings → About** + +![Firmware update success](/assets/screenshots/firmware_success.png) + +## Troubleshooting + +### Update Stuck + +If the update appears frozen: +- Wait at least 5 minutes before intervening +- If truly stuck, power-cycle the radio +- Attempt the update again + +### Device Won't Boot After Update + +If your device fails to boot: +1. Try connecting via USB to a computer +2. Use the web flasher in recovery/DFU mode +3. Flash a known-good firmware version +4. Check the Meshtastic Discord for device-specific recovery steps + +### Compatibility Warnings + +The app may show warnings when: +- Connected radio firmware is below minimum supported version +- Major version mismatch between app and firmware +- Deprecated features need migration + +> ⚠️ **Important:** Always update the Meshtastic app before or alongside firmware updates to ensure compatibility. + +## Related Topics + +- [Connections](connections) — reconnecting after a firmware update +- [Flashing firmware guide](https://meshtastic.org/docs/getting-started/flashing-firmware) — full firmware flashing walkthrough on meshtastic.org +- [Supported devices](https://meshtastic.org/docs/hardware/devices) — check firmware compatibility by device +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/user/map-and-waypoints.md b/docs/user/map-and-waypoints.md new file mode 100644 index 000000000..7f9e8f1dc --- /dev/null +++ b/docs/user/map-and-waypoints.md @@ -0,0 +1,111 @@ +--- +title: Map & Waypoints +nav_order: 6 +last_updated: 2026-05-13 +description: View node positions on the map, create and share waypoints, and manage position sharing and privacy. +aliases: + - map + - waypoints + - gps + - location +--- + +# Map & Waypoints + +The Map screen shows the geographic positions of nodes on your mesh, along with shared waypoints. + +## Map View + +The map displays: +- **Node positions** — colored markers for each node reporting location +- **Waypoints** — shared points of interest +- **Your position** — your current GPS location + +### Node Markers + +Node markers on the map indicate: +| Color | Meaning | +|-------|---------| +| Green | Online (heard recently) | +| Yellow | Away (heard within 2 hours) | +| Gray | Offline (stale position) | +| Blue | Your own node | + +### Map Controls + +- **Zoom** — pinch or use +/- buttons +- **Pan** — drag to explore +- **Center** — select the location button to center on your position +- **Node tap** — tap a node marker to view details + +The floating toolbar provides quick access to compass, layer switching, node filters, refresh, and location tracking. Tap the compass to reorient north-up, or tap the location button to center on your current position. + +![Map controls overlay](/assets/screenshots/map_controls_overlay.png) + +## Waypoints + +Waypoints are shared geographic points of interest that all mesh members can see. + +### Creating a Waypoint + +1. Long-press on the map at the desired location. +2. Enter a name and optional description. +3. Choose an icon/emoji for the waypoint. +4. Tap **Send** to share with the mesh. + +### Waypoint Properties + +| Property | Description | +|----------|-------------| +| Name | Short identifier (max 30 characters) | +| Description | Optional longer description | +| Icon | Visual marker emoji on the map | +| Locked | If locked, only the creator can edit or delete | +| Expiration | Optional auto-remove time | + +### Waypoint Expiration + +Waypoints can be set to expire automatically: +- **Never** (default) — waypoint remains until manually deleted +- **Timed** — waypoint is automatically removed after the specified duration (e.g., "remove after 2 hours"). Useful for temporary markers like rally points, hazards, or meeting locations. + +Expired waypoints are automatically hidden from the map so they don't clutter the display. The expiration countdown begins when the waypoint is created, not when other nodes receive it. + +### Managing Waypoints + +- Tap a waypoint on the map to view its details and coordinates +- Edit or delete waypoints you created +- **Locked waypoints** cannot be modified or deleted by other nodes — only the original creator can change them +- Unlocked waypoints can be edited by any mesh member + +## Position Sharing + +### Enabling Position Sharing + +Your node shares its GPS position based on: +- **Fixed interval** — broadcast position at regular intervals +- **Smart position** — broadcast when movement exceeds a threshold +- **Manual** — only share when explicitly requested + +Configure position behavior in **Settings → Position**. + +### Privacy Considerations + +> 🔒 **Privacy:** Position data is broadcast to all nodes on your channel. If you don't want your location shared, disable GPS position in settings or use a fixed/fake position. + +## Map Sources + +The app supports multiple map tile sources: +- OpenStreetMap (default) +- Satellite imagery (where available) +- Offline tiles (download map areas for offline use) + +## Related Topics + +- [Nodes](nodes) — view and filter your node list +- [Node Metrics](node-metrics) — signal quality and position history for individual nodes +- [Discovery](discovery) — traceroute and neighbor info for understanding mesh topology +- [Units & Locale](units-and-locale) — distance and coordinate display formats + +--- + diff --git a/docs/user/messages-and-channels.md b/docs/user/messages-and-channels.md new file mode 100644 index 000000000..80a7195e5 --- /dev/null +++ b/docs/user/messages-and-channels.md @@ -0,0 +1,152 @@ +--- +title: Messages & Channels +nav_order: 3 +last_updated: 2026-05-13 +description: Send and receive messages, manage channels, configure encryption, and use quick chat, reactions, and message actions. +aliases: + - channels + - direct-messages + - messaging + - conversations +--- + +# Messages & Channels + +Meshtastic supports two communication modes: **channel broadcasts** and **direct messages**. + +## Channels + +Channels are shared communication groups. All nodes configured with the same channel key can read and send messages on that channel. + +### Default Channel + +Every Meshtastic device comes with a default **LongFast** channel. This is an unencrypted channel used for general mesh communication. + +### Channel Security + +Channels support multiple encryption levels: + +| Icon | Security Level | Description | +|------|----------------|-------------| +| 🔒 | PSK (256-bit AES) | Fully encrypted with a strong pre-shared key. Only nodes with the matching key can read messages. | +| 🔐 | PSK (128-bit AES) | Encrypted with a shorter key. Secure for most uses but 256-bit is preferred for sensitive data. | +| 🔓 | Default / Open | Uses the well-known default key. **Any Meshtastic device** on the same preset can read these messages. | +| ⚠️ | Insecure + Position | Open channel that also broadcasts your GPS position. Use with caution in public meshes. | + +> 🔒 **Security Tip:** 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. + +### Adding a Channel + +1. Navigate to **Settings → Channels**. +2. Tap **Add Channel** or scan a QR code. +3. Configure the channel name and encryption key. +4. Share the channel URL/QR code with others who need access. + +## Direct Messages + +Direct messages (DMs) are point-to-point encrypted communications between two specific nodes. + +### Sending a Direct Message + +1. Open the **Messages** tab. +2. Select a node from your contacts list or tap a node in the node list. +3. Type your message and tap **Send**. + +### Message States + +| State | Icon | Meaning | +|-------|------|---------| +| Queued | ⏳ | Message waiting to be sent | +| Sent | ✓ | Message transmitted to mesh | +| Delivered | ✓✓ | Acknowledgment received from recipient | +| Error | ✗ | Delivery failed after retries | + +### Delivery Errors + +When a message fails to deliver, the error indicator shows what went wrong: + +| Error | Meaning | What to Do | +|-------|---------|------------| +| No Route | No path exists to the destination node | The recipient may be offline or out of mesh range. Try later or move closer. | +| Got NAK | The next-hop node refused to relay | The relay node may be congested. Wait and retry. | +| Timeout | No acknowledgment within retry window | The recipient may be just out of range. Try increasing hop limit or moving to a better position. | +| No Interface | No radio interface available to send | Check that your radio is connected and the channel is configured. | +| Max Retransmit | All retry attempts exhausted | The mesh path is unreliable. Try a different channel or wait for conditions to improve. | +| No Channel | The destination channel doesn't exist | Verify both nodes share the same channel configuration. | +| Too Large | Message exceeds maximum payload size | Shorten your message (max ~230 characters). | +| No Response | Node received message but didn't respond | The recipient's radio may be busy or in low-power sleep mode. | +| Duty Cycle Limit | Regional airtime limit reached | Your radio has used its allowed transmit time. Wait for the duty cycle window to reset (typically 1 hour in EU regions). | +| Bad Request | Malformed or invalid message | This usually indicates a software bug. Try restarting the app. | + +> 💡 **Tip:** 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. + +## Message Features + +### Quick Chat + +Pre-configured messages for rapid communication: +- Access via the Quick Chat button in the message input area +- Choose from built-in phrases or custom messages +- Customize quick chat messages in **Settings → Quick Chat** +- Useful when typing is impractical (gloves, small screen, urgent) + +![Quick chat option](/assets/screenshots/messages_quick_chat.png) + +The channel list shows each channel with its latest message preview: + +![Channel list item showing channel name and last message](/assets/screenshots/messages-and-channels_channel_list.png) + +### Message Bubbles + +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. + +### Reactions + +React to messages with emoji: +- **Long-press** a message to open the actions menu +- Tap **Add Reaction** to choose an emoji +- Reactions appear below the message bubble +- Multiple users can react to the same message +- React to your own messages or others' messages + +![Emoji reaction badges displayed beneath a message](/assets/screenshots/messages_reaction.png) + +> 💡 **Tip:** Reactions are lightweight — they use minimal mesh bandwidth compared to full text messages. + +### Message Actions + +Long-press any message to access: +- **Copy** — copy message text to clipboard +- **Reply** — quote the message in your response +- **React** — add an emoji reaction +- **Delete** — remove a message you sent (local deletion) + +### Message Priority + +Messages are queued and transmitted based on priority: +1. Emergency/alert messages (highest) +2. Direct messages +3. Channel broadcasts (lowest) + +### Message Limits + +- **Maximum length:** 237 bytes (approximately 230 characters for ASCII text) +- **Rate limiting:** The mesh enforces airtime fairness; heavy message volume may be throttled +- **Delivery:** Messages are retried automatically if no acknowledgment is received + +## Best Practices + +- Use channels for group coordination +- Use direct messages for private person-to-person communication +- Keep messages short — mesh bandwidth is limited +- Configure encryption for sensitive communications + +## Related Topics + +- [Nodes](nodes) — tap a node to start a direct message +- [Settings — Radio & User](settings-radio-user) — configure channel encryption and presets +- [MQTT](mqtt) — bridge channel messages to the internet +- [Channel configuration](https://meshtastic.org/docs/configuration/radio/channels) — detailed channel settings on meshtastic.org + +--- + diff --git a/docs/user/mqtt.md b/docs/user/mqtt.md new file mode 100644 index 000000000..f79bffc3e --- /dev/null +++ b/docs/user/mqtt.md @@ -0,0 +1,135 @@ +--- +title: MQTT +nav_order: 11 +last_updated: 2026-05-13 +description: Bridge your mesh to the internet — MQTT broker setup, encryption layers, JSON output, and map reporting. +aliases: + - mqtt + - internet-bridge + - broker +--- + +# MQTT + +MQTT bridges your Meshtastic mesh network to the internet, enabling long-range communication beyond radio range. + +## Overview + +The MQTT module connects your node to an MQTT broker, allowing: +- Messages to reach nodes on different physical meshes via the internet +- Integration with home automation and monitoring systems +- Publishing node positions to the public Meshtastic map +- Custom data pipelines for logging and alerting + +## How It Works + +``` +[Your Node] → Radio → [Gateway Node with WiFi] → MQTT Broker → [Remote Gateway] → Radio → [Remote Node] +``` + +A gateway node with internet access (WiFi or Ethernet) publishes mesh messages to an MQTT topic. Remote gateways subscribed to the same topic inject those messages into their local mesh. + +## Configuration + +### Enabling MQTT + +1. Navigate to **Settings → Module Config → MQTT**. +2. Enable the MQTT module. +3. Configure the broker connection: + +![MQTT toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | Description | Default | +|---------|-------------|---------| +| Server Address | MQTT broker hostname | mqtt.meshtastic.org | +| Username | Broker authentication | meshdev | +| Password | Broker authentication | large4cats | +| Root Topic | Base topic for messages | msh | +| Encryption | Encrypt MQTT payload | Enabled | +| JSON Output | Publish JSON alongside protobuf | Disabled | +| TLS | Secure connection to broker | Disabled | +| Map Reporting | Report position to public map | Disabled | + +### Default Meshtastic Broker + +The community maintains a public broker at `mqtt.meshtastic.org`. This is intended for general use and testing. + +> 🔒 **Privacy:** Messages on the public broker are readable by anyone subscribed. Always use channel encryption for private communications. + +### Private Broker + +For better privacy and control, you can run your own MQTT broker: +- Mosquitto (lightweight, open-source) +- HiveMQ +- EMQX + +Configure your node to point to your private broker with appropriate credentials. + +## Map Reporting + +When Map Reporting is enabled, your node publishes its position to the Meshtastic community map: +- Visible at [meshmap.net](https://meshmap.net) and similar community map services +- Only position and node info are shared +- Disable this if you don't want your location publicly visible + +## Uplink vs Downlink + +| Direction | Description | +|-----------|-------------| +| **Uplink** | Messages from mesh → MQTT broker | +| **Downlink** | Messages from MQTT broker → mesh | + +Configure per-channel which directions are active to control message flow and airtime usage. + +## Message Formats + +MQTT supports two message formats: + +| Format | Description | Use case | +|--------|-------------|----------| +| **Protobuf** (default) | Binary Meshtastic protobuf encoding | Node-to-node mesh bridging | +| **JSON** | Human-readable JSON encoding | Home automation, logging, custom integrations | + +When **JSON Output** is enabled, the gateway publishes both protobuf and JSON versions of each message to separate topics. + +## Encryption & Privacy + +Understanding the layered encryption model: + +1. **Channel encryption** happens on the mesh *before* MQTT. If your channel has a PSK, the MQTT payload is already encrypted — the broker and any subscribers see only the ciphertext. +2. **MQTT encryption** (the module setting) adds an additional encryption layer for transit to the broker. This protects metadata and routing information. +3. **TLS** encrypts the TCP connection to the broker itself, preventing network-level eavesdropping. + +> 🔒 **Important:** The default public channel has a well-known key. Messages on the default channel sent via MQTT are effectively **unencrypted** — anyone can decode them. Always use a custom PSK for private communications. + +## Best Practices + +- Use channel-level encryption (PSK) on channels that bridge to MQTT +- Don't enable MQTT on nodes without internet access (it will buffer and waste memory) +- Use a private broker for sensitive deployments +- Be mindful of airtime when downlinking messages from busy MQTT topics — every downlinked message consumes radio airtime on your local mesh +- Consider enabling uplink-only if you only need to monitor your mesh remotely without injecting messages back + +## Troubleshooting + +### MQTT Not Connecting + +- **Check WiFi** — the gateway node must have an active internet connection (WiFi or Ethernet). MQTT does not work over the LoRa radio link itself. +- **Verify credentials** — incorrect username or password will silently fail on most brokers. Double-check for trailing spaces. +- **Firewall** — port 1883 (MQTT) or 8883 (MQTT+TLS) must be open. Some networks block non-standard ports. +- **DNS resolution** — if using a custom broker hostname, verify the node can resolve it. Try the broker's IP address directly. + +### Messages Not Bridging + +- **Check uplink/downlink settings** — if only uplink is enabled, messages flow from mesh to MQTT but not back. Enable downlink on the receiving gateway. +- **Channel mismatch** — both gateways must share the same channel with the same PSK. A mismatch means messages are encrypted with different keys and appear as garbage. +- **Topic mismatch** — ensure both gateways use the same root topic. The default `msh` works for the public broker. + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — MQTT module configuration reference +- [Messages & Channels](messages-and-channels) — channel encryption and PSK setup +- [MQTT integration guide](https://meshtastic.org/docs/software/integrations/mqtt) — detailed MQTT documentation on meshtastic.org + +--- + diff --git a/docs/user/node-metrics.md b/docs/user/node-metrics.md new file mode 100644 index 000000000..e36b7cf38 --- /dev/null +++ b/docs/user/node-metrics.md @@ -0,0 +1,129 @@ +--- +title: Node Metrics +nav_order: 5 +last_updated: 2026-05-13 +description: Telemetry dashboards for each mesh node — device health, environment sensors, signal quality, power, traceroute, and position history. +aliases: + - metrics + - telemetry + - device-metrics + - signal +--- + +# Node Metrics + +The node detail screen provides comprehensive telemetry and metrics for each node on your mesh. + +## Device Metrics + +Basic operating information reported by each node: + +| Metric | Description | +|--------|-------------| +| Battery Level | Current battery percentage | +| Voltage | Battery voltage reading | +| Channel Utilization | Percentage of airtime consumed | +| Airtime | Transmission time used by this node | +| Uptime | Time since last reboot | + +Device metrics are displayed as individual cards with trend sparklines showing battery level, voltage, channel utilization, airtime, and uptime over time. + +> 💡 **Tip:** Tap any metric card to expand it into a full chart with historical data points. Pinch to zoom the time axis. + +## Environment Metrics + +Environmental sensor data (requires compatible hardware): + +| Metric | Sensor Examples | +|--------|-----------------| +| Temperature | BME280, BME680, SHT31 | +| Humidity | BME280, BME680, SHT31 | +| Barometric Pressure | BME280, BMP280 | +| Gas Resistance | BME680 | +| IAQ (Air Quality) | BME680 | + +Environment metrics are charted over time for easy trend analysis — temperature, humidity, and pressure each get their own line chart with the measurement unit displayed on the Y axis. + +> 💡 **Tip:** Environment metrics require a sensor connected to the remote node. Not all nodes report environmental data. See [Telemetry & Sensors](telemetry-and-sensors) for a full list of supported sensors. + +## Signal Metrics + +Radio signal quality information: + +| Metric | Description | +|--------|-------------| +| SNR | Signal-to-Noise Ratio (higher is better) | +| RSSI | Received Signal Strength Indicator (closer to 0 is better) | +| Hop Count | Number of mesh hops for last message | + +### Signal Quality Reference + +| SNR Range | Quality | +|-----------|---------| +| > 10 dB | Excellent | +| 0 to 10 dB | Good | +| -10 to 0 dB | Fair | +| < -10 dB | Poor | + +## Power Metrics + +Power management telemetry (requires INA sensor or compatible hardware): + +| Metric | Description | +|--------|-------------| +| Bus Voltage | Supply voltage | +| Current | Power draw in milliamps | +| Power | Calculated wattage | + +## Traceroute + +Traceroute shows the path a message takes through the mesh: + +1. From the node detail screen, tap **Traceroute**. +2. The app sends a traceroute request to the target node. +3. Results show each hop with SNR/RSSI values. + +### Reading Traceroute Results + +``` +You → Node A (SNR: 8.5) → Node B (SNR: 5.2) → Target +``` + +Each hop represents a relay node that forwarded the message. + +## Position Log + +Historical position data for nodes that share their location: +- GPS coordinates +- Altitude +- Speed (if moving) +- Timestamp for each position report + +## Neighbor Info + +Shows which nodes a given node can directly hear, useful for understanding mesh topology. + +## Viewing Metrics + +1. Navigate to **Nodes**. +2. Tap the node you want to inspect. +3. Select the metric category from the detail tabs. + +![Node detail — local device](/assets/screenshots/nodes_detail_local.png) + +The position tab shows location data for nodes that share GPS: + +![Position inline content](/assets/screenshots/nodes_position.png) + +> ⚠️ **Note:** Metrics are only available when they have been reported by the remote node. Metrics update at intervals configured on each node's telemetry settings. + +## Related Topics + +- [Nodes](nodes) — node list, filtering, and sorting +- [Telemetry & Sensors](telemetry-and-sensors) — supported sensors and configuration +- [Signal Meter](signal-meter) — how signal quality is calculated from SNR and RSSI +- [Discovery](discovery) — traceroute details and neighbor info +- [Units & Locale](units-and-locale) — temperature, distance, and speed display formats + +--- + diff --git a/docs/user/nodes.md b/docs/user/nodes.md new file mode 100644 index 000000000..b66a94b6e --- /dev/null +++ b/docs/user/nodes.md @@ -0,0 +1,148 @@ +--- +title: Nodes +nav_order: 4 +last_updated: 2026-05-13 +description: Browse, filter, and sort mesh nodes — view details, signal quality, roles, and quick actions. +aliases: + - node-list + - mesh-nodes + - peers +--- + +# Nodes + +The Nodes screen displays all devices visible on your mesh network. + +## Node List + +The node list shows every node your radio has heard, including: +- **Node name** — user-configured long name +- **Short name** — 4-character identifier +- **Signal quality** — last heard signal strength +- **Last heard** — time since last communication +- **Distance** — estimated distance (if positions are shared) +- **Battery** — remote node battery level (if telemetry is enabled) + +### Node Status Indicators + +| Badge | Meaning | +|-------|---------| +| 🟢 Online | Node heard within the last 15 minutes | +| 🟡 Away | Node heard within the last 2 hours | +| 🔴 Offline | Node not heard for over 2 hours | +| ⭐ Favorite | Node marked as favorite by the user | + +### Node Roles + +Nodes can be configured with different roles that affect their mesh behavior: + +| Role | Description | +|------|-------------| +| Client | Standard end-user device | +| Client Mute | Receives but doesn't retransmit | +| Client Hidden | Like Client Mute, plus hides from node list | +| Router | Prioritizes message forwarding; stays awake to relay | +| Router Client | Routes and operates as a client | +| Repeater | Retransmits only; no user interface | +| Tracker | Optimized for position reporting at regular intervals | +| Sensor | Optimized for telemetry reporting | +| TAK | Interoperates with TAK systems (sends/receives CoT) | +| TAK Tracker | TAK position reporting only | +| Lost & Found | Continuous position beacon for recovery | + +### Choosing a Role + +Most users should keep the default **Client** role. Consider a different role when: + +- **Router** — You have a node in a fixed, elevated location with reliable power (rooftop, hilltop). Routers stay awake continuously to relay messages for others and are essential for extending mesh coverage. Don't use Router on battery-powered handheld devices. +- **Router Client** — Like Router, but the device is also used as a personal client. Good for a home base station that you also send messages from. +- **Client Mute** — You want to receive mesh traffic but not contribute to relaying. Useful for monitoring-only devices or to reduce congestion in dense areas. +- **Repeater** — A dedicated relay node with no screen or user interaction. Optimized purely for forwarding; lowest power consumption of the relay roles. +- **Tracker** — An unattended device whose sole purpose is broadcasting its GPS position (e.g., a vehicle, pet, or asset). Sleeps between broadcasts to conserve battery. +- **Sensor** — An unattended device reporting environmental telemetry (temperature, humidity, air quality). Similar power profile to Tracker. +- **TAK / TAK Tracker** — Only needed if interoperating with ATAK/WinTAK systems. See [TAK Integration](tak) for details. + +> 💡 **Tip:** The mesh works best when most nodes are **Client** or **Router**. Too many Mute nodes reduces mesh resilience; too many Routers in a dense area can cause congestion. A good rule of thumb: one Router per 5–10 Clients in your area. + +### Encryption Indicators + +Nodes display encryption status icons next to their name: + +| Icon | Meaning | +|------|---------| +| 🔒 Locked | Communication uses PKI (public key infrastructure) — end-to-end encrypted with verified identity | +| 🔓 Unlocked | Communication uses shared channel PSK — encrypted but identity not individually verified | +| ⚠️ Mismatch | Public key mismatch — the node's key has changed since last seen (investigate before trusting) | + +> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised. + +## Quick Actions + +From the node list, you can: +- **Tap** a node to view its detail page +- **Long-press** for quick actions: + - Send a direct message + - View on map + - Request position + - Mark as favorite + - Traceroute + +## Filtering & Sorting + +### Text Search + +Type in the search field to filter nodes by name or short name. The filter updates in real time as you type. + +### Filter Toggles + +| Filter | Description | +|--------|-------------| +| **Only online** | Show only nodes heard within the last 15 minutes | +| **Only direct** | Show only nodes with direct (non-relayed) connections | +| **Include unknown** | Show nodes that haven't sent user info yet | +| **Exclude infrastructure** | Hide infrastructure-role nodes (Router, Repeater, Router Client) | +| **Exclude MQTT** | Hide nodes heard only via MQTT internet bridge | +| **Show ignored** | Show nodes you've previously dismissed or muted | + +### Sort Options + +| Sort | Description | +|------|-------------| +| **Last heard** (default) | Most recently heard nodes first | +| **Alphabetical** | Sorted by node long name | +| **Distance** | Nearest nodes first (requires position sharing) | +| **Hops away** | Fewest relay hops first | +| **Channel** | Grouped by channel index | +| **Via MQTT** | Grouped by MQTT vs. radio-heard | +| **Favorites** | Favorited nodes first | + +## Node Detail + +Tapping a node opens the detail view with comprehensive information. See [Node Metrics](node-metrics) for full details on metrics and telemetry. + +![Node detail view](/assets/screenshots/nodes_node_list.png) + +The detail screen includes device info, position, and action buttons: + +![Node detail section](/assets/screenshots/nodes_detail_section.png) + +Inline status indicators show key metrics at a glance: + +| Indicator | Screenshot | +|-----------|------------| +| Signal quality | ![Signal](/assets/screenshots/nodes_signal_info.png) | +| Battery level | ![Battery](/assets/screenshots/nodes_battery_info.png) | +| Hop count | ![Hops](/assets/screenshots/nodes_hops_info.png) | +| Last heard | ![Last heard](/assets/screenshots/nodes_last_heard.png) | +| Distance | ![Distance](/assets/screenshots/nodes_distance_info.png) | + +## Related Topics + +- [Node Metrics](node-metrics) — detailed telemetry dashboards for each node +- [Messages & Channels](messages-and-channels) — send a direct message to a node +- [Map & Waypoints](map-and-waypoints) — view node positions geographically +- [Discovery](discovery) — traceroute and neighbor info for topology exploration +- [Signal Meter](signal-meter) — understand what the signal bars mean + +--- + diff --git a/docs/user/onboarding.md b/docs/user/onboarding.md new file mode 100644 index 000000000..11e64d42f --- /dev/null +++ b/docs/user/onboarding.md @@ -0,0 +1,92 @@ +--- +title: Getting Started +nav_order: 1 +last_updated: 2026-05-13 +description: First-launch setup — permissions, onboarding flow, and next steps after connecting your radio. +aliases: + - first-launch + - setup + - intro +--- + +# Getting Started + +Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app. + +## First Launch + +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. + +### Welcome Screen + +The welcome screen introduces Meshtastic and its core capabilities: +- Off-grid mesh communication +- No cellular or internet required +- End-to-end encrypted messaging + +Tap **Get Started** to proceed through the setup flow. + +![Welcome screen](/assets/screenshots/onboarding_welcome.png) + +## Permissions + +The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. + +### Bluetooth Permission + +Bluetooth is the primary connection method between your phone and Meshtastic radio: +- **Bluetooth scanning** — discover nearby Meshtastic radios +- **Bluetooth connect** — establish and maintain connections with paired radios + +Grant both permissions when prompted. Without Bluetooth, you'll need to use USB or TCP connections instead. + +### Location Permission + +> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. + +Meshtastic also uses your location for: +- Showing your position on the mesh map +- Calculating distances to other nodes +- Sharing your GPS coordinates with other mesh members (if enabled) + +Grant **"While using the app"** or **"Always"** depending on your preference: +- **While using the app** — position updates only when the app is open +- **Always** — enables background position updates for always-on mesh presence + +If denied, Bluetooth scanning will not function and your node will not report a position. + +### Notifications Permission + +Notifications alert you to: +- Incoming messages from channels and direct messages +- Connection status changes (connected, disconnected, reconnecting) +- Firmware update availability + +> 💡 **Tip:** You can fine-tune notification preferences later in Android system settings. The app creates separate notification channels for messages, connection events, and background service status. + +### Critical Alerts Permission + +On supported devices, the app may request permission for critical alerts: +- These are high-priority notifications that can break through Do Not Disturb mode +- Useful for emergency mesh alerts or urgent messages +- You can **skip** this step if you don't need breakthrough notifications +- Configure or revoke later in Android notification settings + +## After Setup + +Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. + +> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. + +## What's Next? + +Once connected to a radio, explore: +- [Connections](connections) — pair your first radio device +- [Messages & Channels](messages-and-channels) — send your first message +- [Nodes](nodes) — see who's on your mesh +- [Map & Waypoints](map-and-waypoints) — view node positions +- [Settings](settings-radio-user) — configure your radio and user profile + +New to Meshtastic? The [getting started guide](https://meshtastic.org/docs/getting-started) on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup. + +--- diff --git a/docs/user/settings-module-admin.md b/docs/user/settings-module-admin.md new file mode 100644 index 000000000..c866ef08f --- /dev/null +++ b/docs/user/settings-module-admin.md @@ -0,0 +1,241 @@ +--- +title: Settings — Modules & Admin +nav_order: 8 +last_updated: 2026-05-13 +description: Configure optional feature modules (MQTT, telemetry, canned messages, TAK, and more) and perform device administration. +aliases: + - modules + - module-config + - administration +--- + +# Settings — Modules & Admin + +Configure optional feature modules and perform device administration. Modules extend Meshtastic with specialized capabilities — each can be independently enabled or disabled. + +> 💡 **Tip:** You only need to enable the modules you actually use. Disabling unused modules reduces airtime, saves battery, and simplifies your configuration. + +Module settings use a card-based layout with toggle switches, dropdowns, text fields, and sliders: + +![Toggle switch](/assets/screenshots/settings_switch.png) + +![Dropdown selector](/assets/screenshots/settings_dropdown.png) + +## Module Configuration + +### MQTT Module + +Bridges mesh messages to and from an MQTT broker for internet connectivity. This is how you extend your mesh beyond radio range or integrate with home automation systems. + +| Setting | Description | +|---------|-------------| +| Enabled | Toggle MQTT bridge | +| Server | MQTT broker address | +| Username | Authentication username | +| Password | Authentication password | +| Encryption | Encrypt MQTT payloads | +| JSON Output | Also publish in JSON format | +| TLS | Use secure connection | +| Root Topic | Base MQTT topic path | +| Map Report | Publish position for public map | + +See [MQTT](mqtt) for a detailed usage guide including encryption, privacy, and broker setup. + +### Serial Module + +Enables serial port communication for external device integrations (GPS modules, sensors, or custom hardware). When enabled, the node's serial port can send and receive protobuf or text data, allowing external microcontrollers or computers to interact with the mesh. + +| Setting | Description | +|---------|-------------| +| Enabled | Activate serial communication | +| Echo | Echo received serial data back | +| Mode | Text, Protobuf, or NMEA output | +| RX/TX Pins | GPIO pins for serial connection | +| Baud Rate | Serial communication speed | + +### External Notification Module + +Controls buzzer, LED, or vibration alerts on your radio hardware. Useful for devices that need to physically signal when a message arrives — particularly helpful for unattended or outdoor installations. + +| Setting | Description | +|---------|-------------| +| Enabled | Activate notifications | +| Alert Message | Notify on incoming messages | +| Alert Message Buzzer | Use buzzer for messages | +| Alert Message Vibra | Use vibration for messages | +| Alert Bell | Notify on bell character | +| Output (GPIO) | Pin for notification output | +| Active | High or Low active | +| Duration (ms) | Notification length | +| Use I2S as Buzzer | Use I2S audio output | + +### Store & Forward Module + +Buffers messages for nodes that were temporarily offline, then replays them when those nodes reconnect. Essential for meshes where nodes go in and out of range regularly — ensures messages aren't lost during brief disconnections. + +| Setting | Description | +|---------|-------------| +| Enabled | Activate store and forward | +| Heartbeat (s) | Announcement interval | +| Records | Maximum stored messages | +| History Return (max) | Max messages to replay | +| History Return (window) | Time window for replay | + +> 💡 **Tip:** Store and Forward works best on nodes with ample memory (ESP32 with PSRAM). Router nodes are ideal candidates since they're typically always-on. + +### Range Test Module + +Automated range testing tool for evaluating link quality between nodes. When enabled, the node periodically transmits test messages with incrementing counters. A receiver node logs these messages, allowing you to walk or drive away and later analyze at what distance messages stopped arriving. + +| Setting | Description | +|---------|-------------| +| Enabled | Activate range testing | +| Sender Interval (s) | Time between test transmissions | +| Save CSV | Log received test data to SD card | + +### Telemetry Module + +Controls what telemetry data your node shares with the mesh. Telemetry includes device health (battery, uptime) and environmental sensor data (temperature, humidity, pressure). + +| Setting | Description | +|---------|-------------| +| Device Metrics Interval | How often to report device metrics | +| Environment Metrics Interval | How often to report environment sensors | +| Air Quality Enabled | Report particulate sensor data | +| Power Metrics Enabled | Report power usage | + +See [Telemetry & Sensors](telemetry-and-sensors) for supported sensors and configuration recommendations. + +### Canned Message Module + +Pre-configured messages accessible from the device's physical buttons (for radios with rotary encoders, keypads, or similar input hardware). Define a list of quick-send messages that can be transmitted without a phone connected — ideal for field use. + +| Setting | Description | +|---------|-------------| +| Enabled | Activate canned messages | +| Messages | Newline-separated list of messages | +| Send Bell | Play bell sound on send | +| Rotary Encoder | Enable rotary encoder input | +| Up/Down/Press Pins | GPIO pin assignments for input | + +### Audio Module + +Codec2 audio support for low-bandwidth voice communication over the mesh. This is an **experimental** feature that encodes voice into very small data packets using the Codec2 codec. + +| Setting | Description | +|---------|-------------| +| Enabled | Activate audio module | +| Codec2 Rate | Audio quality/bandwidth tradeoff | +| I2S Word Select | GPIO pin for I2S WS | +| I2S Data In | GPIO pin for I2S DIN | +| I2S Data Out | GPIO pin for I2S DOUT | + +> ⚠️ **Note:** Audio requires specific hardware (I2S microphone and speaker). Voice quality is very low-bandwidth — think "understandable radio voice," not phone-call quality. + +### Remote Hardware Module + +GPIO control over the mesh network. Allows a remote node to read or write GPIO pins on another node — useful for activating relays, reading switches, or controlling external hardware from a distance. + +| Setting | Description | +|---------|-------------| +| Enabled | Activate remote GPIO access | +| Allow Undefined Pins | Allow access to any GPIO pin (security risk) | + +> ⚠️ **Warning:** Enabling "Allow Undefined Pins" gives remote nodes access to all GPIO pins, which could interfere with the radio's own hardware. Only enable on dedicated GPIO nodes. + +### Neighbor Info Module + +Broadcasts information about directly heard neighbors, enabling mesh topology mapping. Each enabled node periodically shares a list of the other nodes it can hear and their signal quality. + +| Setting | Description | +|---------|-------------| +| Enabled | Activate neighbor broadcasting | +| Update Interval (s) | How often to broadcast neighbor list | + +See [Discovery](discovery) for how to use neighbor data for mesh topology exploration. + +### Ambient Lighting Module + +Controls onboard NeoPixel or other addressable RGB LEDs on supported hardware. Can be used for visual status indicators, notification lights, or decorative effects. + +| Setting | Description | +|---------|-------------| +| Enabled | Activate LED control | +| LED State | On, Off, or set specific color | +| Red / Green / Blue | Individual color channel values (0–255) | + +### Detection Sensor Module + +Turns your node into a motion or door sensor alert system. When a GPIO pin detects a state change (motion detected, door opened), the node broadcasts an alert message over the mesh. + +| Setting | Description | +|---------|-------------| +| Enabled | Activate detection sensor | +| Monitor Pin | GPIO pin connected to sensor | +| Detection Triggered High | Trigger when pin goes high (vs. low) | +| Minimum Broadcast (s) | Minimum time between alert broadcasts | +| State Broadcast (s) | Periodic state broadcast interval | +| Send Bell | Include bell character in alerts | +| Friendly Name | Custom name for this sensor | + +### Paxcounter Module + +People counter using WiFi and BLE probe requests. Counts nearby devices by passively listening for probe requests that phones and laptops emit when scanning for networks. Available only on ESP32 devices. + +| Setting | Description | +|---------|-------------| +| Enabled | Activate people counting | +| Update Interval (s) | How often to report counts | + +> 💡 **Tip:** Paxcounter is useful for estimating foot traffic at trailheads, event venues, or other locations. Counts are approximate — one person may carry multiple devices. + +### TAK Module + +Team Awareness Kit integration for interoperability with ATAK and WinTAK. See [TAK Integration](tak) for detailed setup and usage. + +## Administration + +### Remote Administration + +Remotely configure nodes that share your admin key: + +1. Select the target node in the node list. +2. Navigate to **Settings** for that node. +3. Modify configuration. +4. Tap **Save** — changes are sent over the mesh. + +> ⚠️ **Requires:** Admin key configured on both your node and the target node. + +### Clean Node Database + +Removes stale nodes from your local database that haven't been heard in a configurable time window. + +### Factory Reset + +Resets all settings to factory defaults. **This cannot be undone.** + +### Reboot + +Remotely reboot a connected or administered node. + +### Debug Panel + +View detailed diagnostic information: +- Protocol buffers debug output +- Mesh packet log +- Connection state details + +### Troubleshooting Remote Admin + +- **"No response from target node"** — the target may be out of range, offline, or have a mismatched admin key. Verify the admin key matches on both nodes. +- **Changes not applying** — some settings require a reboot to take effect. Try the Reboot action after saving. +- **Can't see remote settings** — ensure your node has the admin key for the target node and that Admin Channel is enabled in Security Config. + +## Related Topics + +- [Settings — Radio & User](settings-radio-user) — core radio and user profile settings +- [Module configuration reference](https://meshtastic.org/docs/configuration/module) — detailed module docs on meshtastic.org +- [FAQ](https://meshtastic.org/docs/about/faq) — common questions on meshtastic.org + +--- + diff --git a/docs/user/settings-radio-user.md b/docs/user/settings-radio-user.md new file mode 100644 index 000000000..7bed4a4d8 --- /dev/null +++ b/docs/user/settings-radio-user.md @@ -0,0 +1,163 @@ +--- +title: Settings — Radio & User +nav_order: 7 +last_updated: 2026-05-13 +description: Configure your radio hardware, LoRa presets, user profile, position sharing, power management, and security. +aliases: + - settings + - radio-config + - user-config + - lora +--- + +# Settings — Radio & User + +Configure your radio hardware and user identity parameters. + +## User Settings + +### User Profile + +| Setting | Description | +|---------|-------------| +| Long Name | Your display name (up to 39 characters) | +| Short Name | 4-character abbreviated name | +| Licensed Operator | Enable if you hold an amateur radio license (enables higher power) | + +### Applying Changes + +After modifying settings, tap **Save** to write the configuration to your radio. The device may reboot to apply changes. + +![Settings appearance section](/assets/screenshots/settings-radio-user_lora_config.png) + +## Radio Configuration + +### Device Config + +| Setting | Description | Default | +|---------|-------------|---------| +| Role | Node behavior (Client, Router, etc.) | Client | +| Serial Output | Enable serial console output | Disabled | +| Debug Log | Enable verbose debug logging | Disabled | +| Rebroadcast Mode | How the node retransmits messages | All | +| Node Info Broadcast (s) | Interval for broadcasting node info | 10800 | +| Double-tap Button | Action for double-tap button press | Disabled | + +### LoRa Config + +| Setting | Description | Default | +|---------|-------------|---------| +| Region | Regulatory region for frequency bands | Unset (must configure) | +| Modem Preset | Speed/range tradeoff | LongFast | +| Hop Limit | Maximum retransmit hops | 3 | +| TX Power | Transmission power (dBm); 0 = max allowed for region | 0 (region max) | +| Frequency Offset | Fine-tune frequency (MHz) | 0 | +| Channel Bandwidth | Bandwidth setting | Default for preset | + +> ⚠️ **Important:** You **must** set your region before transmitting. Operating without the correct region may violate local radio regulations. See the [region configuration guide](https://meshtastic.org/docs/getting-started/initial-config) on meshtastic.org for details. + +### Modem Presets + +| Preset | Range | Speed | SNR Limit | Best For | +|--------|-------|-------|-----------|----------| +| Short Turbo | ~1 km | 21.9 kbps | −5 dB | Dense urban with line-of-sight; data-heavy applications | +| Short Fast | ~3 km | 10.9 kbps | −7.5 dB | Urban neighborhoods; buildings within a few blocks | +| Medium Fast | ~5 km | 5.5 kbps | −10 dB | Suburban areas; moderate building density | +| Long Fast | ~10 km | 1.1 kbps | −12.5 dB | **General use (default)** — balanced range and speed | +| Long Moderate | ~20 km | 0.34 kbps | −15 dB | Rural with some terrain; occasional use | +| Long Slow | ~30 km | 0.18 kbps | −17.5 dB | Sparse rural; maximum reliable range | +| Very Long Slow | ~40+ km | 0.09 kbps | −20 dB | Extreme range experiments; very slow throughput | + +#### Choosing a Modem Preset + +The modem preset controls the fundamental tradeoff between **range** and **data rate**: + +- **Slower presets** use more spreading, making signals decodable at weaker signal levels (lower SNR limit). This means longer range but fewer bytes per second. +- **Faster presets** pack more data per transmission but require a stronger signal to decode. + +**Practical guidance:** + +- **Urban mesh (many nodes, short distances):** Use **Long Fast** (default) or **Short Fast**. Higher speed means less airtime congestion when many nodes share the channel. +- **Rural/sparse mesh (few nodes, long distances):** Use **Long Moderate** or **Long Slow**. Range matters more than speed when nodes are far apart. +- **Fixed infrastructure links:** Use **Short Turbo** for dedicated point-to-point links with good antennas and line-of-sight. +- **Mixed environments:** Stick with **Long Fast** — it's the community default and ensures compatibility with others in your area. + +> ⚠️ **Important:** All nodes on the same channel **must** use the same modem preset. Nodes with mismatched presets cannot communicate even if they share the same frequency and encryption key. + +> 💡 **Tip:** The range estimates above assume flat terrain and modest antennas. Elevation advantage (hilltop, rooftop) dramatically increases effective range. A well-placed Router with Long Fast can often outperform a ground-level node with Long Slow. + +### Display Config + +| Setting | Description | +|---------|-------------| +| Screen Timeout | Time before display sleeps | +| Display Units | Metric or Imperial | +| GPS Format | DMS, Decimal, UTM, MGRS, OLC | +| OLED Type | Auto, SSD1306, SH1106, SH1107 | +| Compass North | True North or Magnetic North | + +### Position Config + +| Setting | Description | +|---------|-------------| +| GPS Enabled | Enable/disable GPS | +| GPS Update Interval | How often to acquire GPS fix | +| Position Broadcast (s) | How often to share position | +| Smart Position | Enable movement-based broadcasting | +| Fixed Position | Use a manually set position | + +### Power Config + +| Setting | Description | +|---------|-------------| +| Power Saving | Enable low-power sleep mode | +| Shutdown After (s) | Auto-shutdown idle timer | +| ADC Multiplier | Battery voltage calibration factor | +| Wait Bluetooth (s) | Time to wait for BLE connection at boot | +| Mesh SDS Timeout (s) | Super-deep-sleep timeout | + +### Network Config + +| Setting | Description | +|---------|-------------| +| WiFi Enabled | Enable WiFi radio (ESP32 devices) | +| WiFi SSID | Network name to connect to | +| WiFi PSK | Network password | +| NTP Server | Time synchronization server | +| Syslog Server | Remote logging server | + +### Bluetooth Config + +| Setting | Description | +|---------|-------------| +| Bluetooth Enabled | Enable/disable BLE radio | +| Pairing Mode | Fixed PIN, Random PIN, or No PIN | +| Fixed PIN | PIN code for pairing (default: 123456) | + +### Security Config + +| Setting | Description | +|---------|-------------| +| Public Key | Your node's public key (read-only) | +| Admin Key | Key for remote administration | +| Private Key | Your node's private key (handle securely) | +| Admin Channel Enabled | Allow admin commands via channel | +| Managed Mode | Restrict non-admin channel changes | + +Settings use standard preference controls — dropdowns, toggles, and sliders: + +| Control | Screenshot | +|---------|------------| +| Dropdown | ![Dropdown](/assets/screenshots/settings_dropdown.png) | +| Toggle | ![Toggle](/assets/screenshots/settings_switch.png) | +| Slider | ![Slider](/assets/screenshots/settings_slider.png) | + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — optional feature modules and device administration +- [Signal Meter](signal-meter) — how modem presets affect signal quality thresholds +- [LoRa configuration](https://meshtastic.org/docs/configuration/radio/lora) — detailed LoRa settings reference on meshtastic.org +- [Initial configuration](https://meshtastic.org/docs/getting-started/initial-config) — region setup guide on meshtastic.org + +--- + diff --git a/docs/user/signal-meter.md b/docs/user/signal-meter.md new file mode 100644 index 000000000..3f573ca4d --- /dev/null +++ b/docs/user/signal-meter.md @@ -0,0 +1,80 @@ +--- +title: How the Meshtastic Signal Meter Works +nav_order: 15 +last_updated: 2026-05-13 +description: How the signal meter calculates quality from RSSI and SNR — LoRa spread spectrum, presets, and what the bars really mean. +aliases: + - signal + - signal-meter + - snr + - rssi +--- + +# How the Meshtastic Signal Meter Works + +The Meshtastic signal meter — the familiar bars or status color in the app — is calculated very differently than the "bars" on a traditional cell phone or Wi-Fi router. + +Most consumer devices simply measure how "loud" a signal is. However, because Meshtastic uses **LoRa (Long Range)** technology, its signal meter measures how **clear** the signal is, relative to the specific settings your mesh is using. + +--- + +## 1. The Two Metrics: "Loudness" vs. "Clarity" + +Every time the LoRa radio chip receives a message, it reports two measurements: + +* **RSSI (Received Signal Strength Indicator):** The **loudness** of the raw power hitting your antenna. +* **SNR (Signal-to-Noise Ratio):** The **clarity** of the signal compared to the background static. + +> **Tip — The Analogy:** Imagine you are trying to hear a friend talking to you. +> * **RSSI** is how loud their voice is. +> * **The Noise Floor** is the background noise in the room (air conditioning, other people talking, traffic). +> * **SNR** is how easily you can distinguish your friend's voice from the background noise. + +If your friend shouts at you at a deafening rock concert, the signal is incredibly loud (High RSSI), but you still can't understand them because the background noise is louder (Bad SNR). Conversely, if your friend whispers to you in a dead-silent library, the signal is very weak (Low RSSI), but you can understand them perfectly (Great SNR). + +--- + +## 2. The Magic of LoRa: Hearing "Below the Noise Floor" + +For standard radios (like FM or Wi-Fi), if the background noise is louder than the signal (a negative SNR), the receiver just hears static. + +LoRa is special. It uses **"Spread Spectrum"** modulation, which allows the radio to mathematically pull a signal out of the air even when it is buried deep *underneath* the background noise. This is why you will frequently see **negative SNR numbers** in Meshtastic (e.g., -10 dB, which means the signal is 10 decibels weaker than the background static). + +Depending on which Meshtastic preset you are using (e.g., `LongFast` vs. `ShortFast`), the radio has a specific **SNR Limit** — the absolute maximum amount of noise it can tolerate before the message is completely lost to the static. + +--- + +## 3. How the Signal Meter Calculates Quality + +The Meshtastic apps take both RSSI and SNR and run them through a specific formula to assign your signal a quality rating (None, Bad, Fair, or Good). It specifically scales these values based on the physical limits of the radio preset you are using. + +Here is exactly how the app decides how many bars (or what color) to show you: + +| Level | Bars | Criteria | Meaning | +|-------|------|----------|---------| +| Good | 3 | RSSI better than `-115 dBm` **AND** SNR above the baseline limit for your preset | Signal is both loud and clear — healthy connection. | +| Fair | 2 | Falls between Good and Bad | Signal getting quieter or noisier, but the radio understands the message fine. | +| Bad | 1 | RSSI drops to `-120 dBm` or worse, **OR** SNR within `5.5 dB` of your preset's absolute breaking point | Barely hanging on — at the edge of range or heavy interference. | +| None | 0 | RSSI worse than `-126 dBm` **AND** SNR has fallen `7.5 dB` below the ideal limit | Transmission completely buried in static. | + +--- + +## 4. What This Means for You + +Because Meshtastic's meter acts as a **"Clarity Meter"**, it behaves differently than what most people expect: + +> **Tip — Don't panic over low RSSI:** You might see a seemingly terrible RSSI value like `-118 dBm`. On a cell phone, you would have zero bars. But if you have an SNR of `+2 dB`, Meshtastic will still show a strong signal! *The library is quiet, so the whisper is heard perfectly.* + +> **Warning — Watch out for local noise:** If you hook up a massive antenna and see a great RSSI (e.g., `-90 dBm`) but your signal meter is only showing **1 Bar (Bad)**, you have a problem. It means you have local interference — perhaps a cheap power supply, a noisy computer, or a nearby radio tower — creating so much static that it is drowning out your mesh. + +## Where Signal Information Appears + +In the app, signal data is shown in several places: + +- **Node list** — signal bars icon next to each node +- **Node detail** — SNR, RSSI, and signal quality in the device metrics section +- **Traceroute** — per-hop signal quality for each relay node +- **Signal metrics** — historical SNR and RSSI data in the metrics charts + +![Node entry showing SNR, RSSI values and colored signal bars](/assets/screenshots/nodes_signal_info.png) + diff --git a/docs/user/tak.md b/docs/user/tak.md new file mode 100644 index 000000000..df6e8b827 --- /dev/null +++ b/docs/user/tak.md @@ -0,0 +1,124 @@ +--- +title: TAK Integration +nav_order: 10 +last_updated: 2026-05-13 +description: Interoperate with ATAK and WinTAK — CoT position sharing, TAK roles, and plugin setup. +aliases: + - tak + - atak + - team-awareness-kit +--- + +# TAK Integration + +Meshtastic integrates with the Team Awareness Kit (TAK) ecosystem, enabling interoperability between Meshtastic mesh devices and TAK applications like ATAK and WinTAK. + +## Overview + +The TAK module allows Meshtastic nodes to: +- Share position data in TAK-compatible CoT (Cursor on Target) format +- Appear as team members on TAK map displays +- Receive TAK PLI (Position Location Information) messages + +## Setup + +### Prerequisites + +- ATAK (Android Team Awareness Kit) or WinTAK installed +- Meshtastic ATAK Plugin installed +- TAK module enabled on your Meshtastic radio + +### Configuration + +1. Navigate to **Settings → Module Config → TAK**. +2. Enable the TAK module. +3. Configure the TAK team/group settings: + +![Module toggle switch](/assets/screenshots/settings_switch.png) + +| Setting | Description | +|---------|-------------| +| Enabled | Activate TAK interop | +| Mode | TAK-compatible output mode | + +### ATAK Plugin Setup + +1. Install the Meshtastic ATAK Plugin from the plugin repository. +2. Open ATAK and enable the Meshtastic plugin. +3. The plugin bridges messages between ATAK and your mesh network. + +## TAK Roles + +Nodes configured with TAK-related roles behave differently from standard clients: + +| Role | Description | +|------|-------------| +| **TAK** | Full TAK interoperability — sends and receives CoT data, chat messages, and PLI updates. Functions as a standard client plus TAK bridge. | +| **TAK Tracker** | Position-only TAK output — automatically broadcasts PLI at regular intervals without user interaction. Optimized for unattended position beacons (vehicles, equipment, waypoints). Does not relay chat messages. | + +> 💡 **Tip:** Use **TAK Tracker** for devices that only need to report position (e.g., a radio mounted in a vehicle). Use **TAK** for devices where users actively participate in TAK operations. + +### CoT (Cursor on Target) Format + +TAK messages use the Cursor on Target XML format — a military standard for sharing situational awareness data. Meshtastic converts its internal protobuf messages to CoT format when bridging to TAK systems, so no manual format conversion is needed. + +## TAK Identity + +When using TAK roles, your node broadcasts identity information that appears on TAK maps: + +| Setting | Description | +|---------|-------------| +| Team | Your team color on the TAK map (e.g., Blue, Red, Cyan, Green) | +| Role | Your operational role (Team Member, Team Lead, HQ, Medic, RTO, etc.) | +| Callsign | Your TAK callsign (defaults to your Meshtastic long name) | + +These settings appear in **Settings → Module Config → TAK** when the TAK module is enabled. + +> 💡 **Tip:** Team/role colors are the standard TAK affiliation colors. Coordinate with your TAK team to use consistent team assignments. + +## Wire Format (V1 / V2) + +Meshtastic supports two TAK wire formats: + +| Format | Compatibility | Features | +|--------|--------------|----------| +| V1 (Legacy) | ATAK Plugin v1.x, older firmware | Basic CoT position sharing only | +| V2 (Current) | ATAK Plugin v2.x, firmware 2.3+ | Full CoT support including chat, routes, zstd compression | + +The app automatically selects V2 when both sides support it. No manual configuration needed — the TAK module negotiates format based on firmware capabilities. + +## Usage with ATAK + +Once configured: +- Meshtastic nodes appear as markers on the ATAK map with callsign labels +- Chat messages can bridge between mesh and TAK networks +- Position updates flow bidirectionally between Meshtastic and TAK +- TAK Tracker nodes broadcast PLI automatically — their positions appear on ATAK maps without any ATAK-side configuration + +> ⚠️ **Note:** TAK integration requires specific node roles and module configuration. Standard client nodes don't automatically participate in TAK operations. + +## Troubleshooting + +| Problem | Cause | Solution | +|---------|-------|----------| +| Node doesn't appear on ATAK map | TAK module disabled or wrong role | Verify TAK module is enabled and node role is TAK or TAK Tracker | +| Position updates are stale | GPS fix lost or interval too long | Check GPS status; reduce position broadcast interval in Position Config | +| ATAK plugin shows "disconnected" | BLE connection lost or plugin crashed | Reconnect Bluetooth in Meshtastic app, then restart ATAK plugin | +| Chat messages not bridging | V1 format doesn't support chat | Ensure both nodes run firmware 2.3+ for V2 wire format | +| CoT data not flowing | Channel mismatch | All TAK nodes must be on the same channel with matching encryption | + +## Security Considerations + +- TAK data shares your position and callsign information +- Ensure your channel encryption is configured when using TAK in sensitive environments +- The TAK module respects the same channel encryption as other Meshtastic messages + +## Related Topics + +- [Settings — Modules & Admin](settings-module-admin) — TAK module configuration +- [Nodes](nodes) — TAK and TAK Tracker roles in the node list +- [Map & Waypoints](map-and-waypoints) — node positions on the map +- [ATAK plugin guide](https://meshtastic.org/docs/software/integrations/atak-plugin) — detailed ATAK setup on meshtastic.org + +--- + diff --git a/docs/user/telemetry-and-sensors.md b/docs/user/telemetry-and-sensors.md new file mode 100644 index 000000000..0ce596f0f --- /dev/null +++ b/docs/user/telemetry-and-sensors.md @@ -0,0 +1,118 @@ +--- +title: Telemetry & Sensors +nav_order: 9 +last_updated: 2026-05-13 +description: Sensor data on the mesh — supported environment, air quality, and power sensors, plus configuration and viewing guides. +aliases: + - sensors + - environment + - weather + - power-metrics +--- + +# Telemetry & Sensors + +Meshtastic nodes can collect and share sensor data across the mesh network. + +## Overview + +Telemetry allows nodes equipped with sensors to broadcast environmental, power, and device health information. This data is visible on the node detail screen and can be logged over time. + +## Device Telemetry + +All Meshtastic nodes report basic device telemetry: + +| Metric | Description | Typical Range | +|--------|-------------|---------------| +| Battery Level | Charge percentage | 0–100% | +| Voltage | Battery voltage | 3.0–4.2V (LiPo) | +| Channel Utilization | % of airtime used locally | 0–100% | +| Air Utilization TX | % of airtime used by this node | 0–100% | +| Uptime | Seconds since last boot | Varies | + +## Environment Sensors + +Supported environmental sensors: + +### Temperature & Humidity + +| Sensor | Temperature | Humidity | Pressure | Notes | +|--------|-------------|----------|----------|-------| +| BME280 | ✓ | ✓ | ✓ | Recommended all-in-one | +| BME680 | ✓ | ✓ | ✓ | Adds gas resistance/IAQ | +| SHT31 | ✓ | ✓ | — | High accuracy | +| MCP9808 | ✓ | — | — | Precision temperature | +| LPS22 | — | — | ✓ | Pressure only | + +### Air Quality + +| Sensor | Metric | Notes | +|--------|--------|-------| +| BME680 | Gas Resistance / IAQ | Volatile organic compounds | +| PMSA003I | PM1.0, PM2.5, PM10 | Particulate matter | +| SEN55 | PM, NOx, VOC, Temp, Humidity | Multi-sensor | + +### Light & UV + +| Sensor | Metric | +|--------|--------| +| OPT3001 | Ambient light (lux) | +| VEML7700 | Ambient light (lux) | +| LTR390 | UV index | + +## Power Metrics + +Nodes with INA-series power sensors can report: + +| Metric | Description | +|--------|-------------| +| Bus Voltage | Supply rail voltage | +| Current | Power consumption (mA) | +| Power | Calculated power (mW) | + +Useful for monitoring solar charging or battery health on remote nodes. + +## Configuring Telemetry + +1. Navigate to **Settings → Module Config → Telemetry**. +2. Set reporting intervals: + - **Device Metrics Interval** — how often to broadcast device metrics + - **Environment Metrics Interval** — how often to broadcast sensor data +3. Enable specific sensor types as needed. + +### Recommended Intervals + +| Use Case | Device (s) | Environment (s) | +|----------|-----------|-----------------| +| Urban mesh (many nodes) | 3600 | 3600 | +| Rural mesh (few nodes) | 900 | 900 | +| Weather station | 900 | 300 | +| Battery conservation | 7200 | 7200 | + +> ⚠️ **Note:** Shorter intervals increase airtime usage and battery drain across the mesh. + +## Viewing Telemetry + +1. Navigate to **Nodes** and select a node. +2. Telemetry sections show on the detail screen: + - Device Metrics (always available) + - Environment Metrics (if sensors present) + - Power Metrics (if INA sensor present) +3. Historical graphs show trends over time. + +![Telemetry actions](/assets/screenshots/node-metrics_telemetric_actions.png) + +## Troubleshooting + +- **No environment data showing?** The remote node needs a physical sensor connected (e.g., BME280 on I2C). Device telemetry (battery, uptime) is always available, but environment metrics require hardware. +- **Stale readings?** Check the reporting interval — very long intervals (7200s+) mean data updates infrequently. Also verify the remote node is still online. +- **Sensor conflict on I2C bus?** Some sensors share I2C addresses. If you have multiple sensors on the same bus, check for address collisions in the radio's serial debug output. + +## Related Topics + +- [Node Metrics](node-metrics) — view telemetry data on the node detail screen +- [Settings — Modules & Admin](settings-module-admin) — telemetry module configuration +- [Units & Locale](units-and-locale) — temperature and pressure display units + +--- + diff --git a/docs/user/translate.md b/docs/user/translate.md new file mode 100644 index 000000000..d97278855 --- /dev/null +++ b/docs/user/translate.md @@ -0,0 +1,97 @@ +--- +title: Translate the App +parent: User Guide +nav_order: 17 +last_updated: 2026-05-13 +aliases: + - translate + - crowdin + - localization +--- + +# Translate the App + +Contributing translations helps make Meshtastic accessible to a wider audience. The app uses [Crowdin](https://crowdin.com/) to manage community translations for both the user interface and in-app documentation. + +--- + +## What Gets Translated + +| Resource | Source Location | Notes | +|---|---|---| +| UI strings | `composeResources/values/strings.xml` | Buttons, labels, messages, and all user-visible text | +| User Guide pages | `docs/user/*.md` | In-app documentation shown in Help & Documentation | +| Fastlane metadata | `fastlane/metadata/android/en-US/` | App Store listing title, description, and changelogs | + +> **Note — Developer Guide pages are English-only.** Code-focused documentation targeting contributors is not translated. + +--- + +## How to Contribute + +1. **Visit the Crowdin project.** Open the [Meshtastic Android Crowdin project](https://crowdin.com/project/meshtastic-android) and sign in or create a free account. +2. **Choose your language.** Select an existing language or request a new one by opening a [GitHub issue](https://github.com/meshtastic/Meshtastic-Android/issues/new). +3. **Translate strings.** Crowdin shows the English source on the left and your translation on the right. Translate each string and save. +4. **Review context.** Many strings include screenshots or context comments — check these to understand where the text appears in the app. +5. **Submit.** Approved translations are automatically merged into the next release. + +> **Tip — Keep translations short.** UI strings often appear in buttons, chips, or narrow columns. If a translation is significantly longer than the English original, consider abbreviating where the meaning stays clear. + +--- + +## Adding a New Language + +If your language is not yet listed on Crowdin: + +1. Open an issue on [GitHub](https://github.com/meshtastic/Meshtastic-Android/issues/new) requesting the new locale. +2. A maintainer will add the language to Crowdin and configure `crowdin.yml`. +3. Once added, you can begin translating immediately. + +--- + +## How Translations Are Organized + +The Android app uses **Compose Multiplatform resources** for all user-visible strings: + +``` +core/resources/src/commonMain/composeResources/ +├── values/ ← English (default) +│ └── strings.xml +├── values-de/ ← German +│ └── strings.xml +├── values-fr/ ← French +│ └── strings.xml +└── ... +``` + +In-app documentation follows a similar pattern under `docs/`: + +``` +docs/ +├── user/ ← English source (default) +│ ├── onboarding.md +│ └── ... +├── fr/user/ ← French translations +│ ├── onboarding.md +│ └── ... +└── ... +``` + +The app automatically selects the correct locale based on your device's **Language & Region** settings. + +--- + +## Translation Guidelines + +- **Do not translate** technical terms like "LoRa", "MQTT", "BLE", "TAK", "SNR", or "RSSI" — these are universal. +- **Keep placeholders intact.** Strings like `%1$s` or `%d` are filled in at runtime. Do not remove or reorder them unless the grammar of your language requires it. +- **Match tone.** The app uses a friendly, direct voice. Avoid overly formal language. +- **Test if possible.** Switch your device language and open the app to see how translations look in context. + +--- + +## Questions? + +If you have questions about a specific string's context or need help getting started, open a discussion on the [Meshtastic GitHub Discussions](https://github.com/meshtastic/Meshtastic-Android/discussions) page. + +Thank you for helping expand the reach of Meshtastic! diff --git a/docs/user/units-and-locale.md b/docs/user/units-and-locale.md new file mode 100644 index 000000000..5c8783b02 --- /dev/null +++ b/docs/user/units-and-locale.md @@ -0,0 +1,118 @@ +--- +title: Units, Measurement & Locale +parent: User Guide +nav_order: 16 +last_updated: 2026-05-12 +--- + +# Units, Measurement & Locale + +The Meshtastic app automatically displays temperatures, distances, speeds, and times in the units your device is configured to use — no settings to change inside the app. + +--- + +## How It Works + +Meshtastic radios always transmit data in **metric units** (meters, °C, km/h, hPa, etc.). When the app receives this data, it uses the `MetricFormatter` utility to convert and display values in whatever unit system your device's locale specifies. + +On Android, your measurement preferences are determined by your system **Language & Region** settings. On Desktop (JVM), the app uses the JVM's default `Locale`. + +> **Tip — You never need to toggle units inside the app.** Change your system measurement preferences and every screen in Meshtastic updates automatically — node details, telemetry charts, weather, altitude, and more. + +--- + +## Temperature + +Temperature values from environment sensors are transmitted as **°C** and displayed based on your device's temperature unit preference. + +![Environment metrics with temperature](/assets/screenshots/nodes_environment_metrics.png) + +| Your Setting | You See | +|---|---| +| Celsius | 22°C | +| Fahrenheit | 72°F | + +This affects all temperature displays throughout the app: node environment telemetry, soil temperature, dew point, and telemetry chart axes. + +## Distance & Altitude + +Distances between nodes and GPS altitudes are transmitted as **meters** and automatically scaled and converted. + +![Distance info display](/assets/screenshots/nodes_distance_info.png) + +| Your Setting | Small Distance | Large Distance | Altitude | +|---|---|---|---| +| Metric | 350 m | 2.5 km | 1,200 m | +| Imperial (US) | 1,148 ft | 1.6 mi | 3,937 ft | + +The app uses natural scaling — short distances stay in meters or feet, while longer distances switch to kilometres or miles automatically. + +### Where these appear + +- **Node list** — distance and bearing to each node +- **Node detail** — altitude, distance from your position +- **Map** — waypoint distances, traceroute hop distances +- **Compass** — distance to selected node + +## Speed + +GPS ground speed is displayed in your locale's preferred speed unit. + +| Your Setting | You See | +|---|---| +| Metric | 12 km/h | +| Imperial (US) | 7 mph | + +## Wind + +Wind speed and gust data from environment sensors are transmitted as **m/s** and converted for display. + +| Your Setting | You See | +|---|---| +| Metric | 5 m/s | +| Imperial (US) | 11 mph | + +Wind readings appear in the **Node Detail** environment section and the **Environment Telemetry** charts. + +## Rainfall + +Rainfall measurements (1-hour and 24-hour totals) are transmitted as **mm** and converted for display. + +| Your Setting | You See | +|---|---| +| Metric | 12 mm | +| Imperial (US) | 0.5 in | + +## Units That Never Change + +Some units are international standards and are displayed the same way regardless of your locale: + +| Measurement | Unit | Why | +|---|---|---| +| Barometric pressure | hPa | International meteorological standard | +| Heading / bearing | ° (degrees) | Universal navigation convention | +| Radiation | μR/hr | Standard dosimetry unit | +| GPS coordinates | decimal degrees | Universal geographic standard | +| Humidity, battery, soil moisture | % | Universal | + +## Date & Time + +All timestamps throughout the app — last heard, message times, telemetry logs, chart axes — follow your device's date and time preferences. + +| Setting | What It Controls | Example | +|---|---|---| +| **24-Hour Time** | Clock format | 14:30 vs 2:30 PM | +| **Date Format** | Date ordering | 09/05/2026 vs 05/09/2026 | + +The app also uses **relative time** where it makes sense — for example, "5 min ago" or "2 hours ago" in the node list — which is automatically localised into your device language. + +## Changing Your Measurement System (Android) + +On Android, your measurement system (metric vs imperial) is tied to your region setting: + +1. Open **Android Settings → System → Language & Region** +2. Change your **Region** or **Measurement units** preference +3. Return to Meshtastic — values update immediately + +> **Tip — The app uses `MetricFormatter` from `core:common`.** All measurement formatting is handled by a shared KMP utility that respects your platform's locale. Developers adding new measurement displays should use `MetricFormatter` rather than hard-coding unit conversions. + diff --git a/feature/docs/build.gradle.kts b/feature/docs/build.gradle.kts new file mode 100644 index 000000000..58406478f --- /dev/null +++ b/feature/docs/build.gradle.kts @@ -0,0 +1,149 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +plugins { + alias(libs.plugins.meshtastic.kmp.feature) + alias(libs.plugins.meshtastic.kotlinx.serialization) + id("meshtastic.kmp.jvm.android") +} + +kotlin { + android { + namespace = "org.meshtastic.feature.docs" + androidResources.enable = true + } + + sourceSets { + commonMain.dependencies { + implementation(projects.core.common) + implementation(projects.core.navigation) + implementation(projects.core.resources) + implementation(projects.core.ui) + implementation(projects.core.di) + + implementation(libs.kotlinx.collections.immutable) + implementation(libs.jetbrains.navigation3.ui) + implementation(libs.jetbrains.compose.material3.adaptive.navigation3) + implementation(libs.coil) + implementation(libs.markdown.renderer) + implementation(libs.markdown.renderer.m3) + } + + commonTest.dependencies { implementation(libs.compose.multiplatform.ui.test) } + + jvmTest.dependencies { implementation(compose.desktop.currentOs) } + } +} + +/** + * Sync task: copies markdown docs from the canonical `docs/` source directory into the CMP composeResources location. + * This eliminates manual content duplication and ensures the in-app bundled docs always reflect the source-of-truth. + * + * Usage: ./gradlew :feature:docs:syncDocsToComposeResources + * + * This task runs automatically before resource generation tasks. + */ +val syncDocsToComposeResources by + tasks.registering(Sync::class) { + description = "Syncs docs/ markdown source into composeResources for in-app bundling" + group = "docs" + + val docsSourceDir = rootProject.layout.projectDirectory.dir("docs") + val screenshotsDir = rootProject.layout.projectDirectory.dir("docs/screenshots") + val composeResourcesTarget = layout.projectDirectory.dir("src/commonMain/composeResources/files/docs") + + from(docsSourceDir) { + include("user/**/*.md") + include("developer/**/*.md") + // Exclude Jekyll/site-only files that are not needed in-app + exclude("_config.yml") + exclude("_data/**") + exclude("_includes/**") + exclude("_layouts/**") + exclude("index.md") + exclude("assets/**") + exclude("Gemfile*") + } + + // FR-038: Bundle screenshots into assets/screenshots/ to match markdown image paths. + // Markdown references use `assets/screenshots/foo.png` (relative to the doc page). + // copyDocsScreenshots flattens reference PNGs into docs/screenshots/, + // so we remap them into assets/screenshots/ within the compose resource tree. + from(screenshotsDir) { + include("**/*.png") + into("assets/screenshots") + } + + into(composeResourcesTarget) + + // Preserve timestamps for up-to-date checks + preserve { include("**/.gitkeep") } + } + +// Wire sync task to run before any resource generation +tasks + .matching { + it.name.contains("generateComposeResClass") || + it.name.contains("copyNonXmlValueResources") || + it.name.contains("convertXmlValueResources") + } + .configureEach { dependsOn(syncDocsToComposeResources) } + +// FR-038: Ensure screenshots are generated before syncing docs resources +syncDocsToComposeResources.configure { dependsOn(":screenshot-tests:copyDocsScreenshots") } + +val syncTranslatedDocsToComposeResources by + tasks.registering(Copy::class) { + description = "Syncs Crowdin-translated docs into locale-qualified composeResources" + group = "docs" + + val docsDir = rootProject.layout.projectDirectory.dir("docs") + val targetBase = layout.projectDirectory.dir("src/commonMain/composeResources") + + from(docsDir) { + // Crowdin outputs dirs in Android qualifier format (fr, pt-rBR, zh-rCN) + include("*/user/**/*.md") + exclude("user/**") + exclude("developer/**") + exclude("_*/**") + exclude("assets/**") + exclude("screenshots/**") + } + + into(targetBase) + + // Crowdin %android_code% already outputs CMP qualifier format (pt-rBR), + // so we just need to prepend "files-" and nest under docs/ + eachFile { + val segments = relativePath.segments + if (segments.size >= 3) { + val qualifier = segments[0] + val rest = segments.drop(1).joinToString("/") + path = "files-$qualifier/docs/$rest" + } + } + includeEmptyDirs = false + } + +// Wire translated docs sync to resource generation alongside the primary sync +tasks + .matching { + it.name.contains("generateComposeResClass") || + it.name.contains("copyNonXmlValueResources") || + it.name.contains("convertXmlValueResources") + } + .configureEach { dependsOn(syncTranslatedDocsToComposeResources) } diff --git a/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/ai/AIDocAssistant.kt b/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/ai/AIDocAssistant.kt new file mode 100644 index 000000000..6b813bf3b --- /dev/null +++ b/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/ai/AIDocAssistant.kt @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.meshtastic.feature.docs.ai + +import org.meshtastic.feature.docs.model.AIDocAssistantResult + +/** + * Shared abstraction over the platform-specific docs AI assistant. + * + * Bindings: + * - Android `google` flavor: Gemini Nano implementation + * - Android `fdroid` flavor: keyword-search fallback + * - Desktop/iOS: keyword-search fallback + */ +interface AIDocAssistant { + /** Whether the AI assistant is available on the current platform/device. */ + suspend fun isSupported(): Boolean + + /** Answer a user question about Meshtastic using bundled documentation context. */ + suspend fun answer(question: String, currentPageId: String? = null): AIDocAssistantResult + + /** Reset the conversation session. Call when starting a new conversation thread. */ + fun resetSession() +} diff --git a/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/ai/ChirpySessionHolder.kt b/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/ai/ChirpySessionHolder.kt new file mode 100644 index 000000000..2d24c0f5a --- /dev/null +++ b/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/ai/ChirpySessionHolder.kt @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.meshtastic.feature.docs.ai + +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.setValue +import org.koin.core.annotation.Single +import org.meshtastic.feature.docs.model.AIDocAssistantSessionState + +/** + * Global Chirpy conversation state shared across all docs panes. + * + * Registered as a Koin singleton so both the list and detail entries access the same conversation. Uses Compose + * snapshot state so reads trigger recomposition automatically. + */ +@Single +class ChirpySessionHolder { + var showSheet by mutableStateOf(false) + var sessionState by mutableStateOf(AIDocAssistantSessionState()) +} diff --git a/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/ai/KeywordFallbackAssistant.kt b/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/ai/KeywordFallbackAssistant.kt new file mode 100644 index 000000000..86673f1a6 --- /dev/null +++ b/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/ai/KeywordFallbackAssistant.kt @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.meshtastic.feature.docs.ai + +import org.koin.core.annotation.Single +import org.meshtastic.feature.docs.data.KeywordSearchEngine +import org.meshtastic.feature.docs.model.AIDocAssistantResult + +/** Keyword-search-only fallback AI assistant implementation. Used on Desktop, iOS, and Android fdroid flavor. */ +@Single(binds = []) +class KeywordFallbackAssistant(private val searchEngine: KeywordSearchEngine) : AIDocAssistant { + + override suspend fun isSupported(): Boolean = false + + override suspend fun answer(question: String, currentPageId: String?): AIDocAssistantResult { + val pages = searchEngine.selectForTokenBudget(question, maxChars = 20_000) + return if (pages.isNotEmpty()) { + AIDocAssistantResult.Fallback( + message = "AI assistant is not available on this platform. Here are pages that may help:", + suggestedPages = pages, + ) + } else { + AIDocAssistantResult.Error(reason = org.meshtastic.feature.docs.model.DocsAiError.UnsupportedPlatform) + } + } + + override fun resetSession() { + /* No-op for keyword fallback */ + } +} diff --git a/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/data/DocBundleLoader.kt b/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/data/DocBundleLoader.kt new file mode 100644 index 000000000..baeb10af1 --- /dev/null +++ b/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/data/DocBundleLoader.kt @@ -0,0 +1,544 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.meshtastic.feature.docs.data + +import meshtasticandroid.feature.docs.generated.resources.Res +import org.jetbrains.compose.resources.StringResource +import org.jetbrains.compose.resources.getString +import org.koin.core.annotation.Single +import org.meshtastic.core.common.util.currentLocaleQualifier +import org.meshtastic.core.resources.doc_keywords_connections +import org.meshtastic.core.resources.doc_keywords_desktop +import org.meshtastic.core.resources.doc_keywords_discovery +import org.meshtastic.core.resources.doc_keywords_firmware +import org.meshtastic.core.resources.doc_keywords_map +import org.meshtastic.core.resources.doc_keywords_messages +import org.meshtastic.core.resources.doc_keywords_mqtt +import org.meshtastic.core.resources.doc_keywords_node_metrics +import org.meshtastic.core.resources.doc_keywords_nodes +import org.meshtastic.core.resources.doc_keywords_onboarding +import org.meshtastic.core.resources.doc_keywords_settings_module +import org.meshtastic.core.resources.doc_keywords_settings_radio +import org.meshtastic.core.resources.doc_keywords_signal_meter +import org.meshtastic.core.resources.doc_keywords_tak +import org.meshtastic.core.resources.doc_keywords_telemetry +import org.meshtastic.core.resources.doc_keywords_translate +import org.meshtastic.core.resources.doc_keywords_units +import org.meshtastic.core.resources.doc_title_connections +import org.meshtastic.core.resources.doc_title_desktop +import org.meshtastic.core.resources.doc_title_discovery +import org.meshtastic.core.resources.doc_title_firmware +import org.meshtastic.core.resources.doc_title_map +import org.meshtastic.core.resources.doc_title_messages +import org.meshtastic.core.resources.doc_title_mqtt +import org.meshtastic.core.resources.doc_title_node_metrics +import org.meshtastic.core.resources.doc_title_nodes +import org.meshtastic.core.resources.doc_title_onboarding +import org.meshtastic.core.resources.doc_title_settings_module +import org.meshtastic.core.resources.doc_title_settings_radio +import org.meshtastic.core.resources.doc_title_signal_meter +import org.meshtastic.core.resources.doc_title_tak +import org.meshtastic.core.resources.doc_title_telemetry +import org.meshtastic.core.resources.doc_title_translate +import org.meshtastic.core.resources.doc_title_units +import org.meshtastic.feature.docs.model.DocBundle +import org.meshtastic.feature.docs.model.DocPage +import org.meshtastic.feature.docs.model.DocPageContent +import org.meshtastic.feature.docs.model.DocSection +import org.meshtastic.feature.docs.model.KeywordIndexEntry +import org.meshtastic.core.resources.Res as CoreRes + +/** Interface for loading the packaged docs bundle. */ +interface DocBundleLoader { + suspend fun load(): DocBundle + + suspend fun readPage(pageId: String): DocPageContent? + + /** Check whether a Crowdin-translated resource exists for the given page and locale. */ + suspend fun hasTranslatedResource(pageId: String, locale: String): Boolean + + fun pagesBySection(section: DocSection): List +} + +/** + * Default implementation that loads docs from bundled markdown files packaged as Compose Resources under `files/docs/`. + * + * User guide titles and keywords are resolved from string resources so Crowdin translations propagate to the in-app + * index and search. Developer guide entries stay hardcoded English (code-focused audience). + * + * No cross-locale caching — the bundle rebuilds on each [load] call (~1 ms) so locale changes take effect immediately. + */ +@Single(binds = [DocBundleLoader::class]) +@Suppress("TooManyFunctions") +class DefaultDocBundleLoader : DocBundleLoader { + + private var lastPages: List = emptyList() + + companion object { + private const val FRONTMATTER_DELIMITER = "---" + } + + override suspend fun load(): DocBundle { + val entries = buildUserGuideIndex() + buildDeveloperGuideIndex() + val pages = entries.map { it.toDocPage() } + lastPages = pages + return DocBundle( + pages = pages, + pageIndex = pages.associateBy { it.id }, + bundleVersion = "beta", + generatedAt = "2026-05-07T00:00:00Z", + totalBytes = 0L, + ) + } + + override suspend fun readPage(pageId: String): DocPageContent? { + val bundle = load() + val page = bundle.pageIndex[pageId] ?: return null + + val markdown = loadMarkdownContent(page) + return DocPageContent(page = page, markdown = markdown, cssPath = null) + } + + /** + * Load page content with locale awareness. Tries locale-qualified Crowdin resource first, falls back to English. + * Returns a pair of (content, wasLocalized) for cascade decision. + */ + @Suppress("ReturnCount") + suspend fun readPageLocalized(pageId: String, locale: String): Pair { + val bundle = load() + val page = bundle.pageIndex[pageId] ?: return null to false + + if (locale != "en") { + val localizedMarkdown = loadLocalizedMarkdownContent(page, locale) + if (localizedMarkdown != null) { + return DocPageContent(page = page, markdown = localizedMarkdown, cssPath = null) to true + } + } + + val markdown = loadMarkdownContent(page) + return DocPageContent(page = page, markdown = markdown, cssPath = null) to false + } + + private suspend fun loadLocalizedMarkdownContent(page: DocPage, locale: String): String? { + val section = + when (page.section) { + DocSection.UserGuide -> "user" + DocSection.DeveloperGuide -> "developer" + } + // Try qualifiers in specificity order (mirrors Android resource resolution): + // "pt-rBR" → "pt" → give up + for (qualifier in localeQualifiers(locale)) { + val localePath = "files-$qualifier/docs/$section/${page.id}.md" + try { + val bytes = Res.readBytes(localePath) + return stripFrontmatter(bytes.decodeToString()) + } catch (_: Exception) { + continue + } + } + return null + } + + override suspend fun hasTranslatedResource(pageId: String, locale: String): Boolean { + val bundle = load() + val page = bundle.pageIndex[pageId] ?: return false + val section = + when (page.section) { + DocSection.UserGuide -> "user" + DocSection.DeveloperGuide -> "developer" + } + return localeQualifiers(locale).any { qualifier -> + val localePath = "files-$qualifier/docs/$section/${page.id}.md" + try { + Res.readBytes(localePath) + true + } catch (_: Exception) { + false + } + } + } + + /** + * Produces CMP resource qualifier candidates in specificity order. Tries region-qualified first (e.g. "pt-rBR"), + * then language-only ("pt"). Deduplicates when device has no region (both would be "fr"). + */ + private fun localeQualifiers(language: String): List { + val fullQualifier = currentLocaleQualifier() + return buildList { + if (fullQualifier != language) add(fullQualifier) + add(language) + } + } + + private suspend fun loadMarkdownContent(page: DocPage): String { + val section = + when (page.section) { + DocSection.UserGuide -> "user" + DocSection.DeveloperGuide -> "developer" + } + val resourcePath = "files/docs/$section/${page.id}.md" + + return try { + val bytes = Res.readBytes(resourcePath) + val raw = bytes.decodeToString() + stripFrontmatter(raw) + } catch (_: Exception) { + "# ${page.title}\n\nContent not available. The documentation file could not be loaded." + } + } + + @Suppress("ReturnCount") + private fun stripFrontmatter(content: String): String { + if (!content.startsWith(FRONTMATTER_DELIMITER)) return content + val endIndex = content.indexOf(FRONTMATTER_DELIMITER, startIndex = FRONTMATTER_DELIMITER.length) + if (endIndex < 0) return content + return content.substring(endIndex + FRONTMATTER_DELIMITER.length).trimStart() + } + + override fun pagesBySection(section: DocSection): List = + lastPages.filter { it.section == section }.sortedWith(compareBy({ it.navOrder }, { it.title })) + + /** Parse a comma-separated keyword string resource value into a list. */ + private fun parseKeywords(csv: String): List = csv.split(",").map { it.trim() }.filter { it.isNotEmpty() } + + // --------------------------------------------------------------------------- + // User Guide index — titles and keywords from string resources (translatable) + // --------------------------------------------------------------------------- + + /** + * Metadata for a user guide page. [titleRes] and [keywordsRes] are resolved at runtime from the device locale, + * allowing Crowdin translations to appear in the in-app TOC and search index. + */ + private data class UserPageDef( + val id: String, + val titleRes: StringResource, + val keywordsRes: StringResource, + val resourcePath: String, + val navOrder: Int, + val aliases: List, + val charCount: Int, + val iconId: String, + ) + + @Suppress("MagicNumber") + private val userPages = + listOf( + UserPageDef( + "onboarding", + CoreRes.string.doc_title_onboarding, + CoreRes.string.doc_keywords_onboarding, + "docs/user/onboarding.html", + 1, + listOf("first-launch", "setup", "intro"), + 3200, + "onboarding", + ), + UserPageDef( + "connections", + CoreRes.string.doc_title_connections, + CoreRes.string.doc_keywords_connections, + "docs/user/connections.html", + 2, + listOf("bluetooth", "usb", "tcp", "pairing"), + 4100, + "connections", + ), + UserPageDef( + "messages-and-channels", + CoreRes.string.doc_title_messages, + CoreRes.string.doc_keywords_messages, + "docs/user/messages-and-channels.html", + 3, + listOf("channels", "direct-messages", "messaging", "conversations"), + 4500, + "messages", + ), + UserPageDef( + "nodes", + CoreRes.string.doc_title_nodes, + CoreRes.string.doc_keywords_nodes, + "docs/user/nodes.html", + 4, + listOf("node-list", "mesh-nodes", "peers"), + 3800, + "nodes", + ), + UserPageDef( + "node-metrics", + CoreRes.string.doc_title_node_metrics, + CoreRes.string.doc_keywords_node_metrics, + "docs/user/node-metrics.html", + 5, + listOf("metrics", "telemetry", "device-metrics", "signal"), + 5200, + "node-metrics", + ), + UserPageDef( + "map-and-waypoints", + CoreRes.string.doc_title_map, + CoreRes.string.doc_keywords_map, + "docs/user/map-and-waypoints.html", + 6, + listOf("map", "waypoints", "gps", "location"), + 3600, + "map", + ), + UserPageDef( + "settings-radio-user", + CoreRes.string.doc_title_settings_radio, + CoreRes.string.doc_keywords_settings_radio, + "docs/user/settings-radio-user.html", + 7, + listOf("settings", "radio-config", "user-config", "lora"), + 6800, + "settings-radio", + ), + UserPageDef( + "settings-module-admin", + CoreRes.string.doc_title_settings_module, + CoreRes.string.doc_keywords_settings_module, + "docs/user/settings-module-admin.html", + 8, + listOf("modules", "module-config", "administration"), + 5500, + "settings-module", + ), + UserPageDef( + "telemetry-and-sensors", + CoreRes.string.doc_title_telemetry, + CoreRes.string.doc_keywords_telemetry, + "docs/user/telemetry-and-sensors.html", + 9, + listOf("sensors", "environment", "weather", "power-metrics"), + 4800, + "telemetry", + ), + UserPageDef( + "tak", + CoreRes.string.doc_title_tak, + CoreRes.string.doc_keywords_tak, + "docs/user/tak.html", + 10, + listOf("tak", "atak", "team-awareness-kit"), + 2400, + "tak", + ), + UserPageDef( + "mqtt", + CoreRes.string.doc_title_mqtt, + CoreRes.string.doc_keywords_mqtt, + "docs/user/mqtt.html", + 11, + listOf("mqtt", "internet-bridge", "broker"), + 4200, + "mqtt", + ), + UserPageDef( + "discovery", + CoreRes.string.doc_title_discovery, + CoreRes.string.doc_keywords_discovery, + "docs/user/discovery.html", + 12, + listOf("mesh-discovery", "local-discovery", "network-scan"), + 2800, + "discovery", + ), + UserPageDef( + "firmware", + CoreRes.string.doc_title_firmware, + CoreRes.string.doc_keywords_firmware, + "docs/user/firmware.html", + 13, + listOf("firmware", "update", "ota", "flash"), + 3400, + "firmware", + ), + UserPageDef( + "desktop", + CoreRes.string.doc_title_desktop, + CoreRes.string.doc_keywords_desktop, + "docs/user/desktop.html", + 14, + listOf("desktop", "linux", "macos", "windows", "jvm"), + 3900, + "desktop", + ), + UserPageDef( + "signal-meter", + CoreRes.string.doc_title_signal_meter, + CoreRes.string.doc_keywords_signal_meter, + "docs/user/signal-meter.html", + 15, + listOf("signal-quality", "signal-strength", "rssi", "snr"), + 3500, + "signal-meter", + ), + UserPageDef( + "units-and-locale", + CoreRes.string.doc_title_units, + CoreRes.string.doc_keywords_units, + "docs/user/units-and-locale.html", + 16, + listOf("measurement", "units", "locale", "metric", "imperial"), + 3800, + "units-locale", + ), + UserPageDef( + "translate", + CoreRes.string.doc_title_translate, + CoreRes.string.doc_keywords_translate, + "docs/user/translate.html", + 17, + listOf("crowdin", "localization", "language", "i18n", "contribute"), + 3700, + "translate", + ), + ) + + private suspend fun buildUserGuideIndex(): List = userPages.map { def -> + KeywordIndexEntry( + id = def.id, + title = getString(def.titleRes), + section = "user", + resourcePath = def.resourcePath, + navOrder = def.navOrder, + keywords = parseKeywords(getString(def.keywordsRes)), + aliases = def.aliases, + charCount = def.charCount, + iconId = def.iconId, + ) + } + + // --------------------------------------------------------------------------- + // Developer Guide index — hardcoded English (code-focused, not translated) + // --------------------------------------------------------------------------- + + @Suppress("LongMethod", "MagicNumber") + private fun buildDeveloperGuideIndex(): List = listOf( + KeywordIndexEntry( + "architecture", + "Architecture", + "developer", + "docs/developer/architecture.html", + 1, + listOf("architecture", "kmp", "module", "layer", "core", "feature", "compose"), + listOf("layers", "module-architecture", "kmp"), + 4600, + "architecture", + ), + KeywordIndexEntry( + "codebase", + "Codebase", + "developer", + "docs/developer/codebase.html", + 2, + listOf("codebase", "repository", "layout", "gradle", "build", "namespace", "convention"), + listOf("repository-layout", "project-structure", "source-code"), + 3700, + "codebase", + ), + KeywordIndexEntry( + "adding-a-feature-module", + "Adding a Feature Module", + "developer", + "docs/developer/adding-a-feature-module.html", + 3, + listOf("module", "feature", "new", "create", "plugin", "di", "koin"), + listOf("new-module", "feature-module", "module-guide"), + 3200, + "adding-features", + ), + KeywordIndexEntry( + "navigation-and-deep-links", + "Navigation & Deep Links", + "developer", + "docs/developer/navigation-and-deep-links.html", + 4, + listOf("navigation", "deeplink", "route", "navkey", "backstack", "typed"), + listOf("deeplinks", "navigation-3", "routes"), + 4100, + "navigation", + ), + KeywordIndexEntry( + "transport", + "Transport", + "developer", + "docs/developer/transport.html", + 5, + listOf("transport", "ble", "serial", "tcp", "radio", "connection"), + listOf("ble", "serial", "tcp", "radio-transport"), + 3000, + "transport", + ), + KeywordIndexEntry( + "persistence", + "Persistence", + "developer", + "docs/developer/persistence.html", + 6, + listOf("room", "database", "datastore", "prefs", "storage", "migration"), + listOf("room", "database", "datastore", "prefs"), + 2800, + "persistence", + ), + KeywordIndexEntry( + "testing", + "Testing", + "developer", + "docs/developer/testing.html", + 7, + listOf("test", "unit", "screenshot", "compose", "roborazzi", "ci"), + listOf("tests", "unit-tests", "screenshot-tests"), + 3100, + "testing", + ), + KeywordIndexEntry( + "contributing", + "Contributing", + "developer", + "docs/developer/contributing.html", + 8, + listOf("contributing", "pull-request", "branch", "commit", "style", "pr"), + listOf("contributing", "pull-request", "branch-naming"), + 2900, + "contributing", + ), + KeywordIndexEntry( + "measurement", + "Measurement & Formatting", + "developer", + "docs/developer/measurement.html", + 9, + listOf("formatter", "metric", "number", "locale", "temperature", "conversion", "api"), + listOf("metric-formatter", "number-formatter", "measurement"), + 5400, + "measurement", + ), + ) + + private fun KeywordIndexEntry.toDocPage(): DocPage = DocPage( + id = id, + title = title, + section = DocSection.fromString(section), + navOrder = navOrder, + resourcePath = resourcePath, + keywords = keywords, + aliases = aliases, + charCount = charCount, + iconId = iconId, + ) +} diff --git a/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/data/KeywordSearchEngine.kt b/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/data/KeywordSearchEngine.kt new file mode 100644 index 000000000..c9d9ca90e --- /dev/null +++ b/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/data/KeywordSearchEngine.kt @@ -0,0 +1,160 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.meshtastic.feature.docs.data + +import org.koin.core.annotation.Single +import org.meshtastic.feature.docs.model.DocPage +import org.meshtastic.feature.docs.model.DocSearchQuery +import org.meshtastic.feature.docs.model.DocSearchResult + +/** + * Keyword-based search engine for the docs corpus. Provides search functionality without AI, working on all platforms. + */ +@Single +class KeywordSearchEngine(private val bundleLoader: DocBundleLoader) { + private val stopWords = + setOf( + "the", + "a", + "an", + "is", + "are", + "was", + "were", + "be", + "been", + "to", + "of", + "in", + "for", + "on", + "with", + "at", + "by", + "from", + "it", + "this", + "that", + "how", + "what", + "where", + "when", + "do", + "does", + "can", + "will", + "my", + "i", + "me", + "and", + "or", + ) + + /** Search the docs corpus with the given query text. */ + @Suppress("ReturnCount") + suspend fun search(queryText: String): List { + if (queryText.isBlank()) return emptyList() + + val query = normalize(queryText) + if (query.normalizedTerms.isEmpty()) return emptyList() + + val bundle = bundleLoader.load() + return bundle.pages + .map { page -> score(page, query) } + .filter { it.score > 0 } + .sortedWith(compareByDescending { it.score }.thenBy { it.page.navOrder }) + } + + /** Select top pages within a token budget for AI retrieval context. */ + suspend fun selectForTokenBudget(queryText: String, maxChars: Int): List { + val results = search(queryText) + val selected = mutableListOf() + var totalChars = 0 + + for (result in results) { + if (totalChars + result.page.charCount > maxChars) break + selected.add(result.page) + totalChars += result.page.charCount + } + + return selected + } + + fun normalize(queryText: String): DocSearchQuery { + val terms = + queryText + .lowercase() + .replace(Regex("[^\\p{L}\\p{N}\\s-]"), " ") + .split(Regex("\\s+")) + .filter { it.length >= 2 && it !in stopWords } + .distinct() + + return DocSearchQuery(rawText = queryText, normalizedTerms = terms) + } + + @Suppress("LoopWithTooManyJumpStatements") + private fun score(page: DocPage, query: DocSearchQuery): DocSearchResult { + var totalScore = 0 + val matchedTerms = mutableListOf() + + for (term in query.normalizedTerms) { + // Title match (highest priority) + if (page.title.lowercase().contains(term)) { + totalScore += TITLE_MATCH_SCORE + matchedTerms.add(term) + continue + } + + // Exact keyword match + if (page.keywords.any { it.lowercase() == term }) { + totalScore += KEYWORD_EXACT_SCORE + matchedTerms.add(term) + continue + } + + // Partial keyword match + if (page.keywords.any { it.lowercase().contains(term) }) { + totalScore += KEYWORD_PARTIAL_SCORE + matchedTerms.add(term) + continue + } + + // Alias match + if (page.aliases.any { it.lowercase() == term || it.lowercase().contains(term) }) { + totalScore += ALIAS_MATCH_SCORE + matchedTerms.add(term) + continue + } + + // ID/slug match + if (page.id.contains(term)) { + totalScore += ID_MATCH_SCORE + matchedTerms.add(term) + } + } + + return DocSearchResult(page = page, score = totalScore, matchedTerms = matchedTerms) + } + + companion object { + const val TITLE_MATCH_SCORE = 10 + const val KEYWORD_EXACT_SCORE = 7 + const val KEYWORD_PARTIAL_SCORE = 4 + const val ALIAS_MATCH_SCORE = 5 + const val ID_MATCH_SCORE = 3 + } +} diff --git a/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/di/FeatureDocsModule.kt b/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/di/FeatureDocsModule.kt new file mode 100644 index 000000000..84f05c1a6 --- /dev/null +++ b/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/di/FeatureDocsModule.kt @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.meshtastic.feature.docs.di + +import org.koin.core.annotation.ComponentScan +import org.koin.core.annotation.Module + +@Module +@ComponentScan("org.meshtastic.feature.docs") +class FeatureDocsModule diff --git a/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/model/DocModels.kt b/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/model/DocModels.kt new file mode 100644 index 000000000..7fc4bbfce --- /dev/null +++ b/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/model/DocModels.kt @@ -0,0 +1,162 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.meshtastic.feature.docs.model + +import kotlinx.serialization.Serializable +import org.jetbrains.compose.resources.getString +import org.meshtastic.core.resources.Res +import org.meshtastic.core.resources.doc_section_developer +import org.meshtastic.core.resources.doc_section_user + +/** Top-level documentation section. */ +@Serializable +sealed interface DocSection { + @Serializable data object UserGuide : DocSection + + @Serializable data object DeveloperGuide : DocSection + + companion object { + fun fromString(value: String): DocSection = when (value.lowercase()) { + "user" -> UserGuide + "developer" -> DeveloperGuide + else -> UserGuide + } + + fun toSlug(section: DocSection): String = when (section) { + UserGuide -> "user" + DeveloperGuide -> "developer" + } + + suspend fun displayName(section: DocSection): String = when (section) { + UserGuide -> getString(Res.string.doc_section_user) + DeveloperGuide -> getString(Res.string.doc_section_developer) + } + } +} + +/** A single documentation page. */ +@Serializable +data class DocPage( + val id: String, + val title: String, + val section: DocSection, + val navOrder: Int, + val resourcePath: String, + val keywords: List, + val aliases: List = emptyList(), + val charCount: Int, + /** Icon identifier for TOC display (maps to MeshtasticIcons). */ + val iconId: String? = null, +) + +/** Content wrapper that decouples metadata from rendered content. */ +data class DocPageContent( + val page: DocPage, + val html: String? = null, + val markdown: String? = null, + val cssPath: String? = null, +) + +/** Runtime aggregate of the full documentation corpus. */ +data class DocBundle( + val pages: List, + val pageIndex: Map, + val bundleVersion: String, + val generatedAt: String, + val totalBytes: Long, +) + +/** Build-time keyword index entry decoded at runtime. */ +@Serializable +data class KeywordIndexEntry( + val id: String, + val title: String, + val section: String, + val resourcePath: String, + val navOrder: Int, + val keywords: List, + val aliases: List = emptyList(), + val charCount: Int, + val iconId: String? = null, +) + +/** Normalized user search query. */ +data class DocSearchQuery(val rawText: String, val normalizedTerms: List) + +/** Ranked search result. */ +data class DocSearchResult(val page: DocPage, val score: Int, val matchedTerms: List) + +/** AI assistant result model. */ +sealed interface AIDocAssistantResult { + data class Success(val answer: String, val sourcePages: List, val usedOnDeviceModel: Boolean) : + AIDocAssistantResult + + data class Fallback(val message: String, val suggestedPages: List) : AIDocAssistantResult + + data class Error(val reason: DocsAiError, val suggestedPages: List = emptyList()) : AIDocAssistantResult +} + +/** AI error categories. */ +sealed interface DocsAiError { + data object UnsupportedPlatform : DocsAiError + + data object UnsupportedFlavor : DocsAiError + + data object ModelUnavailable : DocsAiError + + data object Busy : DocsAiError + + data object TokenBudgetExceeded : DocsAiError + + data object Unknown : DocsAiError +} + +/** Chirpy assistant session state. */ +data class AIDocAssistantSessionState( + val messages: List = emptyList(), + val isLoading: Boolean = false, + val draftQuestion: String = "", +) + +/** Reference to a source doc page shown as a chip in Chirpy replies. */ +@Serializable data class SourceRef(val id: String, val title: String) + +/** A single message in the Chirpy conversation. */ +@Serializable +data class ChirpyMessage( + val id: String, + val role: ChirpyRole, + val text: String, + val sources: List = emptyList(), +) + +/** Message author role. */ +@Serializable +enum class ChirpyRole { + USER, + ASSISTANT, + SYSTEM, +} + +/** Indicates the source of displayed page content for translation attribution. */ +enum class TranslationSource { + /** English source or Crowdin community translation. */ + BUNDLED, + + /** ML Kit on-device auto-translation (Google flavor only). */ + ML_KIT, +} diff --git a/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/navigation/DocsNavigation.kt b/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/navigation/DocsNavigation.kt new file mode 100644 index 000000000..b1d93be72 --- /dev/null +++ b/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/navigation/DocsNavigation.kt @@ -0,0 +1,329 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.meshtastic.feature.docs.navigation + +import androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi +import androidx.compose.material3.adaptive.navigation3.ListDetailSceneStrategy +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.setValue +import androidx.navigation3.runtime.EntryProviderScope +import androidx.navigation3.runtime.NavBackStack +import androidx.navigation3.runtime.NavKey +import androidx.navigationevent.NavigationEventInfo +import androidx.navigationevent.compose.NavigationBackHandler +import androidx.navigationevent.compose.rememberNavigationEventState +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import org.koin.compose.koinInject +import org.meshtastic.core.common.util.currentLocaleCode +import org.meshtastic.core.common.util.ioDispatcher +import org.meshtastic.core.navigation.SettingsRoute +import org.meshtastic.feature.docs.ai.AIDocAssistant +import org.meshtastic.feature.docs.ai.ChirpySessionHolder +import org.meshtastic.feature.docs.data.DefaultDocBundleLoader +import org.meshtastic.feature.docs.data.DocBundleLoader +import org.meshtastic.feature.docs.data.KeywordSearchEngine +import org.meshtastic.feature.docs.model.AIDocAssistantResult +import org.meshtastic.feature.docs.model.ChirpyMessage +import org.meshtastic.feature.docs.model.ChirpyRole +import org.meshtastic.feature.docs.model.DocPage +import org.meshtastic.feature.docs.model.DocPageContent +import org.meshtastic.feature.docs.model.SourceRef +import org.meshtastic.feature.docs.model.TranslationSource +import org.meshtastic.feature.docs.translation.DocTranslationService +import org.meshtastic.feature.docs.translation.TranslationResult +import org.meshtastic.feature.docs.ui.DocsBrowserScreen +import org.meshtastic.feature.docs.ui.DocsPageRouteScreen +import kotlin.uuid.ExperimentalUuidApi +import kotlin.uuid.Uuid + +/** Registers docs navigation entries into the Settings navigation graph. */ +@OptIn(ExperimentalUuidApi::class, ExperimentalMaterial3AdaptiveApi::class) +fun EntryProviderScope.docsEntries(backStack: NavBackStack) { + entry(metadata = { ListDetailSceneStrategy.listPane() }) { + val hasDetailSelected = remember(backStack) { backStack.any { it is SettingsRoute.HelpDocPage } } + val chirpy = rememberChirpyState(backStack = backStack, currentPageId = null, showFab = !hasDetailSelected) + DocsHelpScreen(backStack = backStack, chirpy = chirpy) + } + + entry(metadata = { ListDetailSceneStrategy.detailPane() }) { route -> + val chirpy = rememberChirpyState(backStack = backStack, currentPageId = route.pageId, showFab = true) + DocsPageScreen(pageId = route.pageId, backStack = backStack, chirpy = chirpy) + } +} + +// ── Shared Chirpy state holder ────────────────────────────────────────────────── + +/** All Chirpy UI state needed by screen composables. */ +class ChirpyUiState( + val isSupported: Boolean, + val showFab: Boolean, + val showSheet: Boolean, + val sessionState: org.meshtastic.feature.docs.model.AIDocAssistantSessionState, + val onToggle: () -> Unit, + val onDismiss: () -> Unit, + val onDraftChange: (String) -> Unit, + val onSubmit: () -> Unit, + val onNavigateToPage: (String) -> Unit, +) + +@OptIn(ExperimentalUuidApi::class) +@Composable +private fun rememberChirpyState( + backStack: NavBackStack, + currentPageId: String?, + showFab: Boolean, +): ChirpyUiState { + val aiAssistant = koinInject() + val holder = koinInject() + val scope = rememberCoroutineScope() + + var isSupported by remember { mutableStateOf(false) } + + // Poll for AI availability. + LaunchedEffect(Unit) { + repeat(AI_SUPPORT_CHECK_RETRIES) { + isSupported = aiAssistant.isSupported() + if (isSupported) return@LaunchedEffect + kotlinx.coroutines.delay(AI_SUPPORT_CHECK_INTERVAL_MS) + } + } + + // Auto-introduce Chirpy when the sheet first opens. + LaunchedEffect(holder.showSheet) { + if (holder.showSheet && holder.sessionState.messages.isEmpty() && !holder.sessionState.isLoading) { + aiAssistant.resetSession() + holder.sessionState = holder.sessionState.copy(isLoading = true) + val result = aiAssistant.answer(CHIRPY_INTRO_PROMPT, currentPageId = currentPageId) + val introMsg = chirpyResultToMessage(result) + holder.sessionState = + holder.sessionState.copy(messages = holder.sessionState.messages + introMsg, isLoading = false) + } + } + + fun submit() { + val question = holder.sessionState.draftQuestion.trim() + if (question.isNotBlank() && !holder.sessionState.isLoading) { + val userMsg = ChirpyMessage(id = Uuid.random().toString(), role = ChirpyRole.USER, text = question) + holder.sessionState = + holder.sessionState.copy( + messages = holder.sessionState.messages + userMsg, + draftQuestion = "", + isLoading = true, + ) + scope.launch { + val result = aiAssistant.answer(question, currentPageId = currentPageId) + val responseMsg = chirpyResultToMessage(result) + holder.sessionState = + holder.sessionState.copy(messages = holder.sessionState.messages + responseMsg, isLoading = false) + } + } + } + + return ChirpyUiState( + isSupported = isSupported, + showFab = showFab, + showSheet = holder.showSheet, + sessionState = holder.sessionState, + onToggle = { holder.showSheet = !holder.showSheet }, + onDismiss = { holder.showSheet = false }, + onDraftChange = { holder.sessionState = holder.sessionState.copy(draftQuestion = it) }, + onSubmit = ::submit, + onNavigateToPage = { pageId -> + holder.showSheet = false + backStack.add(SettingsRoute.HelpDocPage(pageId)) + }, + ) +} + +// ── Screen composables ────────────────────────────────────────────────────────── + +@Composable +private fun DocsHelpScreen(backStack: NavBackStack, chirpy: ChirpyUiState) { + val bundleLoader = koinInject() + val searchEngine = koinInject() + + var pages by remember { mutableStateOf>(emptyList()) } + var isLoading by remember { mutableStateOf(true) } + var searchQuery by remember { mutableStateOf("") } + + LaunchedEffect(Unit) { + val bundle = bundleLoader.load() + pages = bundle.pages.sortedWith(compareBy({ it.section.toString() }, { it.navOrder })) + isLoading = false + } + + LaunchedEffect(searchQuery) { + if (searchQuery.isBlank()) { + val bundle = bundleLoader.load() + pages = bundle.pages.sortedWith(compareBy({ it.section.toString() }, { it.navOrder })) + } else { + val results = searchEngine.search(searchQuery) + pages = results.map { it.page } + } + } + + val backHandlerState = rememberNavigationEventState(NavigationEventInfo.None) + NavigationBackHandler(state = backHandlerState, onBackCompleted = { backStack.removeLastOrNull() }) + + DocsBrowserScreen( + pages = pages, + isLoading = isLoading, + searchQuery = searchQuery, + onSearchQueryChange = { searchQuery = it }, + onSelectPage = { pageId -> backStack.add(SettingsRoute.HelpDocPage(pageId)) }, + onBack = { backStack.removeLastOrNull() }, + isAiSupported = chirpy.isSupported, + showFab = chirpy.showFab, + showChirpy = chirpy.showSheet, + chirpyState = chirpy.sessionState, + onChirpyToggle = chirpy.onToggle, + onChirpyDismiss = chirpy.onDismiss, + onChirpyDraftChange = chirpy.onDraftChange, + onChirpySubmit = chirpy.onSubmit, + onChirpyNavigateToPage = chirpy.onNavigateToPage, + ) +} + +@Suppress("LongMethod") +@Composable +private fun DocsPageScreen(pageId: String, backStack: NavBackStack, chirpy: ChirpyUiState) { + val bundleLoader = koinInject() + val translationService = koinInject() + + var content by remember { mutableStateOf(null) } + var isLoading by remember { mutableStateOf(true) } + var translationSource by remember { mutableStateOf(TranslationSource.BUNDLED) } + + val locale = currentLocaleCode() + + LaunchedEffect(pageId, locale) { + isLoading = true + val loader = bundleLoader as? DefaultDocBundleLoader + + // Try locale-aware loading: Crowdin bundle first, then English fallback + val (loaded, wasCrowdinLocalized) = + if (loader != null) { + withContext(ioDispatcher) { loader.readPageLocalized(pageId, locale) } + } else { + withContext(ioDispatcher) { bundleLoader.readPage(pageId) } to false + } + + when { + // Crowdin provided a localized version — use it directly + wasCrowdinLocalized && loaded != null -> { + content = loaded + translationSource = TranslationSource.BUNDLED + isLoading = false + } + + // Non-English with no Crowdin — attempt ML Kit runtime translation + locale != "en" && loaded != null -> { + // Show English content immediately while translation runs + content = loaded + translationSource = TranslationSource.BUNDLED + isLoading = false + + val result = + withContext(ioDispatcher) { + translationService.translatePage(pageId, loaded.markdown ?: "", locale) + } + when (result) { + is TranslationResult.Success -> { + content = loaded.copy(markdown = result.translatedMarkdown) + translationSource = TranslationSource.ML_KIT + } + + else -> { + /* Keep English content already displayed */ + } + } + } + + // English locale or load failure + else -> { + content = loaded + translationSource = TranslationSource.BUNDLED + isLoading = false + } + } + } + + val backHandlerState = rememberNavigationEventState(NavigationEventInfo.None) + NavigationBackHandler(state = backHandlerState, onBackCompleted = { backStack.removeLastOrNull() }) + + DocsPageRouteScreen( + pageId = pageId, + content = content, + isLoading = isLoading, + translationSource = translationSource, + isNonEnglish = locale != "en", + isAiSupported = chirpy.isSupported, + showChirpy = chirpy.showSheet, + chirpyState = chirpy.sessionState, + onChirpyToggle = chirpy.onToggle, + onChirpyDismiss = chirpy.onDismiss, + onChirpyDraftChange = chirpy.onDraftChange, + onChirpySubmit = chirpy.onSubmit, + onChirpyNavigateToPage = chirpy.onNavigateToPage, + onBack = { backStack.removeLastOrNull() }, + onNavigateToPage = { targetPageId -> backStack.add(SettingsRoute.HelpDocPage(targetPageId)) }, + ) +} + +// ── Constants & helpers ───────────────────────────────────────────────────────── + +/** How often to re-check AI model availability while waiting for download. */ +private const val AI_SUPPORT_CHECK_INTERVAL_MS = 3_000L + +/** Maximum number of AI support checks before giving up. */ +private const val AI_SUPPORT_CHECK_RETRIES = 15 + +/** Prompt sent automatically when the Chirpy sheet opens to generate a natural introduction. */ +private const val CHIRPY_INTRO_PROMPT = "Introduce yourself briefly. Who are you and what can you help with?" + +/** Maps an [AIDocAssistantResult] to a [ChirpyMessage]. */ +@OptIn(ExperimentalUuidApi::class) +private fun chirpyResultToMessage(result: AIDocAssistantResult): ChirpyMessage = when (result) { + is AIDocAssistantResult.Success -> + ChirpyMessage( + id = Uuid.random().toString(), + role = ChirpyRole.ASSISTANT, + text = result.answer, + sources = result.sourcePages.map { SourceRef(id = it.id, title = it.title) }, + ) + + is AIDocAssistantResult.Fallback -> + ChirpyMessage( + id = Uuid.random().toString(), + role = ChirpyRole.ASSISTANT, + text = result.message, + sources = result.suggestedPages.map { SourceRef(id = it.id, title = it.title) }, + ) + + is AIDocAssistantResult.Error -> + ChirpyMessage( + id = Uuid.random().toString(), + role = ChirpyRole.SYSTEM, + text = "Sorry, I couldn't answer that. ${result.reason}", + ) +} diff --git a/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/translation/DocTranslationCache.kt b/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/translation/DocTranslationCache.kt new file mode 100644 index 000000000..690a03810 --- /dev/null +++ b/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/translation/DocTranslationCache.kt @@ -0,0 +1,178 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.meshtastic.feature.docs.translation + +import co.touchlab.kermit.Logger +import kotlinx.coroutines.sync.Mutex +import kotlinx.coroutines.sync.withLock +import okio.FileSystem +import okio.IOException +import okio.Path +import okio.Path.Companion.toPath +import okio.buffer + +/** + * File-based cache for ML Kit translated markdown pages. + * + * Cache key: `{pageId}#{locale}#{md5(sourceContent)}` When the English source changes, the md5 changes and the old + * cache entry becomes stale. Eviction by oldest-access at [maxCacheSizeBytes] (default 50MB). + */ +class DocTranslationCache( + private val cacheDir: Path, + private val fileSystem: FileSystem = FileSystem.SYSTEM, + private val maxCacheSizeBytes: Long = MAX_CACHE_SIZE_BYTES, +) { + companion object { + const val MAX_CACHE_SIZE_BYTES = 50L * 1024 * 1024 // 50 MB + private const val CACHE_SUBDIR = "docs_translation_cache" + private const val EVICTION_TARGET_PERCENT = 75 + private const val PERCENT_DIVISOR = 100 + private const val TAG = "DocTranslationCache" + } + + private val mutex = Mutex() + + private val cacheRoot: Path + get() = cacheDir / CACHE_SUBDIR + + /** Get a cached translation, or null if not cached or stale. */ + suspend fun get(pageId: String, locale: String, sourceHash: String): String? = mutex.withLock { + val file = cacheFile(pageId, locale, sourceHash) + try { + if (fileSystem.exists(file)) { + val bufferedSource = fileSystem.source(file).buffer() + val content = bufferedSource.readUtf8() + bufferedSource.close() + // Touch file to update access time for eviction ordering + touchFile(file) + content + } else { + null + } + } catch (e: IOException) { + Logger.w(tag = TAG) { "Cache read failed for $pageId/$locale: ${e.message}" } + null + } + } + + /** Store a translated page in the cache. Evicts old entries if over size limit. */ + suspend fun put(pageId: String, locale: String, sourceHash: String, translatedMarkdown: String) = mutex.withLock { + try { + fileSystem.createDirectories(cacheRoot) + val file = cacheFile(pageId, locale, sourceHash) + // Write to temp file then move for atomicity + val tmpFile = cacheRoot / "${file.name}.tmp" + val bufferedSink = fileSystem.sink(tmpFile).buffer() + bufferedSink.writeUtf8(translatedMarkdown) + bufferedSink.close() + fileSystem.atomicMove(tmpFile, file) + evictIfNeeded() + } catch (e: IOException) { + Logger.w(tag = TAG) { "Cache write failed for $pageId/$locale: ${e.message}" } + } + } + + /** Remove all cached translations. */ + suspend fun clear() = mutex.withLock { + try { + if (fileSystem.exists(cacheRoot)) { + fileSystem.deleteRecursively(cacheRoot) + } + } catch (e: IOException) { + Logger.w(tag = TAG) { "Cache clear failed: ${e.message}" } + } + } + + /** Total bytes used by the cache. */ + suspend fun sizeBytes(): Long = mutex.withLock { sizeBytesInternal() } + + private fun sizeBytesInternal(): Long = try { + if (!fileSystem.exists(cacheRoot)) return 0L + fileSystem + .listRecursively(cacheRoot) + .filter { fileSystem.metadata(it).isRegularFile } + .filter { it.name.endsWith(".md") } + .sumOf { fileSystem.metadata(it).size ?: 0L } + } catch (e: IOException) { + Logger.w(tag = TAG) { "Cache size calculation failed: ${e.message}" } + 0L + } + + private fun touchFile(file: Path) { + // Write a tiny sidecar file to track last access time for eviction ordering. + // The sidecar's own mtime serves as the access timestamp. + try { + val accessFile = "$file.access".toPath() + val sink = fileSystem.sink(accessFile).buffer() + sink.writeUtf8("1") + sink.close() + } catch (_: IOException) { + // Non-fatal: eviction order may be slightly off + } + } + + private fun cacheFile(pageId: String, locale: String, sourceHash: String): Path { + val safeKey = "${pageId}_${locale}_$sourceHash".replace(Regex("[^a-zA-Z0-9_-]"), "_") + return cacheRoot / "$safeKey.md" + } + + private fun evictIfNeeded() { + if (sizeBytesInternal() <= maxCacheSizeBytes) return + + try { + val files = + fileSystem + .listRecursively(cacheRoot) + .filter { fileSystem.metadata(it).isRegularFile } + .filter { it.name.endsWith(".md") } + .sortedBy { file -> + // Use sidecar access file mtime if available, else cache file mtime + val accessFile = "$file.access".toPath() + if (fileSystem.exists(accessFile)) { + fileSystem.metadata(accessFile).lastModifiedAtMillis ?: 0L + } else { + fileSystem.metadata(file).lastModifiedAtMillis ?: 0L + } + } + .toList() + + var currentSize = sizeBytesInternal() + for (file in files) { + if (currentSize <= maxCacheSizeBytes * EVICTION_TARGET_PERCENT / PERCENT_DIVISOR) break + val fileSize = fileSystem.metadata(file).size ?: 0L + fileSystem.delete(file) + // Also delete sidecar access file + val accessFile = "$file.access".toPath() + try { + fileSystem.delete(accessFile) + } catch (_: IOException) { + /* ignore */ + } + currentSize -= fileSize + } + } catch (e: IOException) { + Logger.w(tag = TAG) { "Cache eviction failed: ${e.message}" } + } + } +} + +/** Simple MD5 hash for cache key generation. Uses Okio's built-in hashing. */ +fun md5Hash(content: String): String { + val buffer = okio.Buffer() + buffer.writeUtf8(content) + return buffer.md5().hex() +} diff --git a/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/translation/DocTranslationService.kt b/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/translation/DocTranslationService.kt new file mode 100644 index 000000000..cdf14af90 --- /dev/null +++ b/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/translation/DocTranslationService.kt @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.meshtastic.feature.docs.translation + +/** + * Service interface for translating documentation pages at runtime. + * + * Used as a fallback when Crowdin-translated markdown bundles are not available for the user's locale. Google flavor + * provides ML Kit implementation; fdroid/desktop/iOS provide a no-op that returns [TranslationResult.Unavailable]. + */ +interface DocTranslationService { + /** Translate a markdown page to the target locale. Returns the fully-translated markdown or a status. */ + suspend fun translatePage(pageId: String, markdown: String, targetLocale: String): TranslationResult + + /** Check if translation to the given locale is possible (model downloaded or downloadable). */ + suspend fun isLanguageAvailable(locale: String): Boolean + + /** Download the translation model for a locale. Only meaningful on google flavor. */ + suspend fun downloadLanguageModel(locale: String): DownloadResult +} + +/** Result of a translation attempt. */ +sealed class TranslationResult { + /** Translation succeeded. [translatedMarkdown] contains the complete translated markdown source. */ + data class Success(val translatedMarkdown: String) : TranslationResult() + + /** Translation model needs to be downloaded before translating. */ + data class ModelDownloadRequired(val locale: String, val estimatedSizeMb: Int) : TranslationResult() + + /** Translation is not available on this platform/flavor. Caller should fall back to English. */ + data object Unavailable : TranslationResult() +} + +/** Result of a model download attempt. */ +sealed class DownloadResult { + data object Success : DownloadResult() + + data class Failed(val reason: String) : DownloadResult() +} diff --git a/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/translation/MarkdownTranslationSegmenter.kt b/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/translation/MarkdownTranslationSegmenter.kt new file mode 100644 index 000000000..ba34812fe --- /dev/null +++ b/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/translation/MarkdownTranslationSegmenter.kt @@ -0,0 +1,375 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.meshtastic.feature.docs.translation + +/** + * Segments markdown into translatable and non-translatable blocks, translates the text portions, and reassembles valid + * markdown. + * + * Preserves: + * - Fenced code blocks (``` or ~~~) + * - Indented code blocks (4+ spaces or tab) + * - Link URLs and image paths (translates link text only) + * - HTML tags + * - Frontmatter (--- delimited YAML) + * + * Translates: + * - Paragraphs, headings, list items, blockquotes, table cell text + */ +@Suppress("TooManyFunctions") +object MarkdownTranslationSegmenter { + + /** + * Translate markdown content by extracting text segments, translating them, and reassembling. + * + * @param markdown The source markdown content + * @param translate A suspend function that translates a plain text string + * @return The translated markdown with structure preserved + */ + @Suppress("CyclomaticComplexMethod", "LongMethod") + suspend fun translateMarkdown(markdown: String, translate: suspend (String) -> String): String { + val lines = markdown.lines() + val result = StringBuilder() + var i = 0 + + // Skip frontmatter + if (lines.isNotEmpty() && lines[0].trim() == "---") { + result.appendLine(lines[0]) + i = 1 + while (i < lines.size) { + result.appendLine(lines[i]) + if (lines[i].trim() == "---") { + i++ + break + } + i++ + } + } + + while (i < lines.size) { + val line = lines[i] + + when { + // Fenced code block + isFencedCodeStart(line) -> { + val fence = extractFence(line) + result.appendLine(line) + i++ + while (i < lines.size && !lines[i].trimStart().startsWith(fence)) { + result.appendLine(lines[i]) + i++ + } + if (i < lines.size) { + result.appendLine(lines[i]) + i++ + } + } + + // Indented code block (4 spaces or tab, and previous line is blank or start) + isIndentedCode(line) && (i == 0 || lines[i - 1].isBlank()) -> { + while (i < lines.size && (isIndentedCode(lines[i]) || lines[i].isBlank())) { + result.appendLine(lines[i]) + i++ + } + } + + // HTML block (starts with <) + line.trimStart().startsWith("<") && isHtmlBlock(line) -> { + result.appendLine(line) + i++ + } + + // Empty line + line.isBlank() -> { + result.appendLine(line) + i++ + } + + // Heading (ATX: # followed by space or end-of-line) + line.trimStart().matches(Regex("^#{1,6}(\\s.*|$)")) -> { + val headingPrefix = + line.substring(0, line.indexOf('#')) + + line.substring(line.indexOf('#')).takeWhile { it == '#' } + + " " + val text = line.substring(headingPrefix.length) + val translated = if (text.isNotBlank()) translate(text) else text + result.appendLine("$headingPrefix$translated") + i++ + } + + // Blockquote + line.trimStart().startsWith(">") -> { + val stripped = line.trimStart().removePrefix(">").trimStart() + val indent = line.takeWhile { it != '>' } + val translated = if (stripped.isNotBlank()) translate(stripped) else stripped + result.appendLine("$indent> $translated") + i++ + } + + // List item (unordered or ordered) + isListItem(line) -> { + val (listPrefix, text) = splitListItem(line) + val translatedText = translateInlineMarkdown(text, translate) + result.appendLine("$listPrefix$translatedText") + i++ + } + + // Table row + line.trimStart().startsWith("|") -> { + if (isTableSeparator(line)) { + result.appendLine(line) + } else { + val translated = translateTableRow(line, translate) + result.appendLine(translated) + } + i++ + } + + // Regular paragraph text + else -> { + val translated = translateInlineMarkdown(line, translate) + result.appendLine(translated) + i++ + } + } + } + + // Remove trailing newline added by appendLine on last line + return result.toString().trimEnd('\n') + } + + /** Translate text while preserving inline markdown elements like links, images, and inline code. */ + @Suppress("CyclomaticComplexMethod", "LongMethod") + private suspend fun translateInlineMarkdown(text: String, translate: suspend (String) -> String): String { + if (text.isBlank()) return text + + val segments = mutableListOf() + var pos = 0 + + while (pos < text.length) { + when { + // Inline code + text[pos] == '`' -> { + val end = text.indexOf('`', pos + 1) + if (end > pos) { + segments.add(Segment.Verbatim(text.substring(pos, end + 1))) + pos = end + 1 + } else { + segments.add(Segment.Translatable(text[pos].toString())) + pos++ + } + } + + // Image: ![alt](url) + text[pos] == '!' && pos + 1 < text.length && text[pos + 1] == '[' -> { + val closeBracket = text.indexOf(']', pos + 2) + if (closeBracket > pos && closeBracket + 1 < text.length && text[closeBracket + 1] == '(') { + val closeParen = text.indexOf(')', closeBracket + 2) + if (closeParen > closeBracket) { + segments.add(Segment.Verbatim(text.substring(pos, closeParen + 1))) + pos = closeParen + 1 + } else { + segments.add(Segment.Translatable(text[pos].toString())) + pos++ + } + } else { + segments.add(Segment.Translatable(text[pos].toString())) + pos++ + } + } + + // Link: [text](url) + text[pos] == '[' -> { + val closeBracket = text.indexOf(']', pos + 1) + if (closeBracket > pos && closeBracket + 1 < text.length && text[closeBracket + 1] == '(') { + val closeParen = text.indexOf(')', closeBracket + 2) + if (closeParen > closeBracket) { + val linkText = text.substring(pos + 1, closeBracket) + val url = text.substring(closeBracket + 2, closeParen) + segments.add(Segment.Link(linkText, url)) + pos = closeParen + 1 + } else { + segments.add(Segment.Translatable(text[pos].toString())) + pos++ + } + } else { + segments.add(Segment.Translatable(text[pos].toString())) + pos++ + } + } + + else -> { + // Accumulate regular text + val start = pos + while (pos < text.length && !isInlineMarker(text, pos)) { + pos++ + } + segments.add(Segment.Translatable(text.substring(start, pos))) + } + } + } + + // Translate all translatable segments + return segments + .joinToString("") { segment -> + when (segment) { + is Segment.Verbatim -> segment.text + + is Segment.Translatable -> + if (segment.text.isNotBlank()) { + // We can't suspend in joinToString, so we pre-translate below + segment.text + } else { + segment.text + } + + is Segment.Link -> "[${segment.text}](${segment.url})" + } + } + .let { assembled -> + // Check if there's anything to translate (text segments or link text) + val translatableText = segments.filterIsInstance().joinToString("") { it.text } + val hasTranslatableLinks = segments.any { it is Segment.Link && it.text.isNotBlank() } + if (translatableText.isBlank() && !hasTranslatableLinks) return@let assembled + + // Translate with preserved inline elements (handles both text and link text) + translateWithPreservedInlines(segments, translate) + } + } + + private suspend fun translateWithPreservedInlines( + segments: List, + translate: suspend (String) -> String, + ): String { + val result = StringBuilder() + // Group consecutive translatables, translate them together, preserve verbatim/links + val buffer = StringBuilder() + + for (segment in segments) { + when (segment) { + is Segment.Translatable -> buffer.append(segment.text) + + is Segment.Verbatim -> { + if (buffer.isNotBlank()) { + result.append(translate(buffer.toString())) + } else { + result.append(buffer) + } + buffer.clear() + result.append(segment.text) + } + + is Segment.Link -> { + if (buffer.isNotBlank()) { + result.append(translate(buffer.toString())) + } else { + result.append(buffer) + } + buffer.clear() + val translatedLinkText = if (segment.text.isNotBlank()) translate(segment.text) else segment.text + result.append("[$translatedLinkText](${segment.url})") + } + } + } + if (buffer.isNotBlank()) { + result.append(translate(buffer.toString())) + } else { + result.append(buffer) + } + + return result.toString() + } + + private suspend fun translateTableRow(line: String, translate: suspend (String) -> String): String { + val cells = line.split("|") + val translated = + cells.map { cell -> + val trimmed = cell.trim() + if (trimmed.isNotBlank()) " ${translate(trimmed)} " else cell + } + return translated.joinToString("|") + } + + private fun isFencedCodeStart(line: String): Boolean { + val trimmed = line.trimStart() + return trimmed.startsWith("```") || trimmed.startsWith("~~~") + } + + private fun isInlineMarker(text: String, pos: Int): Boolean = + text[pos] == '`' || text[pos] == '[' || (text[pos] == '!' && pos + 1 < text.length && text[pos + 1] == '[') + + private fun extractFence(line: String): String { + val trimmed = line.trimStart() + val fenceChar = trimmed[0] + return trimmed.takeWhile { it == fenceChar } + } + + private fun isIndentedCode(line: String): Boolean = line.startsWith(" ") || line.startsWith("\t") + + private fun isHtmlBlock(line: String): Boolean { + val trimmed = line.trimStart().lowercase() + return trimmed.startsWith(" { + val leadingWhitespace = line.takeWhile { it == ' ' || it == '\t' } + val trimmed = line.trimStart() + return when { + trimmed.startsWith("- ") -> Pair("$leadingWhitespace- ", trimmed.removePrefix("- ")) + + trimmed.startsWith("* ") -> Pair("$leadingWhitespace* ", trimmed.removePrefix("* ")) + + trimmed.startsWith("+ ") -> Pair("$leadingWhitespace+ ", trimmed.removePrefix("+ ")) + + else -> { + val match = ORDERED_LIST_REGEX.find(trimmed) + if (match != null) { + Pair("$leadingWhitespace${match.value}", trimmed.removePrefix(match.value)) + } else { + Pair(leadingWhitespace, trimmed) + } + } + } + } + + private fun isTableSeparator(line: String): Boolean = + line.replace("|", "").replace("-", "").replace(":", "").replace(" ", "").isEmpty() + + private sealed class Segment { + data class Translatable(val text: String) : Segment() + + data class Verbatim(val text: String) : Segment() + + data class Link(val text: String, val url: String) : Segment() + } + + private val ORDERED_LIST_REGEX = Regex("^\\d+[.)]+\\s") +} diff --git a/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/translation/NoOpDocTranslator.kt b/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/translation/NoOpDocTranslator.kt new file mode 100644 index 000000000..5a86df6c8 --- /dev/null +++ b/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/translation/NoOpDocTranslator.kt @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.meshtastic.feature.docs.translation + +/** + * No-op translation service for platforms without on-device translation capability (F-Droid, Desktop, iOS). + * + * Always returns [TranslationResult.Unavailable], causing the caller to fall back to English. + */ +class NoOpDocTranslator : DocTranslationService { + override suspend fun translatePage(pageId: String, markdown: String, targetLocale: String): TranslationResult = + TranslationResult.Unavailable + + override suspend fun isLanguageAvailable(locale: String): Boolean = false + + override suspend fun downloadLanguageModel(locale: String): DownloadResult = + DownloadResult.Failed("Translation not available on this platform") +} diff --git a/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/ui/ChirpyAssistantSheet.kt b/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/ui/ChirpyAssistantSheet.kt new file mode 100644 index 000000000..a579f7b7e --- /dev/null +++ b/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/ui/ChirpyAssistantSheet.kt @@ -0,0 +1,316 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.meshtastic.feature.docs.ui + +import androidx.compose.animation.core.RepeatMode +import androidx.compose.animation.core.animateFloat +import androidx.compose.animation.core.infiniteRepeatable +import androidx.compose.animation.core.rememberInfiniteTransition +import androidx.compose.animation.core.tween +import androidx.compose.foundation.BorderStroke +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.ExperimentalLayoutApi +import androidx.compose.foundation.layout.FlowRow +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.imePadding +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.lazy.rememberLazyListState +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.text.KeyboardActions +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.material3.Card +import androidx.compose.material3.CardDefaults +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.ModalBottomSheet +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.SuggestionChip +import androidx.compose.material3.SuggestionChipDefaults +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.material3.rememberModalBottomSheetState +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.alpha +import androidx.compose.ui.platform.LocalSoftwareKeyboardController +import androidx.compose.ui.text.input.ImeAction +import androidx.compose.ui.text.input.KeyboardCapitalization +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp +import com.mikepenz.markdown.m3.Markdown +import org.jetbrains.compose.resources.painterResource +import org.meshtastic.core.resources.img_chirpy +import org.meshtastic.core.ui.icon.MeshtasticIcons +import org.meshtastic.core.ui.icon.Send +import org.meshtastic.feature.docs.model.AIDocAssistantSessionState +import org.meshtastic.feature.docs.model.ChirpyMessage +import org.meshtastic.feature.docs.model.ChirpyRole +import org.meshtastic.core.resources.Res as CoreRes + +/** Chirpy AI Assistant bottom sheet with chat UI. Hidden entirely when the assistant reports unsupported. */ +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun ChirpyAssistantSheet( + state: AIDocAssistantSessionState, + isSupported: Boolean, + onDraftChange: (String) -> Unit, + onSubmit: () -> Unit, + onDismiss: () -> Unit, + onNavigateToPage: (String) -> Unit, + modifier: Modifier = Modifier, +) { + if (!isSupported) return + + val sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true) + + ModalBottomSheet(onDismissRequest = onDismiss, sheetState = sheetState, modifier = modifier) { + Column(modifier = Modifier.fillMaxSize().imePadding().padding(16.dp)) { + Text( + text = "Chirpy Assistant", + style = MaterialTheme.typography.titleMedium, + modifier = Modifier.padding(bottom = 12.dp), + ) + + // Message list + val listState = rememberLazyListState() + LazyColumn(state = listState, modifier = Modifier.weight(1f).fillMaxWidth()) { + items(state.messages, key = { it.id }) { message -> + ChirpyMessageBubble(message = message, onNavigateToPage = onNavigateToPage) + Spacer(modifier = Modifier.height(8.dp)) + } + + if (state.isLoading) { + item { ThinkingBubble() } + } + } + + // Input bar — matches messaging MessageInput style + val canSend = state.draftQuestion.isNotBlank() && !state.isLoading + val keyboardController = LocalSoftwareKeyboardController.current + + fun doSend() { + if (canSend) { + onSubmit() + keyboardController?.hide() + } + } + + OutlinedTextField( + value = state.draftQuestion, + onValueChange = onDraftChange, + placeholder = { Text("Ask about Meshtastic…") }, + singleLine = false, + maxLines = 3, + shape = RoundedCornerShape(INPUT_CORNER_PERCENT), + keyboardOptions = + KeyboardOptions(capitalization = KeyboardCapitalization.Sentences, imeAction = ImeAction.Send), + keyboardActions = KeyboardActions(onSend = { doSend() }), + trailingIcon = { + IconButton(onClick = ::doSend, enabled = canSend) { + Icon(imageVector = MeshtasticIcons.Send, contentDescription = "Send") + } + }, + modifier = Modifier.fillMaxWidth().padding(top = 8.dp), + ) + } + } +} + +private val AVATAR_SIZE = 24.dp +private val BUBBLE_CORNER = 8.dp +private val BUBBLE_BORDER_WIDTH = 0.5.dp +private const val INPUT_CORNER_PERCENT = 50f + +/** User bubble shape: rounded everywhere except bottom-end (like MessageItem sender). */ +private val UserBubbleShape = + RoundedCornerShape(topStart = BUBBLE_CORNER, topEnd = BUBBLE_CORNER, bottomStart = BUBBLE_CORNER, bottomEnd = 0.dp) + +/** Chirpy bubble shape: rounded everywhere except top-start (like MessageItem receiver). */ +private val ChirpyBubbleShape = + RoundedCornerShape(topStart = 0.dp, topEnd = BUBBLE_CORNER, bottomStart = BUBBLE_CORNER, bottomEnd = BUBBLE_CORNER) + +@Composable +private fun ChirpyMessageBubble( + message: ChirpyMessage, + onNavigateToPage: (String) -> Unit, + modifier: Modifier = Modifier, +) { + val isUser = message.role == ChirpyRole.USER + + if (isUser) { + UserBubble(message = message, modifier = modifier) + } else { + AssistantBubble(message = message, onNavigateToPage = onNavigateToPage, modifier = modifier) + } +} + +@Composable +private fun UserBubble(message: ChirpyMessage, modifier: Modifier = Modifier) { + val bubbleColor = MaterialTheme.colorScheme.primaryContainer + val borderColor = MaterialTheme.colorScheme.primary + + Column(modifier = modifier.fillMaxWidth().padding(start = 48.dp), horizontalAlignment = Alignment.End) { + Surface( + shape = UserBubbleShape, + color = bubbleColor, + contentColor = MaterialTheme.colorScheme.onSurface, + border = BorderStroke(BUBBLE_BORDER_WIDTH, borderColor), + ) { + Text( + text = message.text, + style = MaterialTheme.typography.bodyMedium, + modifier = Modifier.padding(horizontal = 8.dp, vertical = 6.dp), + ) + } + } +} + +/** Simplified NodeChip-style label shown above Chirpy's message bubbles. */ +@Composable +private fun ChirpyChip(modifier: Modifier = Modifier) { + Card( + modifier = modifier.height(CHIRPY_CHIP_HEIGHT), + shape = MaterialTheme.shapes.small, + colors = + CardDefaults.cardColors( + containerColor = MaterialTheme.colorScheme.tertiaryContainer, + contentColor = MaterialTheme.colorScheme.onTertiaryContainer, + ), + ) { + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier.padding(horizontal = 6.dp).height(CHIRPY_CHIP_HEIGHT), + ) { + Image( + painter = painterResource(CoreRes.drawable.img_chirpy), + contentDescription = null, + modifier = Modifier.size(18.dp), + ) + Spacer(modifier = Modifier.width(4.dp)) + Text( + text = "Chirpy", + fontSize = MaterialTheme.typography.labelLarge.fontSize, + textAlign = TextAlign.Center, + maxLines = 1, + ) + } + } +} + +private val CHIRPY_CHIP_HEIGHT = 28.dp + +@OptIn(ExperimentalLayoutApi::class) +@Composable +private fun AssistantBubble(message: ChirpyMessage, onNavigateToPage: (String) -> Unit, modifier: Modifier = Modifier) { + val bubbleColor = MaterialTheme.colorScheme.surfaceVariant + val borderColor = MaterialTheme.colorScheme.outline + + Column(modifier = modifier.fillMaxWidth().padding(end = 48.dp), horizontalAlignment = Alignment.Start) { + // NodeChip-style sender label above the bubble (like MessageItem) + Row( + modifier = Modifier.padding(horizontal = 8.dp, vertical = 2.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(4.dp), + ) { + ChirpyChip() + } + + Surface( + shape = ChirpyBubbleShape, + color = bubbleColor, + contentColor = MaterialTheme.colorScheme.onSurface, + border = BorderStroke(BUBBLE_BORDER_WIDTH, borderColor), + modifier = Modifier.padding(horizontal = 8.dp), + ) { + Markdown(content = message.text, modifier = Modifier.padding(horizontal = 8.dp, vertical = 6.dp)) + } + + if (message.sources.isNotEmpty()) { + FlowRow( + horizontalArrangement = Arrangement.spacedBy(6.dp), + modifier = Modifier.padding(top = 4.dp, start = 8.dp), + ) { + message.sources.forEach { source -> + SuggestionChip( + onClick = { onNavigateToPage(source.id) }, + label = { Text(text = source.title, style = MaterialTheme.typography.labelSmall) }, + colors = + SuggestionChipDefaults.suggestionChipColors( + containerColor = MaterialTheme.colorScheme.secondaryContainer, + labelColor = MaterialTheme.colorScheme.onSecondaryContainer, + ), + border = BorderStroke(BUBBLE_BORDER_WIDTH, MaterialTheme.colorScheme.outline), + ) + } + } + } + } +} + +/** Thinking bubble — shows while Chirpy generates a response, styled as an assistant bubble with pulsing alpha. */ +@Composable +private fun ThinkingBubble(modifier: Modifier = Modifier) { + val infiniteTransition = rememberInfiniteTransition(label = "thinking") + val alpha by + infiniteTransition.animateFloat( + initialValue = 0.4f, + targetValue = 1f, + animationSpec = + infiniteRepeatable(animation = tween(durationMillis = 800), repeatMode = RepeatMode.Reverse), + label = "thinkingAlpha", + ) + + val bubbleColor = MaterialTheme.colorScheme.surfaceVariant + val borderColor = MaterialTheme.colorScheme.outline + + Column(modifier = modifier.fillMaxWidth().padding(end = 48.dp), horizontalAlignment = Alignment.Start) { + Row( + modifier = Modifier.padding(horizontal = 8.dp, vertical = 2.dp), + verticalAlignment = Alignment.CenterVertically, + ) { + ChirpyChip() + } + + Surface( + shape = ChirpyBubbleShape, + color = bubbleColor, + contentColor = MaterialTheme.colorScheme.onSurface, + border = BorderStroke(BUBBLE_BORDER_WIDTH, borderColor), + modifier = Modifier.padding(horizontal = 8.dp), + ) { + Text( + text = "Chirpy is thinking…", + style = MaterialTheme.typography.bodyMedium, + modifier = Modifier.padding(horizontal = 8.dp, vertical = 6.dp).alpha(alpha), + ) + } + } +} diff --git a/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/ui/ComposeResourceImageTransformer.kt b/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/ui/ComposeResourceImageTransformer.kt new file mode 100644 index 000000000..31bfd82b3 --- /dev/null +++ b/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/ui/ComposeResourceImageTransformer.kt @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.meshtastic.feature.docs.ui + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.geometry.Size +import androidx.compose.ui.graphics.painter.Painter +import coil3.compose.AsyncImagePainter +import coil3.compose.LocalPlatformContext +import coil3.compose.rememberAsyncImagePainter +import coil3.request.ImageRequest +import com.mikepenz.markdown.model.ImageData +import com.mikepenz.markdown.model.ImageTransformer +import meshtasticandroid.feature.docs.generated.resources.Res +import org.jetbrains.compose.resources.MissingResourceException + +/** + * Resolves local markdown image references (e.g. `assets/screenshots/foo.png`) to bundled Compose resources via + * [Res.getUri] and loads them asynchronously using Coil 3's [rememberAsyncImagePainter]. + * + * External URLs (`http://` / `https://`) return `null` so the default renderer behaviour applies (or they are simply + * skipped). Missing resources are silently skipped (returns `null`) to avoid crashing composition when screenshots have + * not yet been generated or synced. + * + * FR-038: Screenshots synced by `syncDocsToComposeResources` land under + * `composeResources/files/docs/assets/screenshots/`, matching the relative paths used in the authored markdown. + */ +class ComposeResourceImageTransformer : ImageTransformer { + + @Composable + override fun transform(link: String): ImageData? { + if (link.startsWith("http://") || link.startsWith("https://")) return null + + // Markdown uses root-relative paths (/assets/screenshots/foo.png) for Jekyll compatibility. + // Strip the leading slash to build the compose resource path. + val relativePath = link.removePrefix("/") + val resourcePath = "files/docs/$relativePath" + val uri = + try { + Res.getUri(resourcePath) + } catch (_: MissingResourceException) { + null + } + + return uri?.let { resolvedUri -> + val painter = + rememberAsyncImagePainter( + model = + ImageRequest.Builder(LocalPlatformContext.current) + .data(resolvedUri) + .size(coil3.size.Size.ORIGINAL) + .build(), + ) + ImageData(painter) + } + } + + @Composable + override fun intrinsicSize(painter: Painter): Size { + var size by remember(painter) { mutableStateOf(painter.intrinsicSize) } + if (painter is AsyncImagePainter) { + val painterState = painter.state.collectAsState() + painterState.value.painter?.intrinsicSize?.also { size = it } + } + return size + } +} diff --git a/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/ui/DocPageIconResolver.kt b/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/ui/DocPageIconResolver.kt new file mode 100644 index 000000000..b2877bd53 --- /dev/null +++ b/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/ui/DocPageIconResolver.kt @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.meshtastic.feature.docs.ui + +import androidx.compose.runtime.Composable +import androidx.compose.ui.graphics.vector.ImageVector +import org.meshtastic.core.ui.icon.Altitude +import org.meshtastic.core.ui.icon.Antenna +import org.meshtastic.core.ui.icon.BluetoothConnected +import org.meshtastic.core.ui.icon.BugReport +import org.meshtastic.core.ui.icon.Chart +import org.meshtastic.core.ui.icon.ConfigChannels +import org.meshtastic.core.ui.icon.Device +import org.meshtastic.core.ui.icon.ForkLeft +import org.meshtastic.core.ui.icon.Group +import org.meshtastic.core.ui.icon.Language +import org.meshtastic.core.ui.icon.MeshtasticIcons +import org.meshtastic.core.ui.icon.Message +import org.meshtastic.core.ui.icon.Nodes +import org.meshtastic.core.ui.icon.Notes +import org.meshtastic.core.ui.icon.PersonSearch +import org.meshtastic.core.ui.icon.PinDrop +import org.meshtastic.core.ui.icon.Rssi +import org.meshtastic.core.ui.icon.Settings +import org.meshtastic.core.ui.icon.SignalCellular3Bar +import org.meshtastic.core.ui.icon.WavingHand +import org.meshtastic.feature.docs.model.DocPage + +/** Resolves a [DocPage.iconId] to a [ImageVector] from [MeshtasticIcons]. */ +@Composable +@Suppress("CyclomaticComplexMethod") +internal fun DocPage.resolveIcon(): ImageVector = when (iconId) { + // User Guide + "onboarding" -> MeshtasticIcons.WavingHand + + "connections" -> MeshtasticIcons.BluetoothConnected + + "messages" -> MeshtasticIcons.Message + + "nodes" -> MeshtasticIcons.Nodes + + "node-metrics" -> MeshtasticIcons.Chart + + "map" -> MeshtasticIcons.PinDrop + + "settings-radio" -> MeshtasticIcons.Settings + + "settings-module" -> MeshtasticIcons.ConfigChannels + + "telemetry" -> MeshtasticIcons.Altitude + + "tak" -> MeshtasticIcons.Antenna + + "mqtt" -> MeshtasticIcons.Rssi + + "discovery" -> MeshtasticIcons.PersonSearch + + "firmware" -> MeshtasticIcons.Device + + "desktop" -> MeshtasticIcons.Device + + "signal-meter" -> MeshtasticIcons.SignalCellular3Bar + + "units-locale" -> MeshtasticIcons.Language + + "translate" -> MeshtasticIcons.Language + + // Developer Guide + "architecture" -> MeshtasticIcons.ForkLeft + + "codebase" -> MeshtasticIcons.ForkLeft + + "adding-features" -> MeshtasticIcons.ForkLeft + + "navigation" -> MeshtasticIcons.ForkLeft + + "transport" -> MeshtasticIcons.Antenna + + "persistence" -> MeshtasticIcons.Chart + + "testing" -> MeshtasticIcons.BugReport + + "contributing" -> MeshtasticIcons.Group + + "measurement" -> MeshtasticIcons.Chart + + else -> MeshtasticIcons.Notes +} diff --git a/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/ui/DocsBrowserScreen.kt b/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/ui/DocsBrowserScreen.kt new file mode 100644 index 000000000..6e09d11e6 --- /dev/null +++ b/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/ui/DocsBrowserScreen.kt @@ -0,0 +1,205 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.meshtastic.feature.docs.ui + +import androidx.compose.foundation.Image +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.FloatingActionButton +import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.ListItem +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBar +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.semantics.contentDescription +import androidx.compose.ui.semantics.heading +import androidx.compose.ui.semantics.semantics +import androidx.compose.ui.unit.dp +import org.jetbrains.compose.resources.painterResource +import org.meshtastic.core.resources.img_chirpy +import org.meshtastic.core.ui.icon.ArrowBack +import org.meshtastic.core.ui.icon.MeshtasticIcons +import org.meshtastic.feature.docs.model.AIDocAssistantSessionState +import org.meshtastic.feature.docs.model.DocPage +import org.meshtastic.feature.docs.model.DocSection +import org.meshtastic.core.resources.Res as CoreRes + +/** Main documentation browser screen showing a grouped TOC. */ +@Suppress("LongMethod", "LongParameterList") +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun DocsBrowserScreen( + pages: List, + isLoading: Boolean, + searchQuery: String, + onSearchQueryChange: (String) -> Unit, + onSelectPage: (String) -> Unit, + onBack: () -> Unit, + modifier: Modifier = Modifier, + isAiSupported: Boolean = false, + showFab: Boolean = false, + showChirpy: Boolean = false, + chirpyState: AIDocAssistantSessionState = AIDocAssistantSessionState(), + onChirpyToggle: () -> Unit = {}, + onChirpyDismiss: () -> Unit = {}, + onChirpyDraftChange: (String) -> Unit = {}, + onChirpySubmit: () -> Unit = {}, + onChirpyNavigateToPage: (String) -> Unit = {}, +) { + Scaffold( + topBar = { + TopAppBar( + title = { Text("Help & Documentation") }, + navigationIcon = { + IconButton(onClick = onBack) { + Icon(imageVector = MeshtasticIcons.ArrowBack, contentDescription = "Navigate back") + } + }, + ) + }, + floatingActionButton = { + if (isAiSupported && showFab) { + FloatingActionButton(onClick = onChirpyToggle) { + Image( + painter = painterResource(CoreRes.drawable.img_chirpy), + contentDescription = "Ask Chirpy", + modifier = Modifier.size(32.dp), + ) + } + } + }, + modifier = modifier, + ) { innerPadding -> + Column(modifier = Modifier.fillMaxSize().padding(innerPadding)) { + DocsSearchBar( + query = searchQuery, + onQueryChange = onSearchQueryChange, + modifier = Modifier.fillMaxWidth().padding(horizontal = 16.dp, vertical = 8.dp), + ) + + when { + isLoading -> { + Column( + modifier = Modifier.fillMaxSize(), + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.CenterHorizontally, + ) { + CircularProgressIndicator() + Text( + text = "Loading documentation...", + style = MaterialTheme.typography.bodyMedium, + modifier = Modifier.padding(top = 16.dp), + ) + } + } + + pages.isEmpty() -> { + Column( + modifier = Modifier.fillMaxSize(), + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.CenterHorizontally, + ) { + Text( + text = if (searchQuery.isNotBlank()) "No results found" else "No documentation available", + style = MaterialTheme.typography.bodyLarge, + ) + } + } + + else -> { + DocsTocList(pages = pages, onSelectPage = onSelectPage) + } + } + } + + if (showChirpy) { + ChirpyAssistantSheet( + state = chirpyState, + isSupported = isAiSupported, + onDraftChange = onChirpyDraftChange, + onSubmit = onChirpySubmit, + onDismiss = onChirpyDismiss, + onNavigateToPage = onChirpyNavigateToPage, + ) + } + } +} + +@Composable +private fun DocsTocList(pages: List, onSelectPage: (String) -> Unit, modifier: Modifier = Modifier) { + val userGuidePages = + remember(pages) { pages.filter { it.section == DocSection.UserGuide }.sortedBy { it.navOrder } } + val devGuidePages = + remember(pages) { pages.filter { it.section == DocSection.DeveloperGuide }.sortedBy { it.navOrder } } + + LazyColumn(modifier = modifier.fillMaxSize(), contentPadding = PaddingValues(bottom = 16.dp)) { + if (userGuidePages.isNotEmpty()) { + item { + Text( + text = "User Guide", + style = MaterialTheme.typography.titleMedium, + modifier = Modifier.padding(horizontal = 16.dp, vertical = 12.dp).semantics { heading() }, + ) + } + items(userGuidePages, key = { it.id }) { page -> DocPageListItem(page = page, onSelectPage = onSelectPage) } + } + + if (devGuidePages.isNotEmpty()) { + item { + HorizontalDivider(modifier = Modifier.padding(vertical = 8.dp)) + Text( + text = "Developer Guide", + style = MaterialTheme.typography.titleMedium, + modifier = Modifier.padding(horizontal = 16.dp, vertical = 12.dp).semantics { heading() }, + ) + } + items(devGuidePages, key = { it.id }) { page -> DocPageListItem(page = page, onSelectPage = onSelectPage) } + } + } +} + +@Composable +private fun DocPageListItem(page: DocPage, onSelectPage: (String) -> Unit, modifier: Modifier = Modifier) { + ListItem( + leadingContent = { + Icon( + imageVector = page.resolveIcon(), + contentDescription = null, + tint = MaterialTheme.colorScheme.onSurfaceVariant, + ) + }, + headlineContent = { Text(page.title) }, + modifier = modifier.clickable { onSelectPage(page.id) }.semantics { contentDescription = "Open ${page.title}" }, + ) +} diff --git a/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/ui/DocsPageRouteScreen.kt b/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/ui/DocsPageRouteScreen.kt new file mode 100644 index 000000000..3410d60e7 --- /dev/null +++ b/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/ui/DocsPageRouteScreen.kt @@ -0,0 +1,244 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.meshtastic.feature.docs.ui + +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.FloatingActionButton +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBar +import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalUriHandler +import androidx.compose.ui.platform.UriHandler +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import com.mikepenz.markdown.compose.components.markdownComponents +import com.mikepenz.markdown.compose.elements.MarkdownTable +import com.mikepenz.markdown.compose.elements.MarkdownTableHeader +import com.mikepenz.markdown.compose.elements.MarkdownTableRow +import com.mikepenz.markdown.m3.Markdown +import com.mikepenz.markdown.model.markdownDimens +import org.jetbrains.compose.resources.painterResource +import org.meshtastic.core.resources.img_chirpy +import org.meshtastic.core.ui.icon.ArrowBack +import org.meshtastic.core.ui.icon.MeshtasticIcons +import org.meshtastic.feature.docs.model.AIDocAssistantSessionState +import org.meshtastic.feature.docs.model.DocPageContent +import org.meshtastic.feature.docs.model.TranslationSource +import org.meshtastic.core.resources.Res as CoreRes + +/** Routes a page ID to the appropriate page renderer surface. */ +@Suppress("LongMethod", "LongParameterList") +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun DocsPageRouteScreen( + pageId: String, + content: DocPageContent?, + isLoading: Boolean, + translationSource: TranslationSource = TranslationSource.BUNDLED, + isNonEnglish: Boolean = false, + isAiSupported: Boolean = false, + showChirpy: Boolean = false, + chirpyState: AIDocAssistantSessionState = AIDocAssistantSessionState(), + onChirpyToggle: () -> Unit = {}, + onChirpyDismiss: () -> Unit = {}, + onChirpyDraftChange: (String) -> Unit = {}, + onChirpySubmit: () -> Unit = {}, + onChirpyNavigateToPage: (String) -> Unit = {}, + onBack: () -> Unit, + onNavigateToPage: (String) -> Unit = {}, + modifier: Modifier = Modifier, +) { + Scaffold( + topBar = { + TopAppBar( + title = { + Column { + Text( + text = content?.page?.title ?: "Documentation", + maxLines = 1, + overflow = TextOverflow.Ellipsis, + ) + if (isNonEnglish && !isLoading && content != null) { + Text( + text = + when (translationSource) { + TranslationSource.ML_KIT -> "Auto-translated" + TranslationSource.BUNDLED -> "Community translated" + }, + style = MaterialTheme.typography.labelSmall, + color = MaterialTheme.colorScheme.onSurfaceVariant, + ) + } + } + }, + navigationIcon = { + IconButton(onClick = onBack) { + Icon(imageVector = MeshtasticIcons.ArrowBack, contentDescription = "Navigate back") + } + }, + ) + }, + floatingActionButton = { + if (isAiSupported) { + FloatingActionButton(onClick = onChirpyToggle) { + Image( + painter = painterResource(CoreRes.drawable.img_chirpy), + contentDescription = "Ask Chirpy", + modifier = Modifier.size(32.dp), + ) + } + } + }, + modifier = modifier, + ) { innerPadding -> + Column(modifier = Modifier.fillMaxSize().padding(innerPadding)) { + when { + isLoading -> { + Column( + modifier = Modifier.fillMaxSize(), + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.CenterHorizontally, + ) { + CircularProgressIndicator() + } + } + + content == null -> { + Column( + modifier = Modifier.fillMaxSize(), + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.CenterHorizontally, + ) { + Text(text = "Page not found: $pageId", style = MaterialTheme.typography.bodyLarge) + Text( + text = "This page may have been moved or removed.", + style = MaterialTheme.typography.bodyMedium, + modifier = Modifier.padding(top = 8.dp), + ) + } + } + + else -> { + val markdownText = content.markdown ?: "No content available." + val platformUriHandler = LocalUriHandler.current + val docsUriHandler = + remember(platformUriHandler) { + DocsLinkUriHandler(onNavigateToPage = onNavigateToPage, fallback = platformUriHandler) + } + CompositionLocalProvider(LocalUriHandler provides docsUriHandler) { + Markdown( + content = markdownText, + imageTransformer = ComposeResourceImageTransformer(), + dimens = markdownDimens(tableCellWidth = 108.dp), + components = + markdownComponents( + table = { + MarkdownTable( + content = it.content, + node = it.node, + style = it.typography.text, + headerBlock = { c, h, tw, s -> + MarkdownTableHeader( + content = c, + header = h, + tableWidth = tw, + style = s, + maxLines = Int.MAX_VALUE, + overflow = TextOverflow.Clip, + ) + }, + rowBlock = { c, r, tw, s -> + MarkdownTableRow( + content = c, + header = r, + tableWidth = tw, + style = s, + maxLines = Int.MAX_VALUE, + overflow = TextOverflow.Clip, + ) + }, + ) + }, + ), + modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState()).padding(16.dp), + ) + } + } + } + } + + if (showChirpy) { + ChirpyAssistantSheet( + state = chirpyState, + isSupported = isAiSupported, + onDraftChange = onChirpyDraftChange, + onSubmit = onChirpySubmit, + onDismiss = onChirpyDismiss, + onNavigateToPage = onChirpyNavigateToPage, + ) + } + } +} + +/** + * Custom [UriHandler] that intercepts relative doc links and navigates in-app. + * + * Relative links like `connections`, `../developer/architecture`, or anchor-only `#section` are resolved to a page ID + * and dispatched via [onNavigateToPage]. External `http(s)://` URLs are forwarded to the [fallback] platform handler. + */ +internal class DocsLinkUriHandler(private val onNavigateToPage: (String) -> Unit, private val fallback: UriHandler) : + UriHandler { + override fun openUri(uri: String) { + if (uri.startsWith("http://") || uri.startsWith("https://")) { + fallback.openUri(uri) + return + } + // Anchor-only links (e.g. "#permissions") — ignore, stay on current page + if (uri.startsWith("#")) return + + // Resolve relative path to a page ID: + // "connections" -> "connections" + // "../developer/architecture" -> "architecture" + // "mqtt.html" -> "mqtt" + val cleaned = + uri.substringBefore('#') // strip anchor + .substringAfterLast('/') // take filename segment + .removeSuffix(".html") // strip .html if present + .removeSuffix(".md") // strip .md if present + + if (cleaned.isNotBlank()) { + onNavigateToPage(cleaned) + } + } +} diff --git a/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/ui/DocsPreviews.kt b/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/ui/DocsPreviews.kt new file mode 100644 index 000000000..c08a620c6 --- /dev/null +++ b/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/ui/DocsPreviews.kt @@ -0,0 +1,509 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.meshtastic.feature.docs.ui + +import androidx.compose.foundation.BorderStroke +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.PreviewLightDark +import androidx.compose.ui.unit.dp +import org.jetbrains.compose.resources.painterResource +import org.meshtastic.core.resources.img_chirpy +import org.meshtastic.core.ui.theme.AppTheme +import org.meshtastic.feature.docs.model.AIDocAssistantSessionState +import org.meshtastic.feature.docs.model.ChirpyMessage +import org.meshtastic.feature.docs.model.ChirpyRole +import org.meshtastic.feature.docs.model.DocPage +import org.meshtastic.feature.docs.model.DocSection +import org.meshtastic.feature.docs.model.SourceRef +import org.meshtastic.core.resources.Res as CoreRes + +private val sampleUserGuidePages = + listOf( + DocPage( + "onboarding", + "Getting Started", + DocSection.UserGuide, + 1, + "user/onboarding.md", + listOf("setup", "intro"), + charCount = 3200, + iconId = "onboarding", + ), + DocPage( + "connections", + "Connections", + DocSection.UserGuide, + 2, + "user/connections.md", + listOf("bluetooth", "usb"), + charCount = 4100, + iconId = "connections", + ), + DocPage( + "messages-and-channels", + "Messages & Channels", + DocSection.UserGuide, + 3, + "user/messages-and-channels.md", + listOf("chat"), + charCount = 5200, + iconId = "messages", + ), + DocPage( + "nodes", + "Nodes", + DocSection.UserGuide, + 4, + "user/nodes.md", + listOf("node list"), + charCount = 3800, + iconId = "nodes", + ), + DocPage( + "node-metrics", + "Node Metrics", + DocSection.UserGuide, + 5, + "user/node-metrics.md", + listOf("telemetry"), + charCount = 6200, + iconId = "node-metrics", + ), + DocPage( + "map-and-waypoints", + "Map & Waypoints", + DocSection.UserGuide, + 6, + "user/map-and-waypoints.md", + listOf("map"), + charCount = 4500, + iconId = "map", + ), + DocPage( + "settings-radio-user", + "Radio & User Settings", + DocSection.UserGuide, + 7, + "user/settings-radio-user.md", + listOf("config"), + charCount = 5800, + iconId = "settings-radio", + ), + DocPage( + "firmware", + "Firmware Updates", + DocSection.UserGuide, + 9, + "user/firmware.md", + listOf("ota"), + charCount = 3400, + iconId = "firmware", + ), + DocPage( + "signal-meter", + "Signal Meter", + DocSection.UserGuide, + 15, + "user/signal-meter.md", + listOf("rssi", "snr"), + charCount = 3500, + iconId = "signal-meter", + ), + DocPage( + "units-and-locale", + "Units & Locale", + DocSection.UserGuide, + 16, + "user/units-and-locale.md", + listOf("metric", "imperial"), + charCount = 3800, + iconId = "units-locale", + ), + ) + +private val sampleDevGuidePages = + listOf( + DocPage( + "architecture", + "Architecture", + DocSection.DeveloperGuide, + 1, + "developer/architecture.md", + listOf("kmp"), + charCount = 4800, + iconId = "architecture", + ), + DocPage( + "codebase", + "Codebase Layout", + DocSection.DeveloperGuide, + 2, + "developer/codebase.md", + listOf("structure"), + charCount = 3600, + iconId = "codebase", + ), + DocPage( + "contributing", + "Contributing", + DocSection.DeveloperGuide, + 8, + "developer/contributing.md", + listOf("pr"), + charCount = 2900, + iconId = "contributing", + ), + ) + +private val sampleAllPages = sampleUserGuidePages + sampleDevGuidePages + +private val sampleMarkdown = + """ + # Getting Started + + Welcome to Meshtastic! This guide walks you through the initial setup. + + ## First Launch + + When you open the app for the first time, you'll be guided through an introductory + flow that helps configure essential permissions and settings. + + ### Permissions + + The app requires several permissions to operate correctly: + + - **Location** — Required for Bluetooth scanning + - **Bluetooth** — Primary connection method + - **Notifications** — Incoming message alerts + + > 💡 **Tip:** You can change notification preferences later in Android system settings. + """ + .trimIndent() + +private val sampleChirpyMessages = + listOf( + ChirpyMessage("1", ChirpyRole.USER, "How do I connect to my radio?"), + ChirpyMessage( + "2", + ChirpyRole.ASSISTANT, + "To connect to your Meshtastic radio via Bluetooth:\n\n" + + "1. Power on your radio\n2. Open the app → Connections\n" + + "3. Tap Scan for Devices\n4. Select your device from the list\n\n" + + "Make sure Bluetooth and Location permissions are granted.", + sources = listOf(SourceRef("connections", "Connections"), SourceRef("onboarding", "Getting Started")), + ), + ChirpyMessage("3", ChirpyRole.USER, "What if my device doesn't appear in the scan?"), + ) + +// region DocsBrowserScreen Previews + +@Suppress("PreviewPublic") +@PreviewLightDark +@Composable +fun DocsBrowserScreenPreview() { + AppTheme { + DocsBrowserScreen( + pages = sampleAllPages, + isLoading = false, + searchQuery = "", + onSearchQueryChange = {}, + onSelectPage = {}, + onBack = {}, + ) + } +} + +@Suppress("PreviewPublic") +@PreviewLightDark +@Composable +fun DocsBrowserScreenEmptyPreview() { + AppTheme { + DocsBrowserScreen( + pages = emptyList(), + isLoading = false, + searchQuery = "xyzzy", + onSearchQueryChange = {}, + onSelectPage = {}, + onBack = {}, + ) + } +} + +// endregion + +// region DocsPageRouteScreen Previews + +@Suppress("PreviewPublic") +@PreviewLightDark +@Composable +fun DocsPageContentPreview() { + AppTheme { + DocsPageRouteScreen( + pageId = "onboarding", + content = + org.meshtastic.feature.docs.model.DocPageContent( + page = sampleUserGuidePages.first(), + markdown = sampleMarkdown, + ), + isLoading = false, + onBack = {}, + ) + } +} + +@Suppress("PreviewPublic") +@PreviewLightDark +@Composable +fun DocsPageNotFoundPreview() { + AppTheme { DocsPageRouteScreen(pageId = "deleted-page", content = null, isLoading = false, onBack = {}) } +} + +// endregion + +// region ChirpyAssistant Previews + +/** + * Previews the Chirpy assistant chat content without ModalBottomSheet wrapper, since ModalBottomSheet requires a sheet + * host that is unavailable in previews. + */ +@Suppress("PreviewPublic") +@PreviewLightDark +@Composable +fun ChirpyAssistantContentPreview() { + AppTheme { + Surface { + ChirpyAssistantContent( + state = + AIDocAssistantSessionState(messages = sampleChirpyMessages, isLoading = false, draftQuestion = ""), + onDraftChange = {}, + onSubmit = {}, + onNavigateToPage = {}, + ) + } + } +} + +@Suppress("PreviewPublic") +@PreviewLightDark +@Composable +fun ChirpyAssistantLoadingPreview() { + AppTheme { + Surface { + ChirpyAssistantContent( + state = + AIDocAssistantSessionState( + messages = sampleChirpyMessages, + isLoading = true, + draftQuestion = "What channels should I use?", + ), + onDraftChange = {}, + onSubmit = {}, + onNavigateToPage = {}, + ) + } + } +} + +/** Standalone chat content layout extracted for preview compatibility. */ +@Composable +fun ChirpyAssistantContent( + state: AIDocAssistantSessionState, + onDraftChange: (String) -> Unit, + onSubmit: () -> Unit, + onNavigateToPage: (String) -> Unit, + modifier: Modifier = Modifier, +) { + Column(modifier = modifier.fillMaxSize().padding(16.dp)) { + Text( + text = "Chirpy Assistant", + style = MaterialTheme.typography.titleMedium, + modifier = Modifier.padding(bottom = 12.dp), + ) + + LazyColumn(modifier = Modifier.weight(1f).fillMaxWidth()) { + items(state.messages, key = { it.id }) { message -> + ChirpyBubble(message = message, onNavigateToPage = onNavigateToPage) + Spacer(modifier = Modifier.height(8.dp)) + } + + if (state.isLoading) { + item { PreviewThinkingBubble() } + } + } + + OutlinedTextField( + value = state.draftQuestion, + onValueChange = onDraftChange, + placeholder = { Text("Ask about Meshtastic...") }, + trailingIcon = { + TextButton(onClick = onSubmit, enabled = state.draftQuestion.isNotBlank() && !state.isLoading) { + Text("Send") + } + }, + singleLine = false, + maxLines = 3, + modifier = Modifier.fillMaxWidth().padding(top = 8.dp), + ) + } +} + +private val PreviewBubbleCorner = 8.dp + +@Suppress("LongMethod") +@Composable +private fun ChirpyBubble(message: ChirpyMessage, onNavigateToPage: (String) -> Unit, modifier: Modifier = Modifier) { + val isUser = message.role == ChirpyRole.USER + + if (isUser) { + val bubbleColor = MaterialTheme.colorScheme.primaryContainer + val borderColor = MaterialTheme.colorScheme.primary + Column(modifier = modifier.fillMaxWidth().padding(start = 48.dp), horizontalAlignment = Alignment.End) { + Surface( + shape = RoundedCornerShape(PreviewBubbleCorner, PreviewBubbleCorner, 0.dp, PreviewBubbleCorner), + color = bubbleColor, + contentColor = MaterialTheme.colorScheme.onSurface, + border = BorderStroke(0.5.dp, borderColor), + ) { + Text( + text = message.text, + style = MaterialTheme.typography.bodyMedium, + modifier = Modifier.padding(horizontal = 8.dp, vertical = 6.dp), + ) + } + } + } else { + val bubbleColor = MaterialTheme.colorScheme.surfaceVariant + val borderColor = MaterialTheme.colorScheme.outline + Column(modifier = modifier.fillMaxWidth().padding(end = 48.dp), horizontalAlignment = Alignment.Start) { + Row(verticalAlignment = Alignment.Top) { + Image( + painter = painterResource(CoreRes.drawable.img_chirpy), + contentDescription = null, + modifier = Modifier.size(24.dp).padding(top = 2.dp), + ) + Spacer(modifier = Modifier.width(6.dp)) + Surface( + shape = RoundedCornerShape(0.dp, PreviewBubbleCorner, PreviewBubbleCorner, PreviewBubbleCorner), + color = bubbleColor, + contentColor = MaterialTheme.colorScheme.onSurface, + border = BorderStroke(0.5.dp, borderColor), + ) { + Text( + text = message.text, + style = MaterialTheme.typography.bodyMedium, + modifier = Modifier.padding(horizontal = 8.dp, vertical = 6.dp), + ) + } + } + + if (message.sources.isNotEmpty()) { + Row( + horizontalArrangement = Arrangement.spacedBy(6.dp), + modifier = Modifier.padding(top = 4.dp, start = 30.dp), + ) { + message.sources.forEach { source -> + Surface( + shape = RoundedCornerShape(PreviewBubbleCorner), + color = MaterialTheme.colorScheme.secondaryContainer, + border = BorderStroke(0.5.dp, MaterialTheme.colorScheme.outline), + onClick = { onNavigateToPage(source.id) }, + ) { + Text( + text = source.title, + style = MaterialTheme.typography.labelSmall, + modifier = Modifier.padding(horizontal = 8.dp, vertical = 4.dp), + ) + } + } + } + } + } + } +} + +/** Preview-safe thinking bubble without infinite animations. */ +@Composable +private fun PreviewThinkingBubble(modifier: Modifier = Modifier) { + val bubbleColor = MaterialTheme.colorScheme.surfaceVariant + val borderColor = MaterialTheme.colorScheme.outline + + Column(modifier = modifier.fillMaxWidth().padding(end = 48.dp), horizontalAlignment = Alignment.Start) { + Row(verticalAlignment = Alignment.Top) { + Image( + painter = painterResource(CoreRes.drawable.img_chirpy), + contentDescription = null, + modifier = Modifier.size(24.dp).padding(top = 2.dp), + ) + Spacer(modifier = Modifier.width(6.dp)) + Surface( + shape = RoundedCornerShape(0.dp, PreviewBubbleCorner, PreviewBubbleCorner, PreviewBubbleCorner), + color = bubbleColor, + contentColor = MaterialTheme.colorScheme.onSurface, + border = BorderStroke(0.5.dp, borderColor), + ) { + Text( + text = "Chirpy is thinking…", + style = MaterialTheme.typography.bodyMedium, + modifier = Modifier.padding(horizontal = 8.dp, vertical = 6.dp), + ) + } + } + } +} + +// endregion + +// region DocsSearchBar Previews + +@Suppress("PreviewPublic") +@PreviewLightDark +@Composable +fun DocsSearchBarEmptyPreview() { + AppTheme { Surface { DocsSearchBar(query = "", onQueryChange = {}, modifier = Modifier.padding(16.dp)) } } +} + +@Suppress("PreviewPublic") +@PreviewLightDark +@Composable +fun DocsSearchBarWithQueryPreview() { + AppTheme { + Surface { DocsSearchBar(query = "bluetooth settings", onQueryChange = {}, modifier = Modifier.padding(16.dp)) } + } +} + +// endregion diff --git a/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/ui/DocsSearchBar.kt b/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/ui/DocsSearchBar.kt new file mode 100644 index 000000000..32ccd5837 --- /dev/null +++ b/feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/ui/DocsSearchBar.kt @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.meshtastic.feature.docs.ui + +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.semantics.contentDescription +import androidx.compose.ui.semantics.semantics +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.resources.Res +import org.meshtastic.core.resources.doc_clear_search +import org.meshtastic.core.resources.doc_search_placeholder +import org.meshtastic.core.ui.icon.Close +import org.meshtastic.core.ui.icon.MeshtasticIcons +import org.meshtastic.core.ui.icon.Search + +/** Search bar for filtering documentation pages by keywords. */ +@Composable +fun DocsSearchBar(query: String, onQueryChange: (String) -> Unit, modifier: Modifier = Modifier) { + val searchPlaceholder = stringResource(Res.string.doc_search_placeholder) + OutlinedTextField( + value = query, + onValueChange = onQueryChange, + placeholder = { Text(searchPlaceholder) }, + leadingIcon = { Icon(imageVector = MeshtasticIcons.Search, contentDescription = null) }, + trailingIcon = { + if (query.isNotEmpty()) { + IconButton(onClick = { onQueryChange("") }) { + Icon( + imageVector = MeshtasticIcons.Close, + contentDescription = stringResource(Res.string.doc_clear_search), + ) + } + } + }, + singleLine = true, + modifier = modifier.fillMaxWidth().semantics { contentDescription = searchPlaceholder }, + ) +} diff --git a/feature/docs/src/commonTest/kotlin/org/meshtastic/feature/docs/DocBundleLoaderTest.kt b/feature/docs/src/commonTest/kotlin/org/meshtastic/feature/docs/DocBundleLoaderTest.kt new file mode 100644 index 000000000..472ab8582 --- /dev/null +++ b/feature/docs/src/commonTest/kotlin/org/meshtastic/feature/docs/DocBundleLoaderTest.kt @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.meshtastic.feature.docs + +import kotlinx.coroutines.test.runTest +import org.meshtastic.feature.docs.data.DefaultDocBundleLoader +import org.meshtastic.feature.docs.model.DocSection +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertNotNull +import kotlin.test.assertTrue + +class DocBundleLoaderTest { + + private val loader = DefaultDocBundleLoader() + + @Test + fun `load returns non-empty bundle`() = runTest { + val bundle = loader.load() + assertTrue(bundle.pages.isNotEmpty()) + assertEquals(bundle.pages.size, bundle.pageIndex.size) + } + + @Test + fun `page index keys match page ids`() = runTest { + val bundle = loader.load() + assertEquals(bundle.pages.map { it.id }.toSet(), bundle.pageIndex.keys) + } + + @Test + fun `pages by section returns correct grouping`() = runTest { + loader.load() + val userPages = loader.pagesBySection(DocSection.UserGuide) + val devPages = loader.pagesBySection(DocSection.DeveloperGuide) + + assertTrue(userPages.isNotEmpty()) + assertTrue(devPages.isNotEmpty()) + assertTrue(userPages.all { it.section == DocSection.UserGuide }) + assertTrue(devPages.all { it.section == DocSection.DeveloperGuide }) + } + + @Test + fun `pages by section are sorted by navOrder`() = runTest { + loader.load() + val userPages = loader.pagesBySection(DocSection.UserGuide) + val navOrders = userPages.map { it.navOrder } + assertEquals(navOrders.sorted(), navOrders) + } + + @Test + fun `read page returns content for valid page id`() = runTest { + val content = loader.readPage("onboarding") + assertNotNull(content) + assertEquals("onboarding", content.page.id) + assertEquals("Getting Started", content.page.title) + } + + @Test + fun `read page returns null for invalid page id`() = runTest { + val content = loader.readPage("nonexistent-page") + assertEquals(null, content) + } + + @Test + fun `all pages have positive char count`() = runTest { + val bundle = loader.load() + assertTrue(bundle.pages.all { it.charCount > 0 }) + } + + @Test + fun `all pages have non-empty keywords`() = runTest { + val bundle = loader.load() + assertTrue(bundle.pages.all { it.keywords.isNotEmpty() }) + } +} diff --git a/feature/docs/src/commonTest/kotlin/org/meshtastic/feature/docs/DocsNavigationTest.kt b/feature/docs/src/commonTest/kotlin/org/meshtastic/feature/docs/DocsNavigationTest.kt new file mode 100644 index 000000000..e62d79270 --- /dev/null +++ b/feature/docs/src/commonTest/kotlin/org/meshtastic/feature/docs/DocsNavigationTest.kt @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.meshtastic.feature.docs + +import org.meshtastic.core.navigation.SettingsRoute +import kotlin.test.Test +import kotlin.test.assertEquals + +class DocsNavigationTest { + + @Test + fun `HelpDocs route serializable`() { + val route = SettingsRoute.HelpDocs + assertEquals(SettingsRoute.HelpDocs, route) + } + + @Test + fun `HelpDocPage route preserves page id`() { + val route = SettingsRoute.HelpDocPage("messages-and-channels") + assertEquals("messages-and-channels", route.pageId) + } + + @Test + fun `HelpDocPage route equality`() { + val route1 = SettingsRoute.HelpDocPage("onboarding") + val route2 = SettingsRoute.HelpDocPage("onboarding") + assertEquals(route1, route2) + } +} diff --git a/feature/docs/src/commonTest/kotlin/org/meshtastic/feature/docs/KeywordSearchEngineTest.kt b/feature/docs/src/commonTest/kotlin/org/meshtastic/feature/docs/KeywordSearchEngineTest.kt new file mode 100644 index 000000000..d0601a725 --- /dev/null +++ b/feature/docs/src/commonTest/kotlin/org/meshtastic/feature/docs/KeywordSearchEngineTest.kt @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.meshtastic.feature.docs + +import kotlinx.coroutines.test.runTest +import org.meshtastic.feature.docs.data.DefaultDocBundleLoader +import org.meshtastic.feature.docs.data.KeywordSearchEngine +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertTrue + +class KeywordSearchEngineTest { + + private val loader = DefaultDocBundleLoader() + private val engine = KeywordSearchEngine(loader) + + @Test + fun `search for bluetooth returns connections page`() = runTest { + val results = engine.search("bluetooth") + assertTrue(results.isNotEmpty()) + assertEquals("connections", results.first().page.id) + } + + @Test + fun `search for messages returns messages-and-channels page`() = runTest { + val results = engine.search("messages channels") + assertTrue(results.isNotEmpty()) + assertTrue(results.any { it.page.id == "messages-and-channels" }) + } + + @Test + fun `empty query returns no results`() = runTest { + val results = engine.search("") + assertTrue(results.isEmpty()) + } + + @Test + fun `stop words are filtered`() { + val query = engine.normalize("how do I connect the bluetooth") + assertTrue("how" !in query.normalizedTerms) + assertTrue("do" !in query.normalizedTerms) + assertTrue("the" !in query.normalizedTerms) + assertTrue("connect" in query.normalizedTerms) + assertTrue("bluetooth" in query.normalizedTerms) + } + + @Test + fun `title matches score higher than keyword matches`() = runTest { + val results = engine.search("firmware") + assertTrue(results.isNotEmpty()) + // "Firmware Updates" page has "firmware" directly in title — should rank first + assertEquals("firmware", results.first().page.id) + assertTrue(results.first().score >= KeywordSearchEngine.TITLE_MATCH_SCORE) + } + + @Test + fun `alias matches produce results`() = runTest { + val results = engine.search("direct-messages") + assertTrue(results.isNotEmpty()) + assertTrue(results.any { it.page.id == "messages-and-channels" }) + } + + @Test + fun `token budget selection limits pages`() = runTest { + // Budget large enough for some but not all matching pages + val pages = engine.selectForTokenBudget("settings module", maxChars = 15000) + assertTrue(pages.isNotEmpty()) + assertTrue(pages.sumOf { it.charCount } <= 15000) + } + + @Test + fun `results are sorted by score descending`() = runTest { + val results = engine.search("settings module") + if (results.size >= 2) { + for (i in 0 until results.size - 1) { + assertTrue(results[i].score >= results[i + 1].score) + } + } + } + + @Test + fun `search is case insensitive`() = runTest { + val lower = engine.search("mqtt") + val upper = engine.search("MQTT") + assertEquals(lower.map { it.page.id }, upper.map { it.page.id }) + } +} diff --git a/feature/docs/src/commonTest/kotlin/org/meshtastic/feature/docs/translation/DocTranslationCacheTest.kt b/feature/docs/src/commonTest/kotlin/org/meshtastic/feature/docs/translation/DocTranslationCacheTest.kt new file mode 100644 index 000000000..61642fd46 --- /dev/null +++ b/feature/docs/src/commonTest/kotlin/org/meshtastic/feature/docs/translation/DocTranslationCacheTest.kt @@ -0,0 +1,119 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.meshtastic.feature.docs.translation + +import kotlinx.coroutines.test.runTest +import okio.FileSystem +import kotlin.test.AfterTest +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertNull +import kotlin.test.assertTrue + +class DocTranslationCacheTest { + + private val cacheDir = FileSystem.SYSTEM_TEMPORARY_DIRECTORY / "docs_cache_test_${kotlin.random.Random.nextInt()}" + private val cache = + DocTranslationCache( + cacheDir = cacheDir, + fileSystem = FileSystem.SYSTEM, + maxCacheSizeBytes = 1024, // 1KB for testing eviction + ) + + @AfterTest + fun tearDown() { + try { + FileSystem.SYSTEM.deleteRecursively(cacheDir) + } catch (_: Exception) { + // best effort cleanup + } + } + + @Test + fun `get returns null for uncached page`() = runTest { + val result = cache.get("onboarding", "es", "abc123") + assertNull(result) + } + + @Test + fun `put then get returns cached content`() = runTest { + cache.put("onboarding", "es", "hash1", "# Bienvenido") + val result = cache.get("onboarding", "es", "hash1") + assertEquals("# Bienvenido", result) + } + + @Test + fun `different hash returns null - stale cache`() = runTest { + cache.put("onboarding", "es", "hash1", "# Bienvenido") + val result = cache.get("onboarding", "es", "hash2") + assertNull(result) + } + + @Test + fun `different locale returns null`() = runTest { + cache.put("onboarding", "es", "hash1", "# Bienvenido") + val result = cache.get("onboarding", "fr", "hash1") + assertNull(result) + } + + @Test + fun `clear removes all cached entries`() = runTest { + cache.put("page1", "es", "h1", "content1") + cache.put("page2", "fr", "h2", "content2") + cache.clear() + assertNull(cache.get("page1", "es", "h1")) + assertNull(cache.get("page2", "fr", "h2")) + } + + @Test + fun `sizeBytes reports total cache size`() = runTest { + assertEquals(0L, cache.sizeBytes()) + cache.put("page1", "es", "h1", "Hello") + assertTrue(cache.sizeBytes() > 0) + } + + @Test + fun `eviction removes oldest entries when over limit`() = runTest { + // Fill cache beyond 1KB limit with multiple entries + val largeContent = "x".repeat(300) + cache.put("page1", "es", "h1", largeContent) + cache.put("page2", "es", "h2", largeContent) + cache.put("page3", "es", "h3", largeContent) + cache.put("page4", "es", "h4", largeContent) // triggers eviction + + // page4 should still be accessible as the newest entry + val page4 = cache.get("page4", "es", "h4") + assertEquals(largeContent, page4) + + // Total size should be at or below max + assertTrue(cache.sizeBytes() <= 1024) + } + + @Test + fun `md5Hash produces consistent hash`() { + val hash1 = md5Hash("Hello, world!") + val hash2 = md5Hash("Hello, world!") + assertEquals(hash1, hash2) + } + + @Test + fun `md5Hash differs for different content`() { + val hash1 = md5Hash("Hello") + val hash2 = md5Hash("World") + assertTrue(hash1 != hash2) + } +} diff --git a/feature/docs/src/commonTest/kotlin/org/meshtastic/feature/docs/translation/MarkdownTranslationSegmenterTest.kt b/feature/docs/src/commonTest/kotlin/org/meshtastic/feature/docs/translation/MarkdownTranslationSegmenterTest.kt new file mode 100644 index 000000000..4bd6c0a9b --- /dev/null +++ b/feature/docs/src/commonTest/kotlin/org/meshtastic/feature/docs/translation/MarkdownTranslationSegmenterTest.kt @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2026 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.meshtastic.feature.docs.translation + +import kotlinx.coroutines.test.runTest +import kotlin.test.Test +import kotlin.test.assertContains +import kotlin.test.assertEquals +import kotlin.test.assertFalse + +class MarkdownTranslationSegmenterTest { + + /** Simple uppercase "translator" for deterministic assertions. */ + private val uppercaseTranslator: suspend (String) -> String = { it.uppercase() } + + @Test + fun `paragraphs are translated`() = runTest { + val input = "Hello world\n\nThis is a paragraph" + val result = MarkdownTranslationSegmenter.translateMarkdown(input, uppercaseTranslator) + assertContains(result, "HELLO WORLD") + assertContains(result, "THIS IS A PARAGRAPH") + } + + @Test + fun `headings are translated`() = runTest { + val input = "# Welcome\n## Getting Started" + val result = MarkdownTranslationSegmenter.translateMarkdown(input, uppercaseTranslator) + assertContains(result, "# WELCOME") + assertContains(result, "## GETTING STARTED") + } + + @Test + fun `fenced code blocks are NOT translated`() = runTest { + val input = "Before code\n\n```kotlin\nval x = 1\n```\n\nAfter code" + val result = MarkdownTranslationSegmenter.translateMarkdown(input, uppercaseTranslator) + assertContains(result, "BEFORE CODE") + assertContains(result, "val x = 1") + assertContains(result, "AFTER CODE") + assertFalse(result.contains("VAL X = 1")) + } + + @Test + fun `indented code blocks are NOT translated`() = runTest { + val input = "Some text\n\n code line 1\n code line 2\n\nMore text" + val result = MarkdownTranslationSegmenter.translateMarkdown(input, uppercaseTranslator) + assertContains(result, "SOME TEXT") + assertContains(result, " code line 1") + assertContains(result, "MORE TEXT") + } + + @Test + fun `inline code is NOT translated`() = runTest { + val input = "Use `meshtastic --info` to check" + val result = MarkdownTranslationSegmenter.translateMarkdown(input, uppercaseTranslator) + assertContains(result, "`meshtastic --info`") + assertContains(result, "USE") + assertContains(result, "TO CHECK") + } + + @Test + fun `link text is translated but URL is preserved`() = runTest { + val input = "Click [here](https://example.com) for more" + val result = MarkdownTranslationSegmenter.translateMarkdown(input, uppercaseTranslator) + assertContains(result, "[HERE](https://example.com)") + assertContains(result, "CLICK") + } + + @Test + fun `images are NOT translated`() = runTest { + val input = "See the diagram:\n\n![alt text](/images/diagram.png)" + val result = MarkdownTranslationSegmenter.translateMarkdown(input, uppercaseTranslator) + assertContains(result, "![alt text](/images/diagram.png)") + assertContains(result, "SEE THE DIAGRAM:") + } + + @Test + fun `frontmatter is NOT translated`() = runTest { + val input = "---\ntitle: My Page\nlayout: default\n---\n\nHello world" + val result = MarkdownTranslationSegmenter.translateMarkdown(input, uppercaseTranslator) + assertContains(result, "title: My Page") + assertContains(result, "layout: default") + assertContains(result, "HELLO WORLD") + } + + @Test + fun `list items are translated`() = runTest { + val input = "- First item\n- Second item\n* Third item" + val result = MarkdownTranslationSegmenter.translateMarkdown(input, uppercaseTranslator) + assertContains(result, "- FIRST ITEM") + assertContains(result, "- SECOND ITEM") + assertContains(result, "* THIRD ITEM") + } + + @Test + fun `ordered list items are translated`() = runTest { + val input = "1. First step\n2. Second step" + val result = MarkdownTranslationSegmenter.translateMarkdown(input, uppercaseTranslator) + assertContains(result, "1. FIRST STEP") + assertContains(result, "2. SECOND STEP") + } + + @Test + fun `blockquotes are translated`() = runTest { + val input = "> Important note here" + val result = MarkdownTranslationSegmenter.translateMarkdown(input, uppercaseTranslator) + assertContains(result, "> IMPORTANT NOTE HERE") + } + + @Test + fun `table cells are translated but separators are not`() = runTest { + val input = "| Header 1 | Header 2 |\n|---|---|\n| Cell A | Cell B |" + val result = MarkdownTranslationSegmenter.translateMarkdown(input, uppercaseTranslator) + assertContains(result, "HEADER 1") + assertContains(result, "HEADER 2") + assertContains(result, "|---|---|") + assertContains(result, "CELL A") + assertContains(result, "CELL B") + } + + @Test + fun `empty input returns empty output`() = runTest { + val result = MarkdownTranslationSegmenter.translateMarkdown("", uppercaseTranslator) + assertEquals("", result) + } + + @Test + fun `html blocks are NOT translated`() = runTest { + val input = "Before\n\n

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 zä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 L^QuDXpAY{70_F}C literal 29695 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%0DUF3Z!Ae0U_FZ%$-@>(#8zMvpHT*yFG`5I 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 literal 29493 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 HJpX?H->mh? diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/FirmwareScreenshotTestsKt/ScreenshotFirmwareError_Light_b29dc7a7_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/FirmwareScreenshotTestsKt/ScreenshotFirmwareError_Light_b29dc7a7_0.png index 5ddb4d376d05e41604dc3dfd67637d598e0a1612..30c34d13e2ae0dd9cc71cbbabd3ba51bda90258e 100644 GIT binary patch literal 29436 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 AVE_OC literal 29427 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 diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/FirmwareScreenshotTestsKt/ScreenshotFirmwareVerifying_Dark_d19fbf1f_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/FirmwareScreenshotTestsKt/ScreenshotFirmwareVerifying_Dark_d19fbf1f_0.png index 4a7c0d6e16a04d127c81635866066522932d6978..152cbb3413dd62f94914bdc0fb528dfcf5dfda1e 100644 GIT binary patch literal 40019 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 z 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 G@Ban5`9Avq literal 33364 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 diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/FirmwareScreenshotTestsKt/ScreenshotFirmwareVerifying_Light_b29dc7a7_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/FirmwareScreenshotTestsKt/ScreenshotFirmwareVerifying_Light_b29dc7a7_0.png index 2795e38578816784f9dd559f65430f392d923aea..cf4807bc22477cc0a8ebb9814918b3a34cc10dbb 100644 GIT binary patch literal 39104 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

`RRzk4W~-&7vm1+mX`94F80uE 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 AfB*mh literal 11267 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 SfGg0>fnZk+|0vS2di-CU)kfF= diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/core/PreferenceComponentScreenshotTestsKt/ScreenshotSliderPreferenceDisabled_Light_b29dc7a7_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/core/PreferenceComponentScreenshotTestsKt/ScreenshotSliderPreferenceDisabled_Light_b29dc7a7_0.png index d10163aab87a87b2585e1d9a7f6f06895b6f7cee..923e98b6dcb2fdeaf6a8f0beb7ef07a55f983bc4 100644 GIT binary patch literal 11761 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 diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/core/PreferenceComponentScreenshotTestsKt/ScreenshotSliderPreference_Dark_d19fbf1f_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/core/PreferenceComponentScreenshotTestsKt/ScreenshotSliderPreference_Dark_d19fbf1f_0.png index 1130fdcfd7e871953daf4367d47738e3bb1826f0..7179d81584f856a44d9595207561f2d7293c5a43 100644 GIT binary patch literal 11956 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

#fCnnpYWG(Hh#~6l>A_S)B}jQEam1qfNirR% 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 literal 0 HcmV?d00001 diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotTakTestCardIdle_Light_b29dc7a7_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotTakTestCardIdle_Light_b29dc7a7_0.png new file mode 100644 index 0000000000000000000000000000000000000000..0e1f2103b843602931e8cc1457099068b0a90318 GIT binary patch literal 22112 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 A9smFU literal 0 HcmV?d00001 diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotTakTestCardResults_Dark_d19fbf1f_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotTakTestCardResults_Dark_d19fbf1f_0.png new file mode 100644 index 0000000000000000000000000000000000000000..1e7bb644f4c84a6bef1e71a27b78802dd4f7975c GIT binary patch literal 42948 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 literal 0 HcmV?d00001 diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotTakTestCardResults_Light_b29dc7a7_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotTakTestCardResults_Light_b29dc7a7_0.png new file mode 100644 index 0000000000000000000000000000000000000000..25787438fad719c771bd6b1a66fef06802d25503 GIT binary patch literal 42754 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 L!mw2TYUIBGbhk~N literal 0 HcmV?d00001 diff --git a/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotTakTestCardRunning_Dark_d19fbf1f_0.png b/screenshot-tests/src/screenshotTestDebug/reference/org/meshtastic/screenshots/feature/SettingsScreenshotTestsKt/ScreenshotTakTestCardRunning_Dark_d19fbf1f_0.png new file mode 100644 index 0000000000000000000000000000000000000000..278a6fd19881bad46f92f07e9b0447f380f62550 GIT binary patch literal 29695 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%0DUF3Z!Ae0U_FZ%$-@>(#8zMvpHT*yFG`5I z_+aJO^kkdL7jK}#k-%m$SL`vou+wCj4Hw-Qm$A1uD)3s#3rV-4*siaBG|_7G@NOUJ zNtO+JeYl;ksIeLq}0a1?}J4SFx+1Qnb|{d;FF)ObPASMbOK- z*j(%S<$R)nFXWR>*;?$a+F^)j75T`e{rc1HdqLnRK2`w-1i_H_gL$u~4)I%W*+{kl z(sB$WD$NRU_`7|iET`{JAj16RnF~G{a>=E`xt>?;j~Ffh_N>we#9tP-R~poN%lR3` z|1LJlhhb;q?%(6-xrnXApYT#1x+THf_K7)^RN6W>SllRy{+CD2od%&65Gb#_S4N=T z3F;qI?t_FqIVDFmiesc9yYXOgov-pl*1mviO3KdN2u66Kjl^6XG{a&N1R{UGGOb